mirror of
https://github.com/Flowseal/tg-ws-proxy.git
synced 2026-06-26 16:31:08 +03:00
feature: i18n (#1025)
This commit is contained in:
@@ -8,6 +8,8 @@ import sys
|
||||
import os
|
||||
from typing import Any, Dict
|
||||
|
||||
from ui.i18n import detect_system_language
|
||||
|
||||
_TRAY_DEFAULTS_COMMON: Dict[str, Any] = {
|
||||
"port": 1443,
|
||||
"host": "127.0.0.1",
|
||||
@@ -20,13 +22,14 @@ _TRAY_DEFAULTS_COMMON: Dict[str, Any] = {
|
||||
"cfproxy": True,
|
||||
"cfproxy_user_domain": [],
|
||||
"cfproxy_worker_domain": [],
|
||||
"ws_keepalive_interval": 30
|
||||
"ws_keepalive_interval": 30,
|
||||
}
|
||||
|
||||
|
||||
def default_tray_config() -> Dict[str, Any]:
|
||||
cfg = dict(_TRAY_DEFAULTS_COMMON)
|
||||
cfg["secret"] = os.urandom(16).hex()
|
||||
cfg["language"] = detect_system_language().value
|
||||
|
||||
if sys.platform == "win32":
|
||||
cfg["autostart"] = False
|
||||
|
||||
+5
-26
@@ -5,29 +5,6 @@ import webbrowser
|
||||
|
||||
from typing import Optional, Tuple, Callable
|
||||
|
||||
|
||||
MSG_PORT_BUSY = (
|
||||
"Не удалось запустить прокси:\n"
|
||||
"Порт уже используется другим приложением.\n\n"
|
||||
"Закройте приложение, использующее этот порт, "
|
||||
"или измените порт в настройках прокси и перезапустите."
|
||||
)
|
||||
|
||||
MSG_PERMISSION = (
|
||||
"Не удалось запустить прокси:\n"
|
||||
"Доступ к адресу/порту запрещён "
|
||||
"(брандмауэр, антивирус или права доступа).\n\n"
|
||||
"Измените порт на случайный в диапазоне 10000–50000 в настройках, "
|
||||
"проверьте брандмауэр/антивирус и перезапустите."
|
||||
)
|
||||
|
||||
MSG_BAD_ADDRESS = (
|
||||
"Не удалось запустить прокси:\n"
|
||||
"Некорректный или недоступный адрес для прослушивания.\n\n"
|
||||
"Проверьте решение по открывшейся в браузере ссылке.\n"
|
||||
"Проверьте host и порт в настройках прокси и перезапустите."
|
||||
)
|
||||
|
||||
# Windows WinSock error codes (exc.winerror); errno may differ from POSIX.
|
||||
_WSA_EACCES = 10013
|
||||
_WSA_EFAULT = 10014
|
||||
@@ -41,6 +18,8 @@ def diagnose_listen_error(exc: BaseException) -> Tuple[Optional[str], Optional[C
|
||||
Returns None when the exception is not a recognizable bind failure,
|
||||
so callers can fall back to generic handling.
|
||||
"""
|
||||
from ui.i18n import t
|
||||
|
||||
if not isinstance(exc, OSError):
|
||||
return None
|
||||
|
||||
@@ -48,10 +27,10 @@ def diagnose_listen_error(exc: BaseException) -> Tuple[Optional[str], Optional[C
|
||||
winerror = getattr(exc, "winerror", None)
|
||||
|
||||
if err == errno.EADDRINUSE or winerror == _WSA_EADDRINUSE:
|
||||
return MSG_PORT_BUSY, None
|
||||
return t("diagnostics.port_busy"), None
|
||||
if err == errno.EACCES or winerror == _WSA_EACCES:
|
||||
return MSG_PERMISSION, None
|
||||
return t("diagnostics.permission"), None
|
||||
if (winerror in (_WSA_EFAULT, _WSA_EADDRNOTAVAIL)
|
||||
or err in (errno.EADDRNOTAVAIL, errno.EFAULT)):
|
||||
return MSG_BAD_ADDRESS, lambda : webbrowser.open("https://github.com/Flowseal/tg-ws-proxy/issues/903#issuecomment-4726752103")
|
||||
return t("diagnostics.bad_address"), lambda : webbrowser.open("https://github.com/Flowseal/tg-ws-proxy/issues/903#issuecomment-4726752103")
|
||||
return None, None
|
||||
|
||||
+19
-18
@@ -180,6 +180,12 @@ def release_lock() -> None:
|
||||
|
||||
# config
|
||||
|
||||
def _apply_ui_language(cfg: dict) -> None:
|
||||
from ui.i18n import set_language
|
||||
|
||||
set_language(cfg.get("language", DEFAULT_CONFIG["language"]))
|
||||
|
||||
|
||||
def load_config() -> dict:
|
||||
ensure_dirs()
|
||||
if CONFIG_FILE.exists():
|
||||
@@ -188,10 +194,13 @@ def load_config() -> dict:
|
||||
data = json.load(f)
|
||||
for k, v in DEFAULT_CONFIG.items():
|
||||
data.setdefault(k, v)
|
||||
_apply_ui_language(data)
|
||||
return data
|
||||
except Exception as exc:
|
||||
log.warning("Failed to load config: %s", repr(exc))
|
||||
return dict(DEFAULT_CONFIG)
|
||||
cfg = dict(DEFAULT_CONFIG)
|
||||
_apply_ui_language(cfg)
|
||||
return cfg
|
||||
|
||||
|
||||
def save_config(cfg: dict) -> None:
|
||||
@@ -335,7 +344,8 @@ def start_proxy(cfg: dict, on_error: Callable[[str], None]) -> None:
|
||||
return
|
||||
|
||||
if not apply_proxy_config(cfg):
|
||||
on_error("Ошибка конфигурации DC → IP.")
|
||||
from ui.i18n import t
|
||||
on_error(t("error.dc_config"))
|
||||
return
|
||||
|
||||
pc = proxy_config
|
||||
@@ -372,19 +382,6 @@ def tg_proxy_url(cfg: dict) -> str:
|
||||
return f"tg://proxy?server={link_host}&port={port}&secret=dd{secret}"
|
||||
|
||||
|
||||
_IPV6_WARNING = (
|
||||
"На вашем компьютере включена поддержка подключения по IPv6.\n\n"
|
||||
"Telegram может пытаться подключаться через IPv6, "
|
||||
"что не поддерживается и может привести к ошибкам.\n\n"
|
||||
"Если прокси не работает или в логах присутствуют ошибки, "
|
||||
"связанные с попытками подключения по IPv6 - "
|
||||
"попробуйте отключить в настройках прокси Telegram попытку соединения "
|
||||
"по IPv6. Если данная мера не помогает, попробуйте отключить IPv6 "
|
||||
"в системе.\n\n"
|
||||
"Это предупреждение будет показано только один раз."
|
||||
)
|
||||
|
||||
|
||||
def _has_ipv6() -> bool:
|
||||
try:
|
||||
for addr in _socket.getaddrinfo(_socket.gethostname(), None, _socket.AF_INET6):
|
||||
@@ -407,8 +404,10 @@ def check_ipv6_warning(show_info: Callable[[str, str], None]) -> None:
|
||||
if IPV6_WARN_MARKER.exists() or not _has_ipv6():
|
||||
return
|
||||
IPV6_WARN_MARKER.touch()
|
||||
from ui.i18n import t
|
||||
|
||||
threading.Thread(
|
||||
target=lambda: show_info(_IPV6_WARNING, "TG WS Proxy"),
|
||||
target=lambda: show_info(t("ipv6.warning"), t("app.name")),
|
||||
daemon=True,
|
||||
).start()
|
||||
|
||||
@@ -437,9 +436,11 @@ def maybe_notify_update(
|
||||
return
|
||||
url = (st.get("html_url") or "").strip() or RELEASES_PAGE_URL
|
||||
ver = st.get("latest") or "?"
|
||||
from ui.i18n import t
|
||||
|
||||
if ask_open(
|
||||
f"Доступна новая версия: {ver}\n\nОткрыть страницу релиза в браузере?",
|
||||
"TG WS Proxy — обновление",
|
||||
t("update.ask_open", version=ver),
|
||||
t("app.update_title"),
|
||||
):
|
||||
webbrowser.open(url)
|
||||
except Exception as exc:
|
||||
|
||||
Reference in New Issue
Block a user