{
  "_display_name": "Русский",

  "app.tab.core": "⚙️ Ядро",
  "app.tab.servers": "🖥️ Серверы",
  "app.tab.diagnostics": "🔍 Диагностика",
  "app.tab.help": "❓ Помощь",

  "core.status_checking": "Статус ядра: Проверка...",
  "core.status_error_not_found": "Статус ядра ❌ Ошибка: sing-box не найден",
  "core.status_restarting": "Статус ядра 🔄 Перезапуск...",
  "core.status_running": "Статус ядра ✅ Работает",
  "core.status_stopped": "Статус ядра ⏸️ Остановлен",
  "core.button_start": "Старт",
  "core.button_stop": "Стоп",
  "core.button_exit": "Выход",
  "core.button_restart": "Перезапуск",
  "core.label_config": "Конфиг",
  "core.status_checking_config": "Проверка конфига...",
  "core.status_config_ok": "%s ✅ %s",
  "core.status_config_not_found": "%s ❌ не найден",
  "core.status_config_error": "Ошибка конфига: %v",
  "core.status_parser_starting": "Запуск...",
  "core.button_update": "🔄 Обновить",
  "core.button_wizard": "⚙️ Мастер",
  "core.button_download_template": "Скачать шаблон конфига",
  "core.label_singbox": "Sing-box",
  "core.singbox_help_msg": "sing-box — основной исполняемый файл.\n\n",
  "core.singbox_help_look_for": "Ищите файл: %s\n",
  "core.singbox_help_extract": "Распакуйте файл в папку bin.\n\n",
  "core.singbox_help_manual": "Вы можете скачать кнопкой выше или вручную по ссылке:",
  "core.singbox_status_checking": "Проверка...",
  "core.singbox_status_not_found": "❌ не найден",
  "core.button_download": "Скачать",
  "core.button_download_version": "Скачать v%s",
  "core.button_update_version": "Обновить v%s",
  "core.dialog_singbox_title": "Sing-box",
  "core.dialog_singbox_close": "Закрыть",
  "core.button_open_bin": "Открыть папку bin",
  "core.label_wintun": "Wintun",
  "core.wintun_help_msg": "wintun.dll необходим для режима TUN на Windows.\n\n",
  "core.wintun_help_in_archive": "В скачанном архиве возьмите wintun.dll\n\nВаша система: %s.\n\n",
  "core.wintun_help_place": "Поместите файл в папку bin.\n\n",
  "core.wintun_help_manual": "Вы можете скачать кнопкой выше или вручную по ссылке:",
  "core.wintun_status_checking": "Проверка...",
  "core.wintun_status_ok": "ok",
  "core.wintun_status_not_found": "❌ не найден",
  "core.wintun_status_error": "❌ Ошибка проверки wintun.dll",
  "core.dialog_wintun_title": "Wintun",
  "core.dialog_wintun_close": "Закрыть",
  "core.dialog_template_title": "Шаблон конфига",
  "core.dialog_template_saved": "Шаблон сохранён в %s",
  "core.dialog_download_complete_title": "Загрузка завершена",
  "core.dialog_update_available_title": "Доступно обновление",
  "core.dialog_update_msg": "Доступна новая версия приложения",
  "core.dialog_update_current": "Текущая версия: %s",
  "core.dialog_update_new": "Новая версия: %s",
  "core.dialog_update_close": "Закрыть",
  "core.button_download_from_github": "Скачать с GitHub",
  "core.config_not_found_title": "Конфигурация не найдена",
  "core.config_not_found_message": "⚠️ Файл конфигурации не найден!\n\nФайл %s отсутствует в папке bin/.\n\nДля начала работы:\n1. скачайте Мастер\n2. используйте Мастер для генерации конфигурации\n3. нажмите Старт\n",
  "core.already_running_app_title": "Информация",
  "core.already_running_app_message": "Приложение уже запущено. Используйте существующий экземпляр или закройте его перед запуском нового.",
  "core.info_title": "Информация",
  "core.already_running": "Sing-Box уже запущен (по внутреннему состоянию).",
  "core.crash_title": "Сбой",
  "core.crash_restarting": "Sing-Box аварийно завершился, перезапуск... (попытка %d/%d)",

  "error.startup": "Не удалось запустить sing-box:\n\n%s\n\nПроверьте:\n1. config.json корректен\n2. Исполняемый файл sing-box существует\n3. Подробности в логах",
  "error.parser": "Ошибка парсера:\n\n%s\n\nПроверьте:\n1. URL подписки корректен\n2. Подключение к сети\n3. Подробности в parser.log",
  "error.linux_capabilities": "Требуются права Linux capabilities",
  "error.stop_privileged_failed": "Не удалось остановить sing-box с правами администратора (отмена диалога или ошибка). Ядро может всё ещё работать — нажмите Stop ещё раз или завершите процесс в «Мониторинг системы».",
  "error.restart_failed": "Sing-Box не удалось перезапустить после %d попыток. Проверьте sing-box.log.",
  "error.check_updates_failed": "Не удалось проверить обновления",
  "error.version_check": "Ошибка проверки версии: %s",

  "core.update_available_title": "Доступно обновление",
  "core.update_available_message": "Доступно обновление!\n\nУстановлена: %s\nПоследняя: %s\n\nВы можете скачать обновление на вкладке «Ядро».",
  "core.no_updates_title": "Нет обновлений",
  "core.latest_version_message": "Вы используете последнюю версию.\n\nУстановлена: %s\nПоследняя: %s",

  "tray.open": "Открыть",
  "tray.quit": "Выход",
  "tray.start_vpn": "Запустить VPN",
  "tray.stop_vpn": "Остановить VPN",
  "tray.select_proxy": "Выбрать прокси",
  "tray.no_proxies_available": "Нет доступных прокси",
  "tray.hide_app_from_dock": "Скрыть из Dock",

  "help.open_config_folder": "⚙️ Открыть папку конфига",
  "help.kill_singbox": "🛑 Завершить Sing-Box",
  "help.kill_title": "Завершение",
  "help.kill_result": "Sing-Box завершён (если был запущен).",
  "help.version_label": "📦 Версия: %s",
  "help.checking_updates": "Проверка обновлений...",
  "help.unable_to_check_updates": "Не удалось проверить обновления",
  "help.update_available_format": "🆕 Доступно обновление: %s\nТекущая: %s",
  "help.dev_build_format": "✅ Вы используете сборку разработчика\nТекущая: %s\nПоследний релиз: %s",
  "help.latest_version_format": "✅ Вы используете последнюю версию\nТекущая: %s",
  "help.telegram_link": "💬 Telegram-канал",
  "help.github_link": "🐙 Репозиторий GitHub",
  "help.language_label": "Язык:",
  "help.language_changed": "Язык изменён. Перезапустите приложение для полного применения.",
  "help.download_locales": "📥 Скачать переводы",
  "help.download_locales_btn": "⬇",
  "help.download_locales_success": "Переводы загружены (%d). Перезапустите для отображения новых языков.",
  "help.download_locales_failed": "Не удалось загрузить переводы",
  "help.downloading_locales": "Загрузка...",
  "help.downloading_locales_btn": "🔄",

  "diag.stun_button": "STUN [UDP]",
  "diag.stun_check_title": "Проверка STUN",
  "diag.stun_checking": "Проверка, подождите...",
  "diag.external_ip_format": "Ваш внешний IP: %s\n%s",
  "diag.copy_ip": "Копировать IP",
  "diag.copied_title": "Скопировано",
  "diag.ip_copied": "IP-адрес скопирован в буфер обмена.",
  "diag.stun_result_title": "Результат STUN",
  "diag.close": "Закрыть",
  "diag.stun_server_label": "STUN-сервер (хост:порт):",
  "diag.use_system_socks5": "Использовать системный SOCKS5 прокси",
  "diag.stun_settings": "Настройки STUN",
  "diag.save": "Сохранить",
  "diag.cancel": "Отмена",
  "diag.open_log_window": "Открыть окно логов",
  "diag.open_logs_folder": "Открыть папку логов",
  "diag.ip_check_services": "Сервисы проверки IP:",

  "log.window_title": "Логи",
  "log.level_label": "Уровень:",
  "log.level_error": "Ошибки",
  "log.level_warn": "Предупр.",
  "log.level_info": "Инфо",
  "log.level_verbose": "Подробно",
  "log.level_trace": "Трассир.",
  "log.refresh": "Обновить",
  "log.internal_tab": "Внутренний",
  "log.core_tab": "Ядро",
  "log.api_tab": "API",
  "log.file_not_available": "Лог-файл недоступен.",

  "dialog.download_failed": "Загрузка не удалась. Подробности в логе.",
  "dialog.download_failed_manual_hint": "Скачайте файл вручную и поместите в указанную папку.",
  "dialog.open_download_page": "Открыть страницу загрузки",
  "dialog.open_folder": "Открыть папку",
  "dialog.close": "Закрыть",
  "dialog.copy": "Копировать",
  "dialog.ok": "OK",
  "dialog.kill_process": "Завершить процесс",
  "dialog.close_warning": "Закрыть предупреждение",
  "dialog.process_already_running": "Sing-Box, похоже, уже запущен.\nЗавершить существующий процесс?",
  "dialog.warning": "Предупреждение",
  "dialog.error_prefix": "❌ ",

  "servers.status_not_checked": "Статус: Не проверен",
  "servers.status_click_load": "Нажмите «Загрузить прокси»",
  "servers.status_loading": "Загрузка прокси для «%s»...",
  "servers.status_loaded": "Прокси загружены для «%s». Активный: %s",
  "servers.status_clash_api_disabled": "Clash API отключён из-за ошибки конфига",
  "servers.status_clash_api_off_error": "❌ Clash API выключен (ошибка)",
  "servers.status_clash_api_off_config": "❌ Clash API выключен (ошибка конфига)",
  "servers.status_clash_api_on": "✅ Clash API включён",
  "servers.status_not_running": "Статус: Не запущен",
  "servers.status_singbox_stopped": "Sing-box остановлен.",
  "servers.error_api_not_initialized": "Сервис API не инициализирован",
  "servers.error_api_disabled": "API отключён: ошибка конфига",
  "servers.status_delay_error": "Ошибка задержки: %s",
  "servers.status_delay_format": "Задержка: %d мс для %s",
  "servers.status_selected": "Выбран: %s",
  "servers.status_selected_multi": "Выбрано прокси: %d",
  "servers.status_selected_none": "Ничего не выбрано",
  "servers.status_switch_error": "Ошибка переключения: %s",
  "servers.status_switched": "Переключено «%s» на %s",
  "servers.status_sorted_name_az": "Сортировка по имени (А-Я)",
  "servers.status_sorted_name_za": "Сортировка по имени (Я-А)",
  "servers.status_sorted_delay_fast": "Сортировка по задержке (быстрые первыми)",
  "servers.status_sorted_delay_slow": "Сортировка по задержке (медленные первыми)",
  "servers.status_no_proxies": "Нет прокси для пинга",
  "servers.status_list_counts": "Всего / доступно: %d / %d",
  "servers.status_pinging": "Пинг %d прокси...",
  "servers.status_pinging_progress": "Пинг %d/%d...",
  "servers.status_ping_completed": "Пинг-тест завершён для %d прокси",
  "servers.status_selected_group": "Выбрана группа «%s». Последний прокси: %s",
  "servers.status_selected_group_only": "Выбрана группа «%s».",
  "servers.status_ping_url_updated": "URL пинг-теста обновлён: %s",
  "servers.label_proxy_name": "Имя прокси",
  "servers.button_ping": "Пинг",
  "servers.button_test": "тест",
  "servers.tooltip_hide_ping_errors": "Скрыть серверы с ошибкой пинга",
  "servers.tooltip_show_ping_errors": "Показать все серверы",
  "servers.tooltip_sort_by_name": "Сортировка по имени (↑ А…Я / ↓ Я…А)",
  "servers.tooltip_sort_by_delay": "Сортировка по задержке (↑ быстрее / ↓ медленнее)",
  "servers.tooltip_ping_all": "Пинг всех прокси в группе",
  "servers.tooltip_ping_settings": "URL пинг-теста и число параллельных запросов",
  "servers.button_export": "Экспорт",
  "servers.tooltip_export_uris": "Share-ссылки для всех сейчас видимых строк, в порядке списка (строка = URI; скрытые из-за ошибки пинга не попадают; без selector, urltest, direct).",
  "servers.tooltip_export_uris_selected": "Share-ссылки только для выделенных прокси (несколько выбрано), в порядке списка (те же правила URI, что у обычного копирования).",
  "servers.status_export_nothing_visible": "Нечего экспортировать (в текущем виде списка нет строк).",
  "servers.status_export_nothing_selected": "Нечего экспортировать (нет выделенных строк в текущем виде).",
  "servers.status_export_uris_building": "Готовим экспорт…",
  "servers.status_export_uris_done": "Буфер: %d строк (по одному URI в строке)",
  "servers.status_export_uris_none": "Не удалось собрать ни одной share-ссылки для этого списка.",
  "servers.error_export_no_config": "Путь к конфигу не задан.",
  "servers.label_sort_by_name": "А…Я",
  "servers.placeholder_select_group": "Выберите группу селектора",
  "servers.label_selector_group": "Группа селектора:",
  "servers.dialog_ping_settings_title": "Настройки пинг-теста",
  "servers.ping_label_url": "URL пинг-теста",
  "servers.ping_label_custom_url": "Свой URL:",
  "servers.ping_label_parallel": "Параллельных запросов (массовый ping):",
  "servers.ping_placeholder_url": "https://example.com/generate_204",
  "servers.ping_option_custom": "Свой",
  "servers.ping_button_save": "Сохранить",
  "servers.ping_button_cancel": "Отмена",
  "servers.dialog_selector_active_title": "Селектор → Активный Outbound",
  "servers.dialog_selector_close": "Закрыть",
  "servers.ping_button_error": "Ошибка",
  "servers.ping_format_ms": "%d мс",
  "servers.selector_no_active": "%s → (нет активного outbound)",
  "servers.selector_error": "%s → ошибка: %v",
  "servers.selector_active": "%s → %s",
  "servers.menu_copy_link": "Копировать ссылку",
  "servers.menu_context_type_unknown": "Тип неизвестен",
  "servers.copy_link_resolving": "Сборка share URI из outbound…",
  "servers.copy_link_done": "Share URI скопирован в буфер обмена",
  "servers.copy_link_not_supported": "Этот outbound нельзя преобразовать в share-ссылку (селектор, direct-out или поля не поддерживаются кодировщиком URI).",

  "wizard.window_title": "Мастер конфигурации",
  "wizard.tab_sources": "Источники",
  "wizard.tab_outbounds": "Outbound'ы",
  "wizard.tab_dns": "DNS",
  "wizard.tab_rules": "Правила",
  "wizard.tab_settings": "Настройки",
  "wizard.tab_preview": "Превью",
  "wizard.settings.no_vars": "В этом профиле нет переменных шаблона.",
  "wizard.settings.reset": "Сброс",
  "wizard.settings.reset_tooltip": "Сбросить к значению из шаблона.",
  "wizard.settings.clash_secret_regenerate_tooltip": "Сгенерировать новый случайный секрет.",
  "wizard.settings.tun_off_core_running": "Сначала остановите ядро sing-box (вкладка Core → Stop), затем снимите TUN.\n\nПосле работы TUN с правами администратора кеш experimental под bin/ и логи ядра (logs/sing-box.log) могут принадлежать root. Они удаляются при выключении TUN только пока ядро остановлено.",
  "wizard.settings.tun_off_singbox_on_system": "В системе всё ещё запущен sing-box (обнаружен PID %d). Сначала полностью остановите ядро: Core → Stop (при запросе введите пароль), либо завершите процесс в «Мониторинг системы», затем снимите TUN.\n\nЕсли раньше отменили ввод пароля при Stop, лаунчер мог считать ядро остановленным, хотя sing-box ещё работал — тогда TUN и порты (например mixed) остаются заняты.",
  "wizard.button_read": "Загрузить",
  "wizard.button_save_as": "Сохранить как",
  "wizard.button_close": "Закрыть",
  "wizard.button_prev": "Назад",
  "wizard.button_next": "Далее",
  "wizard.button_save": "Сохранить",
  "wizard.dialog_confirmation": "Подтверждение",
  "wizard.dialog_unsaved_changes": "Текущие изменения будут потеряны. Сохранить текущее состояние?",
  "wizard.dialog_save_before_close": "Сохранить изменения перед закрытием?",
  "wizard.dialog_discard": "Отменить",
  "wizard.dialog_cancel": "Отмена",
  "wizard.shared.button_edit": "Редакт.",
  "wizard.shared.button_del": "Удалить",
  "wizard.error_load_config": "Не удалось загрузить конфиг",
  "wizard.error_save_state": "Не удалось сохранить состояние",
  "wizard.error_load_state": "Не удалось загрузить состояние",
  "wizard.error_restore_state": "Не удалось восстановить состояние",
  "wizard.error_template_failed": "Не удалось загрузить шаблон конфига",
  "wizard.error_template_missing": "Шаблон конфига отсутствует",

  "wizard.source.label_url": "URL подписки или прямые ссылки:",
  "wizard.source.placeholder_url": "https://ваш-url-подписки",
  "wizard.source.hint": "Поддерживаются URL подписок (http/https) или прямые ссылки (vless://, vmess://, trojan://, ss://, hysteria2://, ssh://, wireguard://). Для нескольких ссылок — по одной на строку.",
  "wizard.source.button_add": "Добавить",
  "wizard.source.button_get_free": "Бесплатный VPN!",
  "wizard.source.label_sources": "Источники",
  "wizard.source.button_preview_all": "Просмотр всех серверов…",
  "wizard.source.preview_all_title": "Серверы из всех источников",
  "wizard.source.no_sources": "Источники не определены в ParserConfig.",
  "wizard.source.connections_n": "Подключения %d",
  "wizard.source.source_n": "Источник %d",
  "wizard.source.placeholder_prefix": "префикс",
  "wizard.source.button_view": "Просмотр",
  "wizard.source.button_del": "Удалить",
  "wizard.source.dialog_copied_title": "Скопировано",
  "wizard.source.dialog_copied_message": "Источник скопирован в буфер обмена.",
  "wizard.source.preview_click_refresh": "Нажмите «Обновить» для загрузки серверов из всех источников.",
  "wizard.source.preview_no_sources": "Нет источников. Добавьте URL и нажмите «Обновить».",
  "wizard.source.preview_loading": "Загрузка...",
  "wizard.source.preview_error": "Ошибка: %s",
  "wizard.source.preview_servers": "%d сервер(ов) из %d источник(ов)",
  "wizard.source.preview_errors": "  ⚠️ %d ошибок",
  "wizard.source.button_refresh": "Обновить",
  "wizard.source.view_title": "Серверы — %s",
  "wizard.source.view_close": "Закрыть",
  "wizard.source.view_no_servers": "Серверы не найдены.",
  "wizard.source.view_server_count": "%d сервер(ов)",
  "wizard.source.button_edit": "Изменить",
  "wizard.source.edit_title": "Источник — %s",
  "wizard.source.tab_settings": "Настройки",
  "wizard.source.tab_preview": "Просмотр",
  "wizard.source.tab_json": "JSON",
  "wizard.source.json_hint": "Только чтение: снимок этого источника (proxies[i]). Обновляется при смене настроек или при открытии вкладки.",
  "wizard.source.preview_section_local": "Локальные outbounds (этот источник)",
  "wizard.source.preview_section_servers": "Серверы из подписки / ссылок",
  "wizard.source.preview_no_local_outbounds": "Нет — включите «Локальный auto» или «Локальный select» в настройках.",
  "wizard.source.preview_status_ok": "Локальные outbounds: %d · Серверов: %d",
  "wizard.source.preview_status_err": "Локальные outbounds: %d · Серверы: ошибка загрузки — %s",
  "wizard.source.label_prefix": "Префикс тега",
  "wizard.source.local_auto": "Локальный auto (urltest)",
  "wizard.source.local_select": "Локальный select",
  "wizard.source.exclude_global": "Исключить из глобальных outbounds",
  "wizard.source.expose_tags": "Показывать теги локальных групп в глобальных outbounds",
  "wizard.source.expose_tags_tooltip": "Сначала включите хотя бы одну локальную группу (auto или select).",
  "wizard.source.exclude_hint": "Без пары «локальный auto и select» исключённые узлы не попадают в глобальные списки: доступ только через локальные группы, expose или addOutbounds.",
  "wizard.source.wizard_tag_conflict": "Этот тег уже занят другим outbound без маркера WIZARD. Удалите или переименуйте его в ParserConfig.",
  "wizard.source.edit_close": "Закрыть",

  "wizard.outbounds.placeholder": "Введите JSON ParserConfig...",
  "wizard.outbounds.button_docs": "📖 Документация",
  "wizard.outbounds.label": "ParserConfig:",
  "wizard.outbounds.error_serialize": "Не удалось сериализовать ParserConfig",
  "wizard.outbounds.error_open_docs": "не удалось открыть документацию",
  "wizard.outbounds.error_invalid_json": "Некорректный JSON ParserConfig",
  "wizard.outbounds.error_invalid_config": "Некорректный ParserConfig",

  "wizard.dns.label_servers": "DNS-серверы",
  "wizard.dns.no_servers": "Нет DNS-серверов.",
  "wizard.dns.button_add": "Добавить",
  "wizard.dns.invalid_server": "(некорректный JSON сервера)",
  "wizard.dns.no_tag": "(нет тега)",
  "wizard.dns.label_final": "Финальный DNS:",
  "wizard.dns.label_default_resolver": "Резолвер доменов по умолчанию:",
  "wizard.dns.label_rules": "Правила (JSON-объект с массивом \"rules\")",
  "wizard.dns.placeholder_rules": "{\n  \"rules\": [\n    {\"rule_set\":\"example\",\"server\":\"tag\"}\n  ]\n}",
  "wizard.dns.label_strategy": "Стратегия:",
  "wizard.dns.label_independent_cache": "Независимый кэш",
  "wizard.dns.dialog_title": "Редактировать DNS-сервер",
  "wizard.dns.dialog_add_title": "Добавить DNS-сервер",
  "wizard.dns.dialog_hint": "JSON-объект как в sing-box dns.servers (нужен tag).",
  "wizard.dns.dialog_add_hint": "Вставьте или отредактируйте JSON для новой записи dns.servers. Тег должен быть уникальным.",
  "wizard.dns.dialog_save": "Сохранить",
  "wizard.dns.dialog_cancel": "Отмена",
  "wizard.dns.error_empty_json": "JSON не должен быть пустым.",
  "wizard.dns.error_invalid_json": "Некорректный JSON",
  "wizard.dns.error_missing_tag": "У сервера должен быть непустой \"tag\".",
  "wizard.dns.error_dup_tag": "Дублирующийся тег",
  "wizard.dns.error_validation": "Некорректные настройки DNS",
  "wizard.dns.tooltip_server_enabled": "Включить этот сервер в итоговый sing-box DNS. Отключённые остаются в списке и в state; в правилах и Final допускаются только включённые теги.",
  "wizard.dns.tooltip_server_locked": "Строка из config.dns шаблона: нельзя редактировать, удалить или переключать галочку здесь. Галочка показывает, попадает ли сервер в итоговый DNS (из state/шаблона); при включении для того же тега тело может браться из dns_options шаблона.",
  "wizard.dns.error_locked_edit": "Этот DNS-сервер нельзя редактировать (config.dns шаблона).",

  "wizard.rules.button_srs_download": "⬇ srs",
  "wizard.rules.button_srs_loading": "🔄 srs",
  "wizard.rules.button_srs_done": "✔️ srs",
  "wizard.rules.template_not_found": "Файл шаблона bin/%s не найден.",
  "wizard.rules.template_create_hint": "Создайте файл шаблона, чтобы активировать эту вкладку.",
  "wizard.rules.no_selectable_rules": "В шаблоне не определены выбираемые правила.",
  "wizard.rules.label_outbound": "Outbound:",
  "wizard.rules.button_info": "?",
  "wizard.rules.button_edit": "✏️",
  "wizard.rules.button_delete": "Удалить правило",
  "wizard.rules.dialog_delete_unnamed": "(правило без названия)",
  "wizard.rules.dialog_delete_confirm": "Удалить пользовательское правило «%s»?",
  "wizard.rules.button_add_rule": "➕ Добавить правило",
  "wizard.rules.button_add_from_library": "📚 Добавить из библиотеки",
  "wizard.rules.tooltip_add_from_library": "Добавить в список копии пресетов из шаблона.",
  "wizard.rules.library_title": "Библиотека правил",
  "wizard.rules.library_hint": "Отметьте пресеты — копии добавятся в конец списка. Один и тот же пресет можно добавить несколько раз.",
  "wizard.rules.library_add_selected": "Добавить выбранные",
  "wizard.rules.library_cancel": "Отмена",
  "wizard.rules.empty_state": "Пока нет правил маршрута. Откройте библиотеку или добавьте своё правило.",
  "wizard.rules.empty_open_library": "Открыть библиотеку",
  "wizard.rules.tooltip_rule_enabled": "Включить это правило в сгенерированный маршрут",
  "wizard.rules.tooltip_move_up": "Поднять правило в списке",
  "wizard.rules.tooltip_move_down": "Опустить правило в списке",
  "wizard.rules.tooltip_move_up_off": "Уже первое правило",
  "wizard.rules.tooltip_move_down_off": "Уже последнее правило",
  "wizard.rules.label_final_outbound": "Финальный outbound:",
  "wizard.rules.checkbox_tun": "TUN",
  "wizard.rules.tun_help": "Включение TUN потребует ввода пароля при запуске или остановке VPN.",
  "wizard.rules.label_selectable": "Выбираемые правила",
  "wizard.rules.error_srs_failed": "Не удалось скачать набор правил (SRS)",

  "wizard.preview.placeholder": "Здесь появится превью",
  "wizard.preview.status_click_show": "Нажмите «Показать превью» для генерации (для больших конфигов может занять время)",
  "wizard.preview.button_show": "Показать превью",
  "wizard.preview.label": "Превью",
  "wizard.preview.loading_large": "Загрузка большого превью...",
  "wizard.preview.status_loading_large": "⏳ Загрузка большого превью...",
  "wizard.preview.status_parsing": "⏳ Парсинг подписок и генерация outbound'ов...",
  "wizard.preview.text_parsing": "Парсинг конфигурации... Подождите.",
  "wizard.preview.text_building": "Построение превью...",
  "wizard.preview.status_building": "⏳ Построение конфигурации для превью...",
  "wizard.preview.status_parsing_config": "⏳ Парсинг ParserConfig...",
  "wizard.preview.error": "Ошибка превью: %v",
  "wizard.preview.status_error": "❌ Ошибка: %v",
  "wizard.preview.status_ready": "✅ Превью готово",

  "wizard.save.error_config_empty": "ParserConfig пуст",
  "wizard.save.error_config_invalid": "ParserConfig некорректен",
  "wizard.save.error_no_sources": "Добавьте хотя бы один источник: на вкладке «Источники» (Добавить) или в ParserConfig на вкладке «Outbound'ы».",
  "wizard.save.dialog_saving": "Сохранение",
  "wizard.save.dialog_in_progress": "Сохранение уже выполняется... Подождите.",
  "wizard.save.status_waiting": "Ожидание парсинга...",
  "wizard.save.status_parsing": "Парсинг подписок...",
  "wizard.save.status_building": "Сборка конфига...",
  "wizard.save.status_preparing": "Подготовка...",
  "wizard.save.status_validating": "Валидация...",
  "wizard.save.status_saving_state": "Сохранение состояния...",
  "wizard.save.status_done": "Готово",
  "wizard.save.button_copy": "Копировать конфиг",
  "wizard.save.dialog_validation_failed": "Валидация не пройдена",
  "wizard.save.dialog_copied_title": "Скопировано",
  "wizard.save.dialog_copied_message": "Конфиг скопирован в буфер обмена.",
  "wizard.save.dialog_success_message": "Конфиг записан в %s\n\n✅ Валидация: Пройдена",
  "wizard.save.dialog_success_title": "Конфиг сохранён",
  "wizard.save.error_parse_failed": "Не удалось распарсить подписки",
  "wizard.save.error_controller": "контроллер недоступен",

  "wizard.add_rule.title_add": "Добавить правило",
  "wizard.add_rule.title_edit": "Редактировать правило",
  "wizard.add_rule.placeholder_name": "Название правила",
  "wizard.add_rule.placeholder_ip": "Введите IP-адреса (формат CIDR)\nнапр., 192.168.1.0/24",
  "wizard.add_rule.placeholder_url": "Введите домены или URL (по одному на строку)\nнапр., example.com",
  "wizard.add_rule.label_processes": "Процессы (выберите через всплывающее окно):",
  "wizard.add_rule.button_select_processes": "Выбрать процессы...",
  "wizard.add_rule.check_match_by_path": "Поиск по пути",
  "wizard.add_rule.radio_simple": "Простой",
  "wizard.add_rule.radio_regex": "Регулярные выражения",
  "wizard.add_rule.placeholder_path_simple": "По одному на строку. Используйте * как подстановку (напр. */steam/* или *\\Steam\\*).",
  "wizard.add_rule.placeholder_path_regex": "По одному на строку. Полное регулярное выражение (без обёртки /regex/i). Напр. ^C:\\\\Games\\\\.* или .*steam.*",
  "wizard.add_rule.label_path_patterns": "Шаблоны путей (по одному на строку):",
  "wizard.add_rule.placeholder_custom": "Произвольный JSON (напр., {})",
  "wizard.add_rule.label_custom_json": "Произвольный JSON:",
  "wizard.add_rule.placeholder_srs_urls": "URL SRS-файлов (по одному на строку)\nнапр. https://raw.githubusercontent.com/.../file.srs",
  "wizard.add_rule.label_srs_urls": "URL SRS-файлов (по одному на строку):",
  "wizard.add_rule.placeholder_raw": "{\"ip_cidr\": [], \"outbound\": \"proxy-out\"}",
  "wizard.add_rule.type_ip": "IP-адреса (CIDR)",
  "wizard.add_rule.type_domain": "Домены/URL",
  "wizard.add_rule.type_process": "Процессы",
  "wizard.add_rule.type_srs": "SRS",
  "wizard.add_rule.type_custom": "Произвольный JSON",
  "wizard.add_rule.domain_exact": "Точные домены",
  "wizard.add_rule.domain_suffix": "Суффикс",
  "wizard.add_rule.domain_keyword": "Ключевое слово",
  "wizard.add_rule.domain_regex": "Регулярное выражение",
  "wizard.add_rule.label_ip": "IP-адреса (по одному на строку, формат CIDR):",
  "wizard.add_rule.label_domains": "Домены (по одному на строку):",
  "wizard.add_rule.label_suffixes": "Суффиксы доменов (по одному на строку):",
  "wizard.add_rule.label_keywords": "Ключевые слова доменов (по одному на строку):",
  "wizard.add_rule.label_domain_regex": "Регулярное выражение для доменов:",
  "wizard.add_rule.placeholder_domain_regex": "Напр. ^.*\\.google\\.com$ или .*\\.(google|youtube)\\.com$ (полное regex, без обёртки /.../ )",
  "wizard.add_rule.label_outbound": "Outbound:",
  "wizard.add_rule.button_add": "Добавить",
  "wizard.add_rule.button_save": "Сохранить",
  "wizard.add_rule.button_cancel": "Отмена",
  "wizard.add_rule.button_remove": "−",
  "wizard.add_rule.window_select_processes": "Выбор процессов",
  "wizard.add_rule.button_add_process": "+ Добавить",
  "wizard.add_rule.button_refresh": "Обновить",
  "wizard.add_rule.button_close": "Закрыть",
  "wizard.add_rule.label_name": "Название правила:",
  "wizard.add_rule.label_type": "Тип правила:",
  "wizard.add_rule.tab_form": "Форма",
  "wizard.add_rule.tab_raw": "Raw",
  "wizard.add_rule.error_name_required": "Название правила обязательно",
  "wizard.add_rule.error_raw_empty": "Raw JSON пуст",
  "wizard.add_rule.error_must_be_object": "правило должно быть JSON-объектом",
  "wizard.add_rule.error_must_have_outbound": "правило должно содержать «outbound» или «action»",
  "wizard.add_rule.dialog_not_recognized_title": "Правило не распознано",
  "wizard.add_rule.dialog_not_recognized_msg": "Не удалось распознать правило, форма не может быть загружена; остаёмся на Raw.",
  "wizard.add_rule.srs_hint": "Рекомендуем искать подходящие файлы наборов правил в проекте:",
  "wizard.add_rule.srs_dialog_title": "Наборы правил SRS",
  "wizard.add_rule.srs_dialog_close": "Закрыть",
  "wizard.add_rule.button_open": "Открыть",
  "wizard.add_rule.error_path_required": "введите хотя бы один шаблон пути",
  "wizard.add_rule.error_srs_required": "введите хотя бы один URL SRS",
  "wizard.add_rule.error_srs_valid": "введите хотя бы один корректный URL SRS",
  "wizard.add_rule.error_custom_empty": "Произвольный JSON пуст",
  "wizard.add_rule.error_custom_object": "Произвольный JSON должен быть объектом",

  "wizard.save_state.title": "Сохранить состояние",
  "wizard.save_state.placeholder_id": "Введите ID состояния (a-z, A-Z, 0-9, -, _)",
  "wizard.save_state.placeholder_comment": "Комментарий (необязательно)",
  "wizard.save_state.warning_exists": "Состояние с таким ID уже существует. Оно будет перезаписано.",
  "wizard.save_state.label_id": "ID состояния:",
  "wizard.save_state.label_comment": "Комментарий:",
  "wizard.save_state.button_save": "Сохранить",
  "wizard.save_state.button_cancel": "Отмена",
  "wizard.save_state.error_empty": "ID не может быть пустым",

  "wizard.load_state.title": "Загрузить состояние",
  "wizard.load_state.error_load_list": "Не удалось загрузить список состояний",
  "wizard.load_state.suffix_current": " (Текущее)",
  "wizard.load_state.button_load": "Загрузить",
  "wizard.load_state.button_new": "Новое",
  "wizard.load_state.button_delete": "Удалить",
  "wizard.load_state.button_cancel": "Отмена",
  "wizard.load_state.error_delete_current": "Нельзя удалить текущее состояние (state.json)",
  "wizard.load_state.dialog_delete_title": "Удалить состояние",
  "wizard.load_state.dialog_delete_confirm": "Удалить состояние «%s»?",
  "wizard.load_state.error_delete": "Не удалось удалить состояние",

  "wizard.get_free.loading_title": "Загрузка",
  "wizard.get_free.loading_msg": "Скачивание get_free.json...",
  "wizard.get_free.error_occurred": "Произошла ошибка: %v",
  "wizard.get_free.error_download": "Не удалось скачать get_free.json:\n\nПроверьте подключение к интернету и попробуйте снова.",
  "wizard.get_free.error_load": "Не удалось загрузить get_free.json:\n\nПроверьте файл или попробуйте скачать заново.",
  "wizard.get_free.error_data_not_loaded": "Ошибка: данные не были загружены",
  "wizard.get_free.error_process": "Не удалось обработать get_free.json",
  "wizard.get_free.button_apply": "Применить конфигурацию",
  "wizard.get_free.dialog_apply_title": "Применить конфигурацию",
  "wizard.get_free.dialog_apply_confirm": "Применение этой конфигурации заменит ваши текущие источники и правила. Продолжить?",
  "wizard.get_free.error_apply": "Не удалось применить конфигурацию",
  "wizard.get_free.dialog_success_title": "Успех",
  "wizard.get_free.dialog_success_msg": "Конфигурация из get_free.json успешно применена!",
  "wizard.get_free.dialog_title": "Бесплатный VPN",
  "wizard.get_free.button_close": "Закрыть",

  "wizard.outbound.title_edit": "Редактировать Outbound",
  "wizard.outbound.title_add": "Добавить Outbound",
  "wizard.outbound.placeholder_tag": "напр. proxy-out",
  "wizard.outbound.type_manual": "ручной (selector)",
  "wizard.outbound.type_auto": "авто (urltest)",
  "wizard.outbound.placeholder_comment": "Комментарий (необязательно)",
  "wizard.outbound.scope_all": "Для всех",
  "wizard.outbound.scope_source": "Для источника: ",
  "wizard.outbound.label_source": "Источник ",
  "wizard.outbound.label_tag": "тег",
  "wizard.outbound.placeholder_filter": "напр. /🇳🇱/i или !/(🇷🇺)/i",
  "wizard.outbound.placeholder_preferred": "напр. /🇳🇱/i",
  "wizard.outbound.label_filters": "Фильтры (ключ и значение; используйте !/regex/i для исключения)",
  "wizard.outbound.label_preferred": "Предпочтительный по умолчанию (фильтр для узла по умолчанию)",
  "wizard.outbound.label_add_outbounds": "Добавить outbound'ы в начало (direct-out, reject и др.)",
  "wizard.outbound.label_raw_json": "Raw JSON outbound",
  "wizard.outbound.button_docs": "📖 Документация",
  "wizard.outbound.label_scope": "Область",
  "wizard.outbound.label_tag_field": "Тег",
  "wizard.outbound.label_type": "Тип",
  "wizard.outbound.label_comment": "Комментарий",
  "wizard.outbound.preview_switch": "Перейдите на вкладку «Превью», чтобы увидеть узлы для этого outbound.",
  "wizard.outbound.preview_no_presenter": "Превью недоступно в этом контексте (нет презентера).",
  "wizard.outbound.preview_model_nil": "Превью недоступно: модель визарда не инициализирована.",
  "wizard.outbound.preview_invalid_json": "Не удалось построить превью: некорректный JSON. Переключитесь на вкладку «Raw» и исправьте JSON.",
  "wizard.outbound.preview_cache_failed": "Не удалось построить кэш превью: %v",
  "wizard.outbound.preview_no_nodes": "Нет узлов для превью. Настройте источники и попробуйте снова.",
  "wizard.outbound.preview_unknown_source": "Неизвестный источник",
  "wizard.outbound.preview_status": "%d узел(ов) всего, %d совпало с фильтрами",
  "wizard.outbound.preview_default": ", по умолчанию: %s",
  "wizard.outbound.preview_also_includes": " | Также включает: %s",
  "wizard.outbound.preview_source_errors": " | ⚠️ %d ошибок источников",
  "wizard.outbound.tab_settings": "Настройки",
  "wizard.outbound.tab_raw": "Raw",
  "wizard.outbound.tab_preview": "Превью",
  "wizard.outbound.button_cancel": "Отмена",
  "wizard.outbound.button_save": "Сохранить",
  "wizard.outbound.error_config": "ParserConfig недоступен",
  "wizard.outbound.error_invalid_json": "некорректный JSON",
  "wizard.outbound.error_tag_required": "тег обязателен",
  "wizard.outbound.error_open_docs": "не удалось открыть документацию",
  "wizard.outbound.configurator_label": "Outbound'ы:",
  "wizard.outbound.reorder_up": "Выше (только внутри этой подписки или глобального списка).",
  "wizard.outbound.reorder_up_off": "Нельзя выше: уже первый в блоке, или строка выше — другая подписка / глобальный список.",
  "wizard.outbound.reorder_down": "Ниже (только внутри этой подписки или глобального списка).",
  "wizard.outbound.reorder_down_off": "Нельзя ниже: уже последний в блоке, или строка ниже — другая подписка / глобальный список.",
  "wizard.outbound.button_add": "Добавить"
}
