Răsfoiți Sursa

i18n for /AiAssistant/Sidebar

Shun Miyazawa 1 an în urmă
părinte
comite
f627a7a55f

+ 12 - 0
apps/app/public/static/locales/en_US/translation.json

@@ -533,6 +533,18 @@
       }
       }
     }
     }
   },
   },
+  "ai_assistant_tree": {
+    "add_assistant": "Add Assistant",
+    "my_assistants": "My Assistants",
+    "team_assistants": "Team Assistants",
+    "thread_does_not_exist": "No threads exist",
+    "toaster": {
+      "ai_assistant_deleted_success": "Assistant deleted",
+      "ai_assistant_deleted_failed": "Failed to delete assistant",
+      "thread_deleted_success": "Thread deleted",
+      "thread_deleted_failed": "Failed to delete thread"
+    }
+  },
   "link_edit": {
   "link_edit": {
     "edit_link": "Edit Link",
     "edit_link": "Edit Link",
     "set_link_and_label": "Set link and label",
     "set_link_and_label": "Set link and label",

+ 12 - 0
apps/app/public/static/locales/fr_FR/translation.json

@@ -528,6 +528,18 @@
       }
       }
     }
     }
   },
   },
+ "ai_assistant_tree": {
+    "add_assistant": "Ajouter un assistant",
+    "my_assistants": "Mes assistants",
+    "team_assistants": "Assistants d'équipe",
+    "thread_does_not_exist": "Aucune discussion",
+    "toaster": {
+      "ai_assistant_deleted_success": "Assistant supprimé",
+      "ai_assistant_deleted_failed": "Échec de la suppression de l'assistant",
+      "thread_deleted_success": "Discussion supprimée",
+      "thread_deleted_failed": "Échec de la suppression de la discussion"
+    }
+  },
   "link_edit": {
   "link_edit": {
     "edit_link": "Modifier lien",
     "edit_link": "Modifier lien",
     "set_link_and_label": "Ajouter lien et étiquette",
     "set_link_and_label": "Ajouter lien et étiquette",

+ 12 - 0
apps/app/public/static/locales/ja_JP/translation.json

@@ -566,6 +566,18 @@
       }
       }
     }
     }
   },
   },
+  "ai_assistant_tree": {
+    "add_assistant": "アシスタントを追加する",
+    "my_assistants": "マイアシスタント",
+    "team_assistants": "チームアシスタント",
+    "thread_does_not_exist": "スレッドが存在しません",
+    "toaster": {
+      "ai_assistant_deleted_success": "アシスタントを削除しました",
+      "ai_assistant_deleted_failed": "アシスタントの削除に失敗しました",
+      "thread_deleted_success": "スレッドを削除しました",
+      "thread_deleted_failed": "スレッドの削除に失敗しました"
+    }
+  },
   "link_edit": {
   "link_edit": {
     "edit_link": "リンク編集",
     "edit_link": "リンク編集",
     "set_link_and_label": "リンク情報",
     "set_link_and_label": "リンク情報",

+ 12 - 0
apps/app/public/static/locales/zh_CN/translation.json

@@ -523,6 +523,18 @@
       }
       }
     }
     }
   },
   },
+  "ai_assistant_tree": {
+    "add_assistant": "添加助手",
+    "my_assistants": "我的助手",
+    "team_assistants": "团队助手",
+    "thread_does_not_exist": "暂无会话",
+    "toaster": {
+      "ai_assistant_deleted_success": "已删除助手",
+      "ai_assistant_deleted_failed": "删除助手失败",
+      "thread_deleted_success": "已删除会话",
+      "thread_deleted_failed": "删除会话失败"
+    }
+  },
   "link_edit": {
   "link_edit": {
     "edit_link": "Edit Link",
     "edit_link": "Edit Link",
     "set_link_and_label": "Set link and label",
     "set_link_and_label": "Set link and label",

+ 6 - 3
apps/app/src/features/openai/client/components/AiAssistant/Sidebar/AiAssistantSubstance.tsx

@@ -1,5 +1,7 @@
 import React from 'react';
 import React from 'react';
 
 
+import { useTranslation } from 'react-i18next';
+
 import { useAiAssistantManagementModal, useSWRxAiAssistants } from '../../../stores/ai-assistant';
 import { useAiAssistantManagementModal, useSWRxAiAssistants } from '../../../stores/ai-assistant';
 
 
 import { AiAssistantTree } from './AiAssistantTree';
 import { AiAssistantTree } from './AiAssistantTree';
@@ -9,6 +11,7 @@ import styles from './AiAssistantSubstance.module.scss';
 const moduleClass = styles['grw-ai-assistant-substance'] ?? '';
 const moduleClass = styles['grw-ai-assistant-substance'] ?? '';
 
 
 export const AiAssistantContent = (): JSX.Element => {
 export const AiAssistantContent = (): JSX.Element => {
+  const { t } = useTranslation();
   const { open } = useAiAssistantManagementModal();
   const { open } = useAiAssistantManagementModal();
   const { data: aiAssistants, mutate: mutateAiAssistants } = useSWRxAiAssistants();
   const { data: aiAssistants, mutate: mutateAiAssistants } = useSWRxAiAssistants();
 
 
@@ -20,13 +23,13 @@ export const AiAssistantContent = (): JSX.Element => {
         onClick={() => open()}
         onClick={() => open()}
       >
       >
         <span className="material-symbols-outlined fs-5 me-2">add</span>
         <span className="material-symbols-outlined fs-5 me-2">add</span>
-        <span className="fw-normal">アシスタントを追加する</span>
+        <span className="fw-normal">{t('ai_assistant_tree.add_assistant')}</span>
       </button>
       </button>
 
 
       <div className="d-flex flex-column gap-4">
       <div className="d-flex flex-column gap-4">
         <div>
         <div>
           <h3 className="fw-bold grw-ai-assistant-substance-header">
           <h3 className="fw-bold grw-ai-assistant-substance-header">
-            マイアシスタント
+            {t('ai_assistant_tree.my_assistants')}
           </h3>
           </h3>
           {aiAssistants?.myAiAssistants != null && aiAssistants.myAiAssistants.length !== 0 && (
           {aiAssistants?.myAiAssistants != null && aiAssistants.myAiAssistants.length !== 0 && (
             <AiAssistantTree
             <AiAssistantTree
@@ -38,7 +41,7 @@ export const AiAssistantContent = (): JSX.Element => {
 
 
         <div>
         <div>
           <h3 className="fw-bold grw-ai-assistant-substance-header">
           <h3 className="fw-bold grw-ai-assistant-substance-header">
-            チームアシスタント
+            {t('ai_assistant_tree.team_assistants')}
           </h3>
           </h3>
           {aiAssistants?.teamAiAssistants != null && aiAssistants.teamAiAssistants.length !== 0 && (
           {aiAssistants?.teamAiAssistants != null && aiAssistants.teamAiAssistants.length !== 0 && (
             <AiAssistantTree
             <AiAssistantTree

+ 9 - 5
apps/app/src/features/openai/client/components/AiAssistant/Sidebar/AiAssistantTree.tsx

@@ -1,6 +1,7 @@
 import React, { useCallback, useState } from 'react';
 import React, { useCallback, useState } from 'react';
 
 
 import { getIdStringForRef } from '@growi/core';
 import { getIdStringForRef } from '@growi/core';
+import { useTranslation } from 'react-i18next';
 
 
 import { toastError, toastSuccess } from '~/client/util/toastr';
 import { toastError, toastSuccess } from '~/client/util/toastr';
 import type { IThreadRelationHasId } from '~/features/openai/interfaces/thread-relation';
 import type { IThreadRelationHasId } from '~/features/openai/interfaces/thread-relation';
@@ -34,16 +35,17 @@ type ThreadItemProps = {
 const ThreadItem: React.FC<ThreadItemProps> = ({
 const ThreadItem: React.FC<ThreadItemProps> = ({
   threadData, aiAssistantData, onThreadClick, onThreadDelete,
   threadData, aiAssistantData, onThreadClick, onThreadDelete,
 }) => {
 }) => {
+  const { t } = useTranslation();
 
 
   const deleteThreadHandler = useCallback(async() => {
   const deleteThreadHandler = useCallback(async() => {
     try {
     try {
       await deleteThread({ aiAssistantId: aiAssistantData._id, threadRelationId: threadData._id });
       await deleteThread({ aiAssistantId: aiAssistantData._id, threadRelationId: threadData._id });
-      toastSuccess('スレッドを削除しました');
+      toastSuccess('ai_assistant_tree.toaster.thread_deleted_success');
       onThreadDelete();
       onThreadDelete();
     }
     }
     catch (err) {
     catch (err) {
       logger.error(err);
       logger.error(err);
-      toastError('スレッドの削除に失敗しました');
+      toastError('ai_assistant_tree.toaster.thread_deleted_failed');
     }
     }
   }, [aiAssistantData._id, onThreadDelete, threadData._id]);
   }, [aiAssistantData._id, onThreadDelete, threadData._id]);
 
 
@@ -95,10 +97,11 @@ type ThreadItemsProps = {
 };
 };
 
 
 const ThreadItems: React.FC<ThreadItemsProps> = ({ aiAssistantData, onThreadClick, onThreadDelete }) => {
 const ThreadItems: React.FC<ThreadItemsProps> = ({ aiAssistantData, onThreadClick, onThreadDelete }) => {
+  const { t } = useTranslation();
   const { data: threads } = useSWRxThreads(aiAssistantData._id);
   const { data: threads } = useSWRxThreads(aiAssistantData._id);
 
 
   if (threads == null || threads.length === 0) {
   if (threads == null || threads.length === 0) {
-    return <p className="text-secondary ms-5">スレッドが存在しません</p>;
+    return <p className="text-secondary ms-5">{t('ai_assistant_tree.thread_does_not_exist')}</p>;
   }
   }
 
 
   return (
   return (
@@ -149,6 +152,7 @@ const AiAssistantItem: React.FC<AiAssistantItemProps> = ({
 }) => {
 }) => {
   const [isThreadsOpened, setIsThreadsOpened] = useState(false);
   const [isThreadsOpened, setIsThreadsOpened] = useState(false);
 
 
+  const { t } = useTranslation();
   const { trigger: mutateThreadData } = useSWRMUTxThreads(aiAssistant._id);
   const { trigger: mutateThreadData } = useSWRMUTxThreads(aiAssistant._id);
 
 
   const openManagementModalHandler = useCallback((aiAssistantData: AiAssistantHasId) => {
   const openManagementModalHandler = useCallback((aiAssistantData: AiAssistantHasId) => {
@@ -168,11 +172,11 @@ const AiAssistantItem: React.FC<AiAssistantItemProps> = ({
     try {
     try {
       await deleteAiAssistant(aiAssistant._id);
       await deleteAiAssistant(aiAssistant._id);
       onDeleted?.();
       onDeleted?.();
-      toastSuccess('アシスタントを削除しました');
+      toastSuccess('ai_assistant_tree.toaster.assistant_deleted_success');
     }
     }
     catch (err) {
     catch (err) {
       logger.error(err);
       logger.error(err);
-      toastError('アシスタントの削除に失敗しました');
+      toastError('ai_assistant_tree.toaster.assistant_deleted');
     }
     }
   }, [aiAssistant._id, onDeleted]);
   }, [aiAssistant._id, onDeleted]);