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;