i18n(panel): migrate hardcoded panel strings to en-US and translate all locales

Surface ~400 hardcoded English labels, tooltips, placeholders, dt/divider
text, modal okText/cancelText, and Spin loading from the panel pages
(clients/groups/inbounds/nodes/settings/xray/sub/index) into
web/translation/en-US.json under existing pages.<page>.* namespaces, with
JSX swapped to t(...). Brand and protocol identifiers (TLS, MTU, SNI,
NordVPN, Cloudflare WARP, etc.) stay literal.

Sync all 12 non-English locales (ar-EG, es-ES, fa-IR, id-ID, ja-JP,
pt-BR, ru-RU, tr-TR, uk-UA, vi-VN, zh-CN, zh-TW) to match en-US's
structure and translate the 521 new key paths per locale. Every locale
file now has 1539 lines, mirroring en-US ordering.

Also remove a dead duplicate "info": "Info" key under pages.inbounds
that collided with the new pages.inbounds.info.* object.

Backend: bulk attach/detach errors in web/service/client.go now route
through logger.Warningf (so they appear under /panel/api/server/logs/)
instead of only living on the response payload.
This commit is contained in:
MHSanaei
2026-05-28 18:03:07 +02:00
parent 0829f1ecd4
commit 72b97efa8a
34 changed files with 6391 additions and 1125 deletions

View File

@@ -8,15 +8,22 @@
"save": "Сохранить",
"logout": "Выход",
"create": "Создать",
"add": "Добавить",
"remove": "Удалить",
"update": "Обновить",
"copy": "Копировать",
"copied": "Скопировано",
"more": "ещё",
"download": "Скачать",
"remark": "Примечание",
"enable": "Включить",
"protocol": "Протокол",
"search": "Поиск",
"filter": "Фильтр",
"all": "Все",
"from": "От",
"to": "До",
"done": "Готово",
"loading": "Загрузка...",
"refresh": "Обновить",
"clear": "Очистить",
@@ -27,12 +34,12 @@
"check": "Проверить",
"indefinite": "Бесконечно",
"unlimited": "Безлимит",
"none": "Пусто",
"none": "Нет",
"qrCode": "QR-код",
"info": "Информация",
"edit": "Изменить",
"delete": "Удалить",
"reset": "Сбросить",
"reset": "Сброс",
"noData": "Нет данных.",
"copySuccess": "Скопировано",
"sure": "Да",
@@ -41,14 +48,14 @@
"transmission": "Транспорт",
"host": "Хост",
"path": "Путь",
"camouflage": "Маскировка",
"camouflage": "Обфускация",
"status": "Статус",
"enabled": "Включено",
"disabled": "Отключено",
"depleted": "Исчерпано",
"depletingSoon": "Почти исчерпано",
"offline": "Офлайн",
"online": "Онлайн",
"offline": "Не в сети",
"online": "В сети",
"domainName": "Домен",
"monitor": "Мониторинг IP",
"certificate": "SSL-сертификат",
@@ -95,11 +102,12 @@
"dark": "Темная",
"ultraDark": "Очень темная",
"dashboard": "Дашборд",
"inbounds": "Подключения",
"inbounds": "Входящие",
"clients": "Клиенты",
"groups": "Группы",
"nodes": "Узлы",
"settings": "Настройки",
"xray": "Настройки Xray",
"settings": "Настройки панели",
"xray": "Конфигурации Xray",
"apiDocs": "Документация API",
"logout": "Выход",
"link": "Управление",
@@ -120,16 +128,16 @@
},
"index": {
"title": "Дашборд",
"cpu": "ЦП",
"cpu": "CPU",
"logicalProcessors": "Логические процессоры",
"frequency": "Частота",
"swap": "Файл подкачки",
"swap": "Swap",
"storage": "Диск",
"memory": "ОЗУ",
"memory": "RAM",
"threads": "Потоки",
"xrayStatus": "Xray",
"stopXray": "Остановить",
"restartXray": "Перезапустить",
"stopXray": "Стоп",
"restartXray": "Перезапуск",
"xraySwitch": "Выбор версии",
"xrayUpdates": "Обновления Xray",
"xraySwitchClick": "Выберите нужную версию",
@@ -165,8 +173,8 @@
"ipAddresses": "IP-адреса сервера",
"toggleIpVisibility": "Скрыть или показать IP-адреса сервера",
"overallSpeed": "Общая скорость передачи трафика",
"upload": "Отправка",
"download": "Загрузка",
"upload": "Загрузка",
"download": "Скачать",
"totalData": "Общий объем трафика",
"sent": "Отправлено",
"received": "Получено",
@@ -226,7 +234,7 @@
"customGeoErrUpdateAllIncomplete": "Не удалось обновить один или несколько пользовательских источников",
"customGeoEmpty": "Пользовательских источников geo пока нет — нажмите «Добавить», чтобы создать",
"dontRefresh": "Установка в процессе. Не обновляйте страницу",
"logs": "Журнал",
"logs": "Логи",
"config": "Конфигурация",
"backup": "Резервная копия",
"backupTitle": "Бэкап и восстановление",
@@ -241,7 +249,7 @@
"getConfigError": "Произошла ошибка при получении конфигурационного файла"
},
"inbounds": {
"title": "Подключения",
"title": "Входящие",
"totalDownUp": "Отправлено/получено",
"totalUsage": "Всего трафика",
"inboundCount": "Всего подключений",
@@ -252,7 +260,7 @@
"deployTo": "Развернуть на",
"localPanel": "Локальная панель",
"fallbacks": {
"title": "Фолбэки",
"title": "Fallback'и",
"help": "Когда соединение на этом инбаунде не совпадает ни с одним клиентом, оно перенаправляется на другой инбаунд. Выберите дочерний инбаунд ниже — поля маршрутизации (SNI / ALPN / Path / xver) заполнятся автоматически из его транспорта, для большинства конфигураций больше ничего менять не нужно. Каждый дочерний должен слушать на 127.0.0.1 с security=none.",
"empty": "Фолбэков пока нет",
"add": "Добавить фолбэк",
@@ -270,14 +278,14 @@
},
"protocol": "Протокол",
"port": "Порт",
"portMap": "Порт-маппинг",
"portMap": "Сопоставление портов",
"traffic": "Трафик",
"details": "Подробнее",
"transportConfig": "Транспорт",
"expireDate": "Дата окончания",
"createdAt": "Создано",
"updatedAt": "Обновлено",
"resetTraffic": "Сброс трафика",
"resetTraffic": "Сбросить трафик",
"addInbound": "Создать подключение",
"generalActions": "Общие действия",
"modifyInbound": "Изменить подключение",
@@ -292,11 +300,29 @@
"delAllClients": "Удалить всех клиентов",
"delAllClientsConfirmTitle": "Удалить всех {count} клиентов из \"{remark}\"?",
"delAllClientsConfirmContent": "Удаляет всех клиентов этого подключения и сбрасывает их записи трафика. Само подключение сохраняется. Это действие нельзя отменить.",
"attachClients": "Привязать клиентов к…",
"addClientsToGroup": "Добавить клиентов в группу…",
"attachClientsTitle": "Привязать клиентов из «{remark}»",
"attachClientsDesc": "Привязывает тех же {count} клиент(ов) (с тем же UUID/паролем и общим трафиком) к выбранным входящим. Они остаются и на этом входящем.",
"attachClientsTargets": "Целевые входящие",
"attachClientsNoTargets": "Нет других совместимых входящих для привязки.",
"attachClientsResult": "Привязано {attached}, пропущено {skipped}.",
"attachClientsResultMixed": "Привязано {attached}, пропущено {skipped}, ошибок {errors}.",
"attachClientsSelectLabel": "Клиенты для привязки",
"attachClientsSearchPlaceholder": "Поиск email или комментария",
"attachClientsStatusDisabled": "Отключено",
"attachClientsSelectedCount": "{selected} из {total} выбрано",
"detachClients": "Отвязать клиентов",
"detachClientsTitle": "Отвязать клиентов из «{remark}»",
"detachClientsDesc": "Удаляет выбранных клиент(ов) только с этого входящего. Записи клиентов сохраняются (используйте Delete для полного удаления). У источника всего {count} клиент(ов).",
"detachClientsResult": "Отвязано {detached}, пропущено {skipped}.",
"detachClientsResultMixed": "Отвязано {detached}, пропущено {skipped}, ошибок {errors}.",
"detachClientsSelectLabel": "Клиенты для отвязки",
"exportLinksTitle": "Экспортировать ссылки подключения",
"exportSubsTitle": "Экспортировать ссылки подписки",
"exportAllLinksTitle": "Экспортировать все ссылки подключений",
"exportAllSubsTitle": "Экспортировать все ссылки подписок",
"inboundJsonTitle": "JSON подключения",
"inboundJsonTitle": "JSON входящего",
"deleteClient": "Удалить клиента",
"deleteClientContent": "Вы уверены, что хотите удалить клиента?",
"resetTrafficContent": "Вы уверены, что хотите сбросить трафик?",
@@ -306,7 +332,7 @@
"destinationPort": "Порт назначения",
"targetAddress": "Целевой адрес",
"monitorDesc": "Оставьте пустым для прослушивания всех IP-адресов",
"meansNoLimit": "= Без ограничений (значение: ГБ)",
"meansNoLimit": "= Безлимит. (единица: ГБ)",
"totalFlow": "Общий расход",
"leaveBlankToNeverExpire": "Оставьте пустым, чтобы было бесконечным",
"noRecommendKeepDefault": "Рекомендуется оставить настройки по умолчанию",
@@ -341,9 +367,10 @@
"IPLimitlogDesc": "Лог IP-адресов (перед включением лога IP-адресов, вы должны очистить лог)",
"IPLimitlogclear": "Очистить лог",
"setDefaultCert": "Установить сертификат панели",
"streamTab": "Поток",
"setDefaultCertEmpty": "Для панели не настроен сертификат. Сначала установите его в Настройках.",
"streamTab": "Stream",
"securityTab": "Безопасность",
"sniffingTab": "Сниффинг",
"sniffingTab": "Sniffing",
"sniffingMetadataOnly": "Только метаданные",
"sniffingRouteOnly": "Только маршрутизация",
"sniffingIpsExcluded": "Исключённые IP",
@@ -361,15 +388,14 @@
"allHelp": "Полный объект входящего со всеми полями в одном редакторе.",
"settings": "Настройки",
"settingsHelp": "Обёртка блока settings Xray:",
"sniffing": "Сниффинг",
"sniffing": "Sniffing",
"sniffingHelp": "Обёртка блока sniffing Xray:",
"stream": "Поток",
"stream": "Stream",
"streamHelp": "Обёртка блока stream Xray:",
"jsonErrorPrefix": "Расширенный JSON"
},
"telegramDesc": "Пожалуйста, укажите Chat ID Telegram. (используйте команду '/id' в боте) или ({'@'}userinfobot)",
"subscriptionDesc": "Вы можете найти свою ссылку подписки в разделе 'Подробнее'",
"info": "Информация",
"same": "Тот же",
"inboundData": "Данные подключений",
"exportInbound": "Экспорт подключений",
@@ -406,6 +432,139 @@
"getNewmldsa65Error": "Ошибка при получении сертификата mldsa65.",
"getNewVlessEncError": "Ошибка при получении сертификата VlessEnc."
},
"form": {
"moveUp": "Вверх",
"moveDown": "Вниз",
"addAll": "Добавить все",
"addAllFallbackTooltip": "Добавляет строку fallback для каждого подходящего входящего, ещё не подключённого",
"peers": "Peers",
"addPeer": "Добавить peer",
"keepAlive": "Keep-alive",
"autoSystemRoutesTooltip": "Только для Windows. CIDR'ы автоматически добавляются в системную таблицу маршрутизации, чтобы соответствующий трафик шёл через TUN.",
"autoOutboundsInterface": "Авто-интерфейс исходящих",
"autoOutboundsInterfaceTooltip": "Физический интерфейс для исходящего трафика. Используйте 'auto' для автоопределения; включается автоматически при Auto system routes.",
"rewriteAddress": "Переписать адрес",
"rewritePort": "Переписать порт",
"allowedNetwork": "Разрешённая сеть",
"followRedirect": "Следовать redirect",
"accounts": "Аккаунты",
"allowTransparent": "Разрешить прозрачный",
"encryptionMethod": "Метод шифрования",
"visionTestseed": "Vision testseed",
"version": "Версия",
"udpIdleTimeout": "UDP idle timeout (с)",
"masquerade": "Masquerade",
"type": "Тип",
"upstreamUrl": "Upstream URL",
"rewriteHost": "Переписать Host",
"skipTlsVerify": "Пропустить TLS verify",
"directory": "Директория",
"statusCode": "Код статуса",
"body": "Body",
"headers": "Заголовки",
"proxyProtocol": "Proxy Protocol",
"requestVersion": "Версия запроса",
"requestMethod": "Метод запроса",
"requestPath": "Путь запроса",
"requestHeaders": "Заголовки запроса",
"responseVersion": "Версия ответа",
"responseStatus": "Статус ответа",
"responseReason": "Причина ответа",
"responseHeaders": "Заголовки ответа",
"heartbeatPeriod": "Период heartbeat",
"serviceName": "Имя сервиса",
"authority": "Authority",
"multiMode": "Multi Mode",
"maxBufferedUpload": "Макс. буферизованная загрузка",
"maxUploadSize": "Макс. размер загрузки (байт)",
"streamUpServer": "Stream-Up Server",
"serverMaxHeaderBytes": "Server Max Header Bytes",
"paddingBytes": "Padding Bytes",
"uplinkHttpMethod": "HTTP-метод Uplink",
"paddingObfsMode": "Padding Obfs Mode",
"paddingKey": "Padding Key",
"paddingHeader": "Padding Header",
"paddingPlacement": "Padding Placement",
"paddingMethod": "Padding Method",
"sessionPlacement": "Session Placement",
"sessionKey": "Session Key",
"sequencePlacement": "Sequence Placement",
"sequenceKey": "Sequence Key",
"uplinkDataPlacement": "Uplink Data Placement",
"uplinkDataKey": "Uplink Data Key",
"noSseHeader": "Без заголовка SSE",
"ttiMs": "TTI (мс)",
"uplinkMbps": "Uplink (МБ/с)",
"downlinkMbps": "Downlink (МБ/с)",
"cwndMultiplier": "Множитель CWND",
"maxSendingWindow": "Макс. окно отправки",
"externalProxy": "External Proxy",
"sniPlaceholder": "SNI (по умолчанию = host)",
"fingerprint": "Fingerprint",
"defaultOption": "По умолчанию",
"routeMark": "Route Mark",
"tcpKeepAliveInterval": "TCP Keep Alive Interval",
"tcpKeepAliveIdle": "TCP Keep Alive Idle",
"tcpMaxSeg": "TCP Max Seg",
"tcpUserTimeout": "TCP User Timeout",
"tcpWindowClamp": "TCP Window Clamp",
"tcpFastOpen": "TCP Fast Open",
"multipathTcp": "Multipath TCP",
"penetrate": "Penetrate",
"v6Only": "Только V6",
"tcpCongestion": "TCP Congestion",
"dialerProxy": "Dialer Proxy",
"trustedXForwardedFor": "Доверенный X-Forwarded-For",
"addressPortStrategy": "Стратегия адрес+порт",
"tryDelayMs": "Задержка попытки (мс)",
"prioritizeIPv6": "Приоритет IPv6",
"interleave": "Interleave",
"maxConcurrentTry": "Макс. одновременных попыток",
"customSockopt": "Пользовательский sockopt",
"addCustomOption": "Добавить опцию",
"serverNameIndication": "SNI",
"cipherSuites": "Cipher Suites",
"autoOption": "Авто",
"minMaxVersion": "Мин/Макс версия",
"rejectUnknownSni": "Отклонить неизвестный SNI",
"disableSystemRoot": "Отключить System Root",
"sessionResumption": "Возобновление сессии",
"oneTimeLoading": "Однократная загрузка",
"usageOption": "Опция использования",
"buildChain": "Build Chain",
"echKey": "ECH key",
"echConfig": "ECH config",
"getNewEchCert": "Получить новый ECH-сертификат",
"show": "Показать",
"xver": "Xver",
"target": "Цель",
"maxTimeDiff": "Макс. разница во времени (мс)",
"minClientVer": "Мин. версия клиента",
"maxClientVer": "Макс. версия клиента",
"shortIds": "Short IDs",
"spiderX": "SpiderX",
"getNewCert": "Получить новый сертификат",
"mldsa65Seed": "mldsa65 Seed",
"mldsa65Verify": "mldsa65 Verify",
"getNewSeed": "Получить новый Seed"
},
"info": {
"mode": "Режим",
"grpcServiceName": "grpc serviceName",
"grpcMultiMode": "grpc multiMode",
"interfaceName": "Имя интерфейса",
"mtu": "MTU",
"gateway": "Gateway",
"dns": "DNS",
"outboundsInterface": "Интерфейс исходящих",
"autoSystemRoutes": "Авто-маршруты системы",
"followRedirect": "FollowRedirect",
"auth": "Auth",
"noKernelTun": "TUN без kernel",
"keepAlive": "Keep alive",
"peerNumber": "Peer {n}",
"peerNumberConfig": "Конфиг Peer {n}"
},
"stream": {
"general": {
"request": "Запрос",
@@ -456,6 +615,20 @@
"days": "Дни",
"renew": "Автопродление",
"renewDesc": "Автоматическое продление после окончания. (0 = отключено) (единица: день)",
"searchPlaceholder": "Поиск email, комментария, sub ID, UUID, пароля, auth…",
"filterTitle": "Фильтр клиентов",
"clearAllFilters": "Очистить все",
"sortOldest": "Сначала старые",
"sortNewest": "Сначала новые",
"sortRecentlyUpdated": "Недавно обновлены",
"sortRecentlyOnline": "Недавно в сети",
"sortEmailAZ": "Email А→Я",
"sortEmailZA": "Email Я→А",
"sortMostTraffic": "Больше трафика",
"sortHighestRemaining": "Больше остатка",
"sortExpiringSoonest": "Скорее истекают",
"has": "Есть",
"hasNot": "Нет",
"title": "Клиенты",
"actions": "Действия",
"totalGB": "Всего отправлено/получено (ГБ)",
@@ -466,6 +639,9 @@
"subId": "ID подписки",
"online": "В сети",
"email": "Email",
"group": "Группа",
"groupDesc": "Логическая метка для группировки связанных клиентов (например, команда, клиент, регион). Фильтруется из панели инструментов.",
"groupPlaceholder": "например, customer-a",
"comment": "Комментарий",
"traffic": "Трафик",
"offline": "Не в сети",
@@ -485,15 +661,49 @@
"noLinks": "Нет ссылок для общего доступа — сначала привяжите клиента к входящему с поддерживаемым протоколом.",
"link": "Ссылка",
"resetNotPossible": "Сначала привяжите этого клиента к входящему.",
"general": "Общее",
"general": "Общие",
"resetAllTraffics": "Сбросить трафик всех клиентов",
"resetAllTrafficsTitle": "Сбросить трафик всех клиентов?",
"resetAllTrafficsContent": "Счётчики отправки/приёма всех клиентов сбрасываются в ноль. Квоты и срок действия не затрагиваются. Это действие нельзя отменить.",
"empty": "Клиентов пока нет — добавьте первого, чтобы начать.",
"deleteConfirmTitle": "Удалить клиента {email}?",
"deleteConfirmContent": "Клиент будет удалён из всех привязанных входящих, а его запись трафика будет уничтожена. Это действие нельзя отменить.",
"deleteSelected": "Удалить ({count})",
"adjustSelected": "Изменить ({count})",
"subLinksSelected": "Sub-ссылки ({count})",
"addToGroupTitle": "Добавить {count} клиент(ов) в группу",
"addToGroupTooltip": "Выберите существующую группу или введите новое имя. Используйте Ungroup, чтобы удалить клиентов из их текущей группы.",
"addToGroupPlaceholder": "Имя группы",
"addToGroupSuccessToast": "{count} клиент(ов) добавлено в {group}",
"ungroupSuccessToast": "Группа очищена у {count} клиент(ов)",
"ungroup": "Разгруппировать",
"ungroupConfirmTitle": "Удалить {count} клиент(ов) из их группы?",
"ungroupConfirmContent": "Очищает метку группы у каждого выбранного клиента. Сами клиенты сохраняются (используйте Delete для полного удаления).",
"addToGroup": "Добавить в группу",
"attach": "Привязать",
"adjust": "Корректировка",
"subLinks": "Sub-ссылки",
"selectedCount": "{count} выбрано",
"attachSelected": "Привязать ({count})",
"attachToInboundsTitle": "Привязать {count} клиент(ов) к входящим",
"attachToInboundsDesc": "Привязывает выбранных {count} клиент(ов) (тот же UUID/пароль и общий трафик) к выбранным входящим. Существующие привязки сохраняются.",
"attachToInboundsTargets": "Целевые входящие",
"attachToInboundsNoTargets": "Нет доступных многопользовательских входящих для привязки.",
"detachSelected": "Отвязать ({count})",
"detach": "Отвязать",
"detachFromInboundsTitle": "Отвязать {count} клиент(ов) от входящих",
"detachFromInboundsDesc": "Удаляет выбранных {count} клиент(ов) из выбранных входящих. Пары, где клиент не был привязан, тихо пропускаются. Записи клиентов сохраняются (используйте Delete для полного удаления).",
"detachFromInboundsTargets": "Входящие для отвязки",
"detachFromInboundsNoTargets": "Нет доступных многопользовательских входящих.",
"detachFromInboundsResult": "Отвязано {detached}, пропущено {skipped}.",
"detachFromInboundsResultMixed": "Отвязано {detached}, пропущено {skipped}, ошибок {errors}.",
"subLinksTitle": "Sub-ссылки ({count})",
"subLinkColumn": "URL подписки",
"subJsonLinkColumn": "URL JSON-подписки",
"subLinksCopyAll": "Копировать все",
"subLinksCopiedAll": "Скопировано {count} ссылок",
"subLinksEmpty": "Ни у одного из выбранных клиентов нет ID подписки.",
"subLinksDisabled": "Сервис подписки отключён.",
"subLinksDisabledHint": "Включите подписку в Настройки панели → Подписка для генерации ссылок.",
"bulkDeleteConfirmTitle": "Удалить {count} клиентов?",
"bulkDeleteConfirmContent": "Каждый выбранный клиент удаляется из всех привязанных входящих, его запись трафика уничтожается. Это действие нельзя отменить.",
"bulkAdjustTitle": "Изменить {count} клиентов",
@@ -504,11 +714,12 @@
"delDepleted": "Удалить исчерпанных",
"delDepletedConfirmTitle": "Удалить исчерпанных клиентов?",
"delDepletedConfirmContent": "Удаляются все клиенты, у которых исчерпана квота трафика или истёк срок. Это действие нельзя отменить.",
"auth": "Auth",
"hysteriaAuth": "Auth для Hysteria",
"auth": "Авторизация",
"hysteriaAuth": "Hysteria Auth",
"uuid": "UUID",
"flow": "Flow",
"reverseTag": "Reverse tag",
"vmessSecurity": "VMess Security",
"reverseTag": "Обратный тег",
"reverseTagPlaceholder": "Необязательный Reverse tag",
"telegramId": "ID пользователя Telegram",
"telegramIdPlaceholder": "Числовой ID пользователя Telegram (0 = нет)",
@@ -528,13 +739,51 @@
"delDepleted": "Удалено исчерпанных клиентов: {count}"
}
},
"groups": {
"title": "Группы",
"name": "Имя",
"clientCount": "Клиентов в группе",
"totalGroups": "Всего групп",
"totalGroupedClients": "Клиенты с группой",
"emptyGroups": "Пустые группы",
"addGroup": "Добавить группу",
"createSuccess": "Группа «{name}» создана.",
"rename": "Переименовать",
"renameTitle": "Переименовать {name}",
"renameCollision": "Группа с именем «{name}» уже существует.",
"renameSuccess": "Группа переименована для {count} клиент(ов).",
"deleteConfirmTitle": "Удалить группу {name}?",
"deleteConfirmContent": "Это удаляет группу и очищает её метку у {count} клиент(ов). Сами клиенты не удаляются.",
"deleteSuccess": "Группа очищена у {count} клиент(ов).",
"resetTraffic": "Сбросить трафик",
"resetConfirmTitle": "Сбросить трафик группы {name}?",
"resetConfirmContent": "Это обнулит up/down для всех {count} клиент(ов) в этой группе.",
"resetSuccess": "Сброшен трафик у {count} клиент(ов).",
"adjustSuccess": "Скорректировано {count} клиент(ов) в {name}.",
"emptyForAction": "В этой группе пока нет клиентов.",
"deleteGroupOnly": "Удалить группу (сохранить клиентов)",
"deleteClients": "Удалить клиентов группы",
"deleteClientsConfirmTitle": "Удалить всех клиентов в {name}?",
"deleteClientsConfirmContent": "Это безвозвратно удаляет {count} клиент(ов) вместе с их записями трафика. Метка группы также очищается. Это нельзя отменить.",
"deleteClientsSuccess": "Удалено {count} клиент(ов).",
"deleteClientsMixed": "{ok} удалено, {failed} пропущено",
"addToGroup": "Добавить клиентов…",
"addToGroupTitle": "Добавить клиентов в группу «{name}»",
"addToGroupDesc": "Выберите клиентов для добавления в эту группу. Существующие привязки к входящим сохраняются; меняется только метка группы. Клиенты, уже входящие в эту группу, не показываются.",
"addToGroupEmpty": "Нет других клиентов для добавления.",
"addToGroupResult": "Добавлено {count} клиент(ов) в {name}.",
"removeFromGroup": "Удалить клиентов…",
"removeFromGroupTitle": "Удалить клиентов из группы «{name}»",
"removeFromGroupDesc": "Выберите участников для удаления из этой группы. Сами клиенты сохраняются (используйте «Удалить клиентов группы» для полного удаления).",
"removeFromGroupResult": "Удалено {count} клиент(ов) из {name}."
},
"nodes": {
"title": "Узлы",
"addNode": "Добавить узел",
"editNode": "Редактировать узел",
"editNode": "Изменить узел",
"totalNodes": "Всего узлов",
"onlineNodes": "Онлайн",
"offlineNodes": "Офлайн",
"onlineNodes": "В сети",
"offlineNodes": "Не в сети",
"avgLatency": "Средняя задержка",
"name": "Имя",
"namePlaceholder": "напр. de-frankfurt-1",
@@ -544,7 +793,7 @@
"address": "Адрес",
"port": "Порт",
"basePath": "Базовый путь",
"apiToken": "Токен API",
"apiToken": "API Токен",
"apiTokenPlaceholder": "Токен со страницы Настроек удалённой панели",
"apiTokenHint": "Удалённая панель показывает свой токен API в разделе Настройки → Токен API.",
"regenerate": "Сгенерировать токен заново",
@@ -555,7 +804,7 @@
"status": "Статус",
"cpu": "CPU",
"mem": "Память",
"uptime": "Время работы",
"uptime": "Аптайм",
"latency": "Задержка",
"lastHeartbeat": "Последний пинг",
"xrayVersion": "Версия Xray",
@@ -570,8 +819,8 @@
"deleteConfirmTitle": "Удалить узел \"{name}\"?",
"deleteConfirmContent": "Это остановит мониторинг узла. Сама удалённая панель не будет затронута.",
"statusValues": {
"online": "Онлайн",
"offline": "Офлайн",
"online": "В сети",
"offline": "Не в сети",
"unknown": "Неизвестно"
},
"toasts": {
@@ -590,7 +839,7 @@
"title": "Настройки",
"save": "Сохранить",
"infoDesc": "Сохраните изменения и перезапустите панель для их применения.",
"restartPanel": "Перезапуск панели",
"restartPanel": "Перезапустить панель",
"restartPanelDesc": "Вы уверены, что хотите перезапустить панель? Подтвердите, и перезапуск произойдёт через 3 секунды. Если панель будет недоступна, проверьте лог сервера",
"restartPanelSuccess": "Панель успешно перезапущена",
"actions": "Действия",
@@ -604,7 +853,7 @@
"warnDefaultBasePath": "Базовый путь по умолчанию \"/\" широко известен — измените его на случайный.",
"warnDefaultSubPath": "Путь подписки по умолчанию \"/sub/\" широко известен — измените его.",
"warnDefaultJsonPath": "JSON-путь подписки по умолчанию \"/json/\" широко известен — измените его.",
"TGBotSettings": "Telegram-Бот",
"TGBotSettings": "Telegram-бот",
"panelListeningIP": "IP-адрес для управления панелью",
"panelListeningIPDesc": "Оставьте пустым для подключения с любого IP",
"panelListeningDomain": "Домен панели",
@@ -615,10 +864,12 @@
"publicKeyPathDesc": "Введите полный путь, начинающийся с '/'",
"privateKeyPath": "Путь к файлу приватного ключа сертификата панели",
"privateKeyPathDesc": "Введите полный путь, начинающийся с '/'",
"panelUrlPath": "Корневой путь URL адреса панели",
"panelUrlPath": "URI-путь",
"panelUrlPathDesc": "Должен начинаться с '/' и заканчиваться '/'",
"pageSize": "Размер нумерации страниц",
"pageSizeDesc": "Определить размер страницы для таблицы подключений. Установите 0, чтобы отключить",
"panelProxy": "Сетевой прокси панели",
"panelProxyDesc": "Маршрутизирует исходящие запросы самой панели (обновления geo, проверки версий Xray/панели, Telegram) через этот прокси для обхода серверной фильтрации GitHub/Telegram. Принимает socks5:// или http(s)://, напр. локальный SOCKS-входящий Xray. Оставьте пустым для прямого подключения.",
"remarkModel": "Модель примечания и символ разделения",
"datepicker": "Тип календаря",
"datepickerPlaceholder": "Выберите дату",
@@ -630,11 +881,11 @@
"newPassword": "Новый пароль",
"telegramBotEnable": "Включить Telegram бота",
"telegramBotEnableDesc": "Доступ к функциям панели через Telegram-бота",
"telegramToken": "Токен Telegram бота",
"telegramToken": "Telegram-токен",
"telegramTokenDesc": "Необходимо получить токен у менеджера ботов Telegram {'@'}botfather",
"telegramProxy": "Прокси-сервер Socks5",
"telegramProxy": "SOCKS-прокси",
"telegramProxyDesc": "Если для подключения к Telegram вам нужен прокси Socks5, настройте его параметры согласно руководству.",
"telegramAPIServer": "API-сервер Telegram",
"telegramAPIServer": "Telegram API Server",
"telegramAPIServerDesc": "Используемый API-сервер Telegram. Оставьте пустым, чтобы использовать сервер по умолчанию.",
"telegramChatId": "User ID администратора бота",
"telegramChatIdDesc": "Один или несколько User ID администратора(-ов) Telegram-бота. Для получения User ID используйте {'@'}userinfobot или команду '/id' в боте.",
@@ -658,6 +909,8 @@
"subEnable": "Включить подписку",
"subEnableDesc": "Функция подписки с отдельной конфигурацией",
"subJsonEnable": "Включить/отключить JSON-эндпоинт подписки независимо.",
"subJsonEnableTitle": "JSON-подписка",
"subClashEnableTitle": "Подписка Clash / Mihomo",
"subTitle": "Заголовок подписки",
"subTitleDesc": "Название подписки, которое видит клиент в VPN-клиенте",
"subSupportUrl": "URL поддержки",
@@ -678,13 +931,13 @@
"subCertPathDesc": "Введите полный путь, начинающийся с '/'",
"subKeyPath": "Путь к файлу приватного ключа сертификата подписки",
"subKeyPathDesc": "Введите полный путь, начинающийся с '/'",
"subPath": "Корневой путь URL-адреса подписки",
"subPath": "URI-путь",
"subPathDesc": "Должен начинаться с '/' и заканчиваться на '/'",
"subDomain": "Домен прослушивания",
"subDomainDesc": "Оставьте пустым по умолчанию, чтобы слушать все домены и IP-адреса",
"subUpdates": "Интервалы обновления подписки",
"subUpdatesDesc": "Интервал между обновлениями в клиентском приложении (в часах)",
"subEncrypt": "Шифровать конфиги",
"subEncrypt": "Кодировать",
"subEncryptDesc": "Шифровать возвращенные конфиги в подписке",
"subShowInfo": "Показать информацию об использовании",
"subShowInfoDesc": "Отображать остаток трафика и дату окончания после имени конфигурации",
@@ -693,7 +946,7 @@
"subURI": "URI обратного прокси",
"subURIDesc": "Изменить базовый URI URL-адреса подписки для использования за прокси-серверами",
"externalTrafficInformEnable": "Информация о внешнем трафике",
"externalTrafficInformEnableDesc": "Информировать внешний API о каждом обновлении трафика",
"externalTrafficInformEnableDesc": "Уведомлять внешний API при каждом обновлении трафика.",
"externalTrafficInformURI": "URI информации о внешнем трафике",
"externalTrafficInformURIDesc": "Обновления трафика отправляются на этот URI",
"restartXrayOnClientDisable": "Перезапускать Xray после автоотключения",
@@ -703,6 +956,54 @@
"fragmentSett": "Настройки фрагментации",
"noisesDesc": "Включить Noises.",
"noisesSett": "Настройки Noises",
"trustedProxyCidrs": "Доверенные CIDR прокси",
"trustedProxyCidrsDesc": "IP/CIDR через запятую, которым разрешено устанавливать заголовки forwarded host, proto и client IP.",
"ldap": {
"enable": "Включить LDAP-синхронизацию",
"host": "LDAP-хост",
"port": "Порт LDAP",
"useTls": "Использовать TLS (LDAPS)",
"bindDn": "Bind DN",
"passwordConfigured": "Настроено; оставьте пустым, чтобы сохранить текущий пароль.",
"passwordUnconfigured": "Не настроено.",
"passwordPlaceholder": "Настроено — введите новое значение для замены",
"baseDn": "Base DN",
"userFilter": "Фильтр пользователя",
"userAttr": "Атрибут пользователя (username/email)",
"vlessField": "Атрибут VLESS-флага",
"flagField": "Общий атрибут флага (опц.)",
"flagFieldDesc": "Если задано, переопределяет флаг VLESS — напр. shadowInactive.",
"truthyValues": "Truthy-значения",
"truthyValuesDesc": "Через запятую; по умолчанию: true,1,yes,on",
"invertFlag": "Инвертировать флаг",
"invertFlagDesc": "Включите, когда атрибут означает «отключено» (напр. shadowInactive).",
"syncSchedule": "Расписание синхронизации",
"syncScheduleDesc": "Строка типа cron, напр. @every 1m",
"inboundTags": "Теги входящих",
"inboundTagsDesc": "Входящие, на которых LDAP-синхронизация может авто-создавать или авто-удалять клиентов.",
"noInbounds": "Входящие не найдены. Сначала создайте входящий.",
"autoCreate": "Авто-создание клиентов",
"autoDelete": "Авто-удаление клиентов",
"defaultTotalGb": "Объём по умолчанию (ГБ)",
"defaultExpiryDays": "Срок по умолчанию (дни)",
"defaultIpLimit": "Лимит IP по умолчанию"
},
"subFormats": {
"packets": "Пакеты",
"length": "Длина",
"interval": "Интервал",
"maxSplit": "Макс. разбиение",
"noises": "Шумы",
"noiseItem": "Шум №{n}",
"type": "Тип",
"packet": "Пакет",
"delayMs": "Задержка (мс)",
"applyTo": "Применить к",
"addNoise": "+ Шум",
"concurrency": "Параллелизм",
"xudpConcurrency": "Параллелизм xudp",
"xudpUdp443": "xudp UDP 443"
},
"mux": "Mux",
"muxDesc": "Передача нескольких независимых потоков данных в одном соединении.",
"muxSett": "Настройки Mux",
@@ -758,6 +1059,9 @@
"save": "Сохранить",
"restart": "Перезапуск Xray",
"restartSuccess": "Xray успешно перезапущен",
"restartOutputTitle": "Вывод перезапуска Xray",
"restartConfirmTitle": "Перезапустить xray?",
"restartConfirmContent": "Перезагружает сервис xray с сохранённой конфигурацией.",
"stopSuccess": "Xray успешно остановлен",
"restartError": "Произошла ошибка при перезапуске Xray.",
"stopError": "Произошла ошибка при остановке Xray.",
@@ -765,7 +1069,7 @@
"advancedTemplate": "Расширенный шаблон",
"generalConfigs": "Основные настройки",
"generalConfigsDesc": "Эти параметры описывают общие настройки",
"logConfigs": "Логи",
"logConfigs": "Лог",
"logConfigsDesc": "Логи могут замедлять работу сервера. Включайте только нужные вам виды логов при необходимости!",
"blockConfigsDesc": "Настройте, чтобы клиенты не имели доступа к определенным протоколам",
"basicRouting": "Базовые соединения",
@@ -790,10 +1094,12 @@
"outboundTestUrl": "URL для теста исходящего",
"outboundTestUrlDesc": "URL для проверки подключения исходящего",
"Torrent": "Заблокировать BitTorrent",
"Inbounds": "Входящие подключения",
"Inbounds": "Входящие",
"InboundsDesc": "Изменение шаблона конфигурации для подключения определенных клиентов",
"Outbounds": "Исходящие подключения",
"Outbounds": "Исходящие",
"Balancers": "Балансировщик",
"balancerTagRequired": "Тег обязателен",
"balancerSelectorRequired": "Выберите хотя бы одно исходящее",
"OutboundsDesc": "Изменение шаблона конфигурации, чтобы определить исходящие подключения для этого сервера",
"Routings": "Маршрутизация",
"RoutingsDesc": "Важен приоритет каждого правила!",
@@ -827,11 +1133,78 @@
"inbound": "Входящее подключение",
"outbound": "Исходящее подключение",
"balancer": "Балансировщик",
"info": "Информация",
"info": "Инфо",
"add": "Создать правило",
"edit": "Редактировать правило",
"useComma": "Элементы, разделённые запятыми"
},
"routing": {
"dragToReorder": "Перетащите для изменения порядка"
},
"ruleForm": {
"sourceIps": "IP источника",
"sourcePort": "Порт источника",
"vlessRoute": "VLESS route",
"attributes": "Атрибуты",
"value": "Значение",
"user": "Пользователь",
"inboundTags": "Теги входящих",
"outboundTag": "Тег исходящего",
"balancerTag": "Тег балансировщика",
"balancerTagTooltip": "Направляет трафик через один из настроенных балансировщиков нагрузки"
},
"outboundForm": {
"tagDuplicate": "Тег уже используется другим исходящим",
"tagRequired": "Тег обязателен",
"tagPlaceholder": "уникальный-тег",
"localIpPlaceholder": "локальный IP",
"addressRequired": "Адрес обязателен",
"portRequired": "Порт обязателен",
"optional": "опционально",
"udpOverTcp": "UDP over TCP",
"uotVersion": "Версия UoT",
"inboundTag": "Тег входящего",
"inboundTagPlaceholder": "тег входящего в правилах маршрутизации",
"responseType": "Тип ответа",
"rewriteNetwork": "Переписать сеть",
"unchanged": "(без изменений)",
"unchangedAddress": "(без изменений) напр. 1.1.1.1",
"rules": "Правила",
"ruleN": "Правило {n}",
"action": "Действие",
"redirect": "Redirect",
"fragment": "Fragment",
"finalRules": "Финальные правила",
"overrideXrayPrivateIp": "Переопределить дефолтный блок частных IP в Xray",
"blockDelay": "Задержка блока (мс)",
"reverseSniffing": "Обратный sniffing",
"workers": "Воркеры",
"reserved": "Зарезервировано",
"minUploadInterval": "Мин. интервал загрузки (мс)",
"maxUploadSizeBytes": "Макс. размер загрузки (байт)",
"uplinkChunkSize": "Размер chunk Uplink",
"noGrpcHeader": "Без gRPC-заголовка",
"maxConcurrency": "Макс. параллелизм",
"maxConnections": "Макс. соединений",
"maxReuseTimes": "Макс. повторных использований",
"maxRequestTimes": "Макс. запросов",
"maxReusableSecs": "Макс. секунд повторного использования",
"keepAlivePeriod": "Период keep alive",
"authPassword": "Пароль авторизации",
"visionTestpre": "Vision testpre",
"serverNamePlaceholder": "имя сервера",
"verifyPeerName": "Проверять имя peer",
"pinnedSha256": "Pinned SHA256",
"shortId": "Short ID",
"sockopts": "Sockopts",
"keepAliveInterval": "Интервал keep alive",
"markFwmark": "Mark (fwmark)",
"interface": "Интерфейс",
"ipv6Only": "Только IPv6",
"acceptProxyProtocol": "Принимать proxy protocol",
"tcpUserTimeoutMs": "TCP user timeout (мс)",
"tcpKeepAliveIdleS": "TCP keep-alive idle (с)"
},
"outbound": {
"addOutbound": "Создать исходящее подключение",
"addReverse": "Создать реверс-прокси",
@@ -846,8 +1219,8 @@
"reverse": "Реверс-прокси",
"domain": "Домен",
"type": "Тип",
"bridge": "Мост",
"portal": "Портал",
"bridge": "Bridge",
"portal": "Portal",
"link": "Ссылка",
"intercon": "Соединение",
"settings": "Настройки",
@@ -860,6 +1233,8 @@
"testSuccess": "Тест успешен",
"testFailed": "Тест не пройден",
"testError": "Не удалось протестировать исходящее подключение",
"testModeTooltip": "TCP: быстрый dial-only probe. HTTP: полный запрос через xray.",
"testAll": "Тестировать все",
"nordvpn": "NordVPN",
"accessToken": "Токен доступа",
"country": "Страна",
@@ -876,6 +1251,16 @@
"balancerSelectors": "Селекторы",
"tag": "Тег",
"tagDesc": "Уникальный тег",
"tagDuplicate": "Тег уже используется другим балансировщиком",
"tagPlaceholder": "уникальный тег балансировщика",
"selector": "Селектор",
"fallback": "Fallback",
"expected": "Ожидаемое",
"expectedPlaceholder": "оптимальное число узлов",
"maxRtt": "Макс. RTT",
"tolerance": "Допуск",
"baselines": "Baselines",
"costs": "Costs",
"balancerDesc": "Невозможно одновременно использовать balancerTag и outboundTag. При одновременном использовании будет работать только outboundTag."
},
"wireguard": {
@@ -892,6 +1277,38 @@
"userLevel": "Уровень пользователя",
"userLevelDesc": "Все соединения, установленные через этот входящий поток, будут использовать этот уровень пользователя. Значение по умолчанию - 0"
},
"nord": {
"accessToken": "Access token",
"privateKey": "Приватный ключ",
"noServers": "Серверов для выбранной страны не найдено",
"noPublicKey": "Выбранный сервер не сообщает публичный ключ NordLynx.",
"outboundAdded": "Исходящий NordVPN добавлен",
"outboundUpdated": "Исходящий NordVPN обновлён"
},
"warp": {
"licenseError": "Не удалось установить лицензию WARP.",
"fetchFirst": "Сначала получите WARP-конфиг.",
"createAccount": "Создать аккаунт WARP",
"accessToken": "Access token",
"deviceId": "ID устройства",
"licenseKey": "Лицензионный ключ",
"privateKey": "Приватный ключ",
"deleteAccount": "Удалить аккаунт",
"settings": "Настройки",
"licenseKeyLabel": "Лицензионный ключ WARP / WARP+",
"key": "Ключ",
"keyPlaceholder": "26-символьный ключ WARP+",
"accountInfo": "Информация об аккаунте",
"deviceName": "Имя устройства",
"deviceModel": "Модель устройства",
"deviceEnabled": "Устройство включено",
"accountType": "Тип аккаунта",
"role": "Роль",
"warpPlusData": "WARP+ data",
"quota": "Квота",
"usage": "Использование",
"addOutbound": "Добавить исходящий"
},
"dns": {
"enable": "Включить DNS",
"enableDesc": "Включить встроенный DNS-сервер",
@@ -959,10 +1376,10 @@
"hours": "Часов",
"minutes": "Минуты",
"unknown": "Неизвестно",
"inbounds": "Входящие подключения",
"inbounds": "Входящие",
"clients": "Клиенты",
"offline": "🔴 Офлайн",
"online": "🟢 Онлайн",
"offline": "🔴 Не в сети",
"online": "🟢 В сети",
"commands": {
"unknown": "❗ Неизвестная команда",
"pleaseChoose": "👇 Пожалуйста, выберите:\r\n",
@@ -992,24 +1409,24 @@
"2faFailed": "Ошибка 2FA",
"report": "🕰 Запланированные отчеты: {{ .RunTime }}\r\n",
"datetime": "⏰ Дата и время: {{ .DateTime }}\r\n",
"hostname": "💻 Имя хоста: {{ .Hostname }}\r\n",
"hostname": "💻 Хост: {{ .Hostname }}\r\n",
"version": "🚀 Версия X-UI: {{ .Version }}\r\n",
"xrayVersion": "📡 Версия Xray: {{ .XrayVersion }}\r\n",
"ipv6": "🌐 IPv6: {{ .IPv6 }}\r\n",
"ipv4": "🌐 IPv4: {{ .IPv4 }}\r\n",
"ip": "🌐 IP: {{ .IP }}\r\n",
"ips": "🔢 IP-адреса:\r\n{{ .IPs }}\r\n",
"ips": "🔢 IP:\r\n{{ .IPs }}\r\n",
"serverUpTime": "⏳ Время работы сервера: {{ .UpTime }} {{ .Unit }}\r\n",
"serverLoad": "📈 Нагрузка сервера: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n",
"serverMemory": "📋 ОЗУ сервера: {{ .Current }}/{{ .Total }}\r\n",
"tcpCount": "🔹 Количество TCP-соединений: {{ .Count }}\r\n",
"udpCount": "🔸 Количество UDP-соединений: {{ .Count }}\r\n",
"serverMemory": "📋 RAM: {{ .Current }}/{{ .Total }}\r\n",
"tcpCount": "🔹 TCP: {{ .Count }}\r\n",
"udpCount": "🔸 UDP: {{ .Count }}\r\n",
"traffic": "🚦 Трафик: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n",
"xrayStatus": " Состояние Xray: {{ .State }}\r\n",
"xrayStatus": " Статус: {{ .State }}\r\n",
"username": "👤 Имя пользователя: {{ .Username }}\r\n",
"reason": "❗️ Причина: {{ .Reason }}\r\n",
"time": "⏰ Время: {{ .Time }}\r\n",
"inbound": "📍 Входящее подключение: {{ .Remark }}\r\n",
"inbound": "📍 Входящий: {{ .Remark }}\r\n",
"port": "🔌 Порт: {{ .Port }}\r\n",
"expire": "📅 Дата окончания: {{ .Time }}\r\n",
"expireIn": "📅 Окончание через: {{ .Time }}\r\n",
@@ -1018,9 +1435,9 @@
"online": "🌐 Статус соединения: {{ .Status }}\r\n",
"lastOnline": "🔙 Был(а) в сети: {{ .Time }}\r\n",
"email": "📧 Email: {{ .Email }}\r\n",
"upload": "🔼 Исходящий трафик: ↑{{ .Upload }}\r\n",
"download": "🔽 Входящий трафик: ↓{{ .Download }}\r\n",
"total": "📊 Всего: ↑↓{{ .UpDown }} из {{ .Total }}\r\n",
"upload": "🔼 Загрузка: ↑{{ .Upload }}\r\n",
"download": "🔽 Загрузка: ↓{{ .Download }}\r\n",
"total": "📊 Всего: ↑↓{{ .UpDown }} / {{ .Total }}\r\n",
"TGUser": "👤 Telegram User ID: {{ .TelegramID }}\r\n",
"exhaustedMsg": "🚨 Исчерпаны {{ .Type }}:\r\n",
"exhaustedCount": "🚨 Количество исчерпанных {{ .Type }}:\r\n",
@@ -1077,7 +1494,7 @@
"ipLimit": "🔢 Лимит IP",
"setTGUser": "👤 Установить пользователя Telegram",
"toggle": "🔘 Вкл./Выкл.",
"custom": "🔢 Свой",
"custom": "🔢 Своё",
"confirmNumber": "✅ Подтвердить: {{ .Num }}",
"confirmNumberAdd": "✅ Подтвердить добавление: {{ .Num }}",
"limitTraffic": "🚧 Лимит трафика",
@@ -1091,7 +1508,7 @@
"change_password": "⚙️🔑 Пароль",
"change_email": "⚙️📧 Email",
"change_comment": "⚙️💬 Комментарий",
"change_flow": "⚙️🚦 Поток",
"change_flow": "⚙️🚦 Flow",
"ResetAllTraffics": "Сбросить весь трафик",
"SortedTrafficUsageReport": "Отсортированный отчет об использовании трафика"
},
@@ -1119,4 +1536,4 @@
"chooseInbound": "Выберите входящее подключение"
}
}
}
}