Ground-Zerro / Phobos Public
Code Issues Pull requests Actions Releases View on GitHub ↗
34.9 KB json
{
  "pages": {
    "me": "Аккаунт",
    "clients": "Клиенты",
    "admin": {
      "panel": "Админ-панель",
      "general": "Общие настройки",
      "config": "Конфигурация",
      "interface": "Сетевой интерфейс",
      "obfuscatorPresets": "Пресеты обфускатора",
      "hooks": "Хуки",
      "warp": "WARP"
    }
  },
  "user": {
    "email": "E-Mail"
  },
  "me": {
    "currentPassword": "Текущий пароль",
    "enable2fa": "Включить двухфакторную аутентификацию",
    "enable2faDesc": "Отсканируйте QR‑код с помощью приложения‑аутентификатора или введите ключ вручную.",
    "2faKey": "Ключ TOTP",
    "2faCodeDesc": "Введите код из приложения‑аутентификатора.",
    "disable2fa": "Отключить двухфакторную аутентификацию",
    "disable2faDesc": "Введите пароль, чтобы отключить двухфакторную аутентификацию."
  },
  "general": {
    "name": "Имя",
    "username": "Имя пользователя",
    "password": "Пароль",
    "newPassword": "Новый пароль",
    "updatePassword": "Обновить пароль",
    "mtu": "MTU",
    "allowedIps": "Разрешённые IP‑адреса",
    "dns": "DNS",
    "persistentKeepalive": "Постоянное поддержание соединения",
    "logout": "Выйти",
    "continue": "Продолжить",
    "host": "Хост",
    "yes": "Да",
    "no": "Нет",
    "confirmPassword": "Подтвердите пароль",
    "loading": "Загрузка...",
    "2fa": "Двухфакторная аутентификация",
    "2faCode": "Код TOTP"
  },
  "setup": {
    "welcome": "Добро пожаловать в первичную настройку PhobosWG",
    "welcomeDesc": "Вы нашли самый простой способ развернуть отказоустойчивый WireGuard",
    "existingSetup": "У вас уже есть существующая настройка?",
    "createAdminDesc": "Сначала введите имя администратора и надёжный пароль. Эти данные будут использоваться для входа в Админ-панель.",
    "setupConfigDesc": "Укажите публичное имя хоста или адрес. Используется для интерфейса и TLS; доступ клиентов — через порт обфускатора.",
    "setupMigrationDesc": "Укажите файл резервной копии, если хотите перенести данные из предыдущей версии wg-easy.",
    "upload": "Загрузить",
    "migration": "Восстановить из резервной копии:",
    "createAccount": "Создать аккаунт",
    "successful": "Настройка завершена успешно",
    "hostDesc": "Публичное имя или IP (например для веб‑панели и сертификатов)",
    "tls": {
      "title": "HTTPS / TLS-сертификат",
      "desc": "Настройте TLS-сертификат для безопасного HTTPS-доступа. Без HTTPS вход в систему по умолчанию заблокирован.",
      "selfSigned": "Самоподписанный сертификат",
      "selfSignedDesc": "Генерируется мгновенно для вашего хоста. Браузер покажет предупреждение — нажмите «Дополнительно» → «Перейти».",
      "selfSignedHstsWarning": "Если браузер блокирует страницу с ошибкой HSTS без возможности продолжить, у него в кэше осталась HSTS-политика от предыдущего сертификата на этом домене. Откройте URL в режиме инкогнито/приватном окне или очистите запись через chrome://net-internals/#hsts (Delete domain).",
      "import": "Импорт существующего сертификата",
      "importDesc": "Вставьте свои PEM-сертификат и приватный ключ.",
      "importPath": "Импорт сертификата по путям к файлам",
      "importPathDesc": "Укажите абсолютные пути к существующим файлам сертификата и ключа на диске (например /etc/letsencrypt/live/example.com/*.pem). Файлы должны быть доступны для чтения изнутри контейнера.",
      "certPathLabel": "Путь к файлу сертификата (PEM fullchain)",
      "keyPathLabel": "Путь к файлу приватного ключа (PEM)",
      "importPathHint": "Файлы подключаются через симлинки, без копирования. При изменении исходных файлов на диске (например после certbot renew) сервер обнаружит это в течение ~30 с и автоматически перезапустится, подхватив новый сертификат. Контейнеру доступны для чтения следующие директории хоста: /etc/letsencrypt (certbot), /root/cert (3x-ui), /root/.acme.sh (acme.sh).",
      "skip": "Пропустить (без HTTPS)",
      "skipDesc": "Остаться на HTTP.",
      "certLabel": "Сертификат (PEM fullchain)",
      "keyLabel": "Приватный ключ (PEM)",
      "generate": "Создать сертификат",
      "apply": "Применить",
      "restarting": "Сертификат применён. Сервер перезапускается с HTTPS...",
      "redirectPrompt": "Откройте защищённую версию:",
      "openLink": "Открыть HTTPS",
      "skipWarning": "Без TLS-сертификата веб-интерфейс доступен только по HTTP.",
      "errorCert": "Проверка сертификата не удалась",
      "errorKey": "Проверка приватного ключа не удалась"
    }
  },
  "theme": {
    "dark": "Тёмная тема",
    "light": "Светлая тема",
    "system": "Системная тема"
  },
  "layout": {
    "toggleCharts": "Показать/скрыть графики",
    "donate": "Поддержать"
  },
  "header": {},
  "login": {
    "signIn": "Войти",
    "rememberMe": "Запомнить меня",
    "rememberMeDesc": "Оставаться в системе после закрытия браузера",
    "2faRequired": "Требуется двухфакторная аутентификация",
    "2faWrong": "Неверный код двухфакторной аутентификации"
  },
  "client": {
    "empty": "Клиентов пока нет.",
    "newShort": "Новый",
    "sort": "Сортировка",
    "create": "Создать клиента",
    "created": "Клиент создан",
    "new": "Новый клиент",
    "name": "Имя",
    "expireDate": "Дата отключения",
    "expireDateDesc": "Дата, когда клиент будет отключён. Оставьте пустым для бессрочного доступа",
    "delete": "Удалить",
    "deleteClient": "Удалить клиента",
    "deleteDialog1": "Вы уверены, что хотите удалить",
    "deleteDialog2": "Это действие нельзя отменить.",
    "enabled": "Включён",
    "address": "Адрес",
    "serverAllowedIps": "Разрешённые IP‑адреса сервера",
    "copyInstallLink": "Скопировать команду установки",
    "installLinkCopied": "Команда установки скопирована в буфер",
    "installLinkFailed": "Не удалось сгенерировать ссылку установки",
    "downloadPackage": "Скачать установочный пакет",
    "permanent": "Бессрочный",
    "createdOn": "Создан ",
    "lastSeen": "Последнее подключение ",
    "totalDownload": "Всего скачано: ",
    "totalUpload": "Всего отправлено: ",
    "newClient": "Новый клиент",
    "disableClient": "Отключить клиента",
    "enableClient": "Включить клиента",
    "noPrivKey": "У этого клиента нет приватного ключа. Невозможно создать конфигурацию.",
    "showQR": "Показать QR‑код",
    "allowedIpsDesc": "Какие IP‑адреса будут маршрутизироваться через VPN (переопределяет глобальную конфигурацию)",
    "serverAllowedIpsDesc": "Какие IP‑адреса сервер будет отправлять клиенту",
    "mtuDesc": "Максимальный размер пакета (MTU) для VPN‑туннеля",
    "persistentKeepaliveDesc": "Устанавливает интервал (в секундах) для пакетов поддержания соединения. 0 — Отключить",
    "hooks": "Хуки",
    "hooksDescription": "Хуки работают только с wg‑quick",
    "hooksLeaveEmpty": "Только для wg‑quick. В остальных случаях оставьте пустым",
    "dnsDesc": "DNS‑сервер, который будут использовать клиенты (переопределяет глобальную конфигурацию)",
    "notConnected": "Клиент не подключен",
    "endpoint": "Точка подключения",
    "endpointDesc": "IP‑адрес клиента, с которого установлено соединение WireGuard",
    "search": "Поиск клиентов...",
    "config": "Конфигурация",
    "viewConfig": "Просмотреть конфигурацию",
    "firewallIps": "Разрешённые фаерволом IP-адреса",
    "firewallIpsDesc": "IP‑адреса/CIDR-диапазоны, к которым может получить доступ клиент (проверка на сервере). Оставьте пустым, будут использоваться «Разрешённые IP‑адреса» (AllowedIPs). Поддерживается фильтрация по портам и протоколам. Подробности см. в документации.",
    "downloadPng": "Скачать PNG",
    "copyLink": "Копировать phobos:// ссылку",
    "linkShort": "Ссылка",
    "linkCopied": "phobos:// ссылка скопирована в буфер обмена",
    "linkFailed": "Не удалось скопировать phobos:// ссылку",
    "preset": "Пресет обфускатора",
    "protocol": "Протокол",
    "presetDesc": "Выберите пресет обфускатора, через который клиент будет ходить. Протокол пресета (WireGuard или SOCKS5) определяет, какие поля ниже применимы — например, логин/пароль SOCKS5 показываются только для SOCKS5-пресета, так как в WireGuard они не используются. Оставьте «по умолчанию», чтобы следовать default-пресету сервера (WireGuard).",
    "presetUseDefault": "Использовать default-пресет",
    "socks5Login": "Логин SOCKS5",
    "socks5Password": "Пароль SOCKS5",
    "socks5CredentialsHint": "Укажите этот логин и пароль в настройках вашего SOCKS5-приложения (браузер, curl и т. п.) — сам обфускатор лишь шифрует трафик, он не хранит и не проверяет эти учётные данные.",
    "socks5ConfigNote": "У этого клиента выбран SOCKS5-пресет, поэтому конфиг ниже — это блок клиентского SOCKS5-обфускатора, а не WireGuard. Логин/пароль SOCKS5, показанные на странице этого клиента, нужно указать в самом SOCKS5-приложении.",
    "nameHint": "Только латинские буквы, цифры, дефис, точка и {'@'}; до 32 символов; имя должно быть уникальным.",
    "nameError": {
      "tooLong": "Имя не должно превышать {max} символа(ов).",
      "invalidChars": "Допустимы только латинские буквы, цифры, дефис, точка и {'@'} (без пробелов и других спецсимволов).",
      "duplicate": "Клиент с таким именем уже существует."
    }
  },
  "dialog": {
    "change": "Изменить",
    "cancel": "Отменить",
    "create": "Создать",
    "delete": "Удалить"
  },
  "toast": {
    "success": "Успешно",
    "saved": "Сохранено",
    "error": "Ошибка",
    "unknown": "Неизвестная ошибка. Подробности см. в консоли браузера"
  },
  "form": {
    "actions": "Действия",
    "save": "Сохранить",
    "revert": "Отменить",
    "sectionGeneral": "Общие",
    "sectionAdvanced": "Расширенные",
    "noItems": "Нет элементов",
    "nullNoItems": "Нет элементов. Используется глобальная конфигурация",
    "add": "Добавить"
  },
  "admin": {
    "general": {
      "sessionTimeout": "Время жизни сессии",
      "sessionTimeoutDesc": "Длительность сессии для «Запомнить меня» (в секундах)",
      "metrics": "Метрики",
      "metricsPassword": "Пароль",
      "metricsPasswordDesc": "Bearer-пароль для конечной точки метрик. Оставьте поле пустым, чтобы сохранить текущий пароль.",
      "metricsPasswordSet": "Пароль установлен — оставьте пустым, чтобы не менять",
      "metricsPasswordUnset": "Пароль не установлен",
      "json": "JSON",
      "jsonDesc": "Путь для метрик в формате JSON",
      "prometheus": "Prometheus",
      "prometheusDesc": "Путь для метрик Prometheus"
    },
    "config": {
      "connection": "Соединение",
      "hostDesc": "Публичное имя или IP (сохранение обнуляет связанные с хостом данные клиентов)",
      "allowedIpsDesc": "Разрешённые IP‑адреса для клиентов (глобальная конфигурация)",
      "dnsDesc": "DNS‑сервер для клиентов (глобальная конфигурация)",
      "mtuDesc": "MTU для клиентов (только для новых)",
      "persistentKeepaliveDesc": "Интервал в секундах для отправки пакетов поддержания соединения на сервер. 0 = отключено (только для новых клиентов)"
    },
    "tls": {
      "title": "TLS-сертификат",
      "desc": "Замените активный HTTPS-сертификат или переключитесь на HTTP.",
      "current": "Активный сертификат",
      "apply": "Применить настройки TLS",
      "applied": "Настройки TLS применены. Сервер перезапускается.",
      "appliedRestart": "Настройки TLS применены. Сервер перезапускается; через несколько секунд откройте {url}.",
      "externalManaged": "TLS управляется внешним обратным прокси (TLS_TERMINATION=external). Сертификат нужно выпускать и обновлять вне PhobosWG.",
      "origin": {
        "self-signed": "Самоподписанный",
        "imported": "Импортированный (вставленный PEM)",
        "imported-path": "Импорт по путям (симлинк, авто-перезагрузка)",
        "none": "Нет (HTTP)"
      }
    },
    "interface": {
      "cidrSuccess": "CIDR изменён",
      "device": "Устройство",
      "deviceDesc": "Сетевое устройство Ethernet, через которое должен проходить трафик WireGuard",
      "mtuDesc": "MTU, который будет использовать WireGuard",
      "changeCidr": "Изменить CIDR",
      "restart": "Перезапустить интерфейс",
      "restartDesc": "Перезапустить сетевой интерфейс WireGuard",
      "restartWarn": "Вы уверены, что хотите перезапустить сетевой интерфейс? Это приведёт к отключению всех клиентов.",
      "restartSuccess": "Интерфейс перезапущен",
      "subnet": "Подсеть WireGuard",
      "ipv4Cidr": "Подсеть WireGuard IPv4 (CIDR)",
      "ipv4CidrDesc": "Пул адресов для клиентов (например 10.8.0.0/24). Расширьте маску (например /16), чтобы увеличить число клиентов или использовать другие диапазоны. Изменение переназначает IPv4-адрес каждому клиенту.",
      "ipv6Cidr": "Подсеть WireGuard IPv6 (CIDR)",
      "ipv6CidrDesc": "Пул IPv6-адресов для клиентов. Изменение переназначает IPv6-адрес каждому клиенту.",
      "firewall": "Фильтрация трафика",
      "firewallEnabled": "Включить фаервол для отдельных клиентов",
      "firewallEnabledDesc": "Ограничить трафик клиентов до определённых IP‑адресов с помощью iptables. При включении для каждого клиента можно настроить список разрешённых адресов.",
      "publicAddress": "Публичный адрес",
      "publicIpV4": "Публичный IPv4 сервера",
      "publicIpV4Desc": "Используется в target клиентского конфига обфускатора.",
      "publicIpV6": "Публичный IPv6 сервера",
      "publicIpV6Desc": "Опциональная IPv6‑цель.",
      "publicDomain": "Публичный домен сервера",
      "publicDomainDesc": "Если указан, используется как target обфускатора в клиентском конфиге вместо IPv4/IPv6.",
      "egress": "Исходящий канал",
      "egressWarp": "Направить трафик клиентов через WARP",
      "egressWarpDesc": "При включении клиенты выходят в интернет через Cloudflare WARP, а не через WAN сервера, скрывая реальный IP сервера. Требует зарегистрированной конфигурации WARP. Может потребоваться снижение MTU клиентов."
    },
    "obfuscatorPresets": {
      "title": "Пресеты обфускатора",
      "desc": "Каждый пресет — отдельный listener wg-obfuscator с собственным портом, ключом и режимом маскировки. Default-пресет используется всеми клиентами, у которых явно не выбран другой. WireGuard-пресеты используют UDP-порты 51822–51861, SOCKS5-пресеты — TCP-порты 51862–51891 (диапазоны, опубликованные в docker-compose).",
      "add": "Добавить пресет",
      "addDesc": "Введите только имя. Порт, ключ и остальные параметры получат значения по умолчанию — их можно изменить в настройках пресета после создания.",
      "default": "по умолчанию",
      "setAsDefault": "Сделать по умолчанию",
      "deleteConfirm": "Удалить этот пресет? Клиенты, использующие его, переключатся на default-пресет.",
      "regenerateKey": "Перегенерировать ключ",
      "regeneratePort": "Выбрать свободный порт",
      "nameLabel": "Имя",
      "nameDesc": "Отображаемое имя пресета. Используется только в панели.",
      "modeLabel": "Протокол (mode)",
      "modeDesc": "WireGuard: обфусцирует UDP-хендшейк WireGuard. SOCKS5: запускает настоящий SOCKS5-прокси (с опциональным RFC1929 логином/паролем на клиента) поверх обфусцированного TCP-канала.",
      "sourceLportLabel": "source-lport (внешний UDP-порт)",
      "sourceLportLabelSocks5": "source-lport (внешний TCP-порт)",
      "sourceLportDesc": "Публичный UDP-порт, на котором слушает серверный обфускатор. Должен быть в диапазоне 51822–51861 (его публикует docker-compose), иначе клиенты не смогут подключиться.",
      "sourceLportDescSocks5": "Публичный TCP-порт, на котором слушает SOCKS5-сервер. Должен быть в диапазоне 51862–51891 (его публикует docker-compose), иначе клиенты не смогут подключиться.",
      "targetLabel": "target",
      "targetDesc": "Куда серверный обфускатор пересылает снятый с маскировки трафик. Пусто = локальный WireGuard (127.0.0.1:<порт WG>). Формат: host:port.",
      "targetPlaceholder": "127.0.0.1:<порт WireGuard> (по умолчанию)",
      "sourceIfLabel": "source-if",
      "sourceIfDesc": "IP интерфейса, на котором слушает серверный обфускатор. По умолчанию 0.0.0.0 (все интерфейсы).",
      "keyLabel": "Ключ обфускации (key)",
      "keyDesc": "Общий ключ обфускации, одинаковый на обеих сторонах. Генерируется случайно (200–254 символа). Длина 1–255.",
      "maskingLabel": "Режим маскировки (masking)",
      "maskingDesc": "Режим обхода DPI. STUN: трафик под STUN. MEDIA: под RTP/H.264 медиапоток, задаётся явно на обеих сторонах. AUTO: сервер определяет автоматически, клиент использует STUN. NONE: маскировка выключена (XOR остаётся).",
      "maskingDescSocks5": "Режим обхода DPI. STUN: трафик под STUN. MEDIA: под RTP/H.264 медиапоток, задаётся явно на обеих сторонах. TLS: под HTTPS-записи. NONE: маскировка выключена (XOR остаётся). AUTO недоступен для SOCKS5-пресетов.",
      "obfuscateBytesLabel": "obfuscate-bytes",
      "obfuscateBytesDesc": "Сколько первых байт преобразовывать XOR. 0 = весь пакет. При >0 padding отключается. Должно совпадать на обеих сторонах. Для MEDIA: 0 → авто 16, минимум 4.",
      "dummyLabel": "Макс. dummy‑байт (max-dummy)",
      "dummyDesc": "Максимальный размер случайного padding на пакет (0–1024). По умолчанию 40.",
      "dummyDisabledNote": "Не действует при MEDIA и при obfuscate-bytes > 0.",
      "mediaSsrcDisabledNote": "Действует только при режиме маскировки MEDIA.",
      "verboseLabel": "verbose (уровень логов)",
      "verboseDesc": "Детализация логов. error/warn/info/debug/trace. На боевом сервере рекомендуется error; debug/trace резко нагружают CPU.",
      "clientLocalPortLabel": "Локальный WG-порт на клиенте",
      "clientLocalPortDesc": "Локальный UDP-порт, куда шлёт WireGuard клиента (Endpoint 127.0.0.1:<порт>) и source-lport клиентского обфускатора. По умолчанию 13255.",
      "clientLocalPortSocks5Label": "Локальный SOCKS5-порт на клиенте",
      "clientLocalPortSocks5Desc": "Локальный TCP-порт, который слушает клиентский SOCKS5-обфускатор. В настройках SOCKS5-прокси приложения укажите 127.0.0.1:<порт>. По умолчанию 1080.",
      "mediaSsrcLabel": "RTP SSRC (media-ssrc)",
      "mediaSsrcDesc": "Фиксированный токен SSRC для надёжного распознавания MEDIA-кадров на обеих сторонах. Автозаполняется при выборе MEDIA; 0 = не задан.",
      "clientCount": "{n} клиент(ов)"
    },
    "introText": "Добро пожаловать в панель администратора.\n\nЗдесь вы можете управлять общими настройками, конфигурацией, интерфейсом, пресетами обфускатора и хуками.\n\nНачните с выбора одного из разделов на боковой панели.",
    "warp": {
      "title": "Cloudflare WARP",
      "intro": "Зарегистрируйте бесплатный аккаунт Cloudflare WARP для использования в качестве исходящего канала для клиентов. Клиенты будут выходить в интернет с IP Cloudflare, а не с IP сервера.",
      "register": "Получить WARP",
      "registerSuccess": "WARP зарегистрирован",
      "status": "Статус",
      "connection": "Соединение",
      "online": "В сети",
      "offline": "Не в сети",
      "checkNow": "Проверить соединение",
      "checking": "Проверка…",
      "checkOnline": "WARP в сети",
      "checkOffline": "WARP не в сети",
      "deviceId": "ID устройства",
      "addressV4": "Адрес IPv4",
      "addressV6": "Адрес IPv6",
      "endpoint": "Эндпоинт",
      "notActiveEgress": "WARP не активен в исходящем канале",
      "notActiveEgressTip": "Включите «Направить трафик клиентов через WARP» в разделе «Сетевой интерфейс», чтобы использовать и проверить туннель WARP.",
      "license": "Лицензия WARP+",
      "licenseKey": "Лицензионный ключ",
      "licenseKeyDesc": "Введите лицензионный ключ WARP+ для активации WARP+.",
      "licenseSet": "Лицензия установлена",
      "licenseUnset": "Лицензия отсутствует",
      "licenseSuccess": "Лицензия применена",
      "applyLicense": "Применить лицензию",
      "autoRotate": "Автоматическая ротация IP",
      "intervalDays": "Интервал (дней)",
      "intervalDaysDesc": "0 — отключить. Автоматически меняет IP WARP.",
      "changeIp": "Сменить IP",
      "changeIpSuccess": "IP WARP изменён",
      "delete": "Удалить WARP",
      "deleteSuccess": "Конфигурация WARP удалена",
      "importConfig": "Изменить конфигурацию",
      "importTitle": "Ручная конфигурация WARP",
      "importDesc": "Вставьте WireGuard-конфиг. Система проверит соединение — если рукопожатие установлено, конфигурация будет сохранена. Параметры Table, PostUp и PostDown управляются автоматически и не должны присутствовать в конфиге.",
      "importApply": "Применить",
      "importSuccess": "Конфигурация WARP применена"
    }
  },
  "zod": {
    "generic": {
      "required": "{0} обязательно для заполнения",
      "validNumber": "{0} должно быть числом",
      "validNumberRange": "{0} должно быть числом или диапазоном чисел",
      "validString": "{0} должно быть строкой",
      "validBoolean": "{0} должно быть логическим значением",
      "validArray": "{0} должно быть массивом",
      "stringMin": "{0} должно содержать не менее {1} символа",
      "numberMin": "{0} должно быть не менее {1}"
    },
    "client": {
      "id": "ID клиента",
      "name": "Имя",
      "expiresAt": "Дата окончания действия",
      "address4": "IPv4‑адрес",
      "address6": "IPv6‑адрес",
      "serverAllowedIps": "Разрешённые IP‑адреса сервера",
      "firewallIps": "Разрешённые фаерволом IP-адреса",
      "firewallIpsInvalid": "Некорректная запись IP-адреса для фаервола. Поддерживаемый синтаксис см. в документации",
      "presetId": "ID пресета обфускатора",
      "nameTooLong": "Имя клиента не должно превышать 32 символа.",
      "nameInvalidChars": "Имя клиента может содержать только латинские буквы, цифры, дефис, точку и {'@'} (без пробелов и других спецсимволов)."
    },
    "obfuscatorPreset": {
      "id": "ID пресета обфускатора",
      "name": "Имя пресета",
      "mode": "Протокол",
      "extPort": "Внешний порт (WireGuard/UDP 51822–51861, SOCKS5/TCP 51862–51891)",
      "key": "Ключ обфускатора",
      "masking": "Режим маскировки",
      "maskingAutoSocks5": "Маскировка AUTO недоступна для пресетов в режиме SOCKS5",
      "maskingTlsWireguard": "Маскировка TLS доступна только для пресетов в режиме SOCKS5",
      "sourceIf": "Интерфейс прослушивания (IP)",
      "target": "Target должен быть в формате host:port",
      "obfuscateBytes": "Obfuscate-bytes (0–1024)",
      "obfuscateBytesMedia": "Для MEDIA минимум 4 (или 0 для значения по умолчанию 16)",
      "verbose": "Уровень логов",
      "idle": "Таймаут простоя",
      "dummy": "Макс. dummy‑байт",
      "clientWgLocalPort": "Локальный WG-порт на клиенте",
      "mediaSsrc": "RTP SSRC",
      "clientLocalPort": "Локальный порт на клиенте (1-65535)"
    },
    "user": {
      "username": "Имя пользователя",
      "password": "Пароль",
      "remember": "Запомнить",
      "name": "Имя",
      "email": "Электронная почта",
      "emailInvalid": "Адрес электронной почты должен быть корректным",
      "passwordMatch": "Пароли должны совпадать",
      "totpEnable": "Включить TOTP",
      "totpEnableTrue": "TOTP должен быть включён",
      "totpCode": "Код TOTP"
    },
    "userConfig": {
      "host": "Хост"
    },
    "general": {
      "sessionTimeout": "Время жизни сессии",
      "metricsEnabled": "Метрики",
      "metricsPassword": "Пароль для метрик"
    },
    "interface": {
      "cidr": "CIDR",
      "device": "Устройство",
      "cidrValid": "CIDR должен быть корректным",
      "egressMode": "Режим исходящего канала",
      "domainValid": "Домен должен быть корректным именем хоста"
    },
    "installLink": {
      "token": "Токен установки"
    },
    "obfuscator": {
      "extPort": "Внешний порт обфускатора",
      "key": "Ключ обфускатора",
      "masking": "Режим маскировки",
      "idle": "Таймаут простоя обфускатора",
      "dummy": "Макс. dummy‑байт",
      "publicIpV4": "Публичный IPv4 сервера",
      "publicIpV6": "Публичный IPv6 сервера"
    },
    "stringMalformed": "Строка имеет неверный формат",
    "body": "Тело должно быть корректным объектом",
    "hook": "Хук",
    "enabled": "Включено",
    "mtu": "MTU",
    "persistentKeepalive": "Постоянное поддержание соединения",
    "address": "IP‑адрес",
    "dns": "DNS",
    "allowedIps": "Разрешённые IP‑адреса",
    "file": "Файл",
    "warp": {
      "addressV4": "Адрес IPv4",
      "addressV6": "Адрес IPv6",
      "endpoint": "Эндпоинт (хост:порт)",
      "interval": "Интервал обновления (дней)",
      "key": "Ключ WireGuard",
      "license": "Лицензионный ключ WARP+ (мин. 26 символов)"
    }
  },
  "hooks": {
    "preUp": "PreUp",
    "postUp": "PostUp",
    "preDown": "PreDown",
    "postDown": "PostDown"
  },
  "copy": {
    "notSupported": "Копирование не поддерживается",
    "copied": "Скопировано!",
    "failed": "Ошибка копирования",
    "copy": "Копировать",
    "copyConfig": "Нажмите, чтобы скопировать конфиг в буфер обмена"
  }
}