diff --git a/web/i18n/language.ts b/web/i18n/language.ts index e65d34d0ffc0eb..7ba11b37f32364 100644 --- a/web/i18n/language.ts +++ b/web/i18n/language.ts @@ -49,6 +49,7 @@ export const NOTICE_I18N = { ko_KR: '중요 공지', pl_PL: 'Ważne ogłoszenie', uk_UA: 'Важливе повідомлення', + ru_RU: 'Важное Уведомление', vi_VN: 'Thông báo quan trọng', it_IT: 'Avviso Importante', fa_IR: 'هشدار مهم', @@ -74,6 +75,8 @@ export const NOTICE_I18N = { 'Nasz system będzie niedostępny od 19:00 do 24:00 UTC 28 sierpnia w celu aktualizacji. W przypadku pytań prosimy o kontakt z naszym zespołem wsparcia (support@dify.ai). Doceniamy Twoją cierpliwość.', uk_UA: 'Наша система буде недоступна з 19:00 до 24:00 UTC 28 серпня для оновлення. Якщо у вас виникнуть запитання, будь ласка, зв’яжіться з нашою службою підтримки (support@dify.ai). Дякуємо за терпіння.', + ru_RU: + 'Наша система будет недоступна с 19:00 до 24:00 UTC 28 августа для обновления. По вопросам, пожалуйста, обращайтесь в нашу службу поддержки (support@dify.ai). Спасибо за ваше терпение', vi_VN: 'Hệ thống của chúng tôi sẽ ngừng hoạt động từ 19:00 đến 24:00 UTC vào ngày 28 tháng 8 để nâng cấp. Nếu có thắc mắc, vui lòng liên hệ với nhóm hỗ trợ của chúng tôi (support@dify.ai). Chúng tôi đánh giá cao sự kiên nhẫn của bạn.', tr_TR: diff --git a/web/i18n/languages.json b/web/i18n/languages.json index d819e490897cfd..a70963b067da55 100644 --- a/web/i18n/languages.json +++ b/web/i18n/languages.json @@ -68,7 +68,7 @@ "name": "Русский (Россия)", "prompt_name": "Russian", "example": " Привет, Dify!", - "supported": false + "supported": true }, { "value": "it-IT", diff --git a/web/i18n/ru-RU/app-annotation.ts b/web/i18n/ru-RU/app-annotation.ts new file mode 100644 index 00000000000000..18f2ae4a11bf19 --- /dev/null +++ b/web/i18n/ru-RU/app-annotation.ts @@ -0,0 +1,87 @@ +const translation = { + title: 'Аннотации', + name: 'Ответить на аннотацию', + editBy: 'Ответ отредактирован {{author}}', + noData: { + title: 'Нет аннотаций', + description: 'Вы можете редактировать аннотации во время отладки приложения или импортировать их массово здесь для получения качественного ответа.', + }, + table: { + header: { + question: 'вопрос', + answer: 'ответ', + createdAt: 'создано', + hits: 'попаданий', + actions: 'действия', + addAnnotation: 'Добавить аннотацию', + bulkImport: 'Массовый импорт', + bulkExport: 'Массовый экспорт', + clearAll: 'Очистить все аннотации', + }, + }, + editModal: { + title: 'Редактировать ответ аннотации', + queryName: 'Запрос пользователя', + answerName: 'Storyteller Bot', + yourAnswer: 'Ваш ответ', + answerPlaceholder: 'Введите ваш ответ здесь', + yourQuery: 'Ваш запрос', + queryPlaceholder: 'Введите ваш запрос здесь', + removeThisCache: 'Удалить эту аннотацию', + createdAt: 'Создано', + }, + addModal: { + title: 'Добавить ответ аннотации', + queryName: 'Вопрос', + answerName: 'Ответ', + answerPlaceholder: 'Введите ответ здесь', + queryPlaceholder: 'Введите вопрос здесь', + createNext: 'Добавить еще один аннотированный ответ', + }, + batchModal: { + title: 'Массовый импорт', + csvUploadTitle: 'Перетащите сюда ваш CSV-файл или ', + browse: 'выберите файл', + tip: 'CSV-файл должен соответствовать следующей структуре:', + question: 'вопрос', + answer: 'ответ', + contentTitle: 'содержимое фрагмента', + content: 'содержимое', + template: 'Скачать шаблон здесь', + cancel: 'Отмена', + run: 'Запустить пакет', + runError: 'Ошибка запуска пакета', + processing: 'В процессе пакетной обработки', + completed: 'Импорт завершен', + error: 'Ошибка импорта', + ok: 'ОК', + }, + errorMessage: { + answerRequired: 'Ответ обязателен', + queryRequired: 'Вопрос обязателен', + }, + viewModal: { + annotatedResponse: 'Ответ аннотации', + hitHistory: 'История попаданий', + hit: 'Попадание', + hits: 'Попадания', + noHitHistory: 'Нет истории попаданий', + }, + hitHistoryTable: { + query: 'Запрос', + match: 'Совпадение', + response: 'Ответ', + source: 'Источник', + score: 'Оценка', + time: 'Время', + }, + initSetup: { + title: 'Начальная настройка ответа аннотации', + configTitle: 'Настройка ответа аннотации', + confirmBtn: 'Сохранить и включить', + configConfirmBtn: 'Сохранить', + }, + embeddingModelSwitchTip: 'Модель векторизации текста аннотаций, переключение между моделями будет осуществлено повторно, что приведет к дополнительным затратам.', +} + +export default translation diff --git a/web/i18n/ru-RU/app-api.ts b/web/i18n/ru-RU/app-api.ts new file mode 100644 index 00000000000000..064621b6227d7c --- /dev/null +++ b/web/i18n/ru-RU/app-api.ts @@ -0,0 +1,83 @@ +const translation = { + apiServer: 'API Сервер', + apiKey: 'API Ключ', + status: 'Статус', + disabled: 'Отключено', + ok: 'В работе', + copy: 'Копировать', + copied: 'Скопировано', + play: 'Запустить', + pause: 'Приостановить', + playing: 'Запущено', + loading: 'Загрузка', + merMaind: { + rerender: 'Перезапустить рендеринг', + }, + never: 'Никогда', + apiKeyModal: { + apiSecretKey: 'Секретный ключ API', + apiSecretKeyTips: 'Чтобы предотвратить злоупотребление API, защитите свой API ключ. Избегайте использования его в виде plain-текста во фронтенд-коде. :)', + createNewSecretKey: 'Создать новый секретный ключ', + secretKey: 'Секретный ключ', + created: 'СОЗДАН', + lastUsed: 'ПОСЛЕДНЕЕ ИСПОЛЬЗОВАНИЕ', + generateTips: 'Храните этот ключ в безопасном и доступном месте.', + }, + actionMsg: { + deleteConfirmTitle: 'Удалить этот секретный ключ?', + deleteConfirmTips: 'Это действие необратимо.', + ok: 'ОК', + }, + completionMode: { + title: 'API приложения', + info: 'Для высококачественной генерации текста, такой как статьи, резюме и переводы, используйте API completion-messages с пользовательским вводом. Генерация текста основана на параметрах модели и шаблонах подсказок, установленных в Dify Prompt Engineering.', + createCompletionApi: 'Создать completion-message', + createCompletionApiTip: 'Создайте completion-message для поддержки режима вопросов и ответов.', + inputsTips: '(Необязательно) Укажите поля пользовательского ввода в виде пар ключ-значение, соответствующих переменным в Prompt Eng. Ключ - это имя переменной, Значение - это значение параметра. Если тип поля - Выбор, отправленное Значение должно быть одним из предустановленных вариантов.', + queryTips: 'Текстовое содержимое пользовательского ввода.', + blocking: 'Блокирующий тип, ожидает завершения выполнения и возвращает результаты. (Запросы могут быть прерваны, если процесс длительный)', + streaming: ' Ответ в рамках потока. Реализация потоковой передачи ответов на основе SSE (Server-Sent Events).', + messageFeedbackApi: 'Обратная связь по сообщению (лайк)', + messageFeedbackApiTip: 'Оцените полученные сообщения от имени конечных пользователей с помощью лайков или дизлайков. Эти данные видны на странице Журналы и аннотации и используются для будущей тонкой настройки модели.', + messageIDTip: 'Идентификатор сообщения', + ratingTip: 'лайк или дизлайк, null - отмена', + parametersApi: 'Получить информацию о параметрах приложения', + parametersApiTip: 'Получить настроенные входные параметры, включая имена переменных, имена полей, типы и значения по умолчанию. Обычно используется для отображения этих полей в форме или заполнения значений по умолчанию после загрузки клиента.', + }, + chatMode: { + title: 'API приложения чата', + info: 'Для универсальных диалоговых приложений, использующих формат вопросов и ответов, вызовите API chat-messages, чтобы начать диалог. Поддерживайте текущие разговоры, передавая возвращенный conversation_id. Параметры ответа и шаблоны зависят от настроек Dify Prompt Eng.', + createChatApi: 'Создать сообщение чата', + createChatApiTip: 'Создайте новое сообщение разговора или продолжите существующий диалог.', + inputsTips: '(Необязательно) Укажите поля пользовательского ввода в виде пар ключ-значение, соответствующих переменным в Prompt Eng. Ключ - это имя переменной, Значение - это значение параметра. Если тип поля - Выбор, отправленное Значение должно быть одним из предустановленных вариантов.', + queryTips: 'Содержимое пользовательского ввода/вопроса', + blocking: 'Блокирующий тип, ожидает завершения выполнения и возвращает результаты. (Запросы могут быть прерваны, если процесс длительный)', + streaming: 'потоковая передача возвращает. Реализация потоковой передачи возврата на основе SSE (Server-Sent Events).', + conversationIdTip: '(Необязательно) Идентификатор разговора: оставьте пустым для первого разговора; передайте conversation_id из контекста, чтобы продолжить диалог.', + messageFeedbackApi: 'Обратная связь конечного пользователя по сообщению, лайк', + messageFeedbackApiTip: 'Оцените полученные сообщения от имени конечных пользователей с помощью лайков или дизлайков. Эти данные видны на странице Журналы и аннотации и используются для будущей тонкой настройки модели.', + messageIDTip: 'Идентификатор сообщения', + ratingTip: 'лайк или дизлайк, null - отмена', + chatMsgHistoryApi: 'Получить историю сообщений чата', + chatMsgHistoryApiTip: 'Первая страница возвращает последние `limit` строк, которые находятся в обратном порядке.', + chatMsgHistoryConversationIdTip: 'Идентификатор разговора', + chatMsgHistoryFirstId: 'Идентификатор первой записи чата на текущей странице. По умолчанию - нет.', + chatMsgHistoryLimit: 'Сколько чатов возвращается за один запрос', + conversationsListApi: 'Получить список разговоров', + conversationsListApiTip: 'Получает список сеансов текущего пользователя. По умолчанию возвращаются последние 20 сеансов.', + conversationsListFirstIdTip: 'Идентификатор последней записи на текущей странице, по умолчанию - нет.', + conversationsListLimitTip: 'Сколько чатов возвращается за один запрос', + conversationRenamingApi: 'Переименование разговора', + conversationRenamingApiTip: 'Переименовать разговоры; имя отображается в многосессионных клиентских интерфейсах.', + conversationRenamingNameTip: 'Новое имя', + parametersApi: 'Получить информацию о параметрах приложения', + parametersApiTip: 'Получить настроенные входные параметры, включая имена переменных, имена полей, типы и значения по умолчанию. Обычно используется для отображения этих полей в форме или заполнения значений по умолчанию после загрузки клиента.', + }, + develop: { + requestBody: 'Тело запроса', + pathParams: 'Параметры пути', + query: 'Запрос', + }, +} + +export default translation diff --git a/web/i18n/ru-RU/app-debug.ts b/web/i18n/ru-RU/app-debug.ts new file mode 100644 index 00000000000000..e976c11abaf1c3 --- /dev/null +++ b/web/i18n/ru-RU/app-debug.ts @@ -0,0 +1,463 @@ +const translation = { + pageTitle: { + line1: 'PROMPT', + line2: 'Engineering', + }, + orchestrate: 'Оркестрация', + promptMode: { + simple: 'Переключиться в экспертный режим для редактирования всего ПРОМПТА', + advanced: 'Экспертный режим', + switchBack: 'Переключиться обратно', + advancedWarning: { + title: 'Вы переключились в экспертный режим, и после изменения ПРОМПТА вы НЕ СМОЖЕТЕ вернуться в базовый режим.', + description: 'В экспертном режиме вы можете редактировать весь ПРОМПТ.', + learnMore: 'Узнать больше', + ok: 'ОК', + }, + operation: { + addMessage: 'Добавить сообщение', + }, + contextMissing: 'Отсутствует компонент контекста, эффективность промпта может быть невысокой.', + }, + operation: { + applyConfig: 'Опубликовать', + resetConfig: 'Сбросить', + debugConfig: 'Отладка', + addFeature: 'Добавить функцию', + automatic: 'Сгенерировать', + stopResponding: 'Остановить ответ', + agree: 'лайк', + disagree: 'дизлайк', + cancelAgree: 'Отменить лайк', + cancelDisagree: 'Отменить дизлайк', + userAction: 'Пользователь ', + }, + notSetAPIKey: { + title: 'Ключ поставщика LLM не установлен', + trailFinished: 'Пробный период закончен', + description: 'Ключ поставщика LLM не установлен, его необходимо установить перед отладкой.', + settingBtn: 'Перейти к настройкам', + }, + trailUseGPT4Info: { + title: 'В настоящее время не поддерживается gpt-4', + description: 'Чтобы использовать gpt-4, пожалуйста, установите API ключ.', + }, + feature: { + groupChat: { + title: 'Улучшение чата', + description: 'Добавление настроек предварительного разговора для приложений может улучшить пользовательский опыт.', + }, + groupExperience: { + title: 'Улучшение опыта', + }, + conversationOpener: { + title: 'Начальное сообщение', + description: 'В чат-приложении первое предложение, которое ИИ активно говорит пользователю, обычно используется в качестве приветствия.', + }, + suggestedQuestionsAfterAnswer: { + title: 'Последующие вопросы', + description: 'Настройка предложения следующих вопросов может улучшить чат для пользователей.', + resDes: '3 предложения для следующего вопроса пользователя.', + tryToAsk: 'Попробуйте спросить', + }, + moreLikeThis: { + title: 'Больше похожего', + description: 'Сгенерируйте несколько текстов одновременно, а затем отредактируйте и продолжайте генерировать', + generateNumTip: 'Количество генерируемых каждый раз', + tip: 'Использование этой функции приведет к дополнительным расходам токенов', + }, + speechToText: { + title: 'Преобразование речи в текст', + description: 'После включения вы можете использовать голосовой ввод.', + resDes: 'Голосовой ввод включен', + }, + textToSpeech: { + title: 'Преобразование текста в речь', + description: 'После включения текст можно преобразовать в речь.', + resDes: 'Преобразование текста в аудио включено', + }, + citation: { + title: 'Цитаты и ссылки', + description: 'После включения отображается исходный документ и атрибутированная часть сгенерированного контента.', + resDes: 'Цитаты и ссылки включены', + }, + annotation: { + title: 'Ответ аннотации', + description: 'Вы можете вручную добавить высококачественный ответ в кэш для приоритетного сопоставления с похожими вопросами пользователей.', + resDes: 'Ответ аннотации включен', + scoreThreshold: { + title: 'Порог оценки', + description: 'Используется для установки порога сходства для ответа аннотации.', + easyMatch: 'Простое совпадение', + accurateMatch: 'Точное совпадение', + }, + matchVariable: { + title: 'Переменная соответствия', + choosePlaceholder: 'Выберите переменную соответствия', + }, + cacheManagement: 'Аннотации', + cached: 'Аннотировано', + remove: 'Удалить', + removeConfirm: 'Удалить эту аннотацию?', + add: 'Добавить аннотацию', + edit: 'Редактировать аннотацию', + }, + dataSet: { + title: 'Контекст', + noData: 'Вы можете импортировать знания в качестве контекста', + words: 'Слова', + textBlocks: 'Текстовые блоки', + selectTitle: 'Выберите справочные знания', + selected: 'Знания выбраны', + noDataSet: 'Знания не найдены', + toCreate: 'Перейти к созданию', + notSupportSelectMulti: 'В настоящее время поддерживаются только одни знания', + queryVariable: { + title: 'Переменная запроса', + tip: 'Эта переменная будет использоваться в качестве входных данных запроса для поиска контекста, получая информацию о контексте, связанную с вводом этой переменной.', + choosePlaceholder: 'Выберите переменную запроса', + noVar: 'Нет переменных', + noVarTip: 'пожалуйста, создайте переменную в разделе Переменные', + unableToQueryDataSet: 'Невозможно запросить знания', + unableToQueryDataSetTip: 'Не удалось успешно запросить знания, пожалуйста, выберите переменную запроса контекста в разделе контекста.', + ok: 'ОК', + contextVarNotEmpty: 'переменная запроса контекста не может быть пустой', + deleteContextVarTitle: 'Удалить переменную "{{varName}}"?', + deleteContextVarTip: 'Эта переменная была установлена в качестве переменной запроса контекста, и ее удаление повлияет на нормальное использование знаний. Если вам все еще нужно удалить ее, пожалуйста, выберите ее заново в разделе контекста.', + }, + }, + tools: { + title: 'Инструменты', + tips: 'Инструменты предоставляют стандартный метод вызова API, принимая пользовательский ввод или переменные в качестве параметров запроса для запроса внешних данных в качестве контекста.', + toolsInUse: '{{count}} инструментов используется', + modal: { + title: 'Инструмент', + toolType: { + title: 'Тип инструмента', + placeholder: 'Пожалуйста, выберите тип инструмента', + }, + name: { + title: 'Имя', + placeholder: 'Пожалуйста, введите имя', + }, + variableName: { + title: 'Имя переменной', + placeholder: 'Пожалуйста, введите имя переменной', + }, + }, + }, + conversationHistory: { + title: 'История разговоров', + description: 'Установить префиксы имен для ролей разговора', + tip: 'История разговоров не включена, пожалуйста, добавьте в промпт выше.', + learnMore: 'Узнать больше', + editModal: { + title: 'Редактировать имена ролей разговора', + userPrefix: 'Префикс пользователя', + assistantPrefix: 'Префикс помощника', + }, + }, + toolbox: { + title: 'НАБОР ИНСТРУМЕНТОВ', + }, + moderation: { + title: 'Модерация контента', + description: 'Обеспечьте безопасность выходных данных модели, используя API модерации или поддерживая список чувствительных слов.', + allEnabled: 'ВХОДНОЙ/ВЫХОДНОЙ контент включен', + inputEnabled: 'ВХОДНОЙ контент включен', + outputEnabled: 'ВЫХОДНОЙ контент включен', + modal: { + title: 'Настройки модерации контента', + provider: { + title: 'Поставщик', + openai: 'Модерация OpenAI', + openaiTip: { + prefix: 'Для модерации OpenAI требуется ключ API OpenAI, настроенный в ', + suffix: '.', + }, + keywords: 'Ключевые слова', + }, + keywords: { + tip: 'По одному на строку, разделенные разрывами строк. До 100 символов на строку.', + placeholder: 'По одному на строку, разделенные разрывами строк', + line: 'Строка', + }, + content: { + input: 'Модерировать ВХОДНОЙ контент', + output: 'Модерировать ВЫХОДНОЙ контент', + preset: 'Предустановленные ответы', + placeholder: 'Здесь содержимое предустановленных ответов', + condition: 'Модерация ВХОДНОГО и ВЫХОДНОГО контента включена хотя бы одна', + fromApi: 'Предустановленные ответы возвращаются API', + errorMessage: 'Предустановленные ответы не могут быть пустыми', + supportMarkdown: 'Markdown поддерживается', + }, + openaiNotConfig: { + before: 'Для модерации OpenAI требуется ключ API OpenAI, настроенный в', + after: '', + }, + }, + }, + }, + generate: { + title: 'Генератор промпта', + description: 'Генератор промпта использует настроенную модель для оптимизации промпта для повышения качества и улучшения структуры. Пожалуйста, напишите четкие и подробные инструкции.', + tryIt: 'Попробуйте', + instruction: 'Инструкции', + instructionPlaceHolder: 'Напишите четкие и конкретные инструкции.', + generate: 'Сгенерировать', + resTitle: 'Сгенерированный промпт', + noDataLine1: 'Опишите свой случай использования слева,', + noDataLine2: 'предварительный просмотр оркестрации будет показан здесь.', + apply: 'Применить', + loading: 'Оркестрация приложения для вас...', + overwriteTitle: 'Перезаписать существующую конфигурацию?', + overwriteMessage: 'Применение этого промпта перезапишет существующую конфигурацию.', + template: { + pythonDebugger: { + name: 'Отладчик Python', + instruction: 'Бот, который может генерировать и отлаживать ваш код на основе ваших инструкций', + }, + translation: { + name: 'Переводчик', + instruction: 'Переводчик, который может переводить на несколько языков', + }, + professionalAnalyst: { + name: 'Профессиональный аналитик', + instruction: 'Извлекайте информацию, выявляйте риски и извлекайте ключевую информацию из длинных отчетов в одну записку', + }, + excelFormulaExpert: { + name: 'Эксперт по формулам Excel', + instruction: 'Чат-бот, который может помочь начинающим пользователям понять, использовать и создавать формулы Excel на основе инструкций пользователя', + }, + travelPlanning: { + name: 'Планировщик путешествий', + instruction: 'Помощник по планированию путешествий - это интеллектуальный инструмент, разработанный, чтобы помочь пользователям без труда планировать свои поездки', + }, + SQLSorcerer: { + name: 'SQL-ассистент', + instruction: 'Преобразуйте повседневный язык в SQL-запросы', + }, + GitGud: { + name: 'Git gud', + instruction: 'Генерируйте соответствующие команды Git на основе описанных пользователем действий по управлению версиями', + }, + meetingTakeaways: { + name: 'Итоги совещания', + instruction: 'Извлекайте из совещаний краткие резюме, включая темы обсуждения, ключевые выводы и элементы действий', + }, + writingsPolisher: { + name: 'Редактор', + instruction: 'Используйте LLM, чтобы улучшить свои письменные работы', + }, + }, + }, + resetConfig: { + title: 'Подтвердить сброс?', + message: + 'Сброс отменяет изменения, восстанавливая последнюю опубликованную конфигурацию.', + }, + errorMessage: { + nameOfKeyRequired: 'имя ключа: {{key}} обязательно', + valueOfVarRequired: 'значение {{key}} не может быть пустым', + queryRequired: 'Требуется текст запроса.', + waitForResponse: + 'Пожалуйста, дождитесь завершения ответа на предыдущее сообщение.', + waitForBatchResponse: + 'Пожалуйста, дождитесь завершения ответа на пакетное задание.', + notSelectModel: 'Пожалуйста, выберите модель', + waitForImgUpload: 'Пожалуйста, дождитесь загрузки изображения', + }, + chatSubTitle: 'Инструкции', + completionSubTitle: 'Префикс Промпта', + promptTip: + 'Промпт направляют ответы ИИ с помощью инструкций и ограничений. Вставьте переменные, такие как {{input}}. Этот Промпт не будет видна пользователям.', + formattingChangedTitle: 'Форматирование изменено', + formattingChangedText: + 'Изменение форматирования приведет к сбросу области отладки, вы уверены?', + variableTitle: 'Переменные', + variableTip: + 'Пользователи заполняют переменные в форме, автоматически заменяя переменные в промпте.', + notSetVar: 'Переменные позволяют пользователям вводить промпты или вступительные замечания при заполнении форм. Вы можете попробовать ввести "{{input}}" в промптах.', + autoAddVar: 'В предварительной промпте упоминаются неопределенные переменные, хотите ли вы добавить их в форму пользовательского ввода?', + variableTable: { + key: 'Ключ переменной', + name: 'Имя поля пользовательского ввода', + optional: 'Необязательно', + type: 'Тип ввода', + action: 'Действия', + typeString: 'Строка', + typeSelect: 'Выбор', + }, + varKeyError: { + canNoBeEmpty: '{{key}} обязательно', + tooLong: '{{key}} слишком длинное. Не может быть длиннее 30 символов', + notValid: '{{key}} недействительно. Может содержать только буквы, цифры и подчеркивания', + notStartWithNumber: '{{key}} не может начинаться с цифры', + keyAlreadyExists: '{{key}} уже существует', + }, + otherError: { + promptNoBeEmpty: 'Промпт не может быть пустой', + historyNoBeEmpty: 'История разговоров должна быть установлена в промпте', + queryNoBeEmpty: 'Запрос должен быть установлен в промпте', + }, + variableConig: { + 'addModalTitle': 'Добавить поле ввода', + 'editModalTitle': 'Редактировать поле ввода', + 'description': 'Настройка для переменной {{varName}}', + 'fieldType': 'Тип поля', + 'string': 'Короткий текст', + 'text-input': 'Короткий текст', + 'paragraph': 'Абзац', + 'select': 'Выбор', + 'number': 'Число', + 'notSet': 'Не задано, попробуйте ввести {{input}} в префикс промпта', + 'stringTitle': 'Параметры текстового поля формы', + 'maxLength': 'Максимальная длина', + 'options': 'Варианты', + 'addOption': 'Добавить вариант', + 'apiBasedVar': 'Переменная на основе API', + 'varName': 'Имя переменной', + 'labelName': 'Имя метки', + 'inputPlaceholder': 'Пожалуйста, введите', + 'content': 'Содержимое', + 'required': 'Обязательно', + 'errorMsg': { + labelNameRequired: 'Имя метки обязательно', + varNameCanBeRepeat: 'Имя переменной не может повторяться', + atLeastOneOption: 'Требуется хотя бы один вариант', + optionRepeat: 'Есть повторяющиеся варианты', + }, + }, + vision: { + name: 'Зрение', + description: 'Включение зрения позволит модели принимать изображения и отвечать на вопросы о них.', + settings: 'Настройки', + visionSettings: { + title: 'Настройки зрения', + resolution: 'Разрешение', + resolutionTooltip: `Низкое разрешение позволит модели получать версию изображения с низким разрешением 512 x 512 и представлять изображение с бюджетом 65 токенов. Это позволяет API возвращать ответы быстрее и потреблять меньше входных токенов для случаев использования, не требующих высокой детализации. + \n + Высокое разрешение сначала позволит модели увидеть изображение с низким разрешением, а затем создаст детальные фрагменты входных изображений в виде квадратов 512 пикселей на основе размера входного изображения. Каждый из детальных фрагментов использует вдвое больший бюджет токенов, в общей сложности 129 токенов.`, + high: 'Высокое', + low: 'Низкое', + uploadMethod: 'Метод загрузки', + both: 'Оба', + localUpload: 'Локальная загрузка', + url: 'URL', + uploadLimit: 'Лимит загрузки', + }, + }, + voice: { + name: 'Голос', + defaultDisplay: 'Голос по умолчанию', + description: 'Настройки преобразования текста в речь', + settings: 'Настройки', + voiceSettings: { + title: 'Настройки голоса', + language: 'Язык', + resolutionTooltip: 'Язык, поддерживаемый преобразованием текста в речь.', + voice: 'Голос', + autoPlay: 'Автовоспроизведение', + autoPlayEnabled: 'Включить', + autoPlayDisabled: 'Выключить', + }, + }, + openingStatement: { + title: 'Начальное сообщение', + add: 'Добавить', + writeOpener: 'Написать начальное сообщение', + placeholder: 'Напишите здесь свое начальное сообщение, вы можете использовать переменные, попробуйте ввести {{variable}}.', + openingQuestion: 'Начальные вопросы', + noDataPlaceHolder: + 'Начало разговора с пользователем может помочь ИИ установить более тесную связь с ним в диалоговых приложениях.', + varTip: 'Вы можете использовать переменные, попробуйте ввести {{variable}}', + tooShort: 'Для генерации вступительного замечания к разговору требуется не менее 20 слов начального промпта.', + notIncludeKey: 'Начальный промпт не включает переменную: {{key}}. Пожалуйста, добавьте её в начальную промпт.', + }, + modelConfig: { + model: 'Модель', + setTone: 'Установить тон ответов', + title: 'Модель и параметры', + modeType: { + chat: 'Чат', + completion: 'Завершение', + }, + }, + inputs: { + title: 'Отладка и предварительный просмотр', + noPrompt: 'Попробуйте написать промпт во входных данных предварительного промпта', + userInputField: 'Поле пользовательского ввода', + noVar: 'Заполните значение переменной, которое будет автоматически заменяться в промпте каждый раз при запуске нового сеанса.', + chatVarTip: + 'Заполните значение переменной, которое будет автоматически заменяться в промпте каждый раз при запуске нового сеанса', + completionVarTip: + 'Заполните значение переменной, которое будет автоматически заменяться в промпте каждый раз при отправке вопроса.', + previewTitle: 'Предварительный просмотр промпта', + queryTitle: 'Содержимое запроса', + queryPlaceholder: 'Пожалуйста, введите текст запроса.', + run: 'ЗАПУСТИТЬ', + }, + result: 'Выходной текст', + datasetConfig: { + settingTitle: 'Настройки поиска', + knowledgeTip: 'Нажмите кнопку "+", чтобы добавить знания', + retrieveOneWay: { + title: 'Поиск N-к-1', + description: 'На основе намерения пользователя и описаний знаний агент автономно выбирает наилучшие знания для запроса. Лучше всего подходит для приложений с различными, ограниченными знаниями.', + }, + retrieveMultiWay: { + title: 'Многопутный поиск', + description: 'На основе намерения пользователя выполняет запросы по всем знаниям, извлекает соответствующий текст из нескольких источников и выбирает наилучшие результаты, соответствующие запросу пользователя, после повторного ранжирования.', + }, + rerankModelRequired: 'Требуется rerank-модель ', + params: 'Параметры', + top_k: 'Top K', + top_kTip: 'Используется для фильтрации фрагментов, наиболее похожих на вопросы пользователей. Система также будет динамически корректировать значение Top K в зависимости от max_tokens выбранной модели.', + score_threshold: 'Порог оценки', + score_thresholdTip: 'Используется для установки порога сходства для фильтрации фрагментов.', + retrieveChangeTip: 'Изменение режима индексации и режима поиска может повлиять на приложения, связанные с этими знаниями.', + }, + debugAsSingleModel: 'Отладка как одной модели', + debugAsMultipleModel: 'Отладка как нескольких моделей', + duplicateModel: 'Дублировать', + publishAs: 'Опубликовать как', + assistantType: { + name: 'Тип помощника', + chatAssistant: { + name: 'Базовый помощник', + description: 'Создайте помощника на основе чата, используя большую языковую модель', + }, + agentAssistant: { + name: 'Агент-помощник', + description: 'Создайте интеллектуального агента, который может автономно выбирать инструменты для выполнения задач', + }, + }, + agent: { + agentMode: 'Режим агента', + agentModeDes: 'Установите тип режима вывода для агента', + agentModeType: { + ReACT: 'ReAct', + functionCall: 'Вызов функции', + }, + setting: { + name: 'Настройки агента', + description: 'Настройки агента-помощника позволяют установить режим агента и расширенные функции, такие как встроенные промпты, доступные только в типе агента.', + maximumIterations: { + name: 'Максимальное количество итераций', + description: 'Ограничьте количество итераций, которые может выполнить агент-помощник', + }, + }, + buildInPrompt: 'Встроенный промпт', + firstPrompt: 'Первый промпт', + nextIteration: 'Следующая итерация', + promptPlaceholder: 'Напишите здесь свой первый промпт', + tools: { + name: 'Инструменты', + description: 'Использование инструментов может расширить возможности LLM, такие как поиск в Интернете или выполнение научных расчетов', + enabled: 'Включено', + }, + }, +} + +export default translation diff --git a/web/i18n/ru-RU/app-log.ts b/web/i18n/ru-RU/app-log.ts new file mode 100644 index 00000000000000..c6c54ef1788a87 --- /dev/null +++ b/web/i18n/ru-RU/app-log.ts @@ -0,0 +1,95 @@ +const translation = { + title: 'Логирование', + description: 'В логах записывается состояние работы приложения, включая пользовательский ввод и ответы ИИ.', + dateTimeFormat: 'DD.MM.YYYY HH:mm', + table: { + header: { + updatedTime: 'Время обновления', + time: 'Время создания', + endUser: 'Конечный пользователь или аккаунт', + input: 'Ввод', + output: 'Вывод', + summary: 'Заголовок', + messageCount: 'Количество сообщений', + userRate: 'Оценка пользователя', + adminRate: 'Оценка оп.', + startTime: 'ВРЕМЯ НАЧАЛА', + status: 'СТАТУС', + runtime: 'ВРЕМЯ ВЫПОЛНЕНИЯ', + tokens: 'ТОКЕНЫ', + user: 'Конечный пользователь или аккаунт', + version: 'ВЕРСИЯ', + }, + pagination: { + previous: 'Предыдущий', + next: 'Следующий', + }, + empty: { + noChat: 'Еще нет чатов', + noOutput: 'Нет вывода', + element: { + title: 'Есть кто-нибудь?', + content: 'Наблюдайте и аннотируйте взаимодействия между конечными пользователями и приложениями ИИ здесь, чтобы постоянно повышать точность ИИ. Вы можете попробовать поделиться или протестировать веб-приложение самостоятельно, а затем вернуться на эту страницу.', + }, + }, + }, + detail: { + time: 'Время', + conversationId: 'Идентификатор разговора', + promptTemplate: 'Шаблон подсказки', + promptTemplateBeforeChat: 'Шаблон подсказки перед чатом · Как системное сообщение', + annotationTip: 'Улучшения, отмеченные {{user}}', + timeConsuming: '', + second: 'с', + tokenCost: 'Потрачено токенов', + loading: 'загрузка', + operation: { + like: 'лайк', + dislike: 'дизлайк', + addAnnotation: 'Добавить улучшение', + editAnnotation: 'Редактировать улучшение', + annotationPlaceholder: 'Введите ожидаемый ответ, который вы хотите получить от ИИ, который может быть использован для тонкой настройки модели и постоянного улучшения качества генерации текста в будущем.', + }, + variables: 'Переменные', + uploadImages: 'Загруженные изображения', + }, + filter: { + period: { + today: 'Сегодня', + last7days: 'Последние 7 дней', + last4weeks: 'Последние 4 недели', + last3months: 'Последние 3 месяца', + last12months: 'Последние 12 месяцев', + monthToDate: 'С начала месяца', + quarterToDate: 'С начала квартала', + yearToDate: 'С начала года', + allTime: 'Все время', + }, + annotation: { + all: 'Все', + annotated: 'Аннотированные улучшения ({{count}} элементов)', + not_annotated: 'Не аннотировано', + }, + sortBy: 'Сортировать по:', + descending: 'по убыванию', + ascending: 'по возрастанию', + }, + workflowTitle: 'Журналы рабочих процессов', + workflowSubtitle: 'Журнал записал работу Automate.', + runDetail: { + title: 'Журнал разговоров', + workflowTitle: 'Подробная информация о журнале', + }, + promptLog: 'Журнал подсказок', + agentLog: 'Журнал агента', + viewLog: 'Просмотреть журнал', + agentLogDetail: { + agentMode: 'Режим агента', + toolUsed: 'Использованный инструмент', + iterations: 'Итерации', + iteration: 'Итерация', + finalProcessing: 'Окончательная обработка', + }, +} + +export default translation diff --git a/web/i18n/ru-RU/app-overview.ts b/web/i18n/ru-RU/app-overview.ts new file mode 100644 index 00000000000000..2969ddd6e76c7d --- /dev/null +++ b/web/i18n/ru-RU/app-overview.ts @@ -0,0 +1,168 @@ +const translation = { + welcome: { + firstStepTip: 'Чтобы начать,', + enterKeyTip: 'введите свой ключ API OpenAI ниже', + getKeyTip: 'Получите свой ключ API на панели инструментов OpenAI', + placeholder: 'Ваш ключ API OpenAI (например, sk-xxxx)', + }, + apiKeyInfo: { + cloud: { + trial: { + title: 'Вы используете пробную квоту {{providerName}}.', + description: 'Пробная квота предоставляется для тестирования. Прежде чем пробная квота будет исчерпана, пожалуйста, настройте своего собственного поставщика модели или приобретите дополнительную квоту.', + }, + exhausted: { + title: 'Ваша пробная квота была исчерпана, пожалуйста, настройте свой APIKey.', + description: 'Вы исчерпали свою пробную квоту. Пожалуйста, настройте своего собственного поставщика модели или приобретите дополнительную квоту.', + }, + }, + selfHost: { + title: { + row1: 'Чтобы начать,', + row2: 'сначала настройте своего поставщика модели.', + }, + }, + callTimes: 'Количество вызовов', + usedToken: 'Использованные токены', + setAPIBtn: 'Перейти к настройке поставщика модели', + tryCloud: 'Или попробуйте облачную версию Dify с бесплатной квотой', + }, + overview: { + title: 'Обзор', + appInfo: { + explanation: 'Готовое к использованию веб-приложение ИИ', + accessibleAddress: 'Публичный URL', + preview: 'Предварительный просмотр', + regenerate: 'Перегенерировать', + regenerateNotice: 'Вы хотите перегенерировать публичный URL?', + preUseReminder: 'Пожалуйста, включите веб-приложение перед продолжением.', + settings: { + entry: 'Настройки', + title: 'Настройки веб-приложения', + webName: 'Название веб-приложения', + webDesc: 'Описание веб-приложения', + webDescTip: 'Этот текст будет отображаться на стороне клиента, предоставляя базовые инструкции по использованию приложения', + webDescPlaceholder: 'Введите описание веб-приложения', + language: 'Язык', + workflow: { + title: 'Рабочий процесс', + subTitle: 'Подробности рабочего процесса', + show: 'Показать', + hide: 'Скрыть', + showDesc: 'Показать или скрыть подробности рабочего процесса в веб-приложении', + }, + chatColorTheme: 'Цветовая тема чата', + chatColorThemeDesc: 'Установите цветовую тему чат-бота', + chatColorThemeInverted: 'Инвертированные цвета', + invalidHexMessage: 'Неверное HEX-значение', + sso: { + label: 'SSO аутентификация', + title: 'WebApp SSO', + description: 'Все пользователи должны войти в систему с помощью SSO перед использованием WebApp', + tooltip: 'Обратитесь к администратору, чтобы включить WebApp SSO', + }, + more: { + entry: 'Показать больше настроек', + copyright: 'Авторские права', + copyRightPlaceholder: 'Введите имя автора или организации', + privacyPolicy: 'Политика конфиденциальности', + privacyPolicyPlaceholder: 'Введите ссылку на политику конфиденциальности', + privacyPolicyTip: 'Помогает посетителям понять, какие данные собирает приложение, см. Политику конфиденциальности Dify.', + customDisclaimer: 'Пользовательский отказ от ответственности', + customDisclaimerPlaceholder: 'Введите текст пользовательского отказа от ответственности', + customDisclaimerTip: 'Текст пользовательского отказа от ответственности будет отображаться на стороне клиента, предоставляя дополнительную информацию о приложении', + }, + }, + embedded: { + entry: 'Встраивание', + title: 'Встроить на веб-сайт', + explanation: 'Выберите способ встраивания чат-приложения на свой веб-сайт', + iframe: 'Чтобы добавить чат-приложение в любое место на вашем веб-сайте, добавьте этот iframe в свой HTML-код.', + scripts: 'Чтобы добавить чат-приложение в правый нижний угол вашего веб-сайта, добавьте этот код в свой HTML.', + chromePlugin: 'Установите расширение Dify Chatbot для Chrome', + copied: 'Скопировано', + copy: 'Копировать', + }, + qrcode: { + title: 'QR-код ссылки', + scan: 'Сканировать, чтобы поделиться', + download: 'Скачать QR-код', + }, + customize: { + way: 'способ', + entry: 'Настроить', + title: 'Настроить веб-приложение ИИ', + explanation: 'Вы можете настроить внешний интерфейс веб-приложения в соответствии со своими потребностями.', + way1: { + name: 'Создайте форк клиентского кода, измените его и разверните на Vercel (рекомендуется)', + step1: 'Создайте форк клиентского кода и измените его', + step1Tip: 'Нажмите здесь, чтобы создать форк исходного кода в своей учетной записи GitHub и изменить код', + step1Operation: 'Dify-WebClient', + step2: 'Развернуть на Vercel', + step2Tip: 'Нажмите здесь, чтобы импортировать репозиторий в Vercel и развернуть', + step2Operation: 'Импортировать репозиторий', + step3: 'Настроить переменные среды', + step3Tip: 'Добавьте следующие переменные среды в Vercel', + }, + way2: { + name: 'Напишите клиентский код для вызова API и разверните его на сервере', + operation: 'Документация', + }, + }, + }, + apiInfo: { + title: 'API серверной части', + explanation: 'Легко интегрируется в ваше приложение', + accessibleAddress: 'Конечная точка API сервиса', + doc: 'Справочник по API', + }, + status: { + running: 'В работе', + disable: 'Отключено', + }, + }, + analysis: { + title: 'Анализ', + ms: 'мс', + tokenPS: 'Токен/с', + totalMessages: { + title: 'Всего сообщений', + explanation: 'Ежедневное количество взаимодействий с ИИ.', + }, + totalConversations: { + title: 'Всего чатов', + explanation: 'Ежедневное количество чатов с LLM; проектирование/отладка не учитываются.', + }, + activeUsers: { + title: 'Активные пользователи', + explanation: 'Уникальные пользователи, участвующие в вопросах и ответах с LLM; проектирование/отладка не учитываются.', + }, + tokenUsage: { + title: 'Использование токенов', + explanation: 'Отражает ежедневное использование токенов языковой модели для приложения, полезно для целей контроля затрат.', + consumed: 'Потрачено', + }, + avgSessionInteractions: { + title: 'Среднее количество взаимодействий за сеанс', + explanation: 'Количество непрерывных взаимодействий пользователя с LLM; для приложений на основе чатов.', + }, + avgUserInteractions: { + title: 'Среднее количество взаимодействий пользователя', + explanation: 'Отражает ежедневную частоту использования пользователями. Эта метрика отражает активность пользователей.', + }, + userSatisfactionRate: { + title: 'Уровень удовлетворенности пользователей', + explanation: 'Количество лайков на 1000 сообщений. Это указывает на долю ответов, которыми пользователи довольны.', + }, + avgResponseTime: { + title: 'Среднее время ответа', + explanation: 'Время (мс) для обработки/ответа LLM; для текстовых приложений.', + }, + tps: { + title: 'Скорость вывода токенов', + explanation: 'Измерьте производительность LLM. Подсчитайте скорость вывода токенов LLM от начала запроса до завершения вывода.', + }, + }, +} + +export default translation diff --git a/web/i18n/ru-RU/app.ts b/web/i18n/ru-RU/app.ts new file mode 100644 index 00000000000000..301961eee9f8a1 --- /dev/null +++ b/web/i18n/ru-RU/app.ts @@ -0,0 +1,133 @@ +const translation = { + createApp: 'СОЗДАТЬ ПРИЛОЖЕНИЕ', + types: { + all: 'Все', + chatbot: 'Чат-бот', + agent: 'Агент', + workflow: 'Рабочий процесс', + completion: 'Завершение', + }, + duplicate: 'Дублировать', + duplicateTitle: 'Дублировать приложение', + export: 'Экспортировать DSL', + exportFailed: 'Ошибка экспорта DSL.', + importDSL: 'Импортировать файл DSL', + createFromConfigFile: 'Создать из файла DSL', + importFromDSL: 'Импортировать из DSL', + importFromDSLFile: 'Из файла DSL', + importFromDSLUrl: 'Из URL', + importFromDSLUrlPlaceholder: 'Вставьте ссылку DSL сюда', + deleteAppConfirmTitle: 'Удалить это приложение?', + deleteAppConfirmContent: + 'Удаление приложения необратимо. Пользователи больше не смогут получить доступ к вашему приложению, и все настройки подсказок и журналы будут безвозвратно удалены.', + appDeleted: 'Приложение удалено', + appDeleteFailed: 'Не удалось удалить приложение', + join: 'Присоединяйтесь к сообществу', + communityIntro: + 'Общайтесь с членами команды, участниками и разработчиками на разных каналах.', + roadmap: 'Посмотреть наш roadmap', + newApp: { + startFromBlank: 'Создать с нуля', + startFromTemplate: 'Создать из шаблона', + captionAppType: 'Какой тип приложения вы хотите создать?', + chatbotDescription: 'Создайте приложение на основе чата. Это приложение использует формат вопросов и ответов, позволяя общаться непрерывно.', + completionDescription: 'Создайте приложение, которое генерирует высококачественный текст на основе подсказок, например, генерирует статьи, резюме, переводы и многое другое.', + completionWarning: 'Этот тип приложения больше не будет поддерживаться.', + agentDescription: 'Создайте интеллектуального агента, который может автономно выбирать инструменты для выполнения задач', + workflowDescription: 'Создайте приложение, которое генерирует высококачественный текст на основе рабочего процесса, организованного с высокой степенью настройки. Подходит для опытных пользователей.', + workflowWarning: 'В настоящее время находится в бета-версии', + chatbotType: 'Метод организации чат-бота', + basic: 'Базовый', + basicTip: 'Для начинающих, можно переключиться на Chatflow позже', + basicFor: 'ДЛЯ НАЧИНАЮЩИХ', + basicDescription: 'Базовый конструктор позволяет создать приложение чат-бота с помощью простых настроек, без возможности изменять встроенные подсказки. Подходит для начинающих.', + advanced: 'Chatflow', + advancedFor: 'Для продвинутых пользователей', + advancedDescription: 'Организация рабочего процесса организует чат-ботов в виде рабочих процессов, предлагая высокую степень настройки, включая возможность редактирования встроенных подсказок. Подходит для опытных пользователей.', + captionName: 'Значок и название приложения', + appNamePlaceholder: 'Дайте вашему приложению имя', + captionDescription: 'Описание', + appDescriptionPlaceholder: 'Введите описание приложения', + useTemplate: 'Использовать этот шаблон', + previewDemo: 'Предварительный просмотр', + chatApp: 'Ассистент', + chatAppIntro: + 'Я хочу создать приложение на основе чата. Это приложение использует формат вопросов и ответов, позволяя общаться непрерывно.', + agentAssistant: 'Новый Ассистент Агента', + completeApp: 'Генератор текста', + completeAppIntro: + 'Я хочу создать приложение, которое генерирует высококачественный текст на основе подсказок, например, генерирует статьи, резюме, переводы и многое другое.', + showTemplates: 'Я хочу выбрать из шаблона', + hideTemplates: 'Вернуться к выбору режима', + Create: 'Создать', + Cancel: 'Отмена', + nameNotEmpty: 'Имя не может быть пустым', + appTemplateNotSelected: 'Пожалуйста, выберите шаблон', + appTypeRequired: 'Пожалуйста, выберите тип приложения', + appCreated: 'Приложение создано', + appCreateFailed: 'Не удалось создать приложение', + }, + editApp: 'Редактировать информацию', + editAppTitle: 'Редактировать информацию о приложении', + editDone: 'Информация о приложении обновлена', + editFailed: 'Не удалось обновить информацию о приложении', + iconPicker: { + ok: 'ОК', + cancel: 'Отмена', + emoji: 'Эмодзи', + image: 'Изображение', + }, + switch: 'Переключиться на Workflow', + switchTipStart: 'Для вас будет создана новая копия Workflow. Новая копия ', + switchTip: 'не позволит', + switchTipEnd: ' переключиться обратно на базовую организацию.', + switchLabel: 'Копия приложения, которая будет создана', + removeOriginal: 'Удалить исходное приложение', + switchStart: 'Переключиться', + typeSelector: { + all: 'ВСЕ типы', + chatbot: 'Чат-бот', + agent: 'Агент', + workflow: 'Рабочий процесс', + completion: 'Завершение', + }, + tracing: { + title: 'Отслеживание производительности приложения', + description: 'Настройка стороннего поставщика LLMOps и отслеживание производительности приложения.', + config: 'Настройка', + view: 'Просмотр', + collapse: 'Свернуть', + expand: 'Развернуть', + tracing: 'Отслеживание', + disabled: 'Отключено', + disabledTip: 'Пожалуйста, сначала настройте провайдера LLM', + enabled: 'В работе', + tracingDescription: 'Запись полного контекста выполнения приложения, включая вызовы LLM, контекст, подсказки, HTTP-запросы и многое другое, на стороннюю платформу трассировки.', + configProviderTitle: { + configured: 'Настроено', + notConfigured: 'Настройте провайдера, чтобы включить трассировку', + moreProvider: 'Больше провайдеров', + }, + langsmith: { + title: 'LangSmith', + description: 'Универсальная платформа для разработчиков для каждого этапа жизненного цикла приложения на базе LLM.', + }, + langfuse: { + title: 'Langfuse', + description: 'Трассировка, оценка, управление подсказками и метрики для отладки и улучшения вашего приложения LLM.', + }, + inUse: 'Используется', + configProvider: { + title: 'Настройка ', + placeholder: 'Введите ваш {{key}}', + project: 'Проект', + publicKey: 'Публичный ключ', + secretKey: 'Секретный ключ', + viewDocsLink: 'Посмотреть документацию {{key}}', + removeConfirmTitle: 'Удалить конфигурацию {{key}}?', + removeConfirmContent: 'Текущая конфигурация используется, ее удаление отключит функцию трассировки.', + }, + }, +} + +export default translation diff --git a/web/i18n/ru-RU/billing.ts b/web/i18n/ru-RU/billing.ts new file mode 100644 index 00000000000000..e7760d9ac63ab9 --- /dev/null +++ b/web/i18n/ru-RU/billing.ts @@ -0,0 +1,118 @@ +const translation = { + currentPlan: 'Текущий тарифный план', + upgradeBtn: { + plain: 'Обновить тарифный план', + encourage: 'Обновить сейчас', + encourageShort: 'Обновить', + }, + viewBilling: 'Управление счетами и подписками', + buyPermissionDeniedTip: 'Пожалуйста, свяжитесь с администратором вашей организации, чтобы подписаться', + plansCommon: { + title: 'Выберите тарифный план, который подходит именно вам', + yearlyTip: 'Получите 2 месяца бесплатно, подписавшись на год!', + mostPopular: 'Самый популярный', + planRange: { + monthly: 'Ежемесячно', + yearly: 'Ежегодно', + }, + month: 'месяц', + year: 'год', + save: 'Сэкономить ', + free: 'Бесплатно', + currentPlan: 'Текущий тарифный план', + contractSales: 'Связаться с отделом продаж', + contractOwner: 'Связаться с руководителем команды', + startForFree: 'Начать бесплатно', + getStartedWith: 'Начать с ', + contactSales: 'Связаться с отделом продаж', + talkToSales: 'Поговорить с отделом продаж', + modelProviders: 'Поставщики моделей', + teamMembers: 'Участники команды', + annotationQuota: 'Квота аннотаций', + buildApps: 'Создать приложения', + vectorSpace: 'Векторное пространство', + vectorSpaceBillingTooltip: 'Каждый 1 МБ может хранить около 1,2 миллиона символов векторизованных данных (оценка с использованием Embeddings OpenAI, варьируется в зависимости от модели).', + vectorSpaceTooltip: 'Векторное пространство - это система долговременной памяти, необходимая LLM для понимания ваших данных.', + documentsUploadQuota: 'Квота загрузки документов', + documentProcessingPriority: 'Приоритет обработки документов', + documentProcessingPriorityTip: 'Для более высокого приоритета обработки документов, пожалуйста, обновите свой тарифный план.', + documentProcessingPriorityUpgrade: 'Обрабатывайте больше данных с большей точностью и на более высоких скоростях.', + priority: { + 'standard': 'Стандартный', + 'priority': 'Приоритетный', + 'top-priority': 'Высокий приоритет', + }, + logsHistory: 'История журналов', + customTools: 'Пользовательские инструменты', + unavailable: 'Недоступно', + days: 'дней', + unlimited: 'Неограниченно', + support: 'Поддержка', + supportItems: { + communityForums: 'Форумы сообщества', + emailSupport: 'Поддержка по электронной почте', + priorityEmail: 'Приоритетная поддержка по электронной почте и в чате', + logoChange: 'Изменение логотипа', + SSOAuthentication: 'SSO аутентификация', + personalizedSupport: 'Персональная поддержка', + dedicatedAPISupport: 'Выделенная поддержка API', + customIntegration: 'Пользовательская интеграция и поддержка', + ragAPIRequest: 'Запросы RAG API', + bulkUpload: 'Массовая загрузка документов', + agentMode: 'Режим агента', + workflow: 'Рабочий процесс', + llmLoadingBalancing: 'Балансировка нагрузки LLM', + llmLoadingBalancingTooltip: 'Добавьте несколько ключей API к моделям, эффективно обходя ограничения скорости API.', + }, + comingSoon: 'Скоро', + member: 'Участник', + memberAfter: 'Участник', + messageRequest: { + title: 'Кредиты на сообщения', + tooltip: 'Квоты вызова сообщений для различных тарифных планов, использующих модели OpenAI (кроме gpt4). Сообщения, превышающие лимит, будут использовать ваш ключ API OpenAI.', + }, + annotatedResponse: { + title: 'Ограничения квоты аннотаций', + tooltip: 'Ручное редактирование и аннотирование ответов обеспечивает настраиваемые высококачественные возможности ответов на вопросы для приложений. (Применимо только в чат-приложениях)', + }, + ragAPIRequestTooltip: 'Относится к количеству вызовов API, вызывающих только возможности обработки базы знаний Dify.', + receiptInfo: 'Только владелец команды и администратор команды могут подписываться и просматривать информацию о выставлении счетов', + }, + plans: { + sandbox: { + name: 'Песочница', + description: '200 бесплатных пробных использований GPT', + includesTitle: 'Включает:', + }, + professional: { + name: 'Профессиональный', + description: 'Для частных лиц и небольших команд, чтобы разблокировать больше возможностей по доступной цене.', + includesTitle: 'Все в бесплатном плане, плюс:', + }, + team: { + name: 'Команда', + description: 'Сотрудничайте без ограничений и наслаждайтесь высочайшей производительностью.', + includesTitle: 'Все в профессиональном плане, плюс:', + }, + enterprise: { + name: 'Корпоративный', + description: 'Получите полный набор возможностей и поддержку для крупномасштабных критически важных систем.', + includesTitle: 'Все в командном плане, плюс:', + }, + }, + vectorSpace: { + fullTip: 'Векторное пространство заполнено.', + fullSolution: 'Обновите свой тарифный план, чтобы получить больше места.', + }, + apps: { + fullTipLine1: 'Обновите свой тарифный план, чтобы', + fullTipLine2: 'создавать больше приложений.', + }, + annotatedResponse: { + fullTipLine1: 'Обновите свой тарифный план, чтобы', + fullTipLine2: 'аннотировать больше разговоров.', + quotaTitle: 'Квота ответов аннотаций', + }, +} + +export default translation diff --git a/web/i18n/ru-RU/common.ts b/web/i18n/ru-RU/common.ts new file mode 100644 index 00000000000000..6aa98c9a1eada7 --- /dev/null +++ b/web/i18n/ru-RU/common.ts @@ -0,0 +1,576 @@ +const translation = { + api: { + success: 'Успешно', + actionSuccess: 'Действие выполнено успешно', + saved: 'Сохранено', + create: 'Создано', + remove: 'Удалено', + }, + operation: { + create: 'Создать', + confirm: 'Подтвердить', + cancel: 'Отмена', + clear: 'Очистить', + save: 'Сохранить', + saveAndEnable: 'Сохранить и включить', + edit: 'Редактировать', + add: 'Добавить', + added: 'Добавлено', + refresh: 'Перезапустить', + reset: 'Сбросить', + search: 'Поиск', + change: 'Изменить', + remove: 'Удалить', + send: 'Отправить', + copy: 'Копировать', + lineBreak: 'Разрыв строки', + sure: 'Я уверен', + download: 'Скачать', + delete: 'Удалить', + settings: 'Настройки', + setup: 'Настроить', + getForFree: 'Получить бесплатно', + reload: 'Перезагрузить', + ok: 'ОК', + log: 'Журнал', + learnMore: 'Узнать больше', + params: 'Параметры', + duplicate: 'Дублировать', + rename: 'Переименовать', + }, + errorMsg: { + fieldRequired: '{{field}} обязательно', + urlError: 'URL должен начинаться с http:// или https://', + }, + placeholder: { + input: 'Пожалуйста, введите', + select: 'Пожалуйста, выберите', + }, + voice: { + language: { + zhHans: 'Китайский', + zhHant: 'Традиционный китайский', + enUS: 'Английский', + deDE: 'Немецкий', + frFR: 'Французский', + esES: 'Испанский', + itIT: 'Итальянский', + thTH: 'Тайский', + idID: 'Индонезийский', + jaJP: 'Японский', + koKR: 'Корейский', + ptBR: 'Португальский', + ruRU: 'Русский', + ukUA: 'Украинский', + viVN: 'Вьетнамский', + plPL: 'Польский', + roRO: 'Румынский', + hiIN: 'Хинди', + trTR: 'Турецкий', + faIR: 'Персидский', + }, + }, + unit: { + char: 'символов', + }, + actionMsg: { + noModification: 'На данный момент нет изменений.', + modifiedSuccessfully: 'Изменено успешно', + modifiedUnsuccessfully: 'Изменено неудачно', + copySuccessfully: 'Скопировано успешно', + paySucceeded: 'Оплата прошла успешно', + payCancelled: 'Оплата отменена', + generatedSuccessfully: 'Сгенерировано успешно', + generatedUnsuccessfully: 'Сгенерировано неудачно', + }, + model: { + params: { + temperature: 'Temperature', + temperatureTip: + 'Контролирует случайность: более низкое значение приводит к менее случайным завершениям. По мере приближения температуры к нулю модель станет детерминированной и повторяющейся.', + top_p: 'Top P', + top_pTip: + 'Контролирует разнообразие с помощью ядерной выборки: 0,5 означает, что рассматривается половина всех вариантов, взвешенных по вероятности.', + presence_penalty: 'Presence penalty', + presence_penaltyTip: + 'Насколько штрафовать новые токены в зависимости от того, появляются ли они в тексте до сих пор.\nУвеличивает вероятность того, что модель будет говорить о новых темах.', + frequency_penalty: 'Frequency penalty', + frequency_penaltyTip: + 'Насколько штрафовать новые токены в зависимости от их существующей частоты в тексте до сих пор.\nУменьшает вероятность того, что модель будет повторять одну и ту же строку дословно.', + max_tokens: 'Максимальное количество токенов', + max_tokensTip: + 'Используется для ограничения максимальной длины ответа в токенах. \nБольшие значения могут ограничивать пространство, оставленное для подсказок, журналов чата и знаний. \nРекомендуется установить его ниже двух третей\ngpt-4-1106-preview, gpt-4-vision-preview max token (input 128k output 4k)', + maxTokenSettingTip: 'Ваша настройка максимального количества токенов высока, что потенциально ограничивает пространство для подсказок, запросов и данных. Подумайте о том, чтобы установить его ниже 2/3.', + setToCurrentModelMaxTokenTip: 'Максимальное количество токенов обновлено до 80% максимального количества токенов текущей модели {{maxToken}}.', + stop_sequences: 'Стоп-последовательности', + stop_sequencesTip: 'До четырех последовательностей, где API прекратит генерировать дальнейшие токены. Возвращаемый текст не будет содержать стоп-последовательность.', + stop_sequencesPlaceholder: 'Введите последовательность и нажмите Tab', + }, + tone: { + Creative: 'Творческий', + Balanced: 'Сбалансированный', + Precise: 'Точный', + Custom: 'Пользовательский', + }, + addMoreModel: 'Перейдите в настройки, чтобы добавить больше моделей', + }, + menus: { + status: 'бета', + explore: 'Исследовать', + apps: 'Студия', + plugins: 'Плагины', + pluginsTips: 'Интегрируйте сторонние плагины или создавайте совместимые с ChatGPT AI-плагины.', + datasets: 'Знания', + datasetsTips: 'СКОРО: Импортируйте свои собственные текстовые данные или записывайте данные в режиме реального времени через Webhook для улучшения контекста LLM.', + newApp: 'Новое приложение', + newDataset: 'Создать знания', + tools: 'Инструменты', + }, + userProfile: { + settings: 'Настройки', + emailSupport: 'Поддержка по электронной почте', + workspace: 'Рабочее пространство', + createWorkspace: 'Создать рабочее пространство', + helpCenter: 'Помощь', + roadmapAndFeedback: 'Обратная связь', + community: 'Сообщество', + about: 'О нас', + logout: 'Выйти', + }, + settings: { + accountGroup: 'АККАУНТ', + workplaceGroup: 'РАБОЧЕЕ ПРОСТРАНСТВО', + account: 'Моя учетная запись', + members: 'Участники', + billing: 'Оплата', + integrations: 'Интеграции', + language: 'Язык', + provider: 'Поставщик модели', + dataSource: 'Источник данных', + plugin: 'Плагины', + apiBasedExtension: 'API расширение', + }, + account: { + avatar: 'Аватар', + name: 'Имя', + email: 'Электронная почта', + password: 'Пароль', + passwordTip: 'Вы можете установить постоянный пароль, если не хотите использовать временные коды входа', + setPassword: 'Установить пароль', + resetPassword: 'Сбросить пароль', + currentPassword: 'Текущий пароль', + newPassword: 'Новый пароль', + confirmPassword: 'Подтвердите пароль', + notEqual: 'Два пароля различаются.', + langGeniusAccount: 'Учетная запись Dify', + langGeniusAccountTip: 'Ваша учетная запись Dify и связанные с ней пользовательские данные.', + editName: 'Редактировать имя', + showAppLength: 'Показать {{length}} приложений', + delete: 'Удалить учетную запись', + deleteTip: 'Удаление вашей учетной записи приведет к безвозвратному удалению всех ваших данных, и их невозможно будет восстановить.', + deleteConfirmTip: 'Для подтверждения, пожалуйста, отправьте следующее с вашего зарегистрированного адреса электронной почты на ', + }, + members: { + team: 'Команда', + invite: 'Добавить', + name: 'ИМЯ', + lastActive: 'ПОСЛЕДНЯЯ АКТИВНОСТЬ', + role: 'РОЛИ', + pending: 'Ожидание...', + owner: 'Владелец', + admin: 'Администратор', + adminTip: 'Может создавать приложения и управлять настройками команды', + normal: 'Обычный', + normalTip: 'Может только использовать приложения, не может создавать приложения', + builder: 'Разработчик', + builderTip: 'Может создавать и редактировать собственные приложения', + editor: 'Редактор', + editorTip: 'Может создавать и редактировать приложения', + datasetOperator: 'Администратор знаний', + datasetOperatorTip: 'Может управлять только базой знаний', + inviteTeamMember: 'Добавить участника команды', + inviteTeamMemberTip: 'Они могут получить доступ к данным вашей команды сразу после входа в систему.', + email: 'Электронная почта', + emailInvalid: 'Неверный формат электронной почты', + emailPlaceholder: 'Пожалуйста, введите адреса электронной почты', + sendInvite: 'Отправить приглашение', + invitedAsRole: 'Приглашен как пользователь с ролью {{role}}', + invitationSent: 'Приглашение отправлено', + invitationSentTip: 'Приглашение отправлено, и они могут войти в Dify, чтобы получить доступ к данным вашей команды.', + invitationLink: 'Ссылка для приглашения', + failedinvitationEmails: 'Следующие пользователи не были успешно приглашены', + ok: 'ОК', + removeFromTeam: 'Удалить из команды', + removeFromTeamTip: 'Удалить доступ к команде', + setAdmin: 'Назначить администратором', + setMember: 'Назначить обычным участником', + setBuilder: 'Назначить разработчиком', + setEditor: 'Назначить редактором', + disinvite: 'Отменить приглашение', + deleteMember: 'Удалить участника', + you: '(Вы)', + }, + integrations: { + connected: 'Подключено', + google: 'Google', + googleAccount: 'Войти с помощью учетной записи Google', + github: 'GitHub', + githubAccount: 'Войти с помощью учетной записи GitHub', + connect: 'Подключить', + }, + language: { + displayLanguage: 'Язык отображения', + timezone: 'Часовой пояс', + }, + provider: { + apiKey: 'Ключ API', + enterYourKey: 'Введите свой ключ API здесь', + invalidKey: 'Неверный ключ API OpenAI', + validatedError: 'Ошибка валидации: ', + validating: 'Проверка ключа...', + saveFailed: 'Ошибка сохранения ключа API', + apiKeyExceedBill: 'Этот API-ключ не имеет доступной квоты, пожалуйста, прочитайте', + addKey: 'Добавить ключ', + comingSoon: 'Скоро', + editKey: 'Редактировать', + invalidApiKey: 'Неверный ключ API', + azure: { + apiBase: 'Базовый API', + apiBasePlaceholder: 'Базовый URL-адрес API вашей конечной точки Azure OpenAI.', + apiKey: 'Ключ API', + apiKeyPlaceholder: 'Введите свой ключ API здесь', + helpTip: 'Узнать о службе Azure OpenAI', + }, + openaiHosted: { + openaiHosted: 'Размещенный OpenAI', + onTrial: 'ПРОБНАЯ ВЕРСИЯ', + exhausted: 'КВОТА ИСЧЕРПАНА', + desc: 'Хостинговая служба OpenAI, предоставляемая Dify, позволяет вам использовать такие модели, как GPT-3.5. Прежде чем ваша пробная квота будет исчерпана, вам необходимо настроить других поставщиков моделей.', + callTimes: 'Количество вызовов', + usedUp: 'Пробная квота исчерпана. Добавьте собственного поставщика модели.', + useYourModel: 'В настоящее время используется собственный поставщик модели.', + close: 'Закрыть', + }, + anthropicHosted: { + anthropicHosted: 'Anthropic Claude', + onTrial: 'ПРОБНАЯ ВЕРСИЯ', + exhausted: 'КВОТА ИСЧЕРПАНА', + desc: 'Мощная модель, которая отлично справляется с широким спектром задач, от сложных диалогов и создания творческого контента до подробных инструкций.', + callTimes: 'Количество вызовов', + usedUp: 'Пробная квота исчерпана. Добавьте собственного поставщика модели.', + useYourModel: 'В настоящее время используется собственный поставщик модели.', + close: 'Закрыть', + }, + anthropic: { + using: 'Возможность встраивания использует', + enableTip: 'Чтобы включить модель Anthropic, вам необходимо сначала привязаться к OpenAI или Azure OpenAI Service.', + notEnabled: 'Не включено', + keyFrom: 'Получите свой ключ API от Anthropic', + }, + encrypted: { + front: 'Ваш API-ключ будет зашифрован и сохранен с использованием', + back: ' технологии.', + }, + }, + modelProvider: { + notConfigured: 'Системная модель еще не полностью настроена, и некоторые функции могут быть недоступны.', + systemModelSettings: 'Настройки системной модели', + systemModelSettingsLink: 'Зачем нужно настраивать системную модель?', + selectModel: 'Выберите свою модель', + setupModelFirst: 'Пожалуйста, сначала настройте свою модель', + systemReasoningModel: { + key: 'Модель системного мышления', + tip: 'Установите модель вывода по умолчанию, которая будет использоваться для создания приложений, а также такие функции, как генерация имени диалога и предложение следующего вопроса, также будут использовать модель вывода по умолчанию.', + }, + embeddingModel: { + key: 'Модель встраивания', + tip: 'Установите модель по умолчанию для обработки встраивания документов знаний, как поиск, так и импорт знаний используют эту модель встраивания для обработки векторизации. Переключение приведет к несоответствию векторного измерения между импортированными знаниями и вопросом, что приведет к сбою поиска. Чтобы избежать сбоя поиска, пожалуйста, не переключайте эту модель по своему усмотрению.', + required: 'Модель встраивания обязательна', + }, + speechToTextModel: { + key: 'Модель преобразования речи в текст', + tip: 'Установите модель по умолчанию для ввода речи в текст в разговоре.', + }, + ttsModel: { + key: 'Модель преобразования текста в речь', + tip: 'Установите модель по умолчанию для ввода текста в речь в разговоре.', + }, + rerankModel: { + key: 'Модель повторного ранжирования', + tip: 'Модель повторного ранжирования изменит порядок списка документов-кандидатов на основе семантического соответствия запросу пользователя, улучшая результаты семантического ранжирования', + }, + apiKey: 'API-КЛЮЧ', + quota: 'Квота', + searchModel: 'Поиск модели', + noModelFound: 'Модель не найдена для {{model}}', + models: 'Модели', + showMoreModelProvider: 'Показать больше поставщиков моделей', + selector: { + tip: 'Эта модель была удалена. Пожалуйста, добавьте модель или выберите другую модель.', + emptyTip: 'Нет доступных моделей', + emptySetting: 'Пожалуйста, перейдите в настройки для настройки', + rerankTip: 'Пожалуйста, настройте модель повторного ранжирования', + }, + card: { + quota: 'КВОТА', + onTrial: 'Пробная версия', + paid: 'Платный', + quotaExhausted: 'Квота исчерпана', + callTimes: 'Количество вызовов', + tokens: 'Токены', + buyQuota: 'Купить квоту', + priorityUse: 'Приоритетное использование', + removeKey: 'Удалить API-ключ', + tip: 'Приоритет будет отдаваться платной квоте. Пробная квота будет использоваться после исчерпания платной квоты.', + }, + item: { + deleteDesc: '{{modelName}} используются в качестве моделей системного мышления. Некоторые функции будут недоступны после удаления. Пожалуйста, подтвердите.', + freeQuota: 'БЕСПЛАТНАЯ КВОТА', + }, + addApiKey: 'Добавьте свой API-ключ', + invalidApiKey: 'Неверный API-ключ', + encrypted: { + front: 'Ваш API-ключ будет зашифрован и сохранен с использованием', + back: ' технологии.', + }, + freeQuota: { + howToEarn: 'Как заработать', + }, + addMoreModelProvider: 'ДОБАВИТЬ БОЛЬШЕ ПОСТАВЩИКОВ МОДЕЛЕЙ', + addModel: 'Добавить модель', + modelsNum: '{{num}} Моделей', + showModels: 'Показать модели', + showModelsNum: 'Показать {{num}} моделей', + collapse: 'Свернуть', + config: 'Настройка', + modelAndParameters: 'Модель и параметры', + model: 'Модель', + featureSupported: '{{feature}} поддерживается', + callTimes: 'Количество вызовов', + credits: 'Кредиты на сообщения', + buyQuota: 'Купить квоту', + getFreeTokens: 'Получить бесплатные токены', + priorityUsing: 'Приоритетное использование', + deprecated: 'Устаревший', + confirmDelete: 'Подтвердить удаление?', + quotaTip: 'Оставшиеся доступные бесплатные токены', + loadPresets: 'Загрузить предустановки', + parameters: 'ПАРАМЕТРЫ', + loadBalancing: 'Балансировка нагрузки', + loadBalancingDescription: 'Снизьте нагрузку с помощью нескольких наборов учетных данных.', + loadBalancingHeadline: 'Балансировка нагрузки', + configLoadBalancing: 'Настроить балансировку нагрузки', + modelHasBeenDeprecated: 'Эта модель устарела', + providerManaged: 'Управляется поставщиком', + providerManagedDescription: 'Используйте один набор учетных данных, предоставленный поставщиком модели.', + defaultConfig: 'Настройка по умолчанию', + apiKeyStatusNormal: 'Статус APIKey в норме', + apiKeyRateLimit: 'Достигнут предел скорости, доступен через {{seconds}}s', + addConfig: 'Добавить конфигурацию', + editConfig: 'Редактировать конфигурацию', + loadBalancingLeastKeyWarning: 'Для включения балансировки нагрузки необходимо включить не менее 2 ключей.', + loadBalancingInfo: 'По умолчанию балансировка нагрузки использует стратегию Round-robin. Если срабатывает ограничение скорости, будет применен 1-минутный период охлаждения.', + upgradeForLoadBalancing: 'Обновите свой тарифный план, чтобы включить балансировку нагрузки.', + }, + dataSource: { + add: 'Добавить источник данных', + connect: 'Подключить', + configure: 'Настроить', + notion: { + title: 'Notion', + description: 'Использование Notion в качестве источника данных для знаний.', + connectedWorkspace: 'Подключенное рабочее пространство', + addWorkspace: 'Добавить рабочее пространство', + connected: 'Подключено', + disconnected: 'Отключено', + changeAuthorizedPages: 'Изменить авторизованные страницы', + pagesAuthorized: 'Авторизованные страницы', + sync: 'Синхронизировать', + remove: 'Удалить', + selector: { + pageSelected: 'Выбранные страницы', + searchPages: 'Поиск страниц...', + noSearchResult: 'Нет результатов поиска', + addPages: 'Добавить страницы', + preview: 'ПРЕДПРОСМОТР', + }, + }, + website: { + title: 'Веб-сайт', + description: 'Импортировать контент с веб-сайтов с помощью веб-краулера.', + with: 'С', + configuredCrawlers: 'Настроенные краулеры', + active: 'Активный', + inactive: 'Неактивный', + }, + }, + plugin: { + serpapi: { + apiKey: 'Ключ API', + apiKeyPlaceholder: 'Введите свой ключ API', + keyFrom: 'Получите свой ключ SerpAPI на странице учетной записи SerpAPI', + }, + }, + apiBasedExtension: { + title: 'API-расширения обеспечивают централизованное управление API, упрощая настройку для удобного использования в приложениях Dify.', + link: 'Узнайте, как разработать собственное API-расширение.', + linkUrl: 'https://docs.dify.ai/features/extension/api_based_extension', + add: 'Добавить API Extension', + selector: { + title: 'API Extension', + placeholder: 'Пожалуйста, выберите API-расширение', + manage: 'Управление API-расширением', + }, + modal: { + title: 'Добавить API-расширение', + editTitle: 'Редактировать API-расширение', + name: { + title: 'Имя', + placeholder: 'Пожалуйста, введите имя', + }, + apiEndpoint: { + title: 'API Endpoint', + placeholder: 'Пожалуйста, введите конечную точку API', + }, + apiKey: { + title: 'API-ключ', + placeholder: 'Пожалуйста, введите API-ключ', + lengthError: 'Длина API-ключа не может быть меньше 5 символов', + }, + }, + type: 'Тип', + }, + about: { + changeLog: 'Журнал изменений', + updateNow: 'Обновить сейчас', + nowAvailable: 'Dify {{version}} теперь доступен.', + latestAvailable: 'Dify {{version}} - последняя доступная версия.', + }, + appMenus: { + overview: 'Мониторинг', + promptEng: 'Оркестрация', + apiAccess: 'Доступ к API', + logAndAnn: 'Журналы и аннотации', + logs: 'Журналы', + }, + environment: { + testing: 'ТЕСТИРОВАНИЕ', + development: 'РАЗРАБОТКА', + }, + appModes: { + completionApp: 'Генератор текста', + chatApp: 'Чат-приложение', + }, + datasetMenus: { + documents: 'Документы', + hitTesting: 'Тестирование поиска', + settings: 'Настройки', + emptyTip: 'Знания не были связаны, пожалуйста, перейдите в приложение или плагин, чтобы завершить связывание.', + viewDoc: 'Просмотреть документацию', + relatedApp: 'связанные приложения', + }, + voiceInput: { + speaking: 'Говорите сейчас...', + converting: 'Преобразование в текст...', + notAllow: 'микрофон не авторизован', + }, + modelName: { + 'gpt-3.5-turbo': 'GPT-3.5-Turbo', + 'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K', + 'gpt-4': 'GPT-4', + 'gpt-4-32k': 'GPT-4-32K', + 'text-davinci-003': 'Text-Davinci-003', + 'text-embedding-ada-002': 'Text-Embedding-Ada-002', + 'whisper-1': 'Whisper-1', + 'claude-instant-1': 'Claude-Instant', + 'claude-2': 'Claude-2', + }, + chat: { + renameConversation: 'Переименовать разговор', + conversationName: 'Название разговора', + conversationNamePlaceholder: 'Пожалуйста, введите название разговора', + conversationNameCanNotEmpty: 'Название разговора обязательно', + citation: { + title: 'ЦИТАТЫ', + linkToDataset: 'Ссылка на знания', + characters: 'Символы:', + hitCount: 'Количество совпадений:', + vectorHash: 'Векторный хэш:', + hitScore: 'Оценка совпадения:', + }, + }, + promptEditor: { + placeholder: 'Напишите здесь свое ключевое слово подсказки, введите \'{\', чтобы вставить переменную, введите \'/\', чтобы вставить блок содержимого подсказки', + context: { + item: { + title: 'Контекст', + desc: 'Вставить шаблон контекста', + }, + modal: { + title: '{{num}} знаний в контексте', + add: 'Добавить контекст ', + footer: 'Вы можете управлять контекстами в разделе «Контекст» ниже.', + }, + }, + history: { + item: { + title: 'История разговоров', + desc: 'Вставить шаблон исторического сообщения', + }, + modal: { + title: 'ПРИМЕР', + user: 'Привет', + assistant: 'Привет! Как я могу вам помочь сегодня?', + edit: 'Редактировать имена ролей разговора', + }, + }, + variable: { + item: { + title: 'Переменные и внешние инструменты', + desc: 'Вставить переменные и внешние инструменты', + }, + outputToolDisabledItem: { + title: 'Переменные', + desc: 'Вставить переменные', + }, + modal: { + add: 'Новая переменная', + addTool: 'Новый инструмент', + }, + }, + query: { + item: { + title: 'Запрос', + desc: 'Вставить шаблон запроса пользователя', + }, + }, + existed: 'Уже существует в подсказке', + }, + imageUploader: { + uploadFromComputer: 'Загрузить с компьютера', + uploadFromComputerReadError: 'Ошибка чтения изображения, повторите попытку.', + uploadFromComputerUploadError: 'Ошибка загрузки изображения, загрузите еще раз.', + uploadFromComputerLimit: 'Загружаемые изображения не могут превышать {{size}} МБ', + pasteImageLink: 'Вставить ссылку на изображение', + pasteImageLinkInputPlaceholder: 'Вставьте ссылку на изображение здесь', + pasteImageLinkInvalid: 'Неверная ссылка на изображение', + imageUpload: 'Загрузка изображения', + }, + tag: { + placeholder: 'Все теги', + addNew: 'Добавить новый тег', + noTag: 'Нет тегов', + noTagYet: 'Еще нет тегов', + addTag: 'Добавить теги', + editTag: 'Редактировать теги', + manageTags: 'Управление тегами', + selectorPlaceholder: 'Введите для поиска или создания', + create: 'Создать', + delete: 'Удалить тег', + deleteTip: 'Тег используется, удалить его?', + created: 'Тег успешно создан', + failed: 'Ошибка создания тега', + }, +} + +export default translation diff --git a/web/i18n/ru-RU/custom.ts b/web/i18n/ru-RU/custom.ts new file mode 100644 index 00000000000000..8725c83577353e --- /dev/null +++ b/web/i18n/ru-RU/custom.ts @@ -0,0 +1,30 @@ +const translation = { + custom: 'Настройка', + upgradeTip: { + prefix: 'Обновите свой тарифный план, чтобы', + suffix: 'настроить свой бренд.', + }, + webapp: { + title: 'Настроить бренд веб-приложения', + removeBrand: 'Удалить Powered by Dify', + changeLogo: 'Изменить изображение бренда Powered by', + changeLogoTip: 'Формат SVG или PNG с минимальным размером 40x40px', + }, + app: { + title: 'Настроить бренд заголовка приложения', + changeLogoTip: 'Формат SVG или PNG с минимальным размером 80x80px', + }, + upload: 'Загрузить', + uploading: 'Загрузка', + uploadedFail: 'Ошибка загрузки изображения, пожалуйста изображение, загрузите еще раз.', + change: 'Изменить', + apply: 'Применить', + restore: 'Восстановить значения по умолчанию', + customize: { + contactUs: ' свяжитесь с нами ', + prefix: 'Чтобы настроить логотип бренда в приложении, пожалуйста,', + suffix: 'чтобы перейти на корпоративную версию.', + }, +} + +export default translation diff --git a/web/i18n/ru-RU/dataset-creation.ts b/web/i18n/ru-RU/dataset-creation.ts new file mode 100644 index 00000000000000..63c0d89cf90faa --- /dev/null +++ b/web/i18n/ru-RU/dataset-creation.ts @@ -0,0 +1,161 @@ +const translation = { + steps: { + header: { + creation: 'Создать базу знаний', + update: 'Добавить данные', + }, + one: 'Выберите источник данных', + two: 'Предварительная обработка и очистка текста', + three: 'Выполнить и завершить', + }, + error: { + unavailable: 'Эта база знаний недоступна', + }, + firecrawl: { + configFirecrawl: 'Настроить 🔥Firecrawl', + apiKeyPlaceholder: 'Ключ API с firecrawl.dev', + getApiKeyLinkText: 'Получите свой ключ API с firecrawl.dev', + }, + stepOne: { + filePreview: 'Предварительный просмотр файла', + pagePreview: 'Предварительный просмотр страницы', + dataSourceType: { + file: 'Импортировать из файла', + notion: 'Синхронизировать из Notion', + web: 'Синхронизировать с веб-сайта', + }, + uploader: { + title: 'Загрузить файл', + button: 'Перетащите файл или', + browse: 'Обзор', + tip: 'Поддерживаются {{supportTypes}}. Максимум {{size}} МБ каждый.', + validation: { + typeError: 'Тип файла не поддерживается', + size: 'Файл слишком большой. Максимум {{size}} МБ', + count: 'Несколько файлов не поддерживаются', + filesNumber: 'Вы достигли лимита пакетной загрузки {{filesNumber}} файлов.', + }, + cancel: 'Отмена', + change: 'Изменить', + failed: 'Ошибка загрузки', + }, + notionSyncTitle: 'Notion не подключен', + notionSyncTip: 'Чтобы синхронизировать данные из Notion, сначала необходимо установить соединение с Notion.', + connect: 'Перейти к подключению', + button: 'Далее', + emptyDatasetCreation: 'Я хочу создать пустую базу знаний', + modal: { + title: 'Создать пустую базу знаний', + tip: 'Пустая база знаний не будет содержать документов, и вы можете загружать документы в любое время.', + input: 'Название базы знаний', + placeholder: 'Пожалуйста, введите', + nameNotEmpty: 'Название не может быть пустым', + nameLengthInvaild: 'Название должно быть от 1 до 40 символов', + cancelButton: 'Отмена', + confirmButton: 'Создать', + failed: 'Ошибка создания', + }, + website: { + fireCrawlNotConfigured: 'Firecrawl не настроен', + fireCrawlNotConfiguredDescription: 'Настройте Firecrawl с API-ключом.', + configure: 'Настроить', + run: 'Запустить', + firecrawlTitle: 'Извлечь веб-контент с помощью 🔥Firecrawl', + firecrawlDoc: 'Документация Firecrawl', + firecrawlDocLink: 'https://docs.dify.ai/guides/knowledge-base/sync-from-website', + options: 'Опции', + crawlSubPage: 'Сканировать подстраницы', + limit: 'Лимит', + maxDepth: 'Максимальная глубина', + excludePaths: 'Исключить пути', + includeOnlyPaths: 'Включить только пути', + extractOnlyMainContent: 'Извлекать только основной контент (без заголовков, навигации, футеров и т. д.)', + exceptionErrorTitle: 'Произошло исключение при запуске задания Firecrawl:', + unknownError: 'Неизвестная ошибка', + totalPageScraped: 'Всего просканировано страниц:', + selectAll: 'Выбрать все', + resetAll: 'Сбросить все', + scrapTimeInfo: 'Всего просканировано {{total}} страниц за {{time}} секунд', + preview: 'Предварительный просмотр', + maxDepthTooltip: 'Максимальная глубина сканирования относительно введенного URL. Глубина 0 сканирует только страницу введенного URL, глубина 1 сканирует URL и все, что находится после введенного URL + один /, и так далее.', + }, + }, + stepTwo: { + segmentation: 'Настройки фрагментации', + auto: 'Автоматически', + autoDescription: 'Автоматически устанавливать правила фрагментации и предварительной обработки. Пользователям, не знакомым с системой, рекомендуется выбрать этот вариант.', + custom: 'Пользовательский', + customDescription: 'Настроить правила фрагментации, длину фрагментов, правила предварительной обработки и т. д.', + separator: 'Идентификатор сегмента', + separatorPlaceholder: 'Например, новая строка (\\\\n) или специальный разделитель (например, "***")', + maxLength: 'Максимальная длина фрагмента', + overlap: 'Перекрытие фрагментов', + overlapTip: 'Установка перекрытия фрагментов может сохранить семантическую связь между ними, улучшая эффект поиска. Рекомендуется установить 10%-25% от максимального размера фрагмента.', + overlapCheck: 'перекрытие фрагментов не должно превышать максимальную длину фрагмента', + rules: 'Правила предварительной обработки текста', + removeExtraSpaces: 'Заменить последовательные пробелы, новые строки и табуляции', + removeUrlEmails: 'Удалить все URL-адреса и адреса электронной почты', + removeStopwords: 'Удалить стоп-слова, такие как "a", "an", "the"', + preview: 'Подтвердить и просмотреть', + reset: 'Сбросить', + indexMode: 'Режим индексации', + qualified: 'Высокое качество', + recommend: 'Рекомендуется', + qualifiedTip: 'Вызов интерфейса встраивания системы по умолчанию для обработки, чтобы обеспечить более высокую точность при запросах пользователей.', + warning: 'Пожалуйста, сначала настройте ключ API поставщика модели.', + click: 'Перейти к настройкам', + economical: 'Экономичный', + economicalTip: 'Используйте автономные векторные движки, индексы ключевых слов и т. д., чтобы снизить точность, не тратя токены', + QATitle: 'Сегментация в формате вопрос-ответ', + QATip: 'Включение этой опции приведет к потреблению большего количества токенов', + QALanguage: 'Сегментировать с помощью', + emstimateCost: 'Оценка', + emstimateSegment: 'Оценочное количество фрагментов', + segmentCount: 'фрагментов', + calculating: 'Вычисление...', + fileSource: 'Предварительная обработка документов', + notionSource: 'Предварительная обработка страниц', + websiteSource: 'Предварительная обработка веб-сайта', + other: 'и другие ', + fileUnit: ' файлов', + notionUnit: ' страниц', + webpageUnit: ' страниц', + previousStep: 'Предыдущий шаг', + nextStep: 'Сохранить и обработать', + save: 'Сохранить и обработать', + cancel: 'Отмена', + sideTipTitle: 'Зачем нужна фрагментация и предварительная обработка?', + sideTipP1: 'При обработке текстовых данных фрагментация и очистка являются двумя важными этапами предварительной обработки.', + sideTipP2: 'Сегментация разбивает длинный текст на абзацы, чтобы модели могли лучше его понимать. Это улучшает качество и релевантность результатов модели.', + sideTipP3: 'Очистка удаляет ненужные символы и форматы, делая знания более чистыми и легкими для анализа.', + sideTipP4: 'Правильная фрагментация и очистка улучшают производительность модели, обеспечивая более точные и ценные результаты.', + previewTitle: 'Предварительный просмотр', + previewTitleButton: 'Предварительный просмотр', + previewButton: 'Переключение в формат вопрос-ответ', + previewSwitchTipStart: 'Текущий предварительный просмотр фрагмента находится в текстовом формате, переключение на предварительный просмотр в формате вопрос-ответ', + previewSwitchTipEnd: ' потребляет дополнительные токены', + characters: 'символов', + indexSettedTip: 'Чтобы изменить метод индексации, пожалуйста, перейдите в ', + retrivalSettedTip: 'Чтобы изменить метод индексации, пожалуйста, перейдите в ', + datasetSettingLink: 'настройки базы знаний.', + }, + stepThree: { + creationTitle: '🎉 База знаний создана', + creationContent: 'Мы автоматически назвали базу знаний, вы можете изменить ее в любое время', + label: 'Название базы знаний', + additionTitle: '🎉 Документ загружен', + additionP1: 'Документ был загружен в базу знаний', + additionP2: ', вы можете найти его в списке документов базы знаний.', + stop: 'Остановить обработку', + resume: 'Возобновить обработку', + navTo: 'Перейти к документу', + sideTipTitle: 'Что дальше', + sideTipContent: 'После завершения индексации документа база знаний может быть интегрирована в приложение в качестве контекста, вы можете найти настройку контекста на странице prompt orchestration. Вы также можете создать-workflow приложение как отдельный как независимый плагин.', + modelTitle: 'Вы уверены, что хотите остановить встраивание?', + modelContent: 'Если вам нужно будет возобновить обработку позже, вы продолжите с того места, где остановились.', + modelButtonConfirm: 'Подтвердить', + modelButtonCancel: 'Отмена', + }, +} + +export default translation diff --git a/web/i18n/ru-RU/dataset-documents.ts b/web/i18n/ru-RU/dataset-documents.ts new file mode 100644 index 00000000000000..b1870fb6808e27 --- /dev/null +++ b/web/i18n/ru-RU/dataset-documents.ts @@ -0,0 +1,352 @@ +const translation = { + list: { + title: 'Документы', + desc: 'Здесь отображаются все файлы базы знаний, и вся база знаний может быть связана с цитатами Dify или проиндексирована с помощью чата.', + addFile: 'Добавить файл', + addPages: 'Добавить страницы', + addUrl: 'Добавить URL', + table: { + header: { + fileName: 'НАЗВАНИЕ ФАЙЛА', + words: 'СЛОВА', + hitCount: 'КОЛИЧЕСТВО ОБРАЩЕНИЙ', + uploadTime: 'ВРЕМЯ ЗАГРУЗКИ', + status: 'СТАТУС', + action: 'ДЕЙСТВИЕ', + }, + rename: 'Переименовать', + name: 'Название', + }, + action: { + uploadFile: 'Загрузить новый файл', + settings: 'Настройки сегментации', + addButton: 'Добавить фрагмент', + add: 'Добавить фрагмент', + batchAdd: 'Пакетное добавление', + archive: 'Архивировать', + unarchive: 'Разархивировать', + delete: 'Удалить', + enableWarning: 'Архивный файл не может быть включен', + sync: 'Синхронизировать', + }, + index: { + enable: 'Включить', + disable: 'Отключить', + all: 'Все', + enableTip: 'Файл может быть проиндексирован', + disableTip: 'Файл не может быть проиндексирован', + }, + status: { + queuing: 'В очереди', + indexing: 'Индексация', + paused: 'Приостановлено', + error: 'Ошибка', + available: 'Доступно', + enabled: 'Включено', + disabled: 'Отключено', + archived: 'Архивировано', + }, + empty: { + title: 'Пока нет документов', + upload: { + tip: 'Вы можете загружать файлы, синхронизировать с веб-сайта или из веб-приложений, таких как Notion, GitHub и т. д.', + }, + sync: { + tip: 'Dify будет периодически загружать файлы из вашего Notion и завершать обработку.', + }, + }, + delete: { + title: 'Вы уверены, что хотите удалить?', + content: 'Если вам нужно будет возобновить обработку позже, вы продолжите с того места, где остановились', + }, + batchModal: { + title: 'Пакетное добавление фрагментов', + csvUploadTitle: 'Перетащите сюда свой CSV-файл или ', + browse: 'обзор', + tip: 'CSV-файл должен соответствовать следующей структуре:', + question: 'вопрос', + answer: 'ответ', + contentTitle: 'содержимое фрагмента', + content: 'содержимое', + template: 'Скачать шаблон здесь', + cancel: 'Отмена', + run: 'Запустить пакет', + runError: 'Ошибка запуска пакета', + processing: 'В процессе пакетной обработки', + completed: 'Импорт завершен', + error: 'Ошибка импорта', + ok: 'ОК', + }, + }, + metadata: { + title: 'Метаданные', + desc: 'Маркировка метаданных для документов позволяет ИИ своевременно получать к ним доступ и раскрывать источник ссылок для пользователей.', + dateTimeFormat: 'D MMMM YYYY, HH:mm', + docTypeSelectTitle: 'Пожалуйста, выберите тип документа', + docTypeChangeTitle: 'Изменить тип документа', + docTypeSelectWarning: + 'Если тип документа будет изменен, заполненные сейчас метаданные больше не будут сохранены', + firstMetaAction: 'Поехали', + placeholder: { + add: 'Добавить ', + select: 'Выбрать ', + }, + source: { + upload_file: 'Загрузить файл', + notion: 'Синхронизировать из Notion', + github: 'Синхронизировать из Github', + }, + type: { + book: 'Книга', + webPage: 'Веб-страница', + paper: 'Статья', + socialMediaPost: 'Пост в социальных сетях', + personalDocument: 'Личный документ', + businessDocument: 'Деловой документ', + IMChat: 'Чат в мессенджере', + wikipediaEntry: 'Статья в Википедии', + notion: 'Синхронизировать из Notion', + github: 'Синхронизировать из Github', + technicalParameters: 'Технические параметры', + }, + field: { + processRule: { + processDoc: 'Обработка документа', + segmentRule: 'Правило фрагментации', + segmentLength: 'Длина фрагментов', + processClean: 'Очистка текста', + }, + book: { + title: 'Название', + language: 'Язык', + author: 'Автор', + publisher: 'Издатель', + publicationDate: 'Дата публикации', + ISBN: 'ISBN', + category: 'Категория', + }, + webPage: { + title: 'Название', + url: 'URL', + language: 'Язык', + authorPublisher: 'Автор/Издатель', + publishDate: 'Дата публикации', + topicsKeywords: 'Темы/Ключевые слова', + description: 'Описание', + }, + paper: { + title: 'Название', + language: 'Язык', + author: 'Автор', + publishDate: 'Дата публикации', + journalConferenceName: 'Название журнала/конференции', + volumeIssuePage: 'Том/Выпуск/Страница', + DOI: 'DOI', + topicsKeywords: 'Темы/Ключевые слова', + abstract: 'Аннотация', + }, + socialMediaPost: { + platform: 'Платформа', + authorUsername: 'Автор/Имя пользователя', + publishDate: 'Дата публикации', + postURL: 'URL поста', + topicsTags: 'Темы/Теги', + }, + personalDocument: { + title: 'Название', + author: 'Автор', + creationDate: 'Дата создания', + lastModifiedDate: 'Дата последнего изменения', + documentType: 'Тип документа', + tagsCategory: 'Теги/Категория', + }, + businessDocument: { + title: 'Название', + author: 'Автор', + creationDate: 'Дата создания', + lastModifiedDate: 'Дата последнего изменения', + documentType: 'Тип документа', + departmentTeam: 'Отдел/Команда', + }, + IMChat: { + chatPlatform: 'Платформа чата', + chatPartiesGroupName: 'Участники чата/Название группы', + participants: 'Участники', + startDate: 'Дата начала', + endDate: 'Дата окончания', + topicsKeywords: 'Темы/Ключевые слова', + fileType: 'Тип файла', + }, + wikipediaEntry: { + title: 'Название', + language: 'Язык', + webpageURL: 'URL веб-страницы', + editorContributor: 'Редактор/Автор', + lastEditDate: 'Дата последнего редактирования', + summaryIntroduction: 'Краткое содержание/Введение', + }, + notion: { + title: 'Название', + language: 'Язык', + author: 'Автор', + createdTime: 'Время создания', + lastModifiedTime: 'Время последнего изменения', + url: 'URL', + tag: 'Тег', + description: 'Описание', + }, + github: { + repoName: 'Название репозитория', + repoDesc: 'Описание репозитория', + repoOwner: 'Владелец репозитория', + fileName: 'Название файла', + filePath: 'Путь к файлу', + programmingLang: 'Язык программирования', + url: 'URL', + license: 'Лицензия', + lastCommitTime: 'Время последнего коммита', + lastCommitAuthor: 'Автор последнего коммита', + }, + originInfo: { + originalFilename: 'Исходное имя файла', + originalFileSize: 'Исходный размер файла', + uploadDate: 'Дата загрузки', + lastUpdateDate: 'Дата последнего обновления', + source: 'Источник', + }, + technicalParameters: { + segmentSpecification: 'Спецификация фрагментов', + segmentLength: 'Длина фрагментов', + avgParagraphLength: 'Средняя длина абзаца', + paragraphs: 'Абзацы', + hitCount: 'Количество обращений', + embeddingTime: 'Время встраивания', + embeddedSpend: 'Потрачено на встраивание', + }, + }, + languageMap: { + zh: 'Китайский', + en: 'Английский', + es: 'Испанский', + fr: 'Французский', + de: 'Немецкий', + ja: 'Японский', + ko: 'Корейский', + ru: 'Русский', + ar: 'Арабский', + pt: 'Португальский', + it: 'Итальянский', + nl: 'Голландский', + pl: 'Польский', + sv: 'Шведский', + tr: 'Турецкий', + he: 'Иврит', + hi: 'Хинди', + da: 'Датский', + fi: 'Финский', + no: 'Норвежский', + hu: 'Венгерский', + el: 'Греческий', + cs: 'Чешский', + th: 'Тайский', + id: 'Индонезийский', + }, + categoryMap: { + book: { + fiction: 'Художественная литература', + biography: 'Биография', + history: 'История', + science: 'Наука', + technology: 'Технологии', + education: 'Образование', + philosophy: 'Философия', + religion: 'Религия', + socialSciences: 'Социальные науки', + art: 'Искусство', + travel: 'Путешествия', + health: 'Здоровье', + selfHelp: 'Самопомощь', + businessEconomics: 'Бизнес/Экономика', + cooking: 'Кулинария', + childrenYoungAdults: 'Детская/Подростковая литература', + comicsGraphicNovels: 'Комиксы/Графические романы', + poetry: 'Поэзия', + drama: 'Драматургия', + other: 'Другое', + }, + personalDoc: { + notes: 'Заметки', + blogDraft: 'Черновик блога', + diary: 'Дневник', + researchReport: 'Научный отчет', + bookExcerpt: 'Отрывок из книги', + schedule: 'Расписание', + list: 'Список', + projectOverview: 'Обзор проекта', + photoCollection: 'Коллекция фотографий', + creativeWriting: 'Творческое письмо', + codeSnippet: 'Фрагмент кода', + designDraft: 'Черновик дизайна', + personalResume: 'Личное резюме', + other: 'Другое', + }, + businessDoc: { + meetingMinutes: 'Протокол собрания', + researchReport: 'Научный отчет', + proposal: 'Предложение', + employeeHandbook: 'Справочник сотрудника', + trainingMaterials: 'Учебные материалы', + requirementsDocument: 'Документ с требованиями', + designDocument: 'Проектный документ', + productSpecification: 'Спецификация продукта', + financialReport: 'Финансовый отчет', + marketAnalysis: 'Анализ рынка', + projectPlan: 'План проекта', + teamStructure: 'Структура команды', + policiesProcedures: 'Политики и процедуры', + contractsAgreements: 'Договоры и соглашения', + emailCorrespondence: 'Переписка по электронной почте', + other: 'Другое', + }, + }, + }, + embedding: { + processing: 'Расчет эмбеддингов...', + paused: 'Расчет эмбеддингов приостановлен', + completed: 'Встраивание завершено', + error: 'Ошибка расчета эмбеддингов', + docName: 'Предварительная обработка документа', + mode: 'Правило сегментации', + segmentLength: 'Длина фрагментов', + textCleaning: 'Предварительная очистка текста', + segments: 'Абзацы', + highQuality: 'Режим высокого качества', + economy: 'Экономичный режим', + estimate: 'Оценочное потребление', + stop: 'Остановить обработку', + resume: 'Возобновить обработку', + automatic: 'Автоматически', + custom: 'Пользовательский', + previewTip: 'Предварительный просмотр абзацев будет доступен после завершения расчета эмбеддингов', + }, + segment: { + paragraphs: 'Абзацы', + keywords: 'Ключевые слова', + addKeyWord: 'Добавить ключевое слово', + keywordError: 'Максимальная длина ключевого слова - 20', + characters: 'символов', + hitCount: 'Количество обращений', + vectorHash: 'Векторный хэш: ', + questionPlaceholder: 'добавьте вопрос здесь', + questionEmpty: 'Вопрос не может быть пустым', + answerPlaceholder: 'добавьте ответ здесь', + answerEmpty: 'Ответ не может быть пустым', + contentPlaceholder: 'добавьте содержимое здесь', + contentEmpty: 'Содержимое не может быть пустым', + newTextSegment: 'Новый текстовый сегмент', + newQaSegment: 'Новый сегмент вопрос-ответ', + delete: 'Удалить этот фрагмент?', + }, +} + +export default translation diff --git a/web/i18n/ru-RU/dataset-hit-testing.ts b/web/i18n/ru-RU/dataset-hit-testing.ts new file mode 100644 index 00000000000000..0d3a14a676d071 --- /dev/null +++ b/web/i18n/ru-RU/dataset-hit-testing.ts @@ -0,0 +1,28 @@ +const translation = { + title: 'Тестирование поиска', + desc: 'Проверьте эффективность поиска в базе знаний на основе заданного текста запроса.', + dateTimeFormat: 'DD.MM.YYYY HH:mm', + recents: 'Недавние', + table: { + header: { + source: 'Источник', + text: 'Текст', + time: 'Время', + }, + }, + input: { + title: 'Исходный текст', + placeholder: 'Пожалуйста, введите текст, рекомендуется использовать короткое повествовательное предложение.', + countWarning: 'До 200 символов.', + indexWarning: 'Только база знаний высокого качества.', + testing: 'Тестирование', + }, + hit: { + title: 'НАЙДЕННЫЕ АБЗАЦЫ', + emptyTip: 'Результаты тестирования поиска будут отображаться здесь', + }, + noRecentTip: 'Здесь нет результатов недавних запросов', + viewChart: 'Посмотреть ВЕКТОРНУЮ ДИАГРАММУ', +} + +export default translation diff --git a/web/i18n/ru-RU/dataset-settings.ts b/web/i18n/ru-RU/dataset-settings.ts new file mode 100644 index 00000000000000..f732562d237529 --- /dev/null +++ b/web/i18n/ru-RU/dataset-settings.ts @@ -0,0 +1,35 @@ +const translation = { + title: 'Настройки базы знаний', + desc: 'Здесь вы можете изменить свойства и методы работы базы знаний.', + form: { + name: 'Название базы знаний', + namePlaceholder: 'Пожалуйста, введите название базы знаний', + nameError: 'Название не может быть пустым', + desc: 'Описание базы знаний', + descInfo: 'Пожалуйста, напишите четкое текстовое описание, чтобы обрисовать содержание базы знаний. Это описание будет использоваться в качестве основы для сопоставления при выборе из нескольких баз знаний для вывода.', + descPlaceholder: 'Опишите, что находится в этой базе знаний. Подробное описание позволяет ИИ своевременно получать доступ к содержимому базы знаний. Если оставить пустым, Dify будет использовать стратегию поиска по умолчанию.', + descWrite: 'Узнайте, как написать хорошее описание базы знаний.', + permissions: 'Разрешения', + permissionsOnlyMe: 'Только я', + permissionsAllMember: 'Все участники команды', + permissionsInvitedMembers: 'Отдельные участники команды', + me: '(Вы)', + indexMethod: 'Метод индексации', + indexMethodHighQuality: 'Высокое качество', + indexMethodHighQualityTip: 'Вызов модели встраивания для обработки, чтобы обеспечить более высокую точность при запросах пользователей.', + indexMethodEconomy: 'Экономичный', + indexMethodEconomyTip: 'Используйте автономные векторные движки, индексы ключевых слов и т. д., чтобы снизить точность, не тратя токены', + embeddingModel: 'Модель встраивания', + embeddingModelTip: 'Изменить встроенную модель, пожалуйста, перейдите в ', + embeddingModelTipLink: 'Настройки', + retrievalSetting: { + title: 'Настройки поиска', + learnMore: 'Узнать больше', + description: ' о методе поиска.', + longDescription: ' о методе поиска, вы можете изменить это в любое время в настройках базы знаний.', + }, + save: 'Сохранить', + }, +} + +export default translation diff --git a/web/i18n/ru-RU/dataset.ts b/web/i18n/ru-RU/dataset.ts new file mode 100644 index 00000000000000..4e395b5487ee91 --- /dev/null +++ b/web/i18n/ru-RU/dataset.ts @@ -0,0 +1,76 @@ +const translation = { + knowledge: 'База знаний', + documentCount: ' документов', + wordCount: ' тыс. слов', + appCount: ' связанных приложений', + createDataset: 'Создать базу знаний', + createDatasetIntro: 'Импортируйте свои собственные текстовые данные или записывайте данные в режиме реального времени через Webhook для улучшения контекста LLM.', + deleteDatasetConfirmTitle: 'Удалить эту базу знаний?', + deleteDatasetConfirmContent: + 'Удаление базы знаний необратимо. Пользователи больше не смогут получить доступ к вашей базе знаний, и все настройки подсказок и журналы будут безвозвратно удалены.', + datasetUsedByApp: 'База знаний используется некоторыми приложениями. Приложения больше не смогут использовать эту базу знаний, и все настройки подсказок и журналы будут безвозвратно удалены.', + datasetDeleted: 'База знаний удалена', + datasetDeleteFailed: 'Не удалось удалить базу знаний', + didYouKnow: 'Знаете ли вы?', + intro1: 'Базу знаний можно интегрировать в приложение Dify ', + intro2: 'в качестве контекста', + intro3: ',', + intro4: 'или ее ', + intro5: 'можно создать', + intro6: ' как отдельный плагин индекса ChatGPT для публикации', + unavailable: 'Недоступно', + unavailableTip: 'Модель встраивания недоступна, необходимо настроить модель встраивания по умолчанию', + datasets: 'БАЗЫ ЗНАНИЙ', + datasetsApi: 'ДОСТУП К API', + retrieval: { + semantic_search: { + title: 'Векторный поиск', + description: 'Создайте встраивания запросов и найдите фрагмент текста, наиболее похожий на его векторное представление.', + }, + full_text_search: { + title: 'Полнотекстовый поиск', + description: 'Индексируйте все термины в документе, позволяя пользователям искать любой термин и извлекать соответствующий фрагмент текста, содержащий эти термины.', + }, + hybrid_search: { + title: 'Гибридный поиск', + description: 'Выполняйте полнотекстовый поиск и векторный поиск одновременно, переранжируйте, чтобы выбрать наилучшее соответствие запросу пользователя. Пользователи могут выбрать установку весов или настройку модели переранжирования.', + recommend: 'Рекомендуется', + }, + invertedIndex: { + title: 'Инвертированный индекс', + description: 'Инвертированный индекс - это структура, используемая для эффективного поиска. Организованный по терминам, каждый термин указывает на документы или веб-страницы, содержащие его.', + }, + change: 'Изменить', + changeRetrievalMethod: 'Изменить метод поиска', + }, + docsFailedNotice: 'документов не удалось проиндексировать', + retry: 'Повторить попытку', + indexingTechnique: { + high_quality: 'HQ', + economy: 'ECO', + }, + indexingMethod: { + semantic_search: 'ВЕКТОР', + full_text_search: 'ПОЛНЫЙ ТЕКСТ', + hybrid_search: 'ГИБРИД', + invertedIndex: 'ИНВЕРТИРОВАННЫЙ', + }, + mixtureHighQualityAndEconomicTip: 'Для смешивания высококачественных и экономичных баз знаний требуется модель переранжирования.', + inconsistentEmbeddingModelTip: 'Модель переранжирования требуется, если модели встраивания выбранных баз знаний несовместимы.', + retrievalSettings: 'Настройки поиска', + rerankSettings: 'Настройки переранжирования', + weightedScore: { + title: 'Взвешенная оценка', + description: 'Регулируя назначенные веса, эта стратегия переранжирования определяет, следует ли отдавать приоритет семантическому или ключевому соответствию.', + semanticFirst: 'Семантика в первую очередь', + keywordFirst: 'Ключевые слова в первую очередь', + customized: 'Настраиваемый', + semantic: 'Семантика', + keyword: 'Ключевые слова', + }, + nTo1RetrievalLegacy: 'Поиск N-к-1 будет официально прекращен с сентября. Рекомендуется использовать новейший многопутный поиск для получения лучших результатов.', + nTo1RetrievalLegacyLink: 'Узнать больше', + nTo1RetrievalLegacyLinkText: ' Поиск N-к-1 будет официально прекращен в сентябре.', +} + +export default translation diff --git a/web/i18n/ru-RU/explore.ts b/web/i18n/ru-RU/explore.ts new file mode 100644 index 00000000000000..6c0b41f7d4cfb1 --- /dev/null +++ b/web/i18n/ru-RU/explore.ts @@ -0,0 +1,41 @@ +const translation = { + title: 'Обзор', + sidebar: { + discovery: 'Открытия', + chat: 'Чат', + workspace: 'Рабочее пространство', + action: { + pin: 'Закрепить', + unpin: 'Открепить', + rename: 'Переименовать', + delete: 'Удалить', + }, + delete: { + title: 'Удалить приложение', + content: 'Вы уверены, что хотите удалить это приложение?', + }, + }, + apps: { + title: 'Обзор приложений от Dify', + description: 'Используйте эти шаблонные приложения мгновенно или настройте свои собственные приложения на основе шаблонов.', + allCategories: 'Рекомендуемые', + }, + appCard: { + addToWorkspace: 'Добавить в рабочее пространство', + customize: 'Настроить', + }, + appCustomize: { + title: 'Создать приложение из {{name}}', + subTitle: 'Значок и название приложения', + nameRequired: 'Название приложения обязательно', + }, + category: { + Assistant: 'Ассистент', + Writing: 'Написание', + Translate: 'Перевод', + Programming: 'Программирование', + HR: 'HR', + }, +} + +export default translation diff --git a/web/i18n/ru-RU/layout.ts b/web/i18n/ru-RU/layout.ts new file mode 100644 index 00000000000000..928649474b4dcd --- /dev/null +++ b/web/i18n/ru-RU/layout.ts @@ -0,0 +1,4 @@ +const translation = { +} + +export default translation diff --git a/web/i18n/ru-RU/login.ts b/web/i18n/ru-RU/login.ts new file mode 100644 index 00000000000000..3d8e3f320e21c2 --- /dev/null +++ b/web/i18n/ru-RU/login.ts @@ -0,0 +1,75 @@ +const translation = { + pageTitle: 'Привет, давайте начнем!👋', + welcome: 'Добро пожаловать в Dify, пожалуйста, войдите, чтобы продолжить.', + email: 'Адрес электронной почты', + emailPlaceholder: 'Ваш адрес электронной почты', + password: 'Пароль', + passwordPlaceholder: 'Ваш пароль', + name: 'Имя пользователя', + namePlaceholder: 'Ваше имя пользователя', + forget: 'Забыли пароль?', + signBtn: 'Войти', + sso: 'Продолжить с SSO', + installBtn: 'Настроить', + setAdminAccount: 'Настройка учетной записи администратора', + setAdminAccountDesc: 'Максимальные привилегии для учетной записи администратора, которые можно использовать для создания приложений, управления поставщиками LLM и т. д.', + createAndSignIn: 'Создать и войти', + oneMoreStep: 'Еще один шаг', + createSample: 'На основе этой информации мы создадим для вас пример приложения', + invitationCode: 'Пригласительный код', + invitationCodePlaceholder: 'Ваш пригласительный код', + interfaceLanguage: 'Язык интерфейса', + timezone: 'Часовой пояс', + go: 'Перейти к Dify', + sendUsMail: 'Отправьте нам по электронной почте свое представление, и мы обработаем запрос на приглашение.', + acceptPP: 'Я прочитал и принимаю политику конфиденциальности', + reset: 'Пожалуйста, выполните следующую команду, чтобы сбросить пароль', + withGitHub: 'Продолжить с GitHub', + withGoogle: 'Продолжить с Google', + rightTitle: 'Раскройте весь потенциал LLM', + rightDesc: 'Без труда создавайте визуально привлекательные, работоспособные и улучшаемые приложения ИИ.', + tos: 'Условия обслуживания', + pp: 'Политика конфиденциальности', + tosDesc: 'Регистрируясь, вы соглашаетесь с нашими', + goToInit: 'Если вы не инициализировали учетную запись, перейдите на страницу инициализации', + donthave: 'Нет?', + invalidInvitationCode: 'Неверный пригласительный код', + accountAlreadyInited: 'Учетная запись уже инициализирована', + forgotPassword: 'Забыли пароль?', + resetLinkSent: 'Ссылка для сброса отправлена', + sendResetLink: 'Отправить ссылку для сброса', + backToSignIn: 'Вернуться к входу', + forgotPasswordDesc: 'Пожалуйста, введите свой адрес электронной почты, чтобы сбросить пароль. Мы отправим вам электронное письмо с инструкциями о том, как сбросить пароль.', + checkEmailForResetLink: 'Пожалуйста, проверьте свою электронную почту на наличие ссылки для сброса пароля. Если она не появится в течение нескольких минут, обязательно проверьте папку со спамом.', + passwordChanged: 'Войдите сейчас', + changePassword: 'Изменить пароль', + changePasswordTip: 'Пожалуйста, введите новый пароль для своей учетной записи', + invalidToken: 'Неверный или просроченный токен', + confirmPassword: 'Подтвердите пароль', + confirmPasswordPlaceholder: 'Подтвердите свой новый пароль', + passwordChangedTip: 'Ваш пароль был успешно изменен', + error: { + emailEmpty: 'Адрес электронной почты обязателен', + emailInValid: 'Пожалуйста, введите действительный адрес электронной почты', + nameEmpty: 'Имя обязательно', + passwordEmpty: 'Пароль обязателен', + passwordLengthInValid: 'Пароль должен содержать не менее 8 символов', + passwordInvalid: 'Пароль должен содержать буквы и цифры, а длина должна быть больше 8', + }, + license: { + tip: 'Перед запуском Dify Community Edition ознакомьтесь с лицензией GitHub', + link: 'Лицензия с открытым исходным кодом', + }, + join: 'Присоединиться', + joinTipStart: 'Приглашаем вас присоединиться к', + joinTipEnd: 'команде на Dify', + invalid: 'Ссылка истекла', + explore: 'Изучить Dify', + activatedTipStart: 'Вы присоединились к команде', + activatedTipEnd: '', + activated: 'Войдите сейчас', + adminInitPassword: 'Пароль инициализации администратора', + validate: 'Проверить', +} + +export default translation diff --git a/web/i18n/ru-RU/register.ts b/web/i18n/ru-RU/register.ts new file mode 100644 index 00000000000000..928649474b4dcd --- /dev/null +++ b/web/i18n/ru-RU/register.ts @@ -0,0 +1,4 @@ +const translation = { +} + +export default translation diff --git a/web/i18n/ru-RU/run-log.ts b/web/i18n/ru-RU/run-log.ts new file mode 100644 index 00000000000000..2099d6794f7baf --- /dev/null +++ b/web/i18n/ru-RU/run-log.ts @@ -0,0 +1,29 @@ +const translation = { + input: 'ВВОД', + result: 'РЕЗУЛЬТАТ', + detail: 'ДЕТАЛИ', + tracing: 'ТРАССИРОВКА', + resultPanel: { + status: 'СТАТУС', + time: 'ПРОШЕДШЕЕ ВРЕМЯ', + tokens: 'ВСЕГО ТОКЕНОВ', + }, + meta: { + title: 'МЕТАДАННЫЕ', + status: 'Статус', + version: 'Версия', + executor: 'Исполнитель', + startTime: 'Время начала', + time: 'Прошедшее время', + tokens: 'Всего токенов', + steps: 'Шаги выполнения', + }, + resultEmpty: { + title: 'Этот запуск выводит только формат JSON,', + tipLeft: 'пожалуйста, перейдите на ', + link: 'панель деталей', + tipRight: ' чтобы просмотреть его.', + }, +} + +export default translation diff --git a/web/i18n/ru-RU/share-app.ts b/web/i18n/ru-RU/share-app.ts new file mode 100644 index 00000000000000..6c06a49ceff10a --- /dev/null +++ b/web/i18n/ru-RU/share-app.ts @@ -0,0 +1,74 @@ +const translation = { + common: { + welcome: '', + appUnavailable: 'Приложение недоступно', + appUnkonwError: 'Приложение недоступно', + }, + chat: { + newChat: 'Новый чат', + pinnedTitle: 'Закрепленные', + unpinnedTitle: 'Чаты', + newChatDefaultName: 'Новый разговор', + resetChat: 'Сбросить разговор', + powerBy: 'Работает на', + prompt: 'Подсказка', + privatePromptConfigTitle: 'Настройки разговора', + publicPromptConfigTitle: 'Начальная подсказка', + configStatusDes: 'Перед началом вы можете изменить настройки разговора', + configDisabled: + 'Для этого сеанса использовались настройки предыдущего сеанса.', + startChat: 'Начать чат', + privacyPolicyLeft: + 'Пожалуйста, ознакомьтесь с ', + privacyPolicyMiddle: + 'политикой конфиденциальности', + privacyPolicyRight: + ', предоставленной разработчиком приложения.', + deleteConversation: { + title: 'Удалить разговор', + content: 'Вы уверены, что хотите удалить этот разговор?', + }, + tryToSolve: 'Попробуйте решить', + temporarySystemIssue: 'Извините, временная проблема с системой.', + }, + generation: { + tabs: { + create: 'Запустить один раз', + batch: 'Запустить пакетно', + saved: 'Сохраненные', + }, + savedNoData: { + title: 'Вы еще не сохранили ни одного результата!', + description: 'Начните генерировать контент, и вы найдете свои сохраненные результаты здесь.', + startCreateContent: 'Начать создавать контент', + }, + title: 'Завершение ИИ', + queryTitle: 'Содержимое запроса', + completionResult: 'Результат завершения', + queryPlaceholder: 'Напишите содержимое вашего запроса...', + run: 'Выполнить', + copy: 'Копировать', + resultTitle: 'Завершение ИИ', + noData: 'ИИ даст вам то, что вы хотите, здесь.', + csvUploadTitle: 'Перетащите сюда свой CSV-файл или ', + browse: 'обзор', + csvStructureTitle: 'CSV-файл должен соответствовать следующей структуре:', + downloadTemplate: 'Скачать шаблон здесь', + field: 'Поле', + batchFailed: { + info: '{{num}} неудачных выполнений', + retry: 'Повторить попытку', + outputPlaceholder: 'Нет выходного содержимого', + }, + errorMsg: { + empty: 'Пожалуйста, введите содержимое в загруженный файл.', + fileStructNotMatch: 'Загруженный CSV-файл не соответствует структуре.', + emptyLine: 'Строка {{rowIndex}} пуста', + invalidLine: 'Строка {{rowIndex}}: значение {{varName}} не может быть пустым', + moreThanMaxLengthLine: 'Строка {{rowIndex}}: значение {{varName}} не может превышать {{maxLength}} символов', + atLeastOne: 'Пожалуйста, введите хотя бы одну строку в загруженный файл.', + }, + }, +} + +export default translation diff --git a/web/i18n/ru-RU/tools.ts b/web/i18n/ru-RU/tools.ts new file mode 100644 index 00000000000000..e0dfd571b26be3 --- /dev/null +++ b/web/i18n/ru-RU/tools.ts @@ -0,0 +1,153 @@ +const translation = { + title: 'Инструменты', + createCustomTool: 'Создать пользовательский инструмент', + customToolTip: 'Узнать больше о пользовательских инструментах Dify', + type: { + all: 'Все', + builtIn: 'Встроенные', + custom: 'Пользовательские', + workflow: 'Рабочий процесс', + }, + contribute: { + line1: 'Я заинтересован в', + line2: 'внесении инструментов в Dify.', + viewGuide: 'Посмотреть руководство', + }, + author: 'Автор', + auth: { + unauthorized: 'Авторизовать', + authorized: 'Авторизовано', + setup: 'Настроить авторизацию для использования', + setupModalTitle: 'Настроить авторизацию', + setupModalTitleDescription: 'После настройки учетных данных все участники рабочего пространства смогут использовать этот инструмент при оркестровке приложений.', + }, + includeToolNum: 'Включено {{num}} инструментов', + addTool: 'Добавить инструмент', + addToolModal: { + type: 'тип', + category: 'категория', + add: 'добавить', + added: 'добавлено', + manageInTools: 'Управлять в инструментах', + emptyTitle: 'Нет доступных инструментов рабочего процесса', + emptyTip: 'Перейдите в "Рабочий процесс -> Опубликовать как инструмент"', + }, + createTool: { + title: 'Создать пользовательский инструмент', + editAction: 'Настроить', + editTitle: 'Редактировать пользовательский инструмент', + name: 'Название', + toolNamePlaceHolder: 'Введите название инструмента', + nameForToolCall: 'Название вызова инструмента', + nameForToolCallPlaceHolder: 'Используется для машинного распознавания, например getCurrentWeather, list_pets', + nameForToolCallTip: 'Поддерживаются только цифры, буквы и подчеркивания.', + description: 'Описание', + descriptionPlaceholder: 'Краткое описание назначения инструмента, например, получить температуру для определенного местоположения.', + schema: 'Схема', + schemaPlaceHolder: 'Введите свою схему OpenAPI здесь', + viewSchemaSpec: 'Посмотреть спецификацию OpenAPI-Swagger', + importFromUrl: 'Импортировать из URL', + importFromUrlPlaceHolder: 'https://...', + urlError: 'Пожалуйста, введите действительный URL', + examples: 'Примеры', + exampleOptions: { + json: 'Погода (JSON)', + yaml: 'Зоомагазин (YAML)', + blankTemplate: 'Пустой шаблон', + }, + availableTools: { + title: 'Доступные инструменты', + name: 'Название', + description: 'Описание', + method: 'Метод', + path: 'Путь', + action: 'Действия', + test: 'Тест', + }, + authMethod: { + title: 'Метод авторизации', + type: 'Тип авторизации', + keyTooltip: 'Ключ заголовка HTTP, вы можете оставить его как "Authorization", если не знаете, что это такое, или установить его на пользовательское значение', + types: { + none: 'Нет', + api_key: 'Ключ API', + apiKeyPlaceholder: 'Название заголовка HTTP для ключа API', + apiValuePlaceholder: 'Введите ключ API', + }, + key: 'Ключ', + value: 'Значение', + }, + authHeaderPrefix: { + title: 'Тип авторизации', + types: { + basic: 'Базовый', + bearer: 'Bearer', + custom: 'Пользовательский', + }, + }, + privacyPolicy: 'Политика конфиденциальности', + privacyPolicyPlaceholder: 'Пожалуйста, введите политику конфиденциальности', + toolInput: { + title: 'Входные данные инструмента', + name: 'Название', + required: 'Обязательно', + method: 'Метод', + methodSetting: 'Настройка', + methodSettingTip: 'Пользователь заполняет конфигурацию инструмента', + methodParameter: 'Параметр', + methodParameterTip: 'LLM заполняет во время вывода', + label: 'Теги', + labelPlaceholder: 'Выберите теги (необязательно)', + description: 'Описание', + descriptionPlaceholder: 'Описание значения параметра', + }, + customDisclaimer: 'Пользовательский отказ от ответственности', + customDisclaimerPlaceholder: 'Пожалуйста, введите пользовательский отказ от ответственности', + confirmTitle: 'Подтвердить сохранение?', + confirmTip: 'Приложения, использующие этот инструмент, будут затронуты', + deleteToolConfirmTitle: 'Удалить этот инструмент?', + deleteToolConfirmContent: 'Удаление инструмента необратимо. Пользователи больше не смогут получить доступ к вашему инструменту.', + }, + test: { + title: 'Тест', + parametersValue: 'Параметры и значение', + parameters: 'Параметры', + value: 'Значение', + testResult: 'Результаты теста', + testResultPlaceholder: 'Результат теста будет отображаться здесь', + }, + thought: { + using: 'Использование', + used: 'Использовано', + requestTitle: 'Запрос к', + responseTitle: 'Ответ от', + }, + setBuiltInTools: { + info: 'Информация', + setting: 'Настройка', + toolDescription: 'Описание инструмента', + parameters: 'параметры', + string: 'строка', + number: 'число', + required: 'Обязательно', + infoAndSetting: 'Информация и настройки', + }, + noCustomTool: { + title: 'Нет пользовательских инструментов!', + content: 'Добавьте и управляйте своими пользовательскими инструментами здесь для создания приложений ИИ.', + createTool: 'Создать инструмент', + }, + noSearchRes: { + title: 'Извините, результаты не найдены!', + content: 'Мы не смогли найти никаких инструментов, соответствующих вашему поиску.', + reset: 'Сбросить поиск', + }, + builtInPromptTitle: 'Подсказка', + toolRemoved: 'Инструмент удален', + notAuthorized: 'Инструмент не авторизован', + howToGet: 'Как получить', + openInStudio: 'Открыть в Studio', + toolNameUsageTip: 'Название вызова инструмента для рассуждений агента и подсказок', +} + +export default translation diff --git a/web/i18n/ru-RU/workflow.ts b/web/i18n/ru-RU/workflow.ts new file mode 100644 index 00000000000000..54a88fd876bb71 --- /dev/null +++ b/web/i18n/ru-RU/workflow.ts @@ -0,0 +1,540 @@ +const translation = { + common: { + undo: 'Отменить', + redo: 'Повторить', + editing: 'Редактирование', + autoSaved: 'Автосохранено', + unpublished: 'Не опубликовано', + published: 'Опубликовано', + publish: 'Опубликовать', + update: 'Обновить', + run: 'Запустить', + running: 'Выполняется', + inRunMode: 'В режиме выполнения', + inPreview: 'В режиме предпросмотра', + inPreviewMode: 'В режиме предпросмотра', + preview: 'Предпросмотр', + viewRunHistory: 'Посмотреть историю запусков', + runHistory: 'История запусков', + goBackToEdit: 'Вернуться к редактору', + conversationLog: 'Журнал разговоров', + features: 'Функции', + debugAndPreview: 'Предпросмотр', + restart: 'Перезапустить', + currentDraft: 'Текущий черновик', + currentDraftUnpublished: 'Текущий черновик не опубликован', + latestPublished: 'Последняя опубликованная версия', + publishedAt: 'Опубликовано', + restore: 'Восстановить', + runApp: 'Запустить приложение', + batchRunApp: 'Пакетный запуск приложения', + accessAPIReference: 'Доступ к справочнику API', + embedIntoSite: 'Встроить на сайт', + addTitle: 'Добавить заголовок...', + addDescription: 'Добавить описание...', + noVar: 'Нет переменной', + searchVar: 'Поиск переменной', + variableNamePlaceholder: 'Имя переменной', + setVarValuePlaceholder: 'Установить значение переменной', + needConnecttip: 'Этот шаг ни к чему не подключен', + maxTreeDepth: 'Максимальный предел {{depth}} узлов на ветку', + needEndNode: 'Необходимо добавить блок "Конец"', + needAnswerNode: 'Необходимо добавить блок "Ответ"', + workflowProcess: 'Процесс рабочего процесса', + notRunning: 'Еще не запущено', + previewPlaceholder: 'Введите текст в поле ниже, чтобы начать отладку чат-бота', + effectVarConfirm: { + title: 'Удалить переменную', + content: 'Переменная используется в других узлах. Вы все еще хотите удалить ее?', + }, + insertVarTip: 'Нажмите клавишу "/" чтобы быстро вставить', + processData: 'Обработка данных', + input: 'Вход', + output: 'Выход', + jinjaEditorPlaceholder: 'Введите "/" или "{" для вставки переменной', + viewOnly: 'Только просмотр', + showRunHistory: 'Показать историю запусков', + enableJinja: 'Включить поддержку шаблонов Jinja', + learnMore: 'Узнать больше', + copy: 'Копировать', + duplicate: 'Дублировать', + addBlock: 'Добавить блок', + pasteHere: 'Вставить сюда', + pointerMode: 'Режим указателя', + handMode: 'Режим руки', + model: 'Модель', + workflowAsTool: 'Рабочий процесс как инструмент', + configureRequired: 'Требуется настройка', + configure: 'Настроить', + manageInTools: 'Управление в инструментах', + workflowAsToolTip: 'После обновления рабочего процесса требуется перенастройка инструмента.', + viewDetailInTracingPanel: 'Посмотреть подробности', + syncingData: 'Синхронизация данных, всего несколько секунд.', + importDSL: 'Импортировать DSL', + importDSLTip: 'Текущий черновик будет перезаписан. Экспортируйте рабочий процесс в качестве резервной копии перед импортом.', + backupCurrentDraft: 'Резервное копирование текущего черновика', + chooseDSL: 'Выберите файл DSL(yml)', + overwriteAndImport: 'Перезаписать и импортировать', + importFailure: 'Ошибка импорта', + importSuccess: 'Импорт успешно завершен', + }, + env: { + envPanelTitle: 'Переменные среды', + envDescription: 'Переменные среды могут использоваться для хранения конфиденциальной информации и учетных данных. Они доступны только для чтения и могут быть отделены от файла DSL во время экспорта.', + envPanelButton: 'Добавить переменную', + modal: { + title: 'Добавить переменную среды', + editTitle: 'Редактировать переменную среды', + type: 'Тип', + name: 'Имя', + namePlaceholder: 'Имя переменной среды', + value: 'Значение', + valuePlaceholder: 'Значение переменной среды', + secretTip: 'Используется для определения конфиденциальной информации или данных, с настройками DSL, настроенными для предотвращения утечки.', + }, + export: { + title: 'Экспортировать секретные переменные среды?', + checkbox: 'Экспортировать секретные значения', + ignore: 'Экспортировать DSL', + export: 'Экспортировать DSL с секретными значениями ', + }, + }, + chatVariable: { + panelTitle: 'Переменные разговора', + panelDescription: 'Переменные разговора используются для хранения интерактивной информации, которую LLM необходимо запомнить, включая историю разговоров, загруженные файлы, пользовательские настройки. Они доступны для чтения и записи. ', + docLink: 'Посетите нашу документацию, чтобы узнать больше.', + button: 'Добавить переменную', + modal: { + title: 'Добавить переменную разговора', + editTitle: 'Редактировать переменную разговора', + name: 'Имя', + namePlaceholder: 'Имя переменной', + type: 'Тип', + value: 'Значение по умолчанию', + valuePlaceholder: 'Значение по умолчанию, оставьте пустым, чтобы не устанавливать', + description: 'Описание', + descriptionPlaceholder: 'Опишите переменную', + editInJSON: 'Редактировать в JSON', + oneByOne: 'Добавлять по одному', + editInForm: 'Редактировать в форме', + arrayValue: 'Значение', + addArrayValue: 'Добавить значение', + objectKey: 'Ключ', + objectType: 'Тип', + objectValue: 'Значение по умолчанию', + }, + storedContent: 'Сохраненный контент', + updatedAt: 'Обновлено в ', + }, + changeHistory: { + title: 'История изменений', + placeholder: 'Вы еще ничего не изменили', + clearHistory: 'Очистить историю', + hint: 'Подсказка', + hintText: 'Ваши действия по редактированию отслеживаются в истории изменений, которая хранится на вашем устройстве в течение этого сеанса. Эта история будет очищена, когда вы покинете редактор.', + stepBackward_one: '{{count}} шаг назад', + stepBackward_other: '{{count}} шагов назад', + stepForward_one: '{{count}} шаг вперед', + stepForward_other: '{{count}} шагов вперед', + sessionStart: 'Начало сеанса', + currentState: 'Текущее состояние', + nodeTitleChange: 'Изменено название блока', + nodeDescriptionChange: 'Изменено описание блока', + nodeDragStop: 'Блок перемещен', + nodeChange: 'Блок изменен', + nodeConnect: 'Блок подключен', + nodePaste: 'Блок вставлен', + nodeDelete: 'Блок удален', + nodeAdd: 'Блок добавлен', + nodeResize: 'Размер блока изменен', + noteAdd: 'Заметка добавлена', + noteChange: 'Заметка изменена', + noteDelete: 'Заметка удалена', + edgeDelete: 'Блок отключен', + }, + errorMsg: { + fieldRequired: '{{field}} обязательно для заполнения', + authRequired: 'Требуется авторизация', + invalidJson: '{{field}} неверный JSON', + fields: { + variable: 'Имя переменной', + variableValue: 'Значение переменной', + code: 'Код', + model: 'Модель', + rerankModel: 'Модель переранжирования', + }, + invalidVariable: 'Неверная переменная', + }, + singleRun: { + testRun: 'Тестовый запуск ', + startRun: 'Начать запуск', + running: 'Выполняется', + testRunIteration: 'Итерация тестового запуска', + back: 'Назад', + iteration: 'Итерация', + }, + tabs: { + 'searchBlock': 'Поиск блока', + 'blocks': 'Блоки', + 'searchTool': 'Поиск инструмента', + 'tools': 'Инструменты', + 'allTool': 'Все', + 'builtInTool': 'Встроенные', + 'customTool': 'Пользовательские', + 'workflowTool': 'Рабочий процесс', + 'question-understand': 'Понимание вопроса', + 'logic': 'Логика', + 'transform': 'Преобразование', + 'utilities': 'Утилиты', + 'noResult': 'Ничего не найдено', + }, + blocks: { + 'start': 'Начало', + 'end': 'Конец', + 'answer': 'Ответ', + 'llm': 'LLM', + 'knowledge-retrieval': 'Поиск знаний', + 'question-classifier': 'Классификатор вопросов', + 'if-else': 'ЕСЛИ/ИНАЧЕ', + 'code': 'Код', + 'template-transform': 'Шаблон', + 'http-request': 'HTTP-запрос', + 'variable-assigner': 'Агрегатор переменных', + 'variable-aggregator': 'Агрегатор переменных', + 'assigner': 'Назначение переменной', + 'iteration-start': 'Начало итерации', + 'iteration': 'Итерация', + 'parameter-extractor': 'Извлечение параметров', + }, + blocksAbout: { + 'start': 'Определите начальные параметры для запуска рабочего процесса', + 'end': 'Определите конец и тип результата рабочего процесса', + 'answer': 'Определите содержимое ответа в чате', + 'llm': 'Вызов больших языковых моделей для ответа на вопросы или обработки естественного языка', + 'knowledge-retrieval': 'Позволяет запрашивать текстовый контент, связанный с вопросами пользователей, из базы знаний', + 'question-classifier': 'Определите условия классификации вопросов пользователей, LLM может определить, как будет развиваться разговор на основе описания классификации', + 'if-else': 'Позволяет разделить рабочий процесс на две ветки на основе условий if/else', + 'code': 'Выполните фрагмент кода Python или NodeJS для реализации пользовательской логики', + 'template-transform': 'Преобразование данных в строку с использованием синтаксиса шаблонов Jinja', + 'http-request': 'Разрешить отправку запросов на сервер по протоколу HTTP', + 'variable-assigner': 'Объединение переменных из нескольких ветвей в одну переменную для унифицированной настройки подчиненных узлов.', + 'assigner': 'Узел назначения переменной используется для назначения значений записываемым переменным (например, переменным разговора).', + 'variable-aggregator': 'Объединение переменных из нескольких ветвей в одну переменную для унифицированной настройки подчиненных узлов.', + 'iteration': 'Выполнение нескольких шагов над объектом списка до тех пор, пока не будут выведены все результаты.', + 'parameter-extractor': 'Используйте LLM для извлечения структурированных параметров из естественного языка для вызова инструментов или HTTP-запросов.', + }, + operator: { + zoomIn: 'Увеличить', + zoomOut: 'Уменьшить', + zoomTo50: 'Масштаб 50%', + zoomTo100: 'Масштаб 100%', + zoomToFit: 'По размеру', + }, + panel: { + userInputField: 'Поле ввода пользователя', + changeBlock: 'Изменить блок', + helpLink: 'Ссылка на справку', + about: 'О программе', + createdBy: 'Создано ', + nextStep: 'Следующий шаг', + addNextStep: 'Добавить следующий блок в этот рабочий процесс', + selectNextStep: 'Выбрать следующий блок', + runThisStep: 'Выполнить этот шаг', + checklist: 'Контрольный список', + checklistTip: 'Убедитесь, что все проблемы решены перед публикацией', + checklistResolved: 'Все проблемы решены', + organizeBlocks: 'Организовать блоки', + change: 'Изменить', + optional: '(необязательно)', + }, + nodes: { + common: { + outputVars: 'Выходные переменные', + insertVarTip: 'Вставить переменную', + memory: { + memory: 'Память', + memoryTip: 'Настройки памяти чата', + windowSize: 'Размер окна', + conversationRoleName: 'Имя роли разговора', + user: 'Префикс пользователя', + assistant: 'Префикс помощника', + }, + memories: { + title: 'Воспоминания', + tip: 'Память чата', + builtIn: 'Встроенные', + }, + }, + start: { + required: 'обязательно', + inputField: 'Поле ввода', + builtInVar: 'Встроенные переменные', + outputVars: { + query: 'Ввод пользователя', + memories: { + des: 'История разговоров', + type: 'тип сообщения', + content: 'содержимое сообщения', + }, + files: 'Список файлов', + }, + noVarTip: 'Установите входные данные, которые можно использовать в рабочем процессе', + }, + end: { + outputs: 'Выходы', + output: { + type: 'тип вывода', + variable: 'выходная переменная', + }, + type: { + 'none': 'Нет', + 'plain-text': 'Простой текст', + 'structured': 'Структурированный', + }, + }, + answer: { + answer: 'Ответ', + outputVars: 'Выходные переменные', + }, + llm: { + model: 'модель', + variables: 'переменные', + context: 'контекст', + contextTooltip: 'Вы можете импортировать знания как контекст', + notSetContextInPromptTip: 'Чтобы включить функцию контекста, пожалуйста, заполните переменную контекста в PROMPT.', + prompt: 'подсказка', + roleDescription: { + system: 'Дайте высокоуровневые инструкции для разговора', + user: 'Предоставьте инструкции, запросы или любой текстовый ввод для модели', + assistant: 'Ответы модели на основе сообщений пользователя', + }, + addMessage: 'Добавить сообщение', + vision: 'зрение', + files: 'Файлы', + resolution: { + name: 'Разрешение', + high: 'Высокое', + low: 'Низкое', + }, + outputVars: { + output: 'Создать контент', + usage: 'Информация об использовании модели', + }, + singleRun: { + variable: 'Переменная', + }, + sysQueryInUser: 'sys.query в сообщении пользователя обязателен', + }, + knowledgeRetrieval: { + queryVariable: 'Переменная запроса', + knowledge: 'Знания', + outputVars: { + output: 'Извлеченные сегментированные данные', + content: 'Сегментированный контент', + title: 'Сегментированный заголовок', + icon: 'Сегментированный значок', + url: 'Сегментированный URL', + metadata: 'Другие метаданные', + }, + }, + http: { + inputVars: 'Входные переменные', + api: 'API', + apiPlaceholder: 'Введите URL, введите "/" для вставки переменной', + notStartWithHttp: 'API должен начинаться с http:// или https://', + key: 'Ключ', + value: 'Значение', + bulkEdit: 'Массовое редактирование', + keyValueEdit: 'Редактирование ключа-значения', + headers: 'Заголовки', + params: 'Параметры', + body: 'Тело', + outputVars: { + body: 'Содержимое ответа', + statusCode: 'Код состояния ответа', + headers: 'Список заголовков ответа JSON', + files: 'Список файлов', + }, + authorization: { + 'authorization': 'Авторизация', + 'authorizationType': 'Тип авторизации', + 'no-auth': 'Нет', + 'api-key': 'API-ключ', + 'auth-type': 'Тип аутентификации', + 'basic': 'Базовая', + 'bearer': 'Bearer', + 'custom': 'Пользовательская', + 'api-key-title': 'API-ключ', + 'header': 'Заголовок', + }, + insertVarPlaceholder: 'введите "/" для вставки переменной', + timeout: { + title: 'Тайм-аут', + connectLabel: 'Тайм-аут подключения', + connectPlaceholder: 'Введите тайм-аут подключения в секундах', + readLabel: 'Тайм-аут чтения', + readPlaceholder: 'Введите тайм-аут чтения в секундах', + writeLabel: 'Тайм-аут записи', + writePlaceholder: 'Введите тайм-аут записи в секундах', + }, + }, + code: { + inputVars: 'Входные переменные', + outputVars: 'Выходные переменные', + advancedDependencies: 'Расширенные зависимости', + advancedDependenciesTip: 'Добавьте сюда некоторые предварительно загруженные зависимости, которые занимают больше времени для потребления или не являются встроенными по умолчанию', + searchDependencies: 'Поиск зависимостей', + }, + templateTransform: { + inputVars: 'Входные переменные', + code: 'Код', + codeSupportTip: 'Поддерживает только Jinja2', + outputVars: { + output: 'Преобразованный контент', + }, + }, + ifElse: { + if: 'Если', + else: 'Иначе', + elseDescription: 'Используется для определения логики, которая должна быть выполнена, когда условие if не выполняется.', + and: 'и', + or: 'или', + operator: 'Оператор', + notSetVariable: 'Пожалуйста, сначала установите переменную', + comparisonOperator: { + 'contains': 'содержит', + 'not contains': 'не содержит', + 'start with': 'начинается с', + 'end with': 'заканчивается на', + 'is': 'равно', + 'is not': 'не равно', + 'empty': 'пусто', + 'not empty': 'не пусто', + 'null': 'null', + 'not null': 'не null', + }, + enterValue: 'Введите значение', + addCondition: 'Добавить условие', + conditionNotSetup: 'Условие НЕ настроено', + selectVariable: 'Выберите переменную...', + }, + variableAssigner: { + title: 'Назначить переменные', + outputType: 'Тип вывода', + varNotSet: 'Переменная не установлена', + noVarTip: 'Добавьте переменные, которые нужно назначить', + type: { + string: 'Строка', + number: 'Число', + object: 'Объект', + array: 'Массив', + }, + aggregationGroup: 'Группа агрегации', + aggregationGroupTip: 'Включение этой функции позволяет агрегатору переменных агрегировать несколько наборов переменных.', + addGroup: 'Добавить группу', + outputVars: { + varDescribe: 'Вывод {{groupName}}', + }, + setAssignVariable: 'Установить переменную назначения', + }, + assigner: { + 'assignedVariable': 'Назначенная переменная', + 'writeMode': 'Режим записи', + 'writeModeTip': 'Режим добавления: доступен только для переменных массива.', + 'over-write': 'Перезаписать', + 'append': 'Добавить', + 'plus': 'Плюс', + 'clear': 'Очистить', + 'setVariable': 'Установить переменную', + 'variable': 'Переменная', + }, + tool: { + toAuthorize: 'Авторизовать', + inputVars: 'Входные переменные', + outputVars: { + text: 'контент, сгенерированный инструментом', + files: { + title: 'файлы, сгенерированные инструментом', + type: 'Поддерживаемый тип. Сейчас поддерживаются только изображения', + transfer_method: 'Метод передачи. Значение - remote_url или local_file', + url: 'URL изображения', + upload_file_id: 'Идентификатор загруженного файла', + }, + json: 'json, сгенерированный инструментом', + }, + }, + questionClassifiers: { + model: 'модель', + inputVars: 'Входные переменные', + outputVars: { + className: 'Имя класса', + }, + class: 'Класс', + classNamePlaceholder: 'Введите имя вашего класса', + advancedSetting: 'Расширенные настройки', + topicName: 'Название темы', + topicPlaceholder: 'Введите название вашей темы', + addClass: 'Добавить класс', + instruction: 'Инструкция', + instructionTip: 'Введите дополнительные инструкции, чтобы помочь классификатору вопросов лучше понять, как классифицировать вопросы.', + instructionPlaceholder: 'Введите вашу инструкцию', + }, + parameterExtractor: { + inputVar: 'Входная переменная', + extractParameters: 'Извлечь параметры', + importFromTool: 'Импортировать из инструментов', + addExtractParameter: 'Добавить параметр для извлечения', + addExtractParameterContent: { + name: 'Имя', + namePlaceholder: 'Имя извлекаемого параметра', + type: 'Тип', + typePlaceholder: 'Тип извлекаемого параметра', + description: 'Описание', + descriptionPlaceholder: 'Описание извлекаемого параметра', + required: 'Обязательный', + requiredContent: 'Обязательный используется только в качестве ссылки для вывода модели, а не для обязательной проверки вывода параметра.', + }, + extractParametersNotSet: 'Параметры для извлечения не настроены', + instruction: 'Инструкция', + instructionTip: 'Введите дополнительные инструкции, чтобы помочь извлекателю параметров понять, как извлекать параметры.', + advancedSetting: 'Расширенные настройки', + reasoningMode: 'Режим рассуждения', + reasoningModeTip: 'Вы можете выбрать соответствующий режим рассуждения, основываясь на способности модели реагировать на инструкции для вызова функций или подсказки.', + isSuccess: 'Успешно. В случае успеха значение равно 1, в случае сбоя - 0.', + errorReason: 'Причина ошибки', + }, + iteration: { + deleteTitle: 'Удалить узел итерации?', + deleteDesc: 'Удаление узла итерации приведет к удалению всех дочерних узлов', + input: 'Вход', + output: 'Выходные переменные', + iteration_one: '{{count}} Итерация', + iteration_other: '{{count}} Итераций', + currentIteration: 'Текущая итерация', + }, + note: { + addNote: 'Добавить заметку', + editor: { + placeholder: 'Напишите свою заметку...', + small: 'Маленький', + medium: 'Средний', + large: 'Большой', + bold: 'Жирный', + italic: 'Курсив', + strikethrough: 'Зачеркнутый', + link: 'Ссылка', + openLink: 'Открыть', + unlink: 'Удалить ссылку', + enterUrl: 'Введите URL...', + invalidUrl: 'Неверный URL', + bulletList: 'Маркированный список', + showAuthor: 'Показать автора', + }, + }, + }, + tracing: { + stopBy: 'Остановлено {{user}}', + }, +} + +export default translation