diff --git a/frontend/src/components/DocumentPagination.tsx b/frontend/src/components/DocumentPagination.tsx index f02ef1c05..6958d0512 100644 --- a/frontend/src/components/DocumentPagination.tsx +++ b/frontend/src/components/DocumentPagination.tsx @@ -1,4 +1,5 @@ import React, { useState } from 'react'; +import { useTranslation } from 'react-i18next'; import SingleArrowLeft from '../assets/single-left-arrow.svg'; import SingleArrowRight from '../assets/single-right-arrow.svg'; import DoubleArrowLeft from '../assets/double-arrow-left.svg'; @@ -19,6 +20,7 @@ const Pagination: React.FC = ({ onPageChange, onRowsPerPageChange, }) => { + const { t } = useTranslation(); const [isDropdownOpen, setIsDropdownOpen] = useState(false); const rowsPerPageOptions = [5, 10, 20, 50]; @@ -53,7 +55,9 @@ const Pagination: React.FC = ({
{/* Rows per page dropdown */}
- Rows per page: + + {t('pagination.rowsPerPage')}: +
@@ -108,7 +112,7 @@ const Pagination: React.FC = ({ > Previous page @@ -119,7 +123,7 @@ const Pagination: React.FC = ({ > Next page @@ -130,7 +134,7 @@ const Pagination: React.FC = ({ > Last page diff --git a/frontend/src/conversation/ConversationBubble.tsx b/frontend/src/conversation/ConversationBubble.tsx index e410b7c57..668b09351 100644 --- a/frontend/src/conversation/ConversationBubble.tsx +++ b/frontend/src/conversation/ConversationBubble.tsx @@ -130,13 +130,13 @@ const ConversationBubble = forwardRef< className="rounded-full bg-[#CDB5FF] hover:bg-[#E1D3FF] py-[10px] px-[15px] text-purple-30 max-w-full whitespace-pre-wrap leading-none" onClick={() => handleEditClick()} > - Update + {t('conversation.edit.update')}
diff --git a/frontend/src/locale/en.json b/frontend/src/locale/en.json index 79fa10970..8502cf36d 100644 --- a/frontend/src/locale/en.json +++ b/frontend/src/locale/en.json @@ -61,7 +61,6 @@ "noData": "No existing Documents", "searchPlaceholder": "Search...", "addNew": "Add New", - "addNewTitle": "Add New Document", "preLoaded": "Pre-loaded", "private": "Private", "sync": "Sync", @@ -82,24 +81,40 @@ "noData": "No existing Chatbots" }, "analytics": { - "label": "Analytics" + "label": "Analytics", + "filterByChatbot": "Filter by chatbot", + "selectChatbot": "Select chatbot", + "filterOptions": { + "hour": "Hour", + "last24Hours": "24 Hours", + "last7Days": "7 Days", + "last15Days": "15 Days", + "last30Days": "30 Days" + }, + "messages": "Messages", + "tokenUsage": "Token Usage", + "feedback": "Feedback", + "filterPlaceholder": "Filter", + "none": "None", + "positiveFeedback": "Positive Feedback", + "negativeFeedback": "Negative Feedback" }, "logs": { "label": "Logs", "filterByChatbot": "Filter by chatbot", + "selectChatbot": "Select chatbot", "none": "None", - "selectChatbotPlaceholder": "Select chatbot", - "apiGeneratedConversations": "API generated / chatbot conversations" + "tableHeader": "API generated / chatbot conversations" }, "tools": { "label": "Tools", "searchPlaceholder": "Search tools...", "addTool": "Add Tool", "noToolsFound": "No tools found", + "selectToolSetup": "Select a tool to set up", "settingsIconAlt": "Settings icon", "configureToolAria": "Configure {toolName}", - "toggleToolAria": "Toggle {toolName}", - "selectToolSetup": "Select a tool to set up" + "toggleToolAria": "Toggle {toolName}" } }, "modals": { @@ -125,11 +140,19 @@ "secret": "Client Secret", "agent": "User agent", "searchQueries": "Search queries", - "numberOfPosts": "Number of posts" + "numberOfPosts": "Number of posts", + "addQuery": "Add Query" }, "drag": { "title": "Upload a source file", "description": "Drop your file here to add it as a source" + }, + "progress": { + "upload": "Upload is in progress", + "training": "Training is in progress", + "completed": "Training completed", + "wait": "This may take several minutes", + "tokenLimit": "Over the token limit, please consider uploading smaller document" } }, "createAPIKey": { @@ -156,6 +179,24 @@ "note": "Source document, personal information and further conversation will remain private", "create": "Create", "option": "Allow users to prompt further" + }, + "configTool": { + "title": "Tool Config", + "type": "Type", + "apiKeyLabel": "API Key / OAuth", + "apiKeyPlaceholder": "Enter API Key / OAuth", + "addButton": "Add Tool", + "closeButton": "Close" + }, + "prompts": { + "addPrompt": "Add Prompt", + "addDescription": "Add your custom prompt and save it to DocsGPT", + "editPrompt": "Edit Prompt", + "editDescription": "Edit your custom prompt and save it to DocsGPT", + "promptName": "Prompt Name", + "promptText": "Prompt Text", + "save": "Save", + "nameExists": "Name already exists" } }, "sharedConv": { @@ -169,20 +210,28 @@ "rename": "Rename", "deleteWarning": "Are you sure you want to delete this conversation?" }, + "pagination": { + "rowsPerPage": "Rows per page", + "pageOf": "Page {{currentPage}} of {{totalPages}}", + "firstPage": "First page", + "previousPage": "Previous page", + "nextPage": "Next page", + "lastPage": "Last page" + }, "conversation": { "copy": "Copy", "copied": "Copied", "speak": "Speak", "answer": "Answer", - "send": "Send message", - "loading": "Loading response", "edit": { + "update": "Update", + "cancel": "Cancel", "placeholder": "Type the updated query..." }, "sources": { "title": "Sources", - "text": "Source Text", - "link": "Source Link", + "text": "Source text", + "link": "Source link", "view_more": "{{count}} more sources" }, "retry": "Retry" diff --git a/frontend/src/locale/es.json b/frontend/src/locale/es.json index 7e7e224d3..c5b0fa17f 100644 --- a/frontend/src/locale/es.json +++ b/frontend/src/locale/es.json @@ -61,7 +61,6 @@ "noData": "No hay documentos existentes", "searchPlaceholder": "Buscar...", "addNew": "Agregar Nuevo", - "addNewTitle": "Agregar Nuevo Documento", "preLoaded": "Precargado", "private": "Privado", "sync": "Sincronizar", @@ -70,7 +69,8 @@ "daily": "Diario", "weekly": "Semanal", "monthly": "Mensual" - } + }, + "actions": "Acciones" }, "apiKeys": { "label": "Chatbots", @@ -81,17 +81,40 @@ "noData": "No hay chatbots existentes" }, "analytics": { - "label": "Analítica" + "label": "Analítica", + "filterByChatbot": "Filtrar por chatbot", + "selectChatbot": "Seleccionar chatbot", + "filterOptions": { + "hour": "Hora", + "last24Hours": "24 Horas", + "last7Days": "7 Días", + "last15Days": "15 Días", + "last30Days": "30 Días" + }, + "messages": "Mensajes", + "tokenUsage": "Uso de Tokens", + "feedback": "Retroalimentación", + "filterPlaceholder": "Filtrar", + "none": "Ninguno", + "positiveFeedback": "Retroalimentación Positiva", + "negativeFeedback": "Retroalimentación Negativa" }, "logs": { "label": "Registros", "filterByChatbot": "Filtrar por chatbot", + "selectChatbot": "Seleccionar chatbot", "none": "Ninguno", - "selectChatbotPlaceholder": "Seleccionar chatbot", - "apiGeneratedConversations": "Conversaciones generadas por API / chatbot" + "tableHeader": "Conversaciones generadas por API / chatbot" }, "tools": { - "label": "Herramientas" + "label": "Herramientas", + "searchPlaceholder": "Buscar...", + "addTool": "Agregar Herramienta", + "noToolsFound": "No se encontraron herramientas", + "selectToolSetup": "Seleccione una herramienta para configurar", + "settingsIconAlt": "Icono de configuración", + "configureToolAria": "Configurar {toolName}", + "toggleToolAria": "Alternar {toolName}" } }, "modals": { @@ -113,15 +136,23 @@ "urlLink": "Enlace URL", "repoUrl": "URL del Repositorio", "reddit": { - "id": "ID de Cliente", - "secret": "Secreto de Cliente", - "agent": "Agente de Usuario", - "searchQueries": "Consultas de Búsqueda", - "numberOfPosts": "Número de publicaciones" + "id": "ID del Cliente", + "secret": "Secreto del Cliente", + "agent": "Agente de usuario", + "searchQueries": "Consultas de búsqueda", + "numberOfPosts": "Número de publicaciones", + "addQuery": "Agregar Consulta" }, "drag": { - "title": "Carga un archivo fuente", - "description": "Suelta tu archivo aquí para añadirlo como fuente" + "title": "Subir archivo fuente", + "description": "Arrastra tu archivo aquí para agregarlo como fuente" + }, + "progress": { + "upload": "Subida en progreso", + "training": "Entrenamiento en progreso", + "completed": "Entrenamiento completado", + "wait": "Esto puede tardar varios minutos", + "tokenLimit": "Excede el límite de tokens, considere cargar un documento más pequeño" } }, "createAPIKey": { @@ -148,6 +179,24 @@ "note": "El documento fuente, información personal y conversaciones posteriores permanecerán privadas", "create": "Crear", "option": "Permitir a los usuarios realizar más consultas" + }, + "configTool": { + "title": "Configuración de la Herramienta", + "type": "Tipo", + "apiKeyLabel": "Clave API / OAuth", + "apiKeyPlaceholder": "Ingrese la Clave API / OAuth", + "addButton": "Agregar Herramienta", + "closeButton": "Cerrar" + }, + "prompts": { + "addPrompt": "Agregar Prompt", + "addDescription": "Agrega tu prompt personalizado y guárdalo en DocsGPT", + "editPrompt": "Editar Prompt", + "editDescription": "Edita tu prompt personalizado y guárdalo en DocsGPT", + "promptName": "Nombre del Prompt", + "promptText": "Texto del Prompt", + "save": "Guardar", + "nameExists": "El nombre ya existe" } }, "sharedConv": { @@ -159,7 +208,15 @@ "share": "Compartir", "delete": "Eliminar", "rename": "Renombrar", - "deleteWarning": "¿Estás seguro de que deseas eliminar esta conversación?" + "deleteWarning": "¿Está seguro de que desea eliminar esta conversación?" + }, + "pagination": { + "rowsPerPage": "Filas por página", + "pageOf": "Página {{currentPage}} de {{totalPages}}", + "firstPage": "Primera página", + "previousPage": "Página anterior", + "nextPage": "Página siguiente", + "lastPage": "Última página" }, "conversation": { "copy": "Copiar", @@ -167,13 +224,15 @@ "speak": "Hablar", "answer": "Respuesta", "edit": { - "placeholder": "Escribe la consulta actualizada..." + "update": "Actualizar", + "cancel": "Cancelar", + "placeholder": "Ingrese la consulta actualizada..." }, "sources": { "title": "Fuentes", - "text": "Texto de la Fuente", - "link": "Enlace de la Fuente", - "view_more": "{{count}} más fuentes" + "text": "Texto fuente", + "link": "Enlace fuente", + "view_more": "Ver {{count}} más fuentes" }, "retry": "Reintentar" } diff --git a/frontend/src/locale/jp.json b/frontend/src/locale/jp.json index ae7dbd20d..0098807a2 100644 --- a/frontend/src/locale/jp.json +++ b/frontend/src/locale/jp.json @@ -1,7 +1,7 @@ { "language": "日本語", "chat": "チャット", - "chats": "チャット一覧", + "chats": "チャット", "newChat": "新しいチャット", "myPlan": "私のプラン", "about": "について", @@ -24,11 +24,11 @@ }, { "header": "コードを書く", - "query": "APIリクエストのコードを/api/answerに書いてください" + "query": "APIリクエストのコードを/api/answerに書いてください。" }, { "header": "学習支援", - "query": "コンテキストに対する潜在的な質問を書いてください" + "query": "このコンテンツに対する可能な質問を書いてください" } ], "settings": { @@ -58,10 +58,9 @@ "date": "ベクトル日付", "type": "タイプ", "tokenUsage": "トークン使用量", - "noData": "既存のドキュメントはありません", + "noData": "既存のドキュメントがありません", "searchPlaceholder": "検索...", "addNew": "新規追加", - "addNewTitle": "新規ドキュメントを追加", "preLoaded": "プリロード済み", "private": "プライベート", "sync": "同期", @@ -69,29 +68,53 @@ "never": "なし", "daily": "毎日", "weekly": "毎週", - "monthly": "��月" - } + "monthly": "毎月" + }, + "actions": "アクション" }, "apiKeys": { - "label": "チャットボット", + "label": "APIキー", "name": "名前", "key": "APIキー", "sourceDoc": "ソースドキュメント", "createNew": "新規作成", - "noData": "既存のチャットボットはありません" + "noData": "既存のAPIキーがありません" }, "analytics": { - "label": "分析" + "label": "分析", + "filterByChatbot": "チャットボットでフィルター", + "selectChatbot": "チャットボットを選択", + "filterOptions": { + "hour": "時間", + "last24Hours": "過去24時間", + "last7Days": "過去7日間", + "last15Days": "過去15日間", + "last30Days": "過去30日間" + }, + "messages": "メッセージ", + "tokenUsage": "トークン使用量", + "feedback": "フィードバック", + "filterPlaceholder": "フィルター", + "none": "なし", + "positiveFeedback": "肯定的なフィードバック", + "negativeFeedback": "否定的なフィードバック" }, "logs": { "label": "ログ", - "filterByChatbot": "チャットボットでフィルタ", + "filterByChatbot": "チャットボットでフィルター", + "selectChatbot": "チャットボットを選択", "none": "なし", - "selectChatbotPlaceholder": "チャットボットを選択", - "apiGeneratedConversations": "API生成/チャットボット会話" + "tableHeader": "API生成 / チャットボットの会話" }, "tools": { - "label": "ツール" + "label": "ツール", + "searchPlaceholder": "検索...", + "addTool": "ツールを追加", + "noToolsFound": "ツールが見つかりません", + "selectToolSetup": "設定するツールを選択してください", + "settingsIconAlt": "設定アイコン", + "configureToolAria": "{toolName} を設定", + "toggleToolAria": "{toolName} を切り替え" } }, "modals": { @@ -105,7 +128,7 @@ "start": "チャットを開始する", "name": "名前", "choose": "ファイルを選択", - "info": ".pdf, .txt, .rst, .csv, .xlsx, .docx, .md, .html, .epub, .json, .pptx, .zipファイルを25MBまでアップロードしてください", + "info": "25MBまでの.pdf、.txt、.rst、.csv、.xlsx、.docx、.md、.html、.epub、.json、.pptx、.zipファイルをアップロードしてください", "uploadedFiles": "アップロードされたファイル", "cancel": "キャンセル", "train": "トレーニング", @@ -117,11 +140,19 @@ "secret": "クライアントシークレット", "agent": "ユーザーエージェント", "searchQueries": "検索クエリ", - "numberOfPosts": "投稿数" + "numberOfPosts": "投稿数", + "addQuery": "クエリを追加" }, "drag": { - "title": "ソースファイルをアップロードする", - "description": "ファイルをここにドロップしてソースとして追加します" + "title": "ソースファイルをアップロード", + "description": "ファイルをここにドロップしてソースとして追加してください" + }, + "progress": { + "upload": "アップロード中", + "training": "トレーニング中", + "completed": "トレーニング完了", + "wait": "数分かかる場合があります", + "tokenLimit": "トークン制限を超えています。より小さいドキュメントをアップロードしてください" } }, "createAPIKey": { @@ -148,6 +179,24 @@ "note": "ソースドキュメント、個人情報、および以降の会話は非公開のままになります", "create": "作成", "option": "ユーザーがより多くのクエリを実行できるようにします。" + }, + "configTool": { + "title": "ツール設定", + "type": "タイプ", + "apiKeyLabel": "APIキー / OAuth", + "apiKeyPlaceholder": "APIキー / OAuthを入力してください", + "addButton": "ツールを追加", + "closeButton": "閉じる" + }, + "prompts": { + "addPrompt": "プロンプトを追加", + "addDescription": "カスタムプロンプトを追加してDocsGPTに保存", + "editPrompt": "プロンプトを編集", + "editDescription": "カスタムプロンプトを編集してDocsGPTに保存", + "promptName": "プロンプト名", + "promptText": "プロンプトテキスト", + "save": "保存", + "nameExists": "名前が既に存在します" } }, "sharedConv": { @@ -161,19 +210,29 @@ "rename": "名前変更", "deleteWarning": "この会話を削除してもよろしいですか?" }, + "pagination": { + "rowsPerPage": "1ページあたりの行数", + "pageOf": "ページ {{currentPage}} / {{totalPages}}", + "firstPage": "最初のページ", + "previousPage": "前のページ", + "nextPage": "次のページ", + "lastPage": "最後のページ" + }, "conversation": { "copy": "コピー", - "copied": "コピーしました", - "speak": "スピーク", + "copied": "コピー済み", + "speak": "読み上げ", "answer": "回答", "edit": { - "placeholder": "更新されたクエリを入力してください..." + "update": "更新", + "cancel": "キャンセル", + "placeholder": "更新されたクエリを入力..." }, "sources": { "title": "ソース", "text": "ソーステキスト", "link": "ソースリンク", - "view_more": "さらに{{count}}個のソース" + "view_more": "さらに{{count}}個のソースを表示" }, "retry": "再試行" } diff --git a/frontend/src/locale/ru.json b/frontend/src/locale/ru.json index edd6ccebc..698974522 100644 --- a/frontend/src/locale/ru.json +++ b/frontend/src/locale/ru.json @@ -4,7 +4,7 @@ "chats": "Чаты", "newChat": "Новый чат", "myPlan": "Мой план", - "about": "О", + "about": "О нас", "inputPlaceholder": "Введите свое сообщение здесь...", "tagline": "DocsGPT использует GenAI, пожалуйста, проверьте важную информацию, используя источники.", "sourceDocs": "Источник", @@ -28,7 +28,7 @@ }, { "header": "Помощь в обучении", - "query": "Написать потенциальные вопросы для контекста" + "query": "Написать возможные вопросы для этого контента" } ], "settings": { @@ -37,7 +37,7 @@ "label": "Общие", "selectTheme": "Выбрать тему", "light": "Светлая", - "dark": "Темная", + "dark": "Тёмная", "selectLanguage": "Выбрать язык", "chunks": "Обработанные фрагменты на запрос", "prompt": "Активная подсказка", @@ -57,84 +57,115 @@ "name": "Название документа", "date": "Дата вектора", "type": "Тип", - "tokenUsage": "Использование токенов", + "tokenUsage": "Использование токена", "noData": "Нет существующих документов", "searchPlaceholder": "Поиск...", - "addNew": "Добавить новый", - "addNewTitle": "Добавить новый документ", + "addNew": "добавить новый", "preLoaded": "Предзагруженный", - "private": "Личный", + "private": "Частный", "sync": "Синхронизация", "syncFrequency": { "never": "Никогда", "daily": "Ежедневно", "weekly": "Еженедельно", "monthly": "Ежемесячно" - } + }, + "actions": "Действия" }, "apiKeys": { - "label": "Чат-боты", + "label": "API ключи", "name": "Название", - "key": "Ключ API", - "sourceDoc": "Исходный документ", + "key": "API ключ", + "sourceDoc": "Источник документа", "createNew": "Создать новый", - "noData": "Нет существующих чат-ботов" + "noData": "Нет существующих API ключей" }, "analytics": { - "label": "Аналитика" + "label": "Аналитика", + "filterByChatbot": "Фильтровать по чат-боту", + "selectChatbot": "Выбрать чат-бота", + "filterOptions": { + "hour": "Час", + "last24Hours": "Последние 24 часа", + "last7Days": "Последние 7 дней", + "last15Days": "Последние 15 дней", + "last30Days": "Последние 30 дней" + }, + "messages": "Сообщения", + "tokenUsage": "Использование токена", + "feedback": "Обратная связь", + "filterPlaceholder": "Фильтр", + "none": "Нет", + "positiveFeedback": "Положительная обратная связь", + "negativeFeedback": "Отрицательная обратная связь" }, "logs": { - "label": "Регистры", - "filterByChatbot": "Фильтр по чат-боту", + "label": "Журналы", + "filterByChatbot": "Фильтровать по чат-боту", + "selectChatbot": "Выбрать чат-бота", "none": "Нет", - "selectChatbotPlaceholder": "Выберите чат-бота", - "apiGeneratedConversations": "Разговоры, сгенерированные API / чат-ботом" + "tableHeader": "API сгенерировано / разговоры с чат-ботом" }, "tools": { - "label": "Инструменты" + "label": "Инструменты", + "searchPlaceholder": "Поиск...", + "addTool": "Добавить инструмент", + "noToolsFound": "Инструменты не найдены", + "selectToolSetup": "Выберите инструмент для настройки", + "settingsIconAlt": "Иконка настроек", + "configureToolAria": "Настроить {toolName}", + "toggleToolAria": "Переключить {toolName}" } }, "modals": { "uploadDoc": { - "label": "Загрузить новую документацию", + "label": "Загрузить новый документ", "select": "Выберите способ загрузки документа в DocsGPT", "file": "Загрузить с устройства", "back": "Назад", - "wait": "Пожалуйста, подождите ...", + "wait": "Пожалуйста, подождите...", "remote": "Собрать с веб-сайта", "start": "Начать чат", "name": "Имя", "choose": "Выбрать файлы", - "info": "Пожалуйста, загрузите .pdf, .txt, .rst, .csv, .xlsx, .docx, .md, .html, .epub, .json, .pptx, .zip с ограничением до 25 МБ", + "info": "Пожалуйста, загрузите файлы .pdf, .txt, .rst, .csv, .xlsx, .docx, .md, .html, .epub, .json, .pptx, .zip размером до 25 МБ", "uploadedFiles": "Загруженные файлы", "cancel": "Отмена", - "train": "Обучение", + "train": "Тренировка", "link": "Ссылка", - "urlLink": "URL-ссылка", - "repoUrl": "URL-адрес репозитория", + "urlLink": "URL ссылка", + "repoUrl": "URL репозитория", "reddit": { "id": "ID клиента", "secret": "Секрет клиента", - "agent": "Агент пользователя", + "agent": "Пользовательский агент", "searchQueries": "Поисковые запросы", - "numberOfPosts": "Количество сообщений" + "numberOfPosts": "Количество сообщений", + "addQuery": "Добавить запрос" }, "drag": { - "title": "Загрузите исходный файл", - "description": "Перетащите сюда свой файл, чтобы добавить его в качестве источника" + "title": "Загрузить исходный файл", + "description": "Перетащите файл сюда, чтобы добавить его как источник" + }, + "progress": { + "upload": "Идет загрузка", + "training": "Идет обучение", + "completed": "Обучение завершено", + "wait": "Это может занять несколько минут", + "tokenLimit": "Превышен лимит токенов, рассмотрите возможность загрузки документа меньшего размера" } }, "createAPIKey": { - "label": "Создать новый ключ API", - "apiKeyName": "Имя ключа API", - "chunks": "Обработано фрагментов на запрос", + "label": "Создать новый API ключ", + "apiKeyName": "Название API ключа", + "chunks": "Обработанные фрагменты на запрос", "prompt": "Выбрать активную подсказку", - "sourceDoc": "Исходный документ", + "sourceDoc": "Источник документа", "create": "Создать" }, "saveKey": { - "note": "Пожалуйста, сохраните свой ключ", - "disclaimer": "Это единственный раз, когда будет показан ваш ключ.", + "note": "Пожалуйста, сохраните ваш ключ", + "disclaimer": "Ваш ключ будет показан только один раз.", "copy": "Копировать", "copied": "Скопировано", "confirm": "Я сохранил ключ" @@ -144,16 +175,34 @@ "delete": "Удалить" }, "shareConv": { - "label": "Создать публичную страницу для общего доступа", - "note": "Исходный документ, личная информация и дальнейший разговор останутся конфиденциальными", + "label": "Создать публичную страницу для совместного использования", + "note": "Исходный документ, личная информация и последующие разговоры останутся приватными", "create": "Создать", - "option": "Разрешить пользователям продолжить диалог" + "option": "Позволить пользователям делать дополнительные запросы." + }, + "configTool": { + "title": "Настройка инструмента", + "type": "Тип", + "apiKeyLabel": "API ключ / OAuth", + "apiKeyPlaceholder": "Введите API ключ / OAuth", + "addButton": "Добавить инструмент", + "closeButton": "Закрыть" + }, + "prompts": { + "addPrompt": "Добавить подсказку", + "addDescription": "Добавить вашу пользовательскую подсказку и сохранить её в DocsGPT", + "editPrompt": "Редактировать подсказку", + "editDescription": "Редактировать вашу пользовательскую подсказку и сохранить её в DocsGPT", + "promptName": "Название подсказки", + "promptText": "Текст подсказки", + "save": "Сохранить", + "nameExists": "Название уже существует" } }, "sharedConv": { "subtitle": "Создано с помощью", "button": "Начать работу с DocsGPT", - "meta": "DocsGPT использует GenAI, пожалуйста, проверьте важную информацию с помощью источников." + "meta": "DocsGPT использует GenAI, пожалуйста, проверьте важную информацию, используя источники." }, "convTile": { "share": "Поделиться", @@ -161,19 +210,29 @@ "rename": "Переименовать", "deleteWarning": "Вы уверены, что хотите удалить этот разговор?" }, + "pagination": { + "rowsPerPage": "Строк на странице", + "pageOf": "Страница {{currentPage}} из {{totalPages}}", + "firstPage": "Первая страница", + "previousPage": "Предыдущая страница", + "nextPage": "Следующая страница", + "lastPage": "Последняя страница" + }, "conversation": { "copy": "Копировать", "copied": "Скопировано", - "speak": "Говорить", + "speak": "Озвучить", "answer": "Ответ", "edit": { + "update": "Обновить", + "cancel": "Отмена", "placeholder": "Введите обновленный запрос..." }, "sources": { "title": "Источники", - "text": "Исходный текст", - "link": "Исходная ссылка", - "view_more": "Еще {{count}} источников" + "text": "Текст источника", + "link": "Ссылка на источник", + "view_more": "Показать еще {{count}} источников" }, "retry": "Повторить" } diff --git a/frontend/src/locale/zh-TW.json b/frontend/src/locale/zh-TW.json index 3ad52b7a1..3699afde8 100644 --- a/frontend/src/locale/zh-TW.json +++ b/frontend/src/locale/zh-TW.json @@ -10,8 +10,8 @@ "sourceDocs": "原始文件", "none": "無", "cancel": "取消", - "help": "聯繫支援", - "emailUs": "寄送電子郵件給我們", + "help": "幫助", + "emailUs": "給我們發電郵", "documentation": "文件", "demo": [ { @@ -60,16 +60,17 @@ "tokenUsage": "Token 使用量", "noData": "沒有現有的文件", "searchPlaceholder": "搜尋...", - "addNewTitle": "新增文件", + "addNew": "新增文件", "preLoaded": "預載入", "private": "私人", "sync": "同步", "syncFrequency": { - "never": "永不", - "daily": "每日", + "never": "從不", + "daily": "每天", "weekly": "每週", "monthly": "每月" - } + }, + "actions": "操作" }, "apiKeys": { "label": "聊天機器人", @@ -80,17 +81,40 @@ "noData": "沒有現有的聊天機器人" }, "analytics": { - "label": "分析" + "label": "分析", + "filterByChatbot": "按聊天機器人篩選", + "selectChatbot": "選擇聊天機器人", + "filterOptions": { + "hour": "小時", + "last24Hours": "24 小時", + "last7Days": "7 天", + "last15Days": "15 天", + "last30Days": "30 天" + }, + "messages": "訊息", + "tokenUsage": "Token 使用量", + "feedback": "回饋", + "filterPlaceholder": "篩選", + "none": "無", + "positiveFeedback": "正向回饋", + "negativeFeedback": "負向回饋" }, "logs": { "label": "日誌", "filterByChatbot": "按聊天機器人篩選", + "selectChatbot": "選擇聊天機器人", "none": "無", - "selectChatbotPlaceholder": "選擇聊天機器人", - "apiGeneratedConversations": "API生成/聊天機器人對話" + "tableHeader": "API 生成 / 聊天機器人會話" }, "tools": { - "label": "工具" + "label": "工具", + "searchPlaceholder": "搜尋...", + "addTool": "新增工具", + "noToolsFound": "找不到工具", + "selectToolSetup": "選擇要設定的工具", + "settingsIconAlt": "設定圖標", + "configureToolAria": "配置 {toolName}", + "toggleToolAria": "切換 {toolName}" } }, "modals": { @@ -98,29 +122,37 @@ "label": "上傳新文件", "select": "選擇如何將文件上傳到 DocsGPT", "file": "從檔案", + "remote": "遠端", "back": "返回", "wait": "請稍候...", - "remote": "從網站收集", "start": "開始對話", "name": "名稱", "choose": "選擇檔案", - "info": "請上傳 .pdf, .txt, .rst, .csv, .xlsx, .docx, .md, .html, .epub, .json, .pptx, .zip 檔案,大小限制為 25MB", - "uploadedFiles": "已上傳的檔案", + "info": "請上傳限制為25MB的.pdf、.txt、.rst、.csv、.xlsx、.docx、.md、.html、.epub、.json、.pptx、.zip檔案", + "uploadedFiles": "已上傳檔案", "cancel": "取消", "train": "訓練", "link": "連結", "urlLink": "URL 連結", "repoUrl": "儲存庫 URL", "reddit": { - "id": "用戶端 ID", - "secret": "用戶端金鑰", + "id": "客戶端ID", + "secret": "客戶端密鑰", "agent": "使用者代理", "searchQueries": "搜尋查詢", - "numberOfPosts": "貼文數量" + "numberOfPosts": "貼文數量", + "addQuery": "新增查詢" }, "drag": { - "title": "上傳原始檔", - "description": "將您的文件拖放到此處以將其添加為來源" + "title": "上傳來源檔案", + "description": "將檔案拖放到此處以新增為來源" + }, + "progress": { + "upload": "正在上傳", + "training": "正在訓練", + "completed": "訓練完成", + "wait": "這可能需要幾分鐘", + "tokenLimit": "超出令牌限制,請考慮上傳較小的文檔" } }, "createAPIKey": { @@ -146,7 +178,25 @@ "label": "建立公開頁面以分享", "note": "來源文件、個人資訊和後續對話將保持私密", "create": "建立", - "option": "允許用戶進行更多查詢" + "option": "允許使用者進行更多查詢" + }, + "configTool": { + "title": "工具設定", + "type": "類型", + "apiKeyLabel": "API 金鑰 / OAuth", + "apiKeyPlaceholder": "輸入 API 金鑰 / OAuth", + "addButton": "新增工具", + "closeButton": "關閉" + }, + "prompts": { + "addPrompt": "新增提示", + "addDescription": "新增自定義提示並儲存到 DocsGPT", + "editPrompt": "編輯提示", + "editDescription": "編輯自定義提示並儲存到 DocsGPT", + "promptName": "提示名稱", + "promptText": "提示文字", + "save": "儲存", + "nameExists": "名稱已存在" } }, "sharedConv": { @@ -160,19 +210,29 @@ "rename": "重新命名", "deleteWarning": "您確定要刪除這個對話嗎?" }, + "pagination": { + "rowsPerPage": "每頁行數", + "pageOf": "第 {{currentPage}} 頁,共 {{totalPages}} 頁", + "firstPage": "第一頁", + "previousPage": "上一頁", + "nextPage": "下一頁", + "lastPage": "最後一頁" + }, "conversation": { "copy": "複製", "copied": "已複製", "speak": "朗讀", "answer": "回答", "edit": { + "update": "更新", + "cancel": "取消", "placeholder": "輸入更新的查詢..." }, "sources": { "title": "來源", "text": "來源文字", "link": "來源連結", - "view_more": "更多{{count}}個來源" + "view_more": "查看更多 {{count}} 個來源" }, "retry": "重試" } diff --git a/frontend/src/locale/zh.json b/frontend/src/locale/zh.json index 812ce9a7c..9936350d3 100644 --- a/frontend/src/locale/zh.json +++ b/frontend/src/locale/zh.json @@ -10,7 +10,7 @@ "sourceDocs": "源", "none": "无", "cancel": "取消", - "help": "联系支持", + "help": "帮助", "emailUs": "给我们发邮件", "documentation": "文档", "demo": [ @@ -60,7 +60,7 @@ "tokenUsage": "令牌使用", "noData": "没有现有的文档", "searchPlaceholder": "搜索...", - "addNewTitle": "添加新文档", + "addNew": "添加新文档", "preLoaded": "预加载", "private": "私有", "sync": "同步", @@ -69,7 +69,8 @@ "daily": "每天", "weekly": "每周", "monthly": "每月" - } + }, + "actions": "操作" }, "apiKeys": { "label": "聊天机器人", @@ -80,17 +81,40 @@ "noData": "没有现有的聊天机器人" }, "analytics": { - "label": "分析" + "label": "分析", + "filterByChatbot": "按聊天机器人筛选", + "selectChatbot": "选择聊天机器人", + "filterOptions": { + "hour": "小时", + "last24Hours": "24 小时", + "last7Days": "7 天", + "last15Days": "15 天", + "last30Days": "30 天" + }, + "messages": "消息", + "tokenUsage": "令牌使用", + "feedback": "反馈", + "filterPlaceholder": "筛选", + "none": "无", + "positiveFeedback": "正向反馈", + "negativeFeedback": "负向反馈" }, "logs": { "label": "日志", "filterByChatbot": "按聊天机器人筛选", + "selectChatbot": "选择聊天机器人", "none": "无", - "selectChatbotPlaceholder": "选择聊天机器人", - "apiGeneratedConversations": "API生成/聊天机器人对话" + "tableHeader": "API 生成 / 聊天机器人会话" }, "tools": { - "label": "工具" + "label": "工具", + "searchPlaceholder": "搜索...", + "addTool": "添加工具", + "noToolsFound": "未找到工具", + "selectToolSetup": "选择要设置的工具" , + "settingsIconAlt": "设置图标", + "configureToolAria": "配置 {toolName}", + "toggleToolAria": "切换 {toolName}" } }, "modals": { @@ -104,7 +128,7 @@ "start": "开始聊天", "name": "名称", "choose": "选择文件", - "info": "请上传 .pdf, .txt, .rst, .csv, .xlsx, .docx, .md, .html, .epub, .json, .pptx, .zip 文件,限制为 25MB", + "info": "请上传限制为25MB的.pdf、.txt、.rst、.csv、.xlsx、.docx、.md、.html、.epub、.json、.pptx、.zip文件", "uploadedFiles": "已上传文件", "cancel": "取消", "train": "训练", @@ -112,15 +136,23 @@ "urlLink": "URL 链接", "repoUrl": "存储库 URL", "reddit": { - "id": "客户端 ID", + "id": "客户端ID", "secret": "客户端密钥", "agent": "用户代理", "searchQueries": "搜索查询", - "numberOfPosts": "帖子数量" + "numberOfPosts": "帖子数量", + "addQuery": "添加查询" }, "drag": { "title": "上传源文件", - "description": "将您的文件拖放到此处以将其添加为源" + "description": "将文件拖放到此处以添加为源" + }, + "progress": { + "upload": "正在上传", + "training": "正在训练", + "completed": "训练完成", + "wait": "这可能需要几分钟", + "tokenLimit": "超出令牌限制,请考虑上传较小的文档" } }, "createAPIKey": { @@ -146,7 +178,25 @@ "label": "创建用于分享的公共页面", "note": "源文档、个人信息和后续对话将保持私密", "create": "创建", - "option": "允许用户进行更多查询" + "option": "允许用户进行更多查询。" + }, + "configTool": { + "title": "工具配置", + "type": "类型", + "apiKeyLabel": "API 密钥 / OAuth", + "apiKeyPlaceholder": "输入 API 密钥 / OAuth", + "addButton": "添加工具", + "closeButton": "关闭" + }, + "prompts": { + "addPrompt": "添加提示", + "addDescription": "添加自定义提示并保存到 DocsGPT", + "editPrompt": "编辑提示", + "editDescription": "编辑自定义提示并保存到 DocsGPT", + "promptName": "提示名称", + "promptText": "提示文本", + "save": "保存", + "nameExists": "名称已存在" } }, "sharedConv": { @@ -160,12 +210,22 @@ "rename": "重命名", "deleteWarning": "您确定要删除此对话吗?" }, + "pagination": { + "rowsPerPage": "每页行数", + "pageOf": "第 {{currentPage}} 页,共 {{totalPages}} 页", + "firstPage": "第一页", + "previousPage": "上一页", + "nextPage": "下一页", + "lastPage": "最后一页" + }, "conversation": { "copy": "复制", "copied": "已复制", "speak": "朗读", "answer": "回答", "edit": { + "update": "更新", + "cancel": "取消", "placeholder": "输入更新的查询..." }, "sources": { diff --git a/frontend/src/modals/AddToolModal.tsx b/frontend/src/modals/AddToolModal.tsx index 0763321d2..c1bdb0527 100644 --- a/frontend/src/modals/AddToolModal.tsx +++ b/frontend/src/modals/AddToolModal.tsx @@ -1,10 +1,11 @@ -import React from 'react'; - +import React, { useRef } from 'react'; import userService from '../api/services/userService'; import Exit from '../assets/exit.svg'; import { ActiveState } from '../models/misc'; import { AvailableTool } from './types'; import ConfigToolModal from './ConfigToolModal'; +import { useOutsideAlerter } from '../hooks'; +import { useTranslation } from 'react-i18next'; export default function AddToolModal({ message, @@ -25,6 +26,14 @@ export default function AddToolModal({ ); const [configModalState, setConfigModalState] = React.useState('INACTIVE'); + const modalRef = useRef(null); + const { t } = useTranslation(); + + useOutsideAlerter(modalRef, () => { + if (modalState === 'ACTIVE') { + setModalState('INACTIVE'); + } + }, [modalState]); const getAvailableTools = () => { userService @@ -63,14 +72,18 @@ export default function AddToolModal({ React.useEffect(() => { if (modalState === 'ACTIVE') getAvailableTools(); }, [modalState]); + return ( <>
-
+

- Select a tool to set up + {t('settings.tools.selectToolSetup')}

{availableTools.map((tool, index) => ( diff --git a/frontend/src/modals/ConfigToolModal.tsx b/frontend/src/modals/ConfigToolModal.tsx index 96bb15be8..4a8ca8811 100644 --- a/frontend/src/modals/ConfigToolModal.tsx +++ b/frontend/src/modals/ConfigToolModal.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { useTranslation } from 'react-i18next'; import Exit from '../assets/exit.svg'; import Input from '../components/Input'; @@ -17,6 +18,7 @@ export default function ConfigToolModal({ tool: AvailableTool | null; getUserTools: () => void; }) { + const { t } = useTranslation(); const [authKey, setAuthKey] = React.useState(''); const handleAddTool = (tool: AvailableTool) => { @@ -52,21 +54,22 @@ export default function ConfigToolModal({

- Tool Config + {t('modals.configTool.title')}

- Type: {tool?.name} + {t('modals.configTool.type')}:{' '} + {tool?.name}

- API Key / Oauth + {t('modals.configTool.apiKeyLabel')} setAuthKey(e.target.value)} borderVariant="thin" - placeholder="Enter API Key / Oauth" + placeholder={t('modals.configTool.apiKeyPlaceholder')} >
@@ -76,7 +79,7 @@ export default function ConfigToolModal({ }} className="rounded-3xl bg-purple-30 px-5 py-2 text-sm text-white transition-all hover:bg-[#6F3FD1]" > - Add Tool + {t('modals.configTool.addButton')}
diff --git a/frontend/src/modals/ShareConversationModal.tsx b/frontend/src/modals/ShareConversationModal.tsx index 3f87839e6..44156761c 100644 --- a/frontend/src/modals/ShareConversationModal.tsx +++ b/frontend/src/modals/ShareConversationModal.tsx @@ -101,11 +101,17 @@ export const ShareConversationModal = ({ return (
-

{t('modals.shareConv.label')}

-

{t('modals.shareConv.note')}

+

+ {t('modals.shareConv.label')} +

+

+ {t('modals.shareConv.note')} +

- {t('modals.shareConv.option')} -