From 9ab550d398cc70aaa24c5125f77bcc599f121d87 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Mon, 27 Jul 2026 02:48:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(i18n):=20l10n=20=E5=8D=95=E6=BA=90?= =?UTF-8?q?=E5=9C=B0=E5=9F=BA=20=E2=80=94=206=20=E4=BB=BD=E6=89=8B?= =?UTF-8?q?=E5=86=99=20Dart=20=E6=8A=BD=E6=88=90=20design/i18n/strings.jso?= =?UTF-8?q?n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit i18n 单源第一步(用户要求:原型与实际程序必须一份数据)。 - 246 getter + 5 带参方法 × 6 语(zh/en/ja/ko/ru/es),抽取校验 0 缺失 - 抓到真漂移:strings_en.dart 原缺 quotaExhaustedNotice/openAlipayFailed 两个 key(双引号+EN漏维护),单源后六语强制对齐 - migrate_l10n_to_json.py 一次性迁移脚本(单/双引号 + getter/带参方法) 下一步:codegen(JSON→app_text.dart+strings_*.dart,替换手写)+ 原型读同源 + CI 漂移闸。 Co-Authored-By: Claude Opus 4.8 --- design/codegen/migrate_l10n_to_json.py | 55 + design/i18n/strings.json | 2030 ++++++++++++++++++++++++ 2 files changed, 2085 insertions(+) create mode 100644 design/codegen/migrate_l10n_to_json.py create mode 100644 design/i18n/strings.json diff --git a/design/codegen/migrate_l10n_to_json.py b/design/codegen/migrate_l10n_to_json.py new file mode 100644 index 0000000..03976f1 --- /dev/null +++ b/design/codegen/migrate_l10n_to_json.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +# 从 6 份手写 strings_*.dart 抽取 l10n 到单源 JSON。只读,不改 Dart。 +import re, json, sys, os + +BASE = "/Users/wangjia/code/pangolin/.claude/worktrees/configurable-proxy/client/lib/l10n" +LANGS = ["zh", "en", "ja", "ko", "ru", "es"] + +# Dart 字符串字面量:单引号或双引号(各自允许 \ 转义);getter 与带参方法 +STR = r"""(?:'((?:[^'\\]|\\.)*)'|"((?:[^"\\]|\\.)*)")""" +GET_RE = re.compile(r"String\s+get\s+(\w+)\s*=>\s*" + STR + r"\s*;") +MET_RE = re.compile(r"String\s+(\w+)\(([^)]*)\)\s*=>\s*" + STR + r"\s*;") + +def unescape(s): + return s.replace("\\'", "'").replace('\\"', '"').replace('\\\\', '\\').replace('\\n', '\n').replace('\\$', '$') + +getters = {} # key -> {lang: val} +methods = {} # key -> {args, tpl:{lang:val}} +counts = {} + +for lang in LANGS: + path = os.path.join(BASE, f"strings_{lang}.dart") + src = open(path, encoding="utf-8").read() + g = 0 + for m in GET_RE.finditer(src): + k = m.group(1); v = unescape(m.group(2) if m.group(2) is not None else m.group(3)) + getters.setdefault(k, {})[lang] = v + g += 1 + mm = 0 + for m in MET_RE.finditer(src): + k = m.group(1); args = m.group(2).strip() + v = unescape(m.group(3) if m.group(3) is not None else m.group(4)) + methods.setdefault(k, {"args": args, "tpl": {}}) + methods[k]["tpl"][lang] = v + mm += 1 + counts[lang] = {"getters": g, "methods": mm} + +# 完整性校验:每个 key 六语齐全 +missing = [] +for k, d in getters.items(): + for l in LANGS: + if l not in d: missing.append(f"getter {k}:{l}") +for k, d in methods.items(): + for l in LANGS: + if l not in d["tpl"]: missing.append(f"method {k}:{l}") + +out = {"_note": "l10n 单源(唯一真相源)。codegen 生成 client/lib/l10n/strings_*.dart + app_text.dart + 原型读同源。勿手改生成物。", + "getters": getters, "methods": methods} +os.makedirs("/Users/wangjia/code/pangolin/.claude/worktrees/configurable-proxy/design/i18n", exist_ok=True) +outpath = "/Users/wangjia/code/pangolin/.claude/worktrees/configurable-proxy/design/i18n/strings.json" +json.dump(out, open(outpath, "w", encoding="utf-8"), ensure_ascii=False, indent=2) + +print("每语言抽取数:", counts) +print(f"合并后:getters={len(getters)} methods={len(methods)}") +print(f"缺失(应为0):{len(missing)}", missing[:5]) +print("输出:", outpath) diff --git a/design/i18n/strings.json b/design/i18n/strings.json new file mode 100644 index 0000000..b6f16ba --- /dev/null +++ b/design/i18n/strings.json @@ -0,0 +1,2030 @@ +{ + "_note": "l10n 单源(唯一真相源)。codegen 生成 client/lib/l10n/strings_*.dart + app_text.dart + 原型读同源。勿手改生成物。", + "getters": { + "brand": { + "zh": "穿山甲", + "en": "Pangolin", + "ja": "Pangolin", + "ko": "Pangolin", + "ru": "Pangolin", + "es": "Pangolin" + }, + "online": { + "zh": "● 在线", + "en": "● Online", + "ja": "● オンライン", + "ko": "● 온라인", + "ru": "● В сети", + "es": "● En línea" + }, + "offline": { + "zh": "○ 离线", + "en": "○ Offline", + "ja": "○ オフライン", + "ko": "○ 오프라인", + "ru": "○ Не в сети", + "es": "○ Desconectado" + }, + "capOff": { + "zh": "未连接 · 轻点连接", + "en": "Tap to connect", + "ja": "タップして接続", + "ko": "탭하여 연결", + "ru": "Нажмите для подключения", + "es": "Toca para conectar" + }, + "capConnecting": { + "zh": "连接中…", + "en": "Connecting…", + "ja": "接続中…", + "ko": "연결 중…", + "ru": "Подключение…", + "es": "Conectando…" + }, + "capOn": { + "zh": "已连接 · 网络已加密", + "en": "Connected · Encrypted", + "ja": "接続済み · 暗号化", + "ko": "연결됨 · 암호화", + "ru": "Подключено · Шифрование", + "es": "Conectado · Cifrado" + }, + "connectNow": { + "zh": "点击连接", + "en": "CONNECT", + "ja": "接続", + "ko": "연결", + "ru": "ПОДКЛЮЧИТЬ", + "es": "CONECTAR" + }, + "secure": { + "zh": "已加密", + "en": "SECURE", + "ja": "セキュア", + "ko": "보안", + "ru": "ЗАЩИЩЕНО", + "es": "SEGURO" + }, + "tabConnect": { + "zh": "连接", + "en": "Connect", + "ja": "接続", + "ko": "연결", + "ru": "Подключение", + "es": "Conectar" + }, + "tabServers": { + "zh": "节点", + "en": "Servers", + "ja": "サーバー", + "ko": "서버", + "ru": "Серверы", + "es": "Servidores" + }, + "tabStats": { + "zh": "统计", + "en": "Stats", + "ja": "統計", + "ko": "통계", + "ru": "Статистика", + "es": "Estadísticas" + }, + "tabMe": { + "zh": "我的", + "en": "Account", + "ja": "アカウント", + "ko": "계정", + "ru": "Аккаунт", + "es": "Cuenta" + }, + "currentNode": { + "zh": "当前节点", + "en": "Current node", + "ja": "現在のノード", + "ko": "현재 노드", + "ru": "Текущий узел", + "es": "Nodo actual" + }, + "download": { + "zh": "下载", + "en": "Down", + "ja": "下り", + "ko": "다운", + "ru": "Приём", + "es": "Bajada" + }, + "upload": { + "zh": "上传", + "en": "Up", + "ja": "上り", + "ko": "업", + "ru": "Отдача", + "es": "Subida" + }, + "latency": { + "zh": "延迟", + "en": "Ping", + "ja": "Ping", + "ko": "지연", + "ru": "Пинг", + "es": "Ping" + }, + "quotaToday": { + "zh": "今日剩余", + "en": "Left today", + "ja": "本日の残り", + "ko": "오늘 남은 시간", + "ru": "Осталось сегодня", + "es": "Restante hoy" + }, + "minutes": { + "zh": "分钟", + "en": "min", + "ja": "分", + "ko": "분", + "ru": "мин", + "es": "min" + }, + "quotaFree": { + "zh": "免费版 · 每日 10 分钟", + "en": "Free · 10 min/day", + "ja": "無料 · 1日10分", + "ko": "무료 · 하루 10분", + "ru": "Бесплатно · 10 мин/день", + "es": "Gratis · 10 min/día" + }, + "planFreeTag": { + "zh": "免费版", + "en": "Free", + "ja": "無料", + "ko": "무료", + "ru": "Бесплатно", + "es": "Gratis" + }, + "watchAd": { + "zh": "看广告开始使用", + "en": "Watch ad to start", + "ja": "広告を見て開始", + "ko": "광고 시청 후 시작", + "ru": "Смотрите рекламу, чтобы начать", + "es": "Mira un anuncio para empezar" + }, + "adUnlocked": { + "zh": "已解锁 · 今日可用", + "en": "Unlocked for today", + "ja": "本日は利用可能", + "ko": "오늘 사용 가능", + "ru": "Открыто на сегодня", + "es": "Desbloqueado por hoy" + }, + "quotaLeftLabel": { + "zh": "剩余", + "en": "Left", + "ja": "残り", + "ko": "남음", + "ru": "Осталось", + "es": "Restante" + }, + "quotaUsedUp": { + "zh": "今日免费时长已用完", + "en": "Daily free time used up", + "ja": "本日の無料時間を使い切りました", + "ko": "오늘 무료 시간을 모두 사용함", + "ru": "Дневной бесплатный лимит исчерпан", + "es": "Tiempo gratis diario agotado" + }, + "watchAdMore": { + "zh": "看广告加时", + "en": "Watch ad for more time", + "ja": "広告を見て時間を追加", + "ko": "광고 시청으로 시간 추가", + "ru": "Смотрите рекламу, чтобы добавить время", + "es": "Mira un anuncio para más tiempo" + }, + "quotaExhaustedNotice": { + "zh": "今日免费时长已用完,升级会员可继续使用", + "en": "You've used today's free time. Upgrade to keep connecting.", + "ja": "本日の無料時間を使い切りました。アップグレードすると続けて接続できます。", + "ko": "오늘 무료 시간을 모두 사용했습니다. 업그레이드하면 계속 연결할 수 있습니다.", + "ru": "Дневной бесплатный лимит исчерпан. Оформите подписку, чтобы продолжить подключение.", + "es": "Tiempo gratis diario agotado. Mejora tu plan para seguir conectado." + }, + "adPlaying": { + "zh": "广告播放中…", + "en": "Ad playing…", + "ja": "広告を再生中…", + "ko": "광고 재생 중…", + "ru": "Реклама воспроизводится…", + "es": "Reproduciendo anuncio…" + }, + "adFailed": { + "zh": "加时失败,请重试", + "en": "Failed to add time, please retry", + "ja": "時間の追加に失敗しました。もう一度お試しください", + "ko": "시간 추가에 실패했습니다. 다시 시도하세요", + "ru": "Не удалось добавить время, попробуйте ещё раз", + "es": "No se pudo añadir tiempo, inténtalo de nuevo" + }, + "quotaDesktopTitle": { + "zh": "今日免费时长已用完", + "en": "Daily free time used up", + "ja": "本日の無料時間を使い切りました", + "ko": "오늘 무료 시간을 모두 사용함", + "ru": "Дневной бесплатный лимит исчерпан", + "es": "Tiempo gratis diario agotado" + }, + "quotaDesktopBody": { + "zh": "前往移动端 App 看广告加时,或升级会员畅享无限时长。", + "en": "Watch ads in the mobile app to add time, or upgrade for unlimited access.", + "ja": "モバイルアプリで広告を見ると時間を追加できます。無制限に使うにはアップグレードしてください。", + "ko": "모바일 앱에서 광고를 시청해 시간을 추가하거나, 업그레이드하여 무제한으로 이용하세요.", + "ru": "Смотрите рекламу в мобильном приложении, чтобы добавить время, или оформите подписку для безлимитного доступа.", + "es": "Mira anuncios en la app móvil para añadir tiempo, o mejora tu plan para acceso ilimitado." + }, + "gotIt": { + "zh": "知道了", + "en": "Got it", + "ja": "了解", + "ko": "확인", + "ru": "Понятно", + "es": "Entendido" + }, + "chooseNode": { + "zh": "选择节点", + "en": "Choose server", + "ja": "サーバーを選択", + "ko": "서버 선택", + "ru": "Выбор сервера", + "es": "Elegir servidor" + }, + "searchPh": { + "zh": "搜索国家 / 城市", + "en": "Search country / city", + "ja": "国・都市を検索", + "ko": "국가 / 도시 검색", + "ru": "Поиск страны / города", + "es": "Buscar país / ciudad" + }, + "smartSelect": { + "zh": "智能选择", + "en": "Smart select", + "ja": "スマート選択", + "ko": "스마트 선택", + "ru": "Умный выбор", + "es": "Selección inteligente" + }, + "nodeSwitchBody": { + "zh": "当前连接将断开并重连到该节点。", + "en": "This disconnects the current link and reconnects to this node.", + "ja": "現在の接続を切断し、このノードに再接続します。", + "ko": "현재 연결을 끊고 이 노드로 다시 연결합니다.", + "ru": "Текущее соединение будет разорвано и восстановлено через этот узел.", + "es": "Esto desconecta el enlace actual y reconecta a este nodo." + }, + "nodeSwitchConfirm": { + "zh": "切换", + "en": "Switch", + "ja": "切り替える", + "ko": "전환", + "ru": "Переключить", + "es": "Cambiar" + }, + "nodeUnhealthySwitched": { + "zh": "当前节点异常,已自动切换", + "en": "Current node unreachable — switched automatically", + "ja": "現在のノードに接続できないため、自動的に切り替えました", + "ko": "현재 노드에 연결할 수 없어 자동으로 전환했습니다", + "ru": "Текущий узел недоступен — переключение выполнено автоматически", + "es": "Nodo actual inaccesible: cambiado automáticamente" + }, + "nodeUnhealthyError": { + "zh": "当前节点异常,请重连或更换节点", + "en": "Current node is unreachable — reconnect or switch node", + "ja": "現在のノードに接続できません。再接続するかノードを切り替えてください", + "ko": "현재 노드에 연결할 수 없습니다 — 재연결하거나 노드를 전환하세요", + "ru": "Текущий узел недоступен — переподключитесь или смените узел", + "es": "El nodo actual está inaccesible: reconecta o cambia de nodo" + }, + "nodeReconnecting": { + "zh": "网络波动,正在重连…", + "en": "Network unstable, reconnecting…", + "ja": "ネットワークが不安定です。再接続中…", + "ko": "네트워크가 불안정하여 다시 연결 중…", + "ru": "Сеть нестабильна, переподключение…", + "es": "Red inestable, reconectando…" + }, + "smartSub": { + "zh": "根据当前网络环境,自动选择最优节点", + "en": "Picks the best node for your network", + "ja": "お使いのネットワークに最適なノードを選びます", + "ko": "네트워크에 가장 적합한 노드를 선택합니다", + "ru": "Подбирает лучший узел для вашей сети", + "es": "Elige el mejor nodo para tu red" + }, + "recommended": { + "zh": "推荐", + "en": "Recommended", + "ja": "おすすめ", + "ko": "추천", + "ru": "Рекомендуется", + "es": "Recomendado" + }, + "statsTitle": { + "zh": "使用统计", + "en": "Statistics", + "ja": "統計", + "ko": "통계", + "ru": "Статистика", + "es": "Estadísticas" + }, + "trafficMonth": { + "zh": "本月流量", + "en": "Traffic", + "ja": "通信量", + "ko": "트래픽", + "ru": "Трафик", + "es": "Tráfico" + }, + "avgPing": { + "zh": "平均延迟", + "en": "Avg ping", + "ja": "平均Ping", + "ko": "평균 지연", + "ru": "Средний пинг", + "es": "Ping medio" + }, + "durMonth": { + "zh": "本月时长", + "en": "Time", + "ja": "接続時間", + "ko": "시간", + "ru": "Время", + "es": "Tiempo" + }, + "weekTraffic": { + "zh": "本周流量 (GB)", + "en": "This week (GB)", + "ja": "今週 (GB)", + "ko": "이번 주 (GB)", + "ru": "На этой неделе (ГБ)", + "es": "Esta semana (GB)" + }, + "byDevice": { + "zh": "设备明细", + "en": "By device", + "ja": "デバイス別", + "ko": "기기별", + "ru": "По устройствам", + "es": "Por dispositivo" + }, + "noDeviceUsage": { + "zh": "暂无设备用量", + "en": "No device usage yet", + "ja": "デバイスの利用履歴はまだありません", + "ko": "아직 기기 사용 기록이 없습니다", + "ru": "Пока нет данных по устройствам", + "es": "Aún no hay uso por dispositivo" + }, + "periodMonth": { + "zh": "本月", + "en": "This month", + "ja": "今月", + "ko": "이번 달", + "ru": "Этот месяц", + "es": "Este mes" + }, + "periodWeek": { + "zh": "本周", + "en": "This week", + "ja": "今週", + "ko": "이번 주", + "ru": "Эта неделя", + "es": "Esta semana" + }, + "periodToday": { + "zh": "今日", + "en": "Today", + "ja": "今日", + "ko": "오늘", + "ru": "Сегодня", + "es": "Hoy" + }, + "statDown": { + "zh": "下行", + "en": "Download", + "ja": "ダウンロード", + "ko": "다운로드", + "ru": "Приём", + "es": "Descarga" + }, + "statUp": { + "zh": "上行", + "en": "Upload", + "ja": "アップロード", + "ko": "업로드", + "ru": "Отдача", + "es": "Subida" + }, + "statDuration": { + "zh": "使用时长", + "en": "Duration", + "ja": "接続時間", + "ko": "사용 시간", + "ru": "Длительность", + "es": "Duración" + }, + "chartTwoWeeks": { + "zh": "最近两周流量", + "en": "Last 2 weeks", + "ja": "過去2週間", + "ko": "최근 2주", + "ru": "Последние 2 недели", + "es": "Últimas 2 semanas" + }, + "allDevices": { + "zh": "全部设备", + "en": "All devices", + "ja": "すべてのデバイス", + "ko": "모든 기기", + "ru": "Все устройства", + "es": "Todos los dispositivos" + }, + "meTitle": { + "zh": "我的", + "en": "Account", + "ja": "アカウント", + "ko": "계정", + "ru": "Аккаунт", + "es": "Cuenta" + }, + "proMember": { + "zh": "PRO 会员", + "en": "PRO member", + "ja": "PRO会員", + "ko": "PRO 회원", + "ru": "PRO-подписка", + "es": "Miembro PRO" + }, + "freePlanName": { + "zh": "免费版", + "en": "Free", + "ja": "無料", + "ko": "무료", + "ru": "Бесплатный", + "es": "Gratis" + }, + "expires": { + "zh": "有效期至", + "en": "Expires", + "ja": "有効期限", + "ko": "만료일", + "ru": "Действует до", + "es": "Vence" + }, + "upgradeBtn": { + "zh": "续费 / 升级", + "en": "Renew / Upgrade", + "ja": "更新 / アップグレード", + "ko": "갱신 / 업그레이드", + "ru": "Продлить / Улучшить", + "es": "Renovar / Mejorar" + }, + "accInfoTitle": { + "zh": "账户信息", + "en": "Account info", + "ja": "アカウント情報", + "ko": "계정 정보", + "ru": "Данные аккаунта", + "es": "Información de la cuenta" + }, + "accEmail": { + "zh": "邮箱", + "en": "Email", + "ja": "メールアドレス", + "ko": "이메일", + "ru": "Эл. почта", + "es": "Correo" + }, + "accPassword": { + "zh": "密码", + "en": "Password", + "ja": "パスワード", + "ko": "비밀번호", + "ru": "Пароль", + "es": "Contraseña" + }, + "accChange": { + "zh": "修改", + "en": "Change", + "ja": "変更", + "ko": "변경", + "ru": "Изменить", + "es": "Cambiar" + }, + "deviceLimitTitle": { + "zh": "设备数已达上限", + "en": "Device limit reached", + "ja": "デバイス数の上限に達しました", + "ko": "기기 한도에 도달함", + "ru": "Достигнут лимит устройств", + "es": "Límite de dispositivos alcanzado" + }, + "deviceLimitDesc": { + "zh": "你的套餐最多 %s 台设备,请移除一台以继续。", + "en": "Your plan allows up to %s devices. Remove one to continue.", + "ja": "現在のプランでは最大 %s 台まで利用できます。続けるには1台を削除してください。", + "ko": "현재 요금제는 최대 %s대의 기기를 허용합니다. 계속하려면 한 대를 삭제하세요.", + "ru": "Ваш тариф допускает до %s устройств. Удалите одно, чтобы продолжить.", + "es": "Tu plan permite hasta %s dispositivos. Elimina uno para continuar." + }, + "deviceLimitRemoveOldest": { + "zh": "移除最久未用", + "en": "Remove least recently used", + "ja": "最後に使用したのが最も古いデバイスを削除", + "ko": "가장 오래 사용하지 않은 기기 삭제", + "ru": "Удалить давно неиспользуемое", + "es": "Eliminar el menos usado recientemente" + }, + "myDevices": { + "zh": "我的设备", + "en": "My devices", + "ja": "マイデバイス", + "ko": "내 기기", + "ru": "Мои устройства", + "es": "Mis dispositivos" + }, + "devicesSub": { + "zh": "PRO 套餐最多 3 台设备同时在线", + "en": "Up to 3 devices on PRO", + "ja": "PROでは最大3台まで", + "ko": "PRO는 최대 3대", + "ru": "До 3 устройств на PRO", + "es": "Hasta 3 dispositivos en PRO" + }, + "thisDevice": { + "zh": "本机", + "en": "This device", + "ja": "このデバイス", + "ko": "이 기기", + "ru": "Это устройство", + "es": "Este dispositivo" + }, + "remove": { + "zh": "移除", + "en": "Remove", + "ja": "削除", + "ko": "삭제", + "ru": "Удалить", + "es": "Eliminar" + }, + "devOnline": { + "zh": "在线", + "en": "Online", + "ja": "オンライン", + "ko": "온라인", + "ru": "В сети", + "es": "En línea" + }, + "devOffline": { + "zh": "离线", + "en": "Offline", + "ja": "オフライン", + "ko": "오프라인", + "ru": "Не в сети", + "es": "Desconectado" + }, + "devLastOnline": { + "zh": "最后在线", + "en": "Last online", + "ja": "最終オンライン", + "ko": "마지막 접속", + "ru": "Был(а) в сети", + "es": "Última conexión" + }, + "devNeverLogin": { + "zh": "从未登录", + "en": "Never logged in", + "ja": "ログイン履歴なし", + "ko": "로그인한 적 없음", + "ru": "Ни разу не входил(а)", + "es": "Nunca ha iniciado sesión" + }, + "devForceLogout": { + "zh": "强制退出", + "en": "Force logout", + "ja": "強制ログアウト", + "ko": "강제 로그아웃", + "ru": "Принудительный выход", + "es": "Forzar cierre de sesión" + }, + "devClearLogin": { + "zh": "清除登录信息", + "en": "Clear login info", + "ja": "ログイン情報を消去", + "ko": "로그인 정보 삭제", + "ru": "Очистить данные входа", + "es": "Borrar datos de sesión" + }, + "devRename": { + "zh": "重命名", + "en": "Rename", + "ja": "名前を変更", + "ko": "이름 변경", + "ru": "Переименовать", + "es": "Renombrar" + }, + "devRenameHint": { + "zh": "设备名称", + "en": "Device name", + "ja": "デバイス名", + "ko": "기기 이름", + "ru": "Имя устройства", + "es": "Nombre del dispositivo" + }, + "devSave": { + "zh": "保存", + "en": "Save", + "ja": "保存", + "ko": "저장", + "ru": "Сохранить", + "es": "Guardar" + }, + "devForceLogoutConfirm": { + "zh": "将吊销该设备的登录会话,它会被踢下线、需重新登录。设备仍保留在列表中。", + "en": "This revokes the device's login session — it will be kicked offline and must sign in again. The device stays in the list.", + "ja": "このデバイスのログインセッションを無効にします。オフラインになり、再度サインインが必要になります。デバイスはリストに残ります。", + "ko": "이 기기의 로그인 세션을 무효화합니다 — 오프라인으로 강제 종료되며 다시 로그인해야 합니다. 기기는 목록에 남아 있습니다.", + "ru": "Это завершит сеанс входа устройства — оно будет отключено и потребует повторного входа. Устройство останется в списке.", + "es": "Esto revoca la sesión del dispositivo: será desconectado y deberá iniciar sesión de nuevo. El dispositivo permanece en la lista." + }, + "devClearLoginConfirm": { + "zh": "将从设备列表彻底移除此设备,并吊销其登录会话与数据面凭证。该设备需重新登录才能再次使用。", + "en": "This removes the device from the list entirely and revokes its login session and data-plane credential. The device must sign in again to be used.", + "ja": "このデバイスをリストから完全に削除し、ログインセッションとデータ通信の認証情報を無効にします。再び利用するには、もう一度サインインが必要です。", + "ko": "이 기기를 목록에서 완전히 삭제하고 로그인 세션과 데이터 전송 자격 증명을 무효화합니다. 다시 사용하려면 재로그인해야 합니다.", + "ru": "Это полностью удалит устройство из списка и отзовёт его сеанс входа и учётные данные передачи данных. Чтобы снова использовать устройство, нужно войти заново.", + "es": "Esto elimina el dispositivo de la lista por completo y revoca su sesión y su credencial del plano de datos. El dispositivo deberá iniciar sesión de nuevo para poder usarse." + }, + "devCancel": { + "zh": "取消", + "en": "Cancel", + "ja": "キャンセル", + "ko": "취소", + "ru": "Отмена", + "es": "Cancelar" + }, + "sessionRevokedTitle": { + "zh": "此设备已被强制下线", + "en": "This device was signed out", + "ja": "このデバイスはサインアウトされました", + "ko": "이 기기에서 로그아웃되었습니다", + "ru": "Это устройство было отключено", + "es": "Se cerró la sesión de este dispositivo" + }, + "sessionRevokedBody": { + "zh": "你的账号在其他设备上将此设备强制退出,需要重新登录。", + "en": "Your account signed this device out from another device. Please sign in again.", + "ja": "別のデバイスから、このデバイスがサインアウトされました。もう一度サインインしてください。", + "ko": "다른 기기에서 이 기기를 로그아웃했습니다. 다시 로그인하세요.", + "ru": "Вход с этого устройства завершён с другого устройства вашего аккаунта. Пожалуйста, войдите снова.", + "es": "Tu cuenta cerró la sesión de este dispositivo desde otro dispositivo. Inicia sesión de nuevo." + }, + "sessionRevokedOk": { + "zh": "重新登录", + "en": "Sign in again", + "ja": "再度サインイン", + "ko": "다시 로그인", + "ru": "Войти снова", + "es": "Iniciar sesión de nuevo" + }, + "redeemEntry": { + "zh": "兑换", + "en": "Redeem", + "ja": "コード引き換え", + "ko": "코드 등록", + "ru": "Активация", + "es": "Canjear" + }, + "contactEntry": { + "zh": "联系我们", + "en": "Contact us", + "ja": "お問い合わせ", + "ko": "문의하기", + "ru": "Связаться с нами", + "es": "Contáctanos" + }, + "signOut": { + "zh": "退出登录", + "en": "Sign out", + "ja": "サインアウト", + "ko": "로그아웃", + "ru": "Выйти", + "es": "Cerrar sesión" + }, + "language": { + "zh": "语言", + "en": "Language", + "ja": "言語", + "ko": "언어", + "ru": "Язык", + "es": "Idioma" + }, + "darkAppearance": { + "zh": "深色外观", + "en": "Dark appearance", + "ja": "ダークモード", + "ko": "다크 모드", + "ru": "Тёмная тема", + "es": "Apariencia oscura" + }, + "stateOn": { + "zh": "已开启", + "en": "On", + "ja": "オン", + "ko": "켜짐", + "ru": "Вкл.", + "es": "Activado" + }, + "followLight": { + "zh": "跟随浅色", + "en": "Off", + "ja": "オフ", + "ko": "꺼짐", + "ru": "Выкл.", + "es": "Desactivado" + }, + "protocol": { + "zh": "协议", + "en": "Protocol", + "ja": "プロトコル", + "ko": "프로토콜", + "ru": "Протокол", + "es": "Protocolo" + }, + "settingsTitle": { + "zh": "设置", + "en": "Settings", + "ja": "設定", + "ko": "설정", + "ru": "Настройки", + "es": "Ajustes" + }, + "autostart": { + "zh": "开机自启", + "en": "Launch at startup", + "ja": "スタートアップ時に起動", + "ko": "시작 시 실행", + "ru": "Запуск при старте системы", + "es": "Iniciar al arrancar" + }, + "autostartSub": { + "zh": "系统启动时自动运行", + "en": "Run automatically on system start", + "ja": "システム起動時に自動的に実行", + "ko": "시스템 시작 시 자동으로 실행", + "ru": "Запускать автоматически при включении системы", + "es": "Ejecutar automáticamente al iniciar el sistema" + }, + "autoConnect": { + "zh": "自动连接", + "en": "Auto-connect", + "ja": "自動接続", + "ko": "자동 연결", + "ru": "Автоподключение", + "es": "Conexión automática" + }, + "autoConnectSub": { + "zh": "启动时自动连接节点", + "en": "Connect automatically on launch", + "ja": "起動時に自動的に接続", + "ko": "실행 시 자동으로 연결", + "ru": "Подключаться автоматически при запуске", + "es": "Conectar automáticamente al abrir" + }, + "smartRoute": { + "zh": "智能分流", + "en": "Smart routing", + "ja": "スマートルーティング", + "ko": "스마트 라우팅", + "ru": "Умная маршрутизация", + "es": "Enrutamiento inteligente" + }, + "smartRouteSub": { + "zh": "海外应用走加速,国内直连", + "en": "Accelerate abroad, direct at home", + "ja": "海外は高速化、国内は直接接続", + "ko": "해외는 가속, 국내는 직접 연결", + "ru": "Ускорение для зарубежных ресурсов, прямой доступ для локальных", + "es": "Acelera en el extranjero, directo en casa" + }, + "killSwitch": { + "zh": "Kill Switch", + "en": "Kill Switch", + "ja": "キルスイッチ", + "ko": "Kill Switch", + "ru": "Kill Switch", + "es": "Kill Switch" + }, + "killSwitchSub": { + "zh": "断线时阻断网络,防止泄露", + "en": "Block traffic if the link drops", + "ja": "接続が切れたら通信を遮断", + "ko": "연결이 끊기면 트래픽 차단", + "ru": "Блокировать трафик при разрыве соединения", + "es": "Bloquea el tráfico si se cae el enlace" + }, + "checkUpdate": { + "zh": "检查更新", + "en": "Check for updates", + "ja": "アップデートを確認", + "ko": "업데이트 확인", + "ru": "Проверить обновления", + "es": "Buscar actualizaciones" + }, + "webUserCenter": { + "zh": "用户中心(网页)", + "en": "User Center (Web)", + "ja": "ユーザーセンター (Web)", + "ko": "사용자 센터 (웹)", + "ru": "Личный кабинет (веб)", + "es": "Centro de usuario (Web)" + }, + "updateNotesFallback": { + "zh": "本次更新修复了一些问题并提升了稳定性,建议尽快更新。", + "en": "This update includes fixes and stability improvements.", + "ja": "このアップデートには不具合の修正と安定性の向上が含まれています。", + "ko": "이번 업데이트에는 버그 수정과 안정성 개선이 포함되어 있습니다.", + "ru": "Это обновление включает исправления и улучшения стабильности.", + "es": "Esta actualización incluye correcciones y mejoras de estabilidad." + }, + "updateLater": { + "zh": "稍后", + "en": "Later", + "ja": "後で", + "ko": "나중에", + "ru": "Позже", + "es": "Más tarde" + }, + "updateDownload": { + "zh": "下载更新", + "en": "Download update", + "ja": "アップデートをダウンロード", + "ko": "업데이트 다운로드", + "ru": "Скачать обновление", + "es": "Descargar actualización" + }, + "updateUpToDate": { + "zh": "已是最新版本", + "en": "You are up to date", + "ja": "最新の状態です", + "ko": "최신 버전입니다", + "ru": "У вас установлена последняя версия", + "es": "Ya tienes la última versión" + }, + "updateCheckFailed": { + "zh": "检查更新失败,请稍后重试", + "en": "Update check failed, try again later", + "ja": "アップデートの確認に失敗しました。後でもう一度お試しください", + "ko": "업데이트 확인에 실패했습니다. 잠시 후 다시 시도하세요", + "ru": "Не удалось проверить обновления, попробуйте позже", + "es": "Falló la búsqueda de actualizaciones, inténtalo más tarde" + }, + "freePlan": { + "zh": "免费版", + "en": "Free", + "ja": "無料", + "ko": "무료", + "ru": "Бесплатный", + "es": "Gratis" + }, + "proPlan": { + "zh": "专业版", + "en": "Pro", + "ja": "Pro", + "ko": "Pro", + "ru": "Pro", + "es": "Pro" + }, + "teamPlan": { + "zh": "团队版", + "en": "Team", + "ja": "Team", + "ko": "Team", + "ru": "Команда", + "es": "Equipo" + }, + "perMonth": { + "zh": "/月", + "en": "/mo", + "ja": "/月", + "ko": "/월", + "ru": "/мес", + "es": "/mes" + }, + "current": { + "zh": "当前", + "en": "Current", + "ja": "現在", + "ko": "현재", + "ru": "Текущий", + "es": "Actual" + }, + "upgrade": { + "zh": "立即升级", + "en": "Upgrade", + "ja": "アップグレード", + "ko": "업그레이드", + "ru": "Улучшить", + "es": "Mejorar" + }, + "choose": { + "zh": "选择", + "en": "Choose", + "ja": "選択", + "ko": "선택", + "ru": "Выбрать", + "es": "Elegir" + }, + "mostPopular": { + "zh": "最受欢迎", + "en": "Popular", + "ja": "人気", + "ko": "인기", + "ru": "Популярный", + "es": "Popular" + }, + "redeemTitle": { + "zh": "兑换 & 购买", + "en": "Redeem & buy", + "ja": "コード引き換え・購入", + "ko": "코드 등록 및 구매", + "ru": "Активация и покупка", + "es": "Canjear y comprar" + }, + "redeemCodeTitle": { + "zh": "兑换激活码", + "en": "Redeem a code", + "ja": "コードを引き換える", + "ko": "코드 등록", + "ru": "Активировать код", + "es": "Canjear un código" + }, + "redeemPh": { + "zh": "输入激活码", + "en": "Enter activation code", + "ja": "アクティベーションコードを入力", + "ko": "활성화 코드 입력", + "ru": "Введите код активации", + "es": "Introduce el código de activación" + }, + "redeemBtn": { + "zh": "激活", + "en": "Redeem", + "ja": "引き換える", + "ko": "등록", + "ru": "Активировать", + "es": "Canjear" + }, + "redeemOk": { + "zh": "激活成功 · PRO 已开通", + "en": "Activated · PRO unlocked", + "ja": "認証完了 · PROが利用可能に", + "ko": "활성화됨 · PRO 잠금 해제", + "ru": "Активировано · PRO открыт", + "es": "Activado · PRO desbloqueado" + }, + "buyTitle": { + "zh": "购买渠道", + "en": "Where to buy", + "ja": "購入方法", + "ko": "구매처", + "ru": "Где купить", + "es": "Dónde comprar" + }, + "buySub": { + "zh": "App 内不支持直接支付。请通过以下渠道获取激活码:", + "en": "In-app payment is unavailable. Get a code via:", + "ja": "アプリ内決済はご利用いただけません。以下からコードを入手してください:", + "ko": "앱 내 결제는 지원되지 않습니다. 다음 경로로 코드를 받으세요:", + "ru": "Оплата внутри приложения недоступна. Получить код можно через:", + "es": "El pago dentro de la app no está disponible. Consigue un código mediante:" + }, + "chStore": { + "zh": "自助发卡商店", + "en": "Self-serve store", + "ja": "セルフサービスストア", + "ko": "셀프 스토어", + "ru": "Магазин самообслуживания", + "es": "Tienda autoservicio" + }, + "chEmail": { + "zh": "邮箱客服", + "en": "Email support", + "ja": "メールサポート", + "ko": "이메일 지원", + "ru": "Поддержка по эл. почте", + "es": "Soporte por correo" + }, + "contactTitle": { + "zh": "联系我们", + "en": "Contact us", + "ja": "お問い合わせ", + "ko": "문의하기", + "ru": "Связаться с нами", + "es": "Contáctanos" + }, + "contactIntro": { + "zh": "遇到问题?通过以下任一渠道联系我们,通常数分钟内回复。", + "en": "Need help? Reach us via any channel below — usually replies in minutes.", + "ja": "お困りですか?以下のいずれかの方法でお問い合わせください。通常は数分以内に返信します。", + "ko": "도움이 필요하신가요? 아래 채널로 문의하세요 — 보통 몇 분 안에 답변드립니다.", + "ru": "Нужна помощь? Свяжитесь с нами любым способом ниже — обычно отвечаем за считанные минуты.", + "es": "¿Necesitas ayuda? Escríbenos por cualquiera de los canales de abajo: solemos responder en minutos." + }, + "contactEmail": { + "zh": "邮箱客服", + "en": "Email support", + "ja": "メールサポート", + "ko": "이메일 지원", + "ru": "Поддержка по эл. почте", + "es": "Soporte por correo" + }, + "contactStore": { + "zh": "自助发卡商店", + "en": "Self-serve store", + "ja": "セルフサービスストア", + "ko": "셀프 스토어", + "ru": "Магазин самообслуживания", + "es": "Tienda autoservicio" + }, + "contactWebsite": { + "zh": "官网", + "en": "Website", + "ja": "公式サイト", + "ko": "공식 웹사이트", + "ru": "Веб-сайт", + "es": "Sitio web" + }, + "contactHoursTitle": { + "zh": "服务时间", + "en": "Support hours", + "ja": "サポート時間", + "ko": "지원 시간", + "ru": "Часы поддержки", + "es": "Horario de soporte" + }, + "contactHours": { + "zh": "每日 9:00 – 24:00 (GMT+8)", + "en": "Daily 9:00 – 24:00 (GMT+8)", + "ja": "毎日 9:00 – 24:00 (GMT+8)", + "ko": "매일 9:00 – 24:00 (GMT+8)", + "ru": "Ежедневно 9:00 – 24:00 (GMT+8)", + "es": "Todos los días 9:00 – 24:00 (GMT+8)" + }, + "authTagline": { + "zh": "极速 · 稳定 · 省心", + "en": "Fast · Stable · Effortless", + "ja": "高速 · 安定 · かんたん", + "ko": "빠르게 · 안정적으로 · 손쉽게", + "ru": "Быстро · Стабильно · Без усилий", + "es": "Rápido · Estable · Sin complicaciones" + }, + "tabLogin": { + "zh": "登录", + "en": "Log in", + "ja": "ログイン", + "ko": "로그인", + "ru": "Вход", + "es": "Iniciar sesión" + }, + "tabRegister": { + "zh": "注册", + "en": "Sign up", + "ja": "新規登録", + "ko": "회원가입", + "ru": "Регистрация", + "es": "Registrarse" + }, + "emailLabel": { + "zh": "邮箱", + "en": "Email", + "ja": "メールアドレス", + "ko": "이메일", + "ru": "Эл. почта", + "es": "Correo" + }, + "emailPh": { + "zh": "你的邮箱地址", + "en": "your@email.com", + "ja": "your@email.com", + "ko": "your@email.com", + "ru": "your@email.com", + "es": "tu@correo.com" + }, + "pwLabel": { + "zh": "密码", + "en": "Password", + "ja": "パスワード", + "ko": "비밀번호", + "ru": "Пароль", + "es": "Contraseña" + }, + "pwPh": { + "zh": "输入密码", + "en": "Enter password", + "ja": "パスワードを入力", + "ko": "비밀번호 입력", + "ru": "Введите пароль", + "es": "Introduce la contraseña" + }, + "setPwPh": { + "zh": "设置登录密码(用于多端登录)", + "en": "Set a password (for multi-device login)", + "ja": "パスワードを設定(複数デバイスでのログイン用)", + "ko": "비밀번호 설정 (다중 기기 로그인용)", + "ru": "Задайте пароль (для входа с нескольких устройств)", + "es": "Crea una contraseña (para acceso multidispositivo)" + }, + "codeLabel": { + "zh": "邮箱验证码", + "en": "Verification code", + "ja": "確認コード", + "ko": "인증 코드", + "ru": "Код подтверждения", + "es": "Código de verificación" + }, + "sendCode": { + "zh": "发送验证码", + "en": "Send code", + "ja": "コードを送信", + "ko": "코드 전송", + "ru": "Отправить код", + "es": "Enviar código" + }, + "resend": { + "zh": "重新发送", + "en": "Resend", + "ja": "再送信", + "ko": "재전송", + "ru": "Отправить снова", + "es": "Reenviar" + }, + "doLogin": { + "zh": "登录", + "en": "Log in", + "ja": "ログイン", + "ko": "로그인", + "ru": "Войти", + "es": "Iniciar sesión" + }, + "doNext": { + "zh": "下一步", + "en": "Next", + "ja": "次へ", + "ko": "다음", + "ru": "Далее", + "es": "Siguiente" + }, + "doCreate": { + "zh": "创建账户", + "en": "Create account", + "ja": "アカウントを作成", + "ko": "계정 만들기", + "ru": "Создать аккаунт", + "es": "Crear cuenta" + }, + "forgotPw": { + "zh": "忘记密码?", + "en": "Forgot password?", + "ja": "パスワードをお忘れですか?", + "ko": "비밀번호를 잊으셨나요?", + "ru": "Забыли пароль?", + "es": "¿Olvidaste la contraseña?" + }, + "tos": { + "zh": "继续即代表同意《服务条款》与《隐私政策》", + "en": "By continuing you agree to our Terms & Privacy Policy", + "ja": "続行すると、利用規約とプライバシーポリシーに同意したことになります", + "ko": "계속하면 이용약관 및 개인정보 처리방침에 동의하는 것입니다", + "ru": "Продолжая, вы принимаете наши Условия и Политику конфиденциальности", + "es": "Al continuar aceptas nuestros Términos y Política de privacidad" + }, + "obSkip": { + "zh": "跳过", + "en": "Skip", + "ja": "スキップ", + "ko": "건너뛰기", + "ru": "Пропустить", + "es": "Omitir" + }, + "obNext": { + "zh": "下一步", + "en": "Next", + "ja": "次へ", + "ko": "다음", + "ru": "Далее", + "es": "Siguiente" + }, + "obAllow": { + "zh": "允许并继续", + "en": "Allow & continue", + "ja": "許可して続行", + "ko": "허용하고 계속", + "ru": "Разрешить и продолжить", + "es": "Permitir y continuar" + }, + "obStart": { + "zh": "开始使用", + "en": "Get started", + "ja": "始める", + "ko": "시작하기", + "ru": "Начать", + "es": "Empezar" + }, + "ob1Title": { + "zh": "一键连接全球", + "en": "Connect worldwide", + "ja": "世界中に接続", + "ko": "전 세계로 연결", + "ru": "Подключение по всему миру", + "es": "Conéctate en todo el mundo" + }, + "ob1Sub": { + "zh": "80+ 节点,智能选择最快线路,稳定不掉线。", + "en": "80+ locations, auto-fastest routing, rock-solid.", + "ja": "80以上の拠点、最速ルートを自動選択、抜群の安定性。", + "ko": "80개 이상의 지역, 자동 최적 경로, 안정적인 연결.", + "ru": "80+ локаций, автоматический выбор самого быстрого маршрута, надёжная стабильность.", + "es": "Más de 80 ubicaciones, enrutamiento al más rápido automático, sólido como una roca." + }, + "ob2Title": { + "zh": "授权网络配置", + "en": "Allow network setup", + "ja": "ネットワーク設定を許可", + "ko": "네트워크 설정 허용", + "ru": "Разрешите настройку сети", + "es": "Permite la configuración de red" + }, + "ob2Sub": { + "zh": "系统会请求添加一个网络配置,用于建立加密隧道。", + "en": "The system will ask to add a network profile to build the encrypted tunnel.", + "ja": "暗号化トンネルを構築するため、システムがネットワークプロファイルの追加を求めます。", + "ko": "암호화된 터널을 구성하기 위해 시스템이 네트워크 프로필 추가를 요청합니다.", + "ru": "Система запросит добавление сетевого профиля для создания зашифрованного туннеля.", + "es": "El sistema te pedirá añadir un perfil de red para crear el túnel cifrado." + }, + "ob3Title": { + "zh": "安全 · 无日志", + "en": "Private by design", + "ja": "設計段階からプライバシー重視", + "ko": "설계부터 프라이버시", + "ru": "Приватность по умолчанию", + "es": "Privado por diseño" + }, + "ob3Sub": { + "zh": "端到端加密,我们不记录你的任何浏览数据。", + "en": "End-to-end encrypted. We keep zero browsing logs.", + "ja": "エンドツーエンドで暗号化。閲覧ログは一切保持しません。", + "ko": "종단 간 암호화. 브라우징 기록을 전혀 저장하지 않습니다.", + "ru": "Сквозное шифрование. Мы не храним журналы просмотров.", + "es": "Cifrado de extremo a extremo. No guardamos ningún registro de navegación." + }, + "purchaseTitle": { + "zh": "购买套餐", + "en": "Purchase", + "ja": "プランを購入", + "ko": "요금제 구매", + "ru": "Покупка тарифа", + "es": "Comprar plan" + }, + "paymentTitle": { + "zh": "支付", + "en": "Payment", + "ja": "お支払い", + "ko": "결제", + "ru": "Оплата", + "es": "Pago" + }, + "buyNow": { + "zh": "立即购买", + "en": "Buy now", + "ja": "今すぐ購入", + "ko": "지금 구매", + "ru": "Купить", + "es": "Comprar ahora" + }, + "payMethodAlipay": { + "zh": "支付宝", + "en": "Alipay", + "ja": "Alipay", + "ko": "Alipay", + "ru": "Alipay", + "es": "Alipay" + }, + "payMethodCrypto": { + "zh": "USDT (TRC20)", + "en": "USDT (TRC20)", + "ja": "USDT (TRC20)", + "ko": "USDT (TRC20)", + "ru": "USDT (TRC20)", + "es": "USDT (TRC20)" + }, + "choosePayMethod": { + "zh": "选择支付方式", + "en": "Choose payment method", + "ja": "お支払い方法を選択", + "ko": "결제 수단 선택", + "ru": "Выберите способ оплаты", + "es": "Elige el método de pago" + }, + "proMonthly": { + "zh": "专业版·月付", + "en": "Pro · Monthly", + "ja": "Pro · 月額", + "ko": "Pro · 월간", + "ru": "Pro · Месяц", + "es": "Pro · Mensual" + }, + "proQuarterly": { + "zh": "专业版·季付", + "en": "Pro · Quarterly", + "ja": "Pro · 3か月", + "ko": "Pro · 분기", + "ru": "Pro · Квартал", + "es": "Pro · Trimestral" + }, + "proYearly": { + "zh": "专业版·年付", + "en": "Pro · Yearly", + "ja": "Pro · 年額", + "ko": "Pro · 연간", + "ru": "Pro · Год", + "es": "Pro · Anual" + }, + "perQuarter": { + "zh": "/季", + "en": "/quarter", + "ja": "/3か月", + "ko": "/분기", + "ru": "/квартал", + "es": "/trimestre" + }, + "perYear": { + "zh": "/年", + "en": "/year", + "ja": "/年", + "ko": "/년", + "ru": "/год", + "es": "/año" + }, + "payAmountLabel": { + "zh": "转账金额", + "en": "Amount", + "ja": "送金額", + "ko": "송금액", + "ru": "Сумма перевода", + "es": "Importe a transferir" + }, + "payAddressLabel": { + "zh": "收款地址", + "en": "Address", + "ja": "送金先アドレス", + "ko": "입금 주소", + "ru": "Адрес для оплаты", + "es": "Dirección de pago" + }, + "payNetworkLabel": { + "zh": "网络", + "en": "Network", + "ja": "ネットワーク", + "ko": "네트워크", + "ru": "Сеть", + "es": "Red" + }, + "payExactAmountHint": { + "zh": "金额须精确一致,到账后自动开通", + "en": "Send the exact amount; activates automatically", + "ja": "正確な金額をお送りください。着金後、自動で有効になります", + "ko": "정확한 금액을 보내주세요. 입금 확인 후 자동으로 활성화됩니다", + "ru": "Отправьте точную сумму — активация произойдёт автоматически", + "es": "Envía el importe exacto; se activa automáticamente" + }, + "copied": { + "zh": "已复制", + "en": "Copied", + "ja": "コピーしました", + "ko": "복사됨", + "ru": "Скопировано", + "es": "Copiado" + }, + "openAlipay": { + "zh": "打开支付宝支付", + "en": "Pay with Alipay", + "ja": "Alipayで支払う", + "ko": "Alipay로 결제", + "ru": "Оплатить через Alipay", + "es": "Pagar con Alipay" + }, + "openAlipayHint": { + "zh": "完成支付后返回,本页会自动刷新", + "en": "Return after paying; this page refreshes automatically", + "ja": "お支払い後に戻ると、このページは自動的に更新されます", + "ko": "결제 후 돌아오면 이 페이지가 자동으로 새로고침됩니다", + "ru": "Вернитесь после оплаты — страница обновится автоматически", + "es": "Vuelve tras pagar; esta página se actualiza automáticamente" + }, + "openAlipayFailed": { + "zh": "无法打开支付宝,请检查是否已安装或稍后重试", + "en": "Couldn't open Alipay; check it's installed or try again", + "ja": "Alipayを開けませんでした。インストール済みか確認するか、後でもう一度お試しください", + "ko": "Alipay를 열 수 없습니다. 설치되어 있는지 확인하거나 다시 시도하세요", + "ru": "Не удалось открыть Alipay. Проверьте, установлен ли он, или повторите", + "es": "No se pudo abrir Alipay; comprueba que esté instalado o inténtalo de nuevo" + }, + "awaitingPayment": { + "zh": "等待付款", + "en": "Awaiting payment", + "ja": "お支払い待ち", + "ko": "결제 대기 중", + "ru": "Ожидание оплаты", + "es": "Esperando el pago" + }, + "paySucceeded": { + "zh": "已开通", + "en": "Activated", + "ja": "有効になりました", + "ko": "활성화됨", + "ru": "Активировано", + "es": "Activado" + }, + "payExpiresAt": { + "zh": "有效期至", + "en": "Valid until", + "ja": "有効期限", + "ko": "유효기간", + "ru": "Действует до", + "es": "Válido hasta" + }, + "payDone": { + "zh": "完成", + "en": "Done", + "ja": "完了", + "ko": "완료", + "ru": "Готово", + "es": "Listo" + }, + "payFailed": { + "zh": "支付失败", + "en": "Payment failed", + "ja": "お支払いに失敗しました", + "ko": "결제 실패", + "ru": "Оплата не удалась", + "es": "El pago falló" + }, + "payRetry": { + "zh": "重试", + "en": "Retry", + "ja": "再試行", + "ko": "다시 시도", + "ru": "Повторить", + "es": "Reintentar" + }, + "switchPayMethod": { + "zh": "换一种支付方式", + "en": "Switch payment method", + "ja": "別のお支払い方法に変更", + "ko": "다른 결제 수단으로 변경", + "ru": "Сменить способ оплаты", + "es": "Cambiar método de pago" + }, + "cancelOrder": { + "zh": "取消订单", + "en": "Cancel order", + "ja": "注文をキャンセル", + "ko": "주문 취소", + "ru": "Отменить заказ", + "es": "Cancelar pedido" + }, + "qrNotSupported": { + "zh": "请复制内容后在支付宝内打开", + "en": "Copy and open in Alipay", + "ja": "内容をコピーしてAlipayで開いてください", + "ko": "내용을 복사해 Alipay에서 여세요", + "ru": "Скопируйте и откройте в Alipay", + "es": "Copia el contenido y ábrelo en Alipay" + }, + "orderCreateFailed": { + "zh": "下单失败,请稍后重试", + "en": "Failed to create order, please retry", + "ja": "注文の作成に失敗しました。しばらくして再試行してください", + "ko": "주문 생성에 실패했습니다. 잠시 후 다시 시도하세요", + "ru": "Не удалось создать заказ, повторите попытку позже", + "es": "Error al crear el pedido, inténtalo de nuevo más tarde" + }, + "payUnsupportedRenderType": { + "zh": "暂不支持,请换支付方式", + "en": "Unsupported, switch payment method", + "ja": "未対応です。支払い方法を変更してください", + "ko": "지원되지 않습니다. 결제 방법을 변경하세요", + "ru": "Не поддерживается, смените способ оплаты", + "es": "No compatible, cambia el método de pago" + }, + "payNoActiveOrder": { + "zh": "暂无进行中的订单", + "en": "No active order", + "ja": "進行中の注文はありません", + "ko": "진행 중인 주문이 없습니다", + "ru": "Нет активных заказов", + "es": "No hay pedidos activos" + }, + "payChannel": { + "zh": "支付渠道", + "en": "Payment channel", + "ja": "支払いチャネル", + "ko": "결제 채널", + "ru": "Способ оплаты", + "es": "Canal de pago" + }, + "payChannelUsdt": { + "zh": "USDT · 加密货币", + "en": "USDT · Crypto", + "ja": "USDT · 暗号資産", + "ko": "USDT · 암호화폐", + "ru": "USDT · Крипто", + "es": "USDT · Cripto" + }, + "payChannelCny": { + "zh": "人民币 · 支付宝", + "en": "CNY · Alipay", + "ja": "人民元 · Alipay", + "ko": "위안화 · Alipay", + "ru": "Юань · Alipay", + "es": "CNY · Alipay" + }, + "perMonthSuffix": { + "zh": " /月", + "en": " /mo", + "ja": " /月", + "ko": " /월", + "ru": " /мес", + "es": " /mes" + }, + "ordersTitle": { + "zh": "我的订单", + "en": "My orders", + "ja": "注文履歴", + "ko": "내 주문", + "ru": "Мои заказы", + "es": "Mis pedidos" + }, + "orderDetailTitle": { + "zh": "订单详情", + "en": "Order details", + "ja": "注文の詳細", + "ko": "주문 상세", + "ru": "Детали заказа", + "es": "Detalles del pedido" + }, + "ordersEmpty": { + "zh": "暂无订单", + "en": "No orders yet", + "ja": "注文はありません", + "ko": "주문이 없습니다", + "ru": "Заказов пока нет", + "es": "Aún no hay pedidos" + }, + "orderNoLabel": { + "zh": "订单号", + "en": "Order no.", + "ja": "注文番号", + "ko": "주문 번호", + "ru": "Номер заказа", + "es": "N.º de pedido" + }, + "orderPlanLabel": { + "zh": "套餐", + "en": "Plan", + "ja": "プラン", + "ko": "플랜", + "ru": "Тариф", + "es": "Plan" + }, + "orderMethodLabel": { + "zh": "支付方式", + "en": "Payment method", + "ja": "支払い方法", + "ko": "결제 수단", + "ru": "Способ оплаты", + "es": "Método de pago" + }, + "orderAmountLabel": { + "zh": "金额", + "en": "Amount", + "ja": "金額", + "ko": "금액", + "ru": "Сумма", + "es": "Importe" + }, + "orderCreatedLabel": { + "zh": "创建时间", + "en": "Created", + "ja": "作成日時", + "ko": "생성 시각", + "ru": "Создан", + "es": "Creado" + }, + "orderPaidLabel": { + "zh": "付款时间", + "en": "Paid at", + "ja": "支払日時", + "ko": "결제 시각", + "ru": "Оплачен", + "es": "Pagado" + }, + "orderStatusPaid": { + "zh": "已开通", + "en": "Activated", + "ja": "有効化済み", + "ko": "활성화됨", + "ru": "Активирован", + "es": "Activado" + }, + "orderStatusCanceled": { + "zh": "已取消", + "en": "Canceled", + "ja": "キャンセル済み", + "ko": "취소됨", + "ru": "Отменён", + "es": "Cancelado" + }, + "orderContinuePay": { + "zh": "继续支付", + "en": "Continue payment", + "ja": "支払いを続ける", + "ko": "결제 계속", + "ru": "Продолжить оплату", + "es": "Continuar pago" + }, + "orderRefresh": { + "zh": "刷新状态", + "en": "Refresh", + "ja": "更新", + "ko": "새로고침", + "ru": "Обновить", + "es": "Actualizar" + }, + "orderRebuy": { + "zh": "重新购买", + "en": "Buy again", + "ja": "再購入", + "ko": "다시 구매", + "ru": "Купить снова", + "es": "Comprar de nuevo" + }, + "payMethodNezha": { + "zh": "哪吒支付", + "en": "Nazhapay", + "ja": "Nazhapay", + "ko": "Nazhapay", + "ru": "Nazhapay", + "es": "Nazhapay" + }, + "inviteEntry": { + "zh": "邀请好友得会员", + "en": "Invite friends, earn membership", + "ja": "友達を招待してメンバーシップを獲得", + "ko": "친구 초대하고 멤버십 받기", + "ru": "Приглашайте друзей и получайте членство", + "es": "Invita a amigos y gana membresía" + }, + "inviteEntrySub": { + "zh": "好友注册 · 双方都得会员天数", + "en": "Friend signs up · both earn days", + "ja": "友達が登録 · 双方に会員日数を付与", + "ko": "친구가 가입하면 · 양쪽 모두 회원 일수 획득", + "ru": "Друг регистрируется · оба получают дни подписки", + "es": "El amigo se registra · ambos ganan días" + }, + "inviteTitle": { + "zh": "邀请好友", + "en": "Invite friends", + "ja": "友達を招待", + "ko": "친구 초대", + "ru": "Пригласить друзей", + "es": "Invitar amigos" + }, + "inviteCodeLabel": { + "zh": "邀请码", + "en": "Invite code", + "ja": "招待コード", + "ko": "초대 코드", + "ru": "Код приглашения", + "es": "Código de invitación" + }, + "inviteLinkLabel": { + "zh": "邀请链接", + "en": "Invite link", + "ja": "招待リンク", + "ko": "초대 링크", + "ru": "Ссылка приглашения", + "es": "Enlace de invitación" + }, + "inviteCopyCode": { + "zh": "复制邀请码", + "en": "Copy code", + "ja": "コードをコピー", + "ko": "코드 복사", + "ru": "Скопировать код", + "es": "Copiar código" + }, + "inviteCopyLink": { + "zh": "复制链接", + "en": "Copy link", + "ja": "リンクをコピー", + "ko": "링크 복사", + "ru": "Скопировать ссылку", + "es": "Copiar enlace" + }, + "inviteRewardsTitle": { + "zh": "奖励规则", + "en": "Rewards", + "ja": "特典ルール", + "ko": "보상 규칙", + "ru": "Правила наград", + "es": "Reglas de recompensas" + }, + "inviteRewardRegister": { + "zh": "好友注册 · 双方各得 3 天", + "en": "Sign up · +3 days each", + "ja": "友達が登録 · 双方に3日間付与", + "ko": "친구 가입 · 양쪽 각 3일 지급", + "ru": "Регистрация друга · +3 дня каждому", + "es": "Registro de amigo · +3 días cada uno" + }, + "inviteRewardFirstBuy": { + "zh": "好友首购 · 双方各得 7 天", + "en": "First purchase · +7 days each", + "ja": "友達が初回購入 · 双方に7日間付与", + "ko": "친구 첫 구매 · 양쪽 각 7일 지급", + "ru": "Первая покупка друга · +7 дней каждому", + "es": "Primera compra del amigo · +7 días cada uno" + }, + "inviteRewardJoinTg": { + "zh": "加入 TG 频道 · 得 3 天", + "en": "Join TG · +3 days", + "ja": "TGチャンネルに参加 · 3日間付与", + "ko": "TG 채널 가입 · 3일 지급", + "ru": "Вступление в TG-канал · +3 дня", + "es": "Unirse al canal de TG · +3 días" + }, + "inviteProgressTitle": { + "zh": "我的奖励", + "en": "My rewards", + "ja": "獲得した特典", + "ko": "내 보상", + "ru": "Мои награды", + "es": "Mis recompensas" + }, + "inviteTasksTitle": { + "zh": "更多得会员", + "en": "More ways to earn", + "ja": "もっと会員特典を得る", + "ko": "더 많은 혜택 받기", + "ru": "Больше способов заработать", + "es": "Más formas de ganar" + }, + "inviteJoinTgTitle": { + "zh": "加入 Telegram 频道", + "en": "Join Telegram channel", + "ja": "Telegramチャンネルに参加", + "ko": "Telegram 채널 가입", + "ru": "Вступить в Telegram-канал", + "es": "Unirse al canal de Telegram" + }, + "inviteJoinTgBtn": { + "zh": "加入频道", + "en": "Join channel", + "ja": "チャンネルに参加", + "ko": "채널 가입", + "ru": "Вступить в канал", + "es": "Unirse al canal" + }, + "inviteVerifyBtn": { + "zh": "验证领取", + "en": "Verify & claim", + "ja": "確認して受け取る", + "ko": "확인하고 받기", + "ru": "Проверить и получить", + "es": "Verificar y reclamar" + }, + "inviteTaskDone": { + "zh": "已领 +3 天", + "en": "Claimed +3 days", + "ja": "受け取り済み +3日", + "ko": "수령 완료 +3일", + "ru": "Получено +3 дня", + "es": "Reclamado +3 días" + }, + "inviteStatInvited": { + "zh": "已邀请", + "en": "Invited", + "ja": "招待した人数", + "ko": "초대 수", + "ru": "Приглашено", + "es": "Invitados" + }, + "inviteStatConverted": { + "zh": "已转化", + "en": "Converted", + "ja": "転換した人数", + "ko": "전환 수", + "ru": "Конвертировано", + "es": "Convertidos" + }, + "inviteStatDays": { + "zh": "累计获赠(天)", + "en": "Days earned", + "ja": "累計獲得日数", + "ko": "누적 획득(일)", + "ru": "Всего получено (дней)", + "es": "Días acumulados" + }, + "inviteCodeFieldLabel": { + "zh": "邀请码(选填)", + "en": "Invite code (optional)", + "ja": "招待コード(任意)", + "ko": "초대 코드(선택)", + "ru": "Код приглашения (необязательно)", + "es": "Código de invitación (opcional)" + }, + "notifTitle": { + "zh": "通知", + "en": "Notifications", + "ja": "通知", + "ko": "알림", + "ru": "Уведомления", + "es": "Notificaciones" + }, + "notifEmpty": { + "zh": "暂无通知", + "en": "No notifications", + "ja": "通知はありません", + "ko": "알림이 없습니다", + "ru": "Пока нет уведомлений", + "es": "Aún no hay notificaciones" + }, + "notifTypeNews": { + "zh": "新闻", + "en": "News", + "ja": "ニュース", + "ko": "소식", + "ru": "Новости", + "es": "Noticias" + }, + "notifTypeFeature": { + "zh": "功能", + "en": "Feature", + "ja": "新機能", + "ko": "기능", + "ru": "Функции", + "es": "Función" + }, + "notifTypeImportant": { + "zh": "重要", + "en": "Important", + "ja": "重要", + "ko": "중요", + "ru": "Важное", + "es": "Importante" + }, + "notifTypeReward": { + "zh": "到账", + "en": "Credited", + "ja": "入金", + "ko": "적립", + "ru": "Начислено", + "es": "Acreditado" + }, + "notifTypeVersion": { + "zh": "版本", + "en": "Update", + "ja": "アップデート", + "ko": "업데이트", + "ru": "Обновление", + "es": "Actualización" + }, + "notifTypePromo": { + "zh": "活动", + "en": "Promo", + "ja": "キャンペーン", + "ko": "프로모션", + "ru": "Акция", + "es": "Promoción" + }, + "settingsGroupConn": { + "zh": "连接", + "en": "Connection", + "ja": "接続", + "ko": "연결", + "ru": "Подключение", + "es": "Conexión" + }, + "settingsGroupAppearance": { + "zh": "外观", + "en": "Appearance", + "ja": "外観", + "ko": "화면", + "ru": "Внешний вид", + "es": "Apariencia" + }, + "settingsGroupAbout": { + "zh": "关于", + "en": "About", + "ja": "このアプリについて", + "ko": "정보", + "ru": "О приложении", + "es": "Acerca de" + }, + "orderStatusExpired": { + "zh": "已过期", + "en": "Expired", + "ja": "期限切れ", + "ko": "만료됨", + "ru": "Истёк", + "es": "Caducado" + }, + "promoBadge": { + "zh": "限时优惠", + "en": "Limited-time offer", + "ja": "期間限定オファー", + "ko": "한정 특가", + "ru": "Спецпредложение", + "es": "Oferta especial" + }, + "promoOriginalPrice": { + "zh": "原价", + "en": "Was", + "ja": "通常価格", + "ko": "정가", + "ru": "Было", + "es": "Antes" + } + }, + "methods": { + "adRewarded": { + "args": "int minutes", + "tpl": { + "zh": "已加 $minutes 分钟", + "en": "+$minutes min added", + "ja": "+$minutes 分を追加しました", + "ko": "+$minutes분 추가됨", + "ru": "+$minutes мин добавлено", + "es": "+$minutes min añadidos" + } + }, + "nodeSwitchTitle": { + "args": "String name", + "tpl": { + "zh": "切换到「$name」?", + "en": "Switch to $name?", + "ja": "$name に切り替えますか?", + "ko": "$name(으)로 전환할까요?", + "ru": "Переключиться на $name?", + "es": "¿Cambiar a $name?" + } + }, + "autoConnectingTo": { + "args": "String name", + "tpl": { + "zh": "正在自动连接到 $name…", + "en": "Auto-connecting to $name…", + "ja": "$name に自動接続中…", + "ko": "$name(으)로 자동 연결 중…", + "ru": "Автоподключение к $name…", + "es": "Conectando automáticamente a $name…" + } + }, + "updateAvailableTitle": { + "args": "String version", + "tpl": { + "zh": "发现新版本 v$version", + "en": "New version v$version available", + "ja": "新しいバージョン v$version が利用可能です", + "ko": "새 버전 v$version 사용 가능", + "ru": "Доступна новая версия v$version", + "es": "Nueva versión v$version disponible" + } + }, + "codeSentTo": { + "args": "String email", + "tpl": { + "zh": "验证码已发送至 $email", + "en": "Code sent to $email", + "ja": "$email に確認コードを送信しました", + "ko": "$email(으)로 코드를 보냈습니다", + "ru": "Код отправлен на $email", + "es": "Código enviado a $email" + } + } + } +} \ No newline at end of file