瀏覽代碼

Add Russian language (#7860)

Co-authored-by: d8rt8v <alex@ydertev.ru>
Co-authored-by: crazywoola <427733928@qq.com>
Alex 1 年之前
父節點
當前提交
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

File diff suppressed because it is too large
+ 83 - 0
web/i18n/ru-RU/app-api.ts


File diff suppressed because it is too large
+ 463 - 0
web/i18n/ru-RU/app-debug.ts


File diff suppressed because it is too large
+ 95 - 0
web/i18n/ru-RU/app-log.ts


+ 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

File diff suppressed because it is too large
+ 576 - 0
web/i18n/ru-RU/common.ts


+ 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