{
  "common": {
    "save": "Сохранить",
    "reset": "Сбросить",
    "cancel": "Отмена",
    "confirm": "Подтвердить",
    "delete": "Удалить",
    "edit": "Редактировать",
    "create": "Создать",
    "upload": "Загрузить",
    "download": "Скачать",
    "refresh": "Обновить",
    "search": "Поиск",
    "enable": "Включить",
    "disable": "Отключить",
    "enabled": "Включено",
    "disabled": "Отключено",
    "preview": "Предпросмотр",
    "view": "Просмотр",
    "content": "Содержимое",
    "loading": "Загрузка...",
    "copy": "Копировать",
    "copied": "Скопировано в буфер обмена",
    "copyFailed": "Не удалось скопировать в буфер обмена",
    "contentPlaceholder": "Введите содержимое...",
    "help": "Справка",
    "close": "Закрыть",
    "actions": "Действия",
    "total": "Всего {{count}}",
    "clear": "Очистить",
    "paste": "Вставить"
  },
  "desktop": {
    "closeWindow": {
      "title": "Закрыть окно",
      "description": "Что сделать при закрытии окна? Выход из приложения остановит все выполняющиеся задачи и запланированные задания.",
      "remember": "Запомнить мой выбор",
      "showWindow": "Показать окно",
      "minimizeToTray": "Свернуть в трей",
      "quitApp": "Выйти из приложения",
      "preference": "Закрытие окна",
      "askEveryTime": "Спрашивать каждый раз"
    }
  },
  "chunkError": {
    "title": "Не удалось загрузить страницу",
    "subTitle": "Возможно, это вызвано проблемой сети или обновлением приложения.",
    "genericTitle": "Что-то пошло не так",
    "genericSubTitle": "При отображении этой страницы произошла непредвиденная ошибка.",
    "reload": "Перезагрузить"
  },
  "nav": {
    "chat": "Чат",
    "control": "Управление",
    "channels": "Каналы",
    "sessions": "Сессии",
    "cronJobs": "Cron-задачи",
    "heartbeat": "Пульс",
    "agent": "Рабочая область",
    "workspace": "Файлы",
    "skills": "Навыки",
    "skillPool": "Пул навыков",
    "tools": "Инструменты",
    "mcp": "MCP",
    "agentConfig": "Конфигурация",
    "settings": "Настройки",
    "models": "Модели",
    "environments": "Окружения",
    "security": "Безопасность",
    "tokenUsage": "Использование токенов",
    "agentStats": "Статистика агента",
    "voiceTranscription": "Транскрипция голоса",
    "agents": "Управление агентами",
    "debug": "Отладка",
    "plugins": "Плагины",
    "acp": "ACP",
    "backups": "Резервные копии",
    "pluginManager": "Менеджер плагинов"
  },
  "debug": {
    "title": "Отладка",
    "desc": "Просмотр файла логов backend-демона для диагностики. Пока открыта эта страница, логи обновляются автоматически.",
    "level": {
      "all": "Все"
    },
    "backend": {
      "title": "Backend-логи",
      "autoRefresh": "Автообновление",
      "newestFirst": "Сначала новые",
      "updatedAt": "Обновлено",
      "path": "Файл лога",
      "notFound": "Файл backend-логов пока не найден.",
      "placeholder": "Здесь появится вывод backend-логов.",
      "loadFailed": "Не удалось загрузить backend-логи",
      "searchPlaceholder": "Поиск по backend-логам..."
    },
    "actions": {
      "refreshBackend": "Обновить backend-логи",
      "refreshSuccess": "Логи обновлены",
      "copyBackend": "Копировать backend-логи"
    }
  },
  "agent": {
    "parent": "Настройки",
    "agents": "Агенты",
    "management": "Управление агентами",
    "pageDescription": "Создавайте, настраивайте и управляйте несколькими AI-агентами с пользовательскими рабочими пространствами и идентичностями.",
    "name": "Название",
    "id": "ID",
    "description": "Описание",
    "workspace": "Путь к рабочему пространству",
    "create": "Создать агента",
    "createTitle": "Создать нового агента",
    "createSuccess": "Агент успешно создан",
    "createFailed": "Не удалось создать агента",
    "edit": "Редактировать",
    "editTitle": "Редактировать агента - {{name}}",
    "updateSuccess": "Агент успешно обновлён",
    "updateFailed": "Не удалось обновить агента",
    "delete": "Удалить",
    "deleteConfirm": "Подтвердить удаление агента",
    "deleteConfirmDesc": "После удаления агент станет недоступен, но файлы рабочего пространства будут сохранены",
    "deleteSuccess": "Агент успешно удалён",
    "deleteFailed": "Не удалось удалить агента",
    "selectAgent": "Выбрать агента",
    "defaultDisplayName": "Агент по умолчанию",
    "currentWorkspace": "Текущий агент",
    "switchSuccess": "Агент успешно переключён",
    "switchFailed": "Не удалось переключить агента",
    "loadFailed": "Не удалось загрузить список агентов",
    "loadConfigFailed": "Не удалось загрузить конфигурацию агента",
    "saveFailed": "Не удалось сохранить агента",
    "idRequired": "Пожалуйста, введите ID агента",
    "idLabel": "ID агента (необязательно)",
    "idHelp": "Оставьте пустым для автогенерации. Допускаются только буквы, цифры, дефисы и подчёркивания.",
    "idPattern": "ID может содержать только буквы, цифры, подчёркивания и дефисы",
    "idPlaceholder": "например: my-agent",
    "nameRequired": "Пожалуйста, введите название агента",
    "namePlaceholder": "например: Мой агент",
    "descriptionPlaceholder": "Кратко опишите назначение этого агента...",
    "workspaceHelp": "Оставьте пустым для автоматического создания в ~/.qwenpaw/workspaces/<id>",
    "dragHandleTooltip": "Перетащите, чтобы изменить порядок агентов",
    "reorderSuccess": "Порядок агентов сохранён",
    "reorderFailed": "Не удалось сохранить порядок агентов",
    "defaultNotEditable": "Агент по умолчанию не может быть отредактирован",
    "defaultNotDeletable": "Агент по умолчанию не может быть удалён",
    "disable": "Отключить",
    "enable": "Включить",
    "disabled": "Отключён",
    "disableConfirm": "Подтвердить отключение агента",
    "disableConfirmDesc": "После отключения экземпляр агента не будет запущен, но останется видимым в списке",
    "enableConfirm": "Подтвердить включение агента",
    "enableConfirmDesc": "После включения агент будет доступен для переключения",
    "disableSuccess": "Агент успешно отключён",
    "enableSuccess": "Агент успешно включён",
    "toggleFailed": "Не удалось переключить состояние агента",
    "enableAgent": "Включить {{name}}",
    "disableAgent": "Отключить {{name}}",
    "disabledAgents": "Отключённые ({{count}})",
    "pinnedAgents": "Закреплённые",
    "otherAgents": "Другие агенты",
    "pinned": "Закреплён",
    "defaultPinned": "Агент по умолчанию всегда закреплён",
    "longPressToPin": "Удерживайте для закрепления",
    "longPressToUnpin": "Удерживайте для открепления",
    "pinAgent": "Закрепить агента",
    "unpinAgent": "Открепить агента",
    "pinSuccess": "Агент закреплён",
    "unpinSuccess": "Агент откреплён",
    "pinFailed": "Не удалось изменить закрепление",
    "status": {
      "disabled": "Отключён",
      "pending": "Ожидает запуска",
      "starting": "Запускается",
      "running": "Работает",
      "failed": "Ошибка запуска",
      "waitUntilStarted": "Доступно после завершения запуска"
    },
    "defaultNotDisablable": "Агент по умолчанию нельзя отключить",
    "currentAgentDeleted": "Текущий агент был удалён, автоматически переключено на агента по умолчанию",
    "currentAgentDisabled": "Текущий агент был отключён, автоматически переключено на агента по умолчанию",
    "switchedToDefault": "Автоматически переключено на агента по умолчанию",
    "cannotSwitchToDisabled": "Этот агент отключён, пожалуйста, сначала включите его на странице управления",
    "model": "Модель",
    "modelHelp": "Назначьте конкретную LLM-модель этому агенту. Оставьте пустым для использования глобальной модели по умолчанию.",
    "modelPlaceholder": "Глобальная по умолчанию",
    "noConfiguredModels": "Нет настроенных моделей",
    "modelColumn": "Модель",
    "initialSkills": "Начальные навыки",
    "initialSkillsHelp": "Выберите навыки для добавления из пула. Позже можно добавить или удалить навыки.",
    "selectAll": "Все",
    "selectBuiltin": "Встроенные",
    "selectNone": "Очистить",
    "noPoolSkills": "В пуле нет доступных навыков",
    "addSkillsToAgent": "Добавить навыки",
    "copyTooltip": "Копировать конфигурацию агента",
    "copyDefaultTooltip": "Копировать, используя агента по умолчанию как шаблон",
    "copyTitle": "Копировать конфигурацию агента",
    "copyNameLabel": "Имя нового агента",
    "copyOptionsLabel": "Что копировать",
    "copyOptionAgentJson": "agent.json (обязательно)",
    "copyOptionAgentJsonHint": "Всегда копирует разобранную исходную конфигурацию и сбрасывает ID, имя, workspace и channels. Это не побайтовая копия agent.json на диске.",
    "copyOptionMdFiles": "AGENTS / SOUL / PROFILE / HEARTBEAT / BOOTSTRAP.md",
    "copyOptionSkills": "skills/ + manifest",
    "copyOptionJobs": "jobs.json",
    "copyOptionJobsHint": "Копирует только определения заданий, без истории. Новый агент начнёт выполнять их по расписанию сразу после создания.",
    "copySuccess": "Конфигурация агента успешно скопирована",
    "copyFailed": "Не удалось скопировать конфигурацию агента"
  },
  "workspace": {
    "title": "Файлы",
    "workspacePath": "Рабочее пространство:",
    "noFiles": "Нет файлов",
    "coreFiles": "Основные файлы",
    "coreFilesDesc": "Базовые файлы с описанием персоны, идентичности и инструкций по инструментам.",
    "uploadTooltip": "Только ZIP-файлы",
    "uploadTooltipWithLimit": "Только ZIP-файлы, максимум {{limit}} МБ",
    "selectFile": "Выберите файл для редактирования",
    "fileContent": "Содержимое файла...",
    "uploadSuccess": "Файл успешно загружен",
    "uploadFailed": "Не удалось загрузить файл",
    "downloadPreparing": "Подготовка к скачиванию рабочего пространства...",
    "downloadSuccess": "Рабочее пространство успешно скачано",
    "downloadFailed": "Не удалось скачать рабочее пространство",
    "zipOnly": "Для загрузки поддерживаются только файлы .zip",
    "fileSizeExceeded": "Размер файла превышает лимит {{limit}} МБ. Текущий файл: {{size}} МБ",
    "systemPromptToggleTooltip": "Включить/выключить загрузку этого файла в системный промпт",
    "memoryFileWarning": "MEMORY.md обычно запрашивается агентом по требованию с помощью инструментов. Загрузка его в системный промпт может привести к слишком длинному контексту.",
    "configUpdated": "Конфигурация системного промпта обновлена",
    "configUpdateFailed": "Не удалось обновить конфигурацию системного промпта",
    "attribution": "Дизайн рабочего пространства частично вдохновлён проектом OpenClaw — спасибо! 🐾",
    "saveSuccess": "Сохранено успешно",
    "saveFailed": "Не удалось сохранить"
  },
  "skills": {
    "title": "Навыки",
    "description": "Управляйте навыками и возможностями агента.",
    "importHub": "Загрузить по URL",
    "supportedSources": "Поддерживаемые источники:",
    "importSkills": "Импорт навыка",
    "enterSkillUrl": "Введите URL навыка",
    "supportedSkillUrlSources": "Поддерживаемые маркетплейсы навыков:",
    "urlExamples": "Примеры URL:",
    "urlValid": "Действительный URL от {{source}}",
    "invalidUrl": "Недействительный URL",
    "clickToFill": "Нажмите, чтобы заполнить URL",
    "invalidSkillUrlSource": "Пожалуйста, убедитесь, что URL навыка из поддерживаемого маркетплейса",
    "type": "Тип",
    "installedFrom": "Установлено из",
    "source": "Источник",
    "path": "Путь",
    "tags": "Теги",
    "builtin": "Встроенный",
    "custom": "Пользовательский",
    "addSkill": "Добавить навык",
    "createSkill": "Создать навык",
    "viewSkill": "Просмотреть навык",
    "editSkill": "Редактировать навык",
    "skillName": "Название навыка",
    "skillContent": "Содержимое навыка",
    "pleaseInputName": "Пожалуйста, введите название навыка",
    "pleaseInputContent": "Пожалуйста, введите содержимое навыка",
    "skillNamePlaceholder": "например, weather_query",
    "contentPlaceholder": "[Формат]\n---\nname: skill_name (обязательно, строчные буквы с подчёркиванием)\ndescription: Краткое описание (обязательно)\n---\n\nРеализация навыка (формат Markdown)\n\n[Пример]\n---\nname: weather_query\ndescription: Запрос информации о погоде для города\n---\n\n## Функции\nЗапрос данных о погоде в реальном времени.\n\n## Использование\nПользователь вводит название города, возвращается информация о погоде.",
    "createSuccess": "Навык успешно создан",
    "createFailed": "Не удалось создать навык",
    "deleteConfirm": "Вы уверены, что хотите удалить этот навык?",
    "deleteSuccess": "Навык успешно удалён",
    "deleteFailed": "Не удалось удалить навык",
    "batchEnable": "Включить",
    "batchDisable": "Отключить",
    "batchEnableSuccess": "{{count}} навыков включено",
    "batchEnablePartial": "{{enabled}} включено, {{failed}} не удалось",
    "batchEnableFailed": "Не удалось выполнить пакетное включение",
    "batchDisableSuccess": "{{count}} навыков отключено",
    "batchDisablePartial": "{{disabled}} отключено, {{failed}} не удалось",
    "batchDisableFailed": "Не удалось выполнить пакетное отключение",
    "batchDeleteTitle": "Удалить {{count}} навыков?",
    "batchDeleteSuccess": "{{count}} навыков удалено",
    "batchDeletePartial": "{{deleted}} удалено, {{failed}} не удалось",
    "batchDeleteFailed": "Не удалось выполнить пакетное удаление",
    "selectedCount": "Выбрано {{count}}",
    "selectAll": "Выбрать все",
    "clearSelection": "Очистить",
    "updateSuccess": "Навык успешно обновлён",
    "updateFailed": "Не удалось обновить навык",
    "frontmatterRequired": "Навык должен начинаться и заканчиваться ---",
    "frontmatterNameRequired": "В навыке отсутствует обязательное поле: name",
    "frontmatterDescriptionRequired": "В навыке отсутствует обязательное поле: description",
    "editNotSupported": "Не удалось отредактировать навык",
    "editNote": "Подсказка: здесь можно редактировать содержимое навыка, каналы и конфигурацию.",
    "create": "Создать",
    "optimizeWithAI": "AI Оптимизация",
    "stopOptimize": "Стоп",
    "optimizeSuccess": "Навык успешно оптимизирован",
    "optimizeFailed": "Не удалось оптимизировать навык",
    "noContentToOptimize": "Нет содержимого для оптимизации",
    "cancelImport": "Отменить импорт",
    "importCancelled": "Импорт навыка отменён",
    "importTimeout": "Время ожидания импорта навыка истекло. Повторите попытку или проверьте сеть.",
    "uploadSkill": "Загрузить навык",
    "uploadZip": "Загрузить Zip",
    "uploadSuccess": "Навык успешно загружен",
    "uploadFailed": "Не удалось загрузить навык",
    "uploadNoChange": "Новые навыки не были импортированы. Возможно, они уже существуют",
    "zipOnly": "Поддерживается загрузка только .zip файлов",
    "fileSizeExceeded": "Размер файла превышает лимит {{limit}}МБ. Текущий файл: {{size}}МБ",
    "channels": "Применимые каналы",
    "allChannels": "Все",
    "lastUpdated": "Обновлено",
    "searchPlaceholder": "Фильтр по названию",
    "listView": "Список",
    "gridView": "Сетка",
    "refreshHint": "Обновить навыки с диска",
    "poolSync": "Статус синхронизации",
    "uploadedToPool": "Загружено в пул навыков",
    "downloadedToWorkspace": "Скачано в текущее рабочее пространство",
    "builtinUpgradeTitle": "Обновить встроенный навык",
    "builtinUpgradeContent": "В пуле доступна новая версия встроенного навыка «{{name}}». Перезаписать текущую версию?",
    "languageSwitchTitle": "Переключить язык навыка",
    "languageSwitchContent": "Следующие навыки имеют другую языковую версию в пуле и будут перезаписаны:",
    "overwriteExistingList": "Следующие навыки уже существуют и будут перезаписаны:",
    "nameConflict": "Обнаружен конфликт имён. Предложенное переименование заполнено.",
    "uploadToPool": "Синхронизировать с пулом навыков",
    "uploadToPoolHint": "Загрузить выбранные навыки рабочего пространства в общий локальный пул навыков",
    "downloadFromPool": "Загрузить из пула навыков",
    "emptyStateBadge": "Новые рабочие пространства начинают пустыми",
    "emptyStateTitle": "У этого агента ещё нет навыков",
    "emptyStateText": "Это нормально. Новые рабочие пространства не содержат навыков автоматически. Загрузите навыки из локального пула или создайте новый навык здесь, чтобы оснастить этого агента.",
    "emptyStateDownload": "Загрузить из пула навыков",
    "emptyStateCreate": "Создать первый навык",
    "selectWorkspaceSkill": "Выберите навык рабочего пространства",
    "selectPoolItem": "Выберите элемент пула навыков",
    "renameOptional": "Переименование (необязательно)",
    "renamePlaceholder": "Предложенное переименование появится здесь при конфликте",
    "renameSingleOnly": "Переименование доступно только при выборе ровно одного навыка.",
    "downloadSkillPool": "Скачать пул навыков",
    "uploadSkillPool": "Загрузить пул навыков",
    "config": "Конфигурация",
    "configPlaceholder": "{\"KEY\": \"value\"}",
    "configInvalidJson": "Неверный формат JSON",
    "configSaved": "Конфигурация сохранена",
    "loadFailed": "Не удалось загрузить навыки",
    "refreshFailed": "Не удалось обновить навыки",
    "createdSuccessfully": "Создано успешно",
    "saveFailed": "Не удалось сохранить",
    "importFailed": "Не удалось импортировать",
    "disabledSuccessfully": "Отключено успешно",
    "enabledSuccessfully": "Включено успешно",
    "operationFailed": "Операция не удалась",
    "provideUrl": "Пожалуйста, укажите URL навыка хаба",
    "validUrl": "Пожалуйста, введите действительный URL, начинающийся с http:// или https://",
    "importedSkill": "Импортирован навык: {{name}}",
    "batchOperation": "Пакетная операция",
    "exitBatch": "Выйти из режима",
    "noSearchResults": "Навыки, соответствующие вашему запросу, не найдены",
    "filterByTag": "Фильтр по тегу",
    "noTags": "Нет доступных тегов",
    "enabledSkills": "Активные навыки",
    "disabledSkills": "Неактивные навыки",
    "active": "активно"
  },
  "skillPool": {
    "description": "Общий локальный пул навыков для встроенных навыков и загрузок из рабочих пространств. Внешние импорты (ClawHub, LobeHub) — отдельная функция.",
    "broadcast": "Трансляция",
    "broadcastHint": "Транслировать навыки пула во все или выбранные рабочие пространства",
    "refreshHint": "Обновить пул навыков с диска",
    "deleteExternalConfirm": "Файлы внешнего навыка в {{path}} будут удалены с диска.",
    "deleteExternalBatchWarning": "Выбранные внешние навыки будут безвозвратно удалены с диска.",
    "broadcastTitle": "Транслировать {{name}}",
    "importBuiltin": "Импорт встроенных",
    "importBuiltinHint": "Импортировать встроенные навыки из исходников в пул",
    "importBuiltinAlertHint": "Требуют внимания {{count}} изменений встроенных навыков",
    "importBuiltinSuccess": "Встроенные навыки импортированы: {{names}}",
    "importBuiltinConflicts": "Пропущено из-за конфликтов имён: {{names}}",
    "importBuiltinNoChanges": "Нет встроенных изменений для импорта",
    "importBuiltinFailed": "Не удалось импортировать встроенные навыки",
    "importBuiltinConflictTitle": "Обнаружены конфликты встроенных навыков",
    "importBuiltinConflictContent": "Следующие встроенные навыки отличаются от текущих копий в пуле. Подтвердите, чтобы перезаписать их версией из исходников.",
    "sourceVersion": "Версия в исходниках",
    "currentVersion": "Текущая версия",
    "builtinLanguage": "Язык",
    "langDefault": "По умолчанию",
    "langDefaultTooltip": "Сохранить текущий язык каждого навыка",
    "langEn": "Английский",
    "langZh": "Китайский",
    "builtinLanguageChangeTitle": "Сменить язык встроенного навыка?",
    "builtinLanguageChangeContent": "Перезаписать копию «{{name}}» в пуле встроенной версией {{language}}?",
    "builtinLanguageChangeSuccess": "«{{name}}» переключён на {{language}}",
    "builtinLanguageChangeFailed": "Не удалось переключить язык встроенного навыка",
    "importStatusMissing": "Отсутствует в пуле",
    "importStatusCurrent": "Уже актуален",
    "importStatusOutdated": "Устарел",
    "importStatusLanguageSwitchTo": "Перезаписать версией на {{language}}",
    "importStatusConflict": "Конфликт",
    "builtinNoticeSummary": "Обнаружено {{count}} изменений встроенных навыков",
    "builtinNoticeLineAdded": "Добавлено: {{names}}",
    "builtinNoticeLineMissing": "Отсутствует: {{names}}",
    "builtinNoticeLineUpdated": "Обновлено: {{names}}",
    "builtinNoticeLineRemoved": "Удалено: {{names}}",
    "zipImport": "ZIP-импорт",
    "create": "Создать",
    "edit": "Редактировать",
    "delete": "Удалить",
    "descriptionLabel": "Описание",
    "tags": "Теги",
    "tagsPlaceholder": "Выберите или введите теги",
    "filterByTag": "Фильтр по тегу",
    "version": "Версия",
    "createTitle": "Создать элемент пула навыков",
    "editTitle": "Редактировать {{name}}",
    "skillNamePlaceholder": "Название навыка",
    "contentPlaceholder": "Содержимое SKILL.md",
    "nameConflict": "Обнаружен конфликт имён. Применено предложенное переименование.",
    "deletedFromPool": "Удалено из пула навыков",
    "deleteBuiltinConfirm": "Это удалит встроенный навык из пула. Позже его можно снова импортировать из исходников.",
    "deleteConfirm": "Это удалит навык из общего локального пула навыков.",
    "deleteTitle": "Удалить {{name}}?",
    "batchDeleteTitle": "Удалить {{count}} навыков из пула?",
    "batchDeleteSuccess": "{{count}} навыков из пула удалено",
    "batchDeletePartial": "{{deleted}} удалено, {{failed}} не удалось",
    "batchDeleteFailed": "Не удалось выполнить пакетное удаление",
    "imported": "Импортировано: {{names}}",
    "noNewImports": "Новые навыки не импортированы",
    "allBuiltin": "Все встроенные",
    "selectWorkspaces": "Транслировать в рабочее пространство",
    "allWorkspaces": "Все рабочие пространства",
    "optionalRename": "Необязательное переименование",
    "back": "Назад",
    "skillCount": "{{count}} навыков",
    "skillName": "Название навыка",
    "status": "Статус",
    "installedFrom": "Установлено из",
    "updateBuiltin": "Обновить",
    "updateConfirmTitle": "Обновить {{name}}",
    "updateConfirmContent": "Обновить до версии {{version}}? Текущая копия в пуле будет заменена последней встроенной версией.",
    "updateSuccess": "Обновлено успешно",
    "updateFailed": "Не удалось обновить",
    "broadcastSuccess": "Трансляция завершена",
    "broadcastFailed": "Не удалось выполнить трансляцию",
    "overwriteConfirm": "Перезаписать существующие навыки?",
    "overwriteTargetsContent": "Следующие существующие цели будут перезаписаны:",
    "builtinOverwriteTargetsContent": "Следующие встроенные цели имеют другую версию и будут перезаписаны:",
    "renameAndRetry": "Навык с таким именем уже существует. Использовать предложенное имя?",
    "multiConflictTitle": "Обнаружено несколько конфликтов",
    "multiConflictDesc": "Следующие навыки уже существуют. Устраните конфликты по отдельности и повторите попытку:",
    "singleConflictRename": "\"{{name}}\" уже существует. Переименовать в \"{{suggested}}\" для продолжения?",
    "statusUpToDate": "Актуально",
    "statusSynced": "Синхронизировано",
    "statusOutdated": "Устарело",
    "statusNotSynced": "Не синхронизировано",
    "statusConflict": "Конфликт",
    "renameEntry": "Новое имя для \"{{name}}\":",
    "builtin": "встроенный",
    "custom": "пользовательский"
  },
  "mcp": {
    "title": "MCP-клиенты",
    "create": "Создать клиент",
    "formatSupport": "Поддерживаемые форматы",
    "standardFormat": "Стандартный (обёртка mcpServers)",
    "directFormat": "Прямой (ключ → объект конфигурации)",
    "singleFormat": "Один клиент (плоские поля)",
    "emptyState": "MCP-клиенты пока не настроены",
    "loadError": "Не удалось загрузить MCP-клиентов",
    "createSuccess": "MCP-клиент успешно создан",
    "createError": "Не удалось создать MCP-клиент",
    "updateSuccess": "MCP-клиент успешно обновлён",
    "updateError": "Не удалось обновить MCP-клиент",
    "enableSuccess": "MCP-клиент успешно включён",
    "disableSuccess": "MCP-клиент успешно отключён",
    "toggleError": "Не удалось переключить статус MCP-клиента",
    "deleteConfirm": "Вы уверены, что хотите удалить этот MCP-клиент?",
    "deleteSuccess": "MCP-клиент успешно удалён",
    "deleteError": "Не удалось удалить MCP-клиент",
    "maskedFieldHint": "Чувствительные поля скрыты ***. Редактирование скрытых значений не поддерживается — замените полным новым значением.",
    "tools": "Инструменты и разрешения",
    "noTools": "На этом MCP сервере нет доступных инструментов",
    "toolsLoadError": "Не удалось загрузить инструменты с MCP сервера",
    "toolsConnecting": "MCP сервер подключается, попробуйте через некоторое время",
    "toolSchema": "Схема ввода",
    "access": {
      "title": "Доступ",
      "button": "Доступ",
      "summary": "Политика доступа MCP",
      "clientSection": "Общий доступ",
      "toolSection": "Доступ к инструменту",
      "default": "По умолчанию",
      "sourceType": "Источник",
      "sourceValue": "Значение источника",
      "sourceValueAllChannels": "Все каналы",
      "subjectType": "Объект",
      "subjectValue": "Значение объекта",
      "effectLabel": "Политика",
      "source": {
        "channel": "Канал"
      },
      "subjectTypeOption": {
        "all": "Все",
        "user": "Пользователь"
      },
      "sourceValuePlaceholder": {
        "channel": "console / dingtalk"
      },
      "subjectValuePlaceholder": "например, alice",
      "subjectValuePlaceholderSelectedSource": "ID пользователя в выбранном источнике",
      "subjectValuePlaceholderScoped": "ID пользователя в {{source}}",
      "subjectValueAll": "Все",
      "recentUserPlaceholder": "ID пользователя относится к выбранному источнику; введите или выберите заново",
      "noRecentUsers": "Для этого источника нет недавних пользователей; введите ID вручную",
      "ambiguousUserSourceWarning": "ID пользователя уникален только внутри источника. Выберите конкретный канал, чтобы избежать совпадений между каналами.",
      "unknownUserValueWarning": "Этого ID нет среди недавних активных пользователей. Сохранение разрешено.",
      "validation": {
        "missingUserValue": "Выберите конкретный источник и введите корректный ID пользователя.",
        "ambiguousUserSource": "Правила для пользователя должны указывать конкретный канал, а не все каналы.",
        "unknownUserValue": "Этого ID нет среди недавних активных пользователей. Сохранение разрешено."
      },
      "addRule": "Добавить правило",
      "deleteRule": "Удалить правило",
      "noClientRules": "Нет правил",
      "noRules": "Нет правил, используется политика по умолчанию",
      "inherit": "Наследовать ({{effect}})",
      "stale": "Не найдено",
      "disabledTools": "Этот MCP клиент отключен; сохранённые правила доступа всё ещё можно редактировать.",
      "discardTitle": "Отменить несохранённые изменения?",
      "discardContent": "Несохранённые изменения политики доступа будут потеряны.",
      "loadError": "Не удалось загрузить политику доступа MCP",
      "saveSuccess": "Политика доступа MCP сохранена",
      "saveError": "Не удалось сохранить политику доступа MCP",
      "unmanagedRules": "{{count}} расширенных правил",
      "effect": {
        "allow": "Разрешить",
        "ask": "Спрашивать",
        "deny": "Запретить"
      }
    },
    "tab": {
      "json": "Импорт JSON",
      "form": "Режим формы"
    },
    "form": {
      "key": "Ключ клиента",
      "keyPlaceholder": "my-mcp-server",
      "keyRequired": "Ключ клиента обязателен",
      "name": "Отображаемое имя",
      "namePlaceholder": "My MCP Server",
      "nameRequired": "Отображаемое имя обязательно",
      "transport": "Транспорт",
      "url": "URL сервера",
      "urlRequired": "URL обязателен для удалённых MCP серверов",
      "command": "Команда",
      "commandRequired": "Команда обязательна для транспорта stdio",
      "args": "Аргументы (через пробел или с новой строки)",
      "description": "Описание",
      "descriptionPlaceholder": "Необязательное описание",
      "env": "Переменные окружения",
      "envPlaceholder": "KEY=VALUE (по одной на строку)"
    },
    "oauth": {
      "enableOAuth": "Использовать OAuth авторизацию",
      "manage": "OAuth",
      "authorized": "Авторизован",
      "notAuthorized": "Не авторизован",
      "expired": "Токен истёк",
      "failed": "Ошибка авторизации",
      "waiting": "Ожидание авторизации...",
      "authorize": "Авторизовать",
      "reauthorize": "Переавторизовать",
      "revoke": "Отозвать",
      "startFailed": "Не удалось запустить OAuth",
      "authFailed": "OAuth авторизация не удалась",
      "popupBlocked": "Всплывающее окно заблокировано браузером. Разрешите всплывающие окна и повторите попытку.",
      "windowClosed": "Окно авторизации закрыто. Повторите попытку.",
      "noUrl": "Сначала введите URL сервера",
      "noClientKey": "Сначала создайте клиент",
      "showAdvanced": "Дополнительные параметры",
      "hideAdvanced": "Скрыть параметры",
      "clientId": "Client ID (необязательно)",
      "clientIdPlaceholder": "Оставьте пустым для динамической регистрации",
      "scope": "Scope (необязательно)",
      "scopePlaceholder": "openid profile email",
      "authEndpoint": "Authorization Endpoint (переопределить)",
      "tokenEndpoint": "Token Endpoint (переопределить)",
      "endpointHint": "Оставьте пустым для автообнаружения. Заполните для ручного указания."
    }
  },
  "heartbeat": {
    "title": "Пульс",
    "description": "Запускайте HEARTBEAT.md с фиксированным интервалом для самопроверок. По умолчанию выполняется тихо и не влияет на текущие диалоги, либо может отправлять ответы в последний канал чата.",
    "enabled": "Включить пульс",
    "every": "Интервал",
    "everyRequired": "Обязательно",
    "everyMin": "Должно быть не меньше 1",
    "timeoutSeconds": "Таймаут выполнения (секунды)",
    "timeoutRequired": "Обязательно",
    "timeoutMin": "Должно быть не меньше 1",
    "timeoutMax": "Должно быть не больше 3600",
    "unitMinutes": "Минуты",
    "unitHours": "Часы",
    "target": "Цель ответа",
    "targetMain": "Тихий режим (по умолчанию, без вывода в канал)",
    "targetLast": "Отправлять в последний канал чата",
    "activeHours": "Активные часы (необязательно)",
    "activeStart": "Время начала",
    "activeEnd": "Время окончания",
    "loadFailed": "Не удалось загрузить конфигурацию пульса",
    "saveSuccess": "Успешно сохранено; пульс перезагружен на лету",
    "saveFailed": "Не удалось сохранить конфигурацию пульса",
    "targetInbox": "Отправлять во входящие",
    "runNow": "Запустить сейчас",
    "runNowSuccess": "Пульс запущен. Через несколько секунд проверьте входящие или целевой канал.",
    "runNowFailed": "Не удалось запустить выполнение пульса"
  },
  "cronJobs": {
    "title": "Cron-задачи",
    "description": "Создавайте и управляйте задачами по расписанию, которые автоматически выполняются в указанное время.",
    "createJob": "Создать задачу",
    "editJob": "Редактировать задачу",
    "confirmDelete": "Подтвердить удаление",
    "deleteConfirm": "Вы уверены, что хотите удалить эту Cron Job?",
    "okText": "OK",
    "cancelText": "Отмена",
    "deleteText": "Удалить",
    "id": "ID задачи",
    "name": "Название задачи",
    "enabled": "Статус",
    "scheduleType": "Тип расписания",
    "scheduleCron": "Расписание (Cron)",
    "scheduleCronLabel": "Расписание (Cron)",
    "scheduleTimezone": "Часовой пояс",
    "cronType": "Частота",
    "cronTypeHourly": "Каждый час",
    "cronTypeDaily": "Ежедневно",
    "cronTypeWeekly": "Еженедельно",
    "cronTypeCustom": "Пользовательский",
    "cronTime": "Время",
    "cronDaysOfWeek": "Дни недели",
    "cronDayMon": "Понедельник",
    "cronDayTue": "Вторник",
    "cronDayWed": "Среда",
    "cronDayThu": "Четверг",
    "cronDayFri": "Пятница",
    "cronDaySat": "Суббота",
    "cronDaySun": "Воскресенье",
    "cronCustomExpression": "Cron-выражение",
    "taskText": "Текст сообщения",
    "action": "Действие",
    "disable": "Отключить",
    "executeNow": "Выполнить сейчас",
    "edit": "Редактировать",
    "delete": "Удалить",
    "totalItems": "Всего {{count}} элементов",
    "perPage": "/ стр.",
    "pleaseInputId": "Пожалуйста, введите ID задачи",
    "pleaseInputName": "Пожалуйста, введите название задачи",
    "pleaseInputCron": "Пожалуйста, введите cron-выражение",
    "pleaseSelectTaskType": "Пожалуйста, выберите тип задачи",
    "pleaseInputRequest": "Пожалуйста, введите содержимое запроса",
    "pleaseInputMessageContent": "Пожалуйста, введите текст сообщения",
    "pleaseInputChannel": "Пожалуйста, введите целевой канал",
    "pleaseInputUserId": "Пожалуйста, введите ID целевого пользователя",
    "pleaseInputSessionId": "Пожалуйста, введите ID целевой сессии",
    "jobIdPlaceholder": "например, daily-report-job",
    "jobNamePlaceholder": "например, Ежедневный утренний отчёт",
    "selectTimezone": "Выберите часовой пояс",
    "taskDescriptionPlaceholder": "Для текстовых задач введите текст сообщения...",
    "invalidJsonFormat": "Неверный формат JSON",
    "jsonFormatRequired": "Требуется формат JSON",
    "taskType": "Тип задачи",
    "text": "Текст сообщения",
    "requestInput": "Содержимое запроса",
    "requestSessionId": "ID сессии запроса",
    "requestUserId": "ID пользователя запроса",
    "dispatchChannel": "Целевой канал",
    "dispatchTargetUserId": "ID целевого пользователя",
    "dispatchTargetSessionId": "ID целевой сессии",
    "dispatchMode": "Режим доставки",
    "silentDelivery": "Тихая доставка",
    "runtimeShareSession": "Общая сессия",
    "runtimeMaxConcurrency": "Макс. параллельность",
    "runtimeTimeoutSeconds": "Таймаут (секунды)",
    "runtimeMisfireGraceSeconds": "Льготный период пропуска (секунды)",
    "runtimeToolSafety": "Проверка безопасности инструментов",
    "idTooltip": "Генерируемый системой, нередактируемый уникальный UUID, присваиваемый при создании задачи.",
    "nameTooltip": "Понятное имя, чтобы вам было проще найти эту задачу.",
    "cronTooltip": "Определите, когда задача должна запускаться",
    "cronExample": "Популярные примеры: '0 9 * * *' = ежедневно в 09:00 | '*/30 * * * *' = каждые 30 мин | '0 */2 * * *' = каждые 2 часа | '0 0 * * 0' = воскресенье, полночь",
    "cronHelper": "Впервые работаете с cron-выражениями?",
    "cronHelperLink": "Использовать онлайн-генератор",
    "timezoneTooltip": "Часовой пояс для cron-расписания. По умолчанию: UTC",
    "taskTypeTooltip": "Выберите 'text' для простых текстовых задач или 'agent' для сложных сценариев с агентом.",
    "textTooltip": "Простая текстовая задача: здесь указывается фактический текст сообщения. Обязательно при типе задачи «text».",
    "requestInputTooltip": "Содержимое сообщения в формате JSON. Именно это агент получит и обработает. Обязательно при типе задачи «agent».",
    "requestInputExample": "Формат: [{\"role\":\"user\",\"content\":[{\"type\":\"text\",\"text\":\"Ваше сообщение\"}]}]",
    "requestSessionIdTooltip": "ID сессии для контекста запроса. Если не уверены, используйте 'default'.",
    "requestUserIdTooltip": "ID пользователя, который инициирует запрос. Для автоматических задач используйте 'system'.",
    "dispatchChannelTooltip": "Целевой канал, куда будет отправлен ответ (например, 'console', 'discord', 'imessage').",
    "dispatchTargetUserIdTooltip": "ID пользователя, который получит ответ в целевом канале.",
    "dispatchTargetSessionIdTooltip": "ID сессии, куда будет доставлен ответ в целевом канале.",
    "dispatchModeTooltip": "Выберите 'stream' для ответов в реальном времени или 'final' только для итоговых ответов.",
    "silentDeliveryTooltip": "Выполнить задачу агента с сохранением сессии и трассировки, но не отправлять результат в канал.",
    "shareSessionTooltip": "При включении используется общая сессия с целевым пользователем. При отключении каждый запуск создает изолированный контекст с уникальным ID. Подходит для независимых задач без памяти. По умолчанию: включено",
    "maxConcurrencyTooltip": "Максимальное количество одновременно выполняемых экземпляров этой задачи. По умолчанию: 1",
    "timeoutSecondsTooltip": "Максимальное время выполнения в секундах. При превышении задача будет остановлена.",
    "misfireGraceSecondsTooltip": "Льготный период для пропущенных запусков. Если задача пропустила время запуска больше чем на это значение, она не будет выполнена.",
    "toolSafetyTooltip": "При включении рискованные вызовы инструментов требуют одобрения пользователя (может блокировать автоматические задачи). При выключении все инструменты выполняются без одобрения. По умолчанию: выключено",
    "executeNowTitle": "Выполнить задачу сейчас",
    "executeNowContent": "Вы уверены, что хотите выполнить «{{name}}» прямо сейчас?",
    "executeNowConfirm": "Выполнить сейчас",
    "createFromTemplate": "Создать из шаблона",
    "templateModalTitle": "Выберите шаблон задачи",
    "templateModalDescription": "Выберите встроенный шаблон и при необходимости измените ключевые параметры на панели перед сохранением.",
    "useTemplate": "Использовать шаблон",
    "templateTagPersonal": "Личное",
    "templateTagTeam": "Команда",
    "templateTagReminder": "Напоминание",
    "templateTagCalendar": "Календарь",
    "templateTagCalendarRecommended": "Рекомендуется для календаря",
    "saveResultToInbox": "Сохранять результат во входящих",
    "saveResultToInboxTooltip": "Если включено, успешные выполнения с успешной доставкой сохраняются во входящих. Ошибки доставки всегда записываются во входящие как резерв.",
    "scheduleFilterAll": "Все типы расписания",
    "scheduleTypeRecurring": "Повторяющаяся",
    "scheduleTypeOnce": "Запланированная",
    "onceRunAt": "Запуск в",
    "repeatEnabled": "Повтор",
    "repeatEnabledTooltip": "Включить повторяющееся расписание от этого времени начала",
    "repeatFrequency": "Частота повтора",
    "repeatEveryDays": "Повторять каждые (дни)",
    "repeatEveryPrefix": "Каждые",
    "repeatEverySuffix": "дн.",
    "repeatEndType": "Окончание повтора",
    "repeatEndNever": "Никогда",
    "repeatEndUntil": "До даты",
    "repeatEndCount": "Ограниченное число запусков",
    "repeatUntil": "Дата окончания",
    "repeatCount": "Число запусков",
    "pleaseSelectScheduleType": "Выберите тип расписания",
    "pleaseInputRunAt": "Выберите время запуска",
    "pleaseInputRepeatEveryDays": "Введите интервал повтора (дни)",
    "pleaseSelectRepeatEndType": "Выберите условие окончания",
    "pleaseInputRepeatUntil": "Выберите дату окончания",
    "pleaseInputRepeatCount": "Введите число запусков",
    "validation": {
      "cronRequired": "Для повторяющегося расписания требуется cron-выражение.",
      "runAtRequired": "Для одноразового расписания требуется время выполнения.",
      "repeatUntilRequired": "При выборе «До даты» необходимо указать дату окончания.",
      "repeatCountRequired": "При выборе «Ограниченное число запусков» необходимо указать количество запусков.",
      "repeatUntilAfterRunAt": "Дата окончания должна быть позже времени выполнения. Выберите дату окончания после времени выполнения.",
      "textRequired": "При типе задачи text содержимое сообщения обязательно.",
      "requestRequired": "При типе задачи agent содержимое запроса обязательно.",
      "invalidCronExpression": "Некорректное cron-выражение. Используйте формат из 5 полей."
    },
    "listView": "Список",
    "calendarView": "Календарь",
    "calendarEmptyHint": "Запланированных задач пока нет. Создайте задачи по расписанию, чтобы увидеть их в календаре.",
    "calendarMoreItems": "+ещё {{count}}",
    "calendarDayListTitle": "Запланированные задачи на {{date}}",
    "executionHistory": "История",
    "historyTitle": "История — {{name}}",
    "historyEmpty": "Записей о выполнении пока нет.",
    "historyStatusSuccess": "Успех",
    "historyStatusFailed": "Ошибка",
    "historyStatusRunning": "Выполняется",
    "historyStatusCancelled": "Отменено",
    "historyTriggerScheduled": "Запуск по расписанию",
    "historyTriggerManual": "Ручной запуск",
    "historyExpand": "Развернуть",
    "historyCollapse": "Свернуть",
    "templates": {
      "dailyTechNewsBrief": {
        "title": "Дайджест технических новостей",
        "description": "В 09:30 в будни собирать актуальные технические заголовки в краткий обзор.",
        "frequency": "Будни 09:30 (30 9 * * 1-5)"
      },
      "dailyEveningReflection": {
        "title": "Вечерняя рефлексия",
        "description": "В 20:00 в будни — короткая подсказка подвести итоги рабочего дня.",
        "frequency": "Будни 20:00 (0 20 * * 1-5)"
      },
      "weekendRelaxationReminder": {
        "title": "Напоминание отдохнуть на выходных",
        "description": "По утрам в выходные — подборка популярных фильмов для лёгкого отдыха.",
        "frequency": "Выходные 10:00 (0 10 * * 6,0)"
      },
      "pomodoroBreakReminder": {
        "title": "Напоминание о перерыве (помодоро)",
        "description": "В рабочие часы каждые 25 минут напоминать попить воды или дать глазам отдохнуть.",
        "frequency": "Будни 09:00–17:59 каждые 25 мин (*/25 9-17 * * 1-5)"
      },
      "petCareReminder": {
        "title": "Питомец: глистогонное / прививка",
        "description": "15-го числа каждого месяца вечером — напоминание о дегельминтизации или следующей прививке.",
        "frequency": "Ежемесячно 15-го в 20:00 (0 20 15 * *)"
      },
      "onceTextBirthdayReminder": {
        "title": "Напоминание о дне рождения",
        "description": "Напомнить, что у xx день рождения 1 января.",
        "frequency": "Выполнить: 2026-01-01 09:00"
      },
      "onceAgentBusinessTripPrep": {
        "title": "Подготовка к командировке",
        "description": "Проверить погоду в пункте назначения и предложить рекомендации по подготовке к поездке.",
        "frequency": "Выполнить: 2026-01-01 20:00"
      },
      "repeatCountTextMedicineReminder": {
        "title": "Напоминание о лекарствах (14 раз)",
        "description": "Напоминать вовремя принимать лекарства в рамках курса из 14 запусков.",
        "frequency": "Первый запуск: 2026-01-01 09:00 | Каждые 1 день | 14 запусков"
      },
      "repeatCountAgentDietPlan": {
        "title": "План питания на 14 дней",
        "description": "Генерировать и отправлять ежедневные рекомендации по питанию в течение 14 дней.",
        "frequency": "Первый запуск: 2026-01-01 08:00 | Каждые 1 день | 14 запусков"
      },
      "repeatUntilTextWeeklyMeeting": {
        "title": "Напоминание о еженедельной встрече (2 месяца)",
        "description": "Еженедельно напоминать о встрече до установленной даты окончания.",
        "frequency": "Первый запуск: 2026-01-02 08:45 | Каждые 7 дней | До 2026-03-01"
      },
      "repeatUntilAgentWeeklySummary": {
        "title": "Недельный итог перед встречей",
        "description": "Перед каждой недельной встречей формировать рабочий итог на основе memory за последнюю неделю.",
        "frequency": "Первый запуск: 2026-01-02 08:30 | Каждые 7 дней | До 2026-03-01"
      }
    }
  },
  "channels": {
    "title": "Каналы",
    "description": "Управление и настройка каналов сообщений",
    "loading": "Загрузка каналов...",
    "configSaved": "Конфигурация успешно сохранена",
    "configFailed": "Не удалось сохранить конфигурацию",
    "channelType": "Тип канала",
    "status": "Статус",
    "totalItems": "Всего {{count}} элементов",
    "botPrefix": "Префикс бота",
    "showToolCalls": "Показывать сведения о вызове инструмента",
    "showToolCallsTooltip": "Показывать пользователям сведения о вызове инструмента (выключите, чтобы скрыть)",
    "showToolResults": "Показывать сведения о результате инструмента",
    "showToolResultsTooltip": "Показывать пользователям сведения о результате инструмента (выключите, чтобы скрыть)",
    "toolCallMaxLength": "Максимальная длина отображения вызова инструмента",
    "toolResultMaxLength": "Максимальная длина отображения результата инструмента",
    "toolMaxLengthTooltip": "Установите 0, чтобы не ограничивать длину",
    "showThinking": "Показывать рассуждения",
    "showThinkingTooltip": "Показывать пользователям рассуждения модели (выключите, чтобы скрыть)",
    "noTextDebounce": "Дебаунс без текста",
    "noTextDebounceTooltip": "Если включено, сообщения только с медиа (изображения/видео/файлы) буферизуются до прихода текстового сообщения, затем объединяются. Отключите для немедленной обработки всех сообщений. Голосовые сообщения всегда обрабатываются немедленно.",
    "streamingEnabled": "Потоковый вывод",
    "streamingEnabledDingtalkHint": "Действует только при типе сообщения Card",
    "streamingEnabledFeishuHint": "Необходимо включить разрешение cardkit:card:write на странице управления разрешениями открытой платформы Feishu",
    "ackMessage": "Сообщение подтверждения",
    "ackMessageTooltip": "Отправить мгновенный ответ при получении сообщения до начала обработки агентом. Оставьте пустым для отключения.",
    "ackMessagePlaceholder": "⏳ Обработка...",
    "notSet": "Не задано",
    "clickCardToEdit": "Нажмите на карточку для редактирования",
    "settings": "Настройки",
    "channelSettings": "Настройки канала",
    "pleaseInputDbPath": "Пожалуйста, введите путь к БД",
    "pleaseInputPollInterval": "Пожалуйста, введите интервал опроса",
    "discordBotToken": "Токен Discord-бота",
    "acceptBotMessages": "Принимать сообщения от ботов",
    "acceptBotMessagesTooltip": "При включении будут приниматься сообщения от других ботов",
    "httpProxyPlaceholder": "http://127.0.0.1:18118",
    "httpProxyAuthPlaceholder": "user:password",
    "dbPathPlaceholder": "~/Library/Messages/chat.db",
    "botPrefixPlaceholder": "@bot",
    "dmPolicy": "Политика личных сообщений",
    "dmPolicyTooltip": "Кто может взаимодействовать с ботом в личных сообщениях. Open: все; Allowlist: только авторизованные пользователи",
    "groupPolicy": "Политика групп",
    "groupPolicyTooltip": "Кто может взаимодействовать с ботом в групповых чатах. Open: все; Allowlist: только авторизованные пользователи",
    "requireMention": "Требовать @упоминание",
    "requireMentionTooltip": "Бот отвечает в групповых чатах только при явном @упоминании",
    "policyOpen": "Open",
    "policyAllowlist": "Allowlist",
    "allowFrom": "Пользователи allowlist",
    "allowFromTooltip": "Список ID пользователей, которым разрешено взаимодействовать с ботом. Включите белый список, затем напишите боту в ЛС — ваш ID будет в сообщении об отказе",
    "allowFromPlaceholder": "Введите ID пользователя и нажмите Enter, чтобы добавить",
    "denyMessage": "Сообщение об отказе",
    "denyMessageTooltip": "Пользовательское сообщение для пользователей, которым отказан доступ",
    "twilioAccountSid": "Twilio Account SID",
    "twilioAuthToken": "Twilio Auth Token",
    "phoneNumber": "Номер телефона",
    "phoneNumberSid": "Phone Number SID",
    "phoneNumberSidHelp": "Можно найти в разделе Phone Numbers → Active Numbers в Twilio Console.",
    "ttsProvider": "TTS-провайдер",
    "ttsVoice": "TTS-голос",
    "sttProvider": "STT-провайдер",
    "language": "Язык",
    "welcomeGreeting": "Приветственное сообщение",
    "voiceSetupGuide": "Создайте аккаунт Twilio, купите номер телефона и затем введите данные ниже. Account SID и Auth Token находятся на панели Twilio Console. Phone Number SID указан в разделе Phone Numbers → Active Numbers.",
    "voiceSetupLink": "Открыть Twilio Console",
    "sipSetupGuide": "Настройте SIP-регистратор (например, Asterisk, FreeSWITCH) и введите учётные данные SIP ниже. В режиме Dev pyVoIP обрабатывает SIP/RTP локально. В режиме Production используется LiveKit SIP Server.",
    "sipMode": "Режим SIP",
    "sipModeTooltip": "Dev: Python pyVoIP для локального тестирования. Production: LiveKit SIP Server для высокой нагрузки.",
    "sipServer": "SIP-сервер",
    "sipServerPlaceholder": "Оставьте пустым для встроенного регистратора",
    "sipServerPlaceholderLivekit": "Не требуется для режима LiveKit",
    "sipUsername": "Имя пользователя SIP",
    "sipPassword": "Пароль SIP",
    "sipPort": "Порт SIP",
    "sipTransport": "Транспорт",
    "sipDashscopeApiKey": "DashScope API Key",
    "sipDashscopeApiKeyTooltip": "API-ключ для Aliyun DashScope STT/TTS. Если пусто, используется переменная окружения DASHSCOPE_API_KEY.",
    "livekitUrl": "LiveKit URL",
    "livekitApiKey": "LiveKit API Key",
    "livekitApiSecret": "LiveKit API Secret",
    "livekitSipTrunkId": "LiveKit SIP Trunk ID",
    "livekitRoomName": "Имя комнаты LiveKit",
    "livekitRoomNameTooltip": "Имя комнаты LiveKit для ожидания SIP-вызовов. Должно совпадать с именем комнаты в правиле SIP Dispatch Rule.",
    "loginWeCom": "Получить QR-код WeCom",
    "wecomSetupGuide": "При создании бота через QR-код, на этапе авторизации возможностей бота выберите «Пропустить авторизацию». Если выбрать «Подтвердить авторизацию», другие пользователи, кроме создателя бота, могут не иметь возможности взаимодействовать с ботом.",
    "wecomScanAuth": "Сканировать для авторизации",
    "wecomAuthHint": "Отсканируйте QR-код выше с помощью WeCom для авторизации. Bot ID и Secret будут заполнены автоматически.",
    "wecomAuthSuccess": "Бот WeCom авторизован. Bot ID и Secret заполнены автоматически.",
    "wecomQrcodeFailed": "Не удалось получить QR-код WeCom. Попробуйте ещё раз.",
    "slackBotToken": "Bot Token",
    "slackBotTokenTooltip": "Slack Bot User OAuth Token, начинается с xoxb-",
    "slackAppToken": "App Token",
    "slackAppTokenTooltip": "Slack App-Level Token для Socket Mode, начинается с xapp-",
    "slackProxyTooltip": "URL HTTP-прокси для подключения к Slack API",
    "dingtalkSetupGuide": "Отсканируйте QR-код в DingTalk для мгновенного создания бота. Приложение DingTalk будет создано автоматически, а Client ID и Client Secret будут заполнены.",
    "dingtalkScanAuth": "Сканировать для создания бота",
    "dingtalkGetQrcode": "Получить QR-код DingTalk",
    "dingtalkScanHint": "Отсканируйте QR-код выше с помощью DingTalk. Client ID и Client Secret будут заполнены автоматически после авторизации.",
    "dingtalkAuthSuccess": "Бот DingTalk создан. Client ID и Client Secret заполнены автоматически.",
    "dingtalkQrcodeFailed": "Не удалось получить QR-код DingTalk. Попробуйте ещё раз.",
    "dingtalkQrcodeExpired": "QR-код истёк. Получите новый.",
    "qqSetupGuide": "Отсканируйте QR-код с помощью QQ, чтобы авторизовать бота. После сканирования APP ID и Client Secret будут автоматически получены и введены в поле.",
    "qqScanAuth": "Отсканируйте штрихкод, чтобы авторизовать бота",
    "qqGetQrcode": "Получить QR-код QQ",
    "qqScanHint": "Отсканируйте QR-код выше с помощью QQ. После завершения авторизации APP ID и Client Secret будут автоматически введены в поле.",
    "qqAuthSuccess": "Авторизация бота QQ прошла успешно, APP ID и Client Secret уже введены в поле.",
    "qqQrcodeFailed": "Не удалось получить QR-код QQ. Попробуйте позже.",
    "qqQrcodeExpired": "Срок действия QR-кода истек. Пожалуйста, получите новый.",
    "atSenderOnReply": "@ отправителя при ответе",
    "atSenderOnReplyTooltip": "При включении бот будет упоминать отправителя в первом сообщении ответа в групповых чатах. Примечание: в режиме карточек @упоминание работает только для внутренних сотрудников организации.",
    "dingtalkEndpoint": "API Endpoint",
    "dingtalkEndpointTooltip": "Пользовательский API-адрес для приватного развёртывания DingTalk. Оставьте пустым для использования официального адреса по умолчанию.",
    "wecomCancelled": "Авторизация отменена",
    "wecomAuthFailed": "Ошибка авторизации: {{msg}}",
    "filterAll": "Все",
    "builtin": "Встроенные",
    "custom": "Пользовательские",
    "feishuRegion": "Регион",
    "feishuRegionTooltip": "Выберите Feishu для Китая или Lark для международного использования",
    "feishuChina": "Feishu (Китай)",
    "feishuInternational": "Lark (Международный)",
    "feishuScanGuide": "Отсканируйте QR-код в Feishu для мгновенного создания бота. Приложение Feishu будет создано автоматически, а App ID и App Secret будут заполнены.",
    "feishuScanLogin": "Сканировать для создания бота",
    "feishuGetQrcode": "Получить QR-код Feishu",
    "feishuScanHint": "Отсканируйте QR-код выше с помощью Feishu. App ID и App Secret будут заполнены автоматически после авторизации.",
    "feishuAuthSuccess": "Бот Feishu создан. App ID и App Secret заполнены автоматически.",
    "feishuQrcodeExpired": "QR-код истёк. Получите новый.",
    "feishuQrcodeFailed": "Не удалось получить QR-код Feishu. Попробуйте ещё раз.",
    "wechatSetupGuide": "Бот для личного аккаунта WeChat (протокол iLink). При первом запуске без Bot Token будет выведена ссылка на QR-код для авторизации. Токен сохраняется локально для дальнейшего использования.",
    "wechatContextTokenLimit": "Ограничение платформы WeChat iLink: context_token каждого сообщения пользователя позволяет отправить максимум 10 ответных сообщений. Это жёсткое ограничение платформы. Рекомендуется отключить вывод размышлений и инструментов или включить функцию объединения сообщений, чтобы избежать превышения лимита и ошибок отправки.",
    "wechatBotToken": "Bot Token",
    "wechatBotTokenTooltip": "Bearer-токен, полученный после входа по QR-коду. Оставьте пустым для запуска процедуры входа при старте.",
    "wechatBotTokenPlaceholder": "Заполняется автоматически после QR-входа или введите вручную",
    "wechatBotTokenFile": "Путь к файлу токена",
    "wechatBotTokenFileTooltip": "Путь для сохранения Bot Token. По умолчанию: ~/.qwenpaw/wechat_bot_token",
    "wechatMediaDir": "Директория медиафайлов",
    "wechatMessageMerge": "Объединение сообщений",
    "wechatMessageMergeTooltip": "Объединяет несколько ответных сообщений для отправки меньшим количеством, чтобы не превышать лимит WeChat в 10 сообщений на context_token. При задержке 0 все текстовые ответы объединяются в одно сообщение в конце запроса. Положительная задержка (в мс) объединяет соседние сообщения в указанном временном окне.",
    "wechatMessageMergeDelayMs": "Задержка объединения (мс)",
    "wechatMessageMergeDelayMsTooltip": "Временное окно для объединения соседних сообщений. Значение 0 объединяет все сообщения в один финальный ответ. Положительное значение (напр. 1000) буферизует сообщения в течение указанного периода перед отправкой.",
    "wechatMessageMergeDelayMsValidation": "Введите допустимое неотрицательное целое число",
    "wechatScanLogin": "Войти через QR-код",
    "wechatGetQrcode": "Получить QR-код для входа",
    "wechatScanHint": "Отсканируйте QR-код в WeChat, затем нажмите Сохранить",
    "wechatQrcodeFailed": "Не удалось получить QR-код, попробуйте снова",
    "wechatLoginSuccess": "Вход через WeChat выполнен, токен заполнен",
    "wechatQrcodeExpired": "QR-код истёк, получите новый",
    "shareSessionInGroup": "Общий контекст в группе",
    "shareSessionInGroupTooltip": "Если включено, все участники группы используют общий контекст разговора. Если выключено, у каждого участника независимый контекст.",
    "accessControlEnabled": "Контроль доступа",
    "accessControlEnabledTooltip": "При включении только пользователи из белого списка могут взаимодействовать с ботом. Неизвестным пользователям отображается их ID и они добавляются в список ожидания.",
    "accessControlDm": "Контроль доступа в ЛС",
    "accessControlDmTooltip": "При включении только пользователи из белого списка могут общаться с ботом в личных сообщениях",
    "accessControlGroup": "Контроль доступа в группах",
    "accessControlGroupTooltip": "При включении только пользователи из белого списка могут общаться с ботом в групповых чатах",
    "dmDisabled": "Отключить ЛС",
    "dmDisabledTooltip": "При включении бот будет полностью игнорировать все личные сообщения",
    "groupDisabled": "Отключить группы",
    "groupDisabledTooltip": "При включении бот будет полностью игнорировать все групповые сообщения",
    "manageAccessControl": "Контроль доступа",
    "pendingApprovals": "Ожидают одобрения",
    "whitelist": "Белый список",
    "blacklist": "Чёрный список",
    "addUser": "Добавить",
    "addUserPlaceholder": "Введите ID пользователя",
    "userId": "ID пользователя",
    "username": "Имя пользователя",
    "channel": "Канал",
    "firstMessage": "Первое сообщение",
    "time": "Время",
    "actions": "Действия",
    "approve": "Белый список",
    "deny": "Чёрный список",
    "dismiss": "Отклонить",
    "noWhitelistUsers": "Нет пользователей в белом списке",
    "noBlacklistUsers": "Нет пользователей в чёрном списке",
    "noPendingApprovals": "Нет ожидающих одобрения",
    "userAdded": "Пользователь добавлен",
    "userRemoved": "Пользователь удалён",
    "approveSuccess": "Добавлен в белый список",
    "denySuccess": "Добавлен в чёрный список",
    "dismissSuccess": "Отклонено",
    "operationFailed": "Операция не удалась",
    "remark": "Примечание",
    "usernamePlaceholder": "Введите имя пользователя (необязательно)",
    "remarkPlaceholder": "Введите примечание (необязательно)",
    "filterByChannel": "Фильтр по каналу",
    "selectToOperate": "Выберите элементы для операции",
    "selectedCount": "Выбрано: {{count}}",
    "batchApprove": "Одобрить",
    "batchDeny": "В чёрный список",
    "batchDismiss": "Удалить",
    "batchApproveConfirm": "Одобрить {{count}} пользователей?",
    "batchDenyConfirm": "Добавить {{count}} пользователей в чёрный список?",
    "batchDismissConfirm": "Удалить {{count}} пользователей?",
    "batchSuccess": "{{count}} пользователей обработано",
    "batchRemove": "Удалить",
    "batchRemoveConfirm": "Удалить {{count}} выбранных пользователей?",
    "enabledSection": "Активированные",
    "enabledCount": "{{count}}",
    "availableSection": "Доступные",
    "enableAction": "Активировать",
    "noEnabledChannels": "Нет активированных каналов",
    "goEnableChannels": "Активировать каналы"
  },
  "sessions": {
    "title": "Сессии",
    "description": "Просмотр и управление активными чат-сессиями",
    "loading": "Загрузка сессий...",
    "confirmDelete": "Подтвердить удаление",
    "deleteConfirm": "Вы уверены, что хотите удалить эту сессию?",
    "batchDeleteConfirm": "Вы уверены, что хотите удалить выбранные сессии ({{count}})?",
    "deleteSuccess": "Сессия успешно удалена",
    "deleteFailed": "Не удалось удалить сессию",
    "batchDeleteSuccess": "Успешно удалено сессий: {{count}}",
    "batchDeleteFailed": "Не удалось массово удалить сессии",
    "saveSuccess": "Сессия успешно сохранена",
    "saveFailed": "Не удалось сохранить сессию",
    "batchDeleteButton": "Массовое удаление",
    "filterTitle": "Фильтр по названию",
    "filterUserId": "Фильтр по ID пользователя",
    "filterChannel": "Фильтр по каналу",
    "allChannels": "Все каналы",
    "totalItems": "Всего {{count}} элементов",
    "selectedItems": "Выбрано {{count}} элементов",
    "editSession": "Редактировать сессию",
    "pleaseInputName": "Пожалуйста, введите название сессии",
    "sessionNamePlaceholder": "Название сессии",
    "activeTab": "Активные",
    "archivedTab": "Архив",
    "archivedAtColumn": "Дата архивации",
    "archive": {
      "action": "Архивировать",
      "unaction": "Разархивировать",
      "batchAction": "Архивировать выбранные",
      "batchUnaction": "Разархивировать выбранные",
      "success": "Чат архивирован",
      "successHint": "Чат архивирован. Смотрите в Панель управления > Сессии > Архив.",
      "failed": "Не удалось архивировать",
      "unarchiveSuccess": "Чат разархивирован",
      "unarchiveFailed": "Не удалось разархивировать",
      "batchSuccess": "{{count}} чат(ов) архивировано",
      "batchFailed": "Не удалось архивировать выбранные",
      "batchUnarchiveSuccess": "{{count}} чат(ов) разархивировано",
      "batchUnarchiveFailed": "Не удалось разархивировать выбранные",
      "groupLabel": "Архив ({{count}})",
      "modalTitle": "Архивированные чаты",
      "unarchiveAll": "Разархивировать все",
      "noArchived": "Нет архивированных чатов"
    }
  },
  "environments": {
    "parent": "Настройки",
    "environments": "Переменные окружения",
    "title": "Переменные окружения",
    "description": "Настройка переменных окружения (ключ-значение) для агентов и навыков.",
    "key": "Ключ",
    "value": "Значение",
    "variableNamePlaceholder": "VARIABLE_NAME",
    "valuePlaceholder": "value",
    "insertRowBelow": "Вставить строку ниже",
    "deleteRow": "Удалить строку",
    "deleteVariable": "Удалить переменную",
    "deleteConfirm": "Удалить «{{name}}»?",
    "deleteSelected": "Удалить выбранные",
    "deleteSelectedConfirm": "Удалить {{label}}?",
    "keyRequired": "Ключ обязателен",
    "invalidKeyFormat": "Неверный формат ключа",
    "duplicateKey": "Дубликат ключа",
    "saveSuccess": "Переменные окружения сохранены",
    "saveFailed": "Не удалось сохранить",
    "deleteSuccess": "«{{name}}» удалено",
    "deleteFailed": "Не удалось удалить",
    "noVariables": "Переменные окружения пока не настроены.",
    "addVariable": "Добавить переменную",
    "loading": "Загрузка…",
    "retry": "Повторить",
    "of": "из",
    "selected": "выбрано",
    "variable": "переменная",
    "variables": "переменных",
    "showValue": "Показать значение",
    "hideValue": "Скрыть значение"
  },
  "tokenUsage": {
    "title": "Использование токенов",
    "totalTokens": "Всего токенов",
    "totalCalls": "Всего вызовов",
    "promptTokens": "Входные токены",
    "completionTokens": "Выходные токены",
    "byModel": "По модели",
    "byDate": "По дате",
    "model": "Модель",
    "date": "Дата",
    "loadFailed": "Не удалось загрузить данные об использовании токенов",
    "noData": "Нет данных об использовании токенов за выбранный период",
    "modelTrend": "Тренд использования моделей",
    "tokenTypeChart": "Тренд типов токенов",
    "selectAll": "Выбрать все",
    "allSelected": "Все",
    "itemsSelected": "Выбрано: {{count}}",
    "selectModels": "Выберите модели",
    "selectTokenTypes": "Выберите типы токенов"
  },
  "agentStats": {
    "title": "Статистика агента",
    "description": "Просмотр статистики агента за выбранный период.",
    "totalSessions": "Всего сессий",
    "totalMessages": "Всего сообщений",
    "userMessages": "Сообщения пользователя",
    "assistantMessages": "Сообщения ассистента",
    "promptTokens": "Входные токены",
    "completionTokens": "Выходные токены",
    "llmCalls": "Вызовы LLM",
    "toolCalls": "Вызовы инструментов",
    "channel": "Канал",
    "sessionCount": "Сессий",
    "sessions": "Сессии",
    "newSessions": "Новые сессии",
    "activeSessions": "Активные сессии",
    "messages": "Сообщения",
    "messageTrend": "Динамика сообщений",
    "sessionTrend": "Динамика сессий",
    "tokenTrend": "Динамика токенов",
    "llmAndToolTrend": "Динамика вызовов LLM и инструментов",
    "sessionsByChannel": "Сессии по каналам",
    "messagesByChannel": "Сообщения по каналам",
    "totalSessionsTooltip": "Всего созданных чат-сессий. Каждая сессия — независимый контекст разговора",
    "totalMessagesTooltip": "Всего сообщений во всех сессиях, включая сообщения пользователя и ассистента",
    "promptTokensTooltip": "Всего отправленных LLM промпт-токенов",
    "completionTokensTooltip": "Всего сгенерированных LLM токенов завершения",
    "llmCallsTooltip": "Количество вызовов LLM API. Каждый запрос считается за один вызов",
    "toolCallsTooltip": "Количество решений агента вызвать инструмент. Один вызов LLM может породить несколько намерений использования инструментов",
    "messageTrendTooltip": "Сравнение сообщений пользователя и ассистента по дням",
    "sessionTrendTooltip": "Сравнение новых и активных сессий по дням. Оранжевые столбцы — созданные в этот день сессии, синие — сессии с сообщениями в этот день",
    "tokenTrendTooltip": "Динамика потребления входных и выходных токенов",
    "llmAndToolTrendTooltip": "Сравнение вызовов LLM и намерений использования инструментов по дням",
    "sessionsByChannelTooltip": "Распределение сессий по каналам. Сессии без канала по умолчанию группируются в Console",
    "messagesByChannelTooltip": "Распределение общего количества сообщений по каналам",
    "loadFailed": "Не удалось загрузить статистику",
    "noData": "Нет статистических данных за выбранный период",
    "retry": "Повторить"
  },
  "modelSelector": {
    "selectModel": "Выбрать модель",
    "noConfiguredModels": "Нет настроенных моделей",
    "noFreeModels": "Нет доступных бесплатных моделей",
    "switchFailed": "Не удалось переключить модель",
    "searchModels": "Поиск моделей...",
    "noModelsFound": "Подходящие модели не найдены",
    "free": "Бесплатно",
    "vision": "Видение",
    "freeBannerText": "Бесплатные модели могут иметь лимиты использования и работать нестабильно. Подробности уточняйте у провайдера.",
    "moreProviders": "Больше бесплатных провайдеров (нужен API Key)",
    "proBannerText": "Показаны модели, настроенные в разделе Настройки.",
    "connectToUse": "Подключить {{provider}} для бесплатных моделей",
    "configureApiKey": "Настроить API Key {{provider}} для бесплатных моделей",
    "configureApiKeyTitle": "Перейти к настройке",
    "configureApiKeyConfirm": "Вы будете перенаправлены на страницу моделей для настройки API Key {{provider}}. Продолжить?",
    "goToConfigure": "Перейти",
    "noModelsDiscovered": "Подключено. Загрузка моделей...",
    "oauthTitle": "Подключиться к {{provider}}",
    "oauthDescription": "Откроется новое окно браузера для авторизации доступа к {{provider}}. API-ключ будет сохранён автоматически.",
    "oauthContinue": "Продолжить",
    "oauthWaiting": "Ожидание авторизации...",
    "oauthWaitingDescription": "Пожалуйста, завершите авторизацию в окне браузера.",
    "oauthConnected": "Успешно подключено к {{provider}}",
    "oauthFailed": "Авторизация не удалась, попробуйте снова",
    "viewMore": "Показать ещё ({{count}})"
  },
  "models": {
    "llmConfiguration": "Конфигурация LLM",
    "providersTitle": "Провайдеры",
    "providersDescription": "Настройте API-ключи и endpoints для каждого провайдера.",
    "llmTitle": "Модели",
    "defaultLlm": "LLM по умолчанию",
    "llmDescription": "Здесь задается глобальная модель LLM по умолчанию у авторизованного провайдера. Для конкретного Agent модель можно выбрать отдельно на странице Chat.",
    "configureProvider": "Настроить {{name}}",
    "baseURL": "Базовый URL",
    "apiKey": "API-ключ",
    "advancedConfig": "Расширенная конфигурация",
    "authMode": "Режим аутентификации",
    "authModeApiKey": "API Key (x-api-key)",
    "authModeAuthToken": "Auth Token (Authorization: Bearer)",
    "customHeaders": "Пользовательские заголовки",
    "customHeadersHint": "Добавляются к каждому запросу API, например x-app: cli",
    "customHeaderKey": "Название заголовка",
    "customHeaderValue": "Значение заголовка",
    "addHeader": "+ Добавить заголовок",
    "generateConfig": "Параметры генерации",
    "generateConfigHint": "Параметры генерации в формате JSON будут развёрнуты и переданы в запрос на генерацию (`openai.chat.completions` или `anthropic.messages`).",
    "generateConfigInvalidJson": "Пожалуйста, введите корректный JSON",
    "generateConfigMustBeObject": "Параметры генерации должны быть JSON-объектом",
    "modelAdvancedConfig": "Расширенная конфигурация модели",
    "modelGenerateConfig": "Параметры генерации модели",
    "modelGenerateConfigHint": "Параметры генерации в формате JSON для этой модели. Они будут развёрнуты и переданы в запрос на генерацию. Имеют приоритет над расширенной конфигурацией провайдера.",
    "modelConfigSaved": "Конфигурация модели {{name}} сохранена",
    "modelConfigSaveFailed": "Не удалось сохранить конфигурацию модели",
    "modelConfigLabel": "Конфигурация модели",
    "maxTokensLabel": "Макс. токенов",
    "maxTokensHint": "Максимальное количество выходных токенов на ответ",
    "maxInputLengthLabel": "Макс. длина контекста",
    "maxInputLengthHint": "Размер контекстного окна модели, управляет порогом сжатия контекста (≥1000)",
    "relayReasoningLabel": "Передавать рассуждения",
    "relayReasoningHint": "Передавать содержимое рассуждений в последующие ходы диалога",
    "thinkingModeLabel": "Включить мышление",
    "thinkingModeHint": "Включите для активации мышления/рассуждения. Выключите для отключения мышления.",
    "thinkingBudgetLabel": "Бюджет мышления",
    "thinkingBudgetHint": "Используется бюджет мышления по умолчанию",
    "switchToManual": "Вручную",
    "switchToAuto": "Авто",
    "reasoningEffortLabel": "Глубина рассуждения",
    "reasoningEffortHint": "Управляет глубиной рассуждения (семейство OpenAI)",
    "protocol": "Протокол",
    "protocolHint": "Выберите протокол API провайдера для этой конфигурации.",
    "selectProtocol": "Пожалуйста, выберите протокол",
    "protocolOpenAI": "OpenAI-совместимый (Chat Completions)",
    "protocolOpenAIResponse": "OpenAI-совместимый (Response API)",
    "protocolAnthropic": "Anthropic (Messages API)",
    "currentKey": "Текущий: {{key}}",
    "startsWith": "Начинается с «{{prefix}}»",
    "optionalSelfHosted": "Необязательно для self-hosted сервисов",
    "leaveBlankKeep": "Оставьте пустым, чтобы сохранить текущий ключ",
    "enterApiKey": "Введите API-ключ ({{prefix}}...)",
    "enterApiKeyOptional": "Введите API-ключ (необязательно)",
    "openAIEndpoint": "OpenAI endpoint, например https://api.openai.com/v1",
    "openAICompatibleEndpoint": "OpenAI-совместимый endpoint, например https://api.example.com (добавляйте /v1 только если ваш провайдер этого требует)",
    "azureEndpointHint": "Azure OpenAI endpoint, например https://<resource>.openai.azure.com/openai/v1",
    "anthropicEndpointHint": "Anthropic endpoint, например https://api.anthropic.com",
    "ollamaEndpointHint": "Ollama endpoint, например http://localhost:11434",
    "lmstudioEndpointHint": "LM Studio endpoint, например http://localhost:1234/v1",
    "apiEndpointHint": "API endpoint, например https://api.example.com",
    "pleaseEnterBaseURL": "Пожалуйста, введите базовый URL API",
    "selectBaseURL": "Выберите базовый URL",
    "selectBaseURLHint": "Выберите региональную конечную точку этого провайдера",
    "pleaseEnterValidURL": "Пожалуйста, введите корректный URL",
    "apiKeyShouldStart": "API-ключ должен начинаться с «{{prefix}}»",
    "configurationSaved": "Конфигурация {{name}} сохранена",
    "failedToSaveConfig": "Не удалось сохранить конфигурацию",
    "revokeAuthorization": "Отозвать авторизацию",
    "revokeConfirmContent": "Вы уверены, что хотите удалить API-ключ для {{name}}? Текущая конфигурация LLM-модели также будет очищена.",
    "revokeConfirmSimple": "Вы уверены, что хотите удалить API-ключ для {{name}}?",
    "authorizationRevoked": "Авторизация {{name}} отозвана, LLM-модель очищена",
    "authorizationRevokedSimple": "Авторизация {{name}} отозвана",
    "failedToRevoke": "Не удалось отозвать авторизацию",
    "active": "Активно: {{provider}} / {{model}}",
    "provider": "Провайдер",
    "model": "Модель",
    "selectProvider": "Выберите провайдера (должен быть авторизован)",
    "selectModel": "Выберите модель",
    "llmModelUpdated": "LLM-модель обновлена",
    "failedToSave": "Не удалось сохранить",
    "freeModelWarningTitle": "Уведомление о бесплатной модели",
    "freeModelWarningMessage": "Бесплатные модели могут работать нестабильно. Подробности смотрите в условиях провайдера:",
    "freeModelWarningDontShowAgain": "Больше не показывать",
    "saved": "Сохранено",
    "save": "Сохранить",
    "cancel": "Отмена",
    "loading": "Загрузка...",
    "retry": "Повторить",
    "notSet": "Не задано",
    "notRequired": "Не требуется",
    "available": "Доступно",
    "unavailable": "Недоступно",
    "providerAvailable": "Готово (есть модели)",
    "providerNoModels": "Не готово (нет моделей)",
    "search": "Поиск",
    "searchPlaceholder": "Поиск провайдеров...",
    "searchModelPlaceholder": "Поиск моделей...",
    "providerNotConfigured": "Не готово (не настроено)",
    "settings": "Настройки",
    "actions": "Действия",
    "custom": "Пользовательский",
    "builtin": "Встроенный",
    "freeTierGroup": "Бесплатный уровень",
    "paidGroup": "Платные",
    "localCustomGroup": "Локальные и пользовательские",
    "endpointCount": "{{count}} конечных точек",
    "connect": "OAuth",
    "saveApiKey": "Сохранить",
    "addProvider": "Добавить провайдера",
    "addProviderTitle": "Добавить пользовательского провайдера",
    "providerIdLabel": "ID провайдера",
    "providerIdPlaceholder": "например: openai, google, anthropic",
    "providerIdHint": "Строчные буквы, цифры, дефисы и подчёркивания. Нельзя изменить позже.",
    "providerNameLabel": "Отображаемое имя",
    "providerNamePlaceholder": "например: OpenAI, Google Gemini",
    "defaultBaseUrlLabel": "Базовый URL по умолчанию",
    "defaultBaseUrlPlaceholder": "например: https://api.example.com",
    "apiKeyPrefixLabel": "Префикс API-ключа (необязательно)",
    "apiKeyPrefixPlaceholder": "например: sk-",
    "providerCreated": "Провайдер «{{name}}» создан",
    "providerCreateFailed": "Не удалось создать провайдера",
    "deleteProvider": "Удалить провайдера",
    "deleteProviderConfirm": "Удалить пользовательского провайдера «{{name}}» и все его модели? Это действие нельзя отменить.",
    "providerDeleted": "Провайдер «{{name}}» удалён",
    "providerDeleteFailed": "Не удалось удалить провайдера",
    "manageModels": "Модели",
    "models": "Модели",
    "manageModelsTitle": "{{provider}} — Управление моделями",
    "userAdded": "Добавлено пользователем",
    "addModel": "Добавить модель",
    "addModels": "Добавить модели",
    "autoDiscoverModels": "Автообнаружение моделей",
    "addModelTitle": "Добавить модель в {{provider}}",
    "modelIdLabel": "ID модели",
    "modelIdPlaceholder": "например: gpt-4o, gemini-2.0-flash",
    "modelDiscoveryUnavailableHint": "Доступные модели не найдены. Возможно, этот провайдер не поддерживает получение списка моделей, поэтому введите ID модели вручную.",
    "modelNameLabel": "Название модели",
    "modelNameRequired": "Пожалуйста, введите название модели",
    "modelNamePlaceholder": "например: GPT-4o, Gemini 2.0 Flash",
    "modelAdded": "Модель «{{name}}» добавлена",
    "modelAddFailed": "Не удалось добавить модель",
    "modelAlreadyExists": "Модель с ID \"{{id}}\" уже существует",
    "autoDiscoverModelsSuccess": "Автообнаружение завершено. Добавлено моделей: {{count}}",
    "autoDiscoverModelsNoNew": "Автообнаружение завершено. Новых моделей не найдено",
    "autoDiscoverModelsFailed": "Не удалось автоматически обнаружить модели",
    "removeModel": "Удалить",
    "removeModelConfirm": "Удалить модель «{{name}}» из {{provider}}?",
    "modelRemoved": "Модель «{{name}}» удалена",
    "modelRemoveFailed": "Не удалось удалить модель",
    "loadMore": "Загрузить ещё ({{count}})",
    "modelsCount": "{{count}} моделей",
    "noModels": "Нет моделей",
    "addModelFirst": "Сначала добавьте модель",
    "modelList": "Список моделей",
    "clearAll": "Очистить всё",
    "filteredModelsLoaded": "Загружено отфильтрованных моделей: {{count}}",
    "filterFailed": "Не удалось отфильтровать модели",
    "clearAllModels": "Очистить все модели",
    "clearAllModelsConfirm": "Удалить все дополнительные модели (всего {{count}})? Это действие нельзя отменить.",
    "allModelsCleared": "Число удаленных моделей: {{count}}",
    "filterModels": "Фильтровать модели",
    "filterByProvider": "Провайдер:",
    "searchProviderPlaceholder": "Поиск по названию провайдера",
    "selectAllProviders": "Выбрать все",
    "clearProviderSelection": "Снять все",
    "noMatchingProviders": "Нет подходящих провайдеров",
    "filterByModality": "Модальность ввода:",
    "filterFreeOnly": "Только бесплатные модели:",
    "getModels": "Получить модели",
    "discovered": "Доступные модели:",
    "add": "Добавить",
    "local": "Локальные",
    "localType": "Тип",
    "localEmbedded": "Встроенная (в процессе)",
    "localDownloadFirst": "Сервис модели не запущен",
    "localDownloadModel": "Скачать модель",
    "localModelsTitle": "{{provider}} — Локальные модели",
    "localNoModels": "Пока нет скачанных моделей",
    "localRepoId": "ID репозитория модели",
    "localRepoIdRequired": "Пожалуйста, введите ID репозитория модели",
    "localRepoIdPlaceholder": "например: Qwen/Qwen3-0.6B-GGUF",
    "localFilename": "Имя файла (необязательно)",
    "localFilenamePlaceholder": "например: mistral-7b.Q4_K_M.gguf",
    "localFilenameHint": "Оставьте пустым для автоматического выбора лучшей квантизации",
    "localSource": "Источник",
    "localDownloadSuccess": "Модель успешно скачана",
    "localDownloadFailed": "Не удалось скачать модель",
    "localDeleteModel": "Удалить модель",
    "localDeleteConfirm": "Удалить локальную модель «{{name}}»? Файл модели будет удалён с диска.",
    "localModelDeleted": "Модель «{{name}}» удалена",
    "localDeleteFailed": "Не удалось удалить модель",
    "localDownloadPending": "Подготовка к загрузке...",
    "localDownloading": "Загрузка {{repo}}... Это может занять несколько минут.",
    "localDownloadNavigateHint": "Вы можете перейти на другую страницу — загрузка продолжится в фоне.",
    "localDownloadInProgress": "Загрузка уже выполняется",
    "localDownloaded": "Загружено",
    "localNotDownloaded": "Не загружено",
    "localNoRecommendedModels": "Текущая конфигурация устройства слишком слабая для запуска локальных моделей",
    "localCancelDownloadTitle": "Отменить загрузку",
    "localCancelDownloadAction": "Отменить загрузку",
    "localCancelDownloadConfirm": "Отменить загрузку «{{repo}}»?",
    "localDownloadCancelled": "Загрузка отменена",
    "localCancelDownloadFailed": "Не удалось отменить загрузку",
    "localLlamacppName": "Движок инференса",
    "localLlamacppInstallHint": "Сначала установите локальную среду, затем можно скачивать или запускать модель.",
    "localInstallLlamacpp": "Установить llama.cpp",
    "localLlamacppInstallStarted": "Загрузка llama.cpp началась",
    "localLlamacppInstallSuccess": "llama.cpp успешно установлен",
    "localLlamacppInstallFailed": "Не удалось установить llama.cpp",
    "localRuntimeSectionTitle": "Inference Engine",
    "localRuntimeSectionDescription": "Powered by Llama.cpp",
    "localRuntimeComputeHint": "По умолчанию используется CPU. Если нужна GPU-акселерация, используйте Ollama или LM Studio.",
    "localRuntimeInstalled": "Установлен",
    "localRuntimeUpdateAvailable": "Доступно обновление",
    "localRuntimeUpdateAction": "Нажмите, чтобы скачать последнюю версию",
    "localRuntimeUpdateConfirmTitle": "Подтвердите обновление llama.cpp",
    "localRuntimeUpdateConfirmContent": "Обновление перезапишет текущую установленную версию llama.cpp. Подтвердите, чтобы начать загрузку и установку последней версии.",
    "localRuntimeUpdateConfirmContentWithServer": "Обновление перезапишет текущую установленную версию llama.cpp и остановит запущенный сервис модели ({{model}}). Подтвердите, чтобы начать загрузку и установку последней версии.",
    "localRuntimeUnsupported": "Не поддерживается",
    "localRuntimeMissing": "Не установлен",
    "localServerRunningTitle": "Текущий локальный сервер",
    "localServerOnline": "Работает",
    "localServerIdle": "Недоступен",
    "localServerUnavailable": "Ошибка",
    "localNoActiveModel": "Нет активной модели",
    "localNoDownloadedModelsHint": "Сначала скачайте подходящую модель, а затем запускайте локальный сервис инференса.",
    "localDownloadModelFirst": "Сначала скачайте модель",
    "localEngineInstallStateLabel": "Установка",
    "localEngineRunStateLabel": "Статус",
    "localEngineCurrentModelLabel": "Текущая обслуживаемая модель",
    "localEngineNextStepLabel": "Следующий шаг",
    "localEngineHealthLabel": "Состояние движка",
    "localEngineStatusHint": "Скачайте и запустите подходящую модель из списка ниже",
    "localStartServer": "Запустить",
    "localStopServer": "Остановить",
    "localServerStartFailed": "Не удалось запустить локальный сервер",
    "localServerStopFailed": "Не удалось остановить локальный сервер",
    "localServerSwitchTitle": "Переключить запущенную модель",
    "localServerSwitchConfirm": "Сейчас запущена модель {{current}}. Переключить на {{next}}?",
    "localSwitchModel": "Переключить",
    "localModelPathMissing": "Для этой загруженной модели отсутствует локальный путь.",
    "localModelsSectionTitle": "Локальные модели",
    "localModelsSectionDescription": "Загруженные модели можно запускать сразу. Одновременно может выполняться только одна загрузка модели и один локальный сервер.",
    "localModelsLockedHint": "Сначала установите llama.cpp",
    "localAlternativeRuntimeHint": "Попробуйте использовать Ollama или LM Studio",
    "localModelsCount": "Загружено {{downloaded}} / {{total}}",
    "localCurrentDownloadTitle": "Текущая загрузка",
    "localAdvancedConfigTitle": "Расширенные настройки локальной модели",
    "localAdvancedConfigDescription": "Эти настройки применяются к встроенному локальному рантайму инференса. Изменения максимальной длины контекста вступят в силу при следующем запуске локального сервера.",
    "localAdvancedConfigSaved": "Расширенные настройки локальной модели сохранены",
    "localAdvancedConfigSaveFailed": "Не удалось сохранить расширенные настройки локальной модели",
    "localMaxContextLengthLabel": "Макс. длина контекста",
    "localMaxContextLengthHint": "Максимальное число токенов в контекстном окне модели, определяющее, сколько истории помещается в каждый запрос. Изменения вступят в силу при следующем запуске локального сервера.",
    "localMaxContextLengthRequired": "Укажите макс. длину контекста",
    "localMaxContextLengthMin": "Макс. длина контекста должна быть не меньше {{min}}",
    "localMaxContextLengthPlaceholder": "Введите макс. длину контекста",
    "localServerPortLabel": "Порт сервера",
    "localServerPortHint": "Оставьте поле пустым, чтобы llama.cpp автоматически выбрал свободный порт при запуске. Укажите порт, если хотите использовать фиксированный порт при следующих запусках. Изменения вступят в силу при следующем запуске локального сервера.",
    "localServerPortRange": "Порт сервера должен быть в диапазоне от {{min}} до {{max}}",
    "localServerPortPlaceholder": "Оставьте пустым для автовыбора порта",
    "localGenerateConfigHint": "Настройте параметры генерации локальной модели в виде JSON-объекта. Они будут развёрнуты в последующие запросы генерации.",
    "localCustomModelTitle": "Загрузка пользовательской модели",
    "localCustomModelHint": "Введите ID репозитория модели. Поддерживается только GGUF.",
    "localSourceHuggingFace": "Hugging Face",
    "localSourceModelScope": "ModelScope",
    "ollamaModelNamePlaceholder": "например: mistral:7b, qwen3:8b",
    "testConnection": "Проверить подключение",
    "testConnectionSuccess": "Проверка подключения прошла успешно",
    "testConnectionFailed": "Проверка подключения не удалась",
    "testConnectionFailedWithMessage": "Проверка подключения не удалась: {{message}}",
    "testConnectionError": "Произошла ошибка при проверке подключения",
    "discoverModels": "Обнаружить модели",
    "discoverModelsFailed": "Не удалось обнаружить модели",
    "ollamaFetchModelsFailed": "Не удалось получить список моделей Ollama. Проверьте подробности ошибки.",
    "modelTestFailed": "Проверка модели не пройдена, проверьте корректность ID модели",
    "modelTestFailedConfirm": "Тест подключения модели не пройден: {{message}}. Всё равно добавить эту модель?",
    "autoDiscoveredAndAdded": "Автоматически обнаружено {{count}} моделей и добавлено {{added}} новых",
    "autoDiscoveredNoNew": "Автоматически обнаружено {{count}} моделей; список моделей уже актуален",
    "autoDiscoverFailed": "Автоматическое обнаружение моделей не удалось; вы можете добавить модели вручную",
    "tagImage": "Изображение",
    "tagVideo": "Видео",
    "tagTextOnly": "Только текст",
    "tagMultimodal": "Мультимодальность",
    "tagVision": "Зрение",
    "tagText": "Текст",
    "free": "Бесплатно",
    "tagNotProbed": "Не проверено",
    "probeMultimodal": "Тест мультимодальности",
    "probeImage": "Изображение",
    "probeVideo": "Видео",
    "probeSupported": "Поддерживается: {{types}}",
    "probeNotSupported": "Эта модель не поддерживает мультимодальный ввод",
    "probeFailed": "Ошибка проверки",
    "modalityVision": "Изображение",
    "modalityAudio": "Аудио",
    "modalityVideo": "Видео",
    "modalityFile": "Файл",
    "modalityText": "Только текст",
    "perMillionIn": "/1M вх.",
    "perMillionOut": "/1M исх."
  },
  "agentConfig": {
    "title": "Конфигурация",
    "description": "Настройка параметров выполнения агента",
    "reactAgentTitle": "Агент ReAct",
    "llmRetryTitle": "Автоповтор LLM",
    "llmRetryEnabled": "Включить автоповтор",
    "llmRetryEnabledTooltip": "Автоматически повторять временные ошибки LLM API, такие как лимиты, таймауты и проблемы соединения. Применяется к новым запросам после сохранения.",
    "llmMaxRetries": "Макс. число повторов",
    "llmMaxRetriesTooltip": "Максимальное количество дополнительных повторов при временной ошибке LLM.",
    "llmMaxRetriesPlaceholder": "Введите макс. число повторов",
    "llmMaxRetriesRequired": "Требуется указать макс. число повторов",
    "llmMaxRetriesMin": "Макс. число повторов должно быть не меньше 1",
    "llmBackoffBase": "Базовая задержка backoff (с)",
    "llmBackoffBaseTooltip": "Базовая задержка перед первой повторной попыткой. Дальше используется экспоненциальный backoff.",
    "llmBackoffBasePlaceholder": "Введите базовую задержку",
    "llmBackoffBaseRequired": "Требуется указать базовую задержку backoff",
    "llmBackoffBaseMin": "Базовая задержка backoff должна быть не меньше 0.1 секунды",
    "llmBackoffCap": "Макс. задержка backoff (с)",
    "llmBackoffCapTooltip": "Максимальный предел задержки для экспоненциального backoff.",
    "llmBackoffCapPlaceholder": "Введите макс. задержку",
    "llmBackoffCapRequired": "Требуется указать макс. задержку backoff",
    "llmBackoffCapMin": "Макс. задержка backoff должна быть не меньше 0.5 секунды",
    "llmBackoffCapGteBase": "Макс. задержка backoff должна быть не меньше базовой задержки",
    "llmRateLimiterTitle": "Ограничитель скорости LLM",
    "llmMaxConcurrent": "Макс. одновременных запросов",
    "llmMaxConcurrentTooltip": "Максимальное число одновременно выполняемых LLM-запросов. Общее для всех агентов; вступает в силу при первой инициализации и после перезапуска.",
    "llmMaxConcurrentPlaceholder": "Введите макс. число одновременных запросов",
    "llmMaxConcurrentRequired": "Требуется указать макс. число одновременных запросов",
    "llmMaxConcurrentRange": "Макс. число одновременных запросов должно быть не менее 1",
    "llmMaxQpm": "Макс. запросов в минуту (QPM)",
    "llmMaxQpmTooltip": "Максимальное число запросов в 60-секундном скользящем окне. Запросы, превышающие лимит, ожидают перед отправкой — это предотвращает ошибки 429. 0 = без ограничений.",
    "llmMaxQpmPlaceholder": "Введите макс. QPM (0 = без ограничений)",
    "llmMaxQpmRequired": "Требуется указать макс. QPM",
    "llmMaxQpmRange": "Макс. QPM должен быть не менее 0",
    "llmRateLimitPause": "Пауза при лимите (с)",
    "llmRateLimitPauseTooltip": "Длительность паузы (в секундах) при получении ответа 429. Переопределяется заголовком Retry-After от API.",
    "llmRateLimitPausePlaceholder": "Введите длительность паузы",
    "llmRateLimitPauseRequired": "Требуется указать паузу при лимите",
    "llmRateLimitPauseMin": "Пауза при лимите должна быть не менее 1 секунды",
    "llmRateLimitJitter": "Диапазон джиттера (с)",
    "llmRateLimitJitterTooltip": "Случайный диапазон джиттера (в секундах), добавляемый к паузе для разбивки одновременных пробуждений.",
    "llmRateLimitJitterPlaceholder": "Введите диапазон джиттера",
    "llmRateLimitJitterRequired": "Требуется указать диапазон джиттера",
    "llmRateLimitJitterMin": "Диапазон джиттера должен быть не менее 0 секунд",
    "llmAcquireTimeout": "Таймаут получения слота (с)",
    "llmAcquireTimeoutTooltip": "Максимальное время ожидания слота ограничителя скорости перед ошибкой.",
    "llmAcquireTimeoutPlaceholder": "Введите таймаут получения слота",
    "llmAcquireTimeoutRequired": "Требуется указать таймаут получения слота",
    "llmAcquireTimeoutMin": "Таймаут получения слота должен быть не менее 10 секунд",
    "llmAcquireTimeoutGtPauseJitter": "Таймаут получения слота должен быть больше суммы паузы и джиттера",
    "contextManagementTitle": "Управление контекстом",
    "memoryManagerBackend": "Бэкенд управления долговременной памятью",
    "memoryManagerBackendTooltip": "Тип бэкенда менеджера памяти. Выберите remelight (локальные файлы) или adbpg (облачная база данных).",
    "memoryManagerBackendRestartWarning": "Смена бэкенда управления долговременной памятью не поддерживает горячую перезагрузку. Сохраните и перезапустите QwenPaw для применения изменений.",
    "maxIters": "Макс. итераций",
    "maxItersTooltip": "Максимальное число итераций рассуждение-действие для агента ReAct",
    "maxItersPlaceholder": "Введите макс. число итераций",
    "maxItersRequired": "Требуется указать макс. число итераций",
    "maxItersMin": "Макс. число итераций должно быть не меньше 1",
    "agentLoopTitle": "Настройки Loop агента",
    "loopMode": {
      "builtIn": "Встроенный",
      "builtInNote": "Порядок заблокирован · Значения доступны",
      "templateSectionTitle": "Шаблоны Loop",
      "templateSectionDescription": "Выберите встроенный шаблон или добавьте свой.",
      "defaultTab": "По умолчанию",
      "goalTab": "Цель",
      "missionTab": "Миссия",
      "defaultDescription": "Стандартный защищённый ReAct Loop вне явного режима.",
      "goalDescription": "Ограниченный постоянный Loop для проверяемых целей.",
      "missionDescription": "Постоянный процесс для длительных многоэтапных миссий.",
      "gatePipeline": "Цепочка Gate",
      "repetitionTitle": "Защита от повторов",
      "repetitionDescription": "Обнаруживает повторные вызовы инструментов и вмешивается.",
      "iterationTitle": "Лимит итераций",
      "iterationDescription": "Ограничивает число итераций ReAct.",
      "retryTitle": "Качественная проверка завершения",
      "retryDescription": "Срабатывает только для текстового ответа без вызовов инструментов.",
      "goalTurnTitle": "Лимит ходов цели",
      "goalTurnDescription": "Ограничивает ходы внутри активной цели.",
      "maxGoalTurns": "Максимум ходов цели",
      "goalBudgetTitle": "Бюджет токенов цели",
      "goalBudgetDescription": "Останавливает цель при достижении бюджета.",
      "maxGoalTokens": "Максимум токенов цели",
      "goalCompletionTitle": "Проверка завершения цели",
      "goalCompletionDescription": "Читает явный статус цели перед остановкой.",
      "goalCompletionReadOnly": "Завершение контролируется встроенным протоколом цели.",
      "missionProgressTitle": "Проверка прогресса миссии",
      "missionProgressDescription": "Продолжает до успеха всех историй или лимита.",
      "missionProgressReadOnly": "Завершение определяется встроенным статусом Mission Story.",
      "missionIterationTitle": "Лимит итераций Mission",
      "missionIterationDescription": "Задайте стандартный лимит выполнения для новых Mission.",
      "workerAttemptsTitle": "Попытки Worker",
      "workerAttemptsDescription": "Ограничьте повторы Worker после неудачной проверки Story.",
      "missionVerificationTitle": "Политика проверки Mission",
      "missionVerificationDescription": "Задайте стандартные инструкции проверки и тестовую команду.",
      "defaultMaxMissionIterations": "Максимум раундов выполнения по умолчанию",
      "defaultMaxMissionIterationsTooltip": "Используется, если /mission не задаёт --max-iterations.",
      "maxRetriesPerStory": "Максимум повторов для Story",
      "maxRetriesPerStoryTooltip": "Повторы Worker после результата FAIL или PARTIAL от Verifier.",
      "defaultVerificationInstructions": "Инструкции по проверке (необязательно)",
      "defaultVerificationInstructionsHelp": "Инструкции на естественном языке для каждого Mission Verifier.",
      "defaultVerificationInstructionsPlaceholder": "Например: проверьте пути Windows и фактический интерфейс.",
      "defaultVerifyCommand": "Тестовая команда по умолчанию (необязательно)",
      "defaultVerifyCommandHelp": "Verifier запускает её обычными инструментами и с обычными разрешениями. /mission --verify переопределяет значение.",
      "defaultVerifyCommandPlaceholder": "Например: pytest -q",
      "enableRepetitionProtection": "Включить защиту от повторов",
      "removeRule": "Удалить правило",
      "custom": "Пользовательский",
      "customDescription": "Создайте сохраняемую цепочку из встроенных Gate QwenPaw.",
      "duplicate": "Дублировать",
      "delete": "Удалить",
      "displayName": "Отображаемое имя",
      "duplicateModeName": "Режим Loop с таким именем уже существует.",
      "slashCommand": "Slash-команда",
      "description": "Описание",
      "availableToAgent": "Доступен этому агенту",
      "runsTopToBottom": "Выполняется сверху вниз",
      "addGate": "Добавить Gate",
      "emptyPipeline": "Добавьте хотя бы один Gate, чтобы режим стал доступен.",
      "iterationGateTitle": "Лимит итераций",
      "iterationGateDescription": "Остановка после заданного числа итераций Loop.",
      "doomGateTitle": "Защита от повторов",
      "doomGateDescription": "Обнаруживает повторные вызовы и меняет стратегию.",
      "tokenGateTitle": "Бюджет токенов",
      "tokenGateDescription": "Ограничивает токены запроса и ответа.",
      "timeoutGateTitle": "Лимит времени Loop",
      "timeoutGateDescription": "Остановка на следующей границе Loop без прерывания текущей операции.",
      "toolBudgetGateTitle": "Бюджет вызовов инструментов",
      "toolBudgetGateDescription": "Ограничивает все и выбранные вызовы.",
      "retryGateTitle": "Проверка ранней остановки",
      "retryGateDescription": "Просит агента проверить результат перед завершением.",
      "rubricGateTitle": "Критерии завершения",
      "rubricGateDescription": "Оценивает явные критерии и запускает исправление.",
      "qualitativeRubricTitle": "Качественная проверка завершения",
      "qualitativeRubricDescription": "Проверяет текстовые ответы без вызовов инструментов по критериям на естественном языке.",
      "qualitativeRubric": "Критерии завершения на естественном языке",
      "qualitativeRubricHelp": "Срабатывает только для текстовых ответов без вызовов инструментов и продолжает работу, если она не завершена.",
      "completionRubricTitle": "Проверка сигнала завершения",
      "completionRubricDescription": "Проверяет сигнал завершения в текстовом ответе без вызовов инструментов.",
      "completionRubricHelp": "Срабатывает после текстовых ответов без вызовов инструментов. По завершении агент выводит сигнал; иначе продолжает работу до достижения максимального числа проверок.",
      "completionPrompt": "Промпт проверки завершения",
      "completionPromptHelp": "Опишите, когда результат считается завершённым. QwenPaw автоматически добавит инструкцию вывода сигнала завершения.",
      "completionSignal": "Сигнал завершения",
      "completionSignalHelp": "QwenPaw добавляет этот сигнал и требование вывести только его в промпт проверки. Loop завершается только при полном совпадении без учёта регистра и крайних пробелов.",
      "removeCriterion": "Удалить критерий {{number}}",
      "totalTokensHelp": "Максимум входных и выходных токенов вместе за этот ход.",
      "promptTokensHelp": "Включает системные инструкции, контекст, схемы инструментов и их результаты.",
      "completionTokensHelp": "Максимум токенов, создаваемых моделью за этот ход.",
      "maxIterations": "Максимум итераций",
      "historyWindow": "Окно истории",
      "similarityThreshold": "Порог сходства",
      "totalTokens": "Максимум всех токенов",
      "promptTokens": "Максимум входных токенов",
      "completionTokens": "Максимум выходных токенов",
      "maxSeconds": "Максимум секунд",
      "maxSecondsHelp": "Время проверяется после завершения текущего ответа модели или вызова инструмента. Выполняемая операция не прерывается.",
      "allToolCalls": "Все вызовы инструментов",
      "perToolLimits": "Лимиты по инструментам",
      "toolName": "Имя инструмента",
      "callLimitAria": "Лимит вызовов {{name}}",
      "removeToolLimitAria": "Удалить лимит {{name}}",
      "addToolLimit": "Добавить лимит инструмента",
      "maxRetries": "Максимум повторов",
      "retryInstruction": "Инструкция повтора",
      "passThreshold": "Порог прохождения",
      "maxEvaluations": "Максимум раундов оценки",
      "graderError": "Ошибка оценщика",
      "stopSafely": "Безопасно остановить",
      "verifyOnceMore": "Проверить ещё раз",
      "completionCriteria": "Критерии завершения",
      "criterionPlaceholder": "Опишите наблюдаемый результат",
      "required": "Обязательно",
      "weight": "Вес",
      "addCriterion": "Добавить критерий",
      "moveGateAria": "Переместить {{title}}",
      "removeGate": "Удалить Gate",
      "newModeName": "Новый режим Loop",
      "defaultCustomDescription": "Пользовательская цепочка Gate.",
      "copyName": "{{name}} — копия",
      "createModeAria": "Создать режим Loop",
      "createModeTitle": "Создать пользовательский режим Loop",
      "startingTemplate": "Начальный шаблон",
      "startingPipeline": "Начальный конвейер",
      "blankPipelineHint": "Начните с пустого режима и добавьте гейты позже",
      "safeTemplate": "Безопасный запуск",
      "researchTemplate": "Исследование с бюджетом",
      "qualityTemplate": "Приоритет качества",
      "blankTemplate": "Пустая цепочка"
    },
    "doomLoopEnabled": "Защита от повторений",
    "doomLoopEnabledTooltip": "Автоматическое вмешательство, когда агент застревает на повторении одних и тех же действий",
    "doomLoopAfter": "После",
    "doomLoopRepetitions": "одинаковых действий",
    "doomLoopStopAction": "Пауза и запрос помощи",
    "doomLoopWarnAction": "Отправить напоминание",
    "doomLoopSimpleMode": "Простой",
    "doomLoopAdvancedMode": "Расширенный",
    "doomLoopWindowSize": "Диапазон обнаружения",
    "doomLoopWindowSizeTooltip": "Сколько последних действий проверять на повторение",
    "doomLoopSimilarity": "Чувствительность совпадения",
    "doomLoopSimilarityTooltip": "Насколько похожими должны быть действия для обнаружения повтора (ниже = строже)",
    "doomLoopStages": "Правила вмешательства",
    "doomLoopAction": "Действие",
    "doomLoopPrompt": "Сообщение",
    "doomLoopPromptPlaceholder": "Текст напоминания или причина паузы...",
    "doomLoopAddStage": "Добавить правило",
    "iterationTitle": "Лимит итераций",
    "iterationEnabled": "Включить лимит итераций",
    "iterationEnabledTooltip": "Остановить агента после фиксированного числа циклов",
    "iterationMaxIterations": "Максимум итераций",
    "iterationMaxIterationsTooltip": "Максимальное число циклов до остановки",
    "rubricTitle": "Качественная проверка завершения",
    "rubricEnabled": "Включить качественную проверку завершения",
    "rubricEnabledTooltip": "Срабатывает только для текстового ответа без вызовов инструментов.",
    "rubricPrompt": "Критерии завершения на естественном языке",
    "rubricPromptTooltip": "Промпт для запроса оценки завершённости задачи",
    "rubricDesc": "Для текстового ответа без вызовов инструментов применяет критерии завершения на естественном языке и просит продолжить, если работа осталась.",
    "rubricPromptPlaceholder": "Вы не вызвали ни одного инструмента. Если задача завершена, подтвердите. В противном случае продолжайте с вызовами инструментов.",
    "rubricMaxInterventions": "Максимум раундов оценки",
    "rubricMaxInterventionsTooltip": "Максимальное число проверок завершения текстовых ответов без вызовов инструментов за один ход.",
    "inLoopModes": "Включить в режимах /goal и /mission",
    "inLoopModesTooltip": "Также применять, когда активен режим /goal или /mission",
    "comingSoonEditable": "Пользовательская настройка будет доступна в будущем выпуске.",
    "simpleMode": "Простой",
    "advancedMode": "Расширенный",
    "comingSoon": "Скоро",
    "reactModeTab": "Шаблон Loop - По умолчанию",
    "goalModeTab": "Шаблон Loop - Goal",
    "missionModeTab": "Шаблон Loop - Mission",
    "goalModeInfoTitle": "Режим Goal vs По умолчанию",
    "goalModeInfo": "Режим по умолчанию останавливается после ответа. Режим Goal заставляет агента циклически работать над целью, используя Rubric-оценку для определения завершения. Все операции выполняются в текущем контексте агента.",
    "missionModeInfoTitle": "Режим Mission vs Goal",
    "missionModeInfo": "Режим Mission автоматически разбивает сложные задачи на подзадачи, выполняемые независимыми Worker-агентами и проверяемые Verifier-агентами. Каждая подзадача выполняется в собственном контексте, не загрязняя историю основной сессии.",
    "goalIterationGate": "Шлюз итераций цели",
    "goalIterationGateDesc": "Ограничивает количество ходов агента в сессии цели, отслеживая итерации и использование токенов.",
    "goalBudgetGate": "Шлюз бюджета токенов",
    "goalBudgetGateDesc": "Устанавливает лимит расхода токенов для сессии цели. Останавливает агента при превышении бюджета.",
    "goalRubricGate": "Рубрика завершения цели",
    "goalRubricGateDesc": "Оценивает, достигнута ли цель, проверяя статус сессии.",
    "goalDoomGate": "Защита от повторений",
    "goalDoomGateDesc": "Обнаруживает повторяющиеся паттерны во время выполнения цели и инициирует вмешательство.",
    "missionProgressGate": "Шлюз прогресса миссии",
    "missionProgressGateDesc": "Отслеживает завершение пользовательских историй PRD. Продолжает до прохождения всех историй или достижения максимума итераций.",
    "missionIterBypass": "Обход итераций",
    "missionIterBypassDesc": "Временно снимает ограничение итераций ReAct во время выполнения миссии для длительных фаз.",
    "customLoopTitle": "Пользовательские режимы цикла",
    "customLoopDesc": "Создавайте свои режимы цикла с пользовательскими комбинациями шлюзов. Скоро.",
    "autoContinueOnTextOnly": "Автопродолжение при только тексте",
    "autoContinueOnTextOnlyTooltip": "Если шаг рассуждения завершился только текстом без вызова инструментов, вставляется подсказка и выполняется ещё один проход с той же политикой инструментов, чтобы реже обрывались многошаговые задачи. Выключите для прежнего поведения. При включении возможен рост расхода токенов.",
    "autoGenerateSessionTitle": "Автогенерация заголовков сессий",
    "autoGenerateSessionTitleTooltip": "После первого пользовательского сообщения в новом чате фоновая задача делает короткий LLM-вызов и заменяет усечённую заглушку на лаконичный заголовок. На каждый новый чат приходится один дополнительный короткий LLM-вызов. Отключите, чтобы оставить заглушку и не тратить токены.",
    "shellCommandTimeout": "Тайм-аут shell-команды (с)",
    "shellCommandTimeoutTooltip": "Тайм-аут по умолчанию (в секундах) для инструмента execute_shell_command. LLM может переопределить это значение для каждого вызова через параметр timeout. Полезно для длительных задач, таких как компиляция или обработка данных.",
    "shellCommandTimeoutPlaceholder": "Введите тайм-аут",
    "shellCommandTimeoutRequired": "Тайм-аут shell-команды обязателен",
    "shellCommandTimeoutMin": "Тайм-аут shell-команды должен быть не менее 1 секунды",
    "shellCommandExecutable": "Исполняемый файл shell",
    "shellCommandExecutableTooltip": "Путь к shell, используемому execute_shell_command. Linux/macOS: например, /bin/bash, /bin/zsh. Windows: поддерживаются powershell.exe, pwsh.exe или POSIX-совместимые shell (например, Git Bash). Если пусто, используется переменная окружения $SHELL, затем платформенный shell по умолчанию (/bin/sh для Unix, cmd.exe для Windows).",
    "shellCommandExecutablePlaceholder": "напр. /bin/bash или powershell.exe (пусто = автоопределение)",
    "maxInputLength": "Макс. длина входа",
    "maxInputLengthTooltip": "Максимальная длина входа (токены) для окна контекста модели",
    "maxInputLengthPlaceholder": "Введите макс. длину входа",
    "maxInputLengthRequired": "Требуется указать макс. длину входа",
    "maxInputLengthMin": "Макс. длина входа должна быть не меньше 1000",
    "contextCompactRatio": "Коэффициент сжатия контекста",
    "contextCompactRatioTooltip": "Доля контекста для сжатия при заполнении",
    "contextCompactRatioRequired": "Требуется указать коэффициент сжатия контекста",
    "contextCompactThreshold": "Порог сжатия контекста",
    "contextCompactThresholdTooltip": "Порог сжатия контекста (токены), автоматически вычисляется из макс. длины входа и коэффициента сжатия",
    "contextCompactThresholdPlaceholder": "Автоматически",
    "contextCompactReserveRatio": "Коэффициент резерва контекста",
    "contextCompactReserveRatioTooltip": "Доля контекста для резерва при сжатии",
    "contextCompactReserveRatioRequired": "Требуется указать коэффициент резерва контекста",
    "contextCompactReserveThreshold": "Порог резерва контекста",
    "contextCompactReserveThresholdTooltip": "Порог резерва контекста (токены), автоматически вычисляется из макс. длины входа и коэффициента резерва",
    "contextCompactReserveThresholdPlaceholder": "Автоматически",
    "toolResultCompactRecentN": "recent_n результатов инструментов",
    "toolResultCompactRecentNTooltip": "Количество результатов инструментов для использования порога недавних сообщений",
    "toolResultCompactRecentNRequired": "recent_n результатов инструментов обязательно",
    "toolResultCompactOldThreshold": "Макс. символов для результатов инструментов за пределами recent_n",
    "toolResultCompactOldThresholdTooltip": "Результаты инструментов за пределами recent_n, превышающие этот лимит, будут сжаты",
    "toolResultCompactOldThresholdPlaceholder": "Введите порог символов",
    "toolResultCompactOldThresholdRequired": "Макс. символов для результатов за пределами recent_n обязательно",
    "toolResultCompactRecentThreshold": "Макс. символов для результатов инструментов в пределах recent_n",
    "toolResultCompactRecentThresholdTooltip": "Результаты инструментов в пределах recent_n, превышающие этот лимит, будут сжаты. Также задаёт максимальное количество байт, возвращаемых за один вызов read_file. Должно быть больше или равно порогу для старых сообщений",
    "toolResultCompactRecentThresholdPlaceholder": "Введите порог символов",
    "toolResultCompactRecentThresholdRequired": "Макс. символов для результатов в пределах recent_n обязательно",
    "toolResultCompactRetentionDays": "Дни хранения файлов результатов инструментов",
    "toolResultCompactRetentionDaysTooltip": "Количество дней хранения сжатых файлов, просроченные файлы удаляются автоматически",
    "toolResultCompactRetentionDaysRequired": "Дни хранения файлов результатов инструментов обязательны",
    "historyRetentionDays": "Дни хранения истории",
    "historyRetentionDaysTooltip": "Количество дней хранения постоянной истории чата. Более старые записи автоматически удаляются при запуске и завершении работы агента.",
    "historyRetentionDaysRequired": "Дни хранения истории обязательны",
    "historyRetentionDaysForeverWarning": "Значение 0 хранит историю вечно — объём хранилища будет расти без ограничений.",
    "historyRetentionDaysLargeWarning": "Большой период хранения может занимать значительный объём хранилища.",
    "exemptFileExtensions": "Исключенные расширения файлов",
    "exemptFileExtensionsTooltip": "Результаты read_file для этих расширений будут использовать порог для новых сообщений",
    "exemptFileExtensionsPlaceholder": ".md, .txt, .json",
    "exemptToolNames": "Исключенные инструменты",
    "exemptToolNamesTooltip": "Результаты этих инструментов будут использовать порог для новых сообщений",
    "exemptToolNamesPlaceholder": "chat_with_agent, list_agents",
    "language": "Язык агента",
    "languageTooltip": "Язык файлов персонажа агента (SOUL.md, AGENTS.md и др.). При смене языка MD-файлы будут скопированы на выбранном языке.",
    "languageConfirmTitle": "Смена языка агента",
    "languageConfirmContent": "При смене языка следующие файлы будут перезаписаны версией на новом языке:\n\n  SOUL.md, AGENTS.md, PROFILE.md, MEMORY.md, BOOTSTRAP.md, HEARTBEAT.md\n\nЕсли вы вносили изменения в эти файлы, сначала сделайте резервную копию. Остальные файлы не будут затронуты.",
    "languageConfirmOk": "Сменить язык",
    "languageSaveSuccess": "Язык успешно обновлён",
    "languageSaveSuccessWithFiles": "Язык обновлён, скопировано файлов: {{count}}",
    "languageSaveFailed": "Не удалось обновить язык",
    "timezone": "Часовой пояс пользователя",
    "timezoneTooltip": "Используется для запланированных задач, отображения времени и контекста агента. По умолчанию — системный часовой пояс.",
    "timezoneRequired": "Пожалуйста, выберите часовой пояс",
    "selectTimezone": "Выберите часовой пояс",
    "timezoneSaveSuccess": "Часовой пояс обновлён",
    "timezoneSaveFailed": "Не удалось обновить часовой пояс",
    "saveSuccess": "Конфигурация успешно сохранена",
    "saveFailed": "Не удалось сохранить конфигурацию",
    "loadFailed": "Не удалось загрузить конфигурацию",
    "historyMaxLength": "Макс. длина истории",
    "historyMaxLengthTooltip": "Максимальная длина вывода команды /history (в символах)",
    "historyMaxLengthRequired": "Требуется указать макс. длину истории",
    "historyMaxLengthMin": "Макс. длина истории должна быть не меньше 1000",
    "historyMaxLengthPlaceholder": "Введите макс. длину",
    "contextCompactTitle": "Настройки сжатия контекста",
    "contextCompactEnabled": "Включить сжатие контекста",
    "contextCompactEnabledTooltip": "Автоматически сжимать контекст для предотвращения переполнения окна контекста",
    "tokenCountModel": "Модель для подсчёта токенов",
    "tokenCountModelTooltip": "Имя модели для точного подсчёта токенов; установите \"default\" для использования встроенной оценки",
    "tokenCountModelPlaceholder": "Имя модели или default",
    "tokenCountUseMirror": "Использовать зеркало HuggingFace",
    "tokenCountUseMirrorTooltip": "Использовать зеркальный сайт HuggingFace при загрузке токенизаторов",
    "tokenCountEstimateDivisor": "Делитель оценки byte/Token",
    "tokenCountEstimateDivisorTooltip": "Делитель для оценки токенов на основе байтов (токены ≈ байты / делитель). Рекомендуемое значение: 3.75–4.",
    "tokenCountEstimateDivisorRequired": "Требуется указать делитель оценки",
    "tokenCountEstimateDivisorMin": "Делитель оценки должен быть от 2 до 5",
    "toolResultCompactTitle": "Настройки сжатия результатов инструментов",
    "toolResultCompactEnabled": "Включить сжатие результатов инструментов",
    "toolResultCompactEnabledTooltip": "Сжимать слишком длинные результаты вызовов инструментов для экономии пространства контекста",
    "memorySummaryTitle": "Настройки долгосрочной памяти",
    "memorySummaryEnabled": "Запустить сводку памяти",
    "memorySummaryEnabledTooltip": "Автоматически генерировать и сохранять сводки памяти при сжатии контекста",
    "dreamCronEnabled": "Включить сновидения",
    "dreamCronEnabledTooltip": "Включить плановое задание оптимизации памяти через сновидения",
    "dreamCron": "Расписание сновидений",
    "dreamCronTooltip": "Cron-выражение для периодической оптимизации долгосрочных воспоминаний через состояние сновидения; используйте переключатель выше для включения или отключения",
    "dreamCronPlaceholder": "0 23 * * *",
    "dreamCronRequired": "Введите Cron-выражение, если сновидения включены",
    "dreamCronInvalid": "Введите допустимое Cron-выражение из 5 полей",
    "autoMemorySearch": "Автоматический поиск по памяти (Beta)",
    "autoMemorySearchTooltip": "Автоматически запускать поиск по памяти при каждом диалоге. Каждый запрос будет автоматически вызывать функцию поиска по памяти, помогая QwenPaw лучше понять вас — но это увеличивает расход токенов.",
    "autoMaxResults": "Макс. результатов автоматического поиска",
    "autoMaxResultsTooltip": "Максимальное количество результатов при включённом автоматическом поиске по памяти",
    "autoMaxResultsRequired": "Требуется указать макс. число результатов",
    "autoMaxResultsMin": "Макс. число результатов должно быть не меньше 1",
    "inboxPushEnabled": "Уведомления о результатах памяти",
    "inboxPushEnabledTooltip": "Отправлять результаты автоматической памяти, сновидений и ресурсов во входящие. Отключение не останавливает задачи памяти.",
    "autoMemoryInterval": "Интервал автоматической памяти",
    "autoMemoryIntervalTooltip": "Запускать автоматическую память каждые N пользовательских запросов. 0 отключает периодическую автоматическую память. 1 означает запуск после каждого запроса. Рекомендуемое значение: 2-5; при значении 1 учитывайте высокий расход токенов.",
    "autoMemoryIntervalPlaceholder": "Введите 0, чтобы отключить периодическую автоматическую память",
    "autoMemoryIntervalRequired": "Требуется указать интервал автоматической памяти",
    "autoMemoryIntervalMin": "Интервал автоматической памяти должен быть не меньше 0",
    "embeddingConfigTitle": "Настройки модели эмбеддинга",
    "embeddingBackend": "Тип SDK эмбеддинга",
    "embeddingBackendTooltip": "Тип SDK для вызова модели эмбеддинга",
    "embeddingBackendPlaceholder": "Выберите тип SDK",
    "embeddingApiKey": "API Key",
    "embeddingApiKeyTooltip": "API-ключ провайдера эмбеддинга; оставьте пустым, если аутентификация не требуется",
    "embeddingApiKeyPlaceholder": "Оставьте пустым, если не требуется",
    "embeddingBaseUrl": "Base URL",
    "embeddingBaseUrlTooltip": "Base URL API эмбеддинга. Для OpenAI-совместимых бэкендов этот пользовательский endpoint необязателен; API Key и название модели обязательны.",
    "embeddingBaseUrlPlaceholder": "https://dashscope.aliyuncs.com/compatible-mode/v1",
    "embeddingHost": "Host",
    "embeddingHostTooltip": "Адрес сервиса Ollama. Если оставить пустым, будет использован хост Ollama по умолчанию.",
    "embeddingHostPlaceholder": "http://localhost:11434",
    "embeddingModelName": "Название модели",
    "embeddingModelNameTooltip": "Название модели эмбеддинга. Обязательно для всех бэкендов эмбеддинга.",
    "embeddingModelNamePlaceholder": "text-embedding-v4",
    "embeddingEnableCache": "Включить кэш эмбеддинга",
    "embeddingEnableCacheTooltip": "Кэшировать результаты эмбеддинга для уменьшения повторных вычислений",
    "embeddingMaxCacheSize": "Макс. размер кэша",
    "embeddingMaxCacheSizeTooltip": "Максимальное количество записей в кэше эмбеддинга",
    "embeddingMaxCacheSizeRequired": "Требуется указать макс. размер кэша",
    "embeddingUseDimensions": "Использовать пользовательские размерности",
    "embeddingUseDimensionsTooltip": "Использовать пользовательские размерности эмбеддинга (поддерживается только некоторыми моделями)",
    "embeddingDimensions": "Размерности эмбеддинга",
    "embeddingDimensionsTooltip": "Количество размерностей эмбеддинга; вступает в силу при включённых пользовательских размерностях",
    "embeddingDimensionsRequired": "Требуется указать размерности эмбеддинга",
    "embeddingDimensionsMin": "Размерности должны быть не меньше 1",
    "embeddingMaxInputLength": "Макс. длина входа",
    "embeddingMaxInputLengthTooltip": "Максимальная длина входа (токены) для одного запроса эмбеддинга",
    "embeddingMaxInputLengthRequired": "Требуется указать макс. длину входа",
    "embeddingMaxBatchSize": "Макс. размер пакета",
    "embeddingMaxBatchSizeTooltip": "Максимальное количество элементов в одном пакетном запросе эмбеддинга",
    "embeddingMaxBatchSizeRequired": "Требуется указать макс. размер пакета",
    "embeddingRestartWarning": "Настройки модели эмбеддинга не поддерживают горячую перезагрузку. Сохраните и перезапустите сервис для применения изменений.",
    "maxContextLength": "Макс. длина контекста",
    "maxContextLengthTooltip": "Максимальное количество токенов в окне контекста модели, определяющее, сколько истории помещается в каждый запрос",
    "maxContextLengthRequired": "Требуется указать макс. длину контекста",
    "maxContextLengthMin": "Макс. длина контекста должна быть не меньше 1000",
    "maxContextLengthPlaceholder": "Введите макс. длину контекста",
    "embeddingActivationNote": "Эмбеддинг активируется, когда заполнены обязательные поля выбранного бэкенда.",
    "embeddingEnableHint": "Эмбеддинг активируется, когда заполнены обязательные поля: название модели и API Key для OpenAI-совместимых или Gemini бэкендов; название модели для Ollama.",
    "rebuildMemoryIndex": "Перестроить индекс памяти",
    "rebuildMemoryIndexWarning": "Эта операция очищает и перестраивает поисковый индекс памяти и может потреблять много ресурсов CPU и оперативной памяти. Используйте её только для восстановления повреждённого индекса или исправления некорректных результатов поиска.",
    "rebuildMemoryIndexConfirmTitle": "Перестроить индекс памяти?",
    "rebuildMemoryIndexConfirm": "Во время перестроения нагрузка на CPU и потребление оперативной памяти могут значительно возрасти. Операция не рекомендуется, если индекс не повреждён и не нуждается в восстановлении.",
    "rebuildMemoryIndexSuccess": "Индекс памяти успешно перестроен",
    "rebuildMemoryIndexFailed": "Не удалось перестроить индекс памяти: {{error}}",
    "toolResultCompactRecentGtOld": "Порог для последних сообщений должен быть больше или равен порогу для старых сообщений",
    "lightContextTitle": "Управление контекстом",
    "remeLightMemoryTitle": "Долгосрочная память",
    "toolExecutionLevelTitle": "Безопасность выполнения инструментов",
    "toolExecutionLevel": {
      "title": "Безопасность выполнения инструментов",
      "alertMessage": "Настройте политику одобрения вызовов инструментов для контроля уровня безопасности при выполнении инструментов агентом",
      "strict": "Строгий режим",
      "strictDesc": "Все вызовы инструментов требуют одобрения, максимальный уровень безопасности",
      "smart": "Умный режим",
      "smartDesc": "Инструменты с низким риском одобряются автоматически, средний+ риск требует одобрения",
      "auto": "Автоматический режим",
      "autoDesc": "Только инструменты, явно отмеченные для одобрения, требуют одобрения (по умолчанию)",
      "off": "Выключено",
      "offDesc": "Отключить все одобрения инструментов, все инструменты выполняются автоматически"
    },
    "saveLevelSuccess": "Уровень безопасности выполнения инструментов сохранён",
    "saveLevelFailed": "Не удалось сохранить уровень безопасности выполнения инструментов",
    "adbpgMemoryTitle": "ADBPG Long-term Memory",
    "adbpgConfig": {
      "title": "ADBPG Memory Configuration",
      "restBaseUrl": "REST Base URL",
      "restApiKey": "REST API Key",
      "memoryIsolation": "Memory Isolation (per-agent)",
      "searchTimeout": "Search Timeout"
    }
  },
  "tools": {
    "title": "Встроенные инструменты",
    "description": "Управляйте встроенными инструментами и их статусом. Отключённые инструменты не будут доступны агенту.",
    "emptyState": "Нет настроенных инструментов",
    "loadError": "Не удалось загрузить инструменты",
    "enableSuccess": "Инструмент успешно включён",
    "disableSuccess": "Инструмент успешно отключён",
    "toggleError": "Не удалось изменить статус инструмента",
    "enableAll": "Включить все",
    "disableAll": "Отключить все",
    "enableAllSuccess": "Все инструменты включены",
    "disableAllSuccess": "Все инструменты отключены",
    "allEnabled": "Все инструменты уже включены",
    "allDisabled": "Все инструменты уже отключены",
    "asyncExecution": "Асинхронное выполнение",
    "asyncExecutionEnabled": "Асинхронное выполнение включено",
    "asyncExecutionDisabled": "Асинхронное выполнение отключено",
    "configure": "Настроить",
    "configured": "Настроено",
    "requiresConfig": "Требуется настройка",
    "configSaved": "Конфигурация сохранена",
    "configSaveError": "Не удалось сохранить конфигурацию",
    "active": "активно",
    "available": "Доступно",
    "noEnabled": "Нет включённых инструментов",
    "goEnableBtn": "Включить",
    "configureAction": "Настроить →",
    "enableAction": "Включить →"
  },
  "modelConfig": {
    "promptTitle": "Требуется LLM-модель — выберите в Chat после настройки",
    "promptMessage": "Для работы чата нужна LLM-модель. Сначала настройте модель, затем выберите её в селекторе моделей вверху страницы Chat.",
    "configureButton": "Настроить модель",
    "skipButton": "Пропустить",
    "chatDisabledTitle": "Чат отключён",
    "chatDisabledMessage": "Функции чата отключены, потому что не настроена модель. Настройте модель, чтобы включить чат.",
    "configureNow": "Настроить модель",
    "modelNotConfigured": "Перед использованием чата настройте модель в разделе «Настройки»"
  },
  "header": {
    "changelog": "Список изменений",
    "docs": "Документация",
    "tutorial": "Руководство",
    "featureDemos": "Демонстрация функций",
    "faq": "FAQ",
    "github": "GitHub",
    "resources": "Документация",
    "updateAvailable": "Доступно обновление"
  },
  "theme": {
    "dark": "Тёмная",
    "light": "Светлая",
    "system": "Как в системе"
  },
  "sidebar": {
    "newVersion": "Доступна новая версия: v{{version}}, нажмите для обновления",
    "updateModal": {
      "title": "Доступна новая версия: v{{version}}",
      "viewReleases": "Открыть релизы",
      "installDesktopUpdate": "Обновить сейчас",
      "desktopInstallHint": "QwenPaw Desktop {{version}} готов к установке. Приложение перезапустится после обновления.",
      "checking": "Проверка обновлений…",
      "checkingHint": "Проверяем последнюю версию",
      "downloading": "Загрузка обновления",
      "downloadingTo": "Обновление до версии {{version}}",
      "downloadProgress": "{{done}} / {{total}} · {{rate}}",
      "installing": "Установка обновления",
      "willRestart": "Приложение перезапустится автоматически после установки.",
      "stepPrepare": "Подготовка",
      "stepDownloading": "Загрузка",
      "stepInstalling": "Установка",
      "failedTitle": "Обновление не удалось",
      "back": "Назад",
      "retry": "Повторить",
      "errors": {
        "network": "Не удалось подключиться к серверу обновлений. Проверьте интернет и повторите попытку.",
        "signature": "Не удалось проверить подпись файла обновления. Попробуйте загрузить ещё раз.",
        "appLocation": "QwenPaw запущен из macOS-пути только для чтения. Переместите QwenPaw.app в папку Applications, запустите его оттуда и повторите обновление.",
        "other": "Обновление не удалось."
      },
      "updateLater": "Скачать в фоне",
      "backgroundDownloading": "Загрузка в фоновом режиме…",
      "readyToInstall": "Обновление готово",
      "readyToInstallHint": "Обновление v{{version}} загружено. Перезапустите приложение, чтобы установить и открыть новую версию.",
      "restartNow": "Обновить сейчас",
      "backgroundFailed": "Фоновая загрузка не удалась"
    },
    "settings": {
      "language": "Язык",
      "theme": "Тема",
      "mode": "Режим"
    },
    "simpleMode": "Простой режим",
    "fullMode": "Полный режим"
  },
  "chat": {
    "modelSelectTooltip": "Выбор модели",
    "newChatTooltip": "Новый чат",
    "searchTooltip": "Поиск во всех чатах",
    "chatHistoryTooltip": "История чатов",
    "wideModeTooltip": "Широкий режим",
    "normalModeTooltip": "Обычный режим",
    "allChats": "Все чаты",
    "createNewChat": "Создать новый чат",
    "pinDrawer": "Закрепить",
    "unpinDrawer": "Открепить",
    "statusIdle": "Ожидание",
    "statusInProgress": "Выполняется",
    "disclaimer": "Работает для вас, растёт вместе с вами",
    "greeting": "Привет, чем я могу помочь вам сегодня?",
    "description": "Я полезный ассистент, который поможет вам с вашими вопросами.",
    "prompt1": "Давайте начнём новое путешествие!",
    "prompt2": "Расскажи мне, какими навыками ты обладаешь?",
    "inputPlaceholder": "\"↑↓\" для навигации по сообщениям · \"/\" для быстрых команд (\"/approve\" или \"/deny\" во время подтверждения)",
    "longTextUploadPrompt": "Пожалуйста, прочитайте загруженный файл с промптом и ответьте на его основе.",
    "emptyOutputError": "Ассистент вернул пустой ответ.",
    "commands": {
      "clear": {
        "description": "Очистить контекст диалога"
      },
      "compact": {
        "description": "Сжать контекст диалога и создать резюме; поддерживается доп. инструкция"
      },
      "approve": {
        "description": "Подтвердить ожидающее действие инструмента и продолжить выполнение"
      },
      "deny": {
        "description": "Отклонить ожидающее действие инструмента"
      },
      "mission": {
        "description": "Режим Mission — разбивает задачи на суб-агентов с изолированным контекстом"
      },
      "skills": {
        "description": "Показать доступные в чате навыки и явные команды их вызова"
      },
      "goal": {
        "description": "Goal-цикл — агент непрерывно преследует цель, автоматически оценивая завершение через Rubric"
      }
    },
    "attachments": {
      "tooltip": "Поддерживаются документы, изображения, видео, аудио и другие форматы",
      "tooltipImageOnly": "Текущая модель поддерживает только загрузку изображений",
      "tooltipNoMultimodal": "Мультимодальные возможности текущей модели не обнаружены, изображения или видео могут быть обработаны некорректно",
      "fileSizeLimit": "Максимум {{limit}} МБ на файл",
      "fileSizeExceeded": "Размер файла превышает лимит {{limit}} МБ. Текущий файл: {{size}} МБ",
      "multimodalDisabled": "Текущая модель не поддерживает загрузку файлов",
      "multimodalWarning": "Мультимодальные возможности текущей модели не обнаружены, изображения или видео могут быть обработаны некорректно",
      "imageOnlyAccept": "Текущая модель поддерживает только файлы изображений",
      "imageOnlyWarning": "Текущая модель поддерживает только изображения, видео и другие файлы могут быть обработаны некорректно"
    },
    "rateLimitHit": "Текущая модель ограничена. Попробуйте переключиться на другую бесплатную модель.",
    "turnUsagePopover": {
      "ariaLabel": "Показать использование токенов и контекста за ход",
      "turn": "Этот ход",
      "turnEstimated": "Этот ход ~",
      "tok": "tok",
      "inOut": "in {{inTok}} · out {{outTok}}",
      "contextLabel": "Окно контекста:",
      "manageContext": "Управление контекстом",
      "compact": "Сжать",
      "new": "Новый чат"
    },
    "rateLimitMessage": "Достигнут лимит запросов. Переключитесь на другую бесплатную модель:",
    "rateLimitSwitched": "Переключено на {{model}}",
    "speech": {
      "startRecording": "Начать запись голоса (Ctrl+Shift+M)",
      "stopRecording": "Остановить запись (Ctrl+Shift+M)",
      "transcribing": "Транскрибация...",
      "transcriptionDisabled": "Транскрибация отключена. Настройте провайдер в Настройки > Голосовая транскрибация.",
      "transcriptionFailed": "Ошибка голосовой транскрибации",
      "microphoneError": "Не удалось получить доступ к микрофону",
      "fileTooLarge": "Файл записи слишком большой ({{size}}МБ). Максимум: {{limit}}МБ",
      "recordingTooLong": "Длительность записи превышает лимит ({{limit}}с)"
    },
    "search": {
      "title": "Поиск в чате",
      "tooltip": "Поиск в текущем чате",
      "placeholder": "Поиск сообщений...",
      "noResults": "Результаты не найдены",
      "resultsCount": "Найдено {{count}} результат(ов)",
      "searching": "Поиск {{progress}}...",
      "loading": "Загрузка...",
      "userMessage": "Пользователь",
      "assistantMessage": "Ассистент",
      "titleMatch": "Название"
    },
    "contextMenu": {
      "open": "Открыть",
      "rename": "Переименовать",
      "pin": "Закрепить",
      "unpin": "Открепить",
      "delete": "Удалить"
    },
    "queue": {
      "title": "Очередь сообщений",
      "paused": "Приостановлено",
      "sendFailed": "Ошибка отправки",
      "resume": "Возобновить очередь",
      "pause": "Приостановить очередь",
      "clear": "Очистить очередь",
      "dragSort": "Перетащите для сортировки",
      "edit": "Редактировать",
      "retry": "Повторить",
      "skip": "Пропустить",
      "interruptAndSend": "Прервать и отправить",
      "delete": "Удалить",
      "file": "Файл",
      "noChatWarning": "Сначала отправьте сообщение, чтобы создать диалог, прежде чем использовать очередь",
      "queueFull": "Очередь полна (макс. {{max}} записей). Отправьте или удалите некоторые сообщения",
      "otherTabOwner": "This tab queues only; sending is handled by another tab"
    },
    "group": {
      "pinned": "Закреплённые",
      "today": "Сегодня",
      "week": "За 7 дней",
      "month": "За 30 дней",
      "older": "Ранее"
    },
    "sessionPanel": {
      "searchConversations": "Поиск…",
      "noResults": "Результатов нет",
      "noConversations": "Нет диалогов",
      "loadingConversations": "Загрузка…"
    },
    "conversationHistory": "История диалогов",
    "history": {
      "empty": "Нет истории чатов"
    },
    "sessionGroup": {
      "today": "Сегодня",
      "recent": "За 7 дней",
      "earlier": "Ранее"
    }
  },
  "security": {
    "parent": "Настройки",
    "security": "Безопасность",
    "title": "Безопасность",
    "description": "Управление функциями безопасности инструментов и навыков.",
    "toolGuardTitle": "Защита инструментов",
    "toolGuardDescription": "Настройте сканирование безопасности для вызовов инструментов. Опасные операции потребуют вашего явного подтверждения перед выполнением.",
    "enabled": "Включить защиту инструментов",
    "enabledTooltip": "При включении вызовы инструментов сканируются на наличие опасных шаблонов перед выполнением",
    "guardedTools": "Защищённые инструменты",
    "guardedToolsTooltip": "Инструменты, требующие подтверждения при обнаружении опасных шаблонов. Оставьте пустым для использования набора по умолчанию.",
    "guardedToolsPlaceholder": "Выберите инструменты или введите пользовательские имена",
    "deniedTools": "Запрещённые инструменты",
    "deniedToolsTooltip": "Инструменты, которые всегда отклоняются без запроса подтверждения",
    "deniedToolsPlaceholder": "Выберите инструменты для запрета",
    "saveSuccess": "Настройки защиты инструментов сохранены",
    "saveFailed": "Не удалось сохранить настройки защиты инструментов",
    "loadFailed": "Не удалось загрузить настройки защиты инструментов",
    "rules": {
      "title": "Правила обнаружения",
      "description": "Правила определяют шаблоны регулярных выражений, которые вызывают оповещения безопасности. Встроенные правила можно отключить; пользовательские правила можно добавлять, редактировать или удалять.",
      "id": "ID правила",
      "severity": "Серьёзность",
      "descriptionCol": "Описание",
      "source": "Источник",
      "actions": "Действия",
      "builtin": "Встроенное",
      "custom": "Пользовательское",
      "enable": "Включить",
      "disable": "Отключить",
      "edit": "Редактировать",
      "delete": "Удалить",
      "add": "Добавить правило",
      "addTitle": "Добавить пользовательское правило",
      "editTitle": "Редактировать пользовательское правило",
      "ruleId": "ID правила",
      "ruleIdRequired": "ID правила обязателен",
      "duplicateId": "Правило с таким ID уже существует",
      "tools": "Целевые инструменты",
      "toolsPlaceholder": "Оставьте пустым для совпадения со всеми инструментами",
      "params": "Целевые параметры",
      "paramsPlaceholder": "Оставьте пустым для совпадения со всеми параметрами",
      "severityLabel": "Серьёзность",
      "categoryLabel": "Категория",
      "patterns": "Шаблоны регулярных выражений",
      "patternsRequired": "Требуется хотя бы один шаблон",
      "patternsTooltip": "По одному регулярному выражению в строке. Сопоставляется со значениями параметров инструмента (без учёта регистра).",
      "excludePatterns": "Шаблоны исключения",
      "excludePatternsTooltip": "По одному регулярному выражению в строке. Если совпадает, правило пропускается.",
      "descriptionLabel": "Описание",
      "descriptionPlaceholder": "Что обнаруживает это правило?",
      "remediationLabel": "Рекомендация",
      "remediationPlaceholder": "Рекомендуемое действие при срабатывании правила",
      "preview": "Просмотр",
      "previewTitle": "Детали правила",
      "actionLabel": "Действие",
      "actionApproval": "Требуется одобрение",
      "autoDeny": "Автоотказ",
      "autoDenyTooltip": "При включении вызовы инструментов, соответствующие этому правилу, будут автоматически отклонены без ручного подтверждения",
      "autoDenyEnable": "Включить автоотказ для этого правила",
      "autoDenyDisable": "Отключить автоотказ для этого правила",
      "allTools": "Все инструменты",
      "allParams": "Все параметры",
      "descriptions": {
        "TOOL_CMD_CONTROL_CHARS": "Обнаруживает непечатаемые управляющие символы, которые могут обойти проверки безопасности",
        "TOOL_CMD_DANGEROUS_MV": "Обнаруживает команду mv, которая может неожиданно переместить или перезаписать файлы",
        "TOOL_CMD_DANGEROUS_RM": "Обнаруживает команду rm, которая может привести к потере данных",
        "TOOL_CMD_DOS_FORK_BOMB": "Обнаруживает классические Bash fork-бомбы и массовое завершение процессов",
        "TOOL_CMD_FIND_DELETE": "Обнаруживает команду 'find -delete', которая может привести к потере данных",
        "TOOL_CMD_FS_DESTRUCTION": "Обнаруживает команды низкоуровневого форматирования или очистки дисков",
        "TOOL_CMD_IFS_INJECTION": "Обнаруживает команды с переменной $IFS, которая может обойти проверку безопасности",
        "TOOL_CMD_JQ_FILE_FLAGS": "Обнаруживает команды jq с флагами для чтения произвольных файлов или выполнения кода",
        "TOOL_CMD_JQ_SYSTEM": "Обнаруживает команды jq с функцией system() для выполнения произвольных команд",
        "TOOL_CMD_OBFUSCATED_EXEC": "Обнаруживает выполнение строк в кодировке base64, передаваемых напрямую в интерпретатор оболочки",
        "TOOL_CMD_PIPE_TO_SHELL": "Обнаруживает паттерны 'curl | bash' для загрузки и немедленного выполнения удалённых скриптов",
        "TOOL_CMD_PRIVILEGE_ESCALATION": "Обнаруживает попытки повышения привилегий с использованием sudo, su, doas, pkexec или runas",
        "TOOL_CMD_PROCESS_KILL": "Обнаруживает команды завершения процессов, которые могут остановить критические процессы",
        "TOOL_CMD_PROC_ENVIRON": "Обнаруживает доступ к /proc/*/environ, который может раскрыть переменные окружения",
        "TOOL_CMD_REVERSE_SHELL": "Обнаруживает попытки создания обратных оболочек или несанкционированных сетевых туннелей",
        "TOOL_CMD_SERVICE_RESTART": "Обнаруживает команды управления службами, которые могут нарушить работу системных служб",
        "TOOL_CMD_SYSTEM_REBOOT": "Обнаруживает команды перезагрузки или выключения системы, которые остановят хост-систему",
        "TOOL_CMD_SYSTEM_TAMPERING": "Обнаруживает доступ к заданиям cron, SSH-ключам или правам sudo (включая чтение и изменение)",
        "TOOL_CMD_UNICODE_WHITESPACE": "Обнаруживает пробельные символы Unicode, вызывающие неоднозначность парсинга",
        "TOOL_CMD_UNSAFE_PERMISSIONS": "Обнаруживает глобальное понижение прав доступа (chmod 777) или установку неизменяемых флагов",
        "TOOL_CMD_ZSH_DANGEROUS": "Обнаруживает Zsh-специфичные встроенные команды, которые могут обойти проверки безопасности"
      },
      "categories": {
        "command_injection": "Внедрение команд",
        "code_execution": "Выполнение кода",
        "data_exfiltration": "Утечка данных",
        "path_traversal": "Обход пути",
        "sensitive_file_access": "Доступ к конфиденциальным файлам",
        "network_abuse": "Злоупотребление сетью",
        "credential_exposure": "Утечка учётных данных",
        "resource_abuse": "Злоупотребление ресурсами",
        "privilege_escalation": "Повышение привилегий",
        "prompt_injection": "Внедрение промпта",
        "other": "Другое"
      }
    },
    "fileGuard": {
      "title": "Защита файлов",
      "description": "Защита конфиденциальных файлов и директорий от доступа инструментов агента. Добавленные пути будут заблокированы для всех вызовов инструментов.",
      "enableLabel": "Включить защиту файлов",
      "path": "Путь",
      "actions": "Действия",
      "add": "Добавить",
      "inputPlaceholder": "Введите путь к файлу или директории (например, ~/.ssh/ или /etc/passwd)",
      "empty": "Пользовательские конфиденциальные пути не настроены",
      "directory": "Директория",
      "removeConfirm": "Удалить этот путь из списка защиты?",
      "duplicate": "Этот путь уже есть в списке",
      "saveSuccess": "Настройки защиты файлов сохранены",
      "saveFailed": "Не удалось сохранить настройки защиты файлов",
      "loadFailed": "Не удалось загрузить настройки защиты файлов",
      "allowPreviewOutsideWorkspace": "Разрешить предпросмотр файлов вне рабочего пространства",
      "allowPreviewOutsideWorkspaceDesc": "Разрешить предпросмотр файлов за пределами рабочей директории в консоли. Защита конфиденциальных файлов остаётся активной."
    },
    "allowNoAuthHosts": {
      "title": "Хосты без аутентификации",
      "warningTitle": "Предупреждение безопасности",
      "warningDescription": "IP-адреса в этом списке могут обращаться к конечным точкам API без аутентификации. По умолчанию разрешены локальные хосты (127.0.0.1 и ::1) для доступа через CLI. Добавляйте только доверенные IP-адреса. ВНИМАНИЕ: Добавление недоверенных IP представляет серьезную угрозу безопасности.",
      "ipAddress": "IP-адрес",
      "actions": "Действия",
      "add": "Добавить",
      "inputPlaceholder": "Введите IP-адрес (например, 192.168.1.100 или ::1)",
      "empty": "IP-адреса не настроены",
      "default": "По умолчанию",
      "removeConfirm": "Удалить этот IP-адрес из белого списка?",
      "duplicate": "Этот IP-адрес уже есть в списке",
      "invalidIP": "Неверный формат IP-адреса",
      "saveSuccess": "Настройки хостов без аутентификации сохранены",
      "saveFailed": "Не удалось сохранить настройки хостов без аутентификации",
      "loadFailed": "Не удалось загрузить настройки хостов без аутентификации"
    },
    "skillScanner": {
      "title": "Сканер навыков",
      "description": "Автоматическое сканирование навыков на наличие угроз безопасности перед активацией или установкой.",
      "mode": "Режим сканирования",
      "modeTooltip": "Управление поведением сканера: блокировка, только предупреждение или отключение",
      "modeBlock": "Блокировать",
      "modeWarn": "Только предупреждение",
      "modeOff": "Выключен",
      "timeout": "Таймаут сканирования (секунды)",
      "timeoutTooltip": "Максимальное время ожидания завершения сканирования (5-300 секунд)",
      "saveSuccess": "Настройки сканера навыков сохранены",
      "saveFailed": "Не удалось сохранить настройки сканера навыков",
      "scanAlerts": {
        "title": "Оповещения сканирования",
        "empty": "Нет оповещений безопасности",
        "clearAll": "Очистить все",
        "clearConfirm": "Очистить все оповещения сканирования?",
        "skillName": "Навык",
        "action": "Действие",
        "actionBlocked": "Заблокировано",
        "actionWarned": "Предупреждение",
        "time": "Время",
        "actions": "Действия",
        "allowSkill": "Добавить в белый список",
        "remove": "Удалить",
        "viewFindings": "Подробности"
      },
      "whitelist": {
        "title": "Белый список",
        "empty": "Белый список пуст",
        "skillName": "Навык",
        "addedAt": "Добавлено",
        "contentHash": "Хеш содержимого",
        "actions": "Действия",
        "remove": "Удалить",
        "removeConfirm": "Удалить этот навык из белого списка?",
        "addSuccess": "Навык добавлен в белый список",
        "removeSuccess": "Навык удалён из белого списка",
        "addFailed": "Не удалось добавить навык в белый список",
        "removeFailed": "Не удалось удалить навык из белого списка",
        "removeWillDisable": "После удаления навык также будет отключён.",
        "removeAndDisabled": "Навык удалён из белого списка и отключён"
      },
      "scanError": {
        "title": "Обнаружены проблемы безопасности",
        "description": "Обнаружены следующие проблемы безопасности:",
        "warnDescription": "Обнаружены проблемы безопасности, но навык был включён (режим предупреждения):",
        "goToWhitelist": "Перейти к белому списку",
        "moreFindings": "Ещё {{count}} записей не показано (полный список: Настройки → Безопасность → Сканер навыков)."
      }
    }
  },
  "login": {
    "title": "Вход в QwenPaw",
    "registerTitle": "Создание аккаунта",
    "firstUserHint": "Создайте учётную запись администратора для начала работы",
    "usernamePlaceholder": "Имя пользователя",
    "passwordPlaceholder": "Пароль",
    "usernameRequired": "Пожалуйста, введите имя пользователя",
    "passwordRequired": "Пожалуйста, введите пароль",
    "submit": "Войти",
    "register": "Зарегистрироваться",
    "failed": "Ошибка входа, проверьте учётные данные",
    "registerSuccess": "Регистрация прошла успешно",
    "registerFailed": "Ошибка регистрации",
    "authNotEnabled": "Аутентификация не включена",
    "logout": "Выйти",
    "logoutSuccess": "Вы успешно вышли",
    "sessionExpired": "Сессия истекла, пожалуйста, войдите снова",
    "unauthorized": "Не авторизован, пожалуйста, войдите"
  },
  "account": {
    "title": "Управление аккаунтом",
    "currentPassword": "Текущий пароль",
    "currentPasswordRequired": "Пожалуйста, введите текущий пароль",
    "newUsername": "Новое имя пользователя",
    "newUsernamePlaceholder": "Оставьте пустым, чтобы не менять",
    "newPassword": "Новый пароль",
    "newPasswordPlaceholder": "Оставьте пустым, чтобы не менять",
    "confirmPassword": "Подтвердите новый пароль",
    "confirmPasswordPlaceholder": "Введите новый пароль ещё раз",
    "passwordMismatch": "Пароли не совпадают",
    "save": "Сохранить изменения",
    "updateSuccess": "Аккаунт успешно обновлён",
    "updateFailed": "Не удалось обновить аккаунт",
    "wrongPassword": "Текущий пароль неверен",
    "nothingToUpdate": "Пожалуйста, введите новое имя пользователя или пароль",
    "passwordEmpty": "Пароль не может быть пустым",
    "usernameEmpty": "Имя пользователя не может быть пустым"
  },
  "voiceTranscription": {
    "title": "Транскрипция голоса",
    "description": "Настройте обработку входящих аудио- и голосовых сообщений.",
    "loadFailed": "Не удалось загрузить настройки аудиорежима",
    "saveSuccess": "Аудиорежим сохранён",
    "saveFailed": "Не удалось сохранить аудиорежим",
    "audioModeLabel": "Аудиорежим",
    "audioModeDescription": "Выберите, как голосовые сообщения из каналов (Discord, Telegram и др.) обрабатываются перед отправкой модели.",
    "modeAuto": "Авто (рекомендуется)",
    "modeAutoDesc": "Транскрибировать аудио в текст через выбранный провайдер, затем отправить текст модели. Если транскрипция отключена или недоступна, отображается заглушка «файл загружен». В этом режиме аудио не отправляется модели напрямую. Работает со всеми моделями.",
    "modeNative": "Нативное аудио",
    "modeNativeDesc": "Отправлять аудиофайл модели напрямую без транскрипции. Это единственный режим, передающий аудио модели. Работает только с моделями, поддерживающими аудио (например, gpt-4o-audio). Большинство моделей не поддерживают этот режим.",
    "ffmpegReady": "ffmpeg установлен. Конвертация аудио для нативного режима доступна.",
    "ffmpegMissing": "ffmpeg не установлен.",
    "ffmpegMissingDesc": "Нативный аудиорежим требует ffmpeg для конвертации аудиоформатов (например, .ogg в .wav). Установите ffmpeg как системный пакет для включения этого режима.",
    "providerTypeLabel": "Провайдер транскрипции",
    "providerTypeDescription": "Выберите бэкенд транскрипции. Если голосовая транскрипция не нужна, выберите «Отключено».",
    "providerTypeDisabled": "Отключено",
    "providerTypeDisabledDesc": "Без транскрипции. Голосовые сообщения будут отображаться как заглушка «файл загружен».",
    "providerTypeWhisperApi": "Whisper API",
    "providerTypeWhisperApiDesc": "Использовать OpenAI-совместимый Whisper API от настроенного провайдера (например, OpenAI, Ollama).",
    "providerTypeLocalWhisper": "Локальный Whisper",
    "providerTypeLocalWhisperDesc": "Запускать транскрипцию локально с помощью библиотеки openai-whisper. Требуются ffmpeg и openai-whisper.",
    "localWhisperReady": "Локальный Whisper готов к работе. ffmpeg и openai-whisper установлены.",
    "localWhisperMissing": "Локальный Whisper не готов. Необходимо установить недостающие зависимости.",
    "localWhisperMissingDesc": "ffmpeg: {{ffmpeg}} | openai-whisper: {{whisper}}. Установите недостающие зависимости: ffmpeg (системный пакет) и openai-whisper (uv pip install openai-whisper или установите QwenPaw с опцией [whisper]).",
    "providerLabel": "Провайдер Whisper API",
    "providerDescription": "Выберите провайдера для транскрипции аудио через Whisper API. Отображаются только провайдеры с совместимым эндпоинтом.",
    "providerPlaceholder": "Выберите провайдера...",
    "noProvidersWarning": "Не найдено провайдеров для транскрипции. Настройте провайдер OpenAI для включения голосовой транскрипции.",
    "transcriptionInfoTitle": "Как работает транскрипция",
    "transcriptionInfoDesc": "Whisper API транскрипция использует OpenAI-совместимый эндпоинт /v1/audio/transcriptions. Необходим провайдер с поддержкой Whisper (например, OpenAI). Выберите конкретного провайдера выше для включения транскрипции.",
    "transcriptionInfoDescLocal": "Локальная Whisper транскрипция запускает библиотеку openai-whisper непосредственно на вашем устройстве. Требуются ffmpeg (для декодирования аудио) и пакет openai-whisper. API-ключ и подключение к интернету не нужны. Установка: uv pip install 'qwenpaw[whisper]'."
  },
  "acp": {
    "title": "ACP",
    "loading": "Загрузка конфигурации ACP...",
    "builtin": "Встроенный",
    "custom": "Пользовательский",
    "create": "Добавить пользовательский агент",
    "createTitle": "Создать ACP агент",
    "createSuccess": "ACP агент создан",
    "editTitle": "Редактировать конфигурацию ACP",
    "agentKey": "Ключ агента",
    "agentKeyRequired": "Пожалуйста, введите ключ агента",
    "agentKeyInvalid": "Ключ агента может содержать только буквы, цифры, подчёркивания и дефисы",
    "agentKeyExists": "Этот ключ агента уже существует",
    "enabled": "Включено",
    "command": "Команда",
    "commandRequired": "Пожалуйста, введите команду",
    "args": "Аргументы",
    "argsHelp": "По одному аргументу на строку",
    "env": "Переменные окружения",
    "envHelp": "Используйте формат KEY=VALUE в каждой строке",
    "envInvalidLine": "Неверный формат переменной окружения: {{line}}",
    "trusted": "Доверенный",
    "toolParseMode": "Режим разбора инструментов",
    "toolParseModeRequired": "Пожалуйста, выберите режим разбора инструментов",
    "stdioBufferLimit": "Лимит буфера stdio",
    "stdioBufferLimitHelp": "Максимальный размер буфера чтения одной строки stdio для ACP-подпроцесса в байтах.",
    "stdioBufferLimitRequired": "Пожалуйста, укажите лимит буфера stdio",
    "stdioBufferLimitMin": "Лимит буфера stdio должен быть не меньше 1 байта",
    "docs": "Документация",
    "docsHelp": "Открыть документацию по ACP и перейти к разделу \"How to configure external runners\"",
    "notSet": "Не задано",
    "configSaved": "Конфигурация ACP сохранена",
    "configFailed": "Не удалось сохранить конфигурацию ACP",
    "deleteTitle": "Удалить {{name}}",
    "deleteConfirm": "Удалить этот ACP агент? Это действие нельзя отменить.",
    "deleteSuccess": "ACP агент удалён",
    "deleteFailed": "Не удалось удалить ACP агент",
    "nodeSettings": "Настройки Node",
    "nodePath": "Путь к Node",
    "chooseOtherNode": "Выбрать другой Node...",
    "selectNodePath": "Выбрать путь к Node",
    "nodePathPrompt": "Введите путь к исполняемому файлу node",
    "nodeSaved": "Настройки Node сохранены",
    "nodeLoadFailed": "Не удалось загрузить настройки Node",
    "nodeSaveFailed": "Путь к Node недоступен",
    "nodeRuntime": {
      "bundled": "Встроенный Node",
      "system": "Системный Node",
      "custom": "Пользовательский Node"
    },
    "nodeRuntimeReason": {
      "systemNodeMissing": "Системный Node не обнаружен",
      "nodeMissing": "Путь к Node не существует",
      "npxMissing": "npx не найден",
      "versionCheckFailed": "Проверка версии не удалась",
      "unavailable": "Недоступно"
    }
  },
  "backup": {
    "title": "Резервные копии",
    "description": "Резервное копирование и восстановление рабочих пространств агентов и конфигураций.",
    "create": "Создать резервную копию",
    "import": "Импорт",
    "export": "Экспорт",
    "restore": "Восстановить",
    "delete": "Удалить",
    "batchDelete": "Удалить выбранные",
    "batchDeleteConfirm": "Вы уверены, что хотите удалить {{count}} резервную(ых) копию(й)? Это действие нельзя отменить.",
    "deleteConfirm": "Вы уверены, что хотите удалить эту резервную копию? Это действие нельзя отменить.",
    "name": "Название",
    "createdAt": "Создана",
    "scopeSummary": "Область",
    "descriptionLabel": "Описание",
    "noBackups": "Резервных копий пока нет. Создайте одну для сохранения текущей конфигурации.",
    "loadFailed": "Не удалось загрузить список резервных копий",
    "createTitle": "Создать резервную копию",
    "backupMode": "Режим резервного копирования",
    "fullBackup": "Полная резервная копия",
    "fullBackupDesc": "Резервное копирование всего, включая все рабочие пространства агентов, глобальные настройки, пул навыков и секреты",
    "customBackup": "Пользовательская резервная копия",
    "partialBackup": "Частичная резервная копия",
    "partialBackupDesc": "Настроить содержимое резервной копии",
    "nameRequired": "Название резервной копии обязательно",
    "namePlaceholder": "Введите название резервной копии",
    "descriptionPlaceholder": "Необязательное описание...",
    "scopeAgents": "Рабочие пространства агентов",
    "scopeGlobalConfig": "Глобальные настройки",
    "scopeSkillPool": "Пул навыков",
    "scopeSecrets": "Секреты",
    "scopeSecretsHint": "Включает секреты провайдеров моделей (API-ключи), переменные окружения и другую конфиденциальную информацию",
    "securityNotice": "Эта резервная копия может содержать конфиденциальные учётные данные. Рабочие пространства агентов включают учётные данные каналов (токены ботов, секреты приложений и т.д.), а секреты провайдеров моделей включают API-ключи. Не передавайте файлы резервных копий другим лицам.",
    "searchPlaceholder": "Поиск по названию или ID...",
    "total": "Всего {{count}}",
    "agentsPlaceholder": "Выберите рабочие пространства агентов (оставьте пустым для всех)",
    "selectAll": "Выбрать все",
    "deselectAll": "Снять выбор",
    "createSuccess": "Резервная копия успешно создана",
    "createFailed": "Не удалось создать резервную копию",
    "restoreTitle": "Восстановить резервную копию",
    "restoreScope": "Область восстановления",
    "restoreFullWarning": "Полное восстановление полностью заменит всё содержимое текущего экземпляра (всех агентов, глобальную конфигурацию, пул навыков и секреты). Это действие нельзя отменить. Во время восстановления связанные функции будут недоступны. После завершения восстановления перезапустите сервис.",
    "agentGroupExisting": "Существующие",
    "agentGroupNew": "Новые",
    "agentExists": "Существует",
    "agentNew": "Новый",
    "agentActionReplace": "Заменить",
    "agentActionAdd": "Добавить",
    "agentColumnName": "Агент",
    "agentColumnWorkspace": "Рабочая область",
    "agentTotal": "Всего {{count}} агентов",
    "noAgentsInBackup": "В резервной копии нет рабочих областей агентов",
    "loadingAgents": "Загрузка списка агентов...",
    "agentSearchPlaceholder": "Поиск по имени или ID...",
    "agentSearchTotal": "{{count}} из {{total}} агентов",
    "restoreCustomSummary": "Выбрано: {{existing}} существующих · {{added}} новых",
    "defaultWorkspaceDirUnused": "Нет новых агентов",
    "otherOptions": "Другие параметры",
    "defaultWorkspaceDirDefault": "<Путь по умолчанию>/{{aid}}",
    "restoreWarningModify": "Восстановление изменит текущие конфигурации. Это действие нельзя отменить.",
    "restoreWarningRestart": "Во время восстановления связанные функции будут недоступны. После завершения восстановления перезапустите сервис.",
    "preRestoreBackupTitle": "Создать резервную копию перед восстановлением",
    "preRestoreBackupContent": "Операция восстановления необратима. Хотите сначала создать резервную копию текущего состояния? Это позволит откатиться, если во время восстановления возникнут проблемы.",
    "preRestoreBackupYes": "Да, сначала создать резервную копию",
    "preRestoreBackupNo": "Нет, восстановить сразу",
    "preRestoreBackupDesc": "Автоматически созданная резервная копия перед восстановлением",
    "preRestoreBackupFailed": "Не удалось создать резервную копию перед восстановлением",
    "preRestoreBackupSuccess": "Резервная копия создана успешно, ID: {{id}}",
    "creatingPreRestoreBackup": "Создание резервной копии перед восстановлением...",
    "skipAndRestore": "Пропустить и продолжить восстановление",
    "restoreConfirm": "Я подтверждаю, что хочу восстановить эту резервную копию",
    "restoreMode": "Режим восстановления",
    "restoreModeFull": "Полное восстановление",
    "restoreModeFullDesc": "Полная замена всего содержимого текущего экземпляра, включая всех агентов, глобальную конфигурацию, пул навыков и секреты",
    "restoreModeCustom": "Выборочное восстановление",
    "restoreModeCustomDesc": "Выберите содержимое для восстановления, например, отдельных агентов, конфигурацию и т.д.; существующие агенты, не включённые в это восстановление, сохранятся",
    "restoreModeFullDisabled": "Только для полной резервной копии",
    "defaultWorkspaceDir": "Каталог рабочей области агента по умолчанию",
    "defaultWorkspaceDirPlaceholder": "Оставьте пустым для использования ~/.qwenpaw/workspaces",
    "defaultWorkspaceDirHint": "Если исходный путь рабочей области агента не существует, агент будет сохранён по пути <путь по умолчанию>/<ID агента>. Если путь существует, используется исходный путь агента.",
    "restoreStrategy": "Стратегия восстановления",
    "restoreStrategyPreserve": "Сохранить локальные настройки безопасности и MCP",
    "restoreStrategyPreserveDesc": "Сохранить защитные настройки безопасности и конфигурацию MCP этого экземпляра.",
    "restoreStrategyRestore": "Восстановить эти настройки из резервной копии",
    "restoreStrategyRestoreDesc": "Использовать настройки безопасности и MCP из резервной копии.",
    "restoreSuccess": "Резервная копия успешно восстановлена. Пожалуйста, перезапустите сервис.",
    "restoreSuccessPreserved": "Резервная копия успешно восстановлена. Сохранены локальные настройки: {{keys}}. Пожалуйста, перезапустите сервис.",
    "restoreSuccessWithBackup": "Резервная копия успешно восстановлена. ID резервной копии до восстановления: {{preRestoreId}}. Пожалуйста, перезапустите сервис.",
    "restoreFailed": "Не удалось восстановить резервную копию",
    "restoreTargetBusy": "Не удалось восстановить резервную копию: эти каталоги все еще используются. Закройте браузер или процесс, который их использует, и повторите попытку. Если каталоги остаются заблокированными, перезапустите систему и попробуйте снова.",
    "detailLoadFailed": "Не удалось загрузить детали резервной копии; восстановление недоступно",
    "trustLocalBanner": "Локальная резервная копия — по умолчанию полное восстановление",
    "trustForeignBanner": "Импортированная резервная копия — локальные настройки безопасности и MCP сохраняются по умолчанию",
    "trustLegacyBanner": "Устаревшая резервная копия — перед восстановлением нужно подтвердить доверие",
    "trustForeignTitle": "Доверять этой резервной копии?",
    "trustLegacyTitle": "Доверять устаревшей резервной копии?",
    "unknownBackupName": "Архив резервной копии",
    "trustForeignDesc": "Эта резервная копия не подписана данным экземпляром. Продолжайте только если доверяете источнику; при восстановлении локальные настройки безопасности и MCP будут сохранены по умолчанию.",
    "trustLegacyDesc": "У этой старой резервной копии нет локальной подписи. Продолжайте только если доверяете источнику; этот экземпляр подпишет ее перед восстановлением.",
    "deleteSuccess": "Резервная(ые) копия(и) успешно удалена(ы)",
    "deleteFailed": "Не удалось удалить резервную(ые) копию(и)",
    "exportFailed": "Не удалось экспортировать резервную копию",
    "exportWarningTitle": "Предупреждение о конфиденциальной информации",
    "exportWarningContent": "Эта резервная копия может содержать конфиденциальную информацию учетных данных. Рабочие пространства агентов содержат учетные данные каналов (такие как токены ботов, секреты приложений и т.д.), а секреты поставщиков моделей содержат API-ключи. Не передавайте файл резервной копии другим лицам.",
    "exportConfirm": "Подтвердить экспорт",
    "importTitle": "Импорт резервной копии",
    "importSuccess": "Резервная копия успешно импортирована",
    "importFailed": "Не удалось импортировать резервную копию",
    "importConflictTitle": "Резервная копия уже существует",
    "importConflictDesc": "Резервная копия с таким же ID уже существует. Хотите заменить её?",
    "importReplace": "Заменить",
    "agents": "{{count}} агент(ов)",
    "allAgents": "Все агенты",
    "globalConfig": "Глобальные настройки",
    "skillPool": "Пул навыков",
    "secrets": "Секреты",
    "selected": "Выбрано {{count}}",
    "fileCount": "{{count}} файлов",
    "totalSize": "{{size}}",
    "progressStarting": "Инициализация резервной копии...",
    "progressAgent": "Резервное копирование агента {{index}} / {{total}}...",
    "progressSaving": "Сохранение файла резервной копии...",
    "progressDone": "Резервная копия создана",
    "localModelsNotice": "Файлы резервной копии не включают локальные файлы моделей. При миграции между устройствами необходимо повторно загрузить нужные локальные модели на целевом устройстве."
  },
  "approval": {
    "title": "Требуется подтверждение безопасности",
    "tool": "Инструмент",
    "severity": "Уровень угрозы",
    "findings": "Находки",
    "parameters": "Параметры",
    "approve": "Подтвердить",
    "deny": "Отклонить",
    "source": "Источник",
    "subSession": "Подагент",
    "approved": "Вызов инструмента подтвержден",
    "denied": "Вызов инструмента отклонен",
    "approveFailed": "Не удалось подтвердить",
    "denyFailed": "Не удалось отклонить",
    "approvePattern": "Всегда Разрешить",
    "strictModeHint": "Всегда разрешить недоступно в строгом режиме",
    "approveExact": "Только Сейчас",
    "approvalScope": "Область подтверждения",
    "details": "Подробности",
    "timeoutAutoDenied": "Время истекло, автоматически отклонено",
    "acknowledge": "Понятно",
    "builtinSource": "Встроенный",
    "ownerAgent": "Владелец агента",
    "executingAgent": "Исполняющий агент"
  },
  "pluginManager": {
    "title": "Менеджер плагинов",
    "description": "Установка, управление и удаление плагинов без перезапуска службы.",
    "installed": "Установленные плагины",
    "noPlugins": "Плагины еще не установлены",
    "installBtn": "Установить плагин",
    "installTitle": "Установка плагина",
    "dropPrimary": "Перетащите папку или ZIP-файл сюда",
    "dropSecondary": "или нажмите, чтобы выбрать ZIP-файл",
    "orFromUrl": "или из URL",
    "installFromUrl": "Установить из URL",
    "urlPlaceholder": "https://example.com/plugin.zip",
    "zipOnly": "При перетаскивании файлов поддерживаются только ZIP-файлы — перетащите папку для установки из директории",
    "dropFailed": "Не удалось прочитать перетащенную папку",
    "restartHint": "Некоторые плагины (например, хуки, monkey-patches) могут требовать перезапуска приложения для полного вступления в силу или удаления.",
    "installing": "Установка...",
    "installSuccess": "Плагин успешно установлен",
    "installFailed": "Не удалось установить плагин",
    "uninstall": "Удалить",
    "uninstallConfirm": "Удалить плагин \"{{name}}\"? Это действие нельзя отменить. Некоторые плагины могут требовать перезапуска приложения для полного удаления.",
    "uninstalling": "Удаление...",
    "uninstallSuccess": "Плагин успешно удалён",
    "uninstallFailed": "Не удалось удалить плагин",
    "statusLoaded": "Работает",
    "statusUnloaded": "Не загружен",
    "type": "Тип",
    "version": "Версия",
    "author": "Автор",
    "unknown": "Неизвестно",
    "loadFailed": "Не удалось загрузить список плагинов",
    "confirmTitle": "Подтвердить удаление",
    "officialTitle": "Официальные плагины",
    "officialDesc": "Установка опубликованных плагинов с CDN загрузок.",
    "catalogRefresh": "Обновить",
    "catalogEmpty": "Нет доступных официальных плагинов (каталог CDN может быть пуст)",
    "catalogLoadFailed": "Не удалось загрузить каталог официальных плагинов",
    "catalogInstall": "Установить",
    "catalogReinstall": "Переустановить",
    "catalogUpgrade": "Доступно обновление",
    "catalogUpgradeBtn": "Обновить",
    "catalogInstalled": "Установлен",
    "catalogSha256": "SHA256",
    "kindBundle": "Пакет",
    "kindTool": "Инструмент",
    "filterByName": "Фильтр по имени",
    "filterByKind": "Фильтр по типу",
    "marketTitle": "Plugin Market",
    "marketEmpty": "No plugins found in market",
    "marketLoadFailed": "Failed to load plugin market",
    "marketUnavailable": "Plugin Market is currently under maintenance, please try again later",
    "marketAll": "All",
    "marketSearch": "Search plugins...",
    "marketCategory": "Filter by category",
    "marketSearchResult": "Found {{count}} plugins matching \"{{keyword}}\"",
    "marketDetails": "Details",
    "marketDownloads": "Downloads",
    "marketDeveloper": "Developer",
    "marketSortLabel": "Sort plugins",
    "marketSortDownloads": "Most downloaded",
    "marketSortUpdated": "Recently updated",
    "marketSortFavorites": "Most favorited"
  },
  "inbox": {
    "title": "Ежедневный AI-сбор",
    "tabApprovals": "Подтверждения",
    "tabPushMessages": "Push-сообщения",
    "tabHarvests": "AI-сбор",
    "summaryApprovals": "Подтверждения",
    "summaryPushUnread": "Непрочитанные push",
    "summaryHarvests": "Сборы",
    "from": "От:",
    "requestedBy": "Кем:",
    "markRead": "Прочитано",
    "markAllRead": "Прочитать всё",
    "markAllReadNoUnread": "Нет непрочитанных сообщений",
    "markAllReadSuccess": "Отмечено как прочитанное: {{count}} сообщ.",
    "selectAllCurrentPage": "Выбрать текущую страницу",
    "selectedItems": "Выбрано: {{count}}",
    "batchDeleteButton": "Удалить выбранные",
    "batchOperation": "Массовые действия",
    "exitBatch": "Выйти",
    "batchDeleteConfirm": "Удалить {{count}} выбранных push-сообщений?",
    "batchDeleteSuccess": "Удалено push-сообщений: {{count}}",
    "pushCronHeader": "Cron-задача: {{name}}",
    "viewDetails": "Подробнее",
    "deleteMessageConfirm": "Удалить это push-сообщение?",
    "viewAll": "Показать все",
    "read": "Читать",
    "approve": "Подтвердить",
    "reject": "Отклонить",
    "ready": "Готово",
    "harvestNow": "Собрать сейчас",
    "createHarvest": "Создать сбор",
    "createFirstHarvest": "Создайте первый сбор",
    "createSuccess": "Сбор успешно создан",
    "emptyApprovals": "Нет ожидающих подтверждений",
    "emptyPush": "Нет push-сообщений",
    "emptyHarvests": "Сборов пока нет",
    "statusReadyToHarvest": "Готово к сбору",
    "statusGrowing": "Растёт",
    "harvestedTimes": "Собрано раз: {{count}}",
    "harvestSuccessRate": "Успешность {{rate}}%",
    "messageDetailComingSoon": "Подробный вид сообщения — скоро!",
    "harvestSettingsComingSoon": "Настройки сбора — скоро!",
    "messageDetailTitle": "Детали выполнения",
    "detailCronTitle": "Cron-задача: {{name}}",
    "detailHeartbeatTitle": "Пульс",
    "messageNotFound": "Сообщение не найдено",
    "detailTaskName": "Имя задачи",
    "detailTaskId": "ID задачи",
    "detailStatus": "Статус",
    "detailSeverity": "Важность",
    "detailAgent": "Агент",
    "detailSource": "Источник",
    "detailSourceCronJob": "Cron-задача",
    "detailSourceHeartbeat": "Пульс",
    "detailTrigger": "Триггер",
    "detailDuration": "Длительность",
    "detailExecutedAt": "Выполнено в",
    "detailReceivedAt": "Получено в",
    "detailRunId": "ID запуска",
    "detailContent": "Вывод",
    "detailPayload": "Данные",
    "detailExecutionTrace": "Трассировка выполнения",
    "detailTraceEmpty": "Трассировка выполнения недоступна",
    "filterByAgent": "Фильтр по агенту",
    "filterBySourceType": "Фильтр по источнику",
    "sourceTypeCron": "Cron",
    "sourceTypeHeartbeat": "Heartbeat",
    "sourceTypeMemory": "Memory"
  },
  "codingMode": {
    "title": "Режим кодирования",
    "experimental": "Экспериментальная функция",
    "experimentalDesc": "Режим кодирования превращает QwenPaw в лёгкую Web IDE с редактором кода, деревом файлов, интеграцией Git и AI-помощником для программирования.",
    "experimentalNote": "Эта функция является экспериментальной и находится в активной разработке. Некоторые возможности могут быть ограничены или изменены в будущих обновлениях.",
    "confirmBtn": "Включить режим кодирования",
    "enterTooltip": "Войти в режим кодирования",
    "exitTooltip": "Выйти из режима кодирования",
    "btnCode": "Код",
    "btnChat": "Чат",
    "selectProject": "Выбрать проект для работы",
    "selectProjectDesc": "Выберите проект или используйте рабочее пространство по умолчанию",
    "tabWorkspace": "Рабочее пространство по умолчанию",
    "tabClone": "Клонировать репозиторий",
    "tabLocal": "Импортировать локальный проект",
    "tabNew": "Новый проект",
    "workspaceDesc": "Использовать директорию рабочего пространства текущего агента",
    "cloneUrl": "URL Git-репозитория",
    "cloneUrlPlaceholder": "https://github.com/user/repo.git",
    "cloneName": "Название проекта (необязательно)",
    "cloneNamePlaceholder": "Оставьте пустым для определения из URL",
    "cloneBtn": "Начать клонирование",
    "cloning": "Клонирование...",
    "localPath": "Путь к локальной директории",
    "localPathPlaceholder": "/Users/ваше-имя/мой-проект",
    "localPathHint": "Введите абсолютный путь к вашему локальному проекту",
    "openBtn": "Импортировать",
    "newName": "Название проекта",
    "newNamePlaceholder": "мой-проект",
    "createBtn": "Создать проект",
    "switchProject": "Сменить проект",
    "currentProject": "Текущий проект",
    "resetToWorkspace": "Сбросить до рабочего пространства по умолчанию",
    "dropPrimary": "Перетащите папку сюда или нажмите для выбора",
    "dropSecondary": "Перетащите из Finder или вставьте путь ниже",
    "pathHint": "Введите полный абсолютный путь (начинающийся с / или ~)",
    "importing": "Импорт...",
    "dropFailed": "Не удалось прочитать папку",
    "workingDir": "Рабочая директория",
    "importCopyNote": "Папка будет скопирована в coding_projects/. Оригинальные файлы не будут изменены.",
    "importCopyDesc": "Импорт создаст копию папки. Агент работает с копией, оригинальные файлы не изменяются. Чтобы работать с оригиналом напрямую, используйте «Открыть каталог».",
    "tabOpenDir": "Открыть каталог",
    "openDirDesc": "Открыть существующий локальный каталог — файлы не копируются",
    "openDirBtn": "Открыть этот каталог",
    "openDirLoading": "Загрузка...",
    "openDirEmpty": "Нет подкаталогов",
    "openDirHome": "Домой",
    "openDirRefresh": "Обновить",
    "openDirHiddenFolders": "Скрытые папки"
  },
  "market": {
    "searchPlaceholder": "Поиск навыков по платформам",
    "categoryAll": "Все",
    "categoryPlaceholder": "Поиск категории",
    "searchResult": "Найдено навыков по запросу \"{{keyword}}\": {{count}}",
    "providerUnavailable": "Источник недоступен",
    "noResults": "Ничего не найдено",
    "startTyping": "Введите запрос выше, чтобы найти навык в маркете",
    "browseHint": "Выберите категорию или введите ключевое слово, чтобы просмотреть навыки в {{providers}}",
    "noDescription": "Описание отсутствует",
    "browseMarket": "Обзор маркета",
    "installQueue": "Очередь установки",
    "clearCompleted": "Очистить",
    "retry": "Повторить",
    "status": {
      "queued": "В очереди",
      "installing": "Установка",
      "completed": "Готово",
      "failed": "Ошибка",
      "cancelled": "Отменено"
    },
    "loadMore": "Загрузить ещё",
    "noMoreResults": "Больше результатов нет",
    "detail": {
      "title": "Сведения о навыке",
      "version": "Версия",
      "author": "Автор",
      "sourceUrl": "URL установки",
      "slug": "Идентификатор",
      "missing": "—"
    },
    "stats": {
      "downloads": "Скачивания",
      "stars": "Звёзды",
      "installs": "Установки",
      "likes": "Лайки",
      "views": "Просмотры",
      "category": "Категория",
      "updatedAt": "Обновлено"
    },
    "queueMsg": {
      "timedOut": "Время установки истекло",
      "failedPrefix": "Ошибка: {{msg}}"
    }
  },
  "startup": {
    "starting": "Запуск сервера...",
    "checking": "Подключение к серверу...",
    "error": "Не удалось запустить сервер.",
    "errorHint": "Не удалось запустить процесс сервера. Проверьте журналы приложения.",
    "errorDetails": "Показать сведения об ошибке",
    "timeout": "Не удалось запустить сервер за {{seconds}} секунд.",
    "timeoutHint": "Не удалось запустить бэкенд. Повторите попытку или проверьте журналы приложения.",
    "retry": "Повторить"
  },
  "preview": {
    "error": {
      "SENSITIVE_FILE_BLOCKED": "Этот файл заблокирован защитой файлов (защита конфиденциальных файлов).",
      "OUTSIDE_WORKSPACE": "Этот файл находится за пределами рабочего пространства. Включите «Разрешить предпросмотр файлов вне рабочего пространства» в Настройки → Безопасность → Защита файлов.",
      "FORBIDDEN": "Доступ запрещён: недостаточно прав для предпросмотра этого файла.",
      "NOT_FOUND": "Файл не найден. Возможно, он был перемещён или удалён. Если использован относительный путь, попробуйте абсолютный.",
      "LOAD_FAILED": "Не удалось загрузить предпросмотр файла.",
      "LOAD_FAILED_DETAIL": "Не удалось загрузить предпросмотр файла: {{detail}}"
    }
  },
  "tool": {
    "readFile": "Читать {{file}}",
    "readFileDefault": "Читать файл",
    "writeFile": "Создать {{file}}",
    "writeFileDefault": "Создать файл",
    "editFile": "Редактировать {{file}}",
    "editFileDefault": "Редактировать файл",
    "appendFile": "Добавить в {{file}}",
    "appendFileDefault": "Добавить в файл",
    "grepSearch": "Grep {{pattern}}",
    "grepSearchDefault": "Grep поиск",
    "globSearch": "Glob {{pattern}}",
    "globSearchDefault": "Glob поиск",
    "viewImage": "Просмотр изображения {{file}}",
    "viewImageDefault": "Просмотр изображения",
    "viewVideo": "Просмотр видео {{file}}",
    "viewVideoDefault": "Просмотр видео",
    "desktopScreenshot": "Снимок рабочего стола",
    "sendFile": "Отправить {{file}}",
    "sendFileDefault": "Отправить файл",
    "browserUse": "Просмотр {{detail}}",
    "browserNavigate": "Открыть {{url}}",
    "browserNavigateDefault": "Открыть страницу",
    "browserClick": "Нажать",
    "browserType": "Ввести текст",
    "browserSnapshot": "Снимок страницы",
    "browserScroll": "Прокрутка",
    "getCurrentTime": "Получить текущее время",
    "setTimezone": "Установить {{timezone}}",
    "getTokenUsage": "Запросить использование токенов",
    "memorySearch": "Поиск в памяти {{query}}",
    "memorySearchDefault": "Поиск в памяти",
    "listAgents": "Список агентов",
    "chatWithAgent": "Чат с {{agent}}",
    "chatWithAgentDefault": "Чат с агентом",
    "submitToAgent": "Отправить {{agent}}{{task}}",
    "submitToAgentDefault": "Отправить задачу",
    "checkAgentTask": "Проверить {{agent}} #{{taskId}}",
    "checkAgentTaskAgent": "Проверить {{agent}}",
    "checkAgentTaskDefault": "Проверить задачу",
    "delegateExternalAgent": "Делегировать {{runner}}",
    "delegateExternalAgentDefault": "Делегировать внешнему агенту",
    "materializeSkill": "Создать {{skill}}",
    "materializeSkillDefault": "Создать навык",
    "shell": "Выполнить {{command}}",
    "shellDefault": "Выполнить команду",
    "formatTable": {
      "file": "Файл",
      "lineNumber": "Строка",
      "score": "Оценка",
      "summary": "Сводка",
      "name": "Имя",
      "id": "ID",
      "description": "Описание",
      "status": "Статус"
    },
    "loading": "Загрузка...",
    "inputProgress": "Получено символов: {{count}}",
    "rawInputPreview": "Необработанный ввод в реальном времени (последние 4 096 символов)",
    "browserAction": {
      "startHeaded": "Запустить браузер (с интерфейсом)",
      "start": "Запустить браузер",
      "stop": "Остановить браузер",
      "open": "Открыть {{url}}",
      "openDefault": "Открыть страницу",
      "navigate": "Перейти на {{url}}",
      "navigateDefault": "Навигация",
      "navigateBack": "Назад",
      "click": "Нажать {{selector}}",
      "clickDefault": "Нажать элемент",
      "type": "Ввести {{text}}",
      "typeDefault": "Ввести текст",
      "snapshot": "Получить снимок",
      "screenshot": "Снимок экрана {{path}}",
      "screenshotDefault": "Снимок экрана",
      "eval": "Выполнить {{code}}",
      "evalDefault": "Выполнить код",
      "runCode": "Запустить {{code}}",
      "runCodeDefault": "Запустить код",
      "closePage": "Закрыть страницу",
      "tabs": "Вкладки {{action}}",
      "tabsDefault": "Управление вкладками",
      "fillForm": "Заполнить форму",
      "fileUpload": "Загрузить {{filename}}",
      "fileUploadDefault": "Загрузить файл",
      "fileDownload": "Скачать {{target}}",
      "fileDownloadDefault": "Скачать файл",
      "pressKey": "Нажать {{key}}",
      "pressKeyDefault": "Нажать клавишу",
      "hover": "Навести на {{selector}}",
      "hoverDefault": "Навести на элемент",
      "drag": "Перетащить",
      "selectOption": "Выбрать опцию",
      "waitFor": "Ждать {{target}}",
      "waitForDefault": "Ждать элемент",
      "resize": "Изменить размер {{w}}x{{h}}",
      "resizeDefault": "Изменить размер окна",
      "pdf": "Экспорт PDF {{path}}",
      "pdfDefault": "Экспорт PDF",
      "install": "Установить",
      "batch": "Пакет"
    },
    "lineBadge": {
      "lines": "{{count}} строк",
      "addLines": "+{{count}} строк",
      "delLines": "-{{count}} строк",
      "matches": "{{count}} совпадений",
      "files": "{{count}} файлов"
    },
    "inlineResult": {
      "taskId": "Задача #{{id}}",
      "submitted": "Отправлено"
    },
    "execute": "Запустить {{tool}}",
    "executeDefault": "Запустить инструмент"
  },
  "loop": {
    "gotoSettings": "Настройки Loop агента",
    "selectorTitle": "Режим Loop",
    "selectorHint": "Выберите способ продолжения работы агента",
    "selectorAria": "Выбрать режим Loop",
    "builtInModes": "Встроенные",
    "customModes": "Пользовательские и плагины",
    "starting": "Запуск",
    "running": "Выполняется",
    "awaiting_user": "Ожидание вашего ответа",
    "activePersistentDescription": "Режим действует в этом диалоге до завершения задачи или сброса диалога.",
    "activeCustomDescription": "Пользовательский режим действует до команды /mode off, /clear или /new.",
    "loadError": "Не удалось загрузить некоторые режимы Loop.",
    "retry": "Повторить",
    "modes": {
      "default": {
        "name": "По умолчанию",
        "description": "Стандартный управляемый цикл агента."
      },
      "goal": {
        "name": "Цель",
        "description": "Последовательная работа над конкретной проверяемой целью."
      },
      "mission": {
        "name": "Миссия",
        "description": "Структурированная длительная многоэтапная задача."
      }
    }
  }
}
