const ruRU = {
  sidebar: {
    home: 'Главная',
    extensions: 'Расширения',
    installedPlugins: 'Установленные',
    pluginMarket: 'Маркетплейс',
    mcpServers: 'MCP-серверы',
    addExtension: 'Добавить расширение',
    pluginPages: 'Страницы плагинов',
    pluginPagesTooltip:
      'Визуальные страницы, предоставляемые установленными плагинами',
    quickStart: 'Быстрый старт',
    scrollToBottom: 'Прокрутить вниз',
    editionCommunity: 'Сообщество',
    editionCloud: 'Cloud',
  },
  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',
    joinDiscord: 'Присоединиться к Discord',
    create: 'Создать',
    edit: 'Редактировать',
    delete: 'Удалить',
    add: 'Добавить',
    select: 'Выбрать',
    skill: 'Навык',
    cancel: 'Отмена',
    submit: 'Отправить',
    error: 'Ошибка',
    success: 'Успешно',
    save: 'Сохранить',
    saving: 'Сохранение...',
    recommend: 'Рекомендуется',
    start: 'Начать',
    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: 'Войти с аккаунтом LangBot',
    spaceLoginRecommended:
      'Рекомендуется: Используйте официальные стабильные API моделей и облачные сервисы',
    loginLocal: 'Войти с локальной учётной записью',
    loginWithPassword: 'Войти с паролем',
    spaceLoginTitle: 'Войти с аккаунтом LangBot',
    spaceLoginDescription:
      'Отсканируйте QR-код или перейдите по ссылке ниже для авторизации',
    spaceLoginUserCode: 'Ваш код',
    spaceLoginExpires: 'Код истекает через {{seconds}} секунд',
    spaceLoginWaiting: 'Ожидание авторизации...',
    spaceLoginSuccess: 'Авторизация успешна',
    spaceLoginFailed: 'Ошибка входа с аккаунтом LangBot',
    spaceLoginExpired: 'Код авторизации истёк, попробуйте снова',
    spaceLoginCancel: 'Отмена',
    spaceLoginVisitLink: 'Перейти по ссылке',
    spaceLoginProcessing: 'Вход с аккаунтом LangBot',
    spaceLoginProcessingDescription:
      'Пожалуйста, подождите, пока мы завершим вход...',
    spaceLoginSuccessDescription: 'Перенаправление в LangBot...',
    spaceLoginError: 'Ошибка входа',
    spaceLoginNoCode: 'Отсутствует код авторизации',
    backToLogin: 'Вернуться к входу',
    backToHome: 'На главную',
    spaceAccountCannotChangePassword:
      'Для аккаунтов LangBot невозможно изменить пароль здесь',
    theme: 'Тема',
    changePassword: 'Изменить пароль',
    currentPassword: 'Текущий пароль',
    newPassword: 'Новый пароль',
    confirmNewPassword: 'Подтвердите новый пароль',
    enterCurrentPassword: 'Введите текущий пароль',
    enterNewPassword: 'Введите новый пароль',
    enterConfirmPassword: 'Подтвердите новый пароль',
    currentPasswordRequired: 'Текущий пароль обязателен',
    newPasswordRequired: 'Новый пароль обязателен',
    confirmPasswordRequired: 'Подтверждение пароля обязательно',
    passwordsDoNotMatch: 'Пароли не совпадают',
    changePasswordSuccess: 'Пароль успешно изменён',
    changePasswordFailed:
      'Не удалось изменить пароль, проверьте текущий пароль',
    apiIntegration: 'API-интеграция',
    apiIntegrationDescription:
      'Управление 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',
    mcpTab: 'MCP',
    mcpHint:
      'LangBot exposes an MCP (Model Context Protocol) server so AI agents can manage this instance. It uses the same API keys as the Service API.',
    mcpEndpoint: 'MCP Endpoint',
    mcpAuthTitle: 'Authentication',
    mcpAuthDesc:
      'Authenticate with any API key from the API Keys tab, sent as a header:',
    mcpGlobalKeyNote:
      'You can also set a global API key in config.yaml (api.global_api_key) to use without logging in.',
    mcpClientConfigTitle: 'Example MCP client config',
    webhooks: 'Вебхуки',
    createWebhook: 'Создать вебхук',
    webhookName: 'Имя вебхука',
    webhookUrl: 'URL вебхука',
    webhookDescription: 'Описание вебхука',
    webhookEnabled: 'Включён',
    webhookCreated: 'Вебхук успешно создан',
    webhookDeleted: 'Вебхук успешно удалён',
    webhookDeleteConfirm: 'Вы уверены, что хотите удалить этот вебхук?',
    webhookNameRequired: 'Имя вебхука обязательно',
    webhookUrlRequired: 'URL вебхука обязателен',
    noWebhooks: 'Вебхуки не настроены',
    webhookHint:
      'Вебхуки позволяют LangBot отправлять события личных и групповых сообщений во внешние системы',
    actions: 'Действия',
    apiKeyCreatedMessage:
      'Пожалуйста, скопируйте этот API-ключ. Если кнопка не работает, скопируйте вручную.',
    none: 'Нет',
    more: 'Ещё ({{count}})',
    less: 'Свернуть',
    noItems: 'Нет элементов',
    termsOfService: 'Условия обслуживания',

    apiKeyStoredSecurely: 'Secret shown only when created',
  },
  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 запроса',
    scanURL: 'URL сканирования моделей',
    scanURLPlaceholder:
      'Оставьте пустым для использования URL запроса + /models',
    scanURLDescription:
      'Укажите фактический эндпоинт списка моделей, если сканирование моделей использует другой адрес, нежели вызов модели.',
    apiKey: 'API-ключ',
    abilities: 'Возможности',
    selectModelAbilities: 'Выберите возможности модели',
    visionAbility: 'Распознавание изображений',
    functionCallAbility: 'Вызов функций',
    reasoningAbility: 'Рассуждение',
    reasoningLevel: 'Уровень рассуждений',
    reasoningLevels: {
      providerDefault: 'По умолчанию провайдера',
      disabled: 'Выключено',
      enabled: 'Включено',
      minimal: 'Минимальный',
      low: 'Низкий',
      medium: 'Средний',
      high: 'Высокий',
      xhigh: 'Очень высокий',
      max: 'Максимальный',
    },
    contextLength: 'Контекстное окно',
    contextLengthPlaceholder: 'Неизвестно',
    contextLengthInvalid:
      'Контекстное окно должно быть положительным целым числом',
    extraParameters: 'Дополнительные параметры',
    addParameter: 'Добавить параметр',
    keyName: 'Имя ключа',
    type: 'Тип',
    value: 'Значение',
    string: 'Строка',
    number: 'Число',
    boolean: 'Логический',
    object: 'Объект',
    objectJsonPlaceholder: '{ "type": "disabled" }',
    invalidJsonObject: 'Значение должно быть допустимым объектом JSON',
    selectModelProvider: 'Выберите провайдера модели',
    modelProviderDescription:
      'Пожалуйста, введите название модели, предоставленное провайдером',
    modelManufacturer: 'Производитель модели',
    aggregationPlatform: 'Платформа агрегации',
    selfDeployed: 'Самостоятельное развёртывание',
    builtin: 'Встроенный',
    selectModel: 'Выберите модель',
    testSuccess: 'Тест успешен',
    testError: 'Тест не пройден, проверьте конфигурацию модели',
    llmModels: 'LLM-модели',
    localProvider: 'Локальный',
    localProviderDescription: 'Модели, настроенные и управляемые локально',
    spaceProviderDescription:
      'Модели, синхронизированные из вашего аккаунта LangBot',
    spaceDisabledForLocalAccount:
      'Войдите с аккаунтом LangBot, чтобы использовать облачные модели',
    syncModels: 'Синхронизировать',
    syncSuccess:
      'Синхронизация завершена: {{created}} создано, {{updated}} обновлено',
    syncError: 'Ошибка синхронизации: ',
    spaceModelReadOnly: 'Модели Space доступны только для чтения',
    noSpaceModels:
      'Нет моделей Space. Нажмите «Синхронизировать», чтобы загрузить модели из Space.',
    noLocalModels:
      'Нет локальных моделей. Нажмите «Создать», чтобы добавить модель.',
    providerCount: '{{count}} провайдеров',
    addModel: 'Добавить модель',
    manualAdd: 'Вручную',
    scanAdd: 'Сканировать',
    scanModels: 'Сканировать модели',
    scanModelsHint:
      'Прочитайте доступные модели от текущего провайдера, затем выберите, какие из них добавить.',
    scannedModels: 'Отсканированные модели',
    scanDebug: 'Информация об отладке',
    searchScannedModels: 'Поиск отсканированных моделей',
    noScannedModels:
      'Пока нет результатов. Нажмите кнопку выше для сканирования.',
    noScannedModelsMatch: 'Нет подходящих моделей',
    addSelectedModels: 'Добавить выбранные',
    addSelectedModelsSuccess: 'Добавлено моделей: {{count}}',
    selectAll: 'Выбрать все',
    alreadyAdded: 'Уже добавлено',
    addLLMModel: 'Добавить LLM-модель',
    addEmbeddingModel: 'Добавить Embedding-модель',
    provider: 'Провайдер',
    existingProvider: 'Существующий провайдер',
    newProvider: 'Новый провайдер',
    selectProvider: 'Выберите провайдера',
    requester: 'Тип провайдера',
    selectRequester: 'Выберите тип провайдера',
    searchProviders: 'Поиск провайдеров...',
    langbotModelsDescription: 'Облачные модели на базе LangBot Space',
    credits: 'Кредиты',
    loginWithSpace: 'Войти с аккаунтом LangBot',
    loginToUseModels:
      'Войдите с аккаунтом LangBot, чтобы использовать облачные модели',
    noModels: 'Модели не настроены',
    langbotModels: 'Модели LangBot',
    spaceTrialTooltip:
      'Доступны бесплатные пробные кредиты! Войдите с аккаунтом LangBot, чтобы получить доступ к облачным моделям без настройки.',
    unlockModels: 'Войдите для использования',
    editProvider: 'Редактировать провайдера',
    addProvider: 'Добавить провайдера',
    addProviderHint:
      'Добавьте провайдеров для использования моделей из других источников',
    addProviderHintSimple: 'Добавьте провайдеров для использования моделей',
    noProviders: 'Провайдеров пока нет',
    providerName: 'Имя провайдера',
    providerNameRequired: 'Имя провайдера обязательно',
    requesterRequired: 'Тип провайдера обязателен',
    providerSaved: 'Провайдер сохранён',
    providerCreated: 'Провайдер создан',
    providerSaveError: 'Ошибка сохранения провайдера: ',
    providerDeleted: 'Провайдер удалён',
    providerDeleteError: 'Ошибка удаления провайдера: ',
    deleteProviderConfirmation:
      'Вы уверены, что хотите удалить этого провайдера?',
    loadError: 'Не удалось загрузить данные',
    chat: 'Чат',
    embedding: 'Embedding',
    rerank: 'Переранжирование',
    rerankUrlTooltip:
      'Полный URL для эндпоинта переранжирования (напр.: https://dashscope.aliyuncs.com/compatible-api/v1/reranks)',
    rerankPathTooltip:
      'Путь, добавляемый к базовому URL (по умолчанию: rerank, некоторые сервисы используют reranks)',
    modelsCount: '{{count}} модель(ей)',
    expandModels: 'Развернуть',
    collapseModels: 'Свернуть',
    fallback: {
      primary: 'Основная модель',
      fallbackList: 'Резервные модели',
      addFallback: 'Добавить резервную модель',
    },

    ownerMustBindSpace:
      'The Workspace owner must connect a LangBot Account for LangBot Models.',
    usesOwnerSpaceBilling:
      "Uses the Workspace owner's LangBot Account billing and credits.",
  },
  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: 'Ассистент',
    },
    admins: {
      title: 'Admins',
      description:
        "Launchers (person/group IDs) that have admin privilege for this bot's commands",
      addAdmin: 'Add Admin',
      launcherType: 'Type',
      launcherId: 'ID',
      typePerson: 'Person',
      typeGroup: 'Group',
      placeholderId: 'User or group ID',
      addSuccess: 'Admin added',
      addError: 'Failed to add admin: ',
      deleteSuccess: 'Admin removed',
      deleteError: 'Failed to remove admin: ',
      noAdmins: 'No admins configured',
      setAdminTitle: 'Set as admin',
      removeAdminTitle: 'Remove admin',
      adminBadge: 'Admin',
      configureAdmins: 'Manage Admins',
    },
  },
  plugins: {
    title: 'Расширения',
    description:
      'Установка и настройка плагинов для расширения функциональности. Выберите их в настройках конвейера',
    createPlugin: 'Создать плагин',
    editPlugin: 'Редактировать плагин',
    installed: 'Установленные',
    marketplace: 'Маркетплейс',
    arrange: 'Сортировка плагинов',
    install: 'Установить',
    installPlugin: 'Установить плагин',
    newPlugin: 'Новый плагин',
    onlySupportGithub:
      'В настоящее время поддерживается установка только с GitHub',
    enterGithubLink: 'Введите ссылку на GitHub плагина',
    installing: 'Установка плагина...',
    installSuccess: 'Плагин успешно установлен',
    installFailed: 'Ошибка установки плагина:',
    searchPlugin: 'Поиск плагинов',
    sortBy: 'Сортировать по',
    mostStars: 'Больше всего звёзд',
    recentlyAdded: 'Недавно добавленные',
    recentlyUpdated: 'Недавно обновлённые',
    noMatchingPlugins: 'Подходящие плагины не найдены',
    loading: 'Загрузка...',
    getPluginListError: 'Не удалось получить список плагинов:',
    noPluginInstalled: 'Плагины не установлены',
    noExtensionInstalled: 'Расширения не установлены',
    loadingExtensions: 'Загрузка расширений...',
    groupByType: 'Группировать по формату',
    pluginConfig: 'Настройка плагина',
    pluginSort: 'Порядок плагинов',
    pluginSortDescription:
      'Порядок плагинов влияет на очерёдность обработки одного события. Перетащите карточку плагина для сортировки',
    pluginSortSuccess: 'Порядок плагинов обновлён',
    pluginSortError: 'Ошибка сортировки плагинов: ',
    pluginNoConfig: 'У плагина нет параметров настройки.',
    systemDisabled: 'Система плагинов отключена',
    systemDisabledDesc:
      'Система плагинов не включена. Измените конфигурацию согласно документации',
    connectionError: 'Ошибка подключения системы плагинов',
    connectionErrorDesc:
      'Проверьте конфигурацию системы плагинов или обратитесь к администратору.',
    errorDetails: 'Подробности ошибки',
    loadingStatus: 'Проверка статуса системы плагинов...',
    failedToGetStatus: 'Не удалось получить статус системы плагинов',
    pluginSystemNotReady:
      'Система плагинов не готова, невозможно выполнить эту операцию',
    debugInfo: 'Отладочная информация',
    debugInfoTitle: 'Отладочная информация плагина',
    debugUrl: 'URL для отладки',
    debugKey: 'Ключ отладки',
    debugKeyExpires: 'Смена в {{time}}; у каждого Workspace свой ключ',
    noDebugKey: '(Не задан)',
    debugKeyDisabled: 'Учетные данные отладки временно недоступны',
    boxStatusTitle: 'Box Runtime',
    boxStatus: 'Статус',
    boxConnected: 'Подключено',
    boxUnavailable: 'Недоступно',
    boxBackend: 'Бэкенд',
    boxProfile: 'Профиль',
    boxSandboxes: 'Песочницы',
    boxErrors: 'Ошибки',
    boxSessionImage: 'Образ',
    boxSessionBackend: 'Бэкенд',
    boxSessionResources: 'Ресурсы',
    boxSessionNetwork: 'Сеть',
    boxStatusLoadFailed: 'Не удалось загрузить статус Box',
    failedToGetDebugInfo: 'Не удалось получить отладочную информацию',
    copiedToClipboard: 'Скопировано в буфер обмена',
    deleting: 'Удаление...',
    deletePlugin: 'Удалить плагин',
    cancel: 'Отмена',
    saveConfig: 'Сохранить настройки',
    saving: 'Сохранение...',
    confirmDeletePlugin:
      'Вы уверены, что хотите удалить плагин ({{author}}/{{name}})?',
    deleteDataCheckbox:
      'Также удалить конфигурацию плагина и постоянное хранилище',
    confirmDelete: 'Подтвердить удаление',
    deleteError: 'Ошибка удаления: ',
    close: 'Закрыть',
    deleteConfirm: 'Подтверждение удаления',
    deleteSuccess: 'Удаление успешно',
    dangerZone: 'Опасная зона',
    dangerZoneDescription: 'Необратимые и разрушительные действия',
    modifyFailed: 'Ошибка изменения: ',
    componentName: {
      Tool: 'Инструмент',
      EventListener: 'Обработчик событий',
      Command: 'Команда',
      KnowledgeEngine: 'Движок знаний',
      Parser: 'Парсер',
      Page: 'Страница',
    },
    uploadLocal: 'Загрузить локально',
    debugging: 'Отладка',
    uploadLocalPlugin: 'Загрузить локальный плагин',
    localPreview: {
      title: 'Предпросмотр локального пакета плагина',
      unpacking: 'Распаковка пакета для предпросмотра...',
      unpackComplete: 'Предпросмотр пакета готов',
      failed: 'Не удалось выполнить предпросмотр пакета',
      pluginInfo: 'Информация о плагине',
      packageInfo: 'Информация о пакете',
      name: 'Название',
      author: 'Автор',
      version: 'Версия',
      fileCount: 'Файлы',
      dependencies: 'Зависимости',
      components: 'Компоненты',
      ready: 'Пакет плагина распакован. Подтвердите, чтобы начать установку.',
    },
    dragToUpload: 'Перетащите файл плагина сюда для загрузки',
    unsupportedFileType:
      'Неподдерживаемый тип файла, поддерживаются только файлы .lbpkg и .zip',
    uploadingPlugin: 'Загрузка плагина...',
    uploadSuccess: 'Загрузка успешна',
    uploadFailed: 'Ошибка загрузки',
    selectFileToUpload: 'Выберите файл плагина для загрузки',
    askConfirm:
      'Вы уверены, что хотите установить плагин "{{name}}" ({{version}})?',
    askConfirmNoVersion: 'Вы уверены, что хотите установить плагин "{{name}}"?',
    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',
    tabDocs: 'Документация',
    tabLogs: 'Журналы',
    logsLevelAll: 'Все уровни',
    logsRefresh: 'Обновить',
    logsAutoRefresh: 'Автообновление',
    logsEmpty:
      'Журналов пока нет. Здесь появятся логи, выводимые плагином через logger.',
    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: 'Нет задач установки',
      titlePlugin: 'Установка плагина {{name}}',
      titleMCP: 'Установка сервера MCP {{name}}',
      titleSkill: 'Установка навыка {{name}}',
      installCompletePlugin: 'Плагин успешно установлен',
      installCompleteMCP: 'Сервер MCP успешно установлен',
      installCompleteSkill: 'Навык успешно установлен',
    },
    uploadPluginOnly: 'Поддерживаются только пакеты плагинов .lbpkg',
  },
  market: {
    searchPlaceholder: 'Поиск плагинов...',
    searchPlaceholderCount:
      'Поиск среди {{count}} расширений, возможностей или сценариев...',
    searchResults: 'Найдено {{count}} расширений',
    totalPlugins: 'Всего {{count}} расширений',
    noPlugins: 'Нет доступных плагинов',
    noResults: 'Подходящие плагины не найдены',
    loadingMore: 'Загрузка ещё...',
    loading: 'Загрузка...',
    allLoaded: 'Все плагины отображены',
    allLoadedCount: 'Показаны все {{count}} расширений',
    install: 'Установить',
    installConfirm:
      'Вы уверены, что хотите установить плагин "{{name}}" ({{version}})?',
    downloadComplete: 'Плагин "{{name}}" загружен',
    installFailed: 'Ошибка установки, попробуйте позже',
    loadFailed: 'Не удалось получить список плагинов, попробуйте позже',
    noDescription: 'Описание отсутствует',
    recommendation: {
      pause: 'Приостановить авто-прокрутку',
      resume: 'Возобновить авто-прокрутку',
    },
    notFound: 'Информация о плагине не найдена',
    sortBy: 'Сортировать по',
    sort: {
      hottest: 'По популярности',
      recentlyAdded: 'Недавно добавленные',
      recentlyUpdated: 'Недавно обновлённые',
      mostDownloads: 'Больше всего загрузок',
      leastDownloads: 'Меньше всего загрузок',
    },
    downloads: 'загрузок',
    download: 'Скачать',
    like: 'Нравится',
    unlike: 'Убрать отметку',
    likeFailed: 'Не удалось обновить отметку. Повторите попытку.',
    repository: 'Репозиторий',
    downloadFailed: 'Ошибка загрузки',
    noReadme: 'Этот плагин не предоставляет документацию README',
    description: 'Описание',
    tagLabel: 'Теги',
    submissionTitle: 'У вас есть плагин на рассмотрении: {{name}}',
    submissionPending: 'Ваш плагин находится на рассмотрении: {{name}}',
    submissionApproved: 'Ваш плагин одобрен: {{name}}',
    submissionRejected: 'Ваш плагин отклонён: {{name}}',
    clickToRevoke: 'Отозвать',
    revokeSuccess: 'Успешно отозвано',
    revokeFailed: 'Ошибка отзыва',
    submissionDetails: 'Детали заявки на плагин',
    markAsRead: 'Отметить как прочитанное',
    markAsReadSuccess: 'Отмечено как прочитанное',
    markAsReadFailed: 'Не удалось отметить как прочитанное',
    filterByComponent: 'Компонент плагина',
    filterByComponentHint:
      'Типы возможностей, которые предоставляет плагин — инструмент (Tool), команда (Command), обработчик событий (EventListener) и т. д., — расширяющие функции LangBot. Фильтруйте по компоненту, чтобы видеть только плагины с нужной возможностью.',
    allComponents: 'Все компоненты',
    componentName: {
      Tool: 'Инструмент',
      EventListener: 'Обработчик событий',
      Command: 'Команда',
      KnowledgeEngine: 'Движок знаний',
      Parser: 'Парсер',
      Page: 'Страница',
    },
    filterByType: 'Тип',
    allTypes: 'Все типы',
    typePlugin: 'Плагин',
    typeMCP: 'MCP',
    typeSkill: 'Навык',
    requestPlugin: 'Запросить плагин',
    viewDetails: 'Подробнее',
    deprecated: 'Устаревший',
    deprecatedTooltip:
      'Пожалуйста, установите соответствующий плагин движка знаний.',
    filters: {
      allFormats: 'Все типы',
      more: 'Ещё',
      advancedTitle: 'Расширенные фильтры',
      advancedDescription: 'Фильтр по типу расширения',
      technicalType: 'Технический тип',
    },
    allExtensions: 'Все расширения',
    tags: {
      filterByTags: 'Фильтр по тегам',
      selected: 'выбрано',
      selectTags: 'Выберите теги',
      clearAll: 'Очистить всё',
      noTags: 'Нет доступных тегов',
    },
    installCard: 'Установить {{name}}',
  },
  mcp: {
    title: 'MCP',
    createServer: 'Добавить MCP-сервер',
    addMCPServer: 'Добавить MCP-сервер',
    editServer: 'Редактировать MCP-сервер',
    deleteServer: 'Удалить MCP-сервер',
    confirmDeleteServer: 'Вы уверены, что хотите удалить этот MCP-сервер?',
    confirmDeleteTitle: 'Удаление MCP-сервера',
    getServerListError: 'Не удалось получить список MCP-серверов: ',
    serverName: 'Имя сервера',
    serverMode: 'Режим подключения',
    selectMode: 'Выберите режим',
    stdio: 'Режим Stdio',
    sse: 'Режим SSE',
    http: 'Режим HTTP',
    local: 'Локально (Stdio)',
    remote: 'Удалённо',
    localModeDescription:
      'Запуск MCP-сервера локально как подпроцесса внутри песочницы Box.',
    remoteModeDescription:
      'Подключение к удалённому MCP-серверу по URL. Транспорт (Streamable HTTP или SSE) определяется автоматически.',
    remoteUrlPlaceholder: 'https://example.com/mcp',
    remoteUrlDescription:
      'Вставьте URL MCP-сервера. Поддерживаются как Streamable HTTP, так и устаревшие SSE-эндпоинты.',
    noServerInstalled: 'MCP-серверы не настроены',
    serverNameRequired: 'Имя сервера не может быть пустым',
    commandRequired: 'Команда не может быть пустой',
    urlRequired: 'URL не может быть пустым',
    timeoutMustBePositive: 'Таймаут должен быть положительным числом',
    command: 'Команда',
    args: 'Аргументы',
    env: 'Переменные окружения',
    url: 'URL',
    headers: 'Заголовки',
    timeout: 'Таймаут',
    toolCallTimeout: 'Таймаут вызова инструмента (секунды)',
    toolCallTimeoutDescription:
      'Максимальное ожидание одного вызова. 0 отключает ограничение. По умолчанию 300 секунд.',
    addArgument: 'Добавить аргумент',
    addEnvVar: 'Добавить переменную окружения',
    addHeader: 'Добавить заголовок',
    keyName: 'Имя ключа',
    value: 'Значение',
    testing: 'Тестирование...',
    connecting: 'Подключение...',
    testSuccess: 'Тест успешен',
    testFailed: 'Тест не пройден: ',
    testError: 'Ошибка тестирования',
    refreshSuccess: 'Обновление успешно',
    refreshFailed: 'Ошибка обновления: ',
    connectionSuccess: 'Подключение успешно',
    connectionFailed: 'Не удалось подключиться, проверьте URL',
    connectionFailedStatus: 'Ошибка подключения',
    boxDisabledStdioRefused:
      'MCP-серверы в режиме stdio требуют песочницу Box, которая отключена в конфигурации (box.enabled = false).',
    boxUnavailableStdioRefused:
      'MCP-серверы в режиме stdio требуют песочницу Box, которая сейчас недоступна.',
    boxStdioRefusedSuggestion:
      'Включите Box (box.enabled = true) и убедитесь, что среда работает, либо переключите этот сервер в режим http/sse.',
    boxRequired: 'требуется Box',
    disabledByPolicy: 'отключено политикой',
    stdioDisabledByPolicy:
      'Stdio MCP отключён в этом развёртывании. Используйте удалённый MCP-сервер.',
    stdioBlockedByBoxToast:
      'Сохранить MCP в режиме stdio нельзя: песочница Box отключена или недоступна. Включите Box либо выберите режим http/sse.',
    toolsFound: 'инструментов',
    unknownError: 'Неизвестная ошибка',
    noToolsFound: 'Инструменты не найдены',
    noResourcesFound: 'Ресурсы не найдены',
    tabTools: 'Инструменты',
    tabResources: 'Ресурсы',
    tabDocs: 'Документация',
    tabLogs: 'Журнал',
    logsLevelAll: 'Все уровни',
    logsRefresh: 'Обновить',
    logsAutoRefresh: 'Автообновление',
    logsEmpty:
      'Журналов пока нет. Здесь будут отображаться журналы выполнения MCP-сервера.',
    noReadme: 'Документация отсутствует',
    parseResultFailed: 'Не удалось разобрать результат теста',
    noResultReturned: 'Тест не вернул результат',
    getTaskFailed: 'Не удалось получить статус задачи',
    noTaskId: 'Не удалось получить ID задачи',
    deleteSuccess: 'Успешно удалено',
    deleteFailed: 'Ошибка удаления: ',
    deleteError: 'Ошибка удаления: ',
    saveSuccess: 'Успешно сохранено',
    saveError: 'Ошибка сохранения: ',
    createSuccess: 'Успешно создано',
    createFailed: 'Ошибка создания: ',
    createError: 'Ошибка создания: ',
    loadFailed: 'Ошибка загрузки',
    modifyFailed: 'Ошибка изменения: ',
    toolCount: 'Инструменты: {{count}}',
    parameterCount: 'Параметры: {{count}}',
    noParameters: 'Нет параметров',
    resourceCount: 'Ресурсы: {{count}}',
    resourceBinaryContent: 'Двоичное содержимое (невозможно отобразить)',
    resourceBinaryOmitted:
      'Двоичное содержимое опущено согласно политике безопасности ресурсов',
    resourceTruncated: 'Содержимое усечено по лимитам байтов или токенов',
    resourceReadFailed: 'Не удалось прочитать содержимое ресурса',
    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-серверы',
      mcpResourcesTitle: 'MCP-ресурсы',
      noMCPServersSelected: 'MCP-серверы не выбраны',
      noMCPResourcesAvailable: 'Нет доступных MCP-ресурсов',
      addMCPServer: 'Добавить MCP-сервер',
      selectMCPServers: 'Выберите MCP-серверы',
      enableMCPResourceAgentRead: 'Разрешить модели чтение',
      toolCount: '{{count}} инструментов',
      noPluginsInstalled: 'Нет установленных плагинов',
      noMCPServersConfigured: 'Нет настроенных MCP-серверов',
      selectAll: 'Выбрать все',
      enableAllPlugins: 'Включить все плагины',
      enableAllMCPServers: 'Включить все MCP-серверы',
      allPluginsEnabled: 'Все плагины включены',
      allMCPServersEnabled: 'Все MCP-серверы включены',
      enableAllSkills: 'Включить все навыки',
      allSkillsEnabled: 'Все навыки включены',
      skillsTitle: 'Навыки',
      noSkillsSelected: 'Навыки не выбраны',
      addSkill: 'Добавить навык',
      selectSkills: 'Выбрать навыки',
      noSkillsAvailable: 'Нет доступных навыков',
      mcpServersScopeTooltip:
        'Здесь задаётся только привязка MCP-серверов к конвейеру. Конкретные MCP-инструменты и ресурсы выбираются в AI Feature > Local Agent.',
      enableAllMCPServersTooltip:
        'Если включено, все настроенные и включённые MCP-серверы станут кандидатами для инструментов и ресурсов MCP в AI Feature.',
    },
    localAgent: {
      toolsTitle: 'Инструменты',
      toolsDescription:
        'Выберите инструменты плагинов, MCP и встроенные инструменты для этого Local Agent.',
      toolsScopeTooltip:
        'MCP-инструменты берутся только из MCP-серверов, привязанных в Расширениях. Чтобы добавить источник, сначала привяжите там сервер.',
      enableAllTools: 'Включить все инструменты',
      allToolsEnabled: 'Все доступные инструменты включены',
      noToolsSelected: 'Инструменты не выбраны',
      editTools: 'Редактировать инструменты',
      builtinTools: 'Встроенные инструменты',
      pluginTools: 'Инструменты плагинов',
      skillTools: 'Инструменты навыков',
      mcpTools: 'Инструменты MCP',
      mcpToolsScopeTooltip:
        'Здесь показаны только инструменты MCP-серверов, разрешённых сейчас в Расширениях.',
      skillToolsScopeTooltip:
        'Инструменты навыков доступны, когда сервис навыков LangBot и backend песочницы Box готовы. Они позволяют агенту активировать или регистрировать навыки.',
      selectTools: 'Выбрать инструменты',
      resourcesTitle: 'Ресурсы',
      resourcesDescription:
        'Выберите MCP-ресурсы и базы знаний для этого Local Agent.',
      knowledgeBases: 'Базы знаний',
      mcpResources: 'MCP-ресурсы',
      mcpResourcesScopeTooltip:
        'Здесь показаны только ресурсы MCP-серверов, разрешённых сейчас в Расширениях.',
      enableMCPResourceRead: 'Разрешить модели читать MCP-ресурсы',
      mcpResourceReadTooltip:
        'Если выключено, выбранные MCP-ресурсы не будут добавляться в контекст модели.',
      noMCPResourcesAvailable: 'Нет доступных MCP-ресурсов',
      selectKnowledgeBases: 'Выбрать базы знаний',
    },
    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: 'только чтение в режиме редактирования',
    engineSettingsInvalid:
      'Настройки движка недействительны, проверьте обязательные поля',
    retrievalSettingsInvalid:
      'Настройки извлечения недействительны, проверьте обязательные поля',
    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: 'Инициализация с аккаунтом LangBot',
    spaceRecommended:
      'Рекомендуется: Используйте официальные стабильные API моделей и облачные сервисы',
    spaceInfoTip1:
      'Space предоставляет единую службу аутентификации без загрузки конфиденциальной информации.',
    spaceInfoTip2:
      'Вход с аккаунтом LangBot даёт доступ к моделям 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: 'Настройки аккаунта',
    settingsDescription: 'Управление паролем и связанными аккаунтами',
    setPassword: 'Установить пароль',
    passwordSetSuccess: 'Пароль успешно установлен',
    passwordStatus: 'Локальный пароль',
    passwordSet: 'Установлен',
    passwordNotSet: 'Не установлен',
    passwordSetDescription:
      'Пароль установлен, вы можете входить с email и паролем',
    spaceStatus: 'Аккаунт LangBot',
    spaceBound: 'Привязан',
    spaceNotBound: 'Не привязан',
    spaceBoundDescription:
      'Аккаунт LangBot привязан, доступны официальные API моделей и облачные сервисы',
    bindSpace: 'Привязать аккаунт LangBot',
    bindSpaceDescription:
      'Привяжите для использования официальных API моделей и облачных сервисов',
    bindSpaceButton: 'Привязать',
    bindSpaceConfirmTitle: 'Подтверждение привязки',
    bindSpaceConfirmDescription:
      'Вы собираетесь привязать локальный экземпляр к аккаунту LangBot',
    bindSpaceWarning:
      'После привязки ваш email для входа будет изменён с {{localEmail}} на email аккаунта LangBot.',
    bindSpaceSuccess: 'Аккаунт LangBot успешно привязан',
    bindSpaceFailed: 'Не удалось привязать аккаунт LangBot',
    bindSpaceInvalidState:
      'Недействительный запрос привязки. Повторите попытку из настроек аккаунта.',
    setPasswordHint: 'Установите пароль для входа с email и паролем',
    spaceEmailMismatch:
      'Email входа с аккаунтом LangBot не совпадает с email локальной учётной записи',

    space_account_not_registeredTitle: 'Account not registered',
    space_account_not_registered:
      'No local account is registered for this LangBot Account email. Ask the Workspace owner for an invitation.',
    space_account_binding_requiredTitle: 'LangBot Account connection required',
    space_account_binding_required:
      'This local account must connect a LangBot Account from Account settings before using LangBot Account login.',
  },
  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: 'Вызовы моделей',
      tokens: 'Мониторинг токенов',
      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: 'Просмотр диалога',
      turns: '{{count}} диалоговых ходов',
      userMessage: 'Пользователь',
      noUserMessage: 'Ввод пользователя не записан',
      assistantMessage: 'Ассистент',
      assistantMessageCount: 'Ассистент +{{count}}',
      noAssistantMessage: 'Ответ ассистента не записан',
      messageCount: 'Сообщения',
      conversationTrace: 'Ход диалога',
      noLlmCalls: 'Вызовы модели не записаны',
      roles: {
        user: 'Пользователь',
        assistant: 'Ассистент',
        message: 'Сообщение',
      },
    },
    llmCalls: {
      title: 'Вызовы LLM',
      model: 'Модель',
      tokens: 'Токены',
      duration: 'Длительность',
      cost: 'Стоимость',
      noData: 'Вызовы LLM не найдены',
      inputTokens: 'Входные токены',
      outputTokens: 'Выходные токены',
      totalTokens: 'Всего токенов',
      avgDuration: 'Средняя длительность',
      calls: 'Вызовы',
    },
    toolCalls: {
      title: 'Вызовы инструментов',
      totalCalls: 'Вызовы',
      duration: 'Длительность инструментов',
      errorCalls: 'Неудачные вызовы',
      arguments: 'Аргументы',
      result: 'Результат',
      noToolCalls: 'Вызовы инструментов не записаны',
    },
    tokens: {
      totalTokens: 'Всего токенов',
      inputTokens: 'Входные токены',
      outputTokens: 'Выходные токены',
      avgPerCall: 'Сред. / вызов',
      throughput: 'Пропускная способность',
      tokensPerSec: 'токенов/сек',
      errorCalls: 'Неуспешные вызовы',
      acrossCalls: 'за {{count}} вызов(ов)',
      ofTotal: 'из {{count}} всего',
      usageOverTime: 'Использование токенов со временем',
      byModel: 'По модели',
      model: 'Модель',
      calls: 'Вызовы',
      avgLatency: 'Сред. задержка',
      noData: 'Нет использования токенов в выбранном диапазоне времени',
      loadError: 'Не удалось загрузить статистику токенов: {{error}}',
      zeroTokenWarning:
        '{{count}} успешный(ых) вызов(ов) сообщили о нулевом использовании токенов. Обычно это означает, что вышестоящий провайдер не вернул информацию об использовании — проверьте настройки провайдера модели.',
      bucket: {
        hour: 'По часам',
        day: 'По дням',
      },
    },
    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: 'Экспорт отзывов',
      description:
        'Tell us what went wrong or what could be better. Instance UUID and login account are included for diagnosis.',
      placeholder: 'Describe your suggestion, issue, or reproduction steps...',
      attachImage: 'Add image',
      screenshot: 'Screenshot',
      submit: 'Submit feedback',
      privacyHint:
        'Do not include secrets, passwords, or private chat content.',
      contentRequired: 'Please enter feedback first',
      imageOnly: 'Only image attachments are supported',
      imageTooLarge: 'Each image must be under 1MB',
      tooManyImages: 'You can attach up to 3 images',
      screenshotFailed: 'Screenshot failed. Try pasting or uploading an image.',
      submitSuccess: 'Feedback submitted. Thanks!',
      submitFailed: 'Failed to submit feedback. Please try again later.',
      removeImage: 'Remove image',
    },
    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: 'Сессии',
      feedback: 'Отзывы пользователей',
    },
    systemStatus: 'Состояние системы',
    pluginRuntime: 'Среда плагинов',
    boxRuntime: 'Среда Box',
    connected: 'Подключено',
    disconnected: 'Отключено',
    disabled: 'Отключено',
    statusDetail: 'Статус',
    pluginDisabled: 'Система плагинов отключена',
    boxDisabled:
      'Песочница Box отключена в конфигурации — инструменты песочницы, добавление/редактирование навыков и stdio MCP недоступны',
    boxUnavailable:
      'Песочница Box недоступна — инструменты песочницы, добавление/редактирование навыков и stdio MCP недоступны',
    boxRequiredHint:
      'Для этой функции требуется среда Box. Включите её в конфигурации (box.enabled = true) и убедитесь, что соединение работает.',
    boxBackend: 'Бэкенд',
    boxProfile: 'Профиль',
    boxSandboxes: 'Песочницы',
    boxSessionCreated: 'Создано',
    boxSessionLastUsed: 'Последнее использование',
  },
  settingsDialog: {
    title: 'Настройки',
    nav: {
      models: 'Модели',
      api: 'API',
      storage: 'Хранилище',
      account: 'Аккаунт',

      workspace: 'Workspace',
    },
  },
  storageAnalysis: {
    title: 'Анализ хранилища',
    description: 'Проверьте использование хранилища и кандидатов на очистку',
    openDialog: 'Открыть анализ',
    dialogTitle: 'Анализ хранилища',
    generatedAt: 'Создано {{time}}',
    loading: 'Загрузка...',
    refresh: 'Обновить',
    totalSize: 'Общий размер',
    binaryStorage: 'Бинарное хранилище плагинов',
    uploadCleanup: 'Просроченные загрузки',
    logCleanup: 'Просроченные журналы',
    sections: 'Разделы хранилища',
    monitoringTables: 'Таблицы мониторинга',
    runtimeTasks: 'Задачи runtime',
    cleanupPolicy: 'Политика очистки',
    uploadRetention: 'Хранение загрузок',
    logRetention: 'Хранение журналов',
    databaseType: 'Тип базы данных',
    days: 'дн.',
    missing: 'Нет',
    expiredUploads: 'Просроченные загрузки',
    expiredLogs: 'Просроченные журналы',
    noExpiredUploads: 'Нет просроченных загруженных файлов',
    noExpiredLogs: 'Нет просроченных журналов',
    sectionNames: {
      database: 'База данных',
      logs: 'Журналы',
      storage: 'Загруженные файлы',
      vector_store: 'Векторное хранилище',
      plugins: 'Плагины',
      mcp: 'MCP',
      temp: 'Временные файлы',
    },
  },
  limitation: {
    maxBotsReached:
      'Достигнуто максимальное количество ботов ({{max}}). Удалите существующего бота перед созданием нового.',
    maxPipelinesReached:
      'Достигнуто максимальное количество конвейеров ({{max}}). Удалите существующий конвейер перед созданием нового.',
    maxExtensionsReached:
      'Достигнуто максимальное количество расширений ({{max}}). Удалите существующий MCP-сервер или плагин перед добавлением нового.',
    quotaLoadingTooltip:
      'Данные об использовании рабочего пространства загружаются. Подождите перед созданием ресурса.',
    quotaCheckFailed:
      'Не удалось проверить текущую квоту рабочего пространства. Повторите попытку.',
    createDisabledTooltip:
      'Достигнут лимит {{resource}} ({{max}}) для этого рабочего пространства. Удалите существующий ресурс перед созданием нового.',
  },
  wizard: {
    sidebarDescription: 'Создать бота с пошаговым руководством',
    loading: 'Загрузка мастера...',
    loadError: 'Не удалось загрузить данные мастера',
    skip: 'Пропустить',
    skipConfirmMessage:
      'Вы можете вернуться к мастеру быстрого старта из меню аккаунта позже или создать бота вручную.',
    skipConfirmOk: 'ОК',
    prev: 'Назад',
    next: 'Далее',
    finish: 'Создать и развернуть',
    confirmCreateBot: 'Подтвердить, создать бота',
    createSuccess: 'Конвейер создан и привязан к боту!',
    botCreateSuccess: 'Бот успешно создан!',
    botSaveSuccess: 'Конфигурация бота сохранена и включена!',
    createError: 'Не удалось создать ресурсы',
    skipSaveError: 'Не удалось сохранить статус пропуска. Повторите попытку.',
    completeSaveError:
      'Не удалось сохранить статус завершения. Повторите попытку.',
    step: {
      platform: 'Платформа',
      botConfig: 'Настройка бота',
      aiEngine: 'ИИ-движок',
      done: 'Готово',
    },
    platform: {
      title: 'Выберите платформу',
      description: 'Выберите мессенджер, к которому подключится ваш бот.',
    },
    botConfig: {
      title: 'Настройте бота',
      description: 'Настройте бота и проверьте его работу перед продолжением.',
      saveBot: 'Сохранить и включить бота',
      resaveBot: 'Пересохранить конфигурацию',
      botSaved:
        'Конфигурация бота сохранена и включена. Проверьте журналы для подтверждения подключения.',
      waitingForMessage:
        'Бот включён. Отправьте ему сообщение из мессенджера, чтобы продолжить.',
      messageReceived:
        'Бот получил сообщение. Можно перейти к следующему шагу.',
      messageReceivedLocalAccountWarning:
        'Подключение бота настроено правильно, и сообщение получено. Поскольку вход выполнен не через аккаунт LangBot, вызовы модели могут завершаться ошибкой; перейдите к следующему шагу, чтобы добавить собственную модель.',
      pageBotTestPrompt:
        'Бот для веб-страницы включён. Нажмите на значок чата в правом нижнем углу и отправьте сообщение, чтобы проверить полный сценарий диалога.',
      pageBotTestNotice:
        'Только для тестирования. Встройте код в настоящую внешнюю веб-страницу.',
      webhookTestPrompt:
        'URL обратного вызова готов. Настройте его на внешней платформе, затем отправьте боту настоящее сообщение.',
      httpTestPrompt:
        'HTTP-бот включён. Отправьте сюда настоящее входящее сообщение, чтобы проверить подключение.',
      httpTestDefaultMessage:
        'Здравствуйте, это тестовое сообщение подключения.',
      sendHttpTest: 'Отправить тестовое сообщение',
      httpTestAccepted:
        'Тестовое сообщение принято. Оно скоро появится в журнале.',
      httpTestMissingSecret:
        'Введите секрет подписи входящих запросов и сначала сохраните конфигурацию.',
      httpTestFailed: 'Не удалось отправить тестовое сообщение: {{error}}',
      logsTitle: 'Журналы бота',
      logsDescription:
        'Отслеживайте активность бота для проверки подключения к платформе.',
    },
    aiEngine: {
      title: 'Настройте ИИ-движок',
      description:
        'Выберите ИИ-движок, который будет управлять интеллектом вашего бота.',
      optionalDescription:
        'Этот шаг необязателен. Выберите, как продолжить настройку текущего Agent.',
      externalTitle: 'Подключить Agent внешней платформы',
      externalDescription:
        'Подключите Dify, n8n, Coze или другую платформу и замените Pipeline бота.',
      ownModelTitle: 'Использовать собственную модель',
      ownModelDescription:
        'Добавьте провайдера, затем найдите модель автоматически или укажите её вручную, чтобы завершить настройку.',
      ownModelSetupTitle: 'Добавьте собственную модель',
      ownModelSetupDescription:
        'Добавьте провайдера моделей. Модели чата будут найдены автоматически, либо можно вручную указать ID модели.',
      addProviderTitle: 'Добавить провайдера',
      addProviderDescription:
        'Введите данные провайдера и API-ключ для подключения и поиска моделей.',
      selectModelTitle: 'Выберите модель',
      selectScannedModelTitle: 'Выберите модель',
      selectScannedModelDescription:
        'Выбранная модель станет основной моделью нового Pipeline, и бот переключится на неё.',
      scanModelMode: 'Найти модели',
      manualModelMode: 'Добавить вручную',
      scanningModels: 'Поиск доступных моделей…',
      noScannedModels:
        'Доступные модели чата не найдены. Проверьте конфигурацию провайдера.',
      scanModelsFailed:
        'Не удалось найти модели. Проверьте URL и API-ключ, затем повторите попытку.',
      manualFallbackFailed:
        'Автоматический поиск не удался. Введите ID модели, поддерживаемой провайдером.',
      manualFallbackEmpty:
        'Модели не найдены. Введите ID модели, поддерживаемой провайдером.',
      manualModelId: 'ID модели',
      manualModelIdPlaceholder: 'Например: gpt-4o',
      manualModelIdDescription:
        'Введите параметр модели, используемый в запросах к модели.',
      manualModelOptions: 'Дополнительные возможности модели',
      editProvider: 'Изменить провайдера',
      rescanModels: 'Повторить поиск моделей',
      moreFeaturesTitle: 'Добавить возможности Agent',
      moreFeaturesDescription:
        'Откройте рабочую панель, чтобы добавить инструменты, базы знаний и другие возможности только что автоматически созданному Agent.',
      runnerDescription:
        'Выберите Runner для внешнего Agent и настройте подключение.',
      backToChoices: 'Вернуться к вариантам',
      createExternal: 'Создать и привязать',
      finishWithModel: 'Использовать выбранную модель и завершить',
      openWorkbench: 'Открыть рабочую панель',
    },
    config: {
      botInfo: 'Информация о боте',
      botNamePlaceholder: 'Введите имя бота',
      botDescPlaceholder: 'Введите описание бота (необязательно)',
      platformConfig: 'Настройка {{platform}}',
      aiConfig: 'Настройка {{engine}}',
    },
    done: {
      title: 'Всё готово!',
      description:
        'Ваш бот создан и подключён к конвейеру ИИ. Теперь вы можете управлять им из рабочей панели.',
      backToWorkbench: 'Вернуться к рабочей панели',
    },
  },
  errorPage: {
    unexpectedError: 'Что-то пошло не так',
    unexpectedErrorDescription:
      'Произошла непредвиденная ошибка. Повторите попытку позже.',
    notFound: 'Страница не найдена',
    notFoundDescription:
      'Страница, которую вы ищете, не существует или была перемещена.',
    backendUnavailableStatus: 'Бэкенд недоступен',
    goBack: 'Назад',
    backToHome: 'На главную',
    backToLogin: 'Вернуться к входу',
    retrying: 'Повторяем',
    retryFailed:
      'По-прежнему не удается подключиться к бэкенду. Запустите сервис и повторите попытку.',
  },
  feishu: {
    createApp: 'Создать приложение Feishu в один клик',
    scanQRCode:
      'Отсканируйте QR-код ниже в Feishu, чтобы авторизоваться и автоматически создать приложение',
    waitingForScan: 'Ожидание сканирования',
    createSuccess:
      'Приложение успешно создано! Учётные данные заполнены автоматически',
    createFailed: 'Не удалось создать приложение',
    connecting: 'Подключение к сервису Feishu...',
    expired: 'Срок действия QR-кода истёк. Повторите попытку',
    denied: 'Пользователь отклонил авторизацию',
    connectionLost: 'Соединение потеряно. Повторите попытку',
    reconnecting: 'Переподключение...',
    retry: 'Повторить',
  },
  weixin: {
    scanLogin: 'Войти в WeChat по QR-коду',
    scanQRCode:
      'Отсканируйте QR-код ниже в WeChat, чтобы авторизоваться и автоматически заполнить токен',
    loginSuccess: 'Вход выполнен успешно! Токен заполнен автоматически',
    loginFailed: 'Не удалось выполнить вход',
    connecting: 'Подключение к сервису WeChat...',
    waitingForScan: 'Ожидание сканирования',
    retry: 'Повторить',
  },
  dingtalk: {
    createApp: 'Создать приложение DingTalk в один клик',
    scanQRCode:
      'Отсканируйте QR-код ниже в DingTalk, чтобы авторизоваться и автоматически создать приложение',
    waitingForScan: 'Ожидание сканирования',
    createSuccess:
      'Приложение успешно создано! Учётные данные заполнены автоматически',
    createFailed: 'Не удалось создать приложение',
    connecting: 'Подключение к сервису DingTalk...',
    retry: 'Повторить',
    robotCodeNote:
      'Код робота нельзя получить автоматически. Перейдите в консоль разработчика DingTalk > Настройки робота и скопируйте его вручную. Он нужен для таких функций, как распознавание изображений и загрузка файлов.',
  },
  wecombot: {
    createBot: 'Создать бота WeCom в один клик',
    scanQRCode:
      'Отсканируйте QR-код ниже в WeCom, чтобы авторизоваться и автоматически создать бота',
    waitingForScan: 'Ожидание сканирования',
    createSuccess: 'Бот успешно создан! Учётные данные заполнены автоматически',
    createFailed: 'Не удалось создать бота',
    connecting: 'Подключение к сервису WeCom...',
    retry: 'Повторить',
    robotNameNote:
      'Имя бота нельзя получить автоматически. Пожалуйста, введите его вручную.',
  },
  qqofficial: {
    createBinding: 'Привязка официального бота QQ по QR-коду',
    scanQRCode:
      'Отсканируйте QR-код ниже мобильным QQ и подтвердите привязку в «QQ Bot Assistant»',
    waitingForScan: 'Ожидание сканирования',
    bindSuccess: 'Привязка успешна! AppID и Secret заполнены автоматически',
    bindFailed: 'Не удалось выполнить привязку',
    connecting: 'Подключение к сервису QQ...',
    retry: 'Повторить',
    tokenNote:
      'Поле Token не используется текущим адаптером — его можно оставить пустым.',
    boundBy: 'Привязано пользователем QQ {{openid}}',
  },
  pluginPages: {
    selectFromSidebar: 'Выберите страницу плагина на боковой панели',
    invalidPage: 'Недопустимая страница плагина',
  },
  skills: {
    title: 'Навыки',
    description:
      'Создавайте навыки и управляйте ими для активации во время диалогов',
    createSkill: 'Создать навык',
    createSkillDescription:
      'Импортируйте локальный каталог или создайте навык, заполнив данные',
    editSkill: 'Редактировать навык',
    getSkillListError: 'Не удалось получить список навыков: ',
    skillName: 'Название навыка',
    displayName: 'Название навыка',
    displayNamePlaceholder: 'Отображаемое имя (поддерживает любой язык)',
    skillSlug: 'Имя каталога',
    skillSlugPlaceholder: 'english-name-only',
    skillSlugHelp:
      'Используется как имя каталога навыка. Разрешены только буквы, цифры, дефисы и подчёркивания.',
    skillDescription: 'Описание навыка',
    skillInstructions: 'Инструкции',
    saveSuccess: 'Успешно сохранено',
    saveError: 'Не удалось сохранить: ',
    createSuccess: 'Успешно создано',
    createError: 'Не удалось создать: ',
    deleteSuccess: 'Успешно удалено',
    deleteError: 'Не удалось удалить: ',
    deleteConfirmation: 'Вы уверены, что хотите удалить этот навык?',
    delete: 'Удалить навык',
    skillNameRequired: 'Название навыка не может быть пустым',
    skillDescriptionRequired: 'Описание навыка не может быть пустым',
    packageRootRequired: 'Корневой путь пакета не может быть пустым',
    scan: 'Сканировать',
    scanSuccess: 'Каталог успешно просканирован',
    scanError: 'Не удалось просканировать каталог: ',
    noSkills: 'Навыки не настроены',
    preview: 'Предпросмотр',
    previewInstructions: 'Предпросмотр содержимого SKILL.md',
    instructionsPlaceholder: 'Введите инструкции навыка в формате Markdown...',
    descriptionPlaceholder:
      'Краткое описание того, что делает этот навык (показывается LLM)',
    packageRoot: 'Каталог пакета',
    packageRootHelp:
      'Необязательно. Нужно только при импорте существующего каталога навыка. Для новых навыков оставьте пустым. Сканирование проверяет текущий каталог и подкаталоги глубиной до 2 уровней.',
    importLocalDirectory: 'Импортировать локальный каталог навыка',
    chooseSkillDirectory: 'Выбрать каталог с SKILL.md',
    chooseAnotherDirectory: 'Выбрать другой каталог',
    importingDirectory: 'Подготовка предпросмотра...',
    clearDirectoryPreview: 'Очистить выбранный каталог',
    noSkillMdInDirectory: 'В выбранном каталоге не найден SKILL.md',
    multipleSkillMdInDirectory:
      'В выбранном каталоге найдено несколько файлов SKILL.md. Выберите один каталог навыка напрямую.',
    importDirectoryError: 'Не удалось импортировать каталог: ',
    advancedSettings: 'Расширенные настройки',
    searchSkills: 'Поиск навыков...',
    selectSkills: 'Выбрать навыки',
    addSkill: 'Добавить навык',
    builtin: 'Встроенный',
    importFromGithub: 'Установить навык из GitHub',
    createManually: 'Создать вручную',
    uploadZip: 'Загрузить ZIP-пакет',
    uploadZipOnly: 'Поддерживаются только ZIP-пакеты навыков',
    installSuccess: 'Навык успешно установлен',
    installError: 'Не удалось установить навык: ',
    enterRepoUrl: 'Введите URL репозитория GitHub',
    repoUrlPlaceholder: 'например, https://github.com/owner/repo',
    fetchingReleases: 'Получение релизов...',
    selectRelease: 'Выбрать релиз',
    noReleasesFound: 'Релизы не найдены',
    fetchReleasesError: 'Не удалось получить релизы: ',
    selectAsset: 'Выберите файл для установки',
    sourceArchive: 'Исходный код (zip)',
    noAssetsFound: 'В этом релизе нет устанавливаемых файлов',
    fetchAssetsError: 'Не удалось получить файлы: ',
    backToReleases: 'Назад к релизам',
    backToRepoUrl: 'Назад к URL репозитория',
    backToAssets: 'Назад к файлам',
    releaseTag: 'Тег: {{tag}}',
    publishedAt: 'Опубликовано: {{date}}',
    prerelease: 'Предварительный релиз',
    assetSize: 'Размер: {{size}}',
    confirmInstall: 'Подтвердить установку',
    installing: 'Установка навыка...',
    loading: 'Загрузка...',
    previewLoadError: 'Не удалось загрузить предпросмотр',
    selectFromSidebar: 'Выберите навык на боковой панели',
    dangerZone: 'Опасная зона',
    dangerZoneDescription: 'Необратимые и разрушительные действия',
    files: 'Файлы',
    noFiles: 'Файлы не найдены',
    loadFilesError: 'Не удалось загрузить файлы: ',
    readFileError: 'Не удалось прочитать файл: ',
    saveFile: 'Сохранить файл',
    saveFileSuccess: 'Файл успешно сохранён',
    saveFileError: 'Не удалось сохранить файл: ',
  },
  addExtension: {
    installTitle: 'Установить {{type}}',
    installConfirm: 'Установить {{type}} «{{name}}»?',
    installInfoType: 'Тип',
    installInfoId: 'ID',
    installInfoVersion: 'Версия',
    installSuccess: 'Успешно установлено',
    installStage: {
      mcpInstalling: 'Добавление и подключение сервера MCP…',
      skillInstalling: 'Установка навыка…',
      installed: 'Готово',
    },
    manualAdd: 'Добавить вручную',
    uploadExtension: 'Перетащите файл сюда или нажмите для загрузки',
    uploadHint: 'Поддерживаются файлы .zip (навыки) и .lbpkg (плагины)',
    orContinueWith: 'или выберите действие ниже',
    addMCPServerHint: 'Подключить расширение сервера инструментов MCP',
    installFromGithub: 'Установить из GitHub',
    installFromGithubHint: 'Пакет плагина или навык (SKILL.md)',
    githubUrlHelp: 'Вставьте URL GitHub',
    githubUrlTooltip:
      'Плагин: вставьте URL репозитория, Release или Tag. Навык: вставьте URL страницы SKILL.md внутри каталога навыка.',
    githubUrlPlaceholder: 'Репозиторий GitHub, Release или ссылка SKILL.md',
    githubUrlRequired: 'Введите URL GitHub',
    previewSkill: 'Предпросмотр навыка',
    noSkillPreviewFound: 'Импортируемый навык не найден',
    createSkill: 'Создать новый навык',
    createSkillHint: 'Импортировать из локального каталога или создать вручную',
    unsupportedFileType:
      'Неподдерживаемый тип файла. Поддерживаются только файлы .zip и .lbpkg',
  },

  workspace: {
    title: 'Workspace',
    description: 'Manage members, roles, and invitation links',
    selectTitle: 'Choose a Workspace',
    selectDescription: 'Select where you want to continue in LangBot.',
    selectionLoadFailed:
      'Your Workspaces could not be loaded. Please try again.',
    switchWorkspace: 'Switch Workspace',
    settings: 'Workspace Settings',
    currentPlan: 'Current plan',
    planUnavailable: 'Unavailable',
    upgradePlan: 'Change or upgrade plan',
    ossSingletonDescription:
      'This self-hosted instance has one Workspace and can include multiple users.',
    cloudManagedDescription:
      'This Workspace is hosted by LangBot Cloud. Manage members here; billing opens in Cloud.',
    loadFailed: 'Failed to load Workspace information',
    members: 'Members',
    you: 'You',
    inviteMember: 'Invite a member',
    inviteDescription:
      'Create a one-time link to add another user to this Workspace.',
    emailPlaceholder: 'member@example.com',
    createInvitation: 'Create invitation',
    invitationCreated: 'Invitation created',
    delivery: {
      sent: 'Invitation sent',
      link_only: 'Invitation link created',
      failed: 'Invitation link created, but email could not be sent',
    },
    invitationCreateFailed: 'Failed to create invitation',
    oneTimeLinkWarning: 'Copy this link now. It is shown only once.',
    copyInvitation: 'Copy invitation link',
    invitationCopied: 'Invitation link copied',
    pendingInvitations: 'Pending invitations',
    expiresAt: 'Expires {{date}}',
    revokeInvitation: 'Revoke invitation',
    invitationRevoked: 'Invitation revoked',
    invitationRevokeFailed: 'Failed to revoke invitation',
    acceptInvitation: 'Accept invitation',
    invitedToWorkspace: 'You were invited to {{workspace}}',
    checkingInvitation: 'Checking this invitation...',
    invitationMissing: 'This invitation link is missing required information.',
    invitationExpired: 'This invitation has expired.',
    invitationAlreadyRevoked: 'This invitation was revoked.',
    invitationAlreadyUsed: 'This invitation was already used.',
    invitationInvalid: 'This invitation is invalid or no longer available.',
    invitationAccepted: 'Invitation accepted',
    invitationAcceptFailed: 'Failed to accept invitation',
    invitationEmailMismatch:
      'This invitation belongs to a different email address.',
    existingAccountLoginRequired:
      'An account already exists for this email. Sign in to continue.',
    acceptAsCurrentAccount: 'Accept with current account',
    authenticatedInvitationNotice:
      'Sign out first, then sign in with the invited account. Your invitation will be preserved.',
    logoutAndReturn: 'Sign out and return to this invitation',
    switchAccount: 'Switch account',
    registerAndAccept: 'Create account and accept',
    alreadyHaveAccount: 'I already have an account',
    confirmPassword: 'Confirm password',
    passwordMinimum: 'Password must contain at least 8 characters.',
    passwordMismatch: 'The passwords do not match.',
    backToLogin: 'Back to sign in',
    memberUpdated: 'Member role updated',
    memberUpdateFailed: 'Failed to update member role',
    removeMember: 'Remove member',
    removeMemberConfirm: 'Remove this member from the Workspace?',
    memberRemoved: 'Member removed',
    memberRemoveFailed: 'Failed to remove member',
    transferOwnership: 'Transfer ownership',
    types: {
      personal: 'Personal',
      team: 'Team',
    },
    roles: {
      owner: 'Owner',
      admin: 'Admin',
      developer: 'Developer',
      operator: 'Operator',
      viewer: 'Viewer',
    },
  },
};

export default ruRU;
