From 0b8ab4b54bb4ddaaeb684437f05f74c81bb6ab63 Mon Sep 17 00:00:00 2001 From: RockChinQ Date: Fri, 17 Apr 2026 20:00:50 +0800 Subject: [PATCH] feat(i18n): add Russian (ru-RU) language support --- web/src/app/infra/entities/common.ts | 1 + web/src/components/ui/language-selector.tsx | 9 + web/src/i18n/I18nProvider.tsx | 3 + web/src/i18n/index.ts | 26 + web/src/i18n/locales/ru-RU.ts | 1272 +++++++++++++++++++ 5 files changed, 1311 insertions(+) create mode 100644 web/src/i18n/locales/ru-RU.ts diff --git a/web/src/app/infra/entities/common.ts b/web/src/app/infra/entities/common.ts index da148f2a..4f04c2ef 100644 --- a/web/src/app/infra/entities/common.ts +++ b/web/src/app/infra/entities/common.ts @@ -6,6 +6,7 @@ export interface I18nObject { th_TH?: string; vi_VN?: string; es_ES?: string; + ru_RU?: string; } export interface ComponentManifest { diff --git a/web/src/components/ui/language-selector.tsx b/web/src/components/ui/language-selector.tsx index 45a8d4a1..59ed82bd 100644 --- a/web/src/components/ui/language-selector.tsx +++ b/web/src/components/ui/language-selector.tsx @@ -46,6 +46,9 @@ export function LanguageSelector({ } else if (i18n.language === 'es' || i18n.language === 'es-ES') { setCurrentLanguage('es-ES'); localStorage.setItem('langbot_language', 'es-ES'); + } else if (i18n.language === 'ru' || i18n.language === 'ru-RU') { + setCurrentLanguage('ru-RU'); + localStorage.setItem('langbot_language', 'ru-RU'); } else { setCurrentLanguage('en-US'); localStorage.setItem('langbot_language', 'en-US'); @@ -74,6 +77,11 @@ export function LanguageSelector({ browserLanguage.startsWith('es-') ) { detectedLanguage = 'es-ES'; + } else if ( + browserLanguage === 'ru' || + browserLanguage.startsWith('ru-') + ) { + detectedLanguage = 'ru-RU'; } else { detectedLanguage = 'en-US'; } @@ -111,6 +119,7 @@ export function LanguageSelector({ ภาษาไทย Tiếng Việt Español + Русский ); diff --git a/web/src/i18n/I18nProvider.tsx b/web/src/i18n/I18nProvider.tsx index b31c6496..b074d7af 100644 --- a/web/src/i18n/I18nProvider.tsx +++ b/web/src/i18n/I18nProvider.tsx @@ -28,6 +28,7 @@ export const extractI18nObject = (i18nObject: I18nObject): string => { if (language === 'th_TH' && i18nObject.th_TH) return i18nObject.th_TH; if (language === 'vi_VN' && i18nObject.vi_VN) return i18nObject.vi_VN; if (language === 'es_ES' && i18nObject.es_ES) return i18nObject.es_ES; + if (language === 'ru_RU' && i18nObject.ru_RU) return i18nObject.ru_RU; return ( i18nObject.en_US || i18nObject.zh_Hans || @@ -56,6 +57,8 @@ export const getAPILanguageCode = (): string => { if (language === 'vi-VN') return 'vi_VN'; // es-ES -> es_ES if (language === 'es-ES') return 'es_ES'; + // ru-RU -> ru_RU + if (language === 'ru-RU') return 'ru_RU'; // 默认返回 en return 'en'; }; diff --git a/web/src/i18n/index.ts b/web/src/i18n/index.ts index 842eb1ec..61baaf2f 100644 --- a/web/src/i18n/index.ts +++ b/web/src/i18n/index.ts @@ -9,6 +9,7 @@ import jaJP from './locales/ja-JP'; import thTH from './locales/th-TH'; import viVN from './locales/vi-VN'; import esES from './locales/es-ES'; +import ruRU from './locales/ru-RU'; i18n .use(LanguageDetector) @@ -36,6 +37,31 @@ i18n 'es-ES': { translation: esES, }, + 'ru-RU': { + translation: ruRU, + }, + }, + 'zh-Hans': { + translation: zhHans, + }, + 'zh-Hant': { + translation: zhHant, + }, + 'ja-JP': { + translation: jaJP, + }, + 'th-TH': { + translation: thTH, + }, + 'vi-VN': { + translation: viVN, + }, + 'es-ES': { + translation: esES, + }, + 'ru-RU': { + translation: ruRU, + }, }, fallbackLng: 'zh-Hans', debug: process.env.NODE_ENV === 'development', diff --git a/web/src/i18n/locales/ru-RU.ts b/web/src/i18n/locales/ru-RU.ts new file mode 100644 index 00000000..09332ecf --- /dev/null +++ b/web/src/i18n/locales/ru-RU.ts @@ -0,0 +1,1272 @@ +const ruRU = { + sidebar: { + home: 'Главная', + extensions: 'Расширения', + installedPlugins: 'Установленные плагины', + pluginMarket: 'Маркетплейс', + mcpServers: 'MCP-серверы', + quickStart: 'Быстрый старт', + }, + common: { + login: 'Войти', + logout: 'Выйти', + accountOptions: 'Настройки', + account: 'Аккаунт', + integration: 'Интеграция', + email: 'Электронная почта', + password: 'Пароль', + welcome: 'С возвращением в LangBot 👋', + continueToLogin: 'Войдите, чтобы продолжить', + loginSuccess: 'Вход выполнен успешно', + loginFailed: 'Ошибка входа, проверьте адрес электронной почты и пароль', + loginLoadError: 'Не удалось подключиться к серверу', + loginLoadErrorDesc: + 'Не удалось подключиться к серверу LangBot. Убедитесь, что сервис запущен, и повторите попытку.', + retry: 'Повторить', + enterEmail: 'Введите адрес электронной почты', + enterPassword: 'Введите пароль', + invalidEmail: 'Пожалуйста, введите корректный адрес электронной почты', + emptyPassword: 'Пожалуйста, введите пароль', + language: 'Язык', + helpDocs: 'Помощь', + featureRequest: 'Запрос функции', + starOnGitHub: 'Поставить звезду на GitHub', + create: 'Создать', + edit: 'Редактировать', + delete: 'Удалить', + add: 'Добавить', + select: 'Выбрать', + cancel: 'Отмена', + submit: 'Отправить', + error: 'Ошибка', + success: 'Успешно', + save: 'Сохранить', + saving: 'Сохранение...', + confirm: 'Подтвердить', + confirmDelete: 'Подтвердить удаление', + deleteConfirmation: 'Вы уверены, что хотите удалить это?', + selectOption: 'Выберите вариант', + selectPreset: 'Выберите шаблон', + required: 'Обязательно', + enable: 'Включить', + name: 'Название', + description: 'Описание', + icon: 'Иконка', + close: 'Закрыть', + deleteSuccess: 'Успешно удалено', + deleteError: 'Ошибка удаления: ', + addRound: 'Добавить раунд', + copy: 'Копировать', + copySuccess: 'Скопировано', + copyFailed: 'Ошибка копирования', + test: 'Тест', + forgotPassword: 'Забыли пароль?', + agreementNotice: 'Продолжая, вы соглашаетесь с нашей', + privacyPolicy: 'Политикой конфиденциальности', + and: 'и', + dataCollectionPolicy: 'Политикой сбора данных', + dataCollectionPolicyUrl: 'https://link.langbot.app/en/docs/data-policy', + loading: 'Загрузка...', + fieldRequired: 'Это поле обязательно для заполнения', + or: 'или', + loginWithSpace: 'Войти через Space', + spaceLoginRecommended: + 'Рекомендуется: Используйте официальные стабильные API моделей и облачные сервисы', + loginLocal: 'Войти с локальной учётной записью', + loginWithPassword: 'Войти с паролем', + spaceLoginTitle: 'Войти через Space', + spaceLoginDescription: + 'Отсканируйте QR-код или перейдите по ссылке ниже для авторизации', + spaceLoginUserCode: 'Ваш код', + spaceLoginExpires: 'Код истекает через {{seconds}} секунд', + spaceLoginWaiting: 'Ожидание авторизации...', + spaceLoginSuccess: 'Авторизация успешна', + spaceLoginFailed: 'Ошибка входа через Space', + spaceLoginExpired: 'Код авторизации истёк, попробуйте снова', + spaceLoginCancel: 'Отмена', + spaceLoginVisitLink: 'Перейти по ссылке', + spaceLoginProcessing: 'Вход через Space', + spaceLoginProcessingDescription: + 'Пожалуйста, подождите, пока мы завершим вход...', + spaceLoginSuccessDescription: 'Перенаправление в LangBot...', + spaceLoginError: 'Ошибка входа', + spaceLoginNoCode: 'Отсутствует код авторизации', + backToLogin: 'Вернуться к входу', + backToHome: 'На главную', + spaceAccountCannotChangePassword: + 'Для аккаунтов Space невозможно изменить пароль здесь', + theme: 'Тема', + changePassword: 'Изменить пароль', + currentPassword: 'Текущий пароль', + newPassword: 'Новый пароль', + confirmNewPassword: 'Подтвердите новый пароль', + enterCurrentPassword: 'Введите текущий пароль', + enterNewPassword: 'Введите новый пароль', + enterConfirmPassword: 'Подтвердите новый пароль', + currentPasswordRequired: 'Текущий пароль обязателен', + newPasswordRequired: 'Новый пароль обязателен', + confirmPasswordRequired: 'Подтверждение пароля обязательно', + passwordsDoNotMatch: 'Пароли не совпадают', + changePasswordSuccess: 'Пароль успешно изменён', + changePasswordFailed: + 'Не удалось изменить пароль, проверьте текущий пароль', + apiIntegration: 'API-интеграция', + apiKeys: 'API-ключи', + manageApiIntegration: 'Управление API-интеграцией', + manageApiKeys: 'Управление API-ключами', + createApiKey: 'Создать API-ключ', + apiKeyName: 'Имя API-ключа', + apiKeyDescription: 'Описание API-ключа', + apiKeyValue: 'Значение API-ключа', + apiKeyCreated: 'API-ключ успешно создан', + apiKeyDeleted: 'API-ключ успешно удалён', + apiKeyDeleteConfirm: 'Вы уверены, что хотите удалить этот API-ключ?', + apiKeyNameRequired: 'Имя API-ключа обязательно', + copyApiKey: 'Копировать API-ключ', + apiKeyCopied: 'API-ключ скопирован в буфер обмена', + noApiKeys: 'API-ключи не настроены', + apiKeyHint: + 'API-ключи позволяют внешним системам получать доступ к API сервисов LangBot', + webhooks: 'Вебхуки', + createWebhook: 'Создать вебхук', + webhookName: 'Имя вебхука', + webhookUrl: 'URL вебхука', + webhookDescription: 'Описание вебхука', + webhookEnabled: 'Включён', + webhookCreated: 'Вебхук успешно создан', + webhookDeleted: 'Вебхук успешно удалён', + webhookDeleteConfirm: 'Вы уверены, что хотите удалить этот вебхук?', + webhookNameRequired: 'Имя вебхука обязательно', + webhookUrlRequired: 'URL вебхука обязателен', + noWebhooks: 'Вебхуки не настроены', + webhookHint: + 'Вебхуки позволяют LangBot отправлять события личных и групповых сообщений во внешние системы', + actions: 'Действия', + apiKeyCreatedMessage: + 'Пожалуйста, скопируйте этот API-ключ. Если кнопка не работает, скопируйте вручную.', + none: 'Нет', + more: 'Ещё ({{count}})', + less: 'Свернуть', + noItems: 'Нет элементов', + }, + notFound: { + title: 'Страница не найдена', + description: 'Запрашиваемая страница не существует.', + back: 'Назад', + home: 'Главная', + help: 'Помощь', + }, + models: { + title: 'Модели', + description: 'Настройка и управление моделями, используемыми в конвейерах', + createModel: 'Создать модель', + editModel: 'Редактировать модель', + getModelListError: 'Не удалось получить список моделей: ', + modelName: 'Название модели', + modelProvider: 'Провайдер модели', + modelBaseURL: 'Базовый URL', + modelAbilities: 'Возможности модели', + saveSuccess: 'Успешно сохранено', + saveError: 'Ошибка сохранения: ', + createSuccess: 'Успешно создано', + createError: 'Ошибка создания: ', + deleteSuccess: 'Успешно удалено', + deleteError: 'Ошибка удаления: ', + deleteConfirmation: 'Вы уверены, что хотите удалить эту модель?', + modelNameRequired: 'Название модели не может быть пустым', + modelProviderRequired: 'Провайдер модели не может быть пустым', + requestURLRequired: 'URL запроса не может быть пустым', + apiKeyRequired: 'API-ключ не может быть пустым', + keyNameRequired: 'Имя ключа не может быть пустым', + mustBeValidNumber: 'Должно быть корректным числом', + mustBeTrueOrFalse: 'Должно быть true или false', + requestURL: 'URL запроса', + apiKey: 'API-ключ', + abilities: 'Возможности', + selectModelAbilities: 'Выберите возможности модели', + visionAbility: 'Распознавание изображений', + functionCallAbility: 'Вызов функций', + extraParameters: 'Дополнительные параметры', + addParameter: 'Добавить параметр', + keyName: 'Имя ключа', + type: 'Тип', + value: 'Значение', + string: 'Строка', + number: 'Число', + boolean: 'Логический', + selectModelProvider: 'Выберите провайдера модели', + modelProviderDescription: + 'Пожалуйста, введите название модели, предоставленное провайдером', + modelManufacturer: 'Производитель модели', + aggregationPlatform: 'Платформа агрегации', + selfDeployed: 'Самостоятельное развёртывание', + builtin: 'Встроенный', + selectModel: 'Выберите модель', + testSuccess: 'Тест успешен', + testError: 'Тест не пройден, проверьте конфигурацию модели', + llmModels: 'LLM-модели', + localProvider: 'Локальный', + localProviderDescription: 'Модели, настроенные и управляемые локально', + spaceProviderDescription: 'Модели, синхронизированные из вашего аккаунта Space', + spaceDisabledForLocalAccount: 'Войдите через Space, чтобы использовать облачные модели', + syncModels: 'Синхронизировать', + syncSuccess: 'Синхронизация завершена: {{created}} создано, {{updated}} обновлено', + syncError: 'Ошибка синхронизации: ', + spaceModelReadOnly: 'Модели Space доступны только для чтения', + noSpaceModels: 'Нет моделей Space. Нажмите «Синхронизировать», чтобы загрузить модели из Space.', + noLocalModels: 'Нет локальных моделей. Нажмите «Создать», чтобы добавить модель.', + providerCount: '{{count}} провайдеров', + addModel: 'Добавить модель', + addLLMModel: 'Добавить LLM-модель', + addEmbeddingModel: 'Добавить Embedding-модель', + provider: 'Провайдер', + existingProvider: 'Существующий провайдер', + newProvider: 'Новый провайдер', + selectProvider: 'Выберите провайдера', + requester: 'Тип провайдера', + selectRequester: 'Выберите тип провайдера', + langbotModelsDescription: 'Облачные модели на базе LangBot Space', + credits: 'Кредиты', + loginWithSpace: 'Войти через Space', + loginToUseModels: 'Войдите через Space, чтобы использовать облачные модели', + noModels: 'Модели не настроены', + langbotModels: 'Модели LangBot', + spaceTrialTooltip: + 'Доступны бесплатные пробные кредиты! Войдите через Space, чтобы получить доступ к облачным моделям без настройки.', + unlockModels: 'Войдите для использования', + editProvider: 'Редактировать провайдера', + addProvider: 'Добавить провайдера', + addProviderHint: 'Добавьте провайдеров для использования моделей из других источников', + addProviderHintSimple: 'Добавьте провайдеров для использования моделей', + noProviders: 'Провайдеров пока нет', + providerName: 'Имя провайдера', + providerNameRequired: 'Имя провайдера обязательно', + requesterRequired: 'Тип провайдера обязателен', + providerSaved: 'Провайдер сохранён', + providerCreated: 'Провайдер создан', + providerSaveError: 'Ошибка сохранения провайдера: ', + providerDeleted: 'Провайдер удалён', + providerDeleteError: 'Ошибка удаления провайдера: ', + deleteProviderConfirmation: + 'Вы уверены, что хотите удалить этого провайдера?', + loadError: 'Не удалось загрузить данные', + chat: 'Чат', + embedding: 'Embedding', + modelsCount: '{{count}} модель(ей)', + expandModels: 'Развернуть', + collapseModels: 'Свернуть', + fallback: { + primary: 'Основная модель', + fallbackList: 'Резервные модели', + addFallback: 'Добавить резервную модель', + }, + }, + bots: { + title: 'Боты', + description: + 'Создание и управление ботами — точками входа LangBot для подключения к различным платформам', + createBot: 'Создать бота', + selectFromSidebar: 'Выберите бота из боковой панели', + editBot: 'Редактировать бота', + getBotListError: 'Не удалось получить список ботов: ', + botName: 'Имя бота', + botDescription: 'Описание бота', + botNameRequired: 'Имя бота не может быть пустым', + botDescriptionRequired: 'Описание бота не может быть пустым', + adapterRequired: 'Адаптер не может быть пустым', + defaultDescription: 'Бот', + getBotConfigError: 'Не удалось получить конфигурацию бота: ', + saveSuccess: 'Успешно сохранено', + saveError: 'Ошибка сохранения: ', + createSuccess: + 'Успешно создано. Пожалуйста, включите или измените привязанный конвейер', + createError: 'Ошибка создания: ', + deleteSuccess: 'Успешно удалено', + deleteError: 'Ошибка удаления: ', + deleteConfirmation: 'Вы уверены, что хотите удалить этого бота?', + platformAdapter: 'Выбор платформы/адаптера', + selectAdapter: 'Выберите адаптер', + adapterConfig: 'Настройка адаптера', + viewAdapterDocs: 'Документация', + bindPipeline: 'Привязать конвейер', + selectPipeline: 'Выберите конвейер', + selectBot: 'Выберите бота', + botLogTitle: 'Журнал бота', + enableAutoRefresh: 'Автообновление', + session: 'Сессия', + yesterday: 'Вчера', + earlier: 'Ранее', + dateFormat: '{{day}}.{{month}}', + setBotEnableError: 'Не удалось изменить статус бота', + log: 'Журнал', + configuration: 'Настройки', + logs: 'Журналы', + basicInfo: 'Основная информация', + basicInfoDescription: 'Задайте имя и описание бота', + routingConnection: 'Маршрутизация и подключение', + routingConnectionDescription: + 'Привяжите конвейер, обрабатывающий сообщения для этого бота', + routingRules: 'Правила условной маршрутизации', + routingRulesDescription: + 'Правила проверяются по порядку; первое совпадение направляет в соответствующий конвейер. При отсутствии совпадений используется конвейер по умолчанию.', + addRoutingRule: 'Добавить правило', + ruleTypeLauncherType: 'Тип сессии', + ruleTypeLauncherId: 'ID сессии', + ruleTypeMessageContent: 'Содержимое сообщения', + operatorEq: 'Равно', + operatorNeq: 'Не равно', + operatorContains: 'Содержит', + operatorNotContains: 'Не содержит', + operatorStartsWith: 'Начинается с', + operatorRegex: 'Регулярное выражение', + operatorHas: 'Содержит', + operatorNotHas: 'Не содержит', + ruleTypeMessageHasElement: 'Элемент сообщения', + ruleValueElementPlaceholder: 'Выберите тип элемента', + elementImage: 'Изображение', + elementVoice: 'Голос', + elementFile: 'Файл', + elementForward: 'Пересланное', + elementFace: 'Эмодзи', + elementAt: '@Упоминание', + elementAtAll: '@Все', + elementQuote: 'Цитата', + ruleValuePlaceholder: 'Значение для сопоставления', + ruleValueLauncherIdPlaceholder: 'ID группы или пользователя', + ruleValueMessagePlaceholder: 'Текст сообщения', + ruleValuePrefixPlaceholder: 'Напр., !draw', + ruleValueRegexpPlaceholder: 'Напр., ^/help', + pipelineDiscard: 'Отклонить сообщение', + sessionTypePerson: 'Личный чат', + sessionTypeGroup: 'Групповой чат', + adapterConfigDescription: 'Настройте выбранный адаптер платформы', + dangerZone: 'Опасная зона', + dangerZoneDescription: 'Необратимые и деструктивные действия', + deleteBotAction: 'Удалить этого бота', + deleteBotHint: + 'После удаления все связанные настройки будут безвозвратно удалены.', + webhookUrl: 'URL обратного вызова Webhook', + webhookUrlCopied: 'URL Webhook скопирован', + webhookUrlHint: + 'Нажмите на поле ввода, чтобы выделить всё, затем Ctrl+C (Mac: Cmd+C) для копирования, или нажмите кнопку', + webhookUrlHintEither: + 'Используйте любой из двух URL выше в настройках вашей платформы', + webhookSaasHint: + 'Для Webhook требуется публично доступный домен. LangBot Cloud предоставляет готовую публичную конечную точку для вашего бота.', + webhookSaasLink: 'Подробнее о LangBot Cloud', + adapterCategory: { + popular: 'Популярные', + china: 'Китай', + global: 'Глобальные', + protocol: 'Протокол', + }, + logLevel: 'Уровень журнала', + allLevels: 'Все уровни', + selectLevel: 'Выберите уровень', + levelsSelected: 'уровней выбрано', + viewDetailedLogs: 'Подробные журналы', + viewDetails: 'Подробности', + collapse: 'Свернуть', + imagesAttached: 'изображений прикреплено', + noLogs: 'Журналов пока нет', + sessionMonitor: { + title: 'Сессии', + sessions: 'Сессии', + noSessions: 'Сессии не найдены', + selectSession: 'Выберите сессию для просмотра сообщений', + noMessages: 'В этой сессии нет сообщений', + messages: 'сообщений', + messageCount: '{{count}} сообщений', + loading: 'Загрузка...', + loadingSessions: 'Загрузка сессий...', + loadingMessages: 'Загрузка сообщений...', + user: 'Пользователь', + variables: 'Переменные', + platform: 'Платформа', + lastActive: 'Последняя активность', + refresh: 'Обновить', + active: 'Активна', + inactive: 'Неактивна', + discarded: 'Отклонена', + userMessage: 'Пользователь', + botMessage: 'Ассистент', + }, + }, + plugins: { + title: 'Расширения', + description: + 'Установка и настройка плагинов для расширения функциональности. Выберите их в настройках конвейера', + createPlugin: 'Создать плагин', + editPlugin: 'Редактировать плагин', + installed: 'Установленные', + marketplace: 'Маркетплейс', + arrange: 'Сортировка плагинов', + install: 'Установить', + installPlugin: 'Установить плагин', + onlySupportGithub: 'В настоящее время поддерживается установка только с GitHub', + enterGithubLink: 'Введите ссылку на GitHub плагина', + installing: 'Установка плагина...', + installSuccess: 'Плагин успешно установлен', + installFailed: 'Ошибка установки плагина:', + searchPlugin: 'Поиск плагинов', + sortBy: 'Сортировать по', + mostStars: 'Больше всего звёзд', + recentlyAdded: 'Недавно добавленные', + recentlyUpdated: 'Недавно обновлённые', + noMatchingPlugins: 'Подходящие плагины не найдены', + loading: 'Загрузка...', + getPluginListError: 'Не удалось получить список плагинов:', + noPluginInstalled: 'Плагины не установлены', + pluginConfig: 'Настройка плагина', + pluginSort: 'Порядок плагинов', + pluginSortDescription: + 'Порядок плагинов влияет на очерёдность обработки одного события. Перетащите карточку плагина для сортировки', + pluginSortSuccess: 'Порядок плагинов обновлён', + pluginSortError: 'Ошибка сортировки плагинов: ', + pluginNoConfig: 'У плагина нет параметров настройки.', + systemDisabled: 'Система плагинов отключена', + systemDisabledDesc: + 'Система плагинов не включена. Измените конфигурацию согласно документации', + connectionError: 'Ошибка подключения системы плагинов', + connectionErrorDesc: + 'Проверьте конфигурацию системы плагинов или обратитесь к администратору.', + errorDetails: 'Подробности ошибки', + loadingStatus: 'Проверка статуса системы плагинов...', + failedToGetStatus: 'Не удалось получить статус системы плагинов', + pluginSystemNotReady: + 'Система плагинов не готова, невозможно выполнить эту операцию', + debugInfo: 'Отладочная информация', + debugInfoTitle: 'Отладочная информация плагина', + debugUrl: 'URL для отладки', + debugKey: 'Ключ отладки', + noDebugKey: '(Не задан)', + debugKeyDisabled: + 'Ключ отладки не задан, аутентификация при отладке плагина не требуется', + failedToGetDebugInfo: 'Не удалось получить отладочную информацию', + copiedToClipboard: 'Скопировано в буфер обмена', + deleting: 'Удаление...', + deletePlugin: 'Удалить плагин', + cancel: 'Отмена', + saveConfig: 'Сохранить настройки', + saving: 'Сохранение...', + confirmDeletePlugin: + 'Вы уверены, что хотите удалить плагин ({{author}}/{{name}})?', + deleteDataCheckbox: + 'Также удалить конфигурацию плагина и постоянное хранилище', + confirmDelete: 'Подтвердить удаление', + deleteError: 'Ошибка удаления: ', + close: 'Закрыть', + deleteConfirm: 'Подтверждение удаления', + deleteSuccess: 'Удаление успешно', + modifyFailed: 'Ошибка изменения: ', + componentName: { + Tool: 'Инструмент', + EventListener: 'Обработчик событий', + Command: 'Команда', + KnowledgeEngine: 'Движок знаний', + Parser: 'Парсер', + }, + uploadLocal: 'Загрузить локально', + debugging: 'Отладка', + uploadLocalPlugin: 'Загрузить локальный плагин', + dragToUpload: 'Перетащите файл плагина сюда для загрузки', + unsupportedFileType: + 'Неподдерживаемый тип файла, поддерживаются только файлы .lbpkg и .zip', + uploadingPlugin: 'Загрузка плагина...', + uploadSuccess: 'Загрузка успешна', + uploadFailed: 'Ошибка загрузки', + selectFileToUpload: 'Выберите файл плагина для загрузки', + askConfirm: 'Вы уверены, что хотите установить плагин "{{name}}" ({{version}})?', + fromGithub: 'С GitHub', + fromLocal: 'Из локального файла', + fromMarketplace: 'Из маркетплейса', + componentsList: 'Компоненты: ', + noComponents: 'Нет компонентов', + delete: 'Удалить плагин', + update: 'Обновить плагин', + new: 'Новый', + updateConfirm: 'Подтверждение обновления', + confirmUpdatePlugin: + 'Вы уверены, что хотите обновить плагин ({{author}}/{{name}})?', + confirmUpdate: 'Подтвердить обновление', + updating: 'Обновление...', + updateSuccess: 'Плагин успешно обновлён', + updateError: 'Ошибка обновления: ', + saveConfigSuccessNormal: 'Конфигурация успешно сохранена', + saveConfigError: 'Ошибка сохранения конфигурации: ', + config: 'Настройки', + readme: 'Документация', + viewSource: 'Исходный код', + loadingReadme: 'Загрузка документации...', + noReadme: 'Этот плагин не предоставляет документацию README', + fileUpload: { + tooLarge: 'Размер файла превышает лимит 10 МБ', + success: 'Файл успешно загружен', + failed: 'Ошибка загрузки файла', + uploading: 'Загрузка...', + chooseFile: 'Выбрать файл', + addFile: 'Добавить файл', + }, + installFromGithub: 'С GitHub', + enterRepoUrl: 'Введите URL репозитория GitHub', + repoUrlPlaceholder: 'Напр., https://github.com/owner/repo', + fetchingReleases: 'Загрузка релизов...', + selectRelease: 'Выберите релиз', + noReleasesFound: 'Релизы не найдены', + fetchReleasesError: 'Не удалось загрузить релизы: ', + selectAsset: 'Выберите файл для установки', + noAssetsFound: 'В этом релизе нет файлов .lbpkg', + fetchAssetsError: 'Не удалось загрузить файлы: ', + backToReleases: 'Назад к релизам', + backToRepoUrl: 'Назад к URL репозитория', + backToAssets: 'Назад к файлам', + releaseTag: 'Тег: {{tag}}', + releaseName: 'Название: {{name}}', + publishedAt: 'Опубликовано: {{date}}', + prerelease: 'Предварительный релиз', + assetSize: 'Размер: {{size}}', + confirmInstall: 'Подтвердить установку', + installFromGithubDesc: 'Установить плагин из GitHub Release', + goToMarketplace: 'Перейти в маркетплейс', + installProgress: { + title: 'Установка {{name}}', + titleGeneric: 'Установка плагина', + overallProgress: 'Общий прогресс', + downloading: 'Загрузка плагина', + installingDeps: 'Установка зависимостей', + initializing: 'Инициализация настроек', + launching: 'Запуск плагина', + completed: 'Завершено', + failed: 'Ошибка', + downloadSize: 'Размер пакета: {{size}}', + depsInfo: '{{count}} зависимостей для установки', + depsProgress: + '{{installed}}/{{total}} установлено · {{remaining}} осталось', + installComplete: 'Плагин успешно установлен', + dismiss: 'Закрыть', + background: 'В фоновом режиме', + taskQueue: 'Задачи установки', + clearCompleted: 'Очистить завершённые', + noTasks: 'Нет задач установки', + }, + }, + market: { + searchPlaceholder: 'Поиск плагинов...', + searchResults: 'Найдено {{count}} плагинов', + totalPlugins: 'Всего {{count}} плагинов', + noPlugins: 'Нет доступных плагинов', + noResults: 'Подходящие плагины не найдены', + loadingMore: 'Загрузка ещё...', + loading: 'Загрузка...', + allLoaded: 'Все плагины отображены', + install: 'Установить', + installConfirm: + 'Вы уверены, что хотите установить плагин "{{name}}" ({{version}})?', + downloadComplete: 'Плагин "{{name}}" загружен', + installFailed: 'Ошибка установки, попробуйте позже', + loadFailed: 'Не удалось получить список плагинов, попробуйте позже', + noDescription: 'Описание отсутствует', + notFound: 'Информация о плагине не найдена', + sortBy: 'Сортировать по', + sort: { + recentlyAdded: 'Недавно добавленные', + recentlyUpdated: 'Недавно обновлённые', + mostDownloads: 'Больше всего загрузок', + leastDownloads: 'Меньше всего загрузок', + }, + downloads: 'загрузок', + download: 'Скачать', + repository: 'Репозиторий', + downloadFailed: 'Ошибка загрузки', + noReadme: 'Этот плагин не предоставляет документацию README', + description: 'Описание', + tagLabel: 'Теги', + submissionTitle: 'У вас есть плагин на рассмотрении: {{name}}', + submissionPending: 'Ваш плагин находится на рассмотрении: {{name}}', + submissionApproved: 'Ваш плагин одобрен: {{name}}', + submissionRejected: 'Ваш плагин отклонён: {{name}}', + clickToRevoke: 'Отозвать', + revokeSuccess: 'Успешно отозвано', + revokeFailed: 'Ошибка отзыва', + submissionDetails: 'Детали заявки на плагин', + markAsRead: 'Отметить как прочитанное', + markAsReadSuccess: 'Отмечено как прочитанное', + markAsReadFailed: 'Не удалось отметить как прочитанное', + filterByComponent: 'Компонент', + allComponents: 'Все компоненты', + requestPlugin: 'Запросить плагин', + viewDetails: 'Подробнее', + deprecated: 'Устаревший', + deprecatedTooltip: + 'Пожалуйста, установите соответствующий плагин движка знаний.', + tags: { + filterByTags: 'Фильтр по тегам', + selected: 'выбрано', + selectTags: 'Выберите теги', + clearAll: 'Очистить всё', + noTags: 'Нет доступных тегов', + }, + }, + mcp: { + title: 'MCP', + createServer: 'Добавить MCP-сервер', + editServer: 'Редактировать MCP-сервер', + deleteServer: 'Удалить MCP-сервер', + confirmDeleteServer: 'Вы уверены, что хотите удалить этот MCP-сервер?', + confirmDeleteTitle: 'Удаление MCP-сервера', + getServerListError: 'Не удалось получить список MCP-серверов: ', + serverName: 'Имя сервера', + serverMode: 'Режим подключения', + selectMode: 'Выберите режим', + stdio: 'Режим Stdio', + sse: 'Режим SSE', + http: 'Режим HTTP', + noServerInstalled: 'MCP-серверы не настроены', + serverNameRequired: 'Имя сервера не может быть пустым', + commandRequired: 'Команда не может быть пустой', + urlRequired: 'URL не может быть пустым', + timeoutMustBePositive: 'Таймаут должен быть положительным числом', + command: 'Команда', + args: 'Аргументы', + env: 'Переменные окружения', + url: 'URL', + headers: 'Заголовки', + timeout: 'Таймаут', + addArgument: 'Добавить аргумент', + addEnvVar: 'Добавить переменную окружения', + addHeader: 'Добавить заголовок', + keyName: 'Имя ключа', + value: 'Значение', + testing: 'Тестирование...', + connecting: 'Подключение...', + testSuccess: 'Тест успешен', + testFailed: 'Тест не пройден: ', + testError: 'Ошибка тестирования', + refreshSuccess: 'Обновление успешно', + refreshFailed: 'Ошибка обновления: ', + connectionSuccess: 'Подключение успешно', + connectionFailed: 'Не удалось подключиться, проверьте URL', + connectionFailedStatus: 'Ошибка подключения', + toolsFound: 'инструментов', + unknownError: 'Неизвестная ошибка', + noToolsFound: 'Инструменты не найдены', + parseResultFailed: 'Не удалось разобрать результат теста', + noResultReturned: 'Тест не вернул результат', + getTaskFailed: 'Не удалось получить статус задачи', + noTaskId: 'Не удалось получить ID задачи', + deleteSuccess: 'Успешно удалено', + deleteFailed: 'Ошибка удаления: ', + deleteError: 'Ошибка удаления: ', + saveSuccess: 'Успешно сохранено', + saveError: 'Ошибка сохранения: ', + createSuccess: 'Успешно создано', + createFailed: 'Ошибка создания: ', + createError: 'Ошибка создания: ', + loadFailed: 'Ошибка загрузки', + modifyFailed: 'Ошибка изменения: ', + toolCount: 'Инструменты: {{count}}', + statusConnected: 'Подключён', + statusDisconnected: 'Отключён', + statusError: 'Ошибка подключения', + statusDisabled: 'Отключён', + loading: 'Загрузка...', + starCount: 'Звёзды: {{count}}', + install: 'Установить', + installFromGithub: 'Установить MCP-сервер с GitHub', + add: 'Добавить', + name: 'Название', + nameRequired: 'Название не может быть пустым', + sseTimeout: 'Таймаут SSE', + sseTimeoutDescription: 'Таймаут для установления SSE-соединения', + extraParametersDescription: + 'Дополнительные параметры для настройки поведения MCP-сервера', + timeoutMustBeNumber: 'Таймаут должен быть числом', + timeoutNonNegative: 'Таймаут не может быть отрицательным', + sseTimeoutMustBeNumber: 'Таймаут SSE должен быть числом', + sseTimeoutNonNegative: 'Таймаут SSE не может быть отрицательным', + updateSuccess: 'Успешно обновлено', + updateFailed: 'Ошибка обновления: ', + selectFromSidebar: 'Выберите MCP-сервер из боковой панели', + dangerZone: 'Опасная зона', + dangerZoneDescription: + 'Необратимые и деструктивные действия для этого MCP-сервера.', + deleteMCPAction: 'Удалить этот MCP-сервер', + deleteMCPHint: + 'После удаления конфигурация этого MCP-сервера не может быть восстановлена.', + }, + pipelines: { + title: 'Конвейеры', + description: + 'Конвейеры определяют поток обработки событий сообщений и привязываются к ботам', + createPipeline: 'Создать конвейер', + selectFromSidebar: 'Выберите конвейер из боковой панели', + editPipeline: 'Редактировать конвейер', + chat: 'Чат', + configuration: 'Настройки', + debugChat: 'Отладочный чат', + getPipelineListError: 'Не удалось получить список конвейеров: ', + daysAgo: 'дней назад', + today: 'Сегодня', + updateTime: 'Обновлено ', + defaultBadge: 'По умолчанию', + sortBy: 'Сортировать по', + newestCreated: 'Сначала новые', + earliestCreated: 'Сначала старые', + recentlyEdited: 'Недавно изменённые', + earliestEdited: 'Давно изменённые', + basicInfo: 'Основная информация', + basicInfoDescription: 'Задайте название, иконку и описание конвейера', + aiCapabilities: 'ИИ', + triggerConditions: 'Триггер', + safetyControls: 'Безопасность', + outputProcessing: 'Вывод', + nameRequired: 'Название не может быть пустым', + descriptionRequired: 'Описание не может быть пустым', + createSuccess: 'Успешно создано. Отредактируйте параметры конвейера', + createError: 'Ошибка создания: ', + saveSuccess: 'Успешно сохранено', + saveError: 'Ошибка сохранения: ', + copySuffix: ' Копия', + deleteConfirmation: + 'Вы уверены, что хотите удалить этот конвейер? Боты, привязанные к нему, перестанут работать.', + defaultPipelineCannotDelete: 'Конвейер по умолчанию нельзя удалить', + deleteSuccess: 'Успешно удалено', + deleteError: 'Ошибка удаления: ', + copyConfirmTitle: 'Подтверждение копирования', + copyConfirmation: + 'Вы уверены, что хотите скопировать этот конвейер? Будет создан новый конвейер со всеми настройками.', + unsavedChanges: 'У вас есть несохранённые изменения', + dangerZone: 'Опасная зона', + dangerZoneDescription: 'Необратимые и деструктивные действия', + deletePipelineAction: 'Удалить этот конвейер', + deletePipelineHint: + 'После удаления боты, привязанные к этому конвейеру, перестанут работать.', + copyPipelineAction: 'Копировать этот конвейер', + copyPipelineHint: + 'Создать новый конвейер с дублированием всех настроек.', + extensions: { + title: 'Расширения', + loadError: 'Не удалось загрузить плагины', + saveSuccess: 'Успешно сохранено', + saveError: 'Ошибка сохранения', + noPluginsAvailable: 'Нет доступных плагинов', + disabled: 'Отключено', + noPluginsSelected: 'Плагины не выбраны', + addPlugin: 'Добавить плагин', + selectPlugins: 'Выберите плагины', + pluginsTitle: 'Плагины', + mcpServersTitle: 'MCP-серверы', + noMCPServersSelected: 'MCP-серверы не выбраны', + addMCPServer: 'Добавить MCP-сервер', + selectMCPServers: 'Выберите MCP-серверы', + toolCount: '{{count}} инструментов', + noPluginsInstalled: 'Нет установленных плагинов', + noMCPServersConfigured: 'Нет настроенных MCP-серверов', + selectAll: 'Выбрать все', + enableAllPlugins: 'Включить все плагины', + enableAllMCPServers: 'Включить все MCP-серверы', + allPluginsEnabled: 'Все плагины включены', + allMCPServersEnabled: 'Все MCP-серверы включены', + }, + debugDialog: { + title: 'Чат конвейера', + selectPipeline: 'Выберите конвейер', + sessionType: 'Тип сессии', + privateChat: 'Личный чат', + groupChat: 'Групповой чат', + send: 'Отправить', + reset: 'Сбросить диалог', + inputPlaceholder: 'Отправить {{type}} сообщение...', + noMessages: 'Нет сообщений', + userMessage: 'Пользователь', + botMessage: 'Бот', + sendFailed: 'Ошибка отправки', + resetSuccess: 'Диалог успешно сброшен', + resetFailed: 'Ошибка сброса', + loadMessagesFailed: 'Не удалось загрузить сообщения', + loadPipelinesFailed: 'Не удалось загрузить конвейеры', + atTips: 'Упомянуть бота', + streaming: 'Потоковая передача', + streamOutput: 'Поток', + connected: 'WebSocket подключён', + disconnected: 'WebSocket отключён', + connectionError: 'Ошибка подключения WebSocket', + connectionFailed: 'Ошибка подключения WebSocket', + notConnected: 'WebSocket не подключён, повторите попытку позже', + imageUploadFailed: 'Ошибка загрузки изображения', + reply: 'Ответить', + replyTo: 'Ответ на', + showMarkdown: 'Показать Markdown', + showRaw: 'Показать исходный текст', + allMembers: 'Все участники', + file: 'Файл', + voice: 'Голос', + uploadImage: 'Загрузить изображение', + uploading: 'Загрузка...', + }, + monitoring: { + title: 'Мониторинг', + description: + 'Просмотр журналов выполнения и ошибок конвейера (за последние 24 часа)', + detailedLogs: 'Подробные журналы', + }, + }, + knowledge: { + title: 'Знания', + createKnowledgeBase: 'Создать базу знаний', + selectFromSidebar: 'Выберите базу знаний из боковой панели', + editKnowledgeBase: 'Редактировать базу знаний', + selectKnowledgeBase: 'Выберите базу знаний', + selectKnowledgeBases: 'Выберите базы знаний', + addKnowledgeBase: 'Добавить базу знаний', + noKnowledgeBaseSelected: 'Базы знаний не выбраны', + empty: 'Пусто', + editDocument: 'Документы', + description: 'Настройка баз знаний для улучшения ответов LLM', + metadata: 'Метаданные', + documents: 'Документы', + kbNameRequired: 'Название базы знаний не может быть пустым', + kbDescriptionRequired: 'Описание базы знаний не может быть пустым', + embeddingModelUUIDRequired: 'Модель Embedding не может быть пустой', + daysAgo: 'дней назад', + today: 'Сегодня', + kbName: 'Название базы знаний', + kbDescription: 'Описание базы знаний', + topK: 'Top K', + topKRequired: 'Top K не может быть пустым', + topKMax: 'Максимальное значение Top K — 30', + topKdescription: + 'Указывает количество релевантных документов для извлечения, от 1 до 30.', + defaultDescription: 'База знаний', + embeddingModelUUID: 'Модель Embedding', + selectEmbeddingModel: 'Выберите модель Embedding', + embeddingModelDescription: + 'Используется для векторизации текста. Настроить можно на странице моделей', + updateTime: 'Обновлено ', + cannotChangeEmbeddingModel: + 'Модель Embedding нельзя изменить после создания базы знаний', + updateKnowledgeBaseSuccess: 'База знаний успешно обновлена', + updateKnowledgeBaseFailed: 'Ошибка обновления базы знаний: ', + documentsTab: { + name: 'Название', + status: 'Статус', + noResults: 'Нет документов', + dragAndDrop: 'Перетащите файлы сюда или нажмите для загрузки', + uploading: 'Загрузка...', + supportedFormats: + 'Поддерживаются PDF, Word, TXT, Markdown, HTML, ZIP и другие форматы', + uploadSuccess: 'Файл успешно загружен!', + uploadError: 'Ошибка загрузки файла: ', + uploadingFile: 'Загрузка файла...', + fileSizeExceeded: + 'Размер файла превышает 10 МБ. Разделите на файлы меньшего размера.', + actions: 'Действия', + delete: 'Удалить файл', + fileDeleteSuccess: 'Файл успешно удалён', + fileDeleteFailed: 'Ошибка удаления файла: ', + processing: 'Обработка', + completed: 'Завершено', + failed: 'Ошибка', + selectParser: 'Выберите парсер', + builtInParser: 'Предоставлено движком знаний', + noParserAvailable: + 'Нет парсера, поддерживающего этот тип файла. Установите плагин-парсер для этого формата.', + installParserHint: 'Найти плагины-парсеры в маркетплейсе →', + confirmUpload: 'Загрузить', + cancelUpload: 'Отмена', + }, + deleteKnowledgeBaseConfirmation: + 'Вы уверены, что хотите удалить эту базу знаний? Все документы будут удалены.', + retrieve: 'Тест извлечения', + retrieveTest: 'Тест извлечения', + query: 'Запрос', + queryPlaceholder: 'Введите текст запроса...', + distance: 'Расстояние', + content: 'Содержимое', + fileName: 'Имя файла', + noResults: 'Нет результатов', + retrieveError: 'Ошибка извлечения: ', + unknownEngine: 'Неизвестный движок', + knowledgeEngine: 'Движок знаний', + knowledgeEngineRequired: 'Движок знаний обязателен', + selectKnowledgeEngine: 'Выберите движок знаний', + builtInEngine: 'Встроенный движок', + cannotChangeKnowledgeEngine: + 'Движок знаний нельзя изменить после создания', + basicInfo: 'Основная информация', + basicInfoDescription: 'Задайте название, иконку и описание базы знаний', + engineSettings: 'Настройки движка', + engineSettingsDescription: + 'Конфигурация выбранного движка знаний', + engineSettingsReadonly: 'только чтение в режиме редактирования', + retrievalSettings: 'Настройки извлечения', + retrievalSettingsDescription: + 'Настройте способ извлечения документов из базы знаний', + dangerZone: 'Опасная зона', + dangerZoneDescription: 'Необратимые и деструктивные действия', + deleteKbAction: 'Удалить эту базу знаний', + deleteKbHint: + 'После удаления все документы и данные будут безвозвратно удалены.', + noEnginesAvailable: 'Нет доступных движков баз знаний', + installEngineHint: 'Сначала установите плагин «Движок знаний»', + createKnowledgeBaseFailed: 'Ошибка создания базы знаний: ', + loadKnowledgeBaseFailed: 'Ошибка загрузки базы знаний: ', + deleteKnowledgeBaseFailed: 'Ошибка удаления базы знаний: ', + getKnowledgeBaseListError: 'Не удалось получить список баз знаний: ', + embeddingModel: 'Модель Embedding', + embeddingModelRequired: 'Модель Embedding обязательна для этого движка', + addExternal: 'Добавить внешнюю базу знаний', + createExternalSuccess: 'Внешняя база знаний успешно создана', + updateExternalSuccess: 'Внешняя база знаний успешно обновлена', + deleteExternalSuccess: 'Внешняя база знаний успешно удалена', + retriever: 'Ретривер', + selectRetriever: 'Выберите ретривер...', + retrieverConfiguration: 'Настройка ретривера', + retrieverInstallInfo: 'Вы можете установить плагины ретривера знаний из', + retrieverMarketLink: 'маркетплейса', + migration: { + title: 'Миграция базы знаний', + description: + 'Новая версия переработала базы знаний в архитектуру на основе плагинов. Требуется миграция данных. Старые данные автоматически сохранены в базе данных.', + detected: + 'Найдено {{total}} баз знаний для миграции ({{internal}} внутренних, {{external}} внешних).', + startWithInstall: 'Автоустановка плагина и миграция', + startDataOnly: 'Только миграция данных', + dataOnlyHint: + '«Только миграция данных» подходит для офлайн/интранет-сред. Установите плагин вручную после миграции.', + dismiss: 'Отклонить исходные данные', + running: 'Миграция баз знаний, пожалуйста, подождите...', + success: 'Миграция базы знаний завершена', + error: 'Ошибка миграции базы знаний: ', + dismissError: 'Ошибка операции', + retry: 'Повторить', + }, + }, + register: { + title: 'Инициализация LangBot 👋', + description: 'Вы впервые запускаете LangBot', + adminAccountNote: + 'Указанная учётная запись будет настроена как администратор', + register: 'Регистрация', + initWithSpace: 'Инициализация через Space', + spaceRecommended: + 'Рекомендуется: Используйте официальные стабильные API моделей и облачные сервисы', + spaceInfoTip1: + 'Space предоставляет единую службу аутентификации без загрузки конфиденциальной информации.', + spaceInfoTip2: + 'Вход через Space даёт доступ к моделям LangBot и облачным сервисам, включая бесплатные кредиты для быстрого старта.', + spaceInfoTip3: + 'Способ входа не влияет на другие функции. Вы можете настроить модели из других источников в любое время.', + registerLocal: 'Зарегистрировать локальную учётную запись', + registerWithPassword: 'Зарегистрироваться с email и паролем', + initSuccess: 'Инициализация успешна, пожалуйста, войдите', + initFailed: 'Ошибка инициализации: ', + }, + resetPassword: { + title: 'Сброс пароля 🔐', + description: + 'Введите ключ восстановления и новый пароль для сброса пароля учётной записи', + recoveryKey: 'Ключ восстановления', + recoveryKeyDescription: + 'Хранится в `system.recovery_key` файла конфигурации `data/config.yaml`', + newPassword: 'Новый пароль', + enterRecoveryKey: 'Введите ключ восстановления', + enterNewPassword: 'Введите новый пароль', + recoveryKeyRequired: 'Ключ восстановления не может быть пустым', + newPasswordRequired: 'Новый пароль не может быть пустым', + resetPassword: 'Сбросить пароль', + resetting: 'Сброс...', + resetSuccess: 'Пароль успешно сброшен, пожалуйста, войдите', + resetFailed: + 'Ошибка сброса пароля, проверьте email и ключ восстановления', + backToLogin: 'Вернуться к входу', + }, + embedding: { + description: 'Управление моделями Embedding для векторизации текста', + createModel: 'Создать модель Embedding', + editModel: 'Редактировать модель Embedding', + getModelListError: 'Не удалось получить список моделей Embedding: ', + embeddingModels: 'Embedding', + extraParametersDescription: + 'Будут добавлены к телу запроса, например encoding_format, dimensions и т.д.', + }, + llm: { + description: 'Управление LLM-моделями для генерации диалогов', + llmModels: 'LLM', + extraParametersDescription: + 'Будут добавлены к телу запроса, например max_tokens, temperature, top_p и т.д.', + }, + version: { + newVersionAvailable: 'Доступна новая версия', + viewUpdateGuide: 'Руководство по обновлению', + noReleaseNotes: 'Примечания к выпуску недоступны', + }, + account: { + settings: 'Настройки аккаунта', + setPassword: 'Установить пароль', + passwordSetSuccess: 'Пароль успешно установлен', + passwordStatus: 'Локальный пароль', + passwordSet: 'Установлен', + passwordNotSet: 'Не установлен', + passwordSetDescription: + 'Пароль установлен, вы можете входить с email и паролем', + spaceStatus: 'Аккаунт Space', + spaceBound: 'Привязан', + spaceNotBound: 'Не привязан', + spaceBoundDescription: + 'Аккаунт Space привязан, доступны официальные API моделей и облачные сервисы', + bindSpace: 'Привязать аккаунт Space', + bindSpaceDescription: 'Привяжите для использования официальных API моделей и облачных сервисов', + bindSpaceButton: 'Привязать', + bindSpaceConfirmTitle: 'Подтверждение привязки', + bindSpaceConfirmDescription: + 'Вы собираетесь привязать локальный экземпляр к аккаунту Space', + bindSpaceWarning: + 'После привязки ваш email для входа будет изменён с {{localEmail}} на email аккаунта Space.', + bindSpaceSuccess: 'Аккаунт Space успешно привязан', + bindSpaceFailed: 'Не удалось привязать аккаунт Space', + bindSpaceInvalidState: + 'Недействительный запрос привязки. Повторите попытку из настроек аккаунта.', + setPasswordHint: 'Установите пароль для входа с email и паролем', + spaceEmailMismatch: + 'Email входа через Space не совпадает с email локальной учётной записи', + }, + monitoring: { + title: 'Мониторинг', + description: 'Мониторинг активности ботов, вызовов LLM и производительности системы', + overview: 'Обзор', + totalMessages: 'Всего сообщений', + llmCallsCount: 'Вызовы LLM', + modelCallsCount: 'Вызовы моделей', + successRate: 'Доля успешных', + activeSessions: 'Активные сессии', + last24Hours: 'За последние 24 часа', + filters: { + title: 'Фильтры', + bot: 'Бот', + pipeline: 'Конвейер', + allBots: 'Все боты', + selectBot: 'Выберите бота', + allPipelines: 'Все конвейеры', + selectPipeline: 'Выберите конвейер', + loading: 'Загрузка...', + timeRange: 'Период', + customRange: 'Произвольный период', + from: 'С', + to: 'По', + apply: 'Применить', + reset: 'Сбросить фильтры', + lastHour: 'За последний час', + last6Hours: 'За последние 6 часов', + last24Hours: 'За последние 24 часа', + last7Days: 'За последние 7 дней', + last30Days: 'За последние 30 дней', + }, + tabs: { + messages: 'Записи сообщений', + llmCalls: 'Вызовы LLM', + embeddingCalls: 'Вызовы Embedding', + modelCalls: 'Вызовы моделей', + feedback: 'Обратная связь', + sessions: 'Анализ сессий', + errors: 'Журнал ошибок', + }, + messageList: { + timestamp: 'Время', + bot: 'Бот', + pipeline: 'Конвейер', + message: 'Сообщение', + sessionId: 'ID сессии', + status: 'Статус', + actions: 'Действия', + viewDetails: 'Подробнее', + copyId: 'Копировать ID', + noMessages: 'Сообщения не найдены', + noMessagesDescription: 'Попробуйте изменить фильтры или проверьте позже', + loading: 'Загрузка сообщений...', + loadMore: 'Загрузить ещё', + autoRefresh: 'Автообновление', + platform: 'Роль', + user: 'Пользователь', + level: 'Уровень', + runner: 'Обработчик', + viewConversation: 'Просмотр диалога', + }, + llmCalls: { + title: 'Вызовы LLM', + model: 'Модель', + tokens: 'Токены', + duration: 'Длительность', + cost: 'Стоимость', + noData: 'Вызовы LLM не найдены', + inputTokens: 'Входные токены', + outputTokens: 'Выходные токены', + totalTokens: 'Всего токенов', + avgDuration: 'Средняя длительность', + calls: 'Вызовы', + }, + embeddingCalls: { + title: 'Вызовы Embedding', + model: 'Модель', + tokens: 'Токены', + duration: 'Длительность', + noData: 'Вызовы Embedding не найдены', + promptTokens: 'Токены запроса', + totalTokens: 'Всего токенов', + inputCount: 'Количество входов', + knowledgeBase: 'База знаний', + queryText: 'Запрос', + }, + modelCalls: { + title: 'Вызовы моделей', + llmModel: 'LLM', + embeddingModel: 'Embedding', + embeddingCall: 'Embedding', + retrieveCall: 'Извлечение', + noData: 'Вызовы моделей не найдены', + }, + sessions: { + sessionId: 'ID сессии', + messageCount: 'Сообщений', + duration: 'Длительность', + lastActivity: 'Последняя активность', + noSessions: 'Сессии не найдены', + startTime: 'Время начала', + messageStats: 'Статистика сообщений', + totalMessages: 'Всего сообщений', + successMessages: 'Успешных', + errorMessages: 'С ошибками', + llmStats: 'Статистика LLM', + noData: 'Сессия не найдена', + }, + errors: { + title: 'Ошибки', + errorType: 'Тип ошибки', + errorMessage: 'Сообщение об ошибке', + occurredAt: 'Время возникновения', + noErrors: 'Ошибки не найдены', + stackTrace: 'Стек вызовов', + }, + feedback: { + title: 'Обратная связь', + totalFeedback: 'Всего отзывов', + totalLikes: 'Лайков', + totalDislikes: 'Дизлайков', + satisfactionRate: 'Уровень удовлетворённости', + like: 'Нравится', + dislike: 'Не нравится', + noFeedback: 'Отзывов пока нет', + noFeedbackDescription: 'Отзывы пользователей будут отображаться здесь', + feedbackList: 'Список отзывов', + feedbackContent: 'Содержание отзыва', + contextInfo: 'Контекстная информация', + userId: 'ID пользователя', + messageId: 'ID сообщения', + streamId: 'ID потока', + inaccurateReasons: 'Причины неточности', + platform: 'Платформа', + exportFeedback: 'Экспорт отзывов', + }, + queries: { + title: 'Запросы', + }, + messageDetails: { + noData: 'Нет вызовов LLM или ошибок для этого запроса', + }, + queryVariables: { + title: 'Переменные запроса', + }, + trafficChart: { + title: 'Обзор трафика', + messages: 'Сообщения', + llmCalls: 'Вызовы LLM', + noData: 'Нет данных о трафике', + }, + viewMonitoring: 'Мониторинг', + refreshData: 'Обновить данные', + exportData: 'Экспорт данных', + export: { + title: 'Экспорт данных', + exporting: 'Экспорт...', + messages: 'Сообщения', + llmCalls: 'Вызовы LLM', + embeddingCalls: 'Вызовы Embedding', + errors: 'Журнал ошибок', + sessions: 'Сессии', + }, + }, + limitation: { + maxBotsReached: + 'Достигнуто максимальное количество ботов ({{max}}). Удалите существующего бота перед созданием нового.', + maxPipelinesReached: + 'Достигнуто максимальное количество конвейеров ({{max}}). Удалите существующий конвейер перед созданием нового.', + maxExtensionsReached: + 'Достигнуто максимальное количество расширений ({{max}}). Удалите существующий MCP-сервер или плагин перед добавлением нового.', + }, + wizard: { + sidebarDescription: 'Создать бота с пошаговым руководством', + loading: 'Загрузка мастера...', + loadError: 'Не удалось загрузить данные мастера', + skip: 'Пропустить', + skipConfirmMessage: + 'Вы можете вернуться к мастеру быстрого старта из меню аккаунта позже или создать бота вручную.', + skipConfirmOk: 'ОК', + prev: 'Назад', + next: 'Далее', + finish: 'Создать и развернуть', + confirmCreateBot: 'Подтвердить, создать бота', + createSuccess: 'Конвейер создан и привязан к боту!', + botCreateSuccess: 'Бот успешно создан!', + botSaveSuccess: 'Конфигурация бота сохранена и включена!', + createError: 'Не удалось создать ресурсы', + spaceAuthError: 'Не удалось инициировать авторизацию через Space', + skipSaveError: 'Не удалось сохранить статус пропуска. Повторите попытку.', + completeSaveError: 'Не удалось сохранить статус завершения. Повторите попытку.', + step: { + platform: 'Платформа', + botConfig: 'Настройка бота', + aiEngine: 'ИИ-движок', + done: 'Готово', + }, + platform: { + title: 'Выберите платформу', + description: 'Выберите мессенджер, к которому подключится ваш бот.', + }, + botConfig: { + title: 'Настройте бота', + description: 'Настройте бота и проверьте его работу перед продолжением.', + saveBot: 'Сохранить и включить бота', + resaveBot: 'Пересохранить конфигурацию', + botSaved: + 'Конфигурация бота сохранена и включена. Проверьте журналы для подтверждения подключения.', + logsTitle: 'Журналы бота', + logsDescription: + 'Отслеживайте активность бота для проверки подключения к платформе.', + }, + aiEngine: { + title: 'Выберите ИИ-движок', + description: + 'Выберите ИИ-движок, который будет управлять интеллектом вашего бота.', + }, + spaceBanner: { + message: + 'Подключитесь к LangBot Space для бесплатных пробных кредитов и мгновенной настройки!', + action: 'Авторизация через Space', + }, + config: { + botInfo: 'Информация о боте', + botNamePlaceholder: 'Введите имя бота', + botDescPlaceholder: 'Введите описание бота (необязательно)', + platformConfig: 'Настройка {{platform}}', + aiConfig: 'Настройка {{engine}}', + }, + done: { + title: 'Всё готово!', + description: + 'Ваш бот создан и подключён к конвейеру ИИ. Теперь вы можете управлять им из рабочей панели.', + backToWorkbench: 'Вернуться к рабочей панели', + }, + }, +}; + +export default ruRU;