{
  "common": {
    "save": "Сохранить",
    "cancel": "Отмена",
    "delete": "Удалить",
    "edit": "Изменить",
    "add": "Добавить",
    "create": "Создать",
    "back": "Назад",
    "backToList": "Назад к списку",
    "loading": "Загрузка...",
    "error": "Ошибка",
    "success": "Успешно",
    "confirm": "Подтвердить",
    "yes": "Да",
    "no": "Нет",
    "enabled": "Включено",
    "disabled": "Отключено",
    "enable": "Включить",
    "disable": "Отключить",
    "active": "Активен",
    "inactive": "Неактивен",
    "expired": "Истек",
    "actions": "Действия",
    "status": "Статус",
    "name": "Название",
    "description": "Описание",
    "settings": "Настройки",
    "online": "Онлайн",
    "offline": "Офлайн",
    "unknown": "Неизвестно",
    "unlimited": "Безлимит",
    "none": "Нет",
    "all": "Все",
    "search": "Поиск",
    "filter": "Фильтр",
    "refresh": "Обновить",
    "sync": "Синхронизировать",
    "download": "Скачать",
    "upload": "Загрузить",
    "close": "Закрыть",
    "copied": "Скопировано!",
    "copy": "Копировать",
    "total": "Всего",
    "of": "из",
    "now": "сейчас",
    "connections": "подключений",
    "server": "Сервер",
    "ports": "Порты",
    "clear": "Очистить"
  },
  "nav": {
    "dashboard": "Главная",
    "stats": "Статистика",
    "nodes": "Ноды",
    "network": "Сеть",
    "users": "Пользователи",
    "groups": "Группы",
    "settings": "Настройки",
    "logout": "Выход"
  },
  "auth": {
    "login": "Логин",
    "password": "Пароль",
    "loginTitle": "Вход в панель",
    "loginButton": "Войти",
    "enterLogin": "Введите логин",
    "enterPassword": "Введите пароль",
    "invalidCredentials": "Неверный логин или пароль",
    "sessionExpired": "Сессия истекла, войдите снова",
    "totpTitle": "Подтверждение входа",
    "totpSetupTitle": "Подключение двухфакторной защиты",
    "totpSettingsTitle": "Подтверждение настройки TOTP",
    "totpPasswordChangeTitle": "Подтвердите смену пароля",
    "totpPasswordChangeDescription": "Введите текущий TOTP-код, чтобы применить новый пароль.",
    "totpDisableTitle": "Подтвердите отключение TOTP",
    "totpDisableDescription": "Введите текущий TOTP-код, чтобы отключить двухфакторную защиту.",
    "totpRotateCurrentTitle": "Подтвердите текущий TOTP-код",
    "totpRotateCurrentDescription": "Введите текущий TOTP-код, чтобы продолжить перевыпуск секрета.",
    "totpSetupDescription": "Отсканируйте QR-код в приложении-аутентификаторе и введите 6-значный код.",
    "totpLoginDescription": "Введите код из приложения-аутентификатора, чтобы завершить вход.",
    "totpCode": "Код подтверждения",
    "totpCodePlaceholder": "123456",
    "totpVerifyButton": "Подтвердить",
    "totpApplyPasswordButton": "Применить новый пароль",
    "totpDisableButton": "Отключить TOTP",
    "totpContinueButton": "Продолжить",
    "totpQrHint": "Если QR-код не читается, используйте секрет вручную.",
    "totpManualSecret": "Секрет для ручного ввода",
    "totpRequired": "Введите код подтверждения",
    "invalidTotp": "Неверный код подтверждения",
    "totpPendingExpired": "Сессия подтверждения истекла, войдите заново",
    "tooManyAttempts": "Слишком много попыток входа. Попробуйте через 15 минут.",
    "tooManyTotpAttempts": "Слишком много попыток подтверждения. Попробуйте позже.",
    "totpLoginLockoutMessage": "Вход временно заблокирован из-за большого количества неверных TOTP-кодов.",
    "totpLockoutUntilLabel": "Разблокировка в",
    "totpLockoutRemainingLabel": "Осталось времени",
    "totpLockoutExpired": "Истекло",
    "invalidCurrentPassword": "Неверный текущий пароль",
    "enterCurrentPassword": "Введите текущий пароль",
    "enterCurrentTotp": "Введите текущий TOTP-код",
    "invalidCurrentTotp": "Неверный текущий TOTP-код",
    "enterPasswordAndTotp": "Введите текущий пароль и TOTP-код",
    "totpConfigError": "Ошибка настройки TOTP. Обратитесь к администратору",
    "totpFlowError": "Ошибка запуска TOTP-flow",
    "totpConfirmError": "Ошибка подтверждения TOTP",
    "totpDisableError": "Ошибка отключения TOTP",
    "totpAlreadyEnabled": "TOTP уже включен",
    "totpAlreadyDisabled": "TOTP уже отключен",
    "totpRequiredForRotate": "Для перевыпуска TOTP должен быть включен",
    "totpDisabled": "TOTP успешно отключен",
    "totpEnabled": "TOTP успешно подключен",
    "totpRotated": "Новый TOTP-секрет успешно подключен",
    "passwordChanged": "Пароль успешно изменён"
  },
  "dashboard": {
    "title": "Главная",
    "totalUsers": "Всего пользователей",
    "activeUsers": "активных",
    "totalNodes": "Всего нод",
    "onlineNodes": "онлайн",
    "totalTraffic": "Всего трафика",
    "total": "всего",
    "systemInfo": "Система",
    "cpu": "CPU",
    "memory": "Память",
    "uptime": "Аптайм",
    "panelVersion": "Версия панели",
    "quickActions": "Быстрые действия",
    "createBackup": "Создать бэкап",
    "restoreBackup": "Восстановить БД",
    "recentLogs": "Логи",
    "nodesStatus": "Статус нод",
    "load": "Нагрузка",
    "speed": "Скорость",
    "node": "Нода",
    "addNode": "Добавить ноду",
    "noNodes": "Нет нод",
    "noLogs": "Нет логов",
    "loadError": "Ошибка загрузки",
    "panel": "Панель",
    "addUser": "Создать пользователя",
    "syncStarted": "Синхронизация запущена...",
    "syncSuccess": "Синхронизация запущена",
    "nodeRestarted": "Нода перезапущена",
    "restartError": "Ошибка перезапуска",
    "creatingBackup": "Создание backup...",
    "backupDownloaded": "Backup скачан",
    "backupError": "Ошибка backup",
    "restoringDb": "Восстановление БД...",
    "dbRestored": "БД восстановлена! Перезагрузка...",
    "restoreConfirm": "Восстановить базу данных из \"{filename}\"?\n\n⚠️ Текущие данные будут заменены!",
    "backupDb": "Backup БД",
    "restoreDb": "Restore БД",
    "showAll": "Показать все",
    "pauseLogs": "Пауза",
    "resumeLogs": "Продолжить",
    "logsConnected": "Live",
    "logsDisconnected": "Отключено"
  },
  "nodes": {
    "title": "Ноды",
    "addNode": "Добавить ноду",
    "editNode": "Редактирование ноды",
    "newNode": "Новая нода",
    "nodeName": "Название *",
    "nodeNamePlaceholder": "Германия, Нидерланды...",
    "nodeNameHint": "Отображается в подписке клиента",
    "ipAddress": "IP адрес *",
    "domain": "Домен (для SNI)",
    "domainHint": "Опционально. Используется для TLS сертификата (ACME)",
    "sni": "SNI (Server Name Indication)",
    "sniHint": "Кастомный SNI для клиентских подключений (domain fronting). Работает только с self-signed сертификатами (без домена). Если указан домен, SNI должен совпадать с ним",
    "flag": "Флаг (эмодзи)",
    "flagPlaceholder": "🇩🇪",
    "flagHint": "Эмодзи флага страны",
    "comment": "Комментарий",
    "commentPlaceholder": "Провайдер, локация, заметки…",
    "commentHint": "Произвольная заметка, показывается в списке нод и на дашборде (до 500 символов)",
    "port": "Основной порт",
    "portRange": "Port Hopping диапазон",
    "portRangeHint": "Клиенты будут подключаться на эти порты",
    "statsPort": "Порт API",
    "statsSecret": "Секрет API",
    "sectionStatsApi": "Stats API",
    "sectionStatsHint": "Настройки Traffic Stats API.",
    "docsLink": "Открыть документацию",
    "groups": "Группы серверов",
    "groupsHint": "Пользователи этих групп получат доступ к этой ноде. Если не выбрано — доступна всем.",
    "noGroups": "Нет групп.",
    "createGroup": "Создайте группу",
    "sshSettings": "SSH доступ (опционально)",
    "sshSettingsHint": "Для автоматического управления конфигом ноды",
    "sshPort": "Порт SSH",
    "sshUsername": "Пользователь",
    "sshPassword": "Пароль SSH",
    "sshPasswordSet": "(установлен)",
    "sshPasswordPlaceholder": "Введите пароль",
    "sshPasswordKeep": "Оставьте пустым чтобы не менять",
    "sshPasswordEncrypted": "Пароль хранится в зашифрованном виде",
    "sshPrivateKey": "Приватный ключ",
    "sshPrivateKeySet": "(установлен)",
    "sshPrivateKeyHint": "Вставьте приватный ключ (формат OpenSSH или PEM). Оставьте пустым чтобы не менять.",
    "sshPrivateKeyEncrypted": "Приватный ключ хранится в зашифрованном виде",
    "sshPrivateKeyClear": "Удалить ключ",
    "sshPrivateKeyUpload": "Загрузить файл",
    "generateSshKey": "Сгенерировать и установить SSH ключ",
    "generateSshKeyHint": "Генерирует пару ed25519 ключей и устанавливает публичный ключ на сервер через SSH (требуется пароль или уже установленный ключ).",
    "generateSshKeyWarning": "Сгенерировать и установить новый SSH ключ на эту ноду?\n\nЭто:\n• Сгенерирует новую пару ed25519 ключей\n• Добавит публичный ключ в ~/.ssh/authorized_keys\n• Сохранит приватный ключ в панели (зашифрованно)\n\nСуществующий пароль останется без изменений.",
    "sshKeyGenerating": "Генерация и установка ключа...",
    "sshKeyInstalled": "SSH ключ сгенерирован и установлен!",
    "sshKeyError": "Ошибка генерации ключа",
    "downloadSshKey": "Скачать SSH ключ",
    "downloadSshKeyMissing": "Для этой ноды не настроен SSH приватный ключ",
    "initScript": "Init-скрипт",
    "initScriptHint": "Bash-скрипт, выполняемый перед авто-настройкой через SSH (например, включить BBR, настроить swap, установить пакеты)",
    "initScriptUseLast": "Использовать последний скрипт",
    "initScriptRunning": "Выполнение init-скрипта...",
    "initScriptDone": "Init-скрипт выполнен",
    "initScriptFailed": "Init-скрипт завершился с ошибкой (не критично, настройка продолжается)",
    "maxOnlineUsers": "Лимит онлайн пользователей",
    "maxOnlineHint": "0 = без лимита. При превышении нода скрывается из подписки (если включено).",
    "rankingCoefficient": "Приоритет (ranking)",
    "rankingHint": "Меньше = выше в подписке. Перетаскивание на странице нод перезапишет это значение",
    "sortByPriority": "По приоритету",
    "sortByName": "По имени",
    "sortByOnline": "По онлайну",
    "sortByStatus": "По статусу",
    "reorderSaved": "Порядок сохранён",
    "reorderFailed": "Не удалось сохранить порядок",
    "lbDragHint": "Балансировка нагрузки активна — перетаскивание задаёт приоритет при одинаковой нагрузке нод",
    "dragToReorder": "Перетащите для изменения порядка",
    "hysteriaConfig": "Конфигурация Hysteria",
    "useCustomConfig": "Использовать кастомный конфиг",
    "customConfigHint": "Если включено — при синхронизации будет использоваться конфиг ниже вместо автогенерации",
    "customConfigLabel": "Конфиг config.yaml",
    "customConfigFormat": "YAML формат. Используйте кнопку \"Сгенерировать\" чтобы заполнить базовым конфигом.",
    "generateConfig": "Сгенерировать базовый конфиг",
    "loadCurrentConfig": "Загрузить текущий с ноды",
    "cascadeRole": "Роль в каскаде",
    "cascadeRoleHint": "Роль ноды в каскадной топологии. Bridge-ноды скрыты из подписок пользователей.",
    "roleStandalone": "Обычная автономная нода",
    "rolePortal": "Принимает клиентов и туннелирует трафик через каскад",
    "roleBridge": "Точка выхода в интернет, скрыта из подписок",
    "roleRelay": "Промежуточный хоп, перенаправляет трафик дальше по цепочке",
    "country": "Страна",
    "countryHint": "Код страны для группировки на карте сети",
    "bridgeNodeHint": "Bridge ноды НЕ видны в подписках. Автонастройка установит только Xray (без Агента, без Reality). Конфиг бриджа деплоится при создании каскадной связи.",
    "portalNodeHint": "Portal нода — пользователи подключаются сюда. Автонастройка работает как обычно (Xray + Agent + Reality). После настройки создайте каскадную связь к Bridge ноде.",
    "nodeActive": "Нода активна",
    "activeColumn": "Активна",
    "activeEnabled": "Нода включена",
    "activeDisabled": "Нода отключена",
    "activeToggleError": "Не удалось изменить runtime-состояние ноды",
    "enableActiveTitle": "Запустить сервис и включить ноду",
    "disableActiveTitle": "Остановить сервис и отключить ноду",
    "enableActiveAria": "Запустить сервис и включить ноду",
    "disableActiveAria": "Остановить сервис и отключить ноду",
    "createNode": "Создать ноду",
    "saveNode": "Сохранить",
    "management": "Управление",
    "autoSetup": "Настроить автоматически",
    "autoSetupConfirm": "Настроить ноду автоматически через SSH?\n\nЭто:\n• Установит Hysteria (если не установлена)\n• Сгенерирует сертификат\n• Загрузит конфигурацию\n• Настроит port hopping\n• Перезапустит сервис",
    "autoSetupConfirmXray": "Настроить ноду автоматически через SSH?\n\nЭто:\n• Установит Xray-core (последняя версия)\n• Сгенерирует Reality ключи (если нужны)\n• Установит CC Agent (управление без SSH)\n• Настроит файрвол\n• Запустит сервисы",
    "setupRunning": "Выполняется настройка... Это может занять 1-2 минуты.",
    "terminal": "SSH Терминал",
    "broadcastTerminal": "Broadcast",
    "viewLogs": "Просмотр логов",
    "checkStatus": "Проверить статус",
    "resetStatus": "Сбросить статус",
    "executionLogs": "Логи выполнения:",
    "loadingLogs": "Загрузка логов...",
    "checking": "Проверка...",
    "resettingStatus": "Сброс статуса...",
    "statusReset": "Статус сброшен на online",
    "nodeConfig": "Конфиг для ноды",
    "configHint": "Скопируйте этот конфиг в <code>/etc/hysteria/config.yaml</code> на сервере:",
    "loadConfigConfirm": "Загрузить текущий конфиг с ноды через SSH?",
    "configLoaded": "Конфиг загружен!",
    "saveFirst": "Сначала сохраните ноду",
    "syncNode": "Синхронизировать",
    "nodeStatus": "Статус ноды",
    "onlineUsers": "Онлайн",
    "lastSync": "Последняя синхр.",
    "customConfig": "Кастомный конфиг",
    "confirmDelete": "Удалить ноду?",
    "confirmDeleteFull": "Вы уверены, что хотите удалить эту ноду?",
    "setupInProgress": "Настройка выполняется...",
    "setupComplete": "Настройка завершена!",
    "setupFailed": "Ошибка настройки",
    "noNodes": "Нет добавленных нод",
    "addFirstNode": "Добавить первую ноду",
    "ipAlreadyExists": "Нода с таким IP уже существует",
    "ipTypeConflict": "Нода {protocol} с таким IP уже существует",
    "addPairedProtocol": "Добавить второй протокол на этом сервере",
    "dualProtocol": "Два протокола",
    "siblingNodeDetected": "SSH-настройки будут скопированы с уже существующей ноды автоматически.",
    "siblingExistsHint": "Нода {protocol} с таким IP уже существует — SSH-настройки будут синхронизированы автоматически.",
    "nameAndIpRequired": "Название и IP-адрес обязательны",
    "sectionProtocol": "Протокол",
    "virtualName": "Виртуальная",
    "virtualDesc": "Балансировщик · авто-выбор между реальными нодами",
    "virtualSection": "Настройки виртуальной ноды",
    "virtualSectionHint": "Виртуальная нода объединяет несколько реальных серверов в одну запись подписки с балансировкой. Клиентский Xray сам выбирает лучший сервер по выбранной стратегии. На сервере ничего настраивать не нужно.",
    "virtualSelectMode": "Источники",
    "virtualSelectModeManual": "Вручную",
    "virtualSelectModeManualHint": "Выбираешь конкретные ноды для балансировки.",
    "virtualSelectModeGroup": "По группе",
    "virtualSelectModeGroupHint": "Берутся все активные ноды выбранной группы — новые ноды добавляются автоматически.",
    "virtualSources": "Выбери ноды-источники",
    "virtualSourcesHint": "Только отмеченные ноды участвуют в балансировке. Клиент видит одну запись — Xray сам решает через какой сервер пускать трафик.",
    "virtualNoCandidates": "Нет доступных нод. Сначала создайте обычные hysteria/xray ноды.",
    "virtualSourceGroup": "Группа-источник",
    "virtualSourceGroupHint": "Все активные не-виртуальные ноды из этой группы будут балансироваться. Новые ноды в группе подхватываются автоматически.",
    "virtualSourceGroupPlaceholder": "— Выберите группу —",
    "virtualStrategy": "Стратегия выбора",
    "virtualStrategyHint": "Как Xray на клиенте выбирает outbound. leastLoad/leastPing требуют обсерваторию ниже.",
    "virtualStrategyRandom": "Random",
    "virtualStrategyRandomDesc": "Случайный сервер при каждом подключении. Без замеров. Подходит когда все ноды равноценны.",
    "virtualStrategyRoundRobin": "Round Robin",
    "virtualStrategyRoundRobinDesc": "По кругу. Равномерно распределяет, но без учёта качества.",
    "virtualStrategyLeastPing": "Least Ping",
    "virtualStrategyLeastPingDesc": "Сервер с минимальной задержкой. Требует обсерваторию.",
    "virtualStrategyLeastLoad": "Least Load",
    "virtualStrategyLeastLoadDesc": "Самый стабильный сервер (минимальный jitter). Рекомендовано для VPN. Требует burstObservatory.",
    "virtualObservatory": "Обсерватория (настройки пинга)",
    "virtualObservatoryHint": "Xray периодически пингует каждый источник, чтобы оценить его качество. Дефолтные значения подходят для большинства случаев.",
    "virtualObsDestination": "URL для пинга",
    "virtualObsDestinationHint": "URL, который пингуется через каждый источник. Должен быстро возвращать HTTP 204. По умолчанию — Google.",
    "virtualObsConnectivity": "URL проверки интернета",
    "virtualObsConnectivityHint": "Опционально. Пинг считается провальным только если этот URL тоже недоступен напрямую. Пусто = не используется.",
    "virtualObsConnectivityPlaceholder": "пусто для дефолта",
    "virtualObsInterval": "Интервал",
    "virtualObsIntervalHint": "Как часто пинговать. Меньше = быстрее реакция, больше = меньше расход батареи.",
    "virtualObsTimeout": "Таймаут",
    "virtualObsTimeoutHint": "Сколько ждать ответа. Дольше = меньше ложных срабатываний.",
    "virtualObsSampling": "Замеров",
    "virtualObsSamplingHint": "Сколько последних замеров учитывать. Больше = стабильнее выбор.",
    "virtualFallbackToFirst": "Fallback на первый источник",
    "virtualFallbackToFirstHint": "Когда все источники недоступны — пускать трафик через первый, а не разрывать соединение.",
    "virtualNoStatus": "Виртуальная нода не подключается к серверу — она агрегирует другие",
    "sectionNetwork": "Сеть",
    "sectionObfuscation": "Обфускация (obfs)",
    "sectionObfuscationHint": "Salamander маскирует QUIC-трафик от DPI. Включайте только если оператор блокирует Hysteria — на мобильных сетях может работать хуже. Важно: при включении сервер становится несовместим со стандартным QUIC и перестает быть валидным HTTP/3 сервером.",
    "sectionLimits": "Лимиты и приоритет",
    "hopInterval": "Интервал Port Hopping",
    "hopIntervalHint": "Интервал смены порта (`hopInterval`). По умолчанию: 30s, минимум: 5s.",
    "sectionAcmeAdvanced": "ACME",
    "sectionAcmeAdvancedHint": "Дополнительные параметры ACME.",
    "acmeAdvancedToggle": "Дополнительные параметры ACME",
    "optionalSuffix": "опционально",
    "advancedSettings": "Расширенные параметры (опционально)",
    "acmeEmail": "ACME Email",
    "acmeCa": "ACME CA",
    "acmeListenHost": "ACME Listen Host",
    "acmeType": "Тип ACME challenge",
    "acmeTypeAuto": "auto (по умолчанию)",
    "acmeDisableHttpChallenge": "Отключить HTTP challenge",
    "acmeDisableTlsAlpnChallenge": "Отключить TLS-ALPN challenge",
    "acmeHttpAltPort": "HTTP Alt Port",
    "acmeTlsAltPort": "TLS Alt Port",
    "acmeDnsName": "DNS провайдер",
    "acmeDnsProviderHint": "Актуальные имена провайдеров смотрите в документации ACME DNS config.",
    "acmeDnsConfig": "Конфиг DNS провайдера (JSON)",
    "acmeDnsConfigHint": "JSON-объект с параметрами/ключами провайдера.",
    "sectionMasquerade": "Маскарад",
    "sectionMasqueradeHint": "Режимы masquerade из документации: `proxy` и `string` (режим `file` намеренно не вынесен в UI).",
    "masqueradeType": "Режим маскарада",
    "masqueradeProxyUrl": "Proxy URL",
    "masqueradeProxyRewriteHost": "Переписывать заголовок Host",
    "masqueradeProxyInsecure": "Отключить TLS-проверку для проксируемого сайта",
    "masqueradeStringContent": "Возвращаемая строка",
    "masqueradeStringStatusCode": "HTTP статус",
    "masqueradeStringHeaders": "Заголовки ответа",
    "masqueradeStringHeadersHint": "Один заголовок на строку: key: value",
    "masqueradeListenHttp": "Адрес прослушивания HTTP (TCP)",
    "masqueradeListenHttps": "Адрес прослушивания HTTPS (TCP)",
    "masqueradeForceHttps": "Принудительный HTTPS (редирект всех HTTP-запросов)",
    "sectionBandwidth": "Bandwidth",
    "sectionBandwidthHint": "Ограничения скорости сервера и политика client bandwidth.",
    "sectionSpeedTest": "Speed Test",
    "sectionSpeedTestHint": "Включает встроенный Speed Test для клиентов Hysteria.",
    "sectionUdp": "UDP tweaks",
    "sectionUdpHint": "Параметры UDP forwarding и idle timeout.",
    "sectionSniff": "Protocol Sniffing",
    "sectionSniffHint": "Параметры protocol sniffing.",
    "sectionQuic": "QUIC Parameters",
    "sectionQuicHint": "Дополнительные параметры транспорта QUIC.",
    "optionalSectionHint": "Опционально.",
    "enableOptionalSection": "Включить опциональные параметры",
    "sectionPerformance": "Bandwidth, Speed Test и UDP",
    "bandwidthUp": "Лимит исходящей скорости сервера (up)",
    "bandwidthDown": "Лимит входящей скорости сервера (down)",
    "ignoreClientBandwidth": "Игнорировать client bandwidth",
    "speedTest": "Включить Speed Test",
    "enableAcl": "Включить ACL",
    "enableBandwidth": "Включить Bandwidth",
    "enableUdpTweaks": "Включить UDP tweaks",
    "disableUdp": "Отключить UDP forwarding",
    "udpIdleTimeout": "Таймаут простоя UDP",
    "sectionSniffQuic": "Protocol Sniffing и QUIC parameters",
    "sectionSniffQuicHint": "Расширенные параметры из Full Server Config.",
    "sniffDocsLink": "Документация: Protocol Sniffing",
    "quicDocsLink": "Документация: QUIC parameters",
    "sniffEnable": "Включить protocol sniffing",
    "sniffRewriteDomain": "Перезаписывать запросы, уже содержащие домен",
    "sniffTimeout": "Таймаут sniffing",
    "sniffTcpPorts": "Список TCP-портов",
    "sniffUdpPorts": "Список UDP-портов",
    "sniffPortsHint": "Формат как у Port Hopping: порты/диапазоны через запятую или `all`.",
    "quicInitStreamReceiveWindow": "Начальное окно приема QUIC stream",
    "quicMaxStreamReceiveWindow": "Максимальное окно приема QUIC stream",
    "quicInitConnReceiveWindow": "Начальное окно приема QUIC connection",
    "quicMaxConnReceiveWindow": "Максимальное окно приема QUIC connection",
    "quicMaxIdleTimeout": "Максимальный idle timeout",
    "quicMaxIncomingStreams": "Максимум одновременных incoming streams",
    "quicDisablePathMtuDiscovery": "Отключить QUIC path MTU discovery",
    "sectionResolver": "Resolver",
    "sectionResolverHint": "Настройки DNS resolver, используемого сервером.",
    "resolverEnabled": "Включить кастомный resolver",
    "resolverType": "Тип resolver",
    "resolverAddr": "Адрес resolver",
    "resolverTimeout": "Таймаут DNS-запроса",
    "resolverSni": "Resolver SNI",
    "resolverInsecure": "Отключить проверку TLS",
    "sectionAcl": "ACL",
    "sectionAclHint": "Используйте либо `inline`, либо `file` (не одновременно). Параметры GeoIP/GeoSite — опциональны.",
    "aclType": "Тип источника ACL",
    "aclFile": "Путь к ACL файлу",
    "aclInlineRules": "Inline-правила ACL",
    "aclInlineRulesHint": "По одному правилу на строку. Если пусто, используются legacy-дефолты ACL.",
    "aclGeoip": "Путь к базе GeoIP",
    "aclGeosite": "Путь к базе GeoSite",
    "aclGeoUpdateInterval": "Интервал обновления Geo-баз",
    "aclRulesEditorHint": "Inline-правила ACL редактируются на странице",
    "aclRulesEditorLink": "Outbounds / ACL",
    "domainHintHysteria": "Если указан — TLS-сертификат выпустится автоматически (ACME). Также используется в ссылках подписки вместо IP.",
    "sniHintHysteria": "Кастомный SNI для клиентов. Работает ТОЛЬКО без домена (self-signed сертификат). Если указан домен — это поле игнорируется.",
    "outboundsAclLockedDisabled": "Редактор ACL в Outbounds недоступен: ACL выключен в настройках ноды.",
    "hintDomain": "Домен для SNI и ACME сертификатов",
    "hintPortRange": "Диапазон UDP портов для port hopping (напр. 20000-50000)",
    "hintMaxOnline": "0 = без лимита. Используется для балансировки",
    "hintRanking": "Меньше = выше приоритет в подписке",
    "off": "выкл",
    "deleteError": "Ошибка удаления",
    "restart": "Перезапустить",
    "reconnect": "Переподключить",
    "sshNotConfigured": "SSH не настроен. Для автонастройки и терминала нужны SSH-данные.",
    "allStatuses": "Все статусы",
    "statusOnline": "Онлайн",
    "statusOffline": "Офлайн",
    "statusError": "Ошибка",
    "restartSuccess": "Нода перезапущена",
    "restartFailed": "Ошибка перезапуска",
    "xraySettings": "Настройки Xray VLESS",
    "xrayTransport": "Транспорт",
    "xraySecurity": "Защита",
    "xraySecurityReality": "Reality (без сертификата)",
    "xraySecurityTls": "TLS (файлы сертификата)",
    "xraySecurityNone": "Без защиты",
    "xrayFingerprint": "TLS Fingerprint",
    "xrayFingerprintHint": "uTLS отпечаток для TLS-рукопожатия (Reality/TLS)",
    "xrayFingerprintPoolHint": "Публикуемый отпечаток выбирается случайно из отмеченных.",
    "xrayFingerprintModeSingle": "Один отпечаток",
    "xrayFingerprintModeSingleHint": "Всегда публиковать один фиксированный отпечаток.",
    "xrayFingerprintModePool": "Случайный из набора",
    "xrayFingerprintModePoolHint": "Выберите несколько — публикуется случайный, меняется при обновлении кэша подписки (по TTL кэша).",
    "xrayAlpn": "ALPN",
    "xrayAlpnHint": "Через запятую: h3, h2, http/1.1 (только для TLS)",
    "xrayFlow": "Flow (XTLS)",
    "xrayFlowHint": "Только для TCP + Reality/TLS. Оставьте пустым для WebSocket/gRPC/XHTTP.",
    "xrayRealityDest": "Reality Destination",
    "xrayRealityDestHint": "Сайт с TLS 1.3 + H2 для маскировки (host:port)",
    "xrayRealitySni": "Reality SNI (serverNames)",
    "xrayRealitySniHint": "Через запятую. Должны соответствовать сертификату destination",
    "sniScan": "Подобрать SNI",
    "sniScanTitle": "SNI Сканер",
    "sniScanHint": "Сканирует подсеть /24 IP-адреса ноды на хосты с TLS 1.3 + H2 — подходящие для Reality destination и SNI.",
    "sniScanPortLabel": "Порт",
    "sniScanThreads": "Потоки",
    "sniScanTimeout": "Таймаут (с)",
    "sniScanStart": "Сканировать",
    "sniScanStop": "Стоп",
    "sniScanResults": "Результаты",
    "sniScanNoResults": "Подходящих SNI-хостов в этой подсети не найдено.",
    "sniScanApply": "Применить",
    "sniScanDomain": "Домен",
    "sniScanPing": "Пинг",
    "sniScanIp": "IP",
    "sniScanIssuer": "Издатель",
    "sniScanNeighborHint": "Тот же /24 что и нода — идеально для Reality",
    "sniScanOtherHint": "Реальный IP домена находится вне сканируемой подсети",
    "sniScanFound": "найдено",
    "sniScanScanning": "Сканирование…",
    "sniScanVerifying": "Проверка доменов…",
    "sniScanDone": "Готово",
    "sniScanErrIp": "Введите корректный IPv4-адрес",
    "xrayPrivateKey": "Приватный ключ",
    "xrayPublicKey": "Публичный ключ",
    "xrayShortIds": "Short IDs",
    "xrayShortIdsHint": "Hex-строки через запятую (0-16 символов). Пустая строка допустима.",
    "xraySpiderX": "Spider X (стартовый путь паука)",
    "xraySpiderXHint": "Стартовый URL паука REALITY при активной пробе. Лучше оставить пустым (REALITY использует случайный путь) или указать реалистичный путь под выбранный SNI (например /r/programming/ для www.reddit.com, /search?q=cloud для www.bing.com). Не используйте одинаковое значение на разных нодах — это создаёт сигнатуру.",
    "xrayWsPath": "WebSocket Path",
    "xrayWsHost": "WebSocket Host Header",
    "xrayWsHostHint": "Для CDN (Cloudflare). Оставьте пустым если не используете CDN.",
    "xrayGrpcService": "gRPC Service Name",
    "xrayXhttpPath": "XHTTP Path",
    "xrayXhttpHost": "XHTTP Host Header",
    "xrayXhttpHostHint": "Для CDN. Оставьте пустым если не используете CDN.",
    "xrayXhttpMode": "XHTTP Mode",
    "xrayXhttpModeHint": "auto (рекомендуется), packet-up (для строгих CDN), stream-up (для H2/H3), stream-one (один двунаправленный поток)",
    "xrayTlsSourceLabel": "Источник TLS-сертификата",
    "xrayTlsSourceScopeHint": "Одна стратегия на ноду — применяется ко всем TLS-inbound'ам (основному и дополнительным).",
    "xrayTlsSourcePanel": "Домен панели",
    "xrayTlsSourcePanelHint": "Маскироваться под домен панели — её Let's Encrypt сертификат встраивается в конфиг ноды и обновляется автоматически.",
    "xrayTlsSourceAcme": "Авто ACME (отдельный домен ноды)",
    "xrayTlsSourceAcmeHint": "Панель ставит на ноду acme.sh, выпускает Let's Encrypt сертификат для домена ноды через HTTP-01 и регистрирует cron на ноде. Xray перечитывает cert при ротации — push с панели не нужен.",
    "xrayTlsAcmeInfoLine": "Убедитесь, что DNS A-запись домена ноды указывает на её IP, а порт 80 свободен. Auto Setup установит acme.sh, выпустит cert и зарегистрирует автоматический cron на обновление.",
    "xrayTlsAcmeEmailLabel": "Email для Let's Encrypt",
    "xrayTlsAcmeEmailHint": "Используется для регистрации ACME-аккаунта. Оставьте пустым — будет взят панельный ACME_EMAIL из .env.",
    "xrayTlsSourceManual": "Вручную (свой домен + PEM)",
    "xrayTlsSourceManualHint": "Использовать отдельный домен для ноды и вставить полную цепочку сертификата и приватный ключ. PEM встраивается в конфиг ноды.",
    "xrayTlsSourceSelfSigned": "Self-signed",
    "xrayTlsSourceSelfSignedHint": "Временный сертификат генерируется на ноде. Клиенты должны включить allowInsecure — только для тестов.",
    "xrayTlsRecommended": "Рекомендуется",
    "xrayTlsTesting": "Тестовый",
    "xrayTlsEffectiveSni": "Активный SNI",
    "xrayTlsPanelDomainUnset": "PANEL_DOMAIN не задан — клиенты будут использовать домен или IP ноды",
    "xrayTlsPanelInfoLine": "На ноде не создаются файлы сертификата — панель отправляет текущий LE-сертификат в config.json при каждой синхронизации.",
    "xrayTlsManualDomainHint": "Укажите домен ноды в секции «Сеть» выше (он же будет использоваться как имя сервера TLS).",
    "xrayTlsSelfSignedWarning": "Self-signed сертификаты легко детектируются и требуют allowInsecure на каждом клиенте.",
    "xrayTlsSelfSignedHint": "Для production используйте реальный сертификат (panel или manual).",
    "xrayManualCertLabel": "Сертификат (PEM, полная цепочка)",
    "xrayManualKeyLabel": "Приватный ключ (PEM)",
    "xrayManualCertHint": "Вставьте полную цепочку: leaf-сертификат и промежуточные, каждый в отдельном блоке BEGIN/END.",
    "xrayManualKeyHint": "Вставьте PKCS8/EC/RSA приватный ключ. Хранится в Mongo и никогда не возвращается через API.",
    "xrayManualKeyMaskedHint": "Приватный ключ уже сохранён. Замените его, вставив новый PEM, или оставьте плейсхолдер ***SET***, чтобы сохранить текущий.",
    "xrayPemValid": "Корректный PEM-блок",
    "xrayPemInvalid": "Некорректный PEM — проверьте маркеры BEGIN/END",
    "xrayPemStored": "Сохранённый ключ оставлен",
    "domainHintXrayManual": "Домен используется как TLS server name и как Host-заголовок для ws/xhttp транспортов.",
    "xrayApiPort": "Xray API Port (локальный)",
    "xrayApiPortHint": "Локальный порт для API управления (не публичный, по умолчанию 61000)",
    "xrayFallbackDestLabel": "Fallback назначение (опционально)",
    "xrayFallbackDestHint": "Куда перенаправлять не-VLESS трафик (активный пробинг). Принимает порт (8080), host:port (127.0.0.1:8080), [v6]:port или unix:/path. Только для TCP+TLS — у Reality своя маскировка через dest.",
    "xrayFallbackDestPlaceholder": "127.0.0.1:8080",
    "xrayExtraInboundsTitle": "Дополнительные inbound'ы",
    "xrayExtraInboundsHint": "Запускайте на ноде несколько VLESS inbound'ов на разных портах и транспортах — каждый попадёт в подписку клиента.",
    "xrayAddInbound": "Добавить inbound",
    "xrayRemoveInbound": "Удалить inbound",
    "xrayRemoveInboundConfirm": "Удалить этот inbound? Подключённые клиенты на этом порту будут отключены при следующей синхронизации.",
    "xrayExtraInbound": "Дополнительный inbound",
    "xrayInboundLabel": "Метка",
    "xrayInboundLabelPlaceholder": "Например: Mobile, CDN, Backup",
    "xrayInboundUniqueName": "Уникальное имя",
    "xrayInboundUniqueNameHint": "Если включено, в подписке используется только метка вместо «Имя ноды (метка)»",
    "xrayInboundTag": "Тег inbound'а",
    "xrayInboundPortConflict": "Этот порт уже занят другим inbound'ом или API",
    "xrayInboundTagConflict": "Этот тег уже используется другим inbound'ом",
    "agentOutdatedTitle": "cc-agent устарел",
    "agentOutdatedMessage": "На ноде настроены дополнительные inbound'ы, но версия агента ниже 1.2.0 — он не сможет управлять пользователями на этих inbound'ах. Запустите автоустановку ноды из раздела управления, чтобы обновить агент.",
    "xrayGenerateKeys": "Сгенерировать ключи",
    "xrayKeysGenerated": "Ключи сгенерированы!",
    "xrayAutoGenerated": "Авто-генерация при настройке",
    "nodeInfo": "Информация о ноде",
    "xrayVersion": "Версия Xray",
    "agentVersion": "Версия агента",
    "agentStatus": "Статус агента",
    "agentOnline": "Онлайн",
    "agentOffline": "Офлайн",
    "usersInMemory": "Юзеров в памяти",
    "agentLastSeen": "Последняя связь",
    "agentPort": "Порт агента",
    "installAgent": "Установить агент",
    "cascadeLinks": "Каскадные связи",
    "portalColumn": "Portal",
    "bridgeColumn": "Bridge",
    "thisNode": "текущая",
    "portConflictTitle": "Конфликт портов",
    "portConflictDesc": "Порты 443/80 заняты панелью (Caddy). Xray на том же сервере должен использовать другой порт (напр. 8443). Иначе Xray сломает панель после перезагрузки сервера.",
    "obfsType": "Тип обфускации",
    "obfsPassword": "Пароль obfs",
    "obfsPasswordHint": "Одинаковый пароль должен быть установлен на сервере и клиенте.",
    "statsSecretAutoHint": "Оставьте пустым — секрет будет сгенерирован автоматически.",
    "xrayAutoGeneratedSetupHint": "Генерируется автоматически при настройке.",
    "confirmDeployCascade": "Деплоить эту каскадную связь?",
    "confirmUndeployCascade": "Убрать деплой этой каскадной связи?",
    "confirmDeleteCascade": "Удалить каскадную связь \"{name}\"? Это также уберёт деплой.",
    "xrayGenerateKeysConfirm": "Сгенерировать новые x25519 Reality ключи через SSH? Существующие ключи будут заменены.",
    "xrayKeysSuccess": "Ключи сгенерированы! Публичный ключ: {key}",
    "goToNetworkMap": "Карта сети",
    "addCascadeLink": "Добавить каскадную связь"
  },
  "users": {
    "title": "Пользователи",
    "addUser": "Добавить пользователя",
    "editUser": "Редактировать пользователя",
    "newUser": "Новый пользователь",
    "userId": "User ID *",
    "userIdPlaceholder": "Telegram ID или уникальный ID",
    "userIdHint": "Уникальный идентификатор пользователя",
    "username": "Username",
    "usernamePlaceholder": "@username",
    "usernameHint": "Опционально, для отображения",
    "hysteriaPassword": "Пароль Hysteria",
    "password": "Пароль",
    "subscriptionUrl": "URL подписки",
    "subscriptionLink": "Ссылка подписки",
    "universalLink": "Универсальная ссылка (приложения + браузер):",
    "copySubscription": "Копировать подписку",
    "openSubscription": "Открыть подписку",
    "groups": "Группы серверов",
    "groupsHint": "Пользователь получит доступ к нодам из этих групп. Если не выбрано — доступ ко всем нодам без групп.",
    "trafficLimit": "Лимит трафика (ГБ)",
    "trafficLimitHint": "0 = без ограничений",
    "trafficUsed": "Использовано трафика",
    "traffic": "Трафик",
    "maxDevices": "Лимит устройств",
    "maxDevicesHint": "0 = лимит группы, -1 = безлимит",
    "devices": "Устройства",
    "deviceFromGroup": "(группа)",
    "expireDays": "Срок действия (дней)",
    "expireDaysHint": "0 = бессрочно",
    "expireModeLabel": "Режим срока действия",
    "expireModeDays": "Дни",
    "expireModeDatetime": "Дата/время",
    "expireAtLabel": "Дата и время окончания",
    "expireAtHint": "Выберите локальные дату и время",
    "expireAtPastError": "Дата/время окончания не может быть в прошлом",
    "expireAtInvalidError": "Некорректный формат даты/времени окончания",
    "expireAt": "Истекает",
    "expires": "Истекает",
    "forever": "Бессрочно",
    "createdAt": "Создан",
    "activateNow": "Активировать сразу",
    "createUser": "Создать пользователя",
    "enable": "Включить",
    "disable": "Отключить",
    "enableUser": "Включить пользователя",
    "disableUser": "Отключить пользователя",
    "resetTraffic": "Сбросить трафик",
    "deleteUser": "Удалить пользователя",
    "deleteSelected": "Удалить выбранных",
    "selectVisible": "Выбрать всех видимых пользователей",
    "selectUser": "Выбрать пользователя",
    "confirmDelete": "Удалить пользователя",
    "confirmDeleteFull": "Вы уверены, что хотите удалить этого пользователя?",
    "confirmBulkDelete": "Удалить выбранных пользователей: {count}?",
    "bulkDeleteSuccess": "Удалено пользователей: {count}",
    "bulkDeletePartial": "Удалено пользователей: {count}. Проблем: {issues}",
    "bulkDeleteError": "Ошибка массового удаления",
    "noUsers": "Нет пользователей",
    "createFirst": "Создать первого",
    "filterByGroup": "Фильтр по группе",
    "filterByStatus": "Фильтр по статусу",
    "allGroups": "Все группы",
    "allStatuses": "Все статусы",
    "activeFilter": "Активные",
    "inactiveFilter": "○ Неактивные",
    "searchPlaceholder": "Поиск по userId, username...",
    "user": "Пользователь",
    "limits": "Лимиты",
    "availableNodes": "Доступные ноды",
    "noNodes": "Нет нод",
    "noGroupsAccess": "Нет групп (доступ ко всем нодам без групп)",
    "linkCopied": "Ссылка скопирована",
    "copyError": "Ошибка копирования",
    "hintUserId": "Уникальный идентификатор (напр. Telegram ID)",
    "hintTrafficLimit": "0 = безлимит, в ГБ",
    "hintMaxDevices": "0 = лимит группы, -1 = безлимит",
    "hintExpireAt": "Оставьте пустым для бессрочной подписки",
    "txRx": "TX / RX",
    "groupsCount": "групп",
    "subscription": "Подписка",
    "details": "Подробнее",
    "turnedOn": "Включён",
    "turnedOff": "○ Отключён",
    "hwidDevices": "Устройства HWID",
    "hwidDevicesSummary": "Устройства HWID (через подписку):",
    "hwidModel": "Модель",
    "hwidLastSeen": "Последняя активность",
    "unlinkDevice": "Отвязать",
    "unlinkAllHwidDevices": "Отвязать все HWID",
    "noHwidDevices": "Пока нет HWID. Появятся, когда пользователь обновит подписку в клиенте с заголовком x-hwid.",
    "hwidMode": "Политика HWID",
    "hwidModeHint": "Переопределить режим HWID из настроек HAPP для этого пользователя.",
    "hwidModeInherit": "Как в панели",
    "hwidModeOff": "Выключено",
    "hwidModeStrict": "Строго (нужен HWID)",
    "hwidEnforceFrom": "Включить лимит HWID с",
    "hwidEnforceFromHint": "Необязательно. До этого времени новые HWID только записываются, блокировки нет. Пусто — лимит применяется сразу.",
    "confirmUnlinkHwid": "Удалить регистрацию этого устройства?",
    "confirmUnlinkAllHwid": "Удалить все регистрации HWID у этого пользователя?"
  },
  "groups": {
    "title": "Группы серверов",
    "pageHint": "Группы позволяют гибко управлять доступом пользователей к серверам",
    "addGroup": "Создать группу",
    "editGroup": "Редактировать группу",
    "createGroup": "Создать",
    "groupName": "Название группы",
    "groupNamePlaceholder": "Название группы",
    "subscriptionTitle": "Название в приложении",
    "subscriptionTitlePlaceholder": "Название в приложении",
    "subscriptionTitleHint": "Отображается в приложениях клиентов",
    "color": "Цвет",
    "colorHint": "Цвет группы",
    "maxDevices": "Лимит устройств",
    "maxDevicesPlaceholder": "0",
    "maxDevicesHint": "Лимит устройств (0 = безлимит)",
    "formHint": "Название в приложении — отображается в списке подписок у клиентов. Лимит устройств = 0 означает без лимита.",
    "allGroups": "Все группы",
    "nodesCount": "нод",
    "usersCount": "пользователей",
    "isActive": "Активна",
    "save": "Сохранить",
    "confirmDelete": "Удалить группу {name}? Она будет отвязана от всех нод и пользователей.",
    "noGroups": "Групп пока нет. Создайте первую группу выше.",
    "noGroupsHint": "Группы помогают организовать серверы по регионам, тарифам или другим критериям."
  },
  "settings": {
    "title": "Настройки",
    "tabSystem": "Система",
    "tabSubscription": "Подписка",
    "tabSecurity": "Безопасность",
    "tabBackup": "Бэкапы",
    "tabMaintenance": "Обслуживание",
    "tabMigration": "Миграция",
    "tabSystemDesc": "Производительность, кэш, лимиты и SSH-пул.",
    "tabSubscriptionDesc": "Внешний вид, кнопки и поведение клиентских приложений.",
    "tabSecurityDesc": "Администратор, 2FA, API-ключи, MCP и вебхуки.",
    "tabBackupDesc": "Локальные и S3 бэкапы, расписание, восстановление.",
    "tabMaintenanceDesc": "Обслуживание, кэш, сброс счётчиков и опасные операции.",
    "tabMigrationDesc": "Бесшовный импорт пользователей из Marzban — старые подписочные ссылки продолжают работать.",
    "subBrandingTitle": "Брендинг страницы",
    "subProfileLinksTitle": "Профиль Hiddify",
    "sslNotConfigured": "SSL не настроен",
    "general": "Общие настройки",
    "baseUrl": "Base URL",
    "port": "Порт",
    "mongodb": "MongoDB",
    "systemSettings": "Настройки системы",
    "loadBalancing": "Балансировка нагрузки",
    "loadBalancingEnabled": "Сортировать по загрузке",
    "loadBalancingHint": "Менее загруженные ноды будут первыми в подписке",
    "hideOverloaded": "Скрывать перегруженные",
    "hideOverloadedHint": "Ноды с онлайн ≥ лимиту не будут включены в подписку",
    "hideOffline": "Скрывать недоступные",
    "hideOfflineHint": "Ноды, помеченные health-чекером как offline/error, не попадут в подписку.",
    "deviceLimit": "Лимит устройств",
    "gracePeriod": "Окно учёта IP (мин)",
    "gracePeriodHint": "Сколько помнить IP клиента после последнего Hysteria-коннекта. Больше — мягче к смене WiFi↔LTE, меньше — быстрее ловится шаринг.",
    "hyLimitTitle": "Лимит подключений Hysteria",
    "hyLimitDesc": "Реалтайм-кап на количество уникальных IP клиента, которые могут держать Hysteria-сессию. Только Hysteria 2 — на VLESS / Xray-ноды не распространяется.",
    "howItWorks": "Как работает:",
    "howItWorksDesc": "Устройства считаются по уникальным IP-адресам. Если пользователь подключается с нового IP, а старый был активен менее {minutes} минут назад — оба IP учитываются в лимите.",
    "caching": "Кэширование (Redis)",
    "subscriptionsTTL": "Подписки (сек)",
    "subscriptionsTTLHint": "Готовые конфиги. Сбрасывается при изменении нод",
    "usersTTL": "Пользователи (сек)",
    "usersTTLHint": "Авторизация. Сбрасывается при отключении",
    "onlineSessionsTTL": "Онлайн-сессии (сек)",
    "onlineSessionsTTLHint": "Для лимита устройств. Меньше = точнее",
    "activeNodesTTL": "Активные ноды (сек)",
    "activeNodesTTLHint": "Быстрее реакция на изменения нод",
    "rateLimiting": "Rate Limiting",
    "subscriptionsPerMinute": "Подписки/мин на IP",
    "subscriptionsPerMinuteHint": "Защита от перебора токенов. Норма: 60-100",
    "sshPool": "Пул SSH соединений",
    "sshPoolEnabled": "Включить пул SSH соединений",
    "sshPoolHint": "Переиспользует SSH соединения для ускорения операций. Экономит ~200-500мс на операцию.",
    "sshPoolIdleTime": "Таймаут простоя (сек)",
    "sshPoolIdleTimeHint": "Закрыть соединение после неактивности",
    "sshPoolTimeout": "Таймаут подключения (сек)",
    "sshPoolTimeoutHint": "Максимальное время на установку соединения",
    "sshPoolKeepalive": "Интервал keepalive (сек)",
    "sshPoolKeepaliveHint": "Отправка пакетов keepalive для предотвращения NAT timeout",
    "sshPoolRetries": "Макс. попыток",
    "sshPoolRetriesHint": "Количество попыток переподключения при ошибке",
    "sshPoolDisableWarning": "Не рекомендуется отключать. Без пула при сетевых сбоях возможна перегрузка CPU из-за потока прямых SSH-подключений. Прямой режим теперь ограничен 3 параллельными подключениями, но пул надёжнее.",
    "nodeAuth": "Node Auth API",
    "nodeAuthInsecure": "Разрешить self-signed сертификаты",
    "nodeAuthInsecureHint": "Включите, если панель использует HTTP или self-signed SSL. Ноды будут принимать любой сертификат при подключении к auth API. Отключите для production с валидным SSL.",
    "homepage": "Маскировка домена",
    "homepageHint": "Что отдавать по корню домена (https://домен/). Вместо палящего редиректа на /panel посетитель видит обычную страничку.",
    "homepageModeNginx": "Имитация nginx (welcome page)",
    "homepageModeCustom": "Своя HTML страница",
    "homepageNoCustom": "файл не загружен",
    "homepageSaveMode": "Сохранить режим",
    "homepageUpload": "Загрузить HTML файл",
    "homepageUploadHint": "Максимум {kb} KB. После загрузки режим автоматически переключится на «Своя HTML».",
    "homepageReset": "Сбросить на дефолт",
    "homepageResetConfirm": "Удалить загруженную страницу и вернуться к дефолту?",
    "saveAllSettings": "Сохранить все настройки",
    "security": "Безопасность",
    "administrator": "Администратор",
    "lastLogin": "Последний вход",
    "twoFactorStatus": "Двухфакторная защита",
    "totpManagementTitle": "Управление TOTP",
    "totpStatusLabel": "Статус TOTP",
    "totpEnabledAtLabel": "Подключено",
    "totpEnableHint": "Подтвердите текущий пароль, затем на следующем экране подключите устройство по QR-коду.",
    "totpProtectedHint": "Для отключения или перевыпуска подтвердите пароль здесь, а текущий TOTP-код введите на следующем экране.",
    "totpEnableVerifyDescription": "Отсканируйте QR-код и введите код из приложения-аутентификатора, чтобы завершить подключение TOTP.",
    "totpRotateVerifyDescription": "Отсканируйте новый QR-код и введите код с нового устройства, чтобы завершить перевыпуск секрета.",
    "totpCurrentCodeLabel": "Текущий TOTP-код",
    "totpEnableAction": "Подключить TOTP",
    "totpRotateAction": "Перевыпустить секрет",
    "totpDisableAction": "Отключить TOTP",
    "never": "Никогда",
    "ipWhitelist": "IP Whitelist",
    "ipWhitelistDisabled": "Отключен (доступ всем)",
    "changePassword": "Смена пароля",
    "currentPassword": "Текущий пароль",
    "newPassword": "Новый пароль (мин. 6 символов)",
    "confirmPassword": "Подтверждение пароля",
    "changePasswordBtn": "Изменить пароль",
    "passwordTotpNextStepHint": "После проверки пароля откроется отдельный экран для ввода текущего TOTP-кода.",
    "sslCertificate": "SSL Сертификат",
    "httpsActive": "HTTPS активен",
    "httpMode": "HTTP режим",
    "httpModeHint": "Для включения HTTPS задайте переменные:",
    "letsEncryptAuto": "Let's Encrypt автообновление",
    "systemStatus": "Статус системы",
    "dangerZone": "Опасная зона",
    "resetStats": "Сброс статистики",
    "resetStatsDesc": "Удалить все исторические данные статистики (графики онлайна, трафика, нод). Действие необратимо!",
    "resetStatsBtn": "Очистить статистику",
    "resetStatsConfirm": "⚠️ Удалить всю историю статистики?\n\nЭто очистит все графики и таблицы на странице Статистика.\n\nПродолжить?",
    "statsReset": "Статистика очищена ({count} записей)",
    "resetTrafficCounter": "Сброс счетчика трафика",
    "resetTrafficDesc": "Обнуляет счетчик использованного трафика (tx/rx) для всех пользователей. Действие необратимо!",
    "resetAllTraffic": "Сбросить весь трафик",
    "resetConfirm": "⚠️ ВНИМАНИЕ!\n\nВы уверены что хотите сбросить счетчик трафика для ВСЕХ пользователей?\n\nЭто действие необратимо!",
    "resetConfirmFinal": "Последнее подтверждение.\n\nСчетчики tx/rx будут обнулены у всех пользователей.\n\nПродолжить?",
    "resetting": "Сброс...",
    "trafficReset": "Трафик сброшен у {count} пользователей",
    "backup": "Резервное копирование",
    "autoBackup": "Автоматический бэкап",
    "autoBackupHint": "Автоматически создавать бэкапы базы данных по расписанию",
    "backupHowItWorksTitle": "Как это работает",
    "backupHowItWorks": "Автобэкап проверяется раз в час. Интервал считается от последнего успешного локального бэкапа. Для автоматической загрузки в S3 должны быть включены и «Автоматический бэкап», и «Загружать в S3».",
    "backupInterval": "Интервал (часы)",
    "backupIntervalHint": "Как часто создавать бэкапы (рекомендуется 24)",
    "keepLast": "Хранить последних",
    "keepLastHint": "Сколько локальных бэкапов хранить (старые удаляются автоматически)",
    "lastBackup": "Последний бэкап",
    "s3Settings": "Загрузка в S3 (опционально)",
    "s3Enabled": "Загружать в S3",
    "s3EnabledHint": "Дополнительно отправлять бэкапы в S3-совместимое хранилище",
    "s3Endpoint": "Endpoint (для MinIO)",
    "s3EndpointHint": "Оставьте пустым для AWS S3",
    "s3Region": "Регион",
    "s3Bucket": "Bucket",
    "s3Prefix": "Префикс",
    "s3PrefixHint": "Папка в bucket для бэкапов",
    "s3AccessKey": "Access Key ID",
    "s3SecretKey": "Secret Access Key",
    "s3KeepLast": "Хранить в S3",
    "s3KeepLastHint": "Сколько бэкапов хранить в S3",
    "testS3": "Проверить запись в S3",
    "testingS3": "Проверка...",
    "s3TestSuccess": "Права на запись и удаление в S3 подтверждены",
    "s3TestError": "Ошибка подключения: {error}",
    "s3UploadFailed": "загрузка в S3 не удалась: {error}",
    "backupActions": "Быстрые действия",
    "createBackupNow": "Создать бэкап сейчас",
    "creatingBackup": "Создание...",
    "backupCreated": "Бэкап создан: {filename} ({size} МБ)",
    "backupError": "Ошибка создания бэкапа",
    "backupsList": "Доступные бэкапы",
    "clickRefresh": "Нажмите «Обновить» для загрузки списка",
    "noBackups": "Нет доступных бэкапов",
    "localBackups": "Локальные",
    "s3Backups": "S3 (облако)",
    "restoreConfirm": "Восстановить из этого бэкапа?\n\n⚠️ Текущие данные будут заменены!",
    "restoring": "Восстановление...",
    "restored": "База данных восстановлена! Перезагрузка...",
    "restoreError": "Ошибка восстановления",
    "restoreBtn": "Восстановить",
    "downloadBtn": "Скачать",
    "downloadError": "Ошибка скачивания",
    "saved": "Настройки сохранены",
    "hintLoadBalancing": "Сортировать ноды по текущей загрузке в подписках",
    "hintHideOverloaded": "Не показывать ноды, достигшие лимита онлайн",
    "cacheManagement": "Управление кэшем",
    "flushCache": "Очистить кэш",
    "flushCacheDesc": "Очищает все кэшированные данные в Redis (подписки, пользователи, сессии). Может временно увеличить нагрузку на сервер.",
    "flushCacheBtn": "Очистить кэш",
    "flushCacheConfirm": "Очистить все кэшированные данные?\n\nЭто временно увеличит нагрузку на сервер пока кэш восстановится.",
    "flushing": "Очистка...",
    "cacheFlushed": "Кэш успешно очищен",
    "tabSubscriptionTitle": "Настройки подписки",
    "subClientApps": "Клиентские приложения",
    "subLogoUrl": "URL логотипа",
    "subLogoUrlHint": "Ссылка на картинку (PNG/SVG/WebP). Оставьте пустым — будет иконка по умолчанию.",
    "subPageTitle": "Заголовок страницы",
    "subPageTitleHint": "Текст над логотипом на странице подписки. По умолчанию: «Подключение».",
    "subSupportUrl": "Ссылка на поддержку",
    "subSupportUrlHint": "Отображается кнопкой «Поддержка» в Hiddify. Например: https://t.me/yoursupport",
    "subWebPageUrl": "Ссылка на веб-страницу",
    "subWebPageUrlHint": "Отображается кнопкой «Открыть веб-страницу» в Hiddify. Например: лендинг или кабинет.",
    "subHappProviderId": "HAPP Provider ID",
    "subHappProviderIdHint": "Опциональный 8-символьный код из happ-proxy.com. Открывает статистику и кнопку обратной связи.",
    "subUpdateInterval": "Интервал обновления (часы)",
    "subUpdateIntervalHint": "Как часто клиенты автоматически обновляют подписку. Передаётся в заголовке Profile-Update-Interval. Диапазон: 1–168 часов.",
    "subButtons": "Кнопки на странице подписки",
    "subButtonsHint": "Используйте {url} в поле URL для подстановки ссылки подписки (например: hiddify://import/{url}). Для Shadowrocket: sub://{url_b64}. Для query-параметров: {url_encoded}. Иконки: tabler.io/icons (например: ti-download).",
    "subAddButton": "Добавить кнопку",
    "subLogoDefault": "по умолчанию",
    "subHiddifyProfileHint": "Ссылки ниже отображаются в клиентах Hiddify / Clash как кнопки в карточке профиля.",
    "subPageTitlePlaceholder": "Подключение",
    "subTemplate": "Шаблон",
    "subTplClients": "Клиенты",
    "subTplLinks": "Ссылки",
    "subTplSupport": "Поддержка",
    "subTplWebsite": "Сайт",
    "subIconSearch": "Поиск…",
    "subBtnLabelPlaceholder": "Hiddify",
    "subBtnUrlPlaceholder": "hiddify://import/{url}",
    "subBtnLabelTitle": "Название кнопки",
    "subBtnUrlTitle": "URL — переменные: {url}, {url_b64}, {url_encoded}",
    "subPickIcon": "Выбрать иконку",
    "subDeleteBtn": "Удалить",
    "happTitle": "Интеграция HAPP",
    "happDesc": "Настройки, которые доставляются исключительно HAPP-клиентам через HTTP-заголовки при каждом обновлении подписки.",
    "happAnnounce": "Объявление",
    "happAnnounceHint": "Короткое сообщение пользователям внутри приложения (макс. 200 символов). Кирилица и другие не-ASCII символы кодируются автоматически.",
    "happAnnounceCounter": "{n}/200",
    "happAdvancedToggle": "Расширенные настройки (требуется Provider ID)",
    "happAdvancedHint": "Заполните HAPP Provider ID в настройках подписки выше, чтобы активировать расширенные функции HAPP.",
    "happHideSettings": "Скрыть конфигурацию серверов",
    "happHideSettingsHint": "Пользователи не смогут просматривать или копировать данные подключения из приложения.",
    "happNotifyExpire": "Уведомлять до истечения",
    "happNotifyExpireHint": "Push-уведомление за 3 дня до окончания подписки.",
    "happAlwaysHwid": "Принудительный HWID",
    "happAlwaysHwidHint": "Пользователь не сможет отключить передачу идентификатора устройства в настройках приложения.",
    "happHwidTitle": "Лимит устройств по HWID",
    "happHwidIntro": "Ограничивает число физических устройств на одну подписку, по заголовку x-hwid от клиента. Считается на этапе запроса подписки.",
    "happHwidMode": "Режим",
    "happHwidModeOff": "Выкл",
    "happHwidModePermissive": "Мягкий",
    "happHwidModeStrict": "Жёсткий",
    "happHwidExplainOff": "Выключено. Панель не учитывает HWID и игнорирует заголовок x-hwid. Подписочный лимит устройств не применяется.",
    "happHwidExplainPermissive": "Клиенты, шлющие заголовок x-hwid, считаются и режутся по maxDevices при запросе подписки. Клиенты без x-hwid получают обычную подписку — на этапе запроса подписки они не учитываются.",
    "happHwidExplainStrict": "То же, что Мягкий, но клиенты без заголовка x-hwid получают мягкий блок при запросе подписки: им отдаётся валидная подписка с фейковыми серверами, имена которых — текст «Нет поддержки HWID» (ниже).",
    "happHwidExplainSoftBlock": "Когда клиент, присылающий x-hwid, превышает лимит, он получает такой же мягкий блок: подписку с фейковыми серверами с именами из текста «Лимит достигнут». HAPP дополнительно показывает popup в приложении. 4xx/5xx не возвращается, клиент не ломается.",
    "happHwidCleanupDays": "Удалять неактивные HWID через (дней)",
    "happHwidUpsertRate": "Записей на устройство в минуту",
    "happHwidUpsertRateHint": "Больше значение — короче пауза между записями одного и того же HWID в БД.",
    "happHwidNotSupportedRemark": "Имена фейк-серверов — нет поддержки HWID",
    "happHwidNotSupportedRemarkHint": "Используется в режиме «Жёсткий» для клиентов без x-hwid. Каждая непустая строка станет отдельным фейковым сервером в приложении пользователя. До 12 строк, по 32 символа в каждой.",
    "happHwidMaxDevicesRemark": "Имена фейк-серверов — лимит достигнут",
    "happHwidMaxDevicesRemarkHint": "Показывается любому клиенту при превышении лимита устройств. Каждая непустая строка — отдельный фейковый сервер. До 12 строк, по 32 символа в каждой.",
    "happHwidAnnounce": "Текст popup в HAPP — лимит достигнут",
    "happHwidAnnounceHint": "Отдаётся в заголовке announce вместе с фейковым сервером. HAPP показывает его как popup в приложении. До 300 символов; не-ASCII кодируется в base64.",
    "happHwidTopUsers": "Топ пользователей по числу HWID",
    "happHwidDeviceCount": "Строк HWID",
    "happPingType": "Метод пинга",
    "happPingTypeHint": "Как приложение измеряет задержку серверов.",
    "happPingTypeAuto": "Авто (по умолчанию)",
    "happPingTypeProxy": "Через прокси (GET)",
    "happPingTypeProxyHead": "Через прокси (HEAD)",
    "happPingTypeTcp": "TCP",
    "happPingTypeIcmp": "ICMP",
    "happPingUrl": "URL для пинга",
    "happPingUrlHint": "URL для проверки через прокси. Применяется только при методе «Через прокси».",
    "happColorProfile": "Цветовая тема (iOS)",
    "happColorProfileHint": "JSON кастомной темы. Создайте тему в HAPP iOS (долгое нажатие на «Внешний вид»), экспортируйте в буфер обмена и вставьте сюда.",
    "happColorPresetViolet": "Фиолетовая",
    "happColorPresetTurquoise": "Бирюзовая",
    "happColorPresetClear": "Очистить",
    "routingTitle": "Клиентская маршрутизация (Split Tunneling)",
    "routingDesc": "Настройте, какие сайты и сервисы пользователи открывают напрямую (минуя VPN), а какие — через VPN-туннель.",
    "routingEnabled": "Включить правила маршрутизации",
    "routingEnabledHint": "Если выключено — подписки генерируются без routing rules, весь трафик идёт через VPN.",
    "routingHowItWorks": "Как это работает?",
    "routingHowItWorksDesc": "Правила маршрутизации встраиваются в конфигурации подписок и доставляются VPN-клиентам. Когда пользователь открывает сайт или приложение, клиент проверяет адрес по этим правилам:<br>• <strong>direct</strong> — трафик идёт напрямую, минуя VPN (например, банки, госуслуги).<br>• <strong>block</strong> — трафик блокируется (например, реклама, трекеры).<br>• Всё остальное идёт через VPN-туннель как обычно.<br><br>Также настраивается <strong>Split DNS</strong>: домены из direct-правил резолвятся через внутренний DNS, а все остальные запросы — через зашифрованный удалённый DNS.",
    "routingPresets": "Пресеты",
    "routingPresetsHint": "Пресеты наслаиваются — нажимайте несколько, чтобы комбинировать. Например, «Bypass RU» + «Block Ads» добавит оба набора правил. Дубликаты пропускаются автоматически.",
    "presetBypassRu": "Bypass RU",
    "presetBypassRuDesc": "Российские сайты и IP напрямую",
    "presetBypassCn": "Bypass CN",
    "presetBypassCnDesc": "Китайские сайты и IP напрямую",
    "presetBlockAds": "Block Ads",
    "presetBlockAdsDesc": "Блокировать рекламу и трекеры",
    "presetBypassLan": "Bypass LAN",
    "presetBypassLanDesc": "Локальная сеть напрямую",
    "presetClear": "Очистить всё",
    "presetClearDesc": "Удалить все правила",
    "routingRules": "Правила",
    "routingRulesHint": "Правила применяются сверху вниз. Первое совпадение побеждает. Выключенные правила пропускаются.",
    "routingNoRules": "Правил пока нет. Добавьте вручную или выберите пресет выше.",
    "routingAddRule": "Добавить правило",
    "routingAction": "Действие",
    "routingType": "Тип",
    "routingValue": "Значение",
    "routingComment": "Комментарий",
    "routingEnabled2": "Вкл",
    "routingActionDirect": "direct",
    "routingActionBlock": "block",
    "routingTypeDomainSuffix": "суффикс домена",
    "routingTypeDomainKeyword": "ключевое слово",
    "routingTypeDomain": "домен",
    "routingTypeGeosite": "geosite",
    "routingTypeGeoip": "geoip",
    "routingTypeIpCidr": "IP CIDR",
    "routingDns": "Split DNS",
    "routingDnsHint": "Домены из direct-правил резолвятся через внутренний DNS. Всё остальное — через зашифрованный удалённый DNS через прокси-туннель.",
    "routingDnsDomestic": "Внутренний DNS",
    "routingDnsDomesticHint": "Обычный UDP DNS для direct-доменов (например Яндекс DNS: 77.88.8.8)",
    "routingDnsRemote": "Удалённый DNS",
    "routingDnsRemoteHint": "Зашифрованный DNS для проксируемого трафика (например Cloudflare DoT: tls://1.1.1.1)",
    "routingClientSupport": "Совместимость клиентов",
    "routingClientSupportDesc": "<strong>Полная поддержка:</strong> HAPP (встроенный протокол маршрутизации), Clash Meta / Stash (YAML-правила).<br><strong>Частичная поддержка:</strong> Hiddify / SFA / NekoBox (sing-box JSON — некоторые клиенты могут заменять правила своими шаблонами).<br><strong>Не поддерживается:</strong> v2rayNG, Streisand, Shadowrocket — эти клиенты используют URI-подписки, которые не могут содержать routing rules. Пользователям нужно настраивать маршрутизацию вручную.",
    "clearRulesConfirm": "Удалить все правила маршрутизации?"
  },
  "setup": {
    "title": "Первоначальная настройка",
    "header": "Создайте первый аккаунт администратора и подготовьте панель к первому запуску.",
    "createAdmin": "Создайте учётную запись администратора.",
    "createAdminTitle": "Аккаунт администратора",
    "createAdminCopy": "Создайте первый аккаунт администратора для этой панели. При желании можно сразу включить двухфакторную защиту, чтобы обезопасить доступ к панели с первого входа.",
    "credentialsEncrypted": "Логин и пароль будут храниться в зашифрованном виде.",
    "adminLogin": "Логин администратора",
    "minChars3": "Минимум 3 символа",
    "password": "Пароль",
    "minChars6": "Минимум 6 символов",
    "confirmPassword": "Подтверждение пароля",
    "repeatPassword": "Повторите пароль",
    "securityOptionsTitle": "Параметры безопасности",
    "enableTotpLabel": "Включить двухфакторную защиту (TOTP)",
    "enableTotpHint": "После создания аккаунта потребуется подтверждение через приложение-аутентификатор.",
    "noRecoveryWarning": "В версии 1 нет self-service восстановления. Сохраните секрет в безопасном месте.",
    "createAccount": "Создать аккаунт",
    "rememberWarning": "Запомните данные — восстановление невозможно!",
    "passwordsMismatch": "Пароли не совпадают!",
    "usernameTooShort": "Логин администратора должен содержать минимум 3 символа.",
    "passwordTooShort": "Пароль должен содержать минимум 6 символов.",
    "featureSecurityTitle": "Безопасный доступ",
    "featureSecurityDesc": "Данные администратора защищены, а TOTP можно включить уже на этапе создания аккаунта.",
    "featureFlowTitle": "Пошаговый запуск",
    "featureFlowDesc": "После входа вы перейдёте в мастер настройки, который поможет подготовить первые ноды и стартовый доступ.",
    "featureRecoveryTitle": "Сохраните данные",
    "featureRecoveryDesc": "Сохраните логин, пароль и TOTP-секрет в надёжном месте до продолжения настройки."
  },
  "terminal": {
    "title": "SSH терминал",
    "connecting": "Подключение...",
    "connectingTo": "Подключение к",
    "connected": "Подключено",
    "disconnected": "Отключено",
    "connectionClosed": "[Соединение закрыто]",
    "connectionError": "Ошибка подключения",
    "wsError": "Ошибка WebSocket соединения",
    "tryAgain": "Попробовать снова"
  },
  "broadcast": {
    "title": "Broadcast Terminal",
    "nodes": "Ноды:",
    "selectAll": "Выбрать все",
    "deselectAll": "Снять выбор",
    "execute": "Выполнить",
    "cancel": "Отмена",
    "commandPlaceholder": "Введите команду или вставьте скрипт...",
    "running": "Выполняется...",
    "done": "Готово",
    "noSSHNodes": "Нет нод с настроенным SSH",
    "timeout": "Таймаут",
    "exitCode": "exit",
    "empty": "Введите команду, чтобы увидеть вывод с нод",
    "summaryTotal": "Всего:",
    "summaryOk": "Успешно:",
    "summaryFailed": "Ошибок:"
  },
  "backup": {
    "creating": "Создание бэкапа...",
    "created": "Бэкап создан",
    "restoring": "Восстановление...",
    "restored": "База данных восстановлена",
    "selectFile": "Выберите файл бэкапа (.tar.gz)",
    "confirmRestore": "Это заменит все данные. Продолжить?"
  },
  "errors": {
    "notFound": "Не найдено",
    "serverError": "Ошибка сервера",
    "networkError": "Ошибка сети",
    "unauthorized": "Не авторизован",
    "forbidden": "Доступ запрещён",
    "validationError": "Ошибка валидации",
    "error": "Ошибка",
    "deleteError": "Ошибка удаления"
  },
  "time": {
    "days": "д",
    "hours": "ч",
    "minutes": "м",
    "seconds": "с",
    "ago": "назад",
    "never": "Никогда"
  },
  "units": {
    "bytes": "Б",
    "kb": "КБ",
    "mb": "МБ",
    "gb": "ГБ",
    "tb": "ТБ"
  },
  "outbounds": {
    "title": "Фильтрация трафика",
    "pageDesc": "Правила определяют что заблокировать, что пустить напрямую, или перенаправить через прокси.",
    "presets": "Готовые сценарии",
    "presetsHint": "— нажмите чтобы применить",
    "blockAds": "Блокировать рекламу",
    "blockAdsDesc": "doubleclick, googlesyndication и др.",
    "blockCn": "Блокировать CN / Private",
    "blockCnDesc": "Китайские и частные IP-адреса",
    "directAll": "Всё напрямую",
    "directAllDesc": "Без ограничений, весь трафик разрешён",
    "reset": "Сбросить",
    "resetDesc": "Удалить все правила, вернуть дефолт",
    "rules": "Правила",
    "rulesHint": "Одно правило на строку. Работают два встроенных действия: <code>reject(…)</code> — заблокировать, <code>direct(…)</code> — пустить напрямую через сервер. Правила применяются <strong>сверху вниз</strong>, первое совпавшее выигрывает.",
    "aclInlineDisabled": "Редактор inline-ACL отключен: ACL выключен в настройках ноды.",
    "aclInlineDisabledFile": "Редактор inline-ACL отключен: в настройках ноды выбран режим ACL file.",
    "noProxyWarning": "Есть прокси, но нет правил — прокси не будет использоваться. Добавьте правило:",
    "proxyChipsHint": "Твои прокси — нажми чтобы вставить в правило:",
    "templates": "Шаблоны",
    "defaultRulesWarning": "Если задать правила, дефолтные правила сервера (<code>reject(geoip:cn)</code>, <code>reject(geoip:private)</code>) отключатся. Добавь их вручную если нужно.",
    "yamlPreview": "Предпросмотр YAML",
    "proxyServers": "Прокси-серверы",
    "proxyServersHint": "для маршрутизации трафика через SOCKS5/HTTP прокси",
    "proxyDesc": "Нужны только если хочешь направить часть трафика через <strong>свой прокси-сервер</strong>. Добавь прокси здесь, затем используй его имя в правиле выше: <code>имя_прокси(условие)</code>",
    "proxyName": "Название",
    "proxyType": "Тип",
    "proxyAddr": "Адрес (host:port)",
    "proxyLogin": "Логин",
    "proxyPassword": "Пароль",
    "proxyOptional": "(необяз.)",
    "addProxy": "+ Добавить",
    "saveAndApply": "Сохранить и применить к ноде",
    "applying": "Применяется...",
    "applied": "Применено",
    "applyError": "Ошибка применения",
    "replaceRules": "Заменить текущие правила?",
    "noRulesDefault": "(правил нет — используется конфиг по умолчанию)",
    "backToNode": "Назад к ноде"
  },
  "stats": {
    "title": "Статистика",
    "onlineNow": "Онлайн сейчас",
    "peakOnline": "Пик онлайн",
    "last24h": "за 24ч",
    "nodesOnline": "нод онлайн",
    "active": "активно",
    "onlineConnections": "Подключения онлайн",
    "traffic": "Трафик",
    "nodesUsage": "Использование нод",
    "nodesStats": "Статистика по нодам",
    "allNodes": "Все ноды",
    "node": "Нода",
    "currentOnline": "Сейчас",
    "avgOnline": "Среднее",
    "online": "Онлайн",
    "upload": "Отдано",
    "download": "Получено",
    "tx": "TX (отдано)",
    "rx": "RX (получено)",
    "nodesTraffic": "Трафик по нодам",
    "noData": "Нет данных",
    "hourChange": "изм. за час",
    "h": "ч",
    "d": "д",
    "hint": "Данные обновляются каждые 5 минут. Выберите период для просмотра истории.",
    "clientsTitle": "VPN-клиенты",
    "clientsDesc": "Уникальные пользователи по приложениям VPN, на основе запросов подписки. Считается уникальный токен подписки в день.",
    "clientName": "Клиент",
    "uniqueUsers": "уникальных пользователей",
    "percentage": "%",
    "clientsNoData": "Запросы подписки ещё не зафиксированы",
    "serverCpu": "Загрузка CPU",
    "serverLoad": "Load 1м",
    "serverMemory": "Память",
    "serverRss": "RSS процесса",
    "serverRpm": "Запросов в минуту"
  },
  "apiKeys": {
    "title": "API Ключи",
    "create": "Создать ключ",
    "createTitle": "Создать API ключ",
    "name": "Название",
    "namePlaceholder": "например: Telegram бот",
    "prefix": "Префикс ключа",
    "scopes": "Права доступа",
    "scopesHint": "Не выбрано ни одного права — доступ запрещён.",
    "rateLimit": "Лимит (req/мин)",
    "allowedIPs": "Разрешённые IP (по одному на строку, пусто = все)",
    "expiresAt": "Истекает (не обязательно)",
    "lastUsed": "Последнее использование",
    "expires": "Истекает",
    "empty": "Нет API ключей. Создайте ключ для внешних интеграций.",
    "created": "Ключ создан",
    "revealWarning": "Скопируйте ключ сейчас. Он больше не будет показан.",
    "copy": "Копировать",
    "done": "Готово, я скопировал",
    "confirmDisable": "Отключить этот ключ?",
    "confirmEnable": "Включить этот ключ?",
    "confirmDelete": "Удалить ключ"
  },
  "webhooks": {
    "title": "Вебхуки",
    "enabled": "Включить вебхуки",
    "url": "URL вебхука",
    "secret": "Секрет (HMAC-SHA256)",
    "secretPlaceholder": "Оставьте пустым, чтобы отключить верификацию подписи",
    "secretHint": "Верифицируйте через заголовок X-Webhook-Signature: sha256=HMAC-SHA256(secret, timestamp.body)",
    "events": "События",
    "eventsHint": "пусто = все события",
    "test": "Тест",
    "urlRequired": "Сначала введите URL",
    "testEventDefault": "Обычный тест",
    "testEventHint": "Отправить пример пейлоада для выбранного события"
  },
  "network": {
    "title": "Карта сети",
    "nodes": "нод",
    "links": "связей",
    "addLink": "Добавить связь",
    "createLink": "Создать связь",
    "autoLayout": "Авто-расположение",
    "fitView": "Вписать",
    "refresh": "Обновить",
    "linkName": "Название связи",
    "portalNode": "Portal-нода (вход)",
    "bridgeNode": "Bridge-нода (выход)",
    "tunnelPort": "Порт туннеля",
    "tunnelProtocol": "Протокол",
    "tunnelTransport": "Транспорт",
    "tunnelSecurity": "Безопасность",
    "deploy": "Деплой",
    "status": "Статус",
    "selectPortal": "— Выберите Portal —",
    "selectBridge": "— Выберите Bridge —",
    "errorLoadingNodes": "Ошибка загрузки нод",
    "fillRequired": "Заполните все обязательные поля",
    "loadingTopology": "Загрузка топологии...",
    "noNodesOrLinks": "Нет нод или каскадных связей. Добавьте ноды и создайте связи.",
    "drawerStatus": "Статус",
    "drawerIP": "IP-адрес",
    "drawerType": "Тип",
    "drawerRole": "Роль",
    "drawerOnline": "Онлайн пользователей",
    "drawerPort": "Порт",
    "openNode": "Открыть ноду",
    "drawerTunnelPort": "Порт туннеля",
    "drawerProtocolTransport": "Протокол / Транспорт",
    "drawerLatency": "Задержка",
    "confirmDeploy": "Деплоить эту каскадную связь?",
    "confirmDeleteLink": "Удалить каскадную связь? Это также уберёт деплой.",
    "deploying": "Деплоим...",
    "deleting": "Удаляем...",
    "reconnecting": "Переподключаем...",
    "deploySuccess": "Каскадная связь задеплоена",
    "deleteSuccess": "Каскадная связь удалена",
    "reconnectSuccess": "Связь переподключена",
    "reconnectFailed": "Ошибка переподключения",
    "changeBridge": "Сменить Bridge",
    "changePortal": "Сменить Portal",
    "reconnectModal": "Переподключить связь",
    "newBridgeNode": "Новый Bridge",
    "newPortalNode": "Новый Portal",
    "dragToCreateHint": "Перетащите от одной ноды к другой, чтобы создать каскадную связь",
    "quickLinkTitle": "Создать каскадную связь",
    "quickLinkPortal": "Portal",
    "quickLinkBridge": "Bridge",
    "swapNodes": "Поменять",
    "deployFailed": "Ошибка деплоя",
    "networkError": "Ошибка сети",
    "rolePortal": "PORTAL",
    "roleBridge": "BRIDGE",
    "roleRelay": "RELAY",
    "roleStandalone": "",
    "legendTitle": "Легенда",
    "legendOnline": "Онлайн",
    "legendOffline": "Офлайн",
    "legendDeployed": "Задеплоен",
    "legendPending": "Ожидание",
    "legendPortal": "Portal",
    "legendBridge": "Bridge",
    "legendRelay": "Relay",
    "legendForwardLine": "Сплошная линия — Forward Chain",
    "legendReverseLine": "Пунктир — Reverse Proxy",
    "betaBadge": "BETA",
    "betaTitle": "Каскадные связи в режиме бета",
    "betaDescription": "После каждого деплоя или синка проверьте маршрут, статусы хопов и выходной IP.",
    "modeReverseFlow": "Маршрут: Client → Portal → Bridge → Internet. Туннель инициирует Bridge.",
    "modeForwardFlow": "Маршрут: Client → Portal → (Relay →) Bridge → Internet. Все ноды нужен публичный IP.",
    "modeForwardWarning": "Forward Chain требует публичный IP на всех хопах. После каждого sync проверьте exit-ноду.",
    "modeReverseWarning": "После деплоя убедитесь, что туннель поднялся и трафик выходит через ожидаемый Bridge.",
    "tunnelPortReverseHint": "В Reverse режиме этот порт слушает Portal-нода.",
    "tunnelPortForwardHint": "В Forward Chain этот порт слушает Bridge/Relay — принимающая сторона текущего хопа.",
    "realityTunnelHint": "Эти параметры REALITY применяются только к tunnel-связи между нодами, не к клиентскому входу Portal-ноды.",
    "portConflictClientHint": "Этот tunnel-порт уже используется другой активной связью на слушающей стороне.",
    "routeEntry": "Вход",
    "routeExit": "Выход",
    "routeEncryption": "Шифрование туннеля",
    "routePath": "Маршрут трафика",
    "undeployLink": "Снять деплой",
    "linkMode": "Режим связи",
    "modeReverse": "Reverse Proxy",
    "modeForward": "Forward Chain",
    "modeReverseHint": "Bridge инициирует туннель к Portal. Bridge может быть за NAT.",
    "modeForwardHint": "Portal подключается к Bridge напрямую. Все ноды нуждаются в публичном IP.",
    "muxEnabled": "Включить MUX",
    "muxConcurrency": "Параллельность",
    "geoRoutingEnabled": "Включить гео-маршрутизацию",
    "geoRoutingDomains": "Домены (geosite теги)",
    "geoRoutingGeoip": "GeoIP теги",
    "realityDest": "Destination",
    "realitySni": "Server Names",
    "realityPublicKey": "Public Key",
    "realityPrivateKey": "Private Key",
    "realityShortIds": "Short IDs",
    "realityFingerprint": "Fingerprint",
    "autoDeploy": "Авто-деплой",
    "advancedOptions": "Расширенные настройки",
    "priority": "Приоритет",
    "tunnelDomain": "Домен туннеля",
    "confirmDeployChain": "Деплоить всю цепочку? Это синхронизирует все связанные ноды в правильном порядке.",
    "syncingChain": "Синхронизация цепочки...",
    "chainDeploySuccess": "Цепочка синхронизирована",
    "chainDeployFailed": "Ошибка синхронизации цепочки",
    "syncChain": "Синхр. цепочку",
    "confirmUndeploy": "Снять деплой этой каскадной связи?",
    "undeploying": "Снимаем деплой...",
    "undeploySuccess": "Деплой снят",
    "internetDesc": "Трафик выходит в Интернет через подключённые ноды",
    "internetExitDesc": "Точка выхода в Интернет",
    "internetExit": "Выход в Интернет"
  },
  "mcp": {
    "title": "MCP Интеграция",
    "subtitle": "Подключите AI-ассистентов для управления панелью",
    "motto": "Цензор использует нейросеть для блокировок? Самое время завести свою.",
    "badge": "AI",
    "endpoint": "Эндпоинт",
    "copyEndpoint": "Скопировать эндпоинт",
    "endpointCopied": "Эндпоинт скопирован",
    "setupGuide": "Инструкция по подключению",
    "claudeDesktop": "Claude Desktop",
    "cursorIde": "Cursor IDE",
    "customClient": "Кастомный клиент",
    "claudeConfigPath": "Добавьте в файл конфига Claude Desktop:",
    "cursorConfigPath": "Добавьте в .cursor/mcp.json в корне проекта:",
    "customConfigDesc": "Любой HTTP-клиент с поддержкой SSE:",
    "copyConfig": "Скопировать конфиг",
    "configCopied": "Скопировано",
    "availableTools": "Доступные инструменты",
    "toolsCount": "инструментов",
    "createKey": "Создать MCP API-ключ",
    "keyModalTitle": "Создать ключ для MCP",
    "keyModalDesc": "Будет создан ключ с правами mcp:enabled + все права на чтение.",
    "keyName": "Название ключа",
    "keyNamePlaceholder": "например: Claude Assistant",
    "writeAccess": "Права на запись",
    "writeAccessHint": "Выберите дополнительные права (по умолчанию только чтение)",
    "createKeyBtn": "Создать ключ",
    "toolQuery": "Чтение данных (пользователи, ноды, группы, статистика, логи)",
    "toolManageUser": "Управление пользователями (создать, изменить, удалить, вкл/выкл)",
    "toolManageNode": "Управление нодами (создать, изменить, удалить, настроить)",
    "toolManageGroup": "Управление группами серверов",
    "toolManageCascade": "Управление каскадными связями",
    "toolExecuteSsh": "Выполнить SSH-команду на ноде",
    "toolSshSession": "Интерактивная SSH-сессия",
    "toolSystemAction": "Системные операции (синхронизация, кэш, бэкап)",
    "toolGetTopology": "Топология сети",
    "toolHealthCheck": "Проверка состояния панели",
    "scopeRequired": "Требуется scope: mcp:enabled",
    "promptOverview": "Общий обзор: ноды, пользователи, здоровье системы",
    "promptAuditNodes": "Найти и исправить проблемные ноды",
    "promptUserReport": "Детальный отчёт по пользователю",
    "promptSetupNode": "Интерактивный гид по добавлению ноды",
    "promptTroubleshoot": "Диагностика ноды через SSH",
    "promptExpiredUsers": "Найти и обработать истёкших пользователей"
  },
  "wizard": {
    "title": "Мастер настройки",
    "subtitle": "Подготовьте панель, первые ноды и стартовый доступ в одном мастере.",
    "stepScenario": "Сценарий",
    "stepNodes": "Инфраструктура",
    "stepFinish": "Установка",
    "scenarioTitle": "Выберите стартовый сценарий",
    "scenarioHint": "Выберите вариант развёртывания, который лучше всего соответствует вашей инфраструктуре. Это только стартовая конфигурация: позже вы сможете добавлять и менять ноды без ограничений.",
    "selfHostTitle": "Развернуть на этом сервере",
    "selfHostDesc": "Установить Hysteria 2 и / или Xray на тот же сервер, где работает панель, и сразу подготовить стартовую структуру доступа.",
    "remoteTitle": "Управлять удалёнными нодами",
    "remoteDesc": "Использовать панель как центр управления нодами, размещёнными на отдельных VPS или выделенных серверах.",
    "continue": "Продолжить",
    "skipPrompt": "Хотите настроить всё вручную?",
    "skipLink": "Пропустить мастер",
    "protocols": "Протоколы для установки",
    "hysteriaSettings": "Настройки Hysteria 2",
    "xraySettings": "Настройки Xray",
    "selfHostHint": "Выберите протоколы для установки, укажите SSH-доступ к целевому серверу, а мастер автоматически подготовит стартовую группу и первого пользователя.",
    "starterBundleTitle": "Стартовый доступ",
    "starterBundleDesc": "Мастер создаст стартовую группу серверов, привяжет к ней новые ноды и подготовит первого VPN-пользователя admin, чтобы структура подписки была готова сразу после развёртывания.",
    "hysteriaChoiceDesc": "Высокопроизводительный UDP-транспорт с QUIC и поддержкой port hopping.",
    "xrayChoiceDesc": "TCP-транспорт с REALITY и управляемым runtime через встроенный агент.",
    "hyDomainHint": "Используется домен панели. Hysteria разделяет TLS-сертификат панели.",
    "xrayPortHint": "Порт 443/tcp занят панелью (Caddy). По умолчанию для Xray используется 8443.",
    "sshAccess": "SSH-доступ к целевому серверу",
    "sshAccessHint": "Укажите адрес, по которому панель может подключиться к серверу по SSH. Для полностью автоматической установки рекомендуется root-доступ.",
    "sshIp": "Адрес сервера",
    "sshAuth": "Аутентификация",
    "sshPassword": "Пароль",
    "sshPrivateKey": "Приватный ключ",
    "sshPasswordPlaceholder": "SSH-пароль",
    "install": "Установить и продолжить",
    "installing": "Развёртывание нод, подготовка стартового доступа и проверка сервисов. Подождите...",
    "installSuccess": "Установка завершена!",
    "installPartial": "Развёртывание завершилось с ошибками. Исправьте проблему и повторите настройку либо продолжите вручную.",
    "streamError": "Соединение потеряно. Обновите страницу чтобы проверить статус.",
    "goToDashboard": "Перейти на дашборд",
    "goToNodes": "Посмотреть ноды",
    "noProtocolSelected": "Выберите хотя бы один протокол.",
    "credentialsTitle": "Стартовая подписка admin",
    "credentialsDesc": "Используйте эту ссылку подписки для автоматически подготовленного стартового доступа admin.",
    "credentialsUserLabel": "ID пользователя",
    "credentialsPasswordLabel": "Ссылка подписки",
    "copyCredentials": "Скопировать ссылку",
    "retrySetup": "Повторить настройку",
    "continueManual": "Перейти в панель"
  },
  "migration": {
    "armed": "Совместимость со старыми ссылками ВКЛЮЧЕНА.",
    "armedDetail": "Путь: {path} · завершено {date} · импортировано {imported}, пропущено {skipped}, ошибок {errors}",
    "off": "Совместимость со старыми ссылками ВЫКЛЮЧЕНА. Пройдите мастер ниже, чтобы импортировать пользователей и активировать маршрут.",
    "disableBtn": "Отключить совместимость",
    "disableConfirm": "Отключить маршрут совместимости с Marzban? Старые ссылки перестанут открываться до повторного включения.",
    "step1": "1. Подключение",
    "step2": "2. Параметры",
    "step3": "3. Импорт",
    "step4": "4. Завершение",
    "connectTitle": "Подключение к исходной панели Marzban",
    "connectDesc": "Укажите URL панели и учётные данные sudo-администратора (или владельца). Данные не сохраняются — они хранятся только в этой сессии браузера до завершения импорта.",
    "marzbanUrl": "URL Marzban",
    "marzbanUrlHint": "Указывайте с протоколом. Завершающие слэши срезаются автоматически.",
    "adminUsername": "Логин администратора",
    "adminPassword": "Пароль администратора",
    "testBtn": "Проверить подключение",
    "testing": "Проверка…",
    "continueBtn": "Продолжить",
    "backBtn": "← Назад",
    "marzbanUsers": "Пользователей в Marzban",
    "admins": "Администраторов",
    "sudoAccess": "Доступ sudo",
    "status": "Статус",
    "sudo": "sudo",
    "limited": "ограниченный",
    "configureTitle": "Параметры миграции",
    "configureDesc": "Выберите, в какую группу серверов Celerity попадут пользователи каждого администратора Marzban, задайте путь подписки и вставьте JWT-секрет Marzban — он нужен для проверки старых ссылок.",
    "pathLabel": "Путь подписки (XRAY_SUBSCRIPTION_PATH)",
    "pathHint": "Должен совпадать с XRAY_SUBSCRIPTION_PATH исходной панели. По умолчанию sub. Зарезервировано: api, panel, health, sse, docs, public, static.",
    "acceptSalt": "Принимать случайный URL-salt (только если в Marzban был задан XRAY_SUBSCRIPTION_URL_PREFIX с *).",
    "jwtSecret": "JWT-секрет Marzban",
    "jwtSecretPlaceholder": "64-символьная hex-строка из `SELECT secret_key FROM jwt;`",
    "jwtSecretHint": "Команда ниже запускается внутри контейнера Marzban и читает секрет через родной Python/SQLAlchemy Marzban. Поэтому она работает с SQLite, MySQL и любой другой БД, настроенной в панели. В Celerity секрет хранится в AES-шифровании.",
    "jwtSecretCommandTitle": "Команда для получения JWT-секрета",
    "jwtSecretCommandDesc": "Выполните на сервере, где запущен Marzban. Команда автоматически найдёт контейнер Marzban по образу или имени.",
    "copyCommand": "Скопировать команду",
    "copied": "Скопировано",
    "mappingTitle": "Сопоставление: администратор → группа серверов",
    "mappingDesc": "Пользователи каждого администратора Marzban попадут в выбранную группу серверов Celerity. В списке только активные группы.",
    "thAdmin": "Администратор Marzban",
    "thGroup": "Группа серверов Celerity",
    "skipUsers": "— пропустить пользователей этого администратора —",
    "fallbackGroup": "Группа по умолчанию (для пользователей без сопоставленного администратора)",
    "fallbackNone": "— нет —",
    "onlyActive": "Импортировать только active / on_hold пользователей (рекомендуется).",
    "importVless": "Переиспользовать UUID VLESS из Marzban (Xray-идентичность остаётся стабильной для тех, у кого уже был VLESS).",
    "startBtn": "Запустить импорт",
    "starting": "Запуск…",
    "runTitle": "Идёт импорт",
    "runDesc": "Не закрывайте страницу до завершения импорта — задача живёт в памяти панели, перезапуск прервёт прогресс.",
    "processed": "обработано",
    "total": "всего",
    "imported": "импортировано",
    "skipped": "пропущено",
    "errors": "ошибок",
    "conflicts": "конфликтов",
    "finalizeTitle": "Активация совместимости",
    "finalizeDesc": "Пользователи уже в Celerity. Последний шаг включает маршрут /{path}/{token}, чтобы старые подписочные ссылки продолжали работать.",
    "conflictsTitle": "Конфликты (требуют ручной проверки)",
    "thReason": "Причина",
    "activateBtn": "Активировать маршрут",
    "activating": "Активация…",
    "editOptions": "← Изменить параметры",
    "startFailed": "Не удалось запустить: {error}",
    "activateFailed": "Не удалось активировать: {error}",
    "activateSuccess": "Маршрут совместимости включён. Старые ссылки уже должны открываться.",
    "disableFailed": "Ошибка: {error}"
  }
}
