"""VoxCast UI strings: Russian. Key/placeholder parity with en.py enforced."""

STRINGS: dict[str, str] = {
    # ── Panel (main.qml) ────────────────────────────────────────────────
    "panel_ready": "Готово",
    "panel_transcribing": "Транскрипция...",
    "panel_correcting": "Исправление...",
    "panel_enhancing": "Улучшение (ИИ)…",
    "panel_converting": "Конвертация...",
    "panel_error": "Ошибка",
    "panel_drop_file": "Перетащите файл → Markdown",
    "panel_acc_ai_mode": "Режим ИИ",
    "panel_acc_settings": "Настройки",
    "panel_acc_undock": "Открепить",
    "panel_acc_hide": "Скрыть",

    # ── Settings window ─────────────────────────────────────────────────
    "settings_title": "Настройки",
    "sec_interface": "ИНТЕРФЕЙС",
    "row_ui_language": "Язык",
    "sec_audio": "АУДИО",
    "row_microphone": "Микрофон",
    "opt_system_default": "Системный по умолчанию",
    "row_voice_test": "Проверка голоса",
    "btn_test": "Тест",
    "btn_stop": "Стоп",
    "btn_play": "Воспроизвести",
    "sec_recognition": "РАСПОЗНАВАНИЕ",
    "row_model": "Модель",
    "model_swift": "Swift",
    "model_precise": "Precise",
    "model_ultra": "Ultra",
    "hint_model_swift": "Быстрая и лёгкая, правильный выбор для ноутбуков и ПК без видеокарты.",
    "hint_model_precise": "Сбалансированная точность, надёжный повседневный выбор, хорошо работает на большинстве ПК.",
    "hint_model_ultra": "Максимальная точность, идеальна с видеокартой (4 ГБ); без неё заметно медленнее.",
    "compat_gpu_ok": "Будет работать на вашей видеокарте ({vram} ГБ).",
    "compat_gpu_low": "У вашей видеокарты ({vram} ГБ) слишком мало памяти для этой модели, она будет работать на процессоре (медленнее).",
    "compat_cpu": "Совместимая видеокарта не обнаружена, эта модель будет работать на процессоре.",
    "compat_cpu_forced": "Будет работать на процессоре (задано в настройках).",
    "row_language": "Язык",
    "row_lang_auto": "Автоопределение языка",
    "hint_lang_auto": "Определяет язык при каждой диктовке. Фиксированный язык быстрее и точнее.",
    "row_live_mode": "Живая транскрипция",
    "hint_live_mode": "Текст появляется у курсора, пока вы говорите, а не после остановки. В этом режиме нет улучшения ИИ; текст набирается у курсора.",
    "hint_output_live": "Живая транскрипция включена: текст набирается у курсора во время речи, поэтому эти параметры вывода не применяются.",
    "hint_live_cpu": "Лучше всего работает с видеокартой; на процессоре может отставать от вашей речи.",
    "live_cpu_warning": "Живой режим работает на процессоре и может отставать; рекомендуется видеокарта.",
    "sec_output": "ВЫВОД",
    "row_text_output": "Вывод текста",
    "opt_clipboard": "Буфер обмена",
    "opt_type_at_cursor": "Ввод у курсора",
    "opt_both": "Оба варианта",
    "row_insert_method": "Способ вставки",
    "opt_paste": "Вставка (Ctrl+V)",
    "opt_typing": "Набор текста",
    "hint_typing": "Имитирует ввод с клавиатуры. Работает в терминалах.",
    "sec_controls": "УПРАВЛЕНИЕ",
    "row_hotkey": "Горячая клавиша",
    "row_mode": "Режим",
    "opt_hold": "Удерживание",
    "opt_toggle": "Переключение",
    "sec_performance": "ПРОИЗВОДИТЕЛЬНОСТЬ",
    "row_compute": "Вычисления",
    "opt_auto": "Авто",
    "opt_gpu": "GPU",
    "opt_cpu": "CPU",
    "hint_cpu_slow": "Режим CPU работает медленнее.",
    "sec_system": "СИСТЕМА",
    "row_autostart": "Автозапуск",
    "row_startup_sound": "Звук запуска",
    "row_recording_sound": "Звук записи",
    "row_shutdown_sound": "Звук завершения",
    "row_always_on_top": "Поверх всех окон",
    "row_small_panel": "Компактная панель",
    "sec_file_conversion": "КОНВЕРТАЦИЯ ФАЙЛОВ",
    "row_save_mode": "Режим сохранения",
    "opt_ask": "Спрашивать",
    "opt_beside_file": "Рядом с файлом",
    "opt_folder": "Папка",
    "row_folder": "Папка",
    "btn_browse": "Обзор",
    "row_timestamps": "Метки времени",
    "row_open_after": "Открывать после",
    "row_context_menu": "Контекстное меню",
    "hint_context_menu": "Добавляет пункт «Конвертировать в Markdown» в контекстное меню Проводника.",
    "sec_ai": "УЛУЧШЕНИЕ ИИ",
    "row_enable": "Включить",
    "hint_ai": "Дорабатывайте диктовки с помощью ИИ (очистка, e-mail, ответ…). Активный режим выбирается правым кликом по панели или кнопкой ИИ на панели.",
    "row_provider": "Провайдер",
    "row_api_key": "API-ключ",
    "ph_api_key": "Вставьте API-ключ",
    "ph_api_key_saved": "•••••••• сохранён, введите новый для замены",
    "btn_save": "Сохранить",
    "hint_key_stored": "Ключ надёжно хранится в диспетчере учётных данных Windows.",
    "btn_clear": "Удалить",
    "btn_load": "Загрузить",
    "btn_loading": "Загрузка",
    "row_active_mode": "Активный режим",
    "mode_normal": "Обычный (без ИИ)",
    # Display names of the built-in AI modes (shown while the user hasn't
    # renamed them; the stored name stays the English default).
    "mode_cleanup": "Очистка",
    "mode_email": "E-mail",
    "mode_reply": "Ответ",
    "mode_todo": "Список дел",
    "mode_notes": "Заметки",
    "mode_formal": "Официальный",
    "lbl_custom_modes": "Свои режимы",
    "sec_license": "ЛИЦЕНЗИЯ",
    "row_status": "Статус",
    "lic_activated": "● Активировано",
    "lic_not_activated": "○ Не активировано",
    "btn_activate": "Активировать",
    "sec_updates": "ОБНОВЛЕНИЯ",
    "row_version": "Версия",
    "btn_check_updates": "Проверить обновления",
    "btn_checking": "Проверка",
    "btn_downloading_pct": "{pct}%  загрузка…",
    "btn_download_install": "Скачать и установить v{version}",
    "btn_reset": "Сбросить",
    "reset_title": "Сброс настроек",
    "reset_question": "Сбросить все настройки к значениям по умолчанию?",
    "dlg_model_dl_title": "Требуется загрузка",
    "dlg_model_dl_text": "Выбранная модель ещё не установлена. VoxCast загрузит около {size} речевых данных и затем переключится. Начать загрузку сейчас?",

    # ── Mode editor ─────────────────────────────────────────────────────
    "ph_mode_name": "Название режима",
    "tip_remove_mode": "Удалить режим",
    "ph_system_prompt": "Системный промпт, объясняет ИИ, как преобразовать транскрипт.",
    "btn_add_mode": "Добавить режим",
    "mode_new": "Новый режим",

    # ── Mode menu (panel) ───────────────────────────────────────────────
    "menu_ai_mode": "РЕЖИМ ИИ",
    "menu_ai_mode_off": "РЕЖИМ ИИ  ·  ВЫКЛ",
    "menu_ai_settings": "Настройки…",
    "menu_copy_raw": "Копировать исходный транскрипт",
    "tray_raw_copied": "Исходный транскрипт скопирован в буфер обмена.",

    # ── Activation overlay ──────────────────────────────────────────────
    "act_title": "Активация VoxCast",
    "act_intro": "Введите лицензионный ключ, чтобы активировать это устройство. Активация выполняется онлайн один раз, после этого VoxCast работает полностью офлайн.",
    "act_enter_key": "Пожалуйста, введите лицензионный ключ.",
    "act_button": "Активировать",
    "act_button_busy": "Активация…",
    "act_update_available": "Доступна версия {version}.",
    "act_update_now": "Обновить сейчас",
    "act_device": "Устройство: ",
    "act_quit": "Выход",

    # ── First-run overlay ───────────────────────────────────────────────
    "fr_title": "Настройка VoxCast",
    "fr_pick_language": "Выберите язык распознавания речи.\nЭто позволит избежать медленного автоопределения при каждом использовании.",
    "fr_continue": "Продолжить",
    "fr_preparing": "Подготовка моделей...",
    "fr_hint_label": "Совет:",
    "status_hw_check": "Проверка оборудования...",
    "fr_hw_gpu": "Обнаружена видеокарта ({vram} ГБ): будет настроена модель {model}.",
    "fr_hw_cpu": "Дискретная видеокарта не обнаружена: будет настроена модель {model}.",
    "fr_hint_download": "Модели скачиваются один раз и остаются на вашем устройстве, облако не требуется.",
    "fr_hint_hotkey": "Нажмите Ctrl+Shift+Space, чтобы начать диктовку, и ещё раз, чтобы остановить.",
    "fr_hint_ai": "Кликните правой кнопкой по панели, чтобы выбрать режим ИИ (например, E-mail, Ответ).",
    "fr_hint_dragfile": "Перетащите файл на панель, чтобы превратить его в Markdown.",
    "fr_hint_audio": "Перетащите аудиофайл (mp3, ogg, m4a…), чтобы транскрибировать его.",
    "fr_hint_explorer": "В Проводнике: правый клик по файлу → «Конвертировать в Markdown».",
    "fr_hint_dock": "Закрепите панель у края экрана, она будет скрываться, пока не понадобится.",
    "fr_hint_settings": "Модель, язык и горячую клавишу можно в любой момент изменить в настройках.",

    # ── Status messages (Python → panel) ────────────────────────────────
    "status_init_services": "Инициализация служб...",
    "status_loading_vad": "Загрузка определения голосовой активности...",
    "status_loading_model": "Загрузка модели распознавания речи...",
    "status_init_models": "Инициализация моделей...",
    "status_loading": "Загрузка модели...",
    "status_switching_model": "Смена модели...",
    "status_downloading_engine": "Загрузка движка распознавания речи...",
    "status_engine_ready": "Движок распознавания речи готов",
    "status_downloading_correction": "Загрузка модели коррекции...",
    "status_correction_ready": "Модель коррекции загружена",

    # ── Meeting recording ────────────────────────────────────────────────
    "menu_meeting_start": "Записать встречу",
    "menu_meeting_stop": "Остановить запись встречи",
    "meeting_consent_title": "Запись встреч",
    "meeting_consent_body": "VoxCast записывает системный звук и ваш микрофон, чтобы вы могли транскрибировать звонки и встречи.\n\nУбедитесь, что все участники согласны на запись: во многих странах (включая Германию) запись разговора без согласия является уголовным преступлением.",
    "meeting_consent_accept": "Понятно, начать запись",
    "meeting_consent_cancel": "Отмена",
    "status_meeting_recording": "Идёт запись встречи",
    "status_meeting_transcribing": "Транскрипция встречи… {pct}%",
    "meeting_done_title": "Встреча транскрибирована",
    "meeting_done_body": "Транскрипт сохранён, нажмите здесь, чтобы открыть его.",
    "meeting_resume_note": "Найдена незавершённая запись встречи, выполняется её транскрипция.",
    "menu_meeting_folder": "Открыть папку встреч",
    "meeting_source_title": "Что записывать?",
    "meeting_source_system": "Вся система",
    "meeting_source_empty": "Сейчас ни одно приложение не воспроизводит звук",
    "meeting_app_fallback": "Не удалось начать запись отдельного приложения, вместо этого записывается вся система.",
    "md_meeting_source": "Источник",
    "meeting_partial_note": "Запись завершилась раньше времени, частичная запись всё равно была обработана.",
    "meeting_system_silent": "Системный звук не был записан, проверьте устройство воспроизведения. Некоторые гарнитуры выводят звук так, что Windows не может его записать; помогает смена устройства вывода по умолчанию.",
    "meeting_summary_failed": "Не удалось создать сводку ИИ, транскрипт сохранён без неё.",
    "err_meeting_folder": "Не удалось создать папку встреч. Проверьте папку в настройках.",
    "err_meeting_disk": "Недостаточно свободного места на диске, запись встречи остановлена.",
    "err_meeting_maxlen": "Достигнута максимальная длительность встречи (4 ч), запись остановлена.",
    "err_meeting_capture": "Запись встречи не удалась, не удалось захватить звук.",
    "err_meeting_transcribe": "Транскрипция встречи не удалась. Аудиофайл сохранён, вы можете повторить попытку.",
    "md_meeting_title": "Встреча",
    "md_meeting_date": "Дата",
    "md_meeting_duration": "Длительность",
    "md_meeting_summary": "Сводка",
    "md_meeting_transcript": "Транскрипт",
    "sec_remote": "Удалённый сервер",
    "row_remote_enable": "Использовать удалённый сервер",
    "hint_remote": "Выполняйте транскрибацию на другом компьютере с более мощным GPU или CPU. Диктовка, конвертация файлов и встречи обрабатываются на сервере.",
    "hint_recognition_remote": "Распознавание выполняет удалённый сервер, поэтому выбор локальной модели ниже отключён. Модель выбирается на сервере.",
    "row_remote_url": "Адрес сервера",
    "ph_remote_url": "http://192.168.1.10:8590",
    "row_remote_key": "Ключ API",
    "ph_remote_key": "Вставьте ключ API сервера",
    "btn_remote_test": "Проверить соединение",
    "remote_testing": "Проверка...",
    "btn_remote_discover": "Найти сервер",
    "remote_discovering": "Поиск...",
    "remote_discover_none": "Сервер не найден. Убедитесь, что сервер запущен, оба устройства находятся в одной сети, а брандмауэр сервера разрешает VoxCast Server в локальной сети.",
    "remote_enhance_available": "Улучшение ИИ доступно",
    "remote_update_available": "Доступно обновление сервера: {version}",
    "row_tls_mode": "Сертификат",
    "tls_verify": "Требовать действительный сертификат",
    "tls_pinned": "Доверять этому серверу",
    "tls_insecure": "Разрешить любой сертификат",
    "btn_trust_cert": "Проверить сертификат",
    "tls_trust_title": "Доверять этому серверу?",
    "tls_trust_body": "Сервер предъявил этот отпечаток сертификата. Убедитесь, что он совпадает с вашим сервером, прежде чем доверять ему.",
    "tls_trust_confirm": "Доверять",
    "tls_trust_failed": "Не удалось прочитать сертификат сервера. Проверьте адрес и включён ли HTTPS.",
    "tls_insecure_warning": "Соединение не проверяется. Используйте это только в сети, которой доверяете.",
    "row_enhance_source": "Улучшение ИИ",
    "enhance_own": "Мой собственный ключ API",
    "enhance_server": "Использовать сервер",
    "hint_enhance_server": "Сервер улучшает своим собственным ключом ИИ, поэтому здесь вводить его не нужно.",
    "lbl_server_modes": "Корпоративные режимы (с сервера)",
    "managed_locked": "Управляется вашей организацией",
    "remote_http_warn": "Это соединение не зашифровано. Используйте его только в доверенной локальной сети.",
    "remote_live_hint": "Субтитры в реальном времени работают на этом устройстве; для них нужна локально установленная модель.",
    "remote_connected": "Подключено: {model} на {where}",
    "remote_on_gpu": "GPU ({vram} GB)",
    "remote_on_cpu": "CPU",
    "err_remote_unreachable": "Не удалось подключиться к удалённому серверу. Проверьте адрес и сеть.",
    "err_remote_auth": "Удалённый сервер отклонил ключ API.",
    "err_remote_busy": "Удалённый сервер занят. Повторите попытку через мгновение.",
    "err_remote_failed": "Удалённый сервер не смог обработать это аудио.",
    "sec_meeting": "ВСТРЕЧИ",
    "row_meeting_mic": "Записывать микрофон",
    "hint_meeting_mic": "Записывает также ваш голос, а не только других участников.",
    "row_meeting_language": "Язык",
    "lang_meeting_auto": "Автоопределение",
    "row_convert_language": "Язык аудио",
    "lang_convert_auto": "Автоопределение",
    "err_convert_engine_loading": "Голосовой движок ещё загружается. Повторите преобразование чуть позже.",
    "err_convert_no_speech": "В этом файле не распознана речь. Файл Markdown не был создан.",
    "err_convert_engine_error": "Голосовой движок сообщил об ошибке при расшифровке.",
    "tray_convert_failed": "Не удалось преобразовать {name}: {error}",
    "hint_meeting_language": "Автоопределение справляется со встречами на любом языке, даже если он меняется по ходу разговора. Выбирайте язык, только если распознавание испытывает трудности.",
    "row_meeting_keep": "Сохранять аудиофайл",
    "hint_meeting_keep": "Сохраняет запись в файл .wav рядом с транскриптом.",
    "row_meeting_summary": "Сводка ИИ",
    "hint_meeting_summary": "Добавляет к транскрипту сводку, созданную ИИ (требуется настроенное улучшение ИИ).",
    "hint_meeting_summary_nokey": "Улучшение ИИ не настроено, сводки будут пропущены.",
    "row_meeting_folder": "Сохранять в",
    "meeting_folder_default": "Документы\\VoxCast\\Meetings",
    "btn_open": "Открыть",

    # ── Errors / tray (Python) ──────────────────────────────────────────
    "err_audio_lib": "Аудиобиблиотека недоступна",
    "err_gpu_oom": "Недостаточно памяти GPU. Перезапустите в режиме CPU.",
    "err_gpu_fallback": "Видеокарта недоступна, работа выполняется на процессоре (медленнее).",
    "err_hotkey_init": "Система горячих клавиш не инициализирована",
    "err_mic": "Ошибка микрофона. Проверьте аудиоустройство.",
    "err_mic_test_busy": "Запись уже идёт. Остановите её перед проверкой микрофона.",
    "err_model_switch": "Не удалось сменить модель. Пожалуйста, попробуйте ещё раз.",
    "err_model_download": "Не удалось скачать речевую модель. Проверьте подключение к интернету.",
    "err_speech_start": "Не удалось запустить распознавание речи.",
    "err_transcription": "Транскрипция не удалась. Пожалуйста, попробуйте ещё раз.",
    "err_model_missing": "Речевая модель не найдена. Выберите модель в настройках.",
    "tray_cpu_fallback": "Совместимый GPU не найден. Работа выполняется на CPU.\nТранскрипция будет медленнее, чем с ускорением на GPU.",
    "tray_cpu_configured": "Работа на CPU, как задано в настройках.",
    "tray_cpu_detected": "Совместимый GPU не обнаружен. Работа выполняется на CPU.\nДля более быстрой транскрипции рекомендуется совместимая видеокарта.",
    "tray_file_not_found": "Файл не найден.",
    "tray_no_supported_files": "Нет поддерживаемых файлов для конвертации.",
    "tray_still_starting": "VoxCast ещё запускается, попробуйте снова.",
    "tray_no_output_folder": "Папка вывода не задана, выберите, куда сохранять.",
    "tray_context_menu_failed": "Не удалось обновить контекстное меню.",
    "tray_need_api_key": "Сначала введите и сохраните API-ключ.",
    "tray_models_load_failed": "Не удалось загрузить модели.",
    "tray_show_hide": "Показать/скрыть",

    # ── License (Python user messages) ──────────────────────────────────
    "lic_enter_key": "Пожалуйста, введите лицензионный ключ.",
    "lic_saved_failed": "Активировано, но лицензию не удалось сохранить на этом ПК.",
    "lic_success": "VoxCast активирован. Спасибо!",
    "lic_check_failed": "Активация не удалась. Пожалуйста, проверьте ключ.",
    "lic_no_server": "Не удалось связаться с сервером активации. Проверьте подключение к интернету.",
    "lic_unexpected": "Активация неожиданно завершилась ошибкой. Пожалуйста, попробуйте ещё раз.",

    # ── Updates (Python user messages) ──────────────────────────────────
    "upd_checking": "Проверка обновлений…",
    "upd_latest": "У вас последняя версия.",
    "upd_available": "Доступна версия {version}.",
    "upd_dialog_title": "Доступно обновление",
    "upd_whats_new": "Что нового",
    "upd_required": "Обязательное",
    "upd_no_notes": "Общие улучшения и исправления.",
    "upd_later": "Позже",
    "upd_install_now": "Скачать и установить",
    "upd_install_note": "Обновление автоматически заменит текущую версию, больше ничего делать не нужно.",
    "upd_downloading": "Загрузка версии {version}…",
    "upd_failed": "Обновление не удалось. Пожалуйста, попробуйте ещё раз.",
    "upd_starting_installer": "Запуск установщика…",
    "upd_installer_failed": "Не удалось запустить установщик.",
    "upd_err_filename": "Неожиданное имя файла установщика в манифесте обновления.",
    "upd_err_https": "Загрузка обновления должна использовать HTTPS.",
    "upd_err_response": "Сервер обновлений вернул недопустимый ответ.",
    "upd_err_no_url": "URL для загрузки не указан.",
    "upd_err_no_checksum": "В манифесте обновления отсутствует контрольная сумма. Отменено.",
    "upd_err_redirect": "Сервер обновлений вернул неожиданное перенаправление.",
    "upd_err_integrity": "Скачанный файл не прошёл проверку целостности. Отменено.",
    "upd_err_check": "Не удалось проверить обновления: {error}",
    "upd_err_download": "Загрузка не удалась: {error}",
    "upd_err_save": "Не удалось сохранить обновление: {error}",
    "upd_err_host": "Загрузка обновления с недоверенного хоста '{host}' отклонена.",

    # ── LLM (user messages) ─────────────────────────────────────────────
    # ── Late additions (review sweep) ───────────────────────────────────
    "act_first": "Сначала активируйте VoxCast.",
    "llm_enhance_failed": "Улучшение ИИ не удалось: {error}",
    "llm_truncated": "Ответ ИИ был обрезан, вместо него использован исходный транскрипт.",
    "llm_mode_needs_key": "Выбран режим ИИ, добавьте API-ключ в настройках, чтобы включить улучшение.",
    "tt_recording": "Запись...",
    "tray_saved": "Сохранено: {name}",
    "tray_converted": "Конвертировано файлов в Markdown: {n}.",
    "hk_press_key": "Нажмите клавишу...",
    "hk_acc_record": "Нажмите сочетание клавиш",
    "no_folder": "Папка не выбрана",
    "llm_load_models_ph": "Загрузить модели →",

    "llm_no_key": "API-ключ не указан.",
    "llm_no_key_configured": "API-ключ не настроен.",
    "llm_bad_key": "Недействительный или неавторизованный API-ключ.",
    "llm_rate_limit": "Достигнут лимит запросов. Повторите попытку чуть позже.",
    "llm_provider_down": "Провайдер ИИ временно недоступен.",
    "llm_request_failed": "Запрос не удался ({code}).",
    "llm_network": "Ошибка сети: {error}",
    "llm_no_model": "Не найдено пригодной модели ИИ для этого API-ключа.",
}
