import type { Messages } from '../types'; export const ruAiMessages: Messages = { 'ai.chat.contextUsage': 'Контекст: {used} / {max} токенов', // AI Settings 'ai.agentSettings': 'Настройки агента', 'ai.chat.preparing': 'Подготовка…', 'ai.title': 'AI', 'ai.description': 'Настройка AI-провайдеров, агентов и параметров безопасности', 'ai.providers': 'Провайдеры', 'ai.agents': 'Агенты', 'ai.providers.empty': 'Провайдеры не настроены. Добавьте провайдера, чтобы начать.', 'ai.providers.add': 'Добавить провайдера', 'ai.providers.active': 'Активен', 'ai.providers.apiKeyConfigured': 'API-ключ настроен', 'ai.providers.noApiKey': 'Нет API-ключа', 'ai.providers.configure': 'Настроить', 'ai.providers.remove': 'Удалить', 'ai.providers.name': 'Отображаемое имя', 'ai.providers.name.placeholder': 'например, Мой провайдер', 'ai.providers.style': 'Стиль протокола', 'ai.providers.style.anthropic': 'Совместимый с Anthropic', 'ai.providers.style.openai': 'Совместимый с OpenAI', 'ai.providers.style.google': 'Совместимый с Google', 'ai.providers.style.inherited': 'авто', 'ai.providers.style.help': 'Определяет, какой формат API используется для запросов. Переопределите, если стороннее API использует другой диалект.', 'ai.providers.openaiApi': 'Формат API OpenAI', 'ai.providers.openaiApi.chat': 'Chat Completions', 'ai.providers.openaiApi.responses': 'Responses', 'ai.providers.openaiApi.help': 'Chat Completions работает с большинством OpenAI-совместимых эндпоинтов. Responses может повысить попадание в кэш на ретрансляторах с поддержкой /v1/responses.', 'ai.providers.icon.change': 'Изменить иконку', 'ai.providers.icon.upload': 'Загрузить изображение', 'ai.providers.icon.reset': 'Сбросить', 'ai.providers.icon.close': 'Свернуть', 'ai.providers.icon.uploadedNote': 'Своя иконка (64×64 WebP)', 'ai.providers.icon.errorType': 'Пожалуйста, выберите файл изображения.', 'ai.providers.apiKey': 'API-ключ', 'ai.providers.apiKey.placeholder': 'Введите API-ключ', 'ai.providers.apiKey.decrypting': 'Расшифровка...', 'ai.providers.baseUrl': 'Базовый URL', 'ai.providers.baseUrl.anthropicHelp': 'Anthropic-совместимый: хост с /v1 или без (например https://gateway.example или https://gateway.example/v1). Проверка и чат используют /v1/models и /v1/messages.', 'ai.providers.baseUrl.ollamaHelp': 'Локальный Ollama: http://localhost:11434/v1 (без API-ключа). Ollama Cloud: https://ollama.com/v1 и ключ Cloud.', 'ai.providers.skipTLSVerify': 'Пропустить проверку TLS-сертификата (для самоподписанных сертификатов)', 'ai.providers.defaultModel': 'Модель по умолчанию', 'ai.providers.defaultModel.placeholder': 'например, gpt-4o, claude-sonnet-4-20250514', 'ai.providers.contextWindow': 'Контекстное окно', 'ai.providers.contextWindow.placeholder': 'например, 128000', 'ai.providers.contextWindow.help': 'Оставьте пустым, чтобы использовать значение из списка моделей, если оно доступно; иначе NetMesh применит безопасное значение по умолчанию.', 'ai.providers.contextWindow.error': 'Введите положительное целое число или оставьте поле пустым.', 'ai.providers.refreshModels': 'Обновить модели', 'ai.providers.test': 'Проверить', 'ai.providers.test.testing': 'Проверка…', 'ai.providers.test.ok': 'Подключено ({latency} ms)', 'ai.providers.test.warn': 'Эндпоинт доступен, но ответ выглядит неполным ({latency} ms)', 'ai.providers.test.warnSlow': 'Подключено, но медленно ({latency} ms)', 'ai.providers.test.error': 'Ошибка ({detail})', 'ai.providers.test.missingBaseUrl': 'Сначала укажите Base URL', 'ai.providers.test.missingApiKey': 'Сначала укажите API-ключ', 'ai.providers.test.unavailable': 'Проверка соединения недоступна в этой среде', 'ai.providers.searchModel': 'Искать или ввести ID модели...', 'ai.providers.filterModels': 'Фильтровать модели...', 'ai.providers.loadingModels': 'Загрузка моделей...', 'ai.providers.noMatchingModels': 'Нет подходящих моделей', 'ai.providers.clickToLoadModels': 'Нажмите, чтобы загрузить модели', 'ai.providers.showingModels': 'Показаны первые 100 из {count} моделей. Введите текст для фильтрации.', 'ai.providers.advancedParams': 'Дополнительные параметры', 'ai.providers.advancedParams.hint': 'Оставьте пустым, чтобы использовать настройки провайдера по умолчанию.', 'ai.providers.advancedParams.maxTokens.placeholder': 'например, 4096', 'ai.providers.advancedParams.default': 'По умолчанию у провайдера', // AI Codex 'ai.codex': 'Codex', 'ai.codex.title': 'Codex CLI', 'ai.codex.description': 'Подключение OpenAI Codex. Здесь можно войти через ChatGPT или включить API-ключ OpenAI-совместимого провайдера и пользовательский endpoint в настройках.', 'ai.codex.appServer.title': 'Использовать Codex App Server', 'ai.codex.appServer.experimental': 'Экспериментально', 'ai.codex.appServer.description': 'Постоянный протокол Codex с нативными подтверждениями, песочницей, актуальными моделями и вопросами во время выполнения. SDK остаётся режимом по умолчанию.', 'ai.codex.appServer.checking': 'Проверка поддержки App Server…', 'ai.codex.appServer.available': 'Эта версия Codex CLI поддерживает App Server.', 'ai.codex.appServer.modelCatalogWarning': 'Динамический каталог моделей Codex недоступен. Используется встроенный список моделей.', 'ai.codex.appServer.approval.allowSession': 'Разрешить для сеанса', 'ai.codex.appServer.userInput.title': 'Codex требуется ваш ответ', 'ai.codex.appServer.userInput.description': 'Ответьте на вопросы, чтобы продолжить текущую задачу.', 'ai.codex.appServer.userInput.other': 'Введите другой ответ', 'ai.codex.appServer.userInput.autoResolve': 'Если ответа не будет вовремя, Codex продолжит автоматически.', 'ai.codex.appServer.userInput.skip': 'Пропустить', 'ai.codex.appServer.userInput.submit': 'Продолжить', 'ai.codex.steer.addInstruction': 'Добавить инструкцию', 'ai.codex.steer.sending': 'Инструкция добавляется…', 'ai.codex.steer.placeholder': 'Добавьте инструкцию, пока Codex работает…', 'ai.codex.steer.notSteerableReview': 'В этот сеанс проверки Codex нельзя добавить инструкцию. Черновик сохранён.', 'ai.codex.steer.notSteerableCompact': 'В этот сеанс сжатия Codex нельзя добавить инструкцию. Черновик сохранён.', 'ai.codex.steer.busy': 'Другая инструкция уже отправляется в Codex.', 'ai.codex.steer.inactive': 'Задача Codex уже завершена. Черновик сохранён.', 'ai.codex.steer.unsupported': 'Инструкции во время выполнения доступны только в режиме Codex App Server.', 'ai.codex.steer.failed': 'Codex не принял дополнительную инструкцию. Черновик сохранён.', 'ai.codex.detecting': 'Обнаружение...', 'ai.codex.notFound': 'Не найден', 'ai.codex.awaitingLogin': 'Ожидание входа', 'ai.codex.connectedChatGPT': 'Подключено через ChatGPT', 'ai.codex.connectedApiKey': 'Подключено через API-ключ', 'ai.codex.connectedCustomConfig': 'Подключено через ~/.codex/config.toml', 'ai.codex.customConfigIncomplete': 'Обнаружен пользовательский конфиг (отсутствует переменная окружения)', 'ai.codex.customConfigHint': 'Используется пользовательский провайдер "{provider}", настроенный в ~/.codex/config.toml — вход через ChatGPT не требуется.', 'ai.codex.customConfigMissingEnvKey': 'Предупреждение: {envKey} не задана в переменных окружения вашей оболочки. Экспортируйте её (или запустите NetMesh из оболочки, где она задана), чтобы Codex мог пройти аутентификацию.', 'ai.codex.notConnected': 'Не подключено', 'ai.codex.statusUnknown': 'Статус неизвестен', 'ai.codex.path': 'Путь:', 'ai.codex.notFoundHint': 'Не удалось найти codex в PATH. Установите его или укажите путь к исполняемому файлу ниже.', 'ai.codex.customPathPlaceholder': 'например, /usr/local/bin/codex', 'ai.codex.check': 'Проверить', 'ai.codex.resetPath': 'Сбросить', 'ai.codex.openLogin': 'Открыть вход', 'ai.codex.logout': 'Выйти', 'ai.codex.connectChatGPT': 'Подключить ChatGPT', 'ai.codex.refreshStatus': 'Обновить статус', // AI Claude Code 'ai.claude.title': 'Claude Code', 'ai.claude.description': 'Агентный помощник для программирования от Anthropic. Требует установленный в системе Claude Code CLI.', 'ai.claude.detecting': 'Обнаружение...', 'ai.claude.detected': 'Обнаружен', 'ai.claude.notFound': 'Не найден', 'ai.claude.path': 'Путь:', 'ai.claude.notFoundHint': 'Не удалось найти claude в PATH. Установите его или укажите путь к исполняемому файлу ниже.', 'ai.claude.customPathPlaceholder': 'например, /usr/local/bin/claude', 'ai.claude.configSection': 'Аутентификация и конфигурация (опционально)', 'ai.claude.configDir': 'Каталог конфигурации', 'ai.claude.configDir.placeholder': '~/.claude (пусто — по умолчанию)', 'ai.claude.configDir.hint': 'Задаёт CLAUDE_CONFIG_DIR — укажите папку, где выполнен вход `claude` (содержит settings.json и учётные данные).', 'ai.claude.settings': 'Файл настроек', 'ai.claude.settings.placeholder': '~/team-settings.json (путь или встроенный {"model":"..."})', 'ai.claude.settings.hint': 'Опционально. Путь к settings.json или встроенный JSON, передаётся в SDK как `settings`. Дополняет «Каталог конфигурации» выше и независим от него (накладывается сверху, не заменяет).', 'ai.claude.envVars': 'Переменные окружения', 'ai.claude.envVars.placeholder': 'ANTHROPIC_BASE_URL=https://...\nANTHROPIC_MODEL=...', 'ai.claude.envVars.hint': 'По одному KEY=VALUE в строке, передаётся агенту Claude. Хранится локально в открытом виде — для API-ключей и учётных данных используйте «Каталог конфигурации» выше (вход `claude`).', 'ai.claude.check': 'Проверить', 'ai.claude.resetPath': 'Сбросить', // AI GitHub Copilot CLI 'ai.copilot.title': 'GitHub Copilot CLI', 'ai.copilot.description': 'Использует GitHub Copilot CLI. После обнаружения может быть выбран как внешний агент для программирования.', 'ai.copilot.detecting': 'Обнаружение...', 'ai.copilot.detected': 'Обнаружен', 'ai.copilot.notFound': 'Не найден', 'ai.copilot.path': 'Путь:', 'ai.copilot.notFoundHint': 'Не удалось найти copilot в PATH. Установите его или укажите путь к исполняемому файлу ниже.', 'ai.copilot.customPathPlaceholder': 'например, /usr/local/bin/copilot', 'ai.copilot.check': 'Проверить', 'ai.copilot.resetPath': 'Сбросить', // AI Cursor SDK 'ai.cursor.title': 'Cursor', 'ai.cursor.description': 'Использует Cursor SDK или локальный вход Agent CLI.', 'ai.cursor.detecting': 'Обнаружение...', 'ai.cursor.detected': 'Доступен', 'ai.cursor.notFound': 'Недоступен', 'ai.cursor.path': 'Среда:', 'ai.cursor.notFoundHint': 'Укажите API-ключ или переключитесь на CLI login.', 'ai.cursor.notInstalledHint': 'Cursor SDK / Agent CLI не обнаружен.', 'ai.cursor.installStatus': 'Среда Cursor', 'ai.cursor.installed': 'Обнаружено', 'ai.cursor.notInstalled': 'Не обнаружено', 'ai.cursor.modeCli': 'CLI login', 'ai.cursor.modeApiKey': 'API Key', 'ai.cursor.modeCliHint': 'Использует локальный `cursor-agent login` и квоту подписки Auto. Сохранённый API-ключ сохраняется, но в этом режиме не используется.', 'ai.cursor.modeApiKeyHint': 'Использует платный Cursor API. CLI login в этом режиме игнорируется.', 'ai.cursor.cliLoginStatus': 'CLI login', 'ai.cursor.cliLoginOk': 'Вход выполнен', 'ai.cursor.cliLoginAs': 'Вход как {{email}}', 'ai.cursor.cliLoginMissing': 'Нет входа', 'ai.cursor.cliLoginHint': 'Выполните `cursor-agent login` в терминале, затем нажмите Check.', 'ai.cursor.apiKeyStatus': 'API-ключ', 'ai.cursor.apiKeyConfigured': 'Настроен', 'ai.cursor.apiKeyMissing': 'Не указан', 'ai.cursor.apiKeyFromEnv': 'Из окружения', 'ai.cursor.apiKey': 'API-ключ', 'ai.cursor.apiKeyPlaceholder': 'Введите API-ключ Cursor', 'ai.cursor.apiKeyPlaceholder.env': 'Используется CURSOR_API_KEY; введите ключ для замены', 'ai.cursor.apiKeyEnvHint': 'Cursor может использовать CURSOR_API_KEY из shell. Сохраняйте ключ здесь только если хотите переопределить его в NetMesh.', 'ai.cursor.apiKeyOverrideHint': 'NetMesh сначала использует сохранённый здесь ключ, затем CURSOR_API_KEY.', 'ai.cursor.saveApiKey': 'Сохранить', 'ai.cursor.saved': 'Сохранено', 'ai.cursor.showApiKey': 'Показать API-ключ', 'ai.cursor.hideApiKey': 'Скрыть API-ключ', 'ai.cursor.customPathPlaceholder': 'например, /usr/local/bin/cursor', 'ai.cursor.check': 'Проверить', // AI CodeBuddy Code 'ai.codebuddy.title': 'CodeBuddy Code', 'ai.codebuddy.description': 'Использует CodeBuddy Code через официальный Agent SDK (`@tencent-ai/agent-sdk`). После обнаружения может быть выбран как внешний агент для программирования.', 'ai.codebuddy.detecting': 'Обнаружение...', 'ai.codebuddy.detected': 'Обнаружен', 'ai.codebuddy.notFound': 'Не найден', 'ai.codebuddy.path': 'Путь:', 'ai.codebuddy.notFoundHint': 'Не удалось найти codebuddy в PATH. Установите его или укажите путь к исполняемому файлу ниже.', 'ai.codebuddy.customPathPlaceholder': 'например, /usr/local/bin/codebuddy', 'ai.codebuddy.check': 'Проверить', 'ai.codebuddy.resetPath': 'Сбросить', 'ai.codebuddy.configSection': 'Аутентификация и конфигурация (необязательно)', 'ai.codebuddy.internetEnv': 'Сетевая среда', 'ai.codebuddy.internetEnv.default': 'По умолчанию (зарубежная)', 'ai.codebuddy.internetEnv.internal': 'Internal', 'ai.codebuddy.internetEnv.ioa': 'IOA', 'ai.codebuddy.internetEnv.hint': 'Устанавливает CODEBUDDY_INTERNET_ENVIRONMENT — выберите Internal или IOA для ограниченных сетевых сред.', 'ai.codebuddy.envVars': 'Переменные окружения', 'ai.codebuddy.envVars.placeholder': 'CODEBUDDY_API_KEY=...\nCODEBUDDY_AUTH_TOKEN=...\nOTHER_VAR=...', 'ai.codebuddy.envVars.hint': 'По одной записи KEY=VALUE на строку, передаются агенту CodeBuddy. Укажите CODEBUDDY_API_KEY или CODEBUDDY_AUTH_TOKEN для аутентификации. Хранятся локально в открытом виде.', 'ai.codebuddy.elicitation.title': 'CodeBuddy требуется ваш ответ', 'ai.codebuddy.elicitation.description': 'Проверьте запрос, чтобы продолжить текущий ход.', 'ai.codebuddy.elicitation.select': 'Выберите вариант', 'ai.codebuddy.elicitation.yes': 'Да', 'ai.codebuddy.elicitation.no': 'Нет', 'ai.codebuddy.elicitation.decline': 'Отклонить', 'ai.codebuddy.elicitation.accept': 'Продолжить', 'ai.codebuddy.elicitation.validation.required': 'Поле «{field}» обязательно.', 'ai.codebuddy.elicitation.validation.invalidType': 'Поле «{field}» содержит недопустимое значение.', 'ai.codebuddy.elicitation.validation.integer': 'Поле «{field}» должно быть целым числом.', 'ai.codebuddy.elicitation.validation.notInteger': 'Поле «{field}» должно быть целым числом.', 'ai.codebuddy.elicitation.validation.minimum': 'Значение «{field}» должно быть не меньше {limit}.', 'ai.codebuddy.elicitation.validation.maximum': 'Значение «{field}» должно быть не больше {limit}.', 'ai.codebuddy.elicitation.validation.minLength': 'Поле «{field}» должно содержать не менее {limit} символов.', 'ai.codebuddy.elicitation.validation.maxLength': 'Поле «{field}» должно содержать не более {limit} символов.', 'ai.codebuddy.elicitation.validation.minItems': 'Выберите не менее {limit} вариантов для «{field}».', 'ai.codebuddy.elicitation.validation.maxItems': 'Выберите не более {limit} вариантов для «{field}».', 'ai.codebuddy.elicitation.validation.format': 'Поле «{field}» должно соответствовать формату {format}.', 'ai.codebuddy.elicitation.validation.option': 'Выберите допустимый вариант для «{field}».', // AI Grok Build (in-app managed agent — distinct from External MCP client install) 'ai.grok.title': 'Grok Build', 'ai.grok.description': 'Агент программирования Grok Build от xAI (CLI). Установите Grok CLI, выполните `grok login` или задайте XAI_API_KEY, затем выберите его как внешнего агента.', 'ai.grok.detecting': 'Обнаружение...', 'ai.grok.detected': 'Обнаружен', 'ai.grok.notFound': 'Не найден', 'ai.grok.path': 'Путь:', 'ai.grok.notFoundHint': 'Не удалось найти grok в PATH. Установите Grok Build CLI или укажите путь к исполняемому файлу ниже.', 'ai.grok.customPathPlaceholder': 'например, /usr/local/bin/grok', 'ai.grok.check': 'Проверить', 'ai.grok.resetPath': 'Сбросить', 'ai.grok.runtime.acp.title': 'Использовать Grok ACP (agent stdio)', 'ai.grok.runtime.acp.default': 'По умолчанию', 'ai.grok.runtime.acp.description': 'Подключение к Grok через Agent Client Protocol (grok agent stdio). NetMesh MCP внедряется в session/new. Выключите, чтобы использовать исходный headless streaming-json CLI.', 'ai.grok.runtime.streamingJson.hint': 'Режим headless streaming-json (grok -p --output-format streaming-json). MCP внедряется через .grok/config.toml проекта.', // AI Default Agent 'ai.defaultAgent': 'Агент по умолчанию', 'ai.defaultAgent.description': 'Агент, который будет использоваться при запуске новой AI-сессии', 'ai.defaultAgent.catty': 'Catty (встроенный)', 'ai.toolAccess.title': 'Доступ к инструментам', 'ai.toolAccess.mode': 'Режим доступа NetMesh', 'ai.toolAccess.description': 'Выберите, как внешние агенты получают доступ к сессиям NetMesh. MCP предоставляет встроенный сервер, а Skills + CLI указывает агентам на локальный skill NetMesh и команды CLI.', 'ai.toolAccess.mode.mcp': 'MCP', 'ai.toolAccess.mode.skills': 'Skills + CLI', 'ai.toolAccess.mcpPrompt.title': 'Промпт для вашего ИИ-клиента', 'ai.toolAccess.mcpPrompt.description': 'Вставьте этот промпт в ИИ-клиент (Codex, Claude Code и т. д.), и он сам зарегистрирует MCP NetMesh.', 'ai.toolAccess.mcpPrompt.enableHint': 'Включите внешний MCP ниже, чтобы в промпт попал путь к лаунчеру.', 'ai.toolAccess.skills.file': 'Файл skill', 'ai.toolAccess.skills.description': 'В режиме Skills + CLI агенты автоматически получают путь к этому локальному skill-файлу. Путь к лаунчеру NetMesh CLI передаётся агенту в каждой сессии.', 'ai.toolAccess.skills.unavailable': 'Путь к skill-файлу недоступен', 'ai.externalMcp.title': 'Внешний MCP', 'ai.externalMcp.description': 'Откройте NetMesh как MCP-сервер для Codex, Claude Code, Cursor и Grok. Набор инструментов тот же, что у встроенных агентов. Держите NetMesh запущенным, пока клиенты подключены.', 'ai.externalMcp.sessionsExposed': 'Сессий в области: {count}', 'ai.externalMcp.mode': 'Режим доступности', 'ai.externalMcp.mode.temporary': 'Временный', 'ai.externalMcp.mode.persistent': 'Постоянный', 'ai.externalMcp.mode.description': 'Временный режим отключается после простоя. Постоянный восстанавливает External MCP при запуске NetMesh.', 'ai.externalMcp.idleTimeout': 'Таймаут простоя', 'ai.externalMcp.idleTimeout.description': 'В временном режиме отключить External MCP после указанного числа минут без MCP-операций.', 'ai.externalMcp.idleTimeout.minutes': 'мин', 'ai.externalMcp.focusOnHostOpen': 'Активировать окно при host_open', 'ai.externalMcp.focusOnHostOpen.description': 'Когда MCP-клиент открывает хост, выводить главное окно на передний план. Отключите, чтобы работать без прерываний.', 'ai.externalMcp.silentSessions': 'Бесшумные сеансы MCP', 'ai.externalMcp.silentSessions.description': 'Сеансы, открытые ИИ, не отображаются на панели вкладок и не восстанавливаются после перезапуска. Их можно посмотреть в любой момент через панель в трее.', 'ai.externalMcp.sessionIdleTimeout': 'Тайм-аут открытого сеанса', 'ai.externalMcp.sessionIdleTimeout.description': 'Автоматически закрывать сеансы, открытые ИИ, после указанного числа минут без операций терминала или файлов.', 'ai.externalMcp.usage.title': 'Как пользоваться', 'ai.externalMcp.usage.keepRunning': '1. Включите External MCP и держите NetMesh запущенным.', 'ai.externalMcp.usage.localhost': '2. Клиенты подключаются через локальный launcher (только 127.0.0.1). Discovery удаляется при отключении.', 'ai.externalMcp.usage.permissions': '3. Запись следует Settings → AI → Safety и списку блокировки команд.', 'ai.externalMcp.usage.capabilities': '4. Доступен полный catalog: терминал, SFTP, Vault и проброс портов. Секреты не возвращаются.', 'ai.externalMcp.help.ariaLabel': 'Справка External MCP', 'ai.externalMcp.security': 'Безопасность', 'ai.externalMcp.security.description': 'Слушает только 127.0.0.1 с ротацией token, использует AI Permission Mode для записи и удаляет discovery при отключении.', 'ai.externalMcp.permissionMode': 'Текущий режим разрешений: {mode}', 'ai.externalMcp.permissionMode.label': 'Режим разрешений на запись', 'ai.externalMcp.permissionMode.hint': 'Тот же параметр, что Settings → AI → Safety. Auto выполняет write-инструменты NetMesh без запросов; Confirm спрашивает каждый раз. Внешние клиенты (Codex / Claude / Grok) могут показывать своё подтверждение инструментов.', 'ai.externalMcp.permissionMode.unknown': 'Неизвестно', 'ai.externalMcp.discovery': 'Discovery', 'ai.externalMcp.launcher': 'Launcher', 'ai.externalMcp.unavailable': 'Недоступно', 'ai.externalMcp.bridgeUnavailable': 'Мост External MCP недоступен', 'ai.externalMcp.copy': 'Копировать', 'ai.externalMcp.copied': 'Скопировано', 'ai.externalMcp.copyFailed': 'Не удалось скопировать. Скопируйте вручную.', 'ai.externalMcp.refresh': 'Обновить', 'ai.externalMcp.clientConfiguration': 'Настройка клиента', 'ai.externalMcp.clientConfiguration.description': 'Выберите клиент для установки в один клик или скопируйте CLI / фрагмент конфига.', 'ai.externalMcp.client.codex': 'Codex', 'ai.externalMcp.client.claude': 'Claude Code', 'ai.externalMcp.client.grok': 'Grok', 'ai.externalMcp.client.cursor': 'Cursor', 'ai.externalMcp.cliCommand': 'CLI-команда', 'ai.externalMcp.configSnippet': 'Фрагмент конфига', 'ai.externalMcp.addToCodex': 'Добавить в Codex', 'ai.externalMcp.addToClaude': 'Добавить в Claude Code', 'ai.externalMcp.addToGrok': 'Добавить в Grok', 'ai.externalMcp.codexAdded': 'Запись MCP для Codex добавлена. Перезапустите Codex или откройте новую сессию.', 'ai.externalMcp.claudeAdded': 'Запись MCP для Claude Code добавлена. Перезапустите Claude Code или откройте новую сессию.', 'ai.externalMcp.grokAdded': 'Запись MCP для Grok добавлена. Перезапустите Grok или откройте новую сессию.', 'ai.externalMcp.installCodex': 'Сначала установите Codex, затем нажмите Обновить.', 'ai.externalMcp.installClaude': 'Сначала установите Claude Code, затем нажмите Обновить.', 'ai.externalMcp.installGrok': 'Сначала установите Grok CLI, затем нажмите Обновить.', 'ai.externalMcp.conflict.description': 'Запись NetMesh-external уже существует и указывает в другое место. Удалите или измените её вручную.', 'ai.externalMcp.enableForLauncher': 'Включите External MCP, чтобы получить путь launcher.', 'ai.externalMcp.cursor.title': 'Cursor / другие клиенты', 'ai.externalMcp.cursor.description': 'Объедините с MCP-конфигом (например ~/.cursor/mcp.json). Не заменяйте весь файл, если там уже есть другие серверы.', 'ai.externalMcp.status.unavailable': 'Недоступно', 'ai.externalMcp.status.disabled': 'Выключено', 'ai.externalMcp.status.running': 'Работает', 'ai.externalMcp.status.starting': 'Запуск', 'ai.externalMcp.status.error': 'Ошибка', 'ai.externalMcp.status.configured': 'Настроено', 'ai.externalMcp.status.notConfigured': 'Не настроено', 'ai.externalMcp.status.checking': 'Проверка', 'ai.externalMcp.status.codexNotFound': 'Codex не найден', 'ai.externalMcp.status.claudeNotFound': 'Claude Code не найден', 'ai.externalMcp.status.grokNotFound': 'Grok не найден', 'ai.externalMcp.status.conflict': 'Конфликт', 'ai.userSkills.title': 'Пользовательские skills', 'ai.userSkills.description': 'Откройте папку skills NetMesh, чтобы добавить свои каталоги skills. NetMesh автоматически сканирует их и добавляет только лёгкие индексы, если skill явно не соответствует текущему запросу.', 'ai.userSkills.openFolder': 'Открыть папку skills', 'ai.userSkills.reload': 'Перезагрузить skills', 'ai.userSkills.location': 'Расположение', 'ai.userSkills.loading': 'Сканирование пользовательских skills...', 'ai.userSkills.summary': '{ready} готово, {warnings} предупреждений', 'ai.userSkills.empty': 'Пользовательские skills пока не найдены. Откройте папку, чтобы добавить каталоги skills с файлом SKILL.md.', 'ai.userSkills.unavailable': 'Пользовательские skills недоступны в этой среде.', 'ai.userSkills.status.ready': 'Готово', 'ai.userSkills.status.warning': 'Предупреждение', // AI Quick Messages 'ai.quickMessages.title': 'Быстрые сообщения', 'ai.quickMessages.description': 'Создавайте часто используемые подсказки и вставляйте их в AI-чат через / или кнопку быстрых сообщений. В отличие от user skills, быстрые сообщения заполняют поле ввода текстом.', 'ai.quickMessages.add': 'Добавить быстрое сообщение', 'ai.quickMessages.createTitle': 'Новое быстрое сообщение', 'ai.quickMessages.editTitle': 'Редактировать быстрое сообщение', 'ai.quickMessages.name': 'Название', 'ai.quickMessages.name.placeholder': 'например: Проверить диск', 'ai.quickMessages.slug': 'Команда', 'ai.quickMessages.slug.placeholder': 'disk-check', 'ai.quickMessages.descriptionField': 'Описание (необязательно)', 'ai.quickMessages.descriptionField.placeholder': 'Краткая подсказка о назначении', 'ai.quickMessages.content': 'Текст сообщения', 'ai.quickMessages.content.placeholder': 'Полный текст подсказки для вставки...', 'ai.quickMessages.empty': 'Быстрых сообщений пока нет. Добавьте несколько часто используемых подсказок.', 'ai.quickMessages.confirmDelete': 'Удалить быстрое сообщение «{name}»?', 'ai.quickMessages.error.nameRequired': 'Укажите название.', 'ai.quickMessages.error.invalidSlug': 'Команда может содержать только строчные буквы, цифры и дефисы.', 'ai.quickMessages.error.contentRequired': 'Укажите текст сообщения.', 'ai.quickMessages.error.slugTaken': 'Эта команда уже используется другим быстрым сообщением.', 'ai.quickMessages.error.slugConflictsWithSkill': 'Команда конфликтует с user skill «/{slug}». Выберите другую.', 'ai.quickMessages.error.maxItems': 'Можно сохранить не более {max} быстрых сообщений.', // AI Chat 'ai.chat.noProvider': 'AI-провайдер не настроен. Перейдите в **Настройки → AI → Провайдеры**, чтобы добавить и включить провайдера.', 'ai.chat.toolDenied': 'Действие было отклонено пользователем.', 'ai.chat.toolApproved': 'Одобрено', 'ai.chat.toolApprovalHint': 'Enter — разрешить один раз, Escape — отклонить', 'ai.chat.approve': 'Одобрить', 'ai.chat.approveOnce': 'Разрешить один раз', 'ai.chat.alwaysAllow': 'Всегда разрешать', 'ai.chat.slashStopDesc': 'Остановить текущий ход AI и отменить выполняющиеся инструменты', 'ai.chat.slashCompactDesc': 'Сжать ранний контекст разговора', 'ai.chat.reject': 'Отклонить', 'ai.chat.toolLabel': 'Инструмент', 'ai.chat.targetLabel': 'Цель', 'ai.chat.rawCommand': 'Команда', 'ai.chat.copyCommand': 'Копировать', 'ai.chat.commandCopied': 'Скопировано', 'ai.chat.approvalSession': 'Сессия', 'ai.chat.approvalShell': 'Shell', 'ai.chat.approvalCwd': 'Каталог', 'ai.chat.approvalReason': 'Причина', 'ai.chat.approvalInvocation': 'Вызов', 'ai.chat.permissionRequired': 'Требуется разрешение', 'ai.chat.permissionDescription': 'AI-агент хочет выполнить вызов инструмента, для которого требуется ваше одобрение.', 'ai.chat.commandBlocked': 'Эта команда заблокирована вашей политикой безопасности и не может быть выполнена.', 'ai.chat.recommendAllow': 'Разрешить', 'ai.chat.recommendConfirm': 'Подтвердить', 'ai.chat.recommendDeny': 'Запретить', 'ai.chat.exportConversation': 'Экспортировать разговор', 'ai.chat.exportAs': 'Экспортировать как', 'ai.chat.exportMarkdown': 'Markdown', 'ai.chat.exportJSON': 'JSON', 'ai.chat.exportPlainText': 'Обычный текст', 'ai.chat.thinking': 'Размышляет', 'ai.chat.thoughtFor': 'Размышлял {duration}', 'ai.chat.thought': 'Мысль', 'ai.chat.agents': 'Агенты', 'ai.chat.detectedOnMachine': 'Обнаружено на этом устройстве', 'ai.chat.rescan': 'Пересканировать', 'ai.chat.permObserver': 'Наблюдатель', 'ai.chat.permConfirm': 'Подтверждение', 'ai.chat.permAuto': 'Авто', 'ai.chat.permObserverDesc': 'Только чтение', 'ai.chat.permConfirmDesc': 'Спрашивать перед записью', 'ai.chat.permAutoDesc': 'Выполнять свободно', 'ai.chat.emptyHint': 'Спрашивайте о ваших серверах, запускайте команды или получайте помощь с конфигурациями.', 'ai.chat.placeholder': 'Сообщение {agent} — @ для добавления контекста, / для команд', 'ai.chat.placeholderDefault': 'Сообщение агенту Catty...', 'ai.chat.noModel': 'Нет модели', 'ai.chat.noProviderModel': 'Модель по умолчанию не задана — настройте её в Настройки → AI → Провайдеры.', 'ai.chat.selectProvider': 'Выберите провайдера', 'ai.chat.selectProviderAndModel': 'Выберите провайдера и модель', 'ai.chat.selectModel': 'Выберите модель', 'ai.chat.searchModels': 'Поиск моделей', 'ai.chat.providers': 'Провайдеры', 'ai.chat.models': 'Модели', 'ai.chat.pinned': 'Закреплённые', 'ai.chat.useCustomModel': 'Использовать «{id}»', 'ai.chat.thinkingLevel': 'Мышление', 'ai.chat.thinkingOff': 'Выкл.', 'ai.chat.pinModel': 'Закрепить модель', 'ai.chat.unpinModel': 'Открепить модель', 'ai.chat.loadingModels': 'Загрузка моделей...', 'ai.chat.noMatchingModels': 'Нет подходящих моделей', 'ai.chat.recent': 'Недавние', 'ai.chat.viewAll': 'Показать всё', 'ai.chat.untitled': 'Без названия', 'ai.chat.justNow': 'Только что', 'ai.chat.minutesAgo': '{n}м назад', 'ai.chat.hoursAgo': '{n}ч назад', 'ai.chat.daysAgo': '{n}д назад', 'ai.chat.newChat': 'Новый чат', 'ai.chat.allSessions': 'Все сессии', 'ai.chat.loadEarlierMessages': 'Загрузить более ранние сообщения (ещё {n})', 'ai.chat.jumpNav': 'Перейти к сообщению', 'ai.chat.jumpUntitled': '(пустое сообщение)', 'ai.chat.usedTools': 'Использовано инструментов: {n}', 'ai.chat.loadMoreSessions': 'Загрузить больше сессий (ещё {n})', 'ai.chat.noSessions': 'Предыдущих сессий нет', 'ai.chat.retryHint': 'Вы можете повторить попытку, отправив сообщение ещё раз.', 'ai.chat.approvalTimeout': 'Время ожидания одобрения инструмента истекло через 5 минут. Вы можете повторить попытку, отправив сообщение ещё раз.', 'ai.chat.menuHosts': 'Хосты', 'ai.chat.menuContext': 'Контекст', 'ai.chat.menuFiles': 'Файлы', 'ai.chat.menuImage': 'Изображение', 'ai.chat.menuMentionHost': 'Упомянуть хост', 'ai.chat.menuMentionNote': 'Упомянуть заметку', 'ai.chat.mentionNoteSearch': 'Поиск заметок…', 'ai.chat.mentionNoteEmpty': 'Нет подходящих заметок', 'ai.chat.mentionNoteUnavailable': 'Этот агент не может читать заметки хранилища в текущем режиме подключения.', 'ai.chat.mentionNoteTooMany': 'Невозможно сослаться на все эти заметки одновременно. Выберите меньше заметок.', 'ai.chat.mentionNoteInvalid': '«{{title}}» не удалось прикрепить: у заметки недопустимый идентификатор.', 'ai.chat.untitledNote': 'Заметка без названия', 'ai.chat.menuUserSkills': 'Пользовательские навыки', 'ai.chat.menuSlashCommands': 'Команды /', 'ai.chat.slashCommands': 'Команды /', 'ai.chat.slashSystemCommands': 'Системные команды', 'ai.chat.slashQuickMessages': 'Быстрые сообщения', 'ai.chat.slashUserSkills': 'Пользовательские навыки', 'ai.chat.quickMessages': 'Команды /', 'ai.chat.slashNoResults': 'Нет подходящих команд', 'ai.chat.slashEmptyHint': 'Добавьте подсказки в Настройки → AI → Быстрые сообщения.', // AI Chat Shortcuts 'ai.chatShortcuts.title': 'Быстрые действия чата', 'ai.chatShortcuts.selectionAction': 'Показывать «Добавить в чат» при выделении в терминале', 'ai.chatShortcuts.selectionAction.description': 'Показывать небольшую кнопку AI рядом с выделенным текстом терминала.', // AI Error 'ai.codex.bridgeError': 'Обработчики главного процесса Codex ещё не загружены. Полностью перезапустите NetMesh или dev-процесс Electron и попробуйте снова.', // AI Web Search 'ai.webSearch.title': 'Веб-поиск', 'ai.webSearch.enable': 'Включить веб-поиск', 'ai.webSearch.enable.description': 'Разрешить AI-агенту искать в интернете актуальную информацию.', 'ai.webSearch.provider': 'Провайдер поиска', 'ai.webSearch.provider.description': 'Выберите провайдера API веб-поиска.', 'ai.webSearch.apiKey': 'API-ключ', 'ai.webSearch.apiKey.description': 'API-ключ для выбранного провайдера поиска.', 'ai.webSearch.apiKey.placeholder': 'Введите API-ключ...', 'ai.webSearch.apiHost': 'Адрес API', 'ai.webSearch.apiHost.description': 'Пользовательская конечная точка API. Оставьте значение по умолчанию, если не используете прокси.', 'ai.webSearch.apiHost.searxngDescription': 'URL вашего экземпляра SearXNG (обязательно).', 'ai.webSearch.maxResults': 'Макс. число результатов', 'ai.webSearch.maxResults.description': 'Максимальное количество результатов поиска для возврата (1-20).', // AI Safety Settings 'ai.safety.title': 'Безопасность', 'ai.safety.permissionMode': 'Режим разрешений', 'ai.safety.permissionMode.description': 'Управляет тем, как AI взаимодействует с вашими терминалами. Режим наблюдателя блокирует все операции записи через NetMesh и применяется как к встроенным, так и к внешним агентам. Режим подтверждения носит рекомендательный характер для внешних агентов (они управляют собственным потоком одобрения инструментов).', 'ai.safety.permissionMode.observer': 'Наблюдатель — только чтение, без действий', 'ai.safety.permissionMode.confirm': 'Подтверждение — спрашивать перед действиями', 'ai.safety.permissionMode.auto': 'Авто — выполнять свободно', 'ai.safety.commandTimeout': 'Тайм-аут команды', 'ai.safety.commandTimeout.description': 'Максимальное число секунд, которое команда может выполняться до принудительного завершения. Применяется как к встроенным, так и к внешним агентам.', 'ai.safety.commandTimeout.unit': 'с', 'ai.safety.responseIdleTimeout': 'Ожидание ответа встроенного ИИ', 'ai.safety.responseIdleTimeout.description': 'Отменяет запрос встроенного ИИ после указанного числа секунд без нового ответа. Не управляет общей длительностью ответа и выполнением команд.', 'ai.safety.responseIdleTimeout.unit': 'с', 'ai.safety.maxIterations': 'Макс. число итераций', 'ai.safety.maxIterations.description': 'Максимальное число циклов использования инструментов AI, чтобы предотвратить бесконтрольное выполнение. У внешних агентов могут быть собственные внутренние лимиты итераций, имеющие приоритет.', 'ai.safety.blocklist': 'Чёрный список команд', 'ai.safety.blocklist.description': 'Regex-шаблоны для блокировки опасных команд. Применяется как к встроенным, так и к внешним агентам через механизм выполнения NetMesh.', 'ai.safety.blocklist.placeholder': 'Regex-шаблон...', 'ai.safety.blocklist.reset': 'Сбросить по умолчанию', 'ai.safety.blocklist.add': 'Добавить шаблон', 'ai.safety.grants.title': 'Память разрешений', 'ai.safety.grants.heading': 'Правила для режима подтверждения', 'ai.safety.grants.description': 'В режиме подтверждения действие сначала требует подтверждения. Сохранённые правила автоматически разрешают похожие действия во всех терминальных сессиях, их можно редактировать вручную.', 'ai.safety.grants.empty': 'Правил пока нет. Выберите «Всегда разрешать» при одобрении или добавьте вручную.', 'ai.safety.grants.capability': 'Идентификатор возможности', 'ai.safety.grants.sessionPattern': 'Шаблон сессии', 'ai.safety.grants.commandPattern': 'Шаблон команды (необяз.)', 'ai.safety.grants.note': 'Заметка (необяз.)', 'ai.safety.grants.add': 'Добавить правило', 'ai.safety.grants.remove': 'Удалить', 'ai.safety.grants.export': 'Экспорт JSON', 'ai.safety.grants.import': 'Импорт JSON', 'ai.safety.note': 'Эти настройки безопасности применяются к действиям, выполняемым через NetMesh. Внешние CLI-агенты могут иметь собственные локальные инструменты и собственные правила управления ими.', // Unified tooltips for terminal workspace and top tabs (issue #954) 'terminal.layer.addTerminal': 'Добавить терминал', 'terminal.layer.switchToSplitView': 'Переключить в режим разделения', 'terminal.layer.sftp': 'SFTP', 'terminal.layer.scripts': 'Скрипты', 'terminal.layer.history': 'История', 'terminal.layer.theme': 'Тема', 'terminal.layer.notes': 'Заметки', 'terminal.layer.aiChat': 'AI-чат', 'terminal.layer.movePanelLeft': 'Переместить панель влево', 'terminal.layer.movePanelRight': 'Переместить панель вправо', 'terminal.layer.closePanel': 'Закрыть панель', 'terminal.layer.closePane': 'Закрыть область', 'terminal.layer.resizeSplit': 'Изменить размер области', 'terminal.layer.splitHorizontal': 'Разделить сверху и снизу', 'terminal.layer.splitVertical': 'Разделить слева и справа', 'terminal.layer.openInNewSplit': 'Открыть в новой области', 'terminal.layer.hostTree.search': 'Поиск хостов...', 'terminal.layer.hostTree.searchButton': 'Поиск', 'terminal.layer.hostTree.tagsButton': 'Фильтр по тегам', 'terminal.layer.hostTree.newHost': 'Новый хост', 'terminal.layer.hostTree.newHostInGroup': 'Новый хост в этой группе', 'terminal.layer.hostTree.editHost': 'Изменить хост', 'terminal.layer.hostTree.hostSavedNextConnection': 'Хост обновлён. Параметры подключения вступят в силу при следующем подключении.', 'terminal.layer.hostTree.newGroup': 'Новая группа', 'terminal.layer.hostTree.localShell': 'Локальная оболочка', 'terminal.layer.hostTree.tagsEmpty': 'Нет доступных тегов', 'terminal.layer.hostTree.clearTags': 'Сбросить выбор', 'terminal.layer.hostTree.collapse': 'Свернуть список хостов', 'terminal.layer.hostTree.expand': 'Развернуть список хостов', 'terminal.layer.hostTree.empty': 'Хосты не найдены', 'topTabs.openQuickSwitcher': 'Открыть быстрый переключатель', 'topTabs.moreTabs': 'Больше вкладок', 'topTabs.aiAssistant': 'AI-помощник', 'topTabs.newLocalTerminal': 'Новый локальный терминал', 'topTabs.controlPanel': 'Быстрые настройки', 'topTabs.controlPanel.externalMcp': 'Внешний MCP', 'topTabs.controlPanel.theme': 'Тема', 'topTabs.controlPanel.theme.light': 'Светлая', 'topTabs.controlPanel.theme.dark': 'Тёмная', 'topTabs.controlPanel.theme.system': 'Системная', 'topTabs.externalMcp.enable': 'Включить внешний MCP', 'topTabs.externalMcp.disable': 'Отключить внешний MCP', 'topTabs.windowOpacity': 'Прозрачность окна', 'topTabs.openSettings': 'Открыть настройки', 'ai.chat.sessionHistory': 'История сессий', 'ai.chat.resizeInput': 'Перетащите, чтобы изменить высоту поля ввода', 'ai.chat.attach': 'Прикрепить', 'ai.chat.terminalSelectionAttachment': 'Выделение терминала', 'ai.chat.terminalSelectionLines': 'строк: {count}', 'ai.chat.collapse': 'Свернуть', 'ai.chat.expand': 'Развернуть', 'ai.chat.enableAgent': 'Включить {name}', 'ai.chat.artifact.noteFallback': 'Заметка Vault', 'ai.chat.artifact.openNotes': 'Открыть заметки', 'ai.chat.artifact.openHosts': 'Открыть хосты', 'ai.chat.artifact.notesSummary': '{count} заметок в Vault', 'ai.chat.artifact.hostsSummary': '{count} хостов в Vault', 'ai.chat.artifact.hostsAdded': 'Добавлено хостов: {count}', 'ai.chat.artifact.hostsPreview': 'Предпросмотр хостов: {count}', 'ai.chat.artifact.failed': 'Операция Vault не удалась', 'ai.chat.artifact.unavailableTitle': 'Недоступно', 'ai.chat.artifact.noteMissing': 'Эта заметка больше не в Vault.', 'ai.chat.artifact.hostMissing': 'Этот хост больше не в Vault.', 'ai.chat.artifact.snippetMissing': 'Этот сниппет или скрипт больше не находится в Vault.', 'ai.chat.artifact.openSnippets': 'Открыть сниппеты', 'ai.chat.artifact.snippetsSummary': 'Сниппетов в Vault: {count}', 'ai.chat.artifact.scriptsSummary': 'Скриптов в Vault: {count}', 'ai.chat.artifact.snippetFallback': 'Сниппет Vault', 'ai.chat.artifact.scriptFallback': 'Сценарий автоматизации', 'ai.chat.artifact.scriptLanguage': 'Скрипт: {language}', 'ai.chat.artifact.snippetDeleted': 'Сниппет удалён', 'ai.chat.artifact.scriptDeleted': 'Скрипт удалён', 'ai.chat.artifact.snippetRan': 'Сниппет выполнен', 'ai.chat.artifact.scriptStarted': 'Запуск скрипта начат', 'ai.chat.artifact.scriptRunStatus': 'Запуск скрипта: {status}', 'ai.chat.artifact.scriptRunsSummary': 'Запусков скриптов: {count}', 'ai.chat.artifact.scriptRunStopped': 'Запуск скрипта остановлен', 'ai.chat.artifact.scriptRunPaused': 'Запуск скрипта приостановлен', 'ai.chat.artifact.scriptRunResumed': 'Запуск скрипта возобновлён', 'ai.chat.artifact.scriptReference': 'Справка nct API', 'zmodem.waitingForRemote': 'Ожидание удалённой стороны...', 'zmodem.uploading': 'Загрузка', 'zmodem.downloading': 'Скачивание', 'zmodem.cancelTransfer': 'Отменить передачу (Ctrl+C)', 'zmodem.overwrite.title': 'Удалённый файл уже существует', 'zmodem.overwrite.applyToRest': 'Применить к остальным конфликтам', 'zmodem.overwrite.overwrite': 'Перезаписать', 'zmodem.overwrite.skip': 'Пропустить', 'zmodem.overwrite.cancel': 'Отмена', 'settings.shortcuts.resetToDefault': 'Сбросить по умолчанию', };