diff --git a/README.md b/README.md index 73eb8eafc..0bbe3325c 100644 --- a/README.md +++ b/README.md @@ -230,7 +230,17 @@ First contribution checklist: Translated READMEs: [`translated_readmes/`](./translated_readmes/README.md), available in English, 简体中文, 繁體中文, 日本語. -The App is available in the following languages: English (`en`), Japanese (`ja`), Simplified Chinese (`zh`), Vietnamese (`vi`), Brazilian Portuguese (`pt-BR`). +The App is available in the following languages: +- English (`en`) +- French (`fr`) +- Spanish (`es`) +- Catalan (`ca`) +- Brazilian Portuguese (`pt-BR`) +- Japanese (`ja`) +- Simplified Chinese (`zh`) +- Thai (`th`) +- Vietnamese (`vi`) +- Russian (`ru`) ## For Teams & Businesses diff --git a/TRANSLATIONS.md b/TRANSLATIONS.md index 92c0a41aa..c65a0abdd 100644 --- a/TRANSLATIONS.md +++ b/TRANSLATIONS.md @@ -18,10 +18,10 @@ If you want to add a new README language: You can also help translate the app UI via: -- `packages/app/src/i18n/` +- `apps/app/src/i18n/` -Currently available app UI locales: English (`en`), Japanese (`ja`), Simplified Chinese (`zh`), Vietnamese (`vi`), Brazilian Portuguese (`pt-BR`). +Currently available app UI locales: English (`en`), Japanese (`ja`), Simplified Chinese (`zh`), Vietnamese (`vi`), Brazilian Portuguese (`pt-BR`), Russian (`ru`). -Locale files live in `packages/app/src/i18n/locales/`. +Locale files live in `apps/app/src/i18n/locales/`. If you are unsure where to start, open an issue and mention the language you want to contribute. diff --git a/apps/app/src/i18n/index.ts b/apps/app/src/i18n/index.ts index c4dcd374e..040d0c2b8 100644 --- a/apps/app/src/i18n/index.ts +++ b/apps/app/src/i18n/index.ts @@ -7,34 +7,51 @@ import th from "./locales/th"; import fr from "./locales/fr"; import ca from "./locales/ca"; import es from "./locales/es"; +import ru from "./locales/ru"; import { LANGUAGE_PREF_KEY } from "../app/constants"; /** * Supported languages */ -export type Language = "en" | "ja" | "zh" | "vi" | "pt-BR" | "th" | "fr" | "ca" | "es"; +export type Language = "en" | "ja" | "zh" | "vi" | "pt-BR" | "th" | "fr" | "ca" | "es" | "ru"; export type Locale = Language; /** * All supported languages - single source of truth */ -export const LANGUAGES: Language[] = ["en", "ja", "zh", "vi", "pt-BR", "th", "fr", "ca", "es"]; +export const LANGUAGES: Language[] = ["en", "ja", "zh", "vi", "pt-BR", "th", "fr", "ca", "es", "ru"]; /** * Language options for UI - single source of truth */ export const LANGUAGE_OPTIONS = [ { value: "en" as Language, label: "English", nativeName: "English" }, - { value: "ja" as Language, label: "日本語", nativeName: "日本語" }, - { value: "zh" as Language, label: "简体中文", nativeName: "简体中文" }, + { value: "ja" as Language, label: "Japanese", nativeName: "日本語" }, + { value: "zh" as Language, label: "Chinese (Simplified)", nativeName: "简体中文" }, { value: "vi" as Language, label: "Vietnamese", nativeName: "Tiếng Việt" }, { value: "pt-BR" as Language, label: "Portuguese (BR)", nativeName: "Português (BR)" }, - { value: "th" as Language, label: "ไทย", nativeName: "ไทย" }, + { value: "th" as Language, label: "Thai", nativeName: "ไทย" }, { value: "fr" as Language, label: "French", nativeName: "Français" }, - { value: "ca" as Language, label: "Català", nativeName: "Català" }, - { value: "es" as Language, label: "Español", nativeName: "Español" }, + { value: "ca" as Language, label: "Catalan", nativeName: "Català" }, + { value: "es" as Language, label: "Spanish", nativeName: "Español" }, + { value: "ru" as Language, label: "Russian", nativeName: "Русский" }, ] as const; +const PLURAL_SUFFIX_EMPTY_LANGUAGES = new Set(["ja", "zh", "th"]); + +/** + * Current translation strings use an English-style plural suffix placeholder. + * Some locales render the noun without a visible plural marker, so we keep + * that suffix empty for them. + */ +export const pluralSuffix = (locale: Language, count: number): string => { + if (PLURAL_SUFFIX_EMPTY_LANGUAGES.has(locale)) { + return ""; + } + + return count === 1 ? "" : "s"; +}; + /** * Translation maps */ @@ -48,6 +65,7 @@ const TRANSLATIONS: Record> = { fr, ca, es, + ru, }; /** diff --git a/apps/app/src/i18n/locales/index.ts b/apps/app/src/i18n/locales/index.ts index 764fbb91d..667f05de7 100644 --- a/apps/app/src/i18n/locales/index.ts +++ b/apps/app/src/i18n/locales/index.ts @@ -9,3 +9,4 @@ export { default as ptBR } from "./pt-BR"; export { default as fr } from "./fr"; export { default as ca } from "./ca"; export { default as es } from "./es"; +export { default as ru } from "./ru"; diff --git a/apps/app/src/i18n/locales/ru.ts b/apps/app/src/i18n/locales/ru.ts new file mode 100644 index 000000000..97009b4ed --- /dev/null +++ b/apps/app/src/i18n/locales/ru.ts @@ -0,0 +1,2107 @@ +/** + * Russian translations + * Product terms like OpenWork, OpenCode, OpenPackage, Skills, Plugins, Commands, Sessions, and MCP stay as project terminology where needed. + */ + +export default { + "app.compact_command_desc": "Сведите этот сеанс в компактный вид, чтобы уменьшить размер контекста.", + "app.connection_lost": "Соединение с сервером потеряно. Перезагрузите приложение.", + "app.deep_link_auth_queued": "Ссылка для входа в Cloud поставлена в очередь для OpenWork.", + "app.deep_link_remote_queued": "Ссылка на удаленного воркера поставлена в очередь. OpenWork должен перейти в поток подключения.", + "app.error.choose_folder": "Выберите папку, чтобы продолжить.", + "app.error.host_requires_local": "Выберите локальное рабочее пространство, чтобы запустить движок.", + "app.error.install_failed": "Не удалось установить OpenCode. См. журналы выше.", + "app.error.pick_workspace_folder": "Сначала выберите папку рабочего пространства.", + "app.error.remote_base_url_required": "Добавьте URL сервера, чтобы продолжить.", + "app.error.tauri_required": "Для этого действия требуется среда настольного приложения OpenWork.", + "app.error_audit_load": "Не удалось загрузить журнал аудита.", + "app.error_auth_failed": "Ошибка аутентификации", + "app.error_auto_compact_scope": "Автосжатие контекста можно изменить только для локального рабочего пространства или доступного на запись рабочего пространства сервера OpenWork.", + "app.error_cloud_signin": "Не удалось завершить вход в OpenWork Cloud.", + "app.error_command_not_resolved": "Команда не была разрешена.", + "app.error_compact_empty": "Пока нечего сжимать.", + "app.error_compact_no_session": "Выберите сеанс с сообщениями, прежде чем запускать /compact.", + "app.error_compact_no_session_id": "Выберите сеанс перед сжатием.", + "app.error_connect_first": "Подключитесь к этому воркеру перед применением изменений среды выполнения.", + "app.error_connection_failed": "Подключение не удалось", + "app.error_connection_failed_url": "Подключение не удалось. Проверьте URL и токен.", + "app.error_deep_link_unrecognized": "Эта ссылка не распознана как deep link OpenWork или URL для общего доступа.", + "app.error_desktop_signin": "Вход в настольном приложении завершен, но OpenWork Cloud не вернул токен сеанса.", + "app.error_not_connected": "Нет подключения к серверу", + "app.error_pick_local_folder": "Выберите папку локального воркера перед перезапуском локального сервера.", + "app.error_rate_limit": "Превышен лимит запросов", + "app.error_remote_access": "Не удалось обновить удаленный доступ.", + "app.error_request_failed": "Запрос не выполнен", + "app.error_reset_config": "Не удалось сбросить значения конфигурации приложения.", + "app.error_restart_local_worker": "Не удалось перезапустить локального воркера с обновленной настройкой общего доступа.", + "app.error_runtime_changes": "Не удалось применить изменения среды выполнения.", + "app.error_session_name_required": "Требуется имя сеанса", + "app.error_update_opencode_json": "Не удалось обновить opencode.json", + "app.import_bundle_desc": "Выберите, как импортировать этот пакет.", + "app.import_shared_bundle": "Импортировать общий пакет", + "app.local_disabled_reason": "Создавайте локальные рабочие пространства в настольном приложении. Удаленные и общие рабочие пространства здесь по-прежнему работают.", + "app.local_worker_detail": "Локальный воркер", + "app.model_behavior_desc": "Сначала выберите модель, чтобы увидеть параметры поведения, зависящие от провайдера.", + "app.model_behavior_title": "Поведение модели", + "app.plugins_hint_disconnected": "Сервер OpenWork недоступен. Plugins доступны только для чтения.", + "app.plugins_hint_limited": "Сервер OpenWork требует токен для редактирования Plugins.", + "app.plugins_hint_readonly": "Сервер OpenWork доступен только для чтения для Plugins.", + "app.reload_later": "Позже", + "app.reload_now": "Перезагрузить сейчас", + "app.reload_stop_tasks": "Перезагрузить и остановить задачи", + "app.remote_worker_detail": "Удаленный воркер", + "app.reset_config_ok": "Сбросьте значения конфигурации приложения. Перезапустите OpenWork, если останутся устаревшие настройки.", + "app.shared_setup": "Общая настройка", + "app.skill_added": "Навык добавлен", + "app.skills_hint_disconnected": "Сервер OpenWork недоступен. Добавьте URL/токен сервера в Advanced, чтобы управлять навыками.", + "app.skills_hint_limited": "Сервер OpenWork требует host-токен для установки и обновления навыков. Добавьте его в Advanced и подключитесь заново.", + "app.skills_hint_readonly": "Сервер OpenWork доступен только для чтения для навыков. Добавьте host-токен в Advanced, чтобы включить установку.", + "app.unknown_error": "Неизвестная ошибка", + "app.worker_fallback": "Воркер", + "blueprint.automation_body": "Начните с повторно используемого рабочего процесса или введите свою задачу ниже.", + "blueprint.automation_title": "Что вы хотите автоматизировать?", + "blueprint.csv_session_assistant": "Я могу помочь вам создавать, очищать, объединять и сводить CSV-файлы. Какой вид работы с CSV вы хотите автоматизировать?", + "blueprint.csv_session_title": "Идеи рабочих процессов с CSV", + "blueprint.csv_session_user": "Я хочу объединить экспорты из нескольких инструментов в один чистый CSV.", + "blueprint.empty_body": "Выберите точку старта или просто введите текст ниже.", + "blueprint.empty_title": "Что вы хотите сделать?", + "blueprint.minimal_body": "Задайте вопрос об этом рабочем пространстве или используйте стартовый prompt.", + "blueprint.minimal_title": "Начните с задачи", + "blueprint.starter_blueprint_desc": "Спроектируйте повторяемый рабочий процесс с Skills, Commands и шагами передачи.", + "blueprint.starter_blueprint_prompt": "Помогите мне спроектировать reusable automation blueprint для этого рабочего пространства. Спросите, что нужно стандартизировать, а затем предложите рабочий процесс.", + "blueprint.starter_blueprint_title": "Спланировать automation blueprint", + "blueprint.starter_chrome_desc": "Сразу начните диалог для автоматизации браузера.", + "blueprint.starter_chrome_prompt": "Помогите мне подключиться к Chrome и автоматизировать повторяющуюся задачу.", + "blueprint.starter_chrome_title": "Автоматизировать Chrome", + "blueprint.starter_command_desc": "Превратите повторяющийся рабочий процесс в slash-command для этого рабочего пространства.", + "blueprint.starter_command_prompt": "Помогите мне создать reusable /command для этого рабочего пространства. Спросите, какой рабочий процесс я хочу автоматизировать, а затем подготовьте команду.", + "blueprint.starter_command_title": "Создать reusable command", + "blueprint.starter_connect_openai_desc": "Добавьте вашего OpenAI провайдера, чтобы модели ChatGPT были готовы в новых сеансах.", + "blueprint.starter_connect_openai_title": "Подключить ChatGPT", + "blueprint.starter_csv_desc": "Очистить или сгенерировать табличные данные.", + "blueprint.starter_csv_prompt": "Помогите мне создать или отредактировать CSV-файлы на этом компьютере.", + "blueprint.starter_csv_title": "Работа с CSV", + "blueprint.starter_explore_desc": "Сведите содержимое файлов и предложите лучшую первую задачу.", + "blueprint.starter_explore_prompt": "Сведите это рабочее пространство, укажите самые важные файлы и предложите лучшую первую задачу.", + "blueprint.starter_explore_title": "Изучить это рабочее пространство", + "blueprint.welcome_message": "Привет, добро пожаловать в OpenWork!\n\nЛюди используют нас, чтобы писать CSV-файлы на своем компьютере, подключаться к Chrome и автоматизировать повторяющиеся задачи, а также синхронизировать контакты с Notion.\n\nНо единственное ограничение — это ваше воображение.\n\nЧто бы вы хотели сделать?", + "blueprint.welcome_title": "Добро пожаловать в OpenWork", + "common.add": "Добавить", + "common.cancel": "Отмена", + "common.choose": "Выбрать", + "common.back": "Назад", + "common.close": "Закрыть", + "common.default_parens": "(по умолчанию)", + "common.done": "Готово", + "common.edit": "Изменить", + "common.hide": "Скрыть", + "common.install": "Установить", + "common.navigate": "перейти", + "common.next": "Далее", + "common.off": "Выкл.", + "common.on": "Вкл.", + "common.path": "Путь", + "common.question": "Вопрос", + "common.refresh": "Обновить", + "common.remove": "Удалить", + "common.reset": "Сбросить", + "common.retry": "Повторить", + "common.save": "Сохранить", + "common.select": "выберите", + "common.show": "Показать", + "common.something_went_wrong": "Что-то пошло не так", + "common.submit": "Отправить", + "common.unknown": "Неизвестно", + "composer.agent_label": "Агент", + "composer.attach_files": "Прикрепить файлы", + "composer.attachments_unavailable": "Вложения недоступны.", + "composer.behavior_label": "Поведение", + "composer.configure": "Настроить", + "composer.default_agent": "Агент по умолчанию", + "composer.expand_pasted": "Нажмите, чтобы развернуть вставленный текст", + "composer.failed_read_attachment": "Не удалось прочитать вложение", + "composer.file_exceeds_limit": "{name} превышает лимит 8 МБ.", + "composer.file_kind": "Файл", + "composer.file_too_large_encoding": "{name} слишком большой после кодирования. Попробуйте изображение меньшего размера.", + "composer.image_kind": "Изображение", + "composer.inserted_links_unsupported": "Вставлены ссылки для неподдерживаемых файлов.", + "composer.loading_agents": "Загрузка агентов...", + "composer.loading_commands": "Загрузка команд...", + "composer.mcps_label": "MCPs", + "composer.no_commands": "Команды не найдены.", + "composer.no_matches": "Совпадения не найдены.", + "composer.placeholder": "Опишите вашу задачу...", + "composer.remote_worker_paste_warning": "Это удаленный воркер. Песочницы тоже находятся удаленно. Чтобы поделиться с ним файлами, загрузите их в папку Shared на боковой панели.", + "composer.run_task": "Запустить задачу", + "composer.skill_source": "Навык", + "composer.stop": "Остановить", + "composer.tools_label": "Команды, навыки и MCPs", + "composer.unsupported_attachment_type": "Неподдерживаемый тип вложения.", + "composer.upload_failed_local_links": "Не удалось загрузить в общую папку. Вместо этого вставлены локальные ссылки.", + "composer.upload_to_shared_folder": "Загрузить в общую папку", + "composer.uploaded_multiple_files": "Загружено {count} файлов в общую папку и вставлены ссылки.", + "composer.uploaded_single_file": "Загружен {name} в общую папку и вставлена ссылка.", + "config.auto_reload_desc": "Перезагружать автоматически после изменения агентов/навыков/команд/конфигурации (только в простое).", + "config.auto_reload_title": "Автоперезагрузка (локально)", + "config.auto_reload_unavailable": "Доступно для локальных рабочих пространств в настольном приложении.", + "config.collaborator_token_disabled_hint": "Сохранен заранее для удаленного доступа, но удаленный доступ сейчас отключен.", + "config.collaborator_token_label": "Токен соавтора", + "config.collaborator_token_remote_hint": "Обычный удаленный доступ для телефонов или ноутбуков, подключающихся к этому серверу.", + "config.connection_failed": "Подключение не удалось.", + "config.connection_failed_check": "Подключение не удалось. Проверьте URL хоста и токен.", + "config.connection_status_updated": "Статус подключения обновлен.", + "config.connection_successful": "Подключение успешно.", + "config.copied": "Скопировано", + "config.copy": "Копировать", + "config.desktop_only_hint": "Некоторые функции конфигурации (общий доступ к локальному серверу + messaging bridge) требуют настольного приложения.", + "config.diagnostics_desc": "Скопировать очищенное состояние среды выполнения для отладки.", + "config.diagnostics_title": "Пакет диагностики", + "config.enable_auto_reload_first": "Сначала включите автоперезагрузку", + "config.engine_reload_desc": "Перезапустить сервер OpenCode для этого рабочего пространства.", + "config.engine_reload_title": "Перезагрузка движка", + "config.host_admin_token_hint": "Внутренний токен хоста только для approvals CLI и admin API. Не используйте его в потоке подключения удаленного приложения.", + "config.host_admin_token_label": "Admin-токен хоста", + "config.host_local_only": "Только локально", + "config.host_offline": "Не в сети", + "config.host_remote_enabled": "Удаленный доступ включен", + "config.local_ip_hint": "Используйте локальный IP в той же Wi‑Fi сети для самого быстрого подключения.", + "config.mdns_hint": "Имена .local проще запомнить, но они могут не разрешаться во всех сетях.", + "config.messaging_identities_desc": "Управляйте идентификаторами Telegram/Slack и маршрутизацией во вкладке Identities.", + "config.messaging_identities_title": "Идентификаторы для messaging", + "config.not_set": "Не задано", + "config.owner_token_disabled_hint": "Имеет смысл только после включения удаленного доступа для этого воркера.", + "config.owner_token_label": "Токен владельца", + "config.owner_token_remote_hint": "Используйте это, когда удаленному клиенту нужно отвечать на запросы разрешений или выполнять действия только владельца.", + "config.reload_active_tasks_warning": "Перезагрузка остановит активные задачи.", + "config.reload_availability_hint": "Перезагрузка доступна только для локальных воркеров или подключенных серверов OpenWork.", + "config.reload_connect_hint": "Подключитесь к этому воркеру, чтобы перезагрузить его.", + "config.reload_engine": "Перезагрузить движок", + "config.reload_now_desc": "Применяет обновления конфигурации и переподключает сеанс.", + "config.reload_now_title": "Перезагрузить сейчас", + "config.reloading": "Перезагрузка...", + "config.remote_access_off_hint": "Удаленный доступ выключен. Используйте Share workspace, чтобы включить его перед подключением с другого компьютера.", + "config.resolved_worker_url": "Распознанный URL воркера:", + "config.resume_sessions_desc": "Если перезагрузка была поставлена в очередь, пока задачи выполнялись, отправить после этого сообщение о возобновлении.", + "config.resume_sessions_title": "Возобновлять сеансы после автоперезагрузки", + "config.server_needed_hint": "Для синхронизации навыков, Plugins и команд требуется подключение к серверу OpenWork.", + "config.server_section_desc": "Подключитесь к серверу OpenWork. Используйте URL и токен соавтора или владельца от администратора сервера.", + "config.server_section_title": "Сервер OpenWork", + "config.server_sharing_desc": "Поделитесь этими данными с доверенным устройством. Для самого быстрого подключения держите сервер в той же сети.", + "config.server_sharing_menu_hint": "Для ссылок общего доступа на отдельные рабочие пространства используйте Share... в меню рабочего пространства.", + "config.server_sharing_title": "Общий доступ к серверу OpenWork", + "config.server_url_hint": "Используйте URL, предоставленный вашим сервером OpenWork. Локальные настольные воркеры повторно используют постоянный высокий порт в диапазоне 48000-51000.", + "config.server_url_input_label": "URL сервера OpenWork", + "config.server_url_label": "URL сервера OpenWork", + "config.starting_server": "Запуск сервера…", + "config.status_connected": "Подключено", + "config.status_limited": "Ограничено", + "config.status_not_connected": "Не подключено", + "config.test_connection": "Проверить подключение", + "config.testing": "Проверка...", + "config.testing_connection": "Проверка подключения...", + "config.token_hint": "Необязательно. Вставьте токен соавтора для обычного доступа или токен владельца, если этот клиент должен отвечать на запросы разрешений.", + "config.token_label": "Токен соавтора или владельца", + "config.token_placeholder": "Вставьте ваш токен", + "config.unavailable": "Недоступно", + "config.worker_id": "Worker ID:", + "config.workspace_config_desc": "Эти настройки влияют на выбранное рабочее пространство. Действия только во время работы применяются к тому рабочему пространству, к которому сейчас подключены.", + "config.workspace_config_title": "Конфигурация рабочего пространства", + "config.workspace_id_prefix": "Рабочее пространство:", + "context_panel.add_button": "Добавить", + "context_panel.add_folder_hint": "Добавьте папку, чтобы позволить этому рабочему пространству читать и редактировать файлы вне корневого каталога.", + "context_panel.adding_button": "Добавление...", + "context_panel.always_available": "Всегда доступно", + "context_panel.authorized_folders": "Авторизованные папки", + "context_panel.authorized_folders_desc": "Предоставьте этому рабочему пространству доступ на чтение и редактирование файлов в каталогах вне его корня.", + "context_panel.authorized_folders_no_access": "Подключитесь к доступному на запись рабочему пространству сервера OpenWork, чтобы редактировать авторизованные папки.", + "context_panel.browse_button": "Обзор", + "context_panel.config_access_unavailable": "Доступ к конфигурации сервера OpenWork недоступен для этого рабочего пространства.", + "context_panel.config_read_only": "Сервер OpenWork подключен только для чтения конфигурации рабочего пространства.", + "context_panel.context": "Контекст", + "context_panel.folder_already_authorized": "Папка уже авторизована.", + "context_panel.folders_updated": "Авторизованные папки обновлены.", + "context_panel.input_placeholder": "Введите путь к папке, чтобы авторизовать...", + "context_panel.mcp": "MCP", + "context_panel.mcp_connected": "Подключено", + "context_panel.mcp_disabled": "Отключено", + "context_panel.mcp_disconnected": "Нет подключения", + "context_panel.mcp_failed": "Ошибка", + "context_panel.mcp_needs_auth": "Требуется авторизация", + "context_panel.mcp_register_client": "Зарегистрировать клиент", + "context_panel.no_external_folders": "Нет авторизованных внешних папок", + "context_panel.no_mcp": "Нет загруженных MCP-серверов.", + "context_panel.no_plugins": "Нет загруженных Plugins.", + "context_panel.no_server_workspace": "Не выбрано активное серверное рабочее пространство.", + "context_panel.no_skills": "Нет загруженных Skills.", + "context_panel.none_yet": "Пока ничего нет.", + "context_panel.plugins": "Plugins", + "context_panel.preserving_entries": "Сохраняем {count} записи разрешений, не относящиеся к папкам.", + "context_panel.preserving_entry": "Сохраняется 1 запись разрешения, не относящаяся к папке.", + "context_panel.remove_folder": "Удалить {name}", + "context_panel.saving_folders": "Сохранение авторизованных папок...", + "context_panel.server_disconnected": "Сервер OpenWork отключен.", + "context_panel.skills": "Skills", + "context_panel.working_files": "Рабочие файлы", + "context_panel.workspace_root_available": "Корневой каталог рабочего пространства уже доступен.", + "context_panel.workspace_root_badge": "Корень workspace", + "context_panel.writable_workspace_required": "Для обновления авторизованных папок требуется доступное на запись рабочее пространство сервера OpenWork.", + "dashboard.access_token": "Токен доступа", + "dashboard.access_token_optional_hint": "Добавьте токен только если он требуется воркеру.", + "dashboard.blueprints_workspace": "Блюпринты", + "dashboard.blueprints_workspace_desc": "Начните с рабочего пространства, готового к автоматизации, для повторно используемых навыков, команд и общих потоков.", + "dashboard.change": "Изменить", + "dashboard.choose_folder": "Выберите папку", + "dashboard.choose_folder_continue": "Выберите папку, чтобы продолжить.", + "dashboard.choose_folder_next": "Поделитесь файлами с вашим рабочим пространством.", + "dashboard.choose_preset": "Выбрать preset", + "dashboard.chooser_local_desc": "Создайте рабочее пространство на этом устройстве.", + "dashboard.chooser_remote_desc": "Подключитесь к self-hosted OpenWork воркеру по URL и токену доступа.", + "dashboard.chooser_shared_desc": "Просматривайте облачные воркеры, которыми поделилась ваша организация, и подключайтесь в один шаг.", + "dashboard.close_settings": "Закрыть настройки", + "dashboard.cloud_signin_button": "Продолжить с Cloud", + "dashboard.cloud_signin_hint": "Получите доступ к удаленным воркерам, которыми поделилась ваша организация.", + "dashboard.cloud_signin_next": "Дальше вы выберете команду и подключитесь к существующему рабочему пространству.", + "dashboard.cloud_signin_title": "Войти в OpenWork Cloud", + "dashboard.cloud_worker": "Облачный воркер", + "dashboard.commands": "Commands", + "dashboard.connect_remote_button": "Подключиться удаленно", + "dashboard.connected": "Подключено", + "dashboard.connecting": "Подключение...", + "dashboard.create_local_workspace_subtitle": "Создайте рабочее пространство на этом устройстве.", + "dashboard.create_local_workspace_title": "Локальное рабочее пространство", + "dashboard.create_remote_custom_subtitle": "Подключитесь к self-hosted OpenWork воркеру.", + "dashboard.create_remote_custom_title": "Подключить свой удаленный сервер", + "dashboard.create_remote_workspace_confirm": "Добавить рабочее пространство", + "dashboard.create_remote_workspace_subtitle": "Сохраните сервер OpenWork как рабочее пространство.", + "dashboard.create_remote_workspace_title": "Добавить удаленное рабочее пространство", + "dashboard.create_sandbox_confirm": "Создать как песочницу", + "dashboard.create_shared_subtitle_signed_in": "Просматривайте облачные воркеры, которыми поделилась ваша организация, и подключайтесь в один шаг.", + "dashboard.create_shared_subtitle_signed_out": "Войдите в OpenWork Cloud, чтобы получить доступ к воркерам, которыми поделилась ваша организация.", + "dashboard.create_shared_title": "Общие рабочие пространства", + "dashboard.create_workspace_confirm": "Создать рабочее пространство", + "dashboard.create_workspace_subtitle": "Инициализируйте новое папочное рабочее пространство.", + "dashboard.create_workspace_title": "Создать рабочее пространство", + "dashboard.creating": "Создание...", + "dashboard.desktop_badge": "Настольное", + "dashboard.display_name_label": "Отображаемое имя", + "dashboard.display_name_optional": "(необязательно)", + "dashboard.docker_debug_details": "Подробности отладки Docker", + "dashboard.edit_remote_workspace_confirm": "Сохранить подключение", + "dashboard.edit_remote_workspace_subtitle": "Обновите данные сервера OpenWork для этого рабочего пространства.", + "dashboard.edit_remote_workspace_title": "Изменить удаленное подключение", + "dashboard.empty_workspace": "Пустое рабочее пространство", + "dashboard.empty_workspace_desc": "Начните с пустой папки и добавьте все, что нужно.", + "dashboard.error_choose_org": "Выберите организацию перед открытием рабочего пространства.", + "dashboard.error_connect_worker": "Не удалось подключиться к {name}.", + "dashboard.error_create_template": "Не удалось создать {name}.", + "dashboard.error_load_orgs": "Не удалось загрузить организации.", + "dashboard.error_load_shared_workspaces": "Не удалось загрузить общие рабочие пространства.", + "dashboard.error_workspace_not_ready": "Рабочее пространство пока не готово к подключению. Повторите попытку через минуту.", + "dashboard.import_config": "Импортировать конфигурацию", + "dashboard.importing": "Импорт...", + "dashboard.modal_back": "Назад", + "dashboard.modal_close": "Закрыть модальное окно добавления рабочего пространства", + "dashboard.nav_ids": "ID", + "dashboard.no_folder_selected": "Пока не выбрана папка.", + "dashboard.open_cloud_dashboard": "Открыть облачную панель", + "dashboard.opening": "Открытие...", + "dashboard.openwork_host_hint": "Используйте URL, предоставленный вашим сервером OpenWork.", + "dashboard.openwork_host_label": "URL сервера OpenWork", + "dashboard.openwork_host_placeholder": "https://your-server.openwork.app", + "dashboard.openwork_host_token_hint": "Необязательно. Вставьте токен соавтора для обычного доступа или токен владельца, если этот клиент должен отвечать на запросы разрешений.", + "dashboard.openwork_host_token_label": "Токен соавтора или владельца", + "dashboard.openwork_host_token_placeholder": "Вставьте ваш токен", + "dashboard.recently_updated": "Недавно обновлено", + "dashboard.remote": "Удаленное", + "dashboard.remote_base_url_required": "Добавьте URL сервера, чтобы продолжить.", + "dashboard.remote_connection_direct": "Прямое", + "dashboard.remote_connection_openwork": "OpenWork", + "dashboard.remote_directory_hint": "Оставьте пустым, чтобы использовать каталог сервера по умолчанию.", + "dashboard.remote_directory_label": "Каталог рабочего пространства (необязательно)", + "dashboard.remote_directory_placeholder": "/home/team/project", + "dashboard.remote_display_name_label": "Отображаемое имя (необязательно)", + "dashboard.remote_display_name_placeholder": "Рабочее пространство команды дизайна", + "dashboard.remote_server_details_hint": "Подключитесь к self-hosted OpenWork воркеру.", + "dashboard.remote_server_details_title": "Подробности удаленного сервера", + "dashboard.remote_workspace_hint": "Отслеживайте сервер OpenWork и переподключайтесь в любой момент.", + "dashboard.remote_workspace_title": "Удаленное рабочее пространство", + "dashboard.repair_cache": "Восстановить кэш", + "dashboard.repairing_cache": "Восстановление кэша", + "dashboard.sandbox_checking_docker": "Проверка Docker...", + "dashboard.sandbox_get_ready_action": "Подготовьте систему", + "dashboard.sandbox_get_ready_desc": "Запускайте это рабочее пространство в изолированном Docker-контейнере для более безопасных и воспроизводимых запусков.", + "dashboard.sandbox_get_ready_title": "Для песочниц нужен Docker", + "dashboard.sandbox_hide_logs": "Скрыть журналы", + "dashboard.sandbox_live_logs": "Живые журналы", + "dashboard.sandbox_setup": "Настройка песочницы", + "dashboard.sandbox_show_logs": "Показать журналы", + "dashboard.search_shared_workspaces": "Поиск общих рабочих пространств", + "dashboard.select_folder": "Выбрать папку", + "dashboard.settings": "Настройки", + "dashboard.shared_workspaces_loading": "Загрузка общих рабочих пространств…", + "dashboard.shared_workspaces_no_match": "Общие рабочие пространства не соответствуют этому поиску.", + "dashboard.shared_workspaces_none": "Пока нет доступных общих рабочих пространств.", + "dashboard.shared_workspaces_refreshing": "Обновление рабочих пространств…", + "dashboard.skills": "Skills", + "dashboard.starter_workspace": "Стартовое рабочее пространство", + "dashboard.starter_workspace_desc": "Предварительно настроено, чтобы показать, как использовать Plugins, Commands и навыки.", + "dashboard.unknown_creator": "Неизвестный автор", + "dashboard.worker_status_attention": "Требует внимания", + "dashboard.worker_status_ready": "Готов", + "dashboard.worker_status_starting": "Запуск", + "dashboard.worker_status_stopped": "Остановлен", + "dashboard.worker_status_unknown": "Неизвестно", + "dashboard.worker_url_hint": "Вставьте URL воркера OpenWork, к которому хотите подключиться.", + "dashboard.worker_url_label": "URL воркера", + "dashboard.workspace_connect": "Подключиться", + "dashboard.workspace_connect_unavailable": "Подключение общих рабочих пространств здесь недоступно.", + "dashboard.workspace_connecting": "Подключение", + "dashboard.workspace_folder_hint": "Выберите, где это рабочее пространство должно храниться на вашем устройстве.", + "dashboard.workspace_folder_title": "Папка рабочего пространства", + "dashboard.workspace_not_ready_title": "Это рабочее пространство пока не готово к подключению.", + "dashboard.workspaces": "Рабочие пространства", + "identities.agent_behavior_desc": "Один файл на рабочее пространство. Добавьте необязательную первую строку @agent , чтобы маршрутизировать через конкретного OpenCode-агента.", + "identities.agent_behavior_title": "Поведение агента для messaging", + "identities.agent_created": "Создан файл агента мессенджинга по умолчанию.", + "identities.agent_file_changed": "Файл изменен удаленно. Перезагрузите и сохраните еще раз.", + "identities.agent_loading": "Загрузка файла агента…", + "identities.agent_none": "none", + "identities.agent_not_found": "Файл агента пока не найден в этом рабочем пространстве.", + "identities.agent_saved": "Поведение мессенджинга сохранено.", + "identities.agent_scope_status": "Активная область: workspace · статус: {status} · выбранный агент: {agent}", + "identities.agent_status_loaded": "загружен", + "identities.agent_status_missing": "отсутствует", + "identities.agent_worker_scope_unavailable": "Область воркера недоступна.", + "identities.all_channels": "Все каналы", + "identities.app_token_label": "Токен приложения", + "identities.auto_bind_label": "Автоматически привязывать peer к каталогу при прямой отправке", + "identities.available_channels": "Доступные каналы", + "identities.bot_token_label": "Токен бота", + "identities.bot_token_placeholder": "Вставьте токен Telegram-бота из @BotFather", + "identities.botfather_step1_open": "1. Откройте @BotFather в Telegram", + "identities.botfather_step1_run": "и выполните /newbot", + "identities.botfather_step3_choose": "3. Выберите имя и username для вашего бота", + "identities.botfather_step3_or_private": "для открытого inbox или", + "identities.botfather_step3_private": "Приватный", + "identities.botfather_step3_public": "Публичный", + "identities.botfather_step3_to_require": "чтобы потребовать", + "identities.channel_label": "Канал", + "identities.channels_connected": "подключено", + "identities.channels_label": "Каналы", + "identities.configured_suffix": "настроено", + "identities.connect_server_desc": "Идентификаторы доступны, когда вы подключены к хосту OpenWork.", + "identities.connect_server_title": "Подключиться к серверу OpenWork", + "identities.connect_slack": "Подключить Slack", + "identities.connected_badge": "Подключено", + "identities.connecting": "Подключение...", + "identities.copy_bot_token_hint": "Скопируйте токен бота и вставьте его ниже.", + "identities.copy_code": "Скопировать код", + "identities.create_default_file": "Создать файл по умолчанию", + "identities.create_private_bot": "Создать приватного бота", + "identities.create_public_bot": "Создать публичного бота", + "identities.days_ago": "{days} дн. назад", + "identities.default_routing": "Маршрутизация по умолчанию", + "identities.directory_label": "Каталог (необязательно)", + "identities.disable_messaging": "Отключить messaging", + "identities.disable_messaging_message": "Это отключит messaging для этого рабочего пространства. Настройка Telegram и Slack будет скрыта, пока messaging снова не будет включен, и вам нужно будет перезапустить воркер, чтобы полностью остановить messaging sidecar.", + "identities.disable_messaging_title": "Отключить messaging для этого воркера?", + "identities.disabled_label": "Отключено", + "identities.disabling": "Отключение...", + "identities.disconnect": "Отключить", + "identities.dispatched_messages": "Отправлено {sent}/{attempted} сообщений.", + "identities.enable_messaging": "Включить messaging", + "identities.enable_messaging_risk": "Messaging может открыть этому воркеру доступ к удаленным командам. Если бот публичный или скомпрометирован, он может получить доступ к файлам, учетным данным и API-ключам, доступным этому воркеру.", + "identities.enable_messaging_title": "Включить messaging для этого воркера?", + "identities.enabled_label": "Включено", + "identities.enabling": "Включение...", + "identities.health_offline": "Не в сети", + "identities.health_running": "Работает", + "identities.health_unavailable": "Недоступно", + "identities.health_unknown": "Неизвестно", + "identities.hours_ago": "{hours} ч назад", + "identities.identities_label": "Идентификаторы", + "identities.just_now": "Только что", + "identities.last_activity": "Последняя активность", + "identities.later": "Позже", + "identities.message_label": "Сообщение", + "identities.message_routing_desc": "Управляйте тем, какие разговоры идут в какую папку рабочего пространства. Сообщения маршрутизируются в папку по умолчанию воркера, если вы не настроили правила здесь.", + "identities.message_routing_title": "Маршрутизация сообщений", + "identities.messages_today": "Сообщений сегодня", + "identities.messaging_disabled_hint": "Включайте messaging только если понимаете риск и планируете защитить доступ (например, приватную пару Telegram).", + "identities.messaging_disabled_restart": "Messaging отключен. Перезапустите этого воркера, чтобы остановить messaging sidecar.", + "identities.messaging_disabled_risk": "Messaging-боты могут выполнять действия от имени вашего локального воркера. Если они открыты публично, они могут дать доступ к файлам, учетным данным и API-ключам, доступным этому воркеру.", + "identities.messaging_disabled_title": "Messaging отключен по умолчанию", + "identities.messaging_enabled_restart": "Messaging включен. Перезапустите этого воркера, чтобы применить изменения перед настройкой каналов.", + "identities.messaging_sidecar_not_running": "Messaging включен в этом рабочем пространстве, но messaging sidecar еще не запущен. Перезапустите этого воркера, затем вернитесь в настройки Messaging, чтобы подключить Telegram или Slack.", + "identities.minutes_ago": "{minutes} мин назад", + "identities.not_set": "Не задано", + "identities.open_bot_link": "Открыть @{username} в Telegram", + "identities.pairing_code_copied": "Код сопряжения скопирован.", + "identities.pairing_code_copy_failed": "Не удалось скопировать код сопряжения. Скопируйте его вручную.", + "identities.pairing_code_instruction_prefix": "Отправьте", + "identities.peer_id_label": "Peer ID (необязательно)", + "identities.peer_id_placeholder_slack": "например, slack:U12345678", + "identities.peer_id_placeholder_telegram": "например, telegram:123456789", + "identities.private_label": "Приватный", + "identities.private_pairing_code": "Приватный код сопряжения", + "identities.public_bot_confirm": "Да, я понимаю риск", + "identities.public_bot_warning_message": "Ваш бот будет доступен публично, и любой, кто получит к нему доступ, сможет получить полный доступ к вашему локальному воркеру, включая любые файлы или API-ключи, которые вы ему дали. Если вы создадите приватного бота, вы сможете ограничить, кто может получить к нему доступ, требуя токен сопряжения. Вы уверены, что хотите сделать вашего бота публичным?", + "identities.public_bot_warning_title": "Сделать этого бота публичным?", + "identities.public_label": "Публичный", + "identities.quick_setup": "Быстрая настройка", + "identities.reconnect_failed": "Переподключение не удалось. Проверьте URL/токен OpenWork и попробуйте еще раз.", + "identities.reconnected": "Переподключено.", + "identities.reconnected_refreshing": "Переподключено. Обновление состояния воркера...", + "identities.reload": "Перезагрузить", + "identities.repair_reconnect": "Восстановить и переподключить", + "identities.restart_failed": "Не удалось перезапустить. Перезапустите воркера из Settings и попробуйте снова.", + "identities.restart_to_disable_messaging": "Messaging был отключен для этого рабочего пространства. Перезапустите воркера сейчас, чтобы остановить messaging sidecar.", + "identities.restart_to_enable_messaging": "Messaging был включен для этого рабочего пространства. Перезапустите воркера сейчас, чтобы запустить messaging sidecar и открыть настройку Telegram и Slack.", + "identities.restart_worker": "Перезапустить воркер", + "identities.restart_worker_title": "Перезапустить воркер сейчас?", + "identities.restarting": "Перезапуск...", + "identities.routing_override_prefix": "Все сообщения направляются в", + "identities.routing_override_suffix": "(переопределение активно)", + "identities.running_label": "Работает", + "identities.save_behavior": "Сохранить поведение", + "identities.saving": "Сохранение...", + "identities.send_test_button": "Отправить тестовое сообщение", + "identities.send_test_desc": "Проверьте исходящую проводку. Используйте peer ID для прямой отправки или оставьте peer ID пустым, чтобы распределить по привязкам в каталоге.", + "identities.send_test_title": "Отправить тестовое сообщение", + "identities.sending": "Отправка...", + "identities.slack_desc": "Ваш воркер отображается как бот в каналах Slack. Участники команды могут писать ему напрямую или упоминать его в тредах.", + "identities.slack_intro": "Подключите ваше рабочее пространство Slack, чтобы участники команды могли взаимодействовать с этим воркером в каналах и личных сообщениях.", + "identities.slack_unavailable": "Идентификаторы Slack недоступны.", + "identities.status_active": "Активно", + "identities.status_label": "Статус", + "identities.status_stopped": "Остановлено", + "identities.stopped_label": "Остановлено", + "identities.subtitle": "Позвольте людям обращаться к вашему воркеру через мессенджеры. Подключите канал, и ваш воркер будет автоматически читать сообщения и отвечать на них.", + "identities.tab_general": "Общее", + "identities.telegram_bot_access_desc": "Публичный бот: первый чат Telegram автоматически связывается. Приватный бот: перед любыми сообщениями требуется код сопряжения.", + "identities.telegram_delete_failed": "Не удалось удалить.", + "identities.telegram_deleted": "Удалено.", + "identities.telegram_deleted_pending": "Удалено (ожидает применения).", + "identities.telegram_desc": "Подключите Telegram-бота в публичном режиме (открытый inbox) или приватном режиме (требуется код сопряжения).", + "identities.telegram_private_saved_pair": "Приватный бот сохранен. Сопряжение через /pair {code}", + "identities.telegram_save_failed": "Не удалось сохранить.", + "identities.telegram_saved": "Сохранено.", + "identities.telegram_saved_pending": "Сохранено (ожидает применения).", + "identities.telegram_saved_username": "Сохранено (@{username})", + "identities.telegram_unavailable": "Идентификаторы Telegram недоступны.", + "identities.title": "Каналы мессенджинга", + "identities.unsaved_changes": "Несохраненные изменения", + "identities.worker_offline": "Воркер не в сети", + "identities.worker_online": "Воркер в сети", + "identities.worker_restarted": "Воркер перезапущен.", + "identities.worker_restarted_refreshing": "Воркер перезапущен. Обновление состояния мессенджинга...", + "identities.worker_scope_unavailable": "Область воркера недоступна.", + "identities.worker_scope_unavailable_detail": "Область воркера недоступна. Переподключитесь по URL воркера или переключитесь на известный воркер.", + "identities.worker_unavailable": "Воркер недоступен", + "identities.workspace_id_required": "Для управления идентификаторами требуется Workspace ID. Переподключитесь с URL workspace или выберите workspace, сопоставленный на этом хосте.", + "identities.workspace_scope_prefix": "Область workspace:", + "inbox_panel.connect_to_download": "Подключитесь к воркеру, чтобы загрузить общие файлы.", + "inbox_panel.connect_to_see": "Подключитесь, чтобы увидеть общие файлы.", + "inbox_panel.connect_to_upload": "Подключитесь к воркеру, чтобы загружать", + "inbox_panel.copy_failed": "Копирование не удалось. Ваш браузер может блокировать доступ к буферу обмена.", + "inbox_panel.download": "Скачать", + "inbox_panel.drop_to_upload": "Перетащите файлы сюда, чтобы загрузить", + "inbox_panel.helper_text": "Поделитесь файлами с этим воркером из приложения.", + "inbox_panel.load_failed": "Не удалось загрузить общую папку", + "inbox_panel.missing_file_id": "Отсутствует ID общего файла.", + "inbox_panel.no_files": "Пока нет общих файлов.", + "inbox_panel.refresh_tooltip": "Обновить общую папку", + "inbox_panel.shared_folder": "Общая папка", + "inbox_panel.showing_first": "Показаны первые {count}.", + "inbox_panel.upload_failed": "Не удалось загрузить в общую папку", + "inbox_panel.upload_needs_worker": "Подключитесь к воркеру, чтобы загружать файлы в общую папку.", + "inbox_panel.upload_prompt": "Перетащите файлы или нажмите, чтобы загрузить", + "inbox_panel.upload_success": "Загружено в общую папку.", + "inbox_panel.uploading": "Загрузка...", + "inbox_panel.uploading_label": "Загрузка {label}...", + "mcp.activate_button": "Активировать", + "mcp.disable_app": "Отключить", + "mcp.enable_app": "Включить", + "mcp.reloading_status": "Перезагрузка MCP-серверов…", + "mcp.toggle_failed": "Не удалось обновить состояние включения MCP.", + "mcp.toggle_requires_server": "Подключитесь к серверу OpenWork, чтобы включать или отключать MCPs.", + "mcp.add_modal_subtitle": "Подключите собственный MCP-сервер по URL или локальной команде.", + "mcp.add_modal_title": "Добавить custom app", + "mcp.add_server_button": "Добавить app", + "mcp.advanced": "Дополнительно", + "mcp.advanced_settings": "Дополнительные настройки", + "mcp.advanced_settings_hint": "Редактируйте файлы конфигурации и управляйте подключениями вручную.", + "mcp.app_connected": "app подключено", + "mcp.apps_connected": "apps подключены", + "mcp.apps_subtitle": "Подключите ваши любимые инструменты, чтобы OpenWork мог использовать их от вашего имени.", + "mcp.apps_title": "Приложения", + "mcp.auth.already_connected": "Уже подключено", + "mcp.auth.already_connected_description": "{server} уже авторизован и готов к использованию.", + "mcp.auth.applying_changes_body": "Мы перезапускаем воркер, чтобы новый MCP был готов к авторизации.", + "mcp.auth.applying_changes_title": "Применение изменений перед входом", + "mcp.auth.authorization_link": "Ссылка авторизации", + "mcp.auth.authorization_still_required": "Авторизация все еще требуется. Попробуйте еще раз, чтобы перезапустить поток.", + "mcp.auth.callback_invalid": "Вставьте callback URL или параметр code, чтобы завершить OAuth.", + "mcp.auth.callback_label": "Callback URL или code", + "mcp.auth.callback_placeholder": "http://127.0.0.1:19876/mcp/oauth/callback?code=...", + "mcp.auth.cancel": "Отмена", + "mcp.auth.client_registration_required": "Перед продолжением OAuth требуется регистрация клиента.", + "mcp.auth.complete_connection": "Завершить подключение", + "mcp.auth.configured_previously": "MCP мог быть настроен глобально или в предыдущем сеансе. Вы можете закрыть это окно и сразу начать использовать инструменты MCP.", + "mcp.auth.connect_server": "Подключить {server}", + "mcp.auth.copied": "Скопировано", + "mcp.auth.copy_link": "Копировать ссылку", + "mcp.auth.done": "Готово", + "mcp.auth.failed_to_start_oauth": "Не удалось запустить поток OAuth", + "mcp.auth.follow_browser_steps": "Следуйте шагам авторизации в браузере.", + "mcp.auth.force_stop": "Принудительно остановить", + "mcp.auth.force_stopping": "Остановка...", + "mcp.auth.im_done": "Я закончил", + "mcp.auth.invalid_refresh_token": "OAuth refresh token недействителен или истек. Повторно авторизуйтесь, чтобы продолжить.", + "mcp.auth.manual_finish_hint": "Вставьте callback URL (localhost:19876) или просто код, чтобы завершить подключение.", + "mcp.auth.manual_finish_title": "Удаленный сервер?", + "mcp.auth.oauth_completed_reload": "OAuth завершен. Перезагрузите движок, чтобы активировать MCP.", + "mcp.auth.oauth_failed": "Авторизация OAuth не удалась.", + "mcp.auth.oauth_not_supported_hint": "Это может означать:\n• MCP-сервер не объявляет возможности OAuth\n• Движок нужно перезагрузить, чтобы обнаружить возможности сервера\n• Попробуйте: opencode mcp auth {server} из CLI", + "mcp.auth.open_browser_signin": "Мы откроем ваш браузер, чтобы завершить вход.", + "mcp.auth.port_forward_hint": "Подсказка: при необходимости пробросьте callback-порт: ssh -L 19876:127.0.0.1:19876 user@host", + "mcp.auth.reauth_action": "Повторно авторизовать OAuth", + "mcp.auth.reauth_cli_hint": "Запустите: opencode mcp auth {server}", + "mcp.auth.reauth_failed": "Повторная авторизация не удалась.", + "mcp.auth.reauth_remote_hint": "Повторно авторизуйтесь на машине, где запущен этот воркер.", + "mcp.auth.reauth_running": "Повторная авторизация...", + "mcp.auth.reload_blocked": "Перезагрузка приостановлена, пока идет сеанс. Остановите запуск, чтобы завершить настройку.", + "mcp.auth.reload_engine_retry": "Применить изменения и повторить", + "mcp.auth.reload_failed": "Не удалось перезагрузить воркер перед входом.", + "mcp.auth.reload_notice": "Чтобы это вступило в силу, OpenWork должен обновить сервис воркера. Это может прервать текущий сеанс.", + "mcp.auth.reload_remote_confirm": "Чтобы это вступило в силу, OpenWork должен обновить сервис воркера. Это может остановить текущий сеанс. Продолжить?", + "mcp.auth.reopen_browser_link": "Нажмите здесь, чтобы снова открыть браузер", + "mcp.auth.request_timed_out": "Время ожидания запроса истекло.", + "mcp.auth.retry": "Повторить", + "mcp.auth.retry_now": "Повторить сейчас", + "mcp.auth.server_disabled": "Этот MCP-сервер отключен. Включите его и попробуйте снова.", + "mcp.auth.step1_description": "Мы автоматически запустим поток входа для {server}.", + "mcp.auth.step1_title": "Открываем ваш браузер", + "mcp.auth.step2_description": "Войдите и подтвердите доступ, когда будет предложено.", + "mcp.auth.step2_title": "Авторизовать OpenWork", + "mcp.auth.step3_description": "Мы завершим подключение сразу после завершения авторизации.", + "mcp.auth.step3_title": "Вернитесь сюда, когда закончите", + "mcp.auth.try_reload_engine": "{message}. Сначала попробуйте перезагрузить движок.", + "mcp.auth.waiting_authorization": "Ожидание завершения авторизации в браузере...", + "mcp.auth.waiting_for_conversation_body": "Мы перенаправим вас на авторизацию как можно скорее.", + "mcp.auth.waiting_for_conversation_title": "Ожидание завершения разговора", + "mcp.auth.waiting_for_session": "Ожидание завершения работы {session}", + "mcp.available_apps": "Доступные приложения", + "mcp.cap_signin": "Вход в аккаунт", + "mcp.cap_tools": "AI tools", + "mcp.config_file": "Файл конфигурации", + "mcp.config_load_failed": "Не удалось загрузить файл конфигурации", + "mcp.config_not_loaded": "Еще не загружено", + "mcp.config_source": "Из конфигурации", + "mcp.configured": "настроено", + "mcp.connect": "Подключить", + "mcp.connect_failed": "Не удалось подключиться. Попробуйте еще раз.", + "mcp.connect_server_first": "Сначала подключитесь к серверу.", + "mcp.connected": "Подключено", + "mcp.connected_badge": "Подключено", + "mcp.connecting": "Подключение...", + "mcp.connection_failed": "Проблема с подключением — попробуйте еще раз", + "mcp.connection_type": "Подключение", + "mcp.control_chrome_browser_hint": "В Chrome 144 или новее сделайте сначала следующее:", + "mcp.control_chrome_browser_step_one": "Откройте chrome://inspect/#remote-debugging.", + "mcp.control_chrome_browser_step_two": "Включите remote debugging.", + "mcp.control_chrome_browser_step_three": "Разрешите входящие подключения для отладки, когда Chrome попросит.", + "mcp.control_chrome_browser_title": "1. Включите доступ к Chrome", + "mcp.control_chrome_connect": "Добавить Control Chrome", + "mcp.control_chrome_docs": "Официальное руководство MCP", + "mcp.control_chrome_edit": "Изменить настройки", + "mcp.control_chrome_profile_hint": "Control Chrome обычно открывает отдельный профиль Chrome. Включите это, если хотите, чтобы OpenWork использовал уже открытое вами окно Chrome.", + "mcp.control_chrome_profile_title": "2. Выберите, какой Chrome использовать", + "mcp.control_chrome_save": "Сохранить настройки", + "mcp.control_chrome_setup_subtitle": "Включите доступ к Chrome, затем выберите, должен ли OpenWork использовать свой чистый профиль или подключаться к уже используемому Chrome.", + "mcp.control_chrome_setup_title": "Настроить Control Chrome", + "mcp.control_chrome_toggle_hint": "Когда это включено, OpenWork добавляет --autoConnect, чтобы MCP подключался к экземпляру Chrome, который вы уже запустили.", + "mcp.control_chrome_toggle_label": "Использовать мой существующий профиль Chrome", + "mcp.control_chrome_toggle_off": "OpenWork запустит отдельный профиль Chrome только для автоматизации.", + "mcp.control_chrome_toggle_on": "OpenWork будет использовать ваши текущие вкладки, cookies и входы.", + "mcp.custom_app_cta_hint": "Подключите свой MCP-сервер, внутренний инструмент или hosted app.", + "mcp.desktop_required": "Для приложений требуется настольное приложение.", + "mcp.docs_link": "Узнать больше", + "mcp.file_not_found": "Файл конфигурации еще не создан", + "mcp.finish_setup": "Почти готово", + "mcp.finish_setup_hint": "Нажмите Activate, чтобы завершить подключение приложения.", + "mcp.friendly_status_issue": "Проблема", + "mcp.friendly_status_needs_signin": "Требуется вход", + "mcp.friendly_status_offline": "Не в сети", + "mcp.friendly_status_paused": "Приостановлено", + "mcp.friendly_status_ready": "Готово", + "mcp.last_synced": "Синхронизировано", + "mcp.login_action": "Войти", + "mcp.login_hint": "Подключите ваш аккаунт, чтобы завершить настройку этого приложения.", + "mcp.login_unavailable": "Это приложение не поддерживает вход из OpenWork.", + "mcp.logout_action": "Выйти", + "mcp.logout_failed": "Не удалось выйти.", + "mcp.logout_hint": "Удаляет сохраненные OAuth-учетные данные. Вам нужно будет войти снова.", + "mcp.logout_label": "OAuth", + "mcp.logout_modal_message": "Это удалит сохраненные OAuth-учетные данные для {server}. Вам нужно будет войти снова, чтобы использовать это приложение.", + "mcp.logout_modal_title": "Выйти из этого приложения?", + "mcp.logout_success": "Выполнен выход из {server}.", + "mcp.logout_working": "Выход...", + "mcp.name_required": "Введите имя сервера.", + "mcp.no_apps_hint": "Подключите одно из приложений выше, чтобы начать.", + "mcp.no_apps_yet": "Пока нет подключенных приложений", + "mcp.oauth": "Войти", + "mcp.oauth_optional_hint": "Использует OAuth в браузере для подключения вашего аккаунта.", + "mcp.oauth_optional_label": "Это приложение требует входа", + "mcp.one_click_connect": "Подключение в один клик", + "mcp.open_file": "Открыть файл", + "mcp.opening_label": "Открытие...", + "mcp.pick_workspace_error": "Сначала выберите папку рабочего пространства.", + "mcp.pick_workspace_first": "Сначала выберите папку рабочего пространства.", + "mcp.quick_connect_chrome_desc": "Управляйте вкладками Chrome с помощью браузерной автоматизации.", + "mcp.quick_connect_chrome_title": "Control Chrome", + "mcp.quick_connect_context7_desc": "Ищите документацию продукта с более богатым контекстом.", + "mcp.quick_connect_context7_title": "Context7", + "mcp.quick_connect_linear_desc": "Планируйте спринты и быстрее закрывайте задачи.", + "mcp.quick_connect_linear_title": "Linear", + "mcp.quick_connect_notion_desc": "Страницы, базы данных и проектная документация в синхронизации.", + "mcp.quick_connect_notion_title": "Notion", + "mcp.quick_connect_sentry_desc": "Отслеживайте релизы и устраняйте production-ошибки.", + "mcp.quick_connect_sentry_title": "Sentry", + "mcp.quick_connect_stripe_desc": "Проверяйте платежи, счета и подписки.", + "mcp.quick_connect_stripe_title": "Stripe", + "mcp.reload_banner_blocked_hint": "Остановите выполняющуюся задачу, чтобы активировать.", + "mcp.reload_banner_description": "Нажмите Activate, чтобы завершить подключение приложения.", + "mcp.reload_banner_description_blocked": "Идет задача. Сначала остановите ее, затем активируйте.", + "mcp.remote_workspace_url_hint": "Удаленные воркеры подключаются быстрее всего к MCP-серверам на основе URL.", + "mcp.remove_app": "Удалить", + "mcp.remove_failed": "Не удалось удалить приложение.", + "mcp.remove_modal_message": "Вы уверены, что хотите удалить {server}? Вы всегда сможете добавить его снова позже.", + "mcp.remove_modal_title": "Удалить приложение", + "mcp.reveal_config_failed": "Не удалось открыть файл конфигурации", + "mcp.reveal_in_finder": "Показать в Finder", + "mcp.scope_global": "Все рабочие пространства", + "mcp.scope_project": "Это рабочее пространство", + "mcp.server_command": "Команда", + "mcp.server_command_hint": "Команда shell для запуска сервера.", + "mcp.server_command_placeholder": "npx -y @modelcontextprotocol/server-sequential-thinking", + "mcp.server_name": "Имя приложения", + "mcp.server_name_placeholder": "github-copilot", + "mcp.server_type": "Тип", + "mcp.server_url": "URL сервера", + "mcp.server_url_placeholder": "https://api.githubcopilot.com/mcp/", + "mcp.sign_in_section_label": "Вход", + "mcp.tap_to_connect": "Нажмите, чтобы подключиться", + "mcp.technical_details": "Технические детали", + "mcp.type_cloud": "Cloud (войти через аккаунт)", + "mcp.type_local": "Локально (работает на этом устройстве)", + "mcp.type_local_cmd": "Локально (команда)", + "mcp.type_remote": "Удаленно (URL)", + "mcp.url_or_command_required": "Введите URL для удаленного сервера или команду для локального сервера.", + "mcp.your_apps": "Ваши приложения", + "message.tool_request_label": "Запрос", + "message.tool_result_label": "Результат", + "message.waiting_subagent": "Ожидание, пока придет транскрипт подагента.", + "message_list.copy_message": "Скопировать сообщение", + "message_list.open_session": "Открыть сеанс", + "message_list.step_updates_progress": "Обновления прогресса", + "message_list.subagent_loading_transcript": "Загрузка транскрипта", + "message_list.subagent_running": "Выполняется", + "message_list.subagent_session_fallback": "Сеанс подагента", + "message_list.subagent_type_task": "задача {agentType}", + "message_list.subagent_waiting_transcript": "Ожидание транскрипта", + "message_list.tool_checked_url": "Проверен {url}", + "message_list.tool_checked_web_fallback": "Проверена веб-страница", + "message_list.tool_delegate_agent": "Делегировать {agent}", + "message_list.tool_delegate_task_fallback": "Делегировать задачу", + "message_list.tool_load_skill_fallback": "Загрузить навык", + "message_list.tool_load_skill_named": "Загрузить навык {name}", + "message_list.tool_read_todo": "Прочитать список задач", + "message_list.tool_reviewed_file": "Проверен {file}", + "message_list.tool_reviewed_file_fallback": "Проверен файл", + "message_list.tool_reviewed_files_fallback": "Проверены файлы", + "message_list.tool_reviewed_path": "Проверен {path}", + "message_list.tool_run_command": "Запустить {command}", + "message_list.tool_run_command_fallback": "Запустить команду", + "message_list.tool_searched_code_fallback": "Поиск по коду", + "message_list.tool_searched_pattern": "Искал {pattern}", + "message_list.tool_update_file": "Обновить {file}", + "message_list.tool_update_file_fallback": "Обновить файл", + "message_list.tool_update_todo": "Обновить список задач", + "message_list.tool_updated_file": "Обновлен {file}", + "message_list.tool_updated_file_fallback": "Обновлен файл", + "model_behavior.desc_builtin": "Эта модель сама выбирает путь рассуждения и не показывает профили здесь.", + "model_behavior.desc_generic": "Используйте профиль {label}.", + "model_behavior.desc_high": "Потратьте больше времени на рассуждение перед ответом.", + "model_behavior.desc_high_anthropic": "Используйте стандартный бюджет extended-thinking.", + "model_behavior.desc_low": "Используйте более легкий проход рассуждений перед ответом.", + "model_behavior.desc_low_google": "Используйте более легкий бюджет рассуждений для более быстрых ответов.", + "model_behavior.desc_max": "Используйте самый глубокий профиль рассуждений провайдера.", + "model_behavior.desc_max_anthropic": "Используйте самый большой доступный бюджет extended-thinking.", + "model_behavior.desc_medium": "Сбалансируйте скорость и глубину рассуждений.", + "model_behavior.desc_minimal": "Используйте очень небольшой объем рассуждений.", + "model_behavior.desc_none": "Отдайте приоритет скорости и самому легкому пути рассуждений.", + "model_behavior.desc_standard": "Эта модель не показывает дополнительных настроек рассуждений.", + "model_behavior.label_balanced": "Сбалансированный", + "model_behavior.label_builtin": "Встроенный", + "model_behavior.label_deep": "Глубокий", + "model_behavior.label_extended": "Расширенный", + "model_behavior.label_fast": "Быстрый", + "model_behavior.label_light": "Легкий", + "model_behavior.label_maximum": "Максимальный", + "model_behavior.label_quick": "Быстрый", + "model_behavior.label_standard": "Стандартный", + "model_behavior.title_builtin_reasoning": "Встроенное рассуждение", + "model_behavior.title_extended_thinking": "Расширенное thinking", + "model_behavior.title_reasoning_budget": "Бюджет рассуждений", + "model_behavior.title_reasoning_effort": "Усилие рассуждений", + "model_behavior.title_standard_generation": "Стандартная генерация", + "model_picker.chat_model_desc": "Выберите модель для этого чата. Если модель поддерживает профили рассуждений, настройте их на ее карточке.", + "model_picker.chat_model_title": "Модель чата", + "model_picker.connect_provider_hint": "Подключите этого провайдера, чтобы просматривать и сохранять модели", + "model_picker.default_model_desc": "Выберите модель по умолчанию для новых чатов, затем донастройте профили рассуждений на ее карточке перед нажатием Done.", + "model_picker.default_model_title": "Модель по умолчанию", + "model_picker.model_count_one": "{count} модель", + "model_picker.model_count_few": "{count} модели", + "model_picker.model_count_many": "{count} моделей", + "model_picker.model_count_other": "{count} моделей", + "model_picker.more_providers": "Еще провайдеры", + "model_picker.no_results": "По вашему поиску нет моделей.", + "model_picker.other_connected_models": "Другие подключенные модели", + "model_picker.recommended": "Рекомендуется", + "onboarding.access_label": "Доступ", + "onboarding.add": "Добавить", + "onboarding.add_folder_path": "Добавить путь к папке", + "onboarding.advanced_settings": "Дополнительные настройки", + "onboarding.attach": "Подключить", + "onboarding.attach_description": "Подключиться к существующему сеансу на этом устройстве.", + "onboarding.authorize_folder": "Авторизовать папку", + "onboarding.back": "Назад", + "onboarding.checking_cli": "Проверка OpenCode CLI...", + "onboarding.choose_workspace_folder": "Выберите папку workspace", + "onboarding.cli_checking": "Проверка установки...", + "onboarding.cli_install_commands": "Установите OpenCode одной из команд ниже, затем перезапустите OpenWork.", + "onboarding.cli_label": "OpenCode CLI", + "onboarding.cli_needs_update": "Для serve требуется обновление OpenCode CLI.", + "onboarding.cli_not_found": "OpenCode CLI не найден.", + "onboarding.cli_not_found_hint": "Не найдено. Установите, чтобы запустить локальный сервер.", + "onboarding.cli_ready": "OpenCode CLI готов.", + "onboarding.cli_recheck": "Проверить еще раз", + "onboarding.cli_version": "OpenCode {version}", + "onboarding.cli_version_installed": "Установлено", + "onboarding.create_first_workspace": "Создайте свое первое workspace", + "onboarding.create_workspace": "Создать workspace", + "onboarding.engine_running": "Движок уже запущен", + "onboarding.getting_ready": "Подготавливаем все необходимое", + "onboarding.install": "Установить OpenCode", + "onboarding.install_instruction": "Установите OpenCode, чтобы включить локальный сервер (терминал не нужен).", + "onboarding.last_checked": "Последняя проверка {time}", + "onboarding.manage_access_hint": "Вы можете управлять доступом в advanced settings.", + "onboarding.open_settings": "Открыть Settings", + "onboarding.open_settings_hint": "Нужны параметры движка или доступа? Откройте Settings.", + "onboarding.pick": "Выбрать", + "onboarding.ready_message": "OpenCode готов запустить локальный сервер.", + "onboarding.remember_choice": "Запомнить мой выбор на следующий раз", + "onboarding.remote_workspace_action": "Подключиться", + "onboarding.remote_workspace_card_description": "Подключитесь к серверу OpenWork, чтобы получить доступ к общему workspace.", + "onboarding.remote_workspace_card_title": "Подключить удаленное workspace", + "onboarding.remote_workspace_description": "Подключитесь к серверу OpenWork, чтобы получить доступ к workspace из любого места.", + "onboarding.remote_workspace_title": "Подключиться к серверу OpenWork", + "onboarding.remove": "Удалить", + "onboarding.resolved_path": "Распознанный путь", + "onboarding.run_local": "Запустить локально", + "onboarding.run_local_description": "OpenWork запускает OpenCode локально и сохраняет вашу работу в приватности.", + "onboarding.search_notes": "Поиск заметок", + "onboarding.searching_host": "Подключение к серверу OpenWork...", + "onboarding.serve_help": "вывод serve --help", + "onboarding.show_search_notes": "Показать заметки поиска", + "onboarding.start": "Запустить OpenWork", + "onboarding.starting_host": "Запуск сервера OpenWork...", + "onboarding.theme_current": "Текущая: {mode}", + "onboarding.theme_dark": "Темная", + "onboarding.theme_label": "Тема", + "onboarding.theme_light": "Светлая", + "onboarding.theme_system": "Системная", + "onboarding.verifying": "Проверка защищенного handshake", + "onboarding.version": "Версия", + "onboarding.welcome_title": "Как вы хотите запустить OpenWork сегодня?", + "onboarding.windows_install_instruction": "Установите OpenCode для Windows, затем перезапустите OpenWork. Убедитесь, что opencode.exe находится в PATH.", + "onboarding.workspace_folder_label": "Workspace — это папка со своими навыками, плагинами и командами.", + "plugins.add": "Добавить", + "plugins.add_hint": "Введите названия npm-пакетов, например opencode-wakatime", + "plugins.add_label": "Добавить plugin", + "plugins.added": "Добавлено", + "plugins.config": "Конфиг", + "plugins.config_label": "Конфиг", + "plugins.desc": "Управляйте `opencode.json` для плагинов OpenCode вашего проекта или глобальных плагинов OpenCode.", + "plugins.empty": "Пока не настроено ни одного плагина.", + "plugins.enabled": "Включено", + "plugins.hide_setup": "Скрыть настройку", + "plugins.not_loaded": "Еще не загружено", + "plugins.not_loaded_yet": "Еще не загружено", + "plugins.remove": "Удалить", + "plugins.scope_global": "Глобально", + "plugins.scope_project": "Проект", + "plugins.setup": "Настройка", + "plugins.suggested": "Предложенные Plugins", + "plugins.suggested_heading": "Предложенные Plugins", + "plugins.title": "Плагины OpenCode", + "providers.api_key_label": "API key", + "providers.api_key_required": "Требуется API key", + "providers.auth_failed": "Ошибка аутентификации", + "providers.connect_failed": "Не удалось подключить провайдера", + "providers.disabled_in_config_suffix": "и отключил его в конфигурации OpenCode.", + "providers.disconnect_failed": "Не удалось отключить провайдера", + "providers.disconnected_prefix": "Отключено", + "providers.load_failed": "Не удалось загрузить провайдеров", + "providers.no_oauth_prefix": "Для не найден OAuth-поток", + "providers.no_providers_available": "Провайдеры недоступны", + "providers.not_connected": "Нет подключения к серверу", + "providers.not_oauth_flow_prefix": "Выбранный метод авторизации не является OAuth-потоком для", + "providers.oauth_failed": "Не удалось завершить OAuth", + "providers.oauth_method_required": "Требуется метод OAuth", + "providers.provider_error": "Ошибка провайдера ({provider})", + "providers.provider_id_required": "Требуется ID провайдера", + "providers.rate_limit_exceeded": "Превышен лимит запросов", + "providers.removal_unsupported": "Этот клиент не поддерживает удаление OAuth-авторизации провайдера.", + "providers.request_failed": "Запрос не выполнен", + "providers.save_api_key_failed": "Не удалось сохранить API key", + "providers.still_connected_suffix": ", но воркер по-прежнему сообщает, что подключен. Очистите оставшийся API key или OAuth-учетные данные и перезапустите воркер, чтобы полностью отключиться.", + "providers.unknown_provider": "Неизвестный провайдер", + "providers.use_api_key_suffix": "Используйте вместо этого API key.", + "question_modal.custom_answer_label": "Или введите свой ответ", + "question_modal.custom_answer_placeholder": "Введите ваш ответ здесь...", + "question_modal.question_counter": "Вопрос {current} из {total}", + "session.allow_for_session": "Разрешить для сеанса", + "session.allow_once": "Разрешить один раз", + "session.api_key_saved": "API key сохранен", + "session.attachments_add_token": "Добавьте токен сервера, чтобы прикреплять файлы.", + "session.attachments_connect_server": "Подключитесь к серверу OpenWork, чтобы прикреплять файлы.", + "session.back": "Назад", + "session.close_quick_actions": "Закрыть быстрые действия", + "session.close_search": "Закрыть поиск", + "session.cmd_compact_detail": "Отправить OpenCode компактную инструкцию для этого сеанса", + "session.cmd_compact_detail_empty": "Пока нет пользовательских сообщений для сжатия", + "session.cmd_compact_meta": "Сжать", + "session.cmd_compact_title": "Сжать разговор", + "session.cmd_current_workspace": "Текущее рабочее пространство", + "session.cmd_model_detail": "{model} · {variant}", + "session.cmd_model_fallback": "Модель", + "session.cmd_model_meta": "Открыть", + "session.cmd_model_title": "Изменить модель", + "session.cmd_new_session_detail": "Начать новую задачу в текущем рабочем пространстве", + "session.cmd_new_session_meta": "Создать", + "session.cmd_new_session_title": "Создать новый сеанс", + "session.cmd_provider_detail": "Открыть поток подключения провайдера", + "session.cmd_provider_meta": "Открыть", + "session.cmd_provider_title": "Подключить провайдера", + "session.cmd_rename_detail_fallback": "Дайте выбранному сеансу более понятное имя", + "session.cmd_rename_meta": "Переименовать", + "session.cmd_rename_title": "Переименовать текущий сеанс", + "session.cmd_sessions_detail": "{count} доступно во всех рабочих пространствах", + "session.cmd_sessions_meta": "Перейти", + "session.cmd_sessions_title": "Поиск сеансов", + "session.cmd_settings_meta": "Открыть", + "session.cmd_switch": "Переключить", + "session.palette_no_matches": "Совпадений нет.", + "session.compacted": "Сеанс сжат.", + "session.compacting": "Сжатие контекста сеанса...", + "session.compacting_auto": "OpenCode автоматически сжимает этот сеанс", + "session.compacting_manual": "OpenCode сжимает этот сеанс", + "session.compaction_finished": "OpenCode завершил сжатие контекста сеанса.", + "session.compaction_started": "OpenCode начал сжимать контекст сеанса.", + "session.conflict_sync_toast": "Конфликт синхронизации {path}. Локальные изменения сохранены в {conflictPath}.", + "session.connect_failed": "Подключение не удалось", + "session.connect_to_sync": "Подключитесь к серверу OpenWork, чтобы синхронизировать удаленные файлы.", + "session.create_or_connect_workspace": "Создайте или подключите рабочее пространство", + "session.create_workspace_desc": "Откройте мастер создания рабочего пространства и выберите, как хотите начать.", + "session.create_workspace_title": "Создать рабочее пространство", + "session.default_agent": "Агент по умолчанию", + "session.default_model": "Выберите модель", + "session.default_title": "Новый сеанс", + "session.delete": "Удалить", + "session.delete_named_session_message": "Это навсегда удалит \"{title}\" и его сообщения.", + "session.delete_session_generic": "Это навсегда удалит выбранный сеанс и его сообщения.", + "session.delete_session_title": "Удалить сеанс?", + "session.deleted": "Сеанс удален", + "session.deleting": "Удаление...", + "session.deny": "Запретить", + "session.details": "Подробности", + "session.details_label": "Подробности", + "session.doom_loop_label": "Doom Loop", + "session.doom_loop_message": "OpenCode обнаружил повторяющиеся вызовы инструментов с одинаковым входом и спрашивает, продолжать ли после повторяющихся сбоев.", + "session.doom_loop_note": "Отклоните, чтобы остановить цикл, или разрешите, если хотите, чтобы агент продолжал попытки.", + "session.doom_loop_repeated_call_label": "Повторный вызов", + "session.doom_loop_repeated_tool_call": "Повторный вызов инструмента", + "session.doom_loop_title": "Обнаружен Doom Loop", + "session.doom_loop_tool_label": "Инструмент", + "session.downloading": "Загрузка", + "session.downloading_percent": "Загрузка {percent}%", + "session.downloading_update_title": "Загрузка обновления {version}", + "session.export_already_running": "Экспорт уже выполняется.", + "session.export_desktop_only": "Экспорт доступен в настольном приложении.", + "session.export_desktop_only_local": "Экспорт доступен для локальных воркеров в настольном приложении.", + "session.export_local_only": "Экспорт поддерживается только для локальных воркеров.", + "session.failed_to_compact": "Не удалось сжать сеанс", + "session.failed_to_create_session": "Не удалось создать сеанс", + "session.failed_to_delete": "Не удалось удалить сеанс", + "session.failed_to_load_agents": "Не удалось загрузить агентов", + "session.failed_to_load_providers": "Не удалось загрузить провайдеров", + "session.failed_to_redo": "Не удалось повторить действие", + "session.failed_to_save_api_key": "Не удалось сохранить API key", + "session.failed_to_stop": "Не удалось остановить", + "session.failed_to_undo": "Не удалось отменить", + "session.file_open_desktop_only": "Открытие файлов доступно в настольном приложении.", + "session.file_open_failed": "Не удалось открыть файл", + "session.file_open_remote_unavailable": "Открытие файлов недоступно для удаленных рабочих пространств.", + "session.flyout_file_modified": "Файл изменен", + "session.flyout_new_task": "Новая задача", + "session.install_update": "Установить обновление", + "session.jump_to_latest": "Перейти к последнему", + "session.jump_to_start": "Перейти к началу сообщения", + "session.load_earlier": "Загрузить более ранние сообщения", + "session.loading_detail": "Подтягиваем последние сообщения для этой задачи.", + "session.loading_earlier": "Загрузка более ранних сообщений...", + "session.loading_session": "Загрузка сеанса", + "session.loading_title": "Загрузка сеанса", + "session.menu_label": "Меню", + "session.model": "Модель", + "session.model_fallback": "Модель", + "session.new_task": "Новая задача", + "session.next_match": "Следующее совпадение", + "session.no_matches": "Совпадений нет", + "session.no_matches_command": "Совпадений нет.", + "session.no_session_selected": "Сеанс не выбран", + "session.nothing_to_compact": "Пока нечего сжимать.", + "session.nothing_to_redo": "Нечего повторять.", + "session.nothing_to_retry": "Пока нечего повторять", + "session.nothing_to_undo": "Пока нечего отменять.", + "session.oauth_failed": "OAuth не удался", + "session.obsidian_worker_relative_only": "В Obsidian можно открывать только файлы, относительные для воркера.", + "session.open": "Открыть", + "session.palette_hint_navigate": "Стрелки для навигации", + "session.palette_hint_run": "Enter для запуска · Esc для закрытия", + "session.palette_placeholder_actions": "Поиск действий", + "session.palette_placeholder_sessions": "Найти по названию сеанса или рабочему пространству", + "session.palette_title_actions": "Быстрые действия", + "session.palette_title_sessions": "Поиск сеансов", + "session.permission_label": "Разрешение", + "session.permission_detail_command": "Команда", + "session.permission_detail_cwd": "Рабочий каталог", + "session.permission_detail_description": "Описание", + "session.permission_detail_diff": "Diff", + "session.permission_detail_files": "Файлы", + "session.permission_detail_file": "Файл", + "session.permission_detail_agent": "Агент", + "session.permission_detail_parent_directory": "Родительский каталог", + "session.permission_detail_path": "Путь", + "session.permission_detail_query": "Запрос", + "session.permission_detail_target": "Цель", + "session.permission_detail_tool": "Инструмент", + "session.permission_detail_url": "URL", + "session.permission_kind_edit": "Редактирование файла", + "session.permission_kind_external_directory": "Внешний каталог", + "session.permission_kind_question": "Вопрос", + "session.permission_kind_read": "Чтение файла", + "session.permission_kind_skill": "Навык", + "session.permission_kind_task": "Подзадача", + "session.permission_kind_todowrite": "Запись todo", + "session.permission_message": "OpenCode запрашивает разрешение на продолжение.", + "session.permission_message_bash": "Проверьте область команды перед тем, как разрешить OpenCode продолжить.", + "session.permission_message_edit": "Проверьте файл и diff перед тем, как разрешить OpenCode вносить изменения.", + "session.permission_message_external_directory": "Проверьте папку перед тем, как разрешить доступ вне workspace.", + "session.permission_message_read": "Проверьте запрашиваемую область файла перед тем, как разрешить доступ.", + "session.permission_message_task": "Проверьте запрашиваемую подзадачу перед тем, как разрешить ее запуск.", + "session.permission_metadata_unavailable": "Метаданные не удалось отобразить.", + "session.permission_required": "Требуется разрешение", + "session.permission_review_label": "Проверка", + "session.permission_scope_empty": "Явная область не указана.", + "session.permission_title_bash": "Выполнить shell-команду?", + "session.permission_title_edit": "Изменить файлы?", + "session.permission_title_external_directory": "Получить доступ к внешней папке?", + "session.permission_title_generic": "Одобрить {permission}?", + "session.permission_title_read": "Прочитать файлы?", + "session.permission_title_task": "Запустить подзадачу?", + "session.permission_decision_hint": "Разрешите один раз для этого запроса или разрешите для сеанса, если доверяете этой области.", + "session.phase_responding": "Ответ", + "session.phase_retrying": "Повторная попытка", + "session.phase_run_failed": "Запуск не удался", + "session.phase_sending": "Отправка", + "session.pick_folder_desc": "Выберите существующий проект или папку заметок, и OpenWork будет использовать ее как ваше workspace.", + "session.pick_folder_title": "Выберите папку, в которой хотите работать", + "session.pick_workspace_to_open": "Выберите workspace, чтобы открыть файлы.", + "session.prev_match": "Предыдущее совпадение", + "session.provider_auth_in_progress": "Аутентификация провайдера уже выполняется.", + "session.provider_connected": "Провайдер подключен", + "session.quick_actions_label": "Быстрые действия", + "session.quick_actions_title": "Быстрые действия (Ctrl/Cmd+K)", + "session.redo_aria_label": "Повторить последнее отмененное сообщение", + "session.redo_label": "Повторить", + "session.redo_title": "Повторить последнее отмененное сообщение", + "session.remote_sync_failed": "Не удалось синхронизировать удаленный файл", + "session.rename_description": "Обновите имя для этого сеанса.", + "session.rename_label": "Имя сеанса", + "session.rename_placeholder": "Введите новое имя", + "session.rename_title": "Переименовать сеанс", + "session.resize_workspace_column": "Изменить ширину колонки workspace", + "session.restart_update_title": "Перезапустить для применения обновления {version}", + "session.restored_message": "Восстановлено отмененное сообщение.", + "session.reveal": "Показать", + "session.reveal_desktop_only": "Показ доступен в настольном приложении.", + "session.revert_label": "Отменить", + "session.reverted_last_message": "Отменено последнее сообщение пользователя.", + "session.run": "Запустить", + "session.scope_label": "Область", + "session.search_conversation_label": "Поиск по разговору", + "session.search_conversation_title": "Поиск по разговору (Ctrl/Cmd+F)", + "session.search_next": "Следующее", + "session.search_placeholder": "Поиск в этом чате", + "session.search_position": "{current} из {total}", + "session.search_prev": "Предыдущее", + "session.select_or_create_session": "Выберите или создайте сеанс, чтобы начать.", + "session.share_active_cloud_org": "Активная Cloud org", + "session.share_choose_org": "Выберите организацию в Settings -> Cloud перед тем, как делиться с командой.", + "session.share_collaborator_hint": "Обычный удаленный доступ, когда вам не нужны действия только владельца.", + "session.share_collaborator_host_hint": "Обычный удаленный доступ к этому хосту без действий только владельца.", + "session.share_collaborator_label": "Токен соавтора", + "session.share_collaborator_token": "Токен соавтора", + "session.share_connected_with_hint": "Это рабочее пространство сейчас подключено с этим паролем.", + "session.share_desktop_app_required": "Требуется настольное приложение", + "session.share_desktop_required": "Требуется настольное приложение", + "session.share_host_url_and_token_required": "Требуются URL хоста OpenWork и токен.", + "session.share_local_host_not_ready": "Локальный хост OpenWork пока не готов.", + "session.share_missing_host_url": "Отсутствует URL хоста OpenWork.", + "session.share_missing_token": "Отсутствует токен OpenWork.", + "session.share_no_skills": "В этом рабочем пространстве не найдено навыков.", + "session.share_note_direct_runtime": "Удаленный доступ делит текущего локального воркера, который сейчас работает. Если вы позже переключите локальные папки, снова откройте эту панель, чтобы проверить URL и пароль.", + "session.share_opencode_base_url": "Базовый URL OpenCode", + "session.share_openwork_workers_only": "Ссылки сервиса общего доступа доступны только для воркеров OpenWork.", + "session.share_owner_permission_hint": "Используйте, когда удаленному клиенту нужно отвечать на запросы разрешений.", + "session.share_password": "Пароль", + "session.share_password_owner_hint": "Используйте, когда удаленному клиенту нужно отвечать на запросы разрешений.", + "session.share_publish_skills_failed": "Не удалось опубликовать набор навыков", + "session.share_publish_workspace_failed": "Не удалось опубликовать профиль workspace", + "session.share_resolve_local_workspace_failed": "Не удалось определить это workspace на локальном хосте OpenWork.", + "session.share_resolve_remote_workspace_failed": "Не удалось определить это workspace на хосте OpenWork.", + "session.share_save_team_template_failed": "Не удалось сохранить шаблон команды", + "session.share_saved_to_org": "Сохранено {name} в {org}.", + "session.share_select_workspace": "Сначала выберите workspace.", + "session.share_set_token_hint": "Установите токен в настройках workspace", + "session.share_sign_in_required": "Войдите в OpenWork Cloud в Settings, чтобы делиться с командой.", + "session.share_skills_set_desc": "Полный набор навыков из workspace OpenWork.", + "session.share_starting_server": "Запуск сервера...", + "session.share_team_fallback_name": "ваши шаблоны команды", + "session.share_url_resolving_hint": "URL воркера определяется; URL хоста показан как запасной вариант.", + "session.share_url_worker_hint": "Используйте на телефонах или ноутбуках, подключающихся к этому воркеру.", + "session.share_worker_url": "URL воркера", + "session.share_worker_url_phones_hint": "Используйте на телефонах или ноутбуках, подключающихся к этому воркеру.", + "session.share_worker_url_resolving_hint": "URL воркера определяется; URL хоста показан как запасной вариант.", + "session.shared_folder_upload_failed": "Не удалось загрузить в общую папку", + "session.status_active": "Сеанс активен", + "session.status_compacting": "Сжатие контекста", + "session.status_delegating": "Делегирование", + "session.status_gathering_context": "Сбор контекста", + "session.status_planning": "Планирование", + "session.status_ready": "Готово", + "session.status_ready_session": "Сеанс готов", + "session.status_running_shell": "Выполняется shell", + "session.status_searching_codebase": "Поиск по codebase", + "session.status_searching_web": "Поиск в web", + "session.status_thinking": "Размышление", + "session.status_working": "Работа", + "session.status_writing_file": "Запись файла", + "session.stopped": "Остановлено.", + "session.stopping_run": "Остановка запуска...", + "session.support_docs": "Открыть документацию", + "session.support_feedback": "Открыть отзывы", + "session.todo_label": "Задачи", + "session.todo_progress": "{completed} из {total} задач выполнено", + "session.todo_progress_label": "Прогресс", + "session.trying_again": "Повторяем попытку...", + "session.unable_to_open_file": "Не удалось открыть файл", + "session.unable_to_open_obsidian": "Не удалось открыть файл в Obsidian", + "session.unable_to_reveal": "Не удалось показать workspace", + "session.undo_label": "Отменить", + "session.undo_title": "Отменить последнее сообщение", + "session.untitled": "Без названия", + "session.update_available": "Доступно обновление", + "session.update_available_title": "Доступно обновление {version}", + "session.update_ready": "Обновление готово", + "session.update_ready_stop_runs_title": "Обновление готово {version}. Остановите активные запуски, чтобы перезапустить.", + "session.upload_connect_server": "Подключитесь к серверу OpenWork, чтобы загружать файлы в общую папку.", + "session.uploaded_to_shared_folder": "Загружено в общую папку.", + "session.uploaded_with_summary": "Загружено в общую папку: {summary}", + "session.uploading_to_shared_folder": "Загрузка {label} в общую папку...", + "session.workspace_fallback": "Рабочее пространство", + "session.workspace_label": "Рабочее пространство", + "session.workspace_path_unavailable": "Путь workspace недоступен.", + "session.workspace_setup_desc": "Начните с guided workspace OpenWork или выберите существующую папку, в которой хотите работать.", + "session.workspace_setup_label": "Настройка workspace", + "session.workspace_setup_title": "Настройте свое первое workspace", + "share.active_cloud_org": "Активная Cloud org", + "share.back_hint": "Назад к параметрам общего доступа", + "share.chooser_subtitle": "Выберите, как вы хотите поделиться этим рабочим пространством.", + "share.close_hint": "Закрыть", + "share.cloud_signin_note": "OpenWork Cloud открывается в вашем браузере и возвращается сюда после входа.", + "share.collaborator_hint": "Обычный доступ без подтверждений разрешений.", + "share.connect_messaging_desc": "Используйте это рабочее пространство из Slack, Telegram и других сервисов.", + "share.connect_messaging_title": "Подключить messaging", + "share.connection_details_label": "Подробности подключения", + "share.copy_hint": "Копировать", + "share.copy_link_hint": "Копировать ссылку", + "share.create_template_link": "Создать ссылку на шаблон", + "share.credentials_disabled_hint": "Включите удаленный доступ и нажмите Save, чтобы перезапустить воркер и показать live connection details для этого рабочего пространства.", + "share.field_password": "Пароль", + "share.field_worker_url": "URL воркера", + "share.hide_password": "Скрыть пароль", + "share.included_in_template": "Включено в этот шаблон", + "share.option_access_desc": "Покажите live connection details, необходимые для доступа к этому запущенному workspace с другого компьютера.", + "share.option_access_title": "Удаленный доступ к workspace", + "share.option_public_desc": "Создайте ссылку общего доступа, по которой любой сможет начать с этого шаблона.", + "share.option_public_title": "Публичный шаблон", + "share.option_team_title": "Поделиться с командой", + "share.option_template_desc": "Упакуйте эту настройку, чтобы кто-то другой мог начать с той же среды.", + "share.optional_collaborator": "Необязательный доступ соавтора", + "share.public_intro": "Поделитесь этим workspace как ссылкой на публичный шаблон.", + "share.publishing": "Публикация...", + "share.regenerate_link": "Сгенерировать ссылку заново", + "share.remote_access_desc": "Выключено по умолчанию. Включайте это только когда хотите, чтобы этот воркер был доступен с другого компьютера.", + "share.remote_access_disabled": "Удаленный доступ сейчас отключен.", + "share.remote_access_enabled": "Удаленный доступ сейчас включен.", + "share.remote_access_title": "Удаленный доступ", + "share.remote_save": "Сохранить", + "share.remote_save_busy": "Сохранение...", + "share.reveal_password": "Показать пароль", + "share.save_to_team": "Сохранить в команду", + "share.saving": "Сохранение...", + "share.setup": "Настройка", + "share.sign_in_to_share": "Войдите, чтобы делиться с командой", + "share.subtitle_access": "Покажите live connection details, необходимые для доступа к этому workspace с другого компьютера.", + "share.team_intro": "Сохраните этот шаблон в активной организации OpenWork Cloud, чтобы коллеги могли открыть его позже из настроек Cloud.", + "share.template_intro": "Поделитесь повторно используемой настройкой, не давая live-доступ к этому запущенному workspace.", + "share.template_item_config": "Команды и конфигурация", + "share.template_item_config_desc": "Повторно используемые команды плюс конфигурация OpenWork/OpenCode.", + "share.template_item_settings": "Настройки workspace", + "share.template_item_settings_desc": "Профиль общего workspace и поведение по умолчанию.", + "share.template_item_skills": "Включенные навыки", + "share.template_item_skills_desc": "Пользовательские навыки, сохраненные в этом workspace.", + "share.template_name_label": "Имя шаблона", + "share.title": "Поделиться workspace", + "share.view_access": "Доступ к workspace удаленно", + "share.warning_basic": "Делитесь только с доверенными людьми. Эти учетные данные дают live-доступ к этому workspace.", + "share.warning_full": "Эти учетные данные дают live-доступ к этому workspace. Общий доступ к workspace удаленно может позволить любому, у кого есть доступ к вашей сети, управлять вашим воркером.", + "share.workspace_fallback": "Рабочее пространство", + "share.workspace_template_desc": "Поделитесь базовой настройкой и настройками workspace по умолчанию.", + "share.workspace_template_title": "Шаблон workspace", + "share_skill_destination.add_to_workspace": "Добавить навык в workspace", + "share_skill_destination.adding": "Добавление навыка...", + "share_skill_destination.confirm_busy": "Добавление навыка...", + "share_skill_destination.confirm_button": "Добавить навык в workspace", + "share_skill_destination.connect_remote": "Подключить удаленное workspace", + "share_skill_destination.connect_remote_desc": "Подключите хост OpenWork, затем выберите его из списка, чтобы импортировать этот навык.", + "share_skill_destination.connect_remote_hint": "Подключите хост OpenWork, затем выберите его из списка, чтобы импортировать этот навык.", + "share_skill_destination.create_worker": "Создать новое workspace", + "share_skill_destination.create_worker_desc": "Откройте поток настройки workspace, а затем добавьте этот навык после того, как новое workspace будет готово.", + "share_skill_destination.create_worker_hint": "Откройте поток настройки workspace, а затем добавьте этот навык после того, как новое workspace будет готово.", + "share_skill_destination.current_badge": "Текущее", + "share_skill_destination.existing_workers": "Существующие рабочие пространства", + "share_skill_destination.fallback_skill_name": "Общий навык", + "share_skill_destination.footer_idle": "Выберите workspace, чтобы продолжить.", + "share_skill_destination.footer_selected": "Выбранное workspace:", + "share_skill_destination.local_badge": "Локально", + "share_skill_destination.more_options": "Еще варианты", + "share_skill_destination.new_destination": "Новое назначение", + "share_skill_destination.no_workers": "Пока нет готовых рабочих пространств. Создайте одно или подключите удаленное workspace, чтобы установить этот навык.", + "share_skill_destination.remote_badge": "Удаленно", + "share_skill_destination.sandbox_badge": "Песочница", + "share_skill_destination.selected_badge": "Выбрано", + "share_skill_destination.selected_hint": "Выбрано. Проверьте назначение ниже, затем подтвердите.", + "share_skill_destination.skill_label": "Общий навык", + "share_skill_destination.subtitle": "Выберите существующее workspace или создайте новое перед импортом этого общего навыка.", + "share_skill_destination.title": "Куда должен попасть этот навык?", + "share_skill_destination.trigger_label": "Триггер", + "sidebar.active": "Активно", + "sidebar.add_workspace": "Добавить новое workspace", + "sidebar.collapse": "Свернуть", + "sidebar.connect_remote": "Подключиться удаленно", + "sidebar.delete_session": "Удалить сеанс", + "sidebar.drag_reorder": "Перетащите, чтобы изменить порядок", + "sidebar.edit_connection": "Изменить подключение", + "sidebar.expand": "Развернуть", + "sidebar.import_config": "Импортировать конфигурацию", + "sidebar.needs_attention": "Требует внимания", + "sidebar.new_worker": "Новый воркер", + "sidebar.no_workspaces": "В этом сеансе пока нет рабочих пространств. Добавьте одно, чтобы начать.", + "sidebar.progress": "Прогресс", + "sidebar.show_fewer": "Показать меньше", + "sidebar.show_more": "Показать еще {count}", + "sidebar.stop_sandbox": "Остановить sandbox", + "sidebar.switch": "Переключить", + "sidebar.test_connection": "Проверить подключение", + "skills.add_custom_repo": "Добавить пользовательский GitHub-репозиторий", + "skills.add_git_repo": "Добавить git-репозиторий", + "skills.add_openwork_hub": "Добавить OpenWork Hub", + "skills.available_from_hub": "Доступно из Hub", + "skills.catalog_search_placeholder": "Поиск установленных, командных и hub-навыков", + "skills.cloud_add_skill": "Добавить навык", + "skills.cloud_choose_org_detail": "Используйте панель Cloud, чтобы выбрать активную организацию, затем обновите этот список.", + "skills.cloud_choose_org_hint": "Выберите организацию в Settings → Cloud, чтобы загрузить навыки команды.", + "skills.cloud_footer_label": "Команда", + "skills.cloud_hub_label": "Hub: {name}", + "skills.cloud_install_need_server": "Подключитесь к серверу OpenWork с доступом на запись навыков, чтобы установить навыки команды на этом воркере.", + "skills.cloud_installed": "Установлен {name} на этом воркере.", + "skills.cloud_installed_as": "Установлен как {name}", + "skills.cloud_installing": "Установка {title}…", + "skills.cloud_installing_short": "Установка", + "skills.cloud_no_search_matches": "По вашему поиску навыки не найдены.", + "skills.cloud_org_empty": "Пока нет доступных навыков организации.", + "skills.cloud_org_fallback": "OpenWork Cloud", + "skills.cloud_org_load_failed": "Не удалось загрузить навыки организации.", + "skills.cloud_refresh": "Обновить навыки команды", + "skills.cloud_section_subtitle": "Навыки, которыми с вами поделились через OpenWork Cloud — включая хабы навыков команды, к которым у вас есть доступ.", + "skills.cloud_section_title": "Из вашей организации", + "skills.cloud_shared_org": "Организация", + "skills.cloud_shared_private": "Приватный", + "skills.cloud_shared_public": "Публичный", + "skills.cloud_sign_in": "Войти в Cloud", + "skills.cloud_sign_in_hint": "Войдите в OpenWork Cloud, чтобы просматривать навыки команды и организации.", + "skills.cloud_status_installed": "Установлено", + "skills.cloud_status_update": "Доступно обновление", + "skills.cloud_update_skill": "Обновить", + "skills.cloud_updated": "Обновлен {name} на этом воркере.", + "skills.cloud_updating": "Обновление {title}…", + "skills.cloud_removed": "Удален локальный cloud-навык {name}.", + "skills.copy_link_failed": "Не удалось скопировать ссылку", + "skills.create_in_chat": "Создать навык в чате", + "skills.desktop_required": "Для управления навыками требуется настольное приложение.", + "skills.enter_plugin_name": "Введите название пакета плагина.", + "skills.failed_load_active": "Не удалось загрузить активные плагины.", + "skills.failed_load_opencode": "Не удалось загрузить opencode.json", + "skills.failed_parse_opencode": "Не удалось разобрать opencode.json", + "skills.failed_to_load": "Не удалось загрузить навыки", + "skills.failed_update_opencode": "Не удалось обновить opencode.json", + "skills.filter_all": "Все", + "skills.filter_cloud": "Команда", + "skills.filter_hub": "Hub", + "skills.filter_installed": "Установленные", + "skills.from_repo": "Из {owner}/{repo}", + "skills.github_repo_hint": "Введите GitHub-репозиторий в формате owner/repo.", + "skills.host_mode_only": "Только локальное рабочее пространство", + "skills.host_only_error": "Для управления навыками требуется локальное рабочее пространство или подключенный сервер OpenWork.", + "skills.hub_desc": "Просматривайте общие навыки из GitHub-backed хабов и добавляйте их в этого воркера.", + "skills.hub_label": "Hub", + "skills.import": "Импортировать", + "skills.import_failed": "Импорт не удался ({status})", + "skills.import_local": "Импортировать локальный навык", + "skills.import_local_hint": "Скопировать существующую папку навыка в это рабочее пространство.", + "skills.import_local_skill": "Импортировать локальный навык", + "skills.imported": "Импортировано.", + "skills.install": "Установить", + "skills.install_failed": "Не удалось установить навык.", + "skills.install_name_title": "Установить {name}", + "skills.install_skill_creator": "Установить Skill Creator", + "skills.install_skill_creator_hint": "Этот навык позволяет создавать другие навыки прямо из чата.", + "skills.installed": "Установленные навыки", + "skills.installed_desc": "Установленные навыки живут на этом воркере и могут быть отредактированы или переданы.", + "skills.installed_label": "Установленные", + "skills.installed_status": "Установлено", + "skills.installing": "Добавить навык", + "skills.installing_prefix": "Установка {name}…", + "skills.installing_skill_creator": "Установка Skill Creator...", + "skills.link_copied": "Ссылка скопирована", + "skills.loading": "Загрузка…", + "skills.no_description": "Описание пока отсутствует.", + "skills.no_hub_repo_label": "Hub-репозиторий не выбран", + "skills.no_hub_repo_selected": "Hub-навыки недоступны.", + "skills.no_hub_skills": "Hub-репозиторий не выбран. Добавьте GitHub-репозиторий, чтобы просматривать навыки.", + "skills.no_opencode_found": "opencode.json пока не найден. Добавьте плагин, чтобы создать его.", + "skills.no_opencode_workspace": "В этом рабочем пространстве пока нет opencode.json.", + "skills.no_skills": "Навыки не обнаружены в `.opencode/skills`, `.claude/skills` или `~/.agents/skills`.", + "skills.no_skills_found": "Пока навыки не найдены.", + "skills.owner_label": "Владелец", + "skills.owner_repo_required": "Требуются владелец и репозиторий.", + "skills.pick_project_first": "Сначала выберите папку проекта.", + "skills.pick_project_for_active": "Выберите папку проекта, чтобы загрузить активные плагины.", + "skills.pick_project_for_plugins": "Выберите папку проекта для управления плагинами проекта.", + "skills.pick_workspace_first": "Сначала выберите папку рабочего пространства.", + "skills.plugin_already_listed": "Плагин уже указан в opencode.json.", + "skills.plugin_management_host_only": "Управление плагинами требует настольного приложения.", + "skills.plugins_host_only": "Плагины доступны только в настольном приложении.", + "skills.ref_label": "Ref (ветка/тег/коммит)", + "skills.refresh": "Обновить", + "skills.refresh_hub": "Обновить Hub", + "skills.refresh_hub_title": "Обновить каталог Hub", + "skills.remove_saved_repo": "Удалить сохраненный репозиторий", + "skills.repo_label": "Репозиторий", + "skills.reveal_failed": "Не удалось открыть папку навыков.", + "skills.reveal_folder": "Открыть папку навыков", + "skills.reveal_folder_hint": "Открыть каталог навыка в Finder.", + "skills.save_and_load": "Сохранить и загрузить", + "skills.save_failed": "Не удалось сохранить навык.", + "skills.select_skill_folder": "Выберите папку навыка", + "skills.share_back": "Назад", + "skills.share_chooser_subtitle": "Сохраните в вашу организацию OpenWork Cloud или опубликуйте публичную ссылку установки.", + "skills.share_close": "Закрыть", + "skills.share_copy_link": "Копировать", + "skills.share_done": "Готово", + "skills.share_option_public_desc": "Создайте ссылку, по которой любой сможет установить этот навык.", + "skills.share_option_public_title": "Публичная ссылка", + "skills.share_option_team_desc": "Добавьте этот навык в активную организацию OpenWork Cloud.", + "skills.share_option_team_title": "Поделиться с командой", + "skills.share_public_create": "Создать ссылку", + "skills.share_public_creating": "Публикация…", + "skills.share_public_intro": "Опубликуйте публичную ссылку. Любой, у кого есть URL, сможет установить этот навык.", + "skills.share_public_regenerate": "Сгенерировать ссылку заново", + "skills.share_publisher_label": "Издатель", + "skills.share_subtitle_public": "Любой, у кого есть ссылка, сможет установить этот навык.", + "skills.share_subtitle_team": "Сохраняется в вашей организации для коллег.", + "skills.share_team_choose_org": "Выберите организацию в Settings → Cloud перед тем, как делиться с командой.", + "skills.share_team_permissions_intro": "Загрузите этот навык в активную организацию OpenWork Cloud и решите, кто сможет его видеть.", + "skills.share_team_permissions_label": "Права общего доступа", + "skills.share_team_permission_org": "Только организация - не в Hub", + "skills.share_team_permission_private": "Только для меня", + "skills.share_team_hub_label": "Добавить в skill hub (необязательно)", + "skills.share_team_hub_none": "Только организация — не в Hub", + "skills.share_team_hubs_loading": "Загрузка Hub...", + "skills.share_team_intro": "Сохраните этот навык в активной организации, чтобы коллеги могли установить его из Cloud.", + "skills.share_team_org_fallback": "Активная Cloud org", + "skills.share_team_save": "Сохранить в команду", + "skills.share_team_saving": "Сохранение…", + "skills.share_team_upload_and_save": "Загрузить и сохранить", + "skills.share_team_uploading": "Загрузка…", + "skills.share_team_sign_in": "Войти, чтобы делиться с командой", + "skills.share_team_sign_in_hint": "OpenWork Cloud откроется в вашем браузере. Вернитесь сюда после входа.", + "skills.share_team_success": "Сохранено в {org}. Коллеги смогут установить это из навыков вашей организации.", + "skills.share_team_uploaded_success": "Загружено в {org}. Cloud-навыки обновятся для вашего аккаунта.", + "skills.share_title": "Поделиться навыком", + "skills.shown_count": "Показано {count}", + "skills.skill_creator_already_installed": "Skill Creator уже установлен.", + "skills.skill_creator_installed": "Skill Creator установлен.", + "skills.skill_load_failed": "Не удалось загрузить навык.", + "skills.source_label": "Источник", + "skills.subtitle": "Управляйте навыками для этого рабочего пространства.", + "skills.title": "Навыки", + "skills.trigger_label": "Триггер: {trigger}", + "skills.uninstall": "Удалить", + "skills.uninstall_failed": "Не удалось удалить навык.", + "skills.uninstall_title": "Удалить навык?", + "skills.uninstall_warning": "Это навсегда удалит навык `{name}` из вашего рабочего пространства.", + "skills.uninstalled": "Навык удален.", + "skills.unknown_error": "Неизвестная ошибка", + "skills.worker_profile_desc": "Навыки — это основные возможности этого воркера. Находите их в Hub, управляйте установленными и создавайте новые прямо в чате.", + "status.back": "Назад к предыдущему экрану", + "status.connected": "Подключено", + "status.connecting": "Подключение", + "status.creating_task": "Создание новой задачи", + "status.creating_workspace": "Создание workspace", + "status.developer_mode": "Режим разработчика", + "status.disconnected": "Отключено", + "status.disconnected_hint": "Откройте настройки, чтобы переподключиться", + "status.disconnected_label": "Отключено", + "status.disconnecting": "Отключение", + "status.docs": "Документация", + "status.feedback": "Обратная связь", + "status.idle": "В ожидании", + "status.installing_opencode": "Установка OpenCode", + "status.limited_hint": "Переподключитесь, чтобы восстановить все возможности OpenWork", + "status.limited_mcp_hint": "{count} MCP подключено · переподключитесь для полных возможностей", + "status.limited_mode": "Ограниченный режим", + "status.live": "Live", + "status.loading_session": "Загрузка сеанса", + "status.mcp_connected": "{count} MCP подключено", + "status.open_docs": "Открыть документацию", + "status.openwork_ready": "OpenWork готов", + "status.providers_connected_one": "Подключён {count} провайдер", + "status.providers_connected_few": "Подключено {count} провайдера", + "status.providers_connected_many": "Подключено {count} провайдеров", + "status.providers_connected_other": "Подключено {count} провайдеров", + "status.ready_for_tasks": "Готов к новым задачам", + "status.reloading_engine": "Перезагрузка движка", + "status.restarting_engine": "Перезапуск движка", + "status.running": "Выполняется", + "status.send_feedback": "Отправить отзыв", + "status.settings": "Настройки", + "status.starting_engine": "Запуск движка", + "system.reload_body_agents": "OpenCode загружает агентов при запуске. Перезагрузите движок, чтобы обновленные агенты стали доступны.", + "system.reload_body_commands": "OpenCode загружает команды при запуске. Перезагрузите движок, чтобы обновленные команды стали доступны.", + "system.reload_body_config": "OpenCode читает opencode.json при запуске. Перезагрузите движок, чтобы применить изменения конфигурации.", + "system.reload_body_default": "OpenWork обнаружил изменения, требующие перезагрузки экземпляра OpenCode.", + "system.reload_body_mcp": "OpenCode загружает MCP-серверы при запуске. Перезагрузите движок, чтобы активировать новое подключение.", + "system.reload_body_mixed": "OpenWork обнаружил изменения конфигурации OpenCode. Перезагрузите движок, чтобы применить их.", + "system.reload_body_plugins": "OpenCode загружает npm-плагины при запуске. Перезагрузите движок, чтобы применить изменения opencode.json.", + "system.reload_body_skills": "OpenCode может кэшировать обнаружение и состояние навыков. Перезагрузите движок, чтобы новые навыки стали доступны.", + "system.reload_failed": "Не удалось перезагрузить движок.", + "system.reload_required": "Требуется перезагрузка", + "system.reload_unavailable": "Перезагрузка недоступна для этого воркера.", + "system.stop_active_runs_before_reset": "Остановите активные запуски перед сбросом.", + "time.hours_ago": "{count} ч назад", + "time.just_now": "только что", + "time.minutes_ago": "{count} мин назад", + "time.seconds_ago": "{count} с назад", + "welcome.title": "Добро пожаловать в OpenWork", + "welcome.subtitle": "Ваш компьютер, но он работает для вас.", + "welcome.get_started": "Начать", + "welcome.capability_spreadsheets": "Редактировать таблицы", + "welcome.capability_spreadsheets_desc": "Создавайте, очищайте и преобразуйте CSV- и Excel-файлы.", + "welcome.capability_browser": "Управлять браузером", + "welcome.capability_browser_desc": "Автоматизируйте Chrome для повторяющихся веб-задач.", + "welcome.capability_files": "Организовывать файлы", + "welcome.capability_files_desc": "Читать, записывать и управлять файлами и папками.", + "welcome.capability_automate": "Автоматизировать задачи", + "welcome.capability_automate_desc": "Создавайте повторно используемые рабочие процессы с навыками и командами.", + "welcome.capability_content": "Генерировать контент", + "welcome.capability_content_desc": "Создавайте черновики документов, писем и отчетов.", + "welcome.capability_apis": "Подключаться к API", + "welcome.capability_apis_desc": "Подключайтесь к внешним сервисам и инструментам через MCP.", + "welcome.folder_title": "Выберите папку", + "welcome.folder_explanation": "Эта папка станет вашим workspace. OpenWork сможет:", + "welcome.folder_read": "Читать файлы, которые вы туда поместите", + "welcome.folder_write": "Создавать и редактировать файлы для вас", + "welcome.folder_anything": "Работать с таблицами, документами, изображениями — с чем угодно в папке", + "welcome.folder_drop_hint": "Перетаскивайте файлы в любое время, и OpenWork сможет их подхватить.", + "workspace.create_workspace": "Создать рабочее пространство", + "workspace.empty_state_body": "Создайте или подключите рабочее пространство, чтобы начать.", + "workspace.loading_tasks": "Загрузка задач...", + "workspace.local_badge": "Локально", + "workspace.new_task_inline": "+ Новая задача", + "workspace.no_tasks": "Пока нет задач.", + "workspace.remote_badge": "Удаленно", + "workspace.rename_description": "Обновите имя, отображаемое в sidebar.", + "workspace.rename_label": "Имя рабочего пространства", + "workspace.rename_placeholder": "Рабочее пространство команды дизайна", + "workspace.rename_title": "Изменить имя рабочего пространства", + "workspace.sandbox_badge": "Sandbox", + "workspace.selected": "Выбрано", + "workspace.switch": "Переключить", + "workspace.switching_status_connecting": "Проверка подключения", + "workspace.switching_status_loading": "Загрузка последних задач", + "workspace.switching_status_preparing": "Подготовка", + "workspace.switching_subtitle": "Мы вернем вашу недавнюю работу.", + "workspace.switching_title": "Открытие {name}", + "workspace.switching_title_unknown": "Открытие workspace", + "workspace_list.add_workspace": "Добавить рабочее пространство", + "workspace_list.connect_remote": "Подключить удаленное рабочее пространство", + "workspace_list.connecting": "Подключение...", + "workspace_list.delete_session": "Удалить сеанс", + "workspace_list.desktop_only_hint": "Создавайте локальные рабочие пространства в настольном приложении.", + "workspace_list.edit_connection": "Изменить подключение", + "workspace_list.edit_name": "Изменить имя", + "workspace_list.hide_child_sessions": "Скрыть дочерние сеансы", + "workspace_list.import_config": "Импортировать конфигурацию", + "workspace_list.new_workspace": "Новое рабочее пространство", + "workspace_list.recover": "Восстановить", + "workspace_list.remove_confirm": "Удалить это рабочее пространство из sidebar? Сеансы и файлы на диске останутся сохранены.", + "workspace_list.remove_workspace": "Удалить рабочее пространство", + "workspace_list.rename_session": "Переименовать сеанс", + "workspace_list.reveal_explorer": "Показать в Explorer", + "workspace_list.reveal_finder": "Показать в Finder", + "workspace_list.session_actions": "Действия сеанса", + "workspace_list.share": "Поделиться...", + "workspace_list.show_child_sessions": "Показать дочерние сеансы", + "workspace_list.show_more": "Показать еще {count}", + "workspace_list.show_more_fallback": "Показать еще", + "workspace_list.test_connection": "Проверить подключение", + "workspace_list.workspace_fallback": "Рабочее пространство", + "workspace_list.workspace_options": "Параметры рабочего пространства", + "workspace_sidebar.close_sidebar": "Закрыть sidebar", + "workspace_sidebar.collapse_sidebar": "Свернуть sidebar", + "workspace_sidebar.configuration": "конфигурация", + "workspace_sidebar.expand_sidebar": "Развернуть sidebar", + "workspace_sidebar.extensions": "Расширения", + "workspace_sidebar.messaging": "Мессенджинг", + "settings.action_download": "Скачать", + "settings.action_install": "Установить", + "settings.actor_host": "хост", + "settings.actor_remote": "удаленный", + "settings.actor_unknown": "неизвестно", + "settings.advanced": "Дополнительно", + "settings.audit_actor_host": "хост", + "settings.audit_actor_remote": "удаленный", + "settings.advanced_title": "Дополнительно", + "settings.api_keys_info": "API-ключи OpenCode хранит локально. Провайдеров, завязанных на environment variables, нужно менять в окружении воркера, а затем перезагружать.", + "settings.appearance_hint": "Сопоставьте с системой или принудительно включите светлую/темную тему.", + "settings.appearance_title": "Внешний вид", + "settings.audit_error": "Ошибка", + "settings.audit_loading": "Загрузка", + "settings.audit_log_title": "Журнал аудита", + "settings.audit_ready": "Готово", + "settings.auto_compact": "Автосжатие контекста", + "settings.auto_compact_desc": "Управляет OpenCode compaction.auto для этого рабочего пространства. После изменения перезагрузите движок.", + "settings.auto_update_desc": "Загружать обновления автоматически (перед установкой будет запрашиваться подтверждение).", + "settings.auto_update_title": "Автообновление", + "settings.background_checks_desc": "OpenWork всегда проверяет наличие обновлений при запуске. Также раз в день выполняет фоновую проверку.", + "settings.background_checks_title": "Фоновые проверки", + "settings.base_url_unavailable": "Базовый URL недоступен", + "settings.binary_unavailable": "Бинарный файл недоступен", + "settings.cache_repair_requires_desktop": "Восстановление кэша требует настольного приложения", + "settings.cap_browser_tools": "Инструменты браузера: {value}", + "settings.cap_commands": "Команды: {value}", + "settings.cap_config": "Конфиг: {value}", + "settings.cap_file_tools": "Инструменты файлов: {value}", + "settings.cap_inbox_off": "входящие выкл.", + "settings.cap_inbox_on": "входящие вкл.", + "settings.cap_mcp": "MCP: {value}", + "settings.cap_outbox_off": "исходящие выкл.", + "settings.cap_outbox_on": "исходящие вкл.", + "settings.cap_plugins": "Плагины: {value}", + "settings.cap_read": "чтение", + "settings.cap_read_only": "только чтение", + "settings.cap_read_write": "чтение/запись", + "settings.cap_sandbox": "Песочница: {value}", + "settings.cap_skills": "Навыки: {value}", + "settings.cap_write": "запись", + "settings.cap_write_only": "только запись", + "settings.capabilities_title": "Возможности сервера OpenWork", + "settings.capabilities_unavailable": "Возможности недоступны. Подключитесь с токеном клиента.", + "settings.change": "Изменить", + "settings.check_update": "Проверить", + "settings.checking_for_updates": "Проверка обновлений", + "settings.choose": "Выбрать", + "settings.clear": "Очистить", + "settings.clipboard_unavailable": "Буфер обмена недоступен в этой среде.", + "settings.config_updated": "Конфигурация обновлена. Перезагрузите движок, если изменение влияет на OpenCode.", + "settings.configure": "Настроить", + "settings.connect_opencode_hint": "Подключитесь к OpenCode, чтобы загрузить провайдеров.", + "settings.connect_provider": "Подключить провайдера", + "settings.connection": "Подключение", + "settings.connection_failed": "Подключение не удалось", + "settings.connection_title": "Подключение", + "settings.copied_debug_report": "JSON runtime-отчета скопирован.", + "settings.copy_failed": "Не удалось скопировать runtime-отчет.", + "settings.copy_json": "Скопировать JSON", + "settings.custom_binary_hint": "Используйте это, чтобы указать OpenWork на локальную сборку OpenCode", + "settings.custom_binary_label": "Пользовательский бинарный файл OpenCode", + "settings.data_dir_unavailable": "Каталог данных недоступен", + "settings.debug_base_url": "Базовый URL: {url}", + "settings.debug_commit": "Коммит: {sha}", + "settings.debug_connect_url": "URL подключения: {url}", + "settings.debug_desktop_app": "Настольное приложение: {version}", + "settings.debug_hostname": "Имя хоста: {hostname}", + "settings.debug_lan_url": "LAN URL: {url}", + "settings.debug_mdns_url": "mDNS URL: {url}", + "settings.debug_opencode_version": "OpenCode: {version}", + "settings.debug_openwork_server_version": "Сервер OpenWork: {version}", + "settings.debug_pid": "PID: {pid}", + "settings.debug_port": "Порт: {port}", + "settings.debug_project_dir": "Каталог проекта: {path}", + "settings.debug_remote_access": "Удаленный доступ: {value}", + "settings.debug_runtime": "Среда выполнения: {runtime}", + "settings.debug_section_title": "Разработчик", + "settings.error": "Ошибка", + "settings.idle": "В ожидании", + "settings.loading": "Загрузка", + "settings.deeplink_failed": "Не удалось открыть deep link.", + "settings.deeplink_hint": "Принимает openwork://, openwork-dev:// или поддерживаемый raw URL https://share.openworklabs.com/b/...", + "settings.default_label": "По умолчанию", + "settings.default_model": "Модель по умолчанию", + "settings.delete_containers": "Удаление контейнеров...", + "settings.delete_local_config": "Удаление локального состояния...", + "settings.desktop_only_hint": "Доступно в настольном приложении.", + "settings.dev_mode_badge": "Режим dev", + "settings.developer": "Разработчик", + "settings.developer_mode_desc": "Включает инструменты отладки, диагностику и вкладку Developer.", + "settings.developer_mode_title": "Режим разработчика", + "settings.developer_panel_disabled": "Панель разработчика включена.", + "settings.developer_panel_enabled": "Панель разработчика включена.", + "settings.devtools_desc": "Состояние sidecar, возможности и журнал аудита.", + "settings.devtools_title": "Инструменты разработчика", + "settings.diag_approval": "Разрешение: {mode} ({ms}мс)", + "settings.diag_config_path": "Путь к конфигу: {path}", + "settings.diag_daemon_url": "Демон: {url}", + "settings.diag_default": "по умолчанию", + "settings.diag_health_port": "Порт health: {port}", + "settings.diag_healthy_ms": "Здорово: {ms}мс", + "settings.diag_host_token_source": "Источник host-токена: {source}", + "settings.diag_last_attempt": "Последняя попытка: {time}", + "settings.diag_load_sessions_ms": "Загрузка сеансов: {ms}мс", + "settings.diag_opencode_binary": "Бинарный файл OpenCode: {binary}", + "settings.diag_opencode_url": "OpenCode: {url}", + "settings.diag_pending_permissions_ms": "Ожидающие разрешения: {ms}мс", + "settings.diag_pid": "PID: {pid}", + "settings.diag_providers_ms": "Провайдеры: {ms}мс", + "settings.diag_read_only": "Только чтение: {value}", + "settings.diag_reason": "Причина: {reason}", + "settings.diag_runtime_workspace": "Runtime workspace: {id}", + "settings.diag_selected_workspace": "Выбранное workspace: {id}", + "settings.diag_sidecar": "Sidecar: {info}", + "settings.diag_started": "Запущено: {time}", + "settings.diag_token_source": "Источник токена: {source}", + "settings.diag_total_ms": "Итого: {ms}мс", + "settings.diag_version": "Версия: {version}", + "settings.diag_workspaces": "Рабочие пространства: {count}", + "settings.diagnostics_unavailable": "Диагностика недоступна.", + "settings.disable_developer_mode": "Отключить режим разработчика", + "settings.disabled": "Отключено", + "settings.disconnect": "Отключить", + "settings.disconnect_confirm_suffix": "Отключить {resolved}? Это удалит сохраненные API keys или OAuth-учетные данные для этого провайдера.", + "settings.disconnect_server": "Отключить сервер", + "settings.disconnected_prefix": "Отключено {resolved}.", + "settings.disconnecting": "Отключение...", + "settings.docker_containers_desc": "Принудительно удалить Docker-контейнеры, запущенные OpenWork", + "settings.docker_containers_title": "Docker-контейнеры OpenWork", + "settings.docker_requires_desktop": "Для очистки Docker требуется настольное приложение", + "settings.done": "Готово", + "settings.downloading_bytes": "Загрузка {downloaded}", + "settings.downloading_progress": "Загрузка {downloaded} / {total} ({percent}%)", + "settings.enable_developer_mode": "Включить режим разработчика", + "settings.enable_exa": "Включить веб-поиск Exa", + "settings.enable_exa_desc": "Вступит в силу при следующем запуске OpenCode через OpenWork. По умолчанию выключено.", + "settings.enabled": "Включено", + "settings.engine_bundled": "Встроенный (рекомендуется)", + "settings.engine_bundled_hint": "Встроенный движок — самый надежный вариант. Используйте System", + "settings.engine_custom_binary": "Пользовательский binary", + "settings.engine_desc": "Выберите, как локально запускается OpenCode.", + "settings.engine_runtime_label": "Среда выполнения движка", + "settings.engine_source": "Источник движка", + "settings.engine_source_debug": "Источник движка", + "settings.engine_system_path": "Системная установка (PATH)", + "settings.engine_title": "Движок", + "settings.exa_restart_hint": "Перезапустите OpenCode после изменения этой настройки.", + "settings.export": "Экспорт", + "settings.export_failed": "Не удалось экспортировать runtime-отчет.", + "settings.export_unavailable": "Экспорт недоступен в этой среде.", + "settings.exported_debug_report": "JSON runtime-отчета экспортирован.", + "settings.failed": "Ошибка", + "settings.failed_open_providers": "Не удалось открыть провайдеров", + "settings.feedback_badge": "Мы читаем каждое сообщение", + "settings.feedback_desc": "Расскажите, что вам нравится, а что вызывает трудности. Отзыв сразу попадает команде и помогает понять, что выпускать дальше.", + "settings.feedback_title": "Помогите сформировать OpenWork", + "settings.group_global": "Глобально", + "settings.group_workspace": "Рабочее пространство", + "settings.hide_titlebar": "Скрыть title bar", + "settings.hide_titlebar_desc": "Скрыть заголовок окна. Полезно для оконной раскладки", + "settings.join_discord": "Присоединиться к Discord", + "settings.language": "Язык", + "settings.language.description": "Выберите предпочитаемый язык", + "settings.last_error": "Последняя ошибка", + "settings.last_stderr": "Последний stderr", + "settings.last_stdout": "Последний stdout", + "settings.loading_providers": "Загрузка провайдеров...", + "settings.logs_on_host": "Журналы доступны на хосте.", + "settings.managed_by_env": "Управляется из env", + "settings.messaging_bridge_service": "Служба messaging bridge.", + "settings.messaging_section_desc": "Управляйте идентификаторами Telegram/Slack и привязками во вкладке Identities.", + "settings.messaging_section_title": "Мессенджинг", + "settings.model": "Модель", + "settings.model_behavior": "Поведение модели", + "settings.model_behavior_desc": "Откройте выбор модели по умолчанию, чтобы выбрать профили рассуждений, когда они доступны.", + "settings.model_default": "По умолчанию", + "settings.model_description": "Настройки по умолчанию + управление thinking для запусков.", + "settings.model_description_default": "Выбирайте из настроенных провайдеров. Этот выбор будет использоваться для новых сеансов.", + "settings.model_description_session": "Выбирайте из настроенных провайдеров. Этот выбор применяется к вашему следующему сообщению.", + "settings.model_fallback": "Модель", + "settings.model_reasoning": "Рассуждения", + "settings.model_section_desc": "Выберите модель чата по умолчанию и посмотрите, как она рассуждает.", + "settings.model_title": "Модель", + "settings.no_access": "нет доступа", + "settings.no_active_workspace": "Нет активного локального workspace.", + "settings.no_providers_connected": "Пока нет подключенных провайдеров.", + "settings.no_audit_entries": "Пока нет записей аудита.", + "settings.no_binary_selected": "Бинарный файл не выбран.", + "settings.no_custom_path_set": "Пользовательский путь не задан", + "settings.no_project_directory": "Каталог проекта не задан", + "settings.no_stderr": "stderr пока не перехвачен.", + "settings.no_stdout": "stdout пока не перехвачен.", + "settings.no_worker_directory": "Каталог проекта не задан", + "settings.no_worker_path": "Путь воркера недоступен", + "settings.nuke_confirm_dev": "Это необратимо. БУДЕТ удалены все данные OpenWork для этой dev-сборки и все изолированные dev-конфиги OpenCode, auth, cache, data и state, после чего OpenWork будет закрыт. Продолжить?", + "settings.nuke_confirm_prod": "Это необратимо. БУДЕТ удалены все данные OpenWork для этой dev-сборки и все изолированные dev-конфиги OpenCode, auth, cache, data и state, после чего OpenWork будет закрыт. Продолжить?", + "settings.nuke_failed": "Не удалось удалить состояние OpenWork и OpenCode.", + "settings.nuke_hint": "Используйте это только тогда, когда хотите полностью сбросить настольное приложение и состояние runtime OpenCode.", + "settings.nuke_success": "Состояние OpenWork и OpenCode удалено. OpenWork закрывается...", + "settings.off": "Выкл.", + "settings.offline": "Не в сети", + "settings.on": "Вкл.", + "settings.open_deeplink_action": "Открытие...", + "settings.open_deeplink_button": "Скрыть", + "settings.open_deeplink_desc": "Вставьте OpenWork deeplink или share URL, чтобы открыть его.", + "settings.open_deeplink_failed": "Не удалось открыть deeplink", + "settings.open_deeplink_title": "Открыть deeplink", + "settings.opencode_cache": "Кэш OpenCode", + "settings.opencode_cache_description": "Исправляет кэшированные данные, используемые для запуска движка. Безопасно для запуска.", + "settings.opencode_engine_desc": "Локальная среда выполнения для агентов, инструментов и провайдеров моделей.", + "settings.opencode_engine_label": "Движок OpenCode", + "settings.opencode_engine_sidecar": "Движок OpenCode", + "settings.opencode_engine_sidecar_desc": "Локальный процесс OpenCode, управляемый OpenWork.", + "settings.opencode_sdk_desc": "Связь browser → engine.", + "settings.opencode_sdk_title": "Ссылка OpenCode SDK", + "settings.opencode_section_label": "OpenCode", + "settings.opencode_url_unavailable": "Базовый URL недоступен", + "settings.opening": "Открытие deeplink", + "settings.openwork_config_sidecar_desc": "Локальный сервер OpenWork (Bun), который обслуживает approvals, audit и lifecycle OpenCode.", + "settings.openwork_diagnostics_title": "Диагностика сервера OpenWork", + "settings.openwork_server_desc": "Панель управления сеансом для синхронизации приложения, воркеров и удаленного доступа", + "settings.openwork_server_label": "Сервер OpenWork", + "settings.pending_permissions": "Ожидающие разрешения", + "settings.production_mode_badge": "Production", + "settings.provider_default_desc": "Используйте встроенное поведение модели по умолчанию для рассуждений.", + "settings.provider_default_label": "Провайдер по умолчанию", + "settings.provider_source_config": "Конфиг", + "settings.provider_source_custom": "Пользовательский", + "settings.provider_source_env": "Окружение", + "settings.providers_desc": "Подключайте сервисы для моделей и инструментов.", + "settings.providers_title": "Провайдеры", + "settings.quit_hint": "OpenWork сразу завершает работу после очистки, чтобы следующий запуск в этом режиме начинался с пустого локального состояния.", + "settings.recent_events": "Недавние события", + "settings.reconnect_failed": "Переподключение не удалось. Проверьте URL сервера/токен и попробуйте еще раз.", + "settings.reconnect_server": "Переподключение...", + "settings.reconnect_server_failed": "Не удалось переподключить сервер OpenWork.", + "settings.reconnected": "Переподключено к серверу OpenWork.", + "settings.reconnecting": "Переподключение...", + "settings.removing_containers": "Удаление контейнеров...", + "settings.removing_local_state": "Удаление локального состояния...", + "settings.repair_cache": "Восстановить кэш", + "settings.repairing_cache": "Восстановление кэша", + "settings.report_issue": "Сообщить о проблеме", + "settings.reset": "Сбросить", + "settings.reset_app_data": "Сбросить данные приложения", + "settings.reset_app_data_description": "Более агрессивно. Очищает кэш OpenWork + данные приложения.", + "settings.reset_app_data_title": "Сбросить данные приложения", + "settings.reset_app_data_warning": "Очищает кэш OpenWork и данные приложения на этом устройстве.", + "settings.reset_button": "Сбросить", + "settings.reset_cancel": "Отмена", + "settings.reset_config_defaults": "Сброс...", + "settings.reset_config_failed": "Не удалось сбросить конфигурацию приложения.", + "settings.reset_confirm_button": "Сбросить и перезапустить", + "settings.reset_confirmation_hint": "Введите {resetWord}, чтобы подтвердить. OpenWork будет перезапущен.", + "settings.reset_confirmation_label": "Подтверждение", + "settings.reset_confirmation_placeholder": "Введите RESET", + "settings.reset_onboarding": "Сбросить onboarding", + "settings.reset_onboarding_description": "Очищает настройки OpenWork и перезапускает приложение.", + "settings.reset_onboarding_title": "Сбросить onboarding", + "settings.reset_onboarding_warning": "Очищает локальные настройки OpenWork и маркеры onboarding workspace.", + "settings.reset_openwork_desc_dev": "При активном режиме dev это очищает только изолированное dev-состояние OpenCode внутри openwork-dev-data.", + "settings.reset_openwork_desc_prod": "При активном режиме dev это очищает только изолированное dev-состояние OpenCode внутри openwork-dev-data.", + "settings.reset_openwork_title": "Сбросить состояние OpenWork + OpenCode", + "settings.reset_recovery_desc": "Очистить данные или перезапустить поток настройки.", + "settings.reset_recovery_title": "Сброс и восстановление", + "settings.reset_requires_confirm": "Требует ввода RESET и перезапустит приложение.", + "settings.reset_startup": "Сбросить режим запуска по умолчанию", + "settings.reset_startup_pref": "Сбросить предпочтение запуска", + "settings.reset_stop_active_runs": "Остановите активные запуски перед сбросом.", + "settings.resetting": "Сброс...", + "settings.restart_blocked_message": "OpenWork нужно перезапустить, чтобы завершить это обновление. Чтобы не прерывать текущую работу, установка приостановлена, пока не завершатся активные запуски или вы не остановите их.", + "settings.restart_failed": "Перезапуск не удался. Проверьте журналы и попробуйте снова.", + "settings.restart_opencode": "Перезапустить OpenCode", + "settings.restart_openwork_server": "Перезапустить сервер OpenWork", + "settings.restart_server_failed": "Не удалось перезапустить локальный сервер.", + "settings.restarted": "Локальный сервер перезапущен.", + "settings.restarting": "Перезапуск…", + "settings.restart_succeeded_template": "Перезапущен {service}.", + "settings.restart_failed_template": "Не удалось перезапустить {service}.", + "settings.copy_logs": "Скопировать журналы", + "settings.copied_service_logs": "Журналы {service} скопированы.", + "settings.no_logs_captured": "Журналы пока не собраны.", + "settings.exported_developer_log": "Developer log экспортирован.", + "settings.developer_log_title": "Поток developer log", + "settings.developer_log_desc": "События приложения, workspace, сеансов и производительности, собираемые, пока включен режим разработчика.", + "settings.developer_log_count": "Показаны последние {count} сохраненных записей.", + "settings.developer_log_empty": "Developer logs пока не собраны.", + "settings.services_section_title": "Сервисы", + "settings.services_section_desc": "Локальные сервисы, которые обеспечивают работу этого сеанса OpenWork. У каждого сервиса есть собственный перезапуск и журналы.", + "settings.activity_section_title": "Активность", + "settings.activity_section_desc": "Журнал аудита и недавние события среды выполнения.", + "settings.tools_section_title": "Инструменты", + "settings.tools_section_desc": "Проверки и выбор бинарных файлов для диагностики локального выполнения.", + "settings.recovery_section_title": "Сброс и восстановление", + "settings.recovery_section_desc": "Откатите состояние без выхода из OpenWork.", + "settings.danger_section_title": "Опасная зона", + "settings.danger_section_desc": "Необратимые действия. Используйте только если понимаете последствия.", + "settings.clear_button": "Очистить", + "settings.copy_log_button": "Скопировать журнал", + "settings.export_log_button": "Экспортировать .log", + "settings.reveal_config": "Показать конфиг", + "settings.reveal_config_failed": "Не удалось показать конфиг workspace.", + "settings.reveal_config_requires_desktop": "Для показа конфигурации требуется настольное приложение", + "settings.revealed_workspace_config": "Конфиг workspace показан.", + "settings.run_sandbox_probe": "Запуск проверки...", + "settings.running_probe": "Запуск проверки...", + "settings.runtime_applies_hint": "Применится при следующем запуске или перезагрузке движка.", + "settings.runtime_debug_desc": "Читаемый диагностический снимок с экспортом в один клик.", + "settings.runtime_debug_title": "Отчет отладки среды выполнения", + "settings.runtime_desc": "Статус вашего локального движка и сервера OpenWork.", + "settings.runtime_direct": "Прямой (OpenCode)", + "settings.runtime_title": "Среда выполнения", + "settings.sandbox_error": "Ошибка", + "settings.sandbox_export_hint": "Используйте Export в отчете отладки Runtime выше, чтобы экспортировать диагностику.", + "settings.sandbox_probe_desc": "Запускает временную проверку старта Docker-песочницы и собирает результаты.", + "settings.sandbox_probe_errors": "Проверка песочницы завершилась с ошибками.", + "settings.sandbox_probe_failed": "Проверка песочницы не удалась.", + "settings.sandbox_probe_success": "Проверка песочницы успешно пройдена. Экспортируйте отчет для поддержки.", + "settings.sandbox_probe_title": "Проверка песочницы", + "settings.sandbox_ready": "Готово", + "settings.sandbox_requires_desktop": "Для проверки песочницы требуется настольное приложение", + "settings.sandbox_result": "Результат: {status}", + "settings.sandbox_run_id": "ID запуска: {id}", + "settings.sandbox_stop_runs_hint": "Остановите активные запуски перед проверкой", + "settings.search_models": "Поиск моделей…", + "settings.select_binary": "Выберите бинарный файл OpenCode", + "settings.select_workspace_first": "Сначала выберите локальное рабочее пространство, прежде чем показывать конфиг.", + "settings.send_feedback": "Отправить отзыв", + "settings.service_restarts_desc": "Перезапустите конкретный сервис. Результат показывается рядом с кнопкой, которую вы нажимаете.", + "settings.service_restarts_title": "Перезапуски сервисов", + "settings.session_model": "Модель", + "settings.show_model_reasoning": "Показывать рассуждения модели", + "settings.show_model_reasoning_desc": "Разворачивайте traces рассуждений в UI, когда модель их показывает.", + "settings.showing_models": "Показано {count} из {total}", + "settings.sidecar_config_unavailable": "Конфиг sidecar недоступен", + "settings.startup": "Запуск", + "settings.startup_local": "Запустить локальный сервер", + "settings.startup_not_set": "Подключиться к серверу", + "settings.startup_remote_warning": "Предпочтение запуска сейчас удаленное. Настройки движка", + "settings.startup_reset_hint": "Это очистит сохраненное предпочтение и покажет экран подключения", + "settings.startup_server": "Подключиться к серверу", + "settings.startup_title": "Запуск", + "settings.stop_local_server": "Остановить локальный сервер", + "settings.stop_runs_before_cleanup": "Остановите активные запуски перед очисткой", + "settings.stop_runs_before_reset_config": "Остановите активные запуски перед сбросом конфигурации", + "settings.stop_runs_to_reset": "Остановите активные запуски для сброса", + "settings.switch": "Переключить", + "settings.tab_advanced": "Дополнительно", + "settings.tab_appearance": "Внешний вид", + "settings.tab_cloud": "Cloud", + "settings.tab_debug": "Отладка", + "settings.tab_description_advanced": "Проверяйте состояние среды выполнения, состояние подключения и инструменты для разработчика.", + "settings.tab_description_appearance": "Настройте внешний вид OpenWork на уровне desktop, system theme и chrome приложения.", + "settings.tab_description_debug": "Просматривайте диагностику среды выполнения, журналы и низкоуровневые инструменты отладки.", + "settings.tab_description_den": "Управляйте подключением OpenWork Cloud, hosted workers и доступом к workspace.", + "settings.tab_description_extensions": "Управляйте MCP apps и OpenCode plugins для этого workspace.", + "settings.tab_description_general": "Подключайте провайдеров, выбирайте модель по умолчанию, авторизуйте папки и управляйте выбранным workspace OpenWork вместе с его подключением к среде выполнения.", + "settings.environment.add_button": "Добавить переменную", + "settings.environment.add_title": "Добавить переменную окружения", + "settings.environment.cancel": "Отмена", + "settings.environment.click_to_edit": "Нажмите, чтобы редактировать", + "settings.environment.confirm_delete": "Удалить {key}? После применения изменений агенты перестанут видеть этот ключ.", + "settings.environment.close_editor": "Закрыть редактор", + "settings.environment.delete": "Удалить", + "settings.environment.delete_title": "Удалить переменную окружения", + "settings.environment.delete_variable": "Удалить {key}", + "settings.environment.deleting": "Удаление…", + "settings.environment.description": "Сохраняйте API-ключи и токены для локальных агентов, навыков и MCP-серверов. Секреты остаются на этом устройстве; изменения станут доступны после применения.", + "settings.environment.edit_title": "Изменить переменную окружения", + "settings.environment.empty_body": "Добавьте такие ключи, как ANTHROPIC_API_KEY, GOOGLE_API_KEY, ELEVENLABS_API_KEY или GITHUB_TOKEN, для сервисов, которые нужны вашим агентам и MCP-серверам.", + "settings.environment.empty_title": "Пока нет переменных окружения", + "settings.environment.empty_value": "(пусто)", + "settings.environment.footer_hint": "Ключи OPENWORK_ и OPENCODE_ зарезервированы для связки приложения и runtime. Настраивайте параметры runtime OpenCode из shell.", + "settings.environment.override_hint": "Переменные окружения, заданные до запуска OpenWork, имеют приоритет над значениями, сохраненными здесь.", + "settings.environment.hide": "Скрыть", + "settings.environment.hide_value": "Скрыть значение для {key}", + "settings.environment.key_hint": "Буквы, цифры и подчеркивания. Не может начинаться с цифры.", + "settings.environment.key_label": "Ключ", + "settings.environment.loading": "Загрузка…", + "settings.environment.remote_workspace_hint": "Это workspace удаленное. Локальные переменные окружения здесь скрыты; используйте cloud LLM Providers или настройте host воркера напрямую.", + "settings.environment.apply_button": "Применить изменения", + "settings.environment.apply_blocked_active_tasks": "Остановите выполняющиеся задачи перед применением изменений окружения.", + "settings.environment.apply_confirm_body": "OpenWork перезапустит локальных агентов, чтобы они использовали актуальное окружение. Выполняющиеся локальные задачи могут остановиться.", + "settings.environment.apply_no_local_workspace": "OpenWork не подключен к локальному workspace.", + "settings.environment.apply_pending_body": "Примените изменения, чтобы перезапустить локальных агентов и сделать актуальные значения доступными.", + "settings.environment.apply_pending_body_manual": "Перезапустите локальных агентов, чтобы сделать актуальные значения доступными.", + "settings.environment.apply_pending_title": "Изменения сохранены, но пока не активны", + "settings.environment.apply_refresh_failed": "Изменения активны, но статус OpenWork не обновился. Если выглядит устаревшим, перезапустите приложение.", + "settings.environment.apply_success": "Изменения окружения активны.", + "settings.environment.apply_title": "Применить изменения окружения?", + "settings.environment.apply_unavailable": "Применение изменений доступно только в настольном приложении.", + "settings.environment.applying": "Применение…", + "settings.environment.restart_required": "Сохранено. Примените изменения, чтобы обновление стало доступно.", + "settings.environment.reveal": "Показать", + "settings.environment.reveal_value": "Показать значение для {key}", + "settings.environment.save": "Сохранить", + "settings.environment.saving": "Сохранение…", + "settings.environment.title": "Переменные окружения", + "settings.environment.validation_duplicate": "Переменная с таким именем уже существует.", + "settings.environment.validation_empty": "Требуется имя.", + "settings.environment.validation_reserved": "Имена OPENWORK_ и OPENCODE_ управляются OpenWork/OpenCode.", + "settings.environment.validation_shape": "Используйте буквы, цифры и подчеркивания; не начинайте с цифры.", + "settings.environment.value_label": "Значение", + "settings.tab_description_environment": "Сохраняйте API-ключи и токены для локальных агентов, навыков и MCP-серверов. Секреты остаются на этом устройстве.", + "settings.tab_description_messaging": "Настраивайте router identities и поведение inbox из настроек workspace.", + "settings.tab_description_model": "Настраивайте модель по умолчанию, поведение среды выполнения и параметры вывода assistant.", + "settings.tab_description_recovery": "Исправляйте состояние миграции, сбрасывайте значения workspace по умолчанию и восстанавливайте локальные настройки.", + "settings.tab_description_skills": "Просматривайте, редактируйте и устанавливайте навыки, не выходя из settings.", + "settings.tab_description_updates": "Поддерживайте приложение актуальным с тихими фоновыми проверками и управлением установкой.", + "settings.tab_environment": "Окружение", + "settings.tab_extensions": "Расширения", + "settings.tab_general": "Настройки", + "settings.tab_messaging": "Мессенджинг", + "settings.tab_model": "Модель", + "settings.tab_recovery": "Восстановление", + "settings.tab_skills": "Навыки", + "settings.tab_updates": "Обновления", + "settings.theme_dark": "Темная", + "settings.theme_light": "Светлая", + "settings.theme_system": "Системная", + "settings.theme_system_hint": "Системный режим автоматически следует предпочтениям вашей ОС.", + "settings.toolbar_ready_to_install": "Готово к установке", + "settings.update": "Обновить", + "settings.update_available": "Доступно обновление: v", + "settings.update_available_version": "Доступно обновление: v{version}", + "settings.update_check_button": "Проверить", + "settings.update_check_failed": "Проверка обновления не удалась", + "settings.update_checking": "Проверка...", + "settings.update_download_button": "Скачать", + "settings.update_downloading": "Скачивание...", + "settings.update_error": "Проверка обновления не удалась", + "settings.update_install_button": "Установить и перезапустить", + "settings.update_last_checked": "Последняя проверка {time}", + "settings.update_published": "Опубликовано {date}", + "settings.update_ready": "Готово к установке: v", + "settings.update_ready_version": "Готово к установке: v{version}", + "settings.update_uptodate": "Актуально", + "settings.updates": "Обновления", + "settings.updates_desc": "Поддерживайте OpenWork в актуальном состоянии.", + "settings.updates_desktop_only": "Обновления доступны только в настольном приложении.", + "settings.updates_not_supported": "Обновления не поддерживаются в этой среде.", + "settings.updates_title": "Обновления", + "settings.version": "Версия", + "settings.versions_desc": "Информация о sidecar и сборке desktop.", + "settings.versions_title": "Версии", + "settings.window_appearance_desc": "Настройте внешний вид окна.", + "settings.worker_id_label": "Воркер {id}", + "settings.worker_unresolved": "Воркер {runtimeWorkspaceId}", + "settings.workspace_config_desc": ".opencode/openwork.json", + "settings.workspace_config_title": "Конфигурация workspace", + "settings.workspace_debug_events_label": "События отладки workspace", + "settings.workspace_fallback_name": "Рабочее пространство", + "action.remove": "Удалить", + "den.active_org_hint": "Cloud-воркеры привязаны к выбранной организации.", + "den.active_org_title": "Активная организация", + "den.auto_reconnect_hint": "Завершите авторизацию в браузере, и OpenWork переподключится сюда автоматически.", + "den.checking_session": "Проверка сеанса", + "den.choose_org_for_providers": "Выберите организацию, чтобы просматривать cloud-провайдеров.", + "den.choose_org_for_skills": "Выберите организацию, чтобы просматривать cloud-навыки.", + "den.choose_org_for_skill_hubs": "Выберите организацию, чтобы просматривать cloud skill hubs.", + "den.cloud_account_hint": "Управляйте подключенным аккаунтом и организацией.", + "den.cloud_account_title": "Cloud-аккаунт", + "den.cloud_control_plane_open": "Открыть в браузере", + "den.cloud_control_plane_reset": "Сбросить", + "den.cloud_control_plane_save": "Сохранить URL", + "den.cloud_control_plane_url_hint": "Только для режима разработчика. Используйте это, чтобы указать локальный или self-hosted Cloud control plane. При изменении вы выйдете из системы, чтобы приложение могло заново инициализироваться через новый control plane.", + "den.cloud_control_plane_url_label": "URL Cloud control plane", + "den.cloud_provider_detail": "{count} моделей · провайдер {source}", + "den.cloud_provider_removed_detail": "Этот импортированный провайдер больше не доступен в Cloud. Удалите локальную конфигурацию {providerId}.", + "den.cloud_provider_sync_detail": "Провайдер Cloud изменился. Синхронизируйте конфиг {count} модели {source} в opencode.jsonc.", + "den.cloud_skill_detail": "Установите этот cloud-навык в .opencode/skills.", + "den.cloud_skill_imported_detail": "Локально установлен как {name}.", + "den.cloud_skill_removed_detail": "Этот cloud-навык был удален upstream. Удалите локальную копию {name}.", + "den.cloud_skill_sync_detail": "Доступна более новая cloud-версия для {name}. Обновите локальную копию, чтобы оставаться в sync.", + "den.cloud_skills_hint": "Просматривайте отдельные cloud-навыки, к которым у вас есть доступ, устанавливайте их локально и обновляйте, когда удаленная версия меняется.", + "den.cloud_skills_title": "Skills", + "den.cloud_providers_hint": "Импортируйте управляемых LLM-провайдеров в opencode.jsonc и используйте учетные данные организации в этом workspace.", + "den.cloud_providers_title": "Cloud providers", + "den.cloud_section_desc": "Войдите, выберите организацию и откройте Cloud-воркеры.", + "den.cloud_section_title": "OpenWork Cloud", + "den.cloud_sleep_hint": "Войдите в OpenWork Cloud, чтобы ваши задачи продолжали работать даже когда компьютер уходит в sleep.", + "den.cloud_workers_hint": "Открывайте воркеры напрямую в OpenWork, используя тот же поток remote-connect, который приложение уже использует в других местах.", + "den.cloud_workers_title": "Cloud workers", + "den.create_account": "Создать аккаунт", + "den.credentials_ready_badge": "Учетные данные готовы", + "den.error_base_url": "Введите допустимый Cloud control plane URL с http:// или https://.", + "den.error_choose_org": "Выберите организацию перед открытием воркера.", + "den.error_load_orgs": "Не удалось загрузить организации.", + "den.error_load_skills": "Не удалось загрузить cloud-навыки.", + "den.error_load_workers": "Не удалось загрузить воркеры.", + "den.error_no_session": "Активная Cloud-сессия не найдена.", + "den.error_no_token": "Вход в настольном приложении завершен, но OpenWork Cloud не вернул токен сеанса.", + "den.error_open_worker": "Не удалось открыть {name} в OpenWork.", + "den.error_open_worker_fallback": "Не удалось открыть {name}.", + "den.error_paste_valid_code": "Вставьте корректную ссылку входа OpenWork или одноразовый код входа.", + "den.error_signin_failed": "Не удалось завершить вход в OpenWork Cloud.", + "den.error_worker_not_ready": "Воркер пока не готов к открытию. Попробуйте еще раз после завершения provisioning.", + "den.finish_signin": "Завершить вход", + "den.finishing": "Завершение...", + "den.hide_signin_code": "Скрыть код входа", + "den.import_all": "Импортировать все", + "den.import_skill": "Установить", + "den.import_skill_failed": "Не удалось установить {name}.", + "den.import_provider": "Импортировать", + "den.import_provider_failed": "Не удалось импортировать {name}.", + "den.imported_badge": "Импортировано", + "den.imported_provider": "Импортирован {name}.", + "den.importing": "Импорт...", + "den.needs_attention": "Требует внимания", + "den.no_cloud_providers": "Для этой организации пока нет доступных cloud-провайдеров.", + "den.no_cloud_skills": "Для этой организации пока нет доступных cloud-навыков.", + "den.no_cloud_workers": "Для этой организации пока не видно cloud-воркеров. Создайте один в Cloud, затем обновите эту вкладку.", + "den.no_org_selected": "Организация не выбрана", + "den.no_skill_hubs": "Для этой организации пока нет доступных cloud skill hubs.", + "den.open": "Открыть", + "den.opening": "Открытие...", + "den.org_member_suffix": "(Участник)", + "den.org_owner_suffix": "(Владелец)", + "den.org_switched": "Переключено на {name}.", + "den.out_of_sync_badge": "Не синхронизировано", + "den.private_badge": "Приватный", + "den.paste_signin_code": "Вставить код входа", + "den.refresh": "Обновить", + "den.reload_workspace": "Перезагрузите workspace, чтобы применить изменения конфига.", + "den.remove_provider_failed": "Не удалось удалить {name}.", + "den.remove_skill_failed": "Не удалось удалить {name}.", + "den.removed_from_cloud_badge": "Удалено из Cloud", + "den.removed_provider": "Удален {name}.", + "den.removing": "Удаление...", + "den.sign_out": "Выйти", + "den.signed_out": "Вы вышли", + "den.signin_button": "Войти", + "den.signin_code_note": "Принимает ссылку openwork://den-auth или raw одноразовый grant.", + "den.signin_link_hint": "Если браузер не возвращает вас в OpenWork автоматически, вставьте сюда ссылку входа или одноразовый код из OpenWork Cloud.", + "den.signin_link_label": "Ссылка входа или одноразовый код", + "den.signin_link_placeholder": "openwork://den-auth?... или вставленный код", + "den.signin_title": "Войти в OpenWork Cloud", + "den.signing_in": "Завершение входа в OpenWork Cloud...", + "den.signing_out": "Выполняется выход...", + "den.skill_hub_detail": "Импортируйте {count} общих навыков в .opencode/skills.", + "den.skill_hub_imported_detail": "Импортировано {count} навыков в это workspace.", + "den.skill_hub_removed_detail": "Этот hub был удален из Cloud. Удалите из этого workspace {importedCount} импортированных навыков.", + "den.skill_hub_skills_badge": "{count} навыков", + "den.skill_hub_sync_detail": "В Cloud теперь {liveCount} навыков; в этом workspace импортировано {importedCount}. Синхронизируйте, чтобы обновить установленный набор.", + "den.skill_hubs_hint": "Импортируйте все навыки из общего cloud hub в это workspace за один шаг.", + "den.skill_hubs_title": "Skill hubs", + "den.status_base_url_updated": "URL Cloud control plane обновлен. Войдите снова, чтобы продолжить.", + "den.status_browser_signin": "Завершите вход в браузере, чтобы подключить OpenWork.", + "den.status_browser_signup": "Завершите создание аккаунта в браузере, чтобы подключить OpenWork.", + "den.status_cloud_signed_in_as": "Подключено к OpenWork Cloud как {email}.", + "den.status_cloud_signin_done": "Подключено к OpenWork Cloud.", + "den.status_loaded_orgs_one": "Загружена {count} организация.", + "den.status_loaded_orgs_few": "Загружено {count} организации.", + "den.status_loaded_orgs_many": "Загружено {count} организаций.", + "den.status_loaded_orgs_other": "Загружено {count} организаций.", + "den.status_loaded_skills_one": "Загружен {count} облачный навык для {name}.", + "den.status_loaded_skills_few": "Загружено {count} облачных навыка для {name}.", + "den.status_loaded_skills_many": "Загружено {count} облачных навыков для {name}.", + "den.status_loaded_skills_other": "Загружено {count} облачных навыков для {name}.", + "den.status_loaded_workers_one": "Загружен {count} воркер для {name}.", + "den.status_loaded_workers_few": "Загружено {count} воркера для {name}.", + "den.status_loaded_workers_many": "Загружено {count} воркеров для {name}.", + "den.status_loaded_workers_other": "Загружено {count} воркеров для {name}.", + "den.status_no_skills": "Для {name} cloud-навыки не найдены.", + "den.status_no_workers": "Для {name} воркеры не найдены.", + "den.status_opened_worker": "Открыт {name} в OpenWork.", + "den.status_signed_in_as": "Вошли как {email}.", + "den.status_signed_out": "Вы вышли и очистили сеанс OpenWork Cloud на этом устройстве.", + "den.sync": "Синхронизировать", + "den.sync_provider_failed": "Не удалось синхронизировать {name}.", + "den.sync_skill_failed": "Не удалось обновить {name}.", + "den.synced_provider": "Синхронизирован {name}.", + "den.syncing": "Синхронизация...", + "den.installed_name_badge": "Локально: {name}", + "den.uninstall": "Удалить", + "den.worker_mine_badge": "Мой", + "den.worker_not_ready_title": "Этот воркер пока не готов к открытию.", + "den.worker_provider_label": "{provider} воркер", + "den.worker_secondary_cloud": "Cloud-воркер", + "extensions.app_count_one": "{count} приложение подключено", + "extensions.app_count_few": "{count} приложения подключено", + "extensions.app_count_many": "{count} приложений подключено", + "extensions.app_count_other": "{count} приложений подключено", + "extensions.apps_mcp_header": "Приложения (MCP)", + "extensions.filter_all": "Все", + "extensions.filter_apps": "Приложения", + "extensions.filter_plugins": "Плагины", + "extensions.plugin_count_one": "{count} плагин", + "extensions.plugin_count_few": "{count} плагина", + "extensions.plugin_count_many": "{count} плагинов", + "extensions.plugin_count_other": "{count} плагинов", + "extensions.plugins_opencode_header": "Плагины (OpenCode)", + "extensions.subtitle": "Приложения (MCP) и плагины OpenCode собраны в одном месте.", + "extensions.title": "Расширения", +} as const; diff --git a/scripts/i18n-audit.mjs b/scripts/i18n-audit.mjs index 3ff64faf8..41bbaf91d 100644 --- a/scripts/i18n-audit.mjs +++ b/scripts/i18n-audit.mjs @@ -27,13 +27,17 @@ const REPO_ROOT = resolve(__dirname, ".."); const LOCALES_DIR = join(REPO_ROOT, "apps/app/src/i18n/locales"); const APP_SRC = join(REPO_ROOT, "apps/app/src"); -const LOCALES = ["ja", "zh", "vi", "pt-BR", "th", "fr", "ca", "es"]; +const LOCALES = ["ja", "zh", "vi", "pt-BR", "th", "fr", "ca", "es", "ru"]; const EN_FILE = join(LOCALES_DIR, "en.ts"); const PLURAL_SUFFIXES = ["zero", "one", "two", "few", "many", "other"]; const PLURAL_SUFFIX_RE = /_(zero|one|two|few|many|other)$/; const stripPluralSuffix = (key) => key.replace(PLURAL_SUFFIX_RE, ""); +// Directory names skipped during the source scan. The "locales" dir is intentionally +// skipped; otherwise translation keys will trivially match themselves. +const SKIP_DIRS = ["locales", "node_modules", "target", "dist", "build", "out", "coverage"]; + const mode = process.argv[2] ?? "--all"; const isCi = mode === "--ci"; const isAll = mode === "--all" || isCi; @@ -159,27 +163,33 @@ if (shouldRun("--missing")) { console.log(); } +// Locales without plurals (e.g. Chinese, Japanese) use the bare key while en +// defines suffixed variants — that's not orphan. The reverse (locale has a +// suffix en doesn't) is also fine: the runtime falls back to en's bare or +// other-suffix key. +const enHasAnyPluralVariant = (key) => + PLURAL_SUFFIXES.some((suffix) => enKeys.has(`${key}_${suffix}`)); +const isOrphan = (key) => { + if (enKeys.has(key)) return false; + if (enHasAnyPluralVariant(key)) return false; + const base = stripPluralSuffix(key); + if (base !== key) { + if (enKeys.has(base)) return false; + if (enHasAnyPluralVariant(base)) return false; + } + return true; +}; + // --- 3. Orphan keys --- -if (shouldRun("--orphan")) { +const orphansByLocale = {}; +if (shouldRun("--orphan", "--prune")) { console.log("=== Orphan keys (in locale but not in en.ts) ==="); - // Locales without plurals (e.g. Chinese, Japanese) use the bare key while en defines - // suffixed variants. Treat the bare key as valid if en has any plural - // variant of it. The reverse — locale has a suffix that en doesn't — is - // also fine since the runtime falls back to en's bare or other-suffix key. - const enHasAnyPluralVariant = (key) => - PLURAL_SUFFIXES.some((suffix) => enKeys.has(`${key}_${suffix}`)); - const isOrphan = (key) => { - if (enKeys.has(key)) return false; - if (enHasAnyPluralVariant(key)) return false; - const base = stripPluralSuffix(key); - if (base !== key && enKeys.has(base)) return false; - return true; - }; for (const locale of LOCALES) { const file = join(LOCALES_DIR, `${locale}.ts`); if (!existsSync(file)) continue; const localeKeys = extractKeys(file); const orphans = [...localeKeys].filter(isOrphan); + orphansByLocale[locale] = orphans; if (orphans.length === 0) { console.log(` ${locale}: ✓ no orphans`); @@ -215,78 +225,43 @@ if (shouldRun("--duplicates")) { } // --- 5. Unused keys --- +let unusedKeys = []; if (shouldRun("--unused", "--prune")) { console.log("=== Unused keys (in en.ts but never referenced in repo) ==="); - // Search the ENTIRE repo (not just apps/app/src) for key references - const repoSourceFiles = collectSourceFiles(REPO_ROOT, (dir) => - ["node_modules", ".git", "target", "dist", ".next", "locales"].some((x) => dir.includes(x)), - ); + // Search the entire repo (not just apps/app/src) for key references. + const repoSourceFiles = collectSourceFiles(REPO_ROOT, (dir) => { + const name = basename(dir); + return name.startsWith(".") || SKIP_DIRS.includes(name); + }); const allSource = repoSourceFiles.map((f) => readFileSync(f, "utf-8")).join("\n"); // A plural-suffixed key (foo_one / foo_other) counts as "used" when the // base key (foo) is referenced — `t(key, { count })` resolves the suffix at // runtime so the source never names the suffixed variant directly. - const unused = [...enKeys].filter((key) => { + unusedKeys = [...enKeys].filter((key) => { if (allSource.includes(key)) return false; const base = stripPluralSuffix(key); if (base !== key && allSource.includes(base)) return false; return true; }); - if (unused.length === 0) { + if (unusedKeys.length === 0) { console.log(" ✓ all keys referenced in source"); } else { - console.log(` ⚠ ${unused.length} potentially unused keys`); + console.log(` ⚠ ${unusedKeys.length} potentially unused keys`); if (mode !== "--summary") { - for (const [prefix, count] of groupByPrefix(unused).slice(0, 15)) { + for (const [prefix, count] of groupByPrefix(unusedKeys).slice(0, 15)) { console.log(` ${String(count).padStart(4)} ${prefix}.*`); } console.log(); - for (const key of unused) console.log(` ${key}`); + for (const key of unusedKeys) console.log(` ${key}`); } if (mode !== "--prune") { console.log(); console.log(" (auto-fix with --prune option)"); } } - - // --- Prune mode --- - if (mode === "--prune" && unused.length > 0) { - console.log(); - console.log(` Pruning ${unused.length} unused keys from all locale files...`); - const unusedSet = new Set(unused); - const allLocaleFiles = ["en", ...LOCALES].map((l) => join(LOCALES_DIR, `${l}.ts`)); - - for (const file of allLocaleFiles) { - if (!existsSync(file)) continue; - const content = readFileSync(file, "utf-8"); - const lines = content.split("\n"); - const filtered = []; - let skipNextLine = false; - - for (let i = 0; i < lines.length; i++) { - if (skipNextLine) { - skipNextLine = false; - continue; - } - const keyMatch = lines[i].match(/^\s*"([^"]+)"\s*:/); - if (keyMatch && unusedSet.has(keyMatch[1])) { - // Check if value is on the next line (multi-line entry) - if (!lines[i].includes('",') && !lines[i].includes('": "') && i + 1 < lines.length) { - skipNextLine = true; - } - continue; // skip this line - } - filtered.push(lines[i]); - } - - writeFileSync(file, filtered.join("\n")); - const locale = basename(file, ".ts"); - const removed = lines.length - filtered.length; - console.log(` ${locale}: removed ${removed} lines`); - } - } console.log(); } @@ -413,7 +388,11 @@ if (shouldRun("--placeholders")) { if (!localeValue) continue; const localePh = findPlaceholders(localeValue); + // {count} is optional in `_zero` / `_one` variants — the translator + // can write "No messages" or "1 message" instead of "{count} message". + const countOptional = /_(zero|one)$/.test(key); for (const ph of enPh) { + if (countOptional && ph === "{count}") continue; if (!localePh.includes(ph)) { console.log(` ✗ ${locale}/${key}: missing placeholder ${ph}`); problems++; @@ -599,6 +578,59 @@ if (mode === "--sort") { console.log(); } +// --- 12. Prune (destructive) --- +// Runs last so the user sees the unused/orphan reports above before +// keys are actually removed. Removes both unused-from-source keys (en +// only) and per-locale orphans (keys missing from en). +if (mode === "--prune") { + console.log("=== Pruning ==="); + const unusedSet = new Set(unusedKeys); + const allLocaleFiles = ["en", ...LOCALES].map((l) => join(LOCALES_DIR, `${l}.ts`)); + let totalRemoved = 0; + + for (const file of allLocaleFiles) { + if (!existsSync(file)) continue; + const localeName = basename(file, ".ts"); + const removeSet = new Set(unusedSet); + const orphans = orphansByLocale[localeName] ?? []; + for (const key of orphans) removeSet.add(key); + const orphanCount = orphans.length; + if (removeSet.size === 0) continue; + + const content = readFileSync(file, "utf-8"); + const lines = content.split("\n"); + const filtered = []; + let skipNextLine = false; + + for (let i = 0; i < lines.length; i++) { + if (skipNextLine) { + skipNextLine = false; + continue; + } + const keyMatch = lines[i].match(/^\s*"([^"]+)"\s*:/); + if (keyMatch && removeSet.has(keyMatch[1])) { + // Multi-line entry: value on next line + if (!lines[i].includes('",') && !lines[i].includes('": "') && i + 1 < lines.length) { + skipNextLine = true; + } + continue; + } + filtered.push(lines[i]); + } + + writeFileSync(file, filtered.join("\n")); + const removed = lines.length - filtered.length; + totalRemoved += removed; + const breakdown = orphanCount > 0 + ? ` (${removed - orphanCount} unused, ${orphanCount} orphan)` + : ""; + console.log(` ${localeName}: removed ${removed} lines${breakdown}`); + } + + if (totalRemoved === 0) console.log(" ✓ nothing to prune"); + console.log(); +} + // --- Done --- console.log("=== Done ==="); process.exit(exitCode);