Browse Source

Add Russian language (#7860)

Co-authored-by: d8rt8v <alex@ydertev.ru>
Co-authored-by: crazywoola <427733928@qq.com>
Alex 7 months ago
parent
commit
35f13c7327

+ 3 - 0
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:

+ 1 - 1
web/i18n/languages.json

@@ -68,7 +68,7 @@
       "name": "Русский (Россия)",
       "prompt_name": "Russian",
       "example": " Привет, Dify!",
-      "supported": false
+      "supported": true
     },
     {
       "value": "it-IT",

+ 87 - 0
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

+ 83 - 0
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

+ 463 - 0
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: 'История разговоров не включена, пожалуйста, добавьте <histories> в промпт выше.',
+      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

+ 95 - 0
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: 'Наблюдайте и аннотируйте взаимодействия между конечными пользователями и приложениями ИИ здесь, чтобы постоянно повышать точность ИИ. Вы можете попробовать <shareLink>поделиться</shareLink> или <testLink>протестировать</testLink> веб-приложение самостоятельно, а затем вернуться на эту страницу.',
+      },
+    },
+  },
+  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

+ 168 - 0
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: 'Помогает посетителям понять, какие данные собирает приложение, см. <privacyPolicyLink>Политику конфиденциальности</privacyPolicyLink> 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

+ 133 - 0
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

+ 118 - 0
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

+ 576 - 0
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

+ 30 - 0
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

+ 161 - 0
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

+ 352 - 0
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

+ 28 - 0
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

+ 35 - 0
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

+ 76 - 0
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

+ 41 - 0
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

+ 4 - 0
web/i18n/ru-RU/layout.ts

@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation

+ 75 - 0
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

+ 4 - 0
web/i18n/ru-RU/register.ts

@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation

+ 29 - 0
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

+ 74 - 0
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

+ 153 - 0
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

+ 540 - 0
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