feat(i18n): ③ 原型接单源 — I18N 块由 strings.json 生成,消除重复翻译

原型 design/prototype/screens/{ui-desktop,ui-mobile}.html 的 I18N 数据块不再手写,
改由 strings.json 生成(marker 包裹、生成器唯一写):
- alias.json:protoKey → flutterKey(产品串取单源 zh/en,单源赢);desktop 130 / mobile 143。
- overlay.json:原型专属(开发挡板 + app 没有的串,zh/en);desktop 98 / mobile 104。
- new-strings.json:4 个新产品串(分流规则/自定义/局域网直连/强制),6 语,已并入
  strings.json + app_text.dart 抽象声明 + 重生成 6 份 strings_*.dart。
- gen_proto_i18n.mjs:strings.json+alias+overlay → 两份 HTML 的 I18N 块;--check 只比对
  marker 块(unrelated HTML 编辑不误报)。
- check-proto-i18n.mjs:两份 HTML 所有 data-i18n key 的 zh/en 必须 resolve。
- ci/check-codegen-drift.sh:加原型 i18n 段(--check 漂移 + resolution 验收)。

同带入之前路由原型 WIP 的 i18n 收口:私有服务内置行→局域网/私网直连行、rr.* 接 data-i18n
(rr.lan→routingLanDirect 等)。路由页其余 UI(段选/添加规则页)仍为独立后续。

验收(自复核全绿):生成器跑通、data-i18n 0 unresolved、两生成器重生成零 diff、
flutter analyze lib/l10n 0 issue、flutter test 244 全绿、new-strings 无红线词。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A79VtQA1BwTuQN1ThpvYpo
This commit is contained in:
wangjia
2026-07-27 09:59:18 +08:00
parent f46191ef4d
commit 75d23023e3
16 changed files with 2139 additions and 264 deletions
+279
View File
@@ -0,0 +1,279 @@
{
"desktop": {
"nav.nodes": "tabServers",
"nav.stats": "tabStats",
"nav.settings": "settingsTitle",
"nav.orders": "ordersTitle",
"nav.notifications": "notifTitle",
"nav.invite": "inviteTitle",
"acc.buy": "purchaseTitle",
"acc.orders": "ordersTitle",
"acc.invite": "inviteEntry",
"acc.inviteSub": "inviteEntrySub",
"nt.title": "notifTitle",
"nt.tImportant": "notifTypeImportant",
"nt.tFeature": "notifTypeFeature",
"nt.tNews": "notifTypeNews",
"nt.tVersion": "notifTypeVersion",
"inv.title": "inviteTitle",
"inv.progHead": "inviteProgressTitle",
"inv.invited": "inviteStatInvited",
"inv.converted": "inviteStatConverted",
"inv.earned": "inviteStatDays",
"inv.tasksHead": "inviteTasksTitle",
"inv.tgTitle": "inviteJoinTgTitle",
"inv.tgJoinBtn": "inviteJoinTgBtn",
"inv.tgVerifyBtn": "inviteVerifyBtn",
"inv.tgDoneBtn": "inviteTaskDone",
"set.orders": "ordersTitle",
"ord.kOrderNo": "orderNoLabel",
"ord.kPlan": "orderPlanLabel",
"ord.kAmount": "orderAmountLabel",
"ord.kMethod": "orderMethodLabel",
"ord.kCreated": "orderCreatedLabel",
"ord.actContinue": "orderContinuePay",
"ord.actCancel": "cancelOrder",
"ord.actRefresh": "orderRefresh",
"ord.actBuyAgain": "orderRebuy",
"ord.copied": "copied",
"pur.channel": "payChannel",
"pur.chanUsdt": "payChannelUsdt",
"pur.chanCny": "payChannelCny",
"pur.pop": "mostPopular",
"pur.buy": "buyNow",
"pur.network": "payNetworkLabel",
"pur.address": "payAddressLabel",
"pur.cancel": "cancelOrder",
"pur.done": "payDone",
"pur.failTitle": "payFailed",
"brand.name": "brand",
"q.remain": "quotaToday",
"nodes.smart": "smartSelect",
"nodes.rec": "recommended",
"stats.month": "periodMonth",
"stats.week": "periodWeek",
"stats.today": "periodToday",
"stats.down": "statDown",
"stats.up": "statUp",
"stats.chart": "chartTwoWeeks",
"stats.allDevices": "allDevices",
"acc.info": "accInfoTitle",
"acc.change": "accChange",
"acc.myDevices": "myDevices",
"acc.lang": "language",
"acc.dark": "darkAppearance",
"acc.protocol": "protocol",
"acc.upgrade": "upgradeBtn",
"acc.logout": "signOut",
"set.redeem": "redeemTitle",
"set.redeemSub": "proMember",
"set.autostart": "autostart",
"set.autostartSub": "autostartSub",
"set.autoconnect": "autoConnect",
"set.autoconnectSub": "autoConnectSub",
"set.smart": "smartRoute",
"set.routeModeSmart": "smartRoute",
"set.lang": "language",
"set.dark": "darkAppearance",
"set.protocol": "protocol",
"set.grpAppear": "settingsGroupAppearance",
"set.grpAbout": "settingsGroupAbout",
"set.update": "checkUpdate",
"contact.web": "contactWebsite",
"contact.hoursTitle": "contactHoursTitle",
"contact.hours": "contactHours",
"dl.title": "deviceLimitTitle",
"dl.remove": "deviceLimitRemoveOldest",
"dl.logout": "signOut",
"dev.current": "thisDevice",
"dev.remove": "remove",
"dev.lastOnline": "devLastOnline",
"dev.mRename": "devRename",
"dev.mForceLogout": "devForceLogout",
"dev.mClearLogin": "devClearLogin",
"state.on": "stateOn",
"state.off": "followLight",
"nav.connect": "tabConnect",
"ord.kValid": "payExpiresAt",
"acc.email": "accEmail",
"acc.pwd": "accPassword",
"set.grpConn": "settingsGroupConn",
"contact.email": "contactEmail",
"login.email": "emailLabel",
"login.pwd": "pwLabel",
"login.signin": "doLogin",
"nav.contact": "contactEntry",
"nav.account": "tabMe",
"nav.purchase": "purchaseTitle",
"nav.devices": "myDevices",
"nav.redeem": "redeemCodeTitle",
"acc.redeem": "redeemCodeTitle",
"nt.tReward": "notifTypeReward",
"nt.tPromo": "notifTypePromo",
"inv.rewardsHead": "inviteRewardsTitle",
"rd.title": "redeemCodeTitle",
"rd.ph": "redeemPh",
"rd.btn": "redeemBtn",
"pur.amount": "payAmountLabel",
"pur.switch": "switchPayMethod",
"pur.okTitle": "paySucceeded",
"pur.retry": "payRetry",
"nodes.smartSub": "smartSub",
"stats.dur": "statDuration",
"acc.devices": "myDevices",
"set.smartSub": "smartRouteSub",
"set.kill": "killSwitch",
"set.killSub": "killSwitchSub",
"set.web": "webUserCenter",
"contact.intro": "contactIntro",
"login.signupTitle": "tabRegister",
"nav.routing": "routingRulesTitle",
"set.routing": "routingRulesTitle",
"set.routingSub": "routingRulesSub"
},
"mobile": {
"brandName": "brand",
"dlTitle": "deviceLimitTitle",
"dlRemoveLru": "deviceLimitRemoveOldest",
"dlRemove": "remove",
"dlOnline": "devOnline",
"navNodes": "tabServers",
"navStats": "tabStats",
"rateDown": "download",
"rateUp": "upload",
"latency": "latency",
"searchPh": "searchPh",
"smartTitle": "smartSelect",
"recommend": "recommended",
"periodMonth": "periodMonth",
"periodWeek": "periodWeek",
"periodToday": "periodToday",
"statDur": "statDuration",
"chartTwoWeeks": "chartTwoWeeks",
"upgrade": "upgradeBtn",
"renew": "upgradeBtn",
"secAccount": "accInfoTitle",
"accChange": "accChange",
"myDevices": "myDevices",
"thisDevice": "thisDevice",
"lastOnline": "devLastOnline",
"devRename": "devRename",
"devForceLogout": "devForceLogout",
"devClearLogin": "devClearLogin",
"prefLang": "language",
"prefTheme": "darkAppearance",
"prefProtocol": "protocol",
"followLight": "followLight",
"stateOn": "stateOn",
"navSettings": "settingsTitle",
"navRedeem": "redeemTitle",
"logout": "signOut",
"navOrders": "ordersTitle",
"ordDetailTitle": "orderDetailTitle",
"kOrderNo": "orderNoLabel",
"kPlan": "orderPlanLabel",
"kAmount": "orderAmountLabel",
"kMethod": "orderMethodLabel",
"kCreated": "orderCreatedLabel",
"actContinue": "orderContinuePay",
"actCancel": "cancelOrder",
"actRefresh": "orderRefresh",
"actBuyAgain": "orderRebuy",
"connOff": "connectNow",
"cbSubOn": "secure",
"stOff": "capOff",
"stDoing": "capConnecting",
"stOn": "capOn",
"pillOn": "secure",
"authRegister": "tabRegister",
"authTagline": "authTagline",
"authForgot": "forgotPw",
"authTos": "tos",
"authSendCode": "sendCode",
"authRegBtn": "tabRegister",
"devAll": "allDevices",
"planPop": "mostPopular",
"buyNow": "buyNow",
"payChannel": "payChannel",
"chanSwUsdt": "payChannelUsdt",
"chanSwCny": "payChannelCny",
"ordPlan": "orderPlanLabel",
"ordAmount": "orderAmountLabel",
"payNetwork": "payNetworkLabel",
"payAddr": "payAddressLabel",
"payCancel": "cancelOrder",
"purDone": "payDone",
"failTitle": "payFailed",
"rowBuyPlan": "purchaseTitle",
"inviteEntry": "inviteEntry",
"setLaunch": "autostart",
"setAutoConn": "autoConnect",
"setSmartRoute": "smartRoute",
"setGrpAppr": "settingsGroupAppearance",
"setGrpAbout": "settingsGroupAbout",
"setCheckUpdate": "checkUpdate",
"contactWeb": "contactWebsite",
"contactHours": "contactHoursTitle",
"navNotifications": "notifTitle",
"nt1Type": "notifTypeImportant",
"nt2Type": "notifTypeFeature",
"nt3Type": "notifTypeNews",
"nt5Type": "notifTypeVersion",
"inviteTitle": "inviteTitle",
"inviteHeadline": "inviteEntry",
"inviteCode": "inviteCodeLabel",
"inviteLink": "inviteLinkLabel",
"inviteRewards": "inviteRewardsTitle",
"inviteR1": "inviteRewardRegister",
"inviteProgress": "inviteProgressTitle",
"inviteStatInvited": "inviteStatInvited",
"inviteStatConverted": "inviteStatConverted",
"inviteStatDays": "inviteStatDays",
"inviteTasksTitle": "inviteTasksTitle",
"inviteJoinTgTitle": "inviteJoinTgTitle",
"inviteJoinTgBtn": "inviteJoinTgBtn",
"inviteVerifyBtn": "inviteVerifyBtn",
"inviteTaskDone": "inviteTaskDone",
"navConnect": "tabConnect",
"planFree": "planFreeTag",
"accEmail": "accEmail",
"accPassword": "accPassword",
"navContact": "contactEntry",
"kValid": "payExpiresAt",
"pillFree": "planFreeTag",
"authLogin": "tabLogin",
"authEmail": "emailLabel",
"authPassword": "pwLabel",
"authLoginBtn": "doLogin",
"setGrpConn": "settingsGroupConn",
"contactEmail": "emailLabel",
"navAccount": "tabMe",
"smartSub": "smartSub",
"devMgmt": "myDevices",
"navDevices": "myDevices",
"navWebUC": "webUserCenter",
"authCode": "codeLabel",
"purTitle": "purchaseTitle",
"purCheckout": "paymentTitle",
"perMo": "perMonthSuffix",
"ordUntil": "payExpiresAt",
"payAmount": "payAmountLabel",
"payOpenAlipay": "openAlipay",
"paySwitch": "switchPayMethod",
"succTitle": "paySucceeded",
"purRetry": "payRetry",
"setKill": "killSwitch",
"contactHoursVal": "contactHours",
"nt4Type": "notifTypeReward",
"nt6Type": "notifTypePromo",
"inviteEntrySub": "inviteEntrySub",
"inviteR2": "inviteRewardFirstBuy",
"inviteR3": "inviteRewardJoinTg",
"navRedeemCode": "redeemCodeTitle",
"redeemPh": "redeemPh",
"redeemBtn": "redeemBtn",
"navRouting": "routingRulesTitle",
"rr.lan": "routingLanDirect",
"rr.lanSub": "routingLanForced"
}
}
+34
View File
@@ -0,0 +1,34 @@
{
"routingRulesTitle": {
"zh": "分流规则",
"en": "Routing rules",
"ja": "ルーティングルール",
"ko": "라우팅 규칙",
"ru": "Правила маршрутизации",
"es": "Reglas de enrutamiento"
},
"routingRulesSub": {
"zh": "自定义直连 / 走隧道 / 拒绝",
"en": "Custom direct / tunnel / reject",
"ja": "直接接続 / トンネル / 拒否をカスタム",
"ko": "직접 연결 / 터널 / 거부 사용자 지정",
"ru": "Настройка: напрямую / туннель / отклонить",
"es": "Personalizar: directo / túnel / rechazar"
},
"routingLanDirect": {
"zh": "局域网 / 私网直连",
"en": "LAN & private direct",
"ja": "LAN・プライベート直接接続",
"ko": "LAN / 사설망 직접 연결",
"ru": "Локальная и частная сеть напрямую",
"es": "LAN y red privada directas"
},
"routingLanForced": {
"zh": "强制,不可关",
"en": "Always on",
"ja": "常時オン",
"ko": "항상 켜짐",
"ru": "Всегда включено",
"es": "Siempre activo"
}
}
+814
View File
@@ -0,0 +1,814 @@
{
"desktop": {
"acc.billing": {
"zh": "购买 & 订单 & 兑换",
"en": "Buy · Orders · Redeem"
},
"acc.buySub": {
"zh": "升级 PRO 会员",
"en": "Upgrade to PRO"
},
"acc.ordersSub": {
"zh": "查看订单记录",
"en": "View order history"
},
"acc.redeemSub": {
"zh": "输入激活码开通",
"en": "Activate with a code"
},
"nt.back": {
"zh": "返回",
"en": "Back"
},
"nt.n1t": {
"zh": "服务条款与隐私政策更新",
"en": "Terms & privacy policy updated"
},
"nt.n1s": {
"zh": "我们更新了服务条款,请查阅最新内容。",
"en": "We have updated our terms — please review the latest version."
},
"nt.n2t": {
"zh": "新增日本 · 大阪加速线路",
"en": "New Japan · Osaka lines added"
},
"nt.n2s": {
"zh": "三条低延迟线路已上线,欢迎体验。",
"en": "Three low-latency lines are now live."
},
"nt.n3t": {
"zh": "邀请好友活动进行中",
"en": "Invite-a-friend event is live"
},
"nt.n3s": {
"zh": "邀请好友注册,双方都可获得会员天数。",
"en": "Invite friends to sign up — both sides earn membership days."
},
"nt.n1full": {
"zh": "本次更新新增数据留存与第三方共享条款说明,不影响现有账户与订阅权益,建议登录网页用户中心查看完整版本。",
"en": "This update adds details on data retention and third-party sharing. It does not affect your existing account or subscription — please review the full version in the web user center."
},
"nt.n4t": {
"zh": "邀请奖励 +3 天已到账",
"en": "Referral reward: +3 days credited"
},
"nt.n4s": {
"zh": "好友已完成注册,会员天数已计入你的账户。",
"en": "Your friend has completed sign-up — the days have been added to your account."
},
"nt.n5t": {
"zh": "v1.0.73 已发布",
"en": "v1.0.73 is out"
},
"nt.n5s": {
"zh": "修复已知问题,建议尽快更新。",
"en": "Bug fixes included — update is recommended."
},
"nt.updateBtn": {
"zh": "去更新",
"en": "Update now"
},
"nt.n6t": {
"zh": "¥6 月付优惠上线",
"en": "¥6/mo promo is live"
},
"nt.n6s": {
"zh": "限时活动,PRO 月付低至 ¥6,先到先得。",
"en": "Limited-time offer — PRO monthly as low as ¥6, while it lasts."
},
"inv.back": {
"zh": "返回",
"en": "Back"
},
"inv.lead": {
"zh": "分享你的邀请码或链接,好友注册后双方都得会员天数。",
"en": "Share your code or link — when a friend signs up, both of you earn membership days."
},
"inv.r1": {
"zh": "好友注册",
"en": "Friend signs up"
},
"inv.r1s": {
"zh": "双方各得 3 天",
"en": "Both earn 3 days each"
},
"inv.r2": {
"zh": "好友首次购买",
"en": "Friend first purchase"
},
"inv.r2s": {
"zh": "双方各得 7 天",
"en": "Both earn 7 days each"
},
"inv.r3": {
"zh": "加入 TG 频道",
"en": "Join the TG channel"
},
"inv.r3s": {
"zh": "获得 3 天",
"en": "Earn 3 days"
},
"inv.tgSub": {
"zh": "+3 天",
"en": "+3 days"
},
"inv.tgDemoPending": {
"zh": "演示态 · 待验证",
"en": "Demo · pending"
},
"inv.tgDemoDone": {
"zh": "演示态 · 已领取",
"en": "Demo · claimed"
},
"rd.back": {
"zh": "返回",
"en": "Back"
},
"rd.label": {
"zh": "兑换码",
"en": "Redemption code"
},
"rd.hint": {
"zh": "输入卡密即可激活对应时长,激活后立即生效。",
"en": "Enter a code to instantly activate plan time."
},
"set.ordersSub": {
"zh": "查看订单记录",
"en": "View order history"
},
"ord.back": {
"zh": "返回",
"en": "Back"
},
"ord.details": {
"zh": "明细",
"en": "Details"
},
"ord.kStatus": {
"zh": "状态",
"en": "Status"
},
"ord.kDeadline": {
"zh": "支付截止",
"en": "Pay before"
},
"ord.kTrade": {
"zh": "交易流水号",
"en": "Trade No."
},
"ord.actMembership": {
"zh": "查看会员",
"en": "View membership"
},
"pur.aliScan": {
"zh": "用支付宝扫码支付",
"en": "Scan with Alipay to pay"
},
"pur.back": {
"zh": "返回",
"en": "Back"
},
"pur.proIncludes": {
"zh": "PRO 全部特性",
"en": "Everything in PRO"
},
"pur.f1": {
"zh": "不限时长 · 不限流量",
"en": "Unlimited time & data"
},
"pur.f2": {
"zh": "80+ 全球加速线路",
"en": "80+ global lines"
},
"pur.f3": {
"zh": "5 台设备同时在线",
"en": "5 devices at once"
},
"pur.f4": {
"zh": "优先客服支持",
"en": "Priority support"
},
"pur.month": {
"zh": "按月",
"en": "Monthly"
},
"pur.quarter": {
"zh": "按季",
"en": "Quarterly"
},
"pur.year": {
"zh": "按年",
"en": "Yearly"
},
"pur.usdtHint": {
"zh": "请按精确金额(含小数末位)转账,金额用于自动对账识别,多退少不到账。",
"en": "Send the exact amount (incl. trailing decimals) — it is used to auto-match your order."
},
"pur.alipayHint": {
"zh": "付款后自动开通,无需手动确认。",
"en": "Activated automatically after payment — no manual confirmation needed."
},
"pur.waitCrypto": {
"zh": "等待到账确认…",
"en": "Waiting for confirmation…"
},
"pur.waitAlipay": {
"zh": "等待付款确认…",
"en": "Waiting for payment…"
},
"pur.demo": {
"zh": "评审演示",
"en": "Review demo"
},
"pur.simPaid": {
"zh": "▸ 模拟到账",
"en": "▸ Simulate paid"
},
"pur.simFail": {
"zh": "▸ 模拟失败",
"en": "▸ Simulate failure"
},
"pur.failSub": {
"zh": "订单已超时,请重试",
"en": "Order timed out, please retry"
},
"plan.free": {
"zh": "免费版",
"en": "Free"
},
"q.zero": {
"zh": "0 分钟",
"en": "0 min"
},
"nodes.search": {
"zh": "搜索加速线路…",
"en": "Search lines…"
},
"nodes.stream": {
"zh": "流媒体",
"en": "Streaming"
},
"nodes.hk": {
"zh": "香港 · 优选",
"en": "Hong Kong · Premium"
},
"nodes.jp": {
"zh": "日本 · 东京",
"en": "Japan · Tokyo"
},
"nodes.sg": {
"zh": "新加坡",
"en": "Singapore"
},
"nodes.us": {
"zh": "美国 · 洛杉矶",
"en": "US · Los Angeles"
},
"nodes.de": {
"zh": "德国 · 法兰克福",
"en": "Germany · Frankfurt"
},
"nodes.unavail": {
"zh": "暂不可用",
"en": "Unavailable"
},
"acc.pref": {
"zh": "偏好",
"en": "Preferences"
},
"acc.myDevicesSub": {
"zh": "重命名 · 强制下线 · 移除",
"en": "Rename · force offline · remove"
},
"ub.title": {
"zh": "发现新版本 v2.5.0,建议更新",
"en": "New version v2.5.0 available"
},
"ub.cta": {
"zh": "立即更新",
"en": "Update"
},
"dl.desc": {
"zh": "你的套餐最多 5 台设备,请移除一台以继续。",
"en": "Your plan allows up to 5 devices. Remove one to continue."
},
"dev.back": {
"zh": "返回",
"en": "Back"
},
"dev.now": {
"zh": "刚刚",
"en": "just now"
},
"dev.h2": {
"zh": "2 小时前",
"en": "2h ago"
},
"dev.yesterday": {
"zh": "昨天",
"en": "yesterday"
},
"dev.tRenamed": {
"zh": "已重命名(演示)",
"en": "Renamed (demo)"
},
"dev.tLoggedOut": {
"zh": "已强制退出(演示)",
"en": "Force logged out (demo)"
},
"dev.tCleared": {
"zh": "已清除登录信息(演示)",
"en": "Login info cleared (demo)"
},
"demo.theme": {
"zh": "主题",
"en": "Theme"
},
"demo.light": {
"zh": "明",
"en": "Light"
},
"demo.dark": {
"zh": "暗",
"en": "Dark"
},
"demo.lang": {
"zh": "语言",
"en": "Language"
},
"demo.persp": {
"zh": "视角",
"en": "Perspective"
},
"demo.upd": {
"zh": "更新条",
"en": "Banner"
},
"demo.show": {
"zh": "显",
"en": "On"
},
"demo.hide": {
"zh": "隐",
"en": "Off"
},
"demo.gate": {
"zh": "挡板",
"en": "Gate"
},
"demo.deviceLimit": {
"zh": "设备超限",
"en": "Device limit"
},
"login.frame": {
"zh": "分屏卡 · 品牌左 / 表单右",
"en": "Split card · brand left / form right"
},
"login.note": {
"zh": "(独立静态屏,不并入交互窗口)",
"en": "(standalone static screen, outside the interactive window)"
},
"login.slogan": {
"zh": "极速畅连 · 稳定加速线路<br>隐私保护 · 全程无日志",
"en": "Fast & stable lines<br>Privacy protected · No logs"
},
"login.title": {
"zh": "登录账户",
"en": "Sign in"
},
"login.signup": {
"zh": "没有账户?免费注册",
"en": "No account? Sign up free"
},
"login.pwd2": {
"zh": "确认密码",
"en": "Confirm password"
},
"login.signupBtn": {
"zh": "免费注册",
"en": "Sign up free"
},
"login.haveAccount": {
"zh": "已有账户?登录",
"en": "Have an account? Sign in"
}
},
"mobile": {
"brandLatin": {
"zh": "Pangolin",
"en": ""
},
"demoTheme": {
"zh": "主题",
"en": "Theme"
},
"demoLang": {
"zh": "语言",
"en": "Language"
},
"demoView": {
"zh": "视角",
"en": "View"
},
"demoUpdate": {
"zh": "更新",
"en": "Update"
},
"demoGate": {
"zh": "挡板",
"en": "Gate"
},
"demoDeviceLimit": {
"zh": "设备超限",
"en": "Device limit"
},
"dlDesc": {
"zh": "你的账户最多可同时登录 5 台设备,请移除一台后继续。",
"en": "Your account allows up to 5 devices at once. Remove one to continue."
},
"segLight": {
"zh": "明",
"en": "Light"
},
"segDark": {
"zh": "暗",
"en": "Dark"
},
"segFree": {
"zh": "免费版",
"en": "Free"
},
"segPro": {
"zh": "PRO",
"en": "PRO"
},
"segShow": {
"zh": "显示",
"en": "Show"
},
"segHide": {
"zh": "隐藏",
"en": "Hide"
},
"disconnect": {
"zh": "断开连接",
"en": "Disconnect"
},
"nHKt": {
"zh": "香港 01",
"en": "Hong Kong 01"
},
"nJPt": {
"zh": "日本 · 东京 02",
"en": "Japan · Tokyo 02"
},
"nSGt": {
"zh": "新加坡 01",
"en": "Singapore 01"
},
"nUSt": {
"zh": "美国 · 洛杉矶 03",
"en": "USA · Los Angeles 03"
},
"nTWt": {
"zh": "台湾 01",
"en": "Taiwan 01"
},
"tagStream": {
"zh": "流媒体",
"en": "Streaming"
},
"tagLowLat": {
"zh": "低延迟",
"en": "Low latency"
},
"tagStable": {
"zh": "高速稳定",
"en": "Fast & stable"
},
"tagDistant": {
"zh": "远距离",
"en": "Distant"
},
"maintenance": {
"zh": "维护中",
"en": "Maintenance"
},
"unavail": {
"zh": "不可用",
"en": "Unavailable"
},
"statDownArr": {
"zh": "↓ 下行",
"en": "↓ Down"
},
"statUpArr": {
"zh": "↑ 上行",
"en": "↑ Up"
},
"planProMeta": {
"zh": "PRO 会员 · 2027-07-11",
"en": "PRO member · 2027-07-11"
},
"devFreeLbl": {
"zh": "我的设备 · 1 / 1 台",
"en": "My devices · 1 / 1"
},
"devProLbl": {
"zh": "我的设备 · 3 / 5 台",
"en": "My devices · 3 / 5"
},
"secDevices": {
"zh": "设备",
"en": "Devices"
},
"devOnlineNow": {
"zh": "当前在线",
"en": "Online now"
},
"rel2h": {
"zh": "2 小时前",
"en": "2h ago"
},
"relYday": {
"zh": "昨天",
"en": "yesterday"
},
"devRenamedToast": {
"zh": "已重命名(演示)",
"en": "Renamed (demo)"
},
"devLoggedOutToast": {
"zh": "已强制退出(演示)",
"en": "Force logged out (demo)"
},
"devClearedToast": {
"zh": "已清除登录信息(演示)",
"en": "Login info cleared (demo)"
},
"secPref": {
"zh": "偏好",
"en": "Preferences"
},
"secMore": {
"zh": "更多",
"en": "More"
},
"rr.forced": {
"zh": "🔒",
"en": "🔒"
},
"ordSecDetail": {
"zh": "明细",
"en": "Details"
},
"kStatus": {
"zh": "状态",
"en": "Status"
},
"kDeadline": {
"zh": "支付截止",
"en": "Pay before"
},
"kTrade": {
"zh": "交易流水号",
"en": "Trade No."
},
"actMembership": {
"zh": "查看会员",
"en": "View membership"
},
"updateTitle": {
"zh": "发现新版本 v1.1.0",
"en": "New version v1.1.0"
},
"updateCta": {
"zh": "更新",
"en": "Update"
},
"connDoing": {
"zh": "连接中",
"en": "Connecting"
},
"pillDoing": {
"zh": "连接中",
"en": "Connecting"
},
"pillOffPro": {
"zh": "未连接",
"en": "Not connected"
},
"toastUpdate": {
"zh": "演示:前往应用商店更新",
"en": "Demo: go to store to update"
},
"authEmailPh": {
"zh": "you@example.com",
"en": "you@example.com"
},
"authCodePh": {
"zh": "6 位验证码",
"en": "6-digit code"
},
"authSetPw": {
"zh": "设置密码",
"en": "Set password"
},
"authSetPwPh": {
"zh": "至少 6 位",
"en": "At least 6 characters"
},
"statsFilterLbl": {
"zh": "设备",
"en": "Device"
},
"proIncludes": {
"zh": "所有套餐均含",
"en": "All plans include"
},
"featSupport": {
"zh": "优先客服",
"en": "Priority support"
},
"planMonth": {
"zh": "按月",
"en": "Monthly"
},
"planQuarter": {
"zh": "按季",
"en": "Quarterly"
},
"planYear": {
"zh": "按年",
"en": "Yearly"
},
"featUnlimited": {
"zh": "不限时长 · 不限流量",
"en": "Unlimited time & data"
},
"feat80": {
"zh": "80+ 全球加速线路",
"en": "80+ global nodes"
},
"feat5": {
"zh": "5 台设备同时在线",
"en": "5 devices at once"
},
"chanUsdt": {
"zh": "加密货币 · USDT",
"en": "Crypto · USDT"
},
"chanCny": {
"zh": "支付宝 · 人民币",
"en": "Alipay · CNY"
},
"payHintCryptoTpl": {
"zh": "请转账 {amt} USDT(含小数末位),金额用于自动对账识别,多退少不到账。",
"en": "Send exactly {amt} USDT (including the last decimals) — the amount is used for automatic reconciliation."
},
"payHintAlipay": {
"zh": "将跳转至支付宝完成付款,付款后自动返回本页并开通。",
"en": "You will be redirected to Alipay; after payment you return here and get activated."
},
"payWaitCrypto": {
"zh": "等待到账确认…",
"en": "Waiting for confirmation…"
},
"payWaitAlipay": {
"zh": "等待付款确认…",
"en": "Waiting for payment…"
},
"demoReview": {
"zh": "评审演示",
"en": "Demo"
},
"demoPaid": {
"zh": "▸ 模拟到账",
"en": "▸ Simulate paid"
},
"demoFailed": {
"zh": "▸ 模拟失败",
"en": "▸ Simulate failure"
},
"succSubTpl": {
"zh": "PRO{name})有效期至 {date}",
"en": "PRO ({name}) · valid until {date}"
},
"failSub": {
"zh": "订单已超时,请重试",
"en": "Order timed out, please retry"
},
"toastCopied": {
"zh": "已复制:{v}",
"en": "Copied: {v}"
},
"toastAlipay": {
"zh": "已拉起支付宝(演示)",
"en": "Opened Alipay (demo)"
},
"secBilling": {
"zh": "购买 · 订单 · 兑换",
"en": "Buy · Orders · Redeem"
},
"secInvite": {
"zh": "推广",
"en": "Referral"
},
"secGeneral": {
"zh": "通用",
"en": "General"
},
"notiFoot": {
"zh": "仅显示最近通知(演示占位)",
"en": "Recent notifications only (demo)"
},
"nt1Title": {
"zh": "服务条款与隐私政策更新",
"en": "Terms & privacy policy updated"
},
"nt1Sub": {
"zh": "我们更新了服务条款,请查阅最新内容。",
"en": "We have updated our terms — please review the latest version."
},
"nt1Full": {
"zh": "本次更新新增数据留存与第三方共享条款说明,不影响现有账户与订阅权益,建议登录网页用户中心查看完整版本。",
"en": "This update adds details on data retention and third-party sharing. It does not affect your existing account or subscription — please review the full version in the web user center."
},
"nt2Title": {
"zh": "新增日本 · 大阪加速线路",
"en": "New Japan · Osaka lines added"
},
"nt2Sub": {
"zh": "三条低延迟线路已上线,欢迎体验。",
"en": "Three low-latency lines are now live."
},
"nt3Title": {
"zh": "邀请好友活动进行中",
"en": "Invite-a-friend event is live"
},
"nt3Sub": {
"zh": "邀请好友注册,双方都可获得会员天数。",
"en": "Invite friends to sign up — both sides earn membership days."
},
"nt4Title": {
"zh": "邀请奖励 +3 天已到账",
"en": "Referral reward: +3 days credited"
},
"nt4Sub": {
"zh": "好友已完成注册,会员天数已计入你的账户。",
"en": "Your friend has completed sign-up — the days have been added to your account."
},
"nt5Title": {
"zh": "v1.0.73 已发布",
"en": "v1.0.73 is out"
},
"nt5Sub": {
"zh": "修复已知问题,建议尽快更新。",
"en": "Bug fixes included — update is recommended."
},
"nt5Btn": {
"zh": "去更新",
"en": "Update now"
},
"nt6Title": {
"zh": "¥6 月付优惠上线",
"en": "¥6/mo promo is live"
},
"nt6Sub": {
"zh": "限时活动,PRO 月付低至 ¥6,先到先得。",
"en": "Limited-time offer — PRO monthly as low as ¥6, while it lasts."
},
"inviteLede": {
"zh": "好友注册、首购、加入社区,双方都各得订阅天数。",
"en": "When friends sign up, buy, or join the community, both of you earn plan days."
},
"inviteProgressSub": {
"zh": "已邀请 2 位好友,累计获得 6 天会员(演示占位)",
"en": "Invited 2 friends · earned 6 days (demo)"
},
"inviteShare": {
"zh": "分享邀请链接",
"en": "Share invite link"
},
"inviteTgSub": {
"zh": "+3 天",
"en": "+3 days"
},
"inviteTgDemoPending": {
"zh": "演示态 · 待验证",
"en": "Demo · pending"
},
"inviteTgDemoDone": {
"zh": "演示态 · 已领取",
"en": "Demo · claimed"
},
"redeemLabel": {
"zh": "兑换码",
"en": "Redemption code"
},
"redeemHint": {
"zh": "输入卡密即可激活对应时长,激活后立即生效。",
"en": "Enter a code to instantly activate plan time."
}
}
}
+218 -108
View File
@@ -750,7 +750,6 @@
<div class="card card-flush" style="margin-bottom:var(--space-5)">
<div class="setting-row"><span class="icon-box"><svg><use href="#i-globe"/></svg></span><div class="st-body"><div class="st-title">国内直连</div><div class="st-sub">GeoIP / GeoSite CN</div></div><span class="st-trail"><button class="toggle is-on"><i></i></button></span></div>
<div class="setting-row"><span class="icon-box"><svg><use href="#i-home"/></svg></span><div class="st-body"><div class="st-title">局域网 / 私网直连</div><div class="st-sub">强制,不可关</div></div><span class="st-trail"><span class="pill is-neutral">🔒 强制</span></span></div>
<div class="setting-row"><span class="icon-box"><svg><use href="#i-shield"/></svg></span><div class="st-body"><div class="st-title">私有服务走隧道</div><div class="st-sub">服务端下发</div></div><span class="st-trail"><span class="pill is-neutral">🔒 服务端</span></span></div>
</div>
<div class="sec-label">我的规则 · 有序,首命中生效</div>
<div class="card card-flush" style="margin-bottom:var(--space-4)">
@@ -1174,127 +1173,238 @@
<script>
/* ========= i18n 字典(产品内单显中/ENlangsel 6 语为显示层) ========= */
// <<<gen-i18n>>> 由 design/codegen/gen_proto_i18n.mjs 生成(单源 design/i18n/strings.json + i18n/{alias,overlay}.json),勿手改
var I18N = {
'nav.connect':{zh:'连接',en:'Connect'}, 'nav.nodes':{zh:'节点',en:'Nodes'},
'nav.stats':{zh:'统计',en:'Stats'}, 'nav.settings':{zh:'设置',en:'Settings'},
'nav.contact':{zh:'联系',en:'Contact'}, 'nav.account':{zh:'账户',en:'Account'},
'nav.purchase':{zh:'升级 PRO',en:'Upgrade PRO'},
'nav.orders':{zh:'我的订单',en:'Orders'},
'nav.account':{zh:'账户',en:'Account'},
'nav.notifications':{zh:'通知',en:'Notifications'}, 'nav.invite':{zh:'邀请好友',en:'Invite friends'},
'nav.devices':{zh:'设备管理',en:'Devices'}, 'nav.redeem':{zh:'兑换码',en:'Redeem code'},
'acc.billing':{zh:'购买 & 订单 & 兑换',en:'Buy · Orders · Redeem'},
'acc.buy':{zh:'购买套餐',en:'Buy a plan'}, 'acc.buySub':{zh:'升级 PRO 会员',en:'Upgrade to PRO'},
'acc.orders':{zh:'我的订单',en:'My orders'}, 'acc.ordersSub':{zh:'查看订单记录',en:'View order history'},
'acc.redeem':{zh:'兑换码',en:'Redeem code'}, 'acc.redeemSub':{zh:'输入激活码开通',en:'Activate with a code'},
'acc.invite':{zh:'邀请好友得会员',en:'Invite friends, earn membership'}, 'acc.inviteSub':{zh:'好友注册 · 双方都得会员天数',en:'Both sides earn membership days'},
'nt.back':{zh:'返回',en:'Back'}, 'nt.title':{zh:'通知',en:'Notifications'},
'nt.tImportant':{zh:'重要',en:'Important'}, 'nt.tFeature':{zh:'功能',en:'Feature'}, 'nt.tNews':{zh:'新闻',en:'News'},
'nt.n1t':{zh:'服务条款与隐私政策更新',en:'Terms & privacy policy updated'}, 'nt.n1s':{zh:'我们更新了服务条款,请查阅最新内容。',en:'We have updated our terms — please review the latest version.'},
'nt.n2t':{zh:'新增日本 · 大阪加速线路',en:'New Japan · Osaka lines added'}, 'nt.n2s':{zh:'三条低延迟线路已上线,欢迎体验。',en:'Three low-latency lines are now live.'},
'nt.n3t':{zh:'邀请好友活动进行中',en:'Invite-a-friend event is live'}, 'nt.n3s':{zh:'邀请好友注册双方都可获得会员天数',en:'Invite friends to sign up both sides earn membership days.'},
'nt.tReward':{zh:'奖励',en:'Reward'}, 'nt.tVersion':{zh:'版本',en:'Version'}, 'nt.tPromo':{zh:'优惠',en:'Promo'},
'nt.n1full':{zh:'本次更新新增数据留存与第三方共享条款说明,不影响现有账户与订阅权益,建议登录网页用户中心查看完整版本。',en:'This update adds details on data retention and third-party sharing. It does not affect your existing account or subscription — please review the full version in the web user center.'},
'nt.n4t':{zh:'邀请奖励 +3 天已到账',en:'Referral reward: +3 days credited'}, 'nt.n4s':{zh:'好友已完成注册,会员天数已计入你的账户。',en:'Your friend has completed sign-up — the days have been added to your account.'},
'nt.n5t':{zh:'v1.0.73 已发布',en:'v1.0.73 is out'}, 'nt.n5s':{zh:'修复已知问题,建议尽快更新。',en:'Bug fixes included — update is recommended.'}, 'nt.updateBtn':{zh:'去更新',en:'Update now'},
'nt.n6t':{zh:'¥6 月付优惠上线',en:'¥6/mo promo is live'}, 'nt.n6s':{zh:'限时活动,PRO 月付低至 ¥6,先到先得。',en:'Limited-time offer — PRO monthly as low as ¥6, while it lasts.'},
'inv.back':{zh:'返回',en:'Back'}, 'inv.title':{zh:'邀请好友',en:'Invite friends'},
'acc.buy':{zh:'购买套餐',en:'Purchase'},
'acc.buySub':{zh:'升级 PRO 会员',en:'Upgrade to PRO'},
'acc.change':{zh:'修改',en:'Change'},
'acc.dark':{zh:'深色外观',en:'Dark appearance'},
'acc.devices':{zh:'我的设备',en:'My devices'},
'acc.email':{zh:'邮箱',en:'Email'},
'acc.info':{zh:'账户信息',en:'Account info'},
'acc.invite':{zh:'邀请好友得会员',en:'Invite friends, earn membership'},
'acc.inviteSub':{zh:'好友注册 · 双方都得会员天数',en:'Friend signs up · both earn days'},
'acc.lang':{zh:'语言',en:'Language'},
'acc.logout':{zh:'退出登录',en:'Sign out'},
'acc.myDevices':{zh:'我的设备',en:'My devices'},
'acc.myDevicesSub':{zh:'重命名 · 强制下线 · 移除',en:'Rename · force offline · remove'},
'acc.orders':{zh:'我的订单',en:'My orders'},
'acc.ordersSub':{zh:'查看订单记录',en:'View order history'},
'acc.pref':{zh:'偏好',en:'Preferences'},
'acc.protocol':{zh:'协议',en:'Protocol'},
'acc.pwd':{zh:'密码',en:'Password'},
'acc.redeem':{zh:'兑换激活码',en:'Redeem a code'},
'acc.redeemSub':{zh:'输入激活码开通',en:'Activate with a code'},
'acc.upgrade':{zh:'续费 / 升级',en:'Renew / Upgrade'},
'brand.name':{zh:'穿山甲',en:'Pangolin'},
'contact.email':{zh:'邮箱客服',en:'Email support'},
'contact.hours':{zh:'每日 9:00 24:00 (GMT+8)',en:'Daily 9:00 24:00 (GMT+8)'},
'contact.hoursTitle':{zh:'服务时间',en:'Support hours'},
'contact.intro':{zh:'遇到问题?通过以下任一渠道联系我们,通常数分钟内回复。',en:'Need help? Reach us via any channel below — usually replies in minutes.'},
'contact.web':{zh:'官网',en:'Website'},
'demo.dark':{zh:'暗',en:'Dark'},
'demo.deviceLimit':{zh:'设备超限',en:'Device limit'},
'demo.gate':{zh:'挡板',en:'Gate'},
'demo.hide':{zh:'隐',en:'Off'},
'demo.lang':{zh:'语言',en:'Language'},
'demo.light':{zh:'明',en:'Light'},
'demo.persp':{zh:'视角',en:'Perspective'},
'demo.show':{zh:'显',en:'On'},
'demo.theme':{zh:'主题',en:'Theme'},
'demo.upd':{zh:'更新条',en:'Banner'},
'dev.back':{zh:'返回',en:'Back'},
'dev.current':{zh:'本机',en:'This device'},
'dev.h2':{zh:'2 小时前',en:'2h ago'},
'dev.lastOnline':{zh:'最后在线',en:'Last online'},
'dev.mClearLogin':{zh:'清除登录信息',en:'Clear login info'},
'dev.mForceLogout':{zh:'强制退出',en:'Force logout'},
'dev.mRename':{zh:'重命名',en:'Rename'},
'dev.now':{zh:'刚刚',en:'just now'},
'dev.remove':{zh:'移除',en:'Remove'},
'dev.tCleared':{zh:'已清除登录信息(演示)',en:'Login info cleared (demo)'},
'dev.tLoggedOut':{zh:'已强制退出(演示)',en:'Force logged out (demo)'},
'dev.tRenamed':{zh:'已重命名(演示)',en:'Renamed (demo)'},
'dev.yesterday':{zh:'昨天',en:'yesterday'},
'dl.desc':{zh:'你的套餐最多 5 台设备,请移除一台以继续。',en:'Your plan allows up to 5 devices. Remove one to continue.'},
'dl.logout':{zh:'退出登录',en:'Sign out'},
'dl.remove':{zh:'移除最久未用',en:'Remove least recently used'},
'dl.title':{zh:'设备数已达上限',en:'Device limit reached'},
'inv.back':{zh:'返回',en:'Back'},
'inv.converted':{zh:'已转化',en:'Converted'},
'inv.earned':{zh:'累计获赠(天)',en:'Days earned'},
'inv.invited':{zh:'已邀请',en:'Invited'},
'inv.lead':{zh:'分享你的邀请码或链接,好友注册后双方都得会员天数。',en:'Share your code or link — when a friend signs up, both of you earn membership days.'},
'inv.rewardsHead':{zh:'奖励说明 · 双方都得',en:'Rewards · both sides earn'},
'inv.r1':{zh:'好友注册',en:'Friend signs up'}, 'inv.r1s':{zh:'双方各得 3 天',en:'Both earn 3 days each'},
'inv.r2':{zh:'好友首次购买',en:'Friend first purchase'}, 'inv.r2s':{zh:'双方各得 7 天',en:'Both earn 7 days each'},
'inv.r3':{zh:'加入 TG 频道',en:'Join the TG channel'}, 'inv.r3s':{zh:'获得 3 天',en:'Earn 3 days'},
'inv.progHead':{zh:'我的奖励',en:'My rewards'},
'inv.invited':{zh:'已邀请',en:'Friends invited'}, 'inv.converted':{zh:'已转化',en:'Converted'}, 'inv.earned':{zh:'累计获赠(天)',en:'Days earned'},
'inv.r1':{zh:'好友注册',en:'Friend signs up'},
'inv.r1s':{zh:'双方各得 3 天',en:'Both earn 3 days each'},
'inv.r2':{zh:'好友首次购买',en:'Friend first purchase'},
'inv.r2s':{zh:'双方各得 7 天',en:'Both earn 7 days each'},
'inv.r3':{zh:'加入 TG 频道',en:'Join the TG channel'},
'inv.r3s':{zh:'获得 3 天',en:'Earn 3 days'},
'inv.rewardsHead':{zh:'奖励规则',en:'Rewards'},
'inv.tasksHead':{zh:'更多得会员',en:'More ways to earn'},
'inv.tgTitle':{zh:'加入 Telegram 频道',en:'Join Telegram channel'}, 'inv.tgSub':{zh:'+3 天',en:'+3 days'},
'inv.tgJoinBtn':{zh:'加入频道',en:'Join channel'}, 'inv.tgVerifyBtn':{zh:'验证领取',en:'Verify & claim'}, 'inv.tgDoneBtn':{zh:'已领 +3 天',en:'Claimed +3 days'},
'inv.tgDemoPending':{zh:'演示态 · 待验证',en:'Demo · pending'}, 'inv.tgDemoDone':{zh:'演示态 · 已领取',en:'Demo · claimed'},
'rd.back':{zh:'返回',en:'Back'}, 'rd.title':{zh:'兑换码',en:'Redeem code'},
'rd.label':{zh:'兑换码',en:'Redemption code'}, 'rd.ph':{zh:'输入兑换 / 激活码',en:'Enter activation code'},
'rd.btn':{zh:'立即兑换',en:'Redeem'}, 'rd.hint':{zh:'输入卡密即可激活对应时长,激活后立即生效。',en:'Enter a code to instantly activate plan time.'},
'set.orders':{zh:'我的订单',en:'My orders'}, 'set.ordersSub':{zh:'查看订单记录',en:'View order history'},
'ord.back':{zh:'返回',en:'Back'}, 'ord.details':{zh:'明细',en:'Details'},
'ord.kOrderNo':{zh:'订单号',en:'Order No.'}, 'ord.kPlan':{zh:'套餐',en:'Plan'}, 'ord.kAmount':{zh:'金额',en:'Amount'},
'ord.kMethod':{zh:'支付方式',en:'Payment'}, 'ord.kStatus':{zh:'状态',en:'Status'}, 'ord.kCreated':{zh:'创建时间',en:'Created'},
'ord.kValid':{zh:'有效期至',en:'Valid until'}, 'ord.kDeadline':{zh:'支付截止',en:'Pay before'}, 'ord.kTrade':{zh:'交易流水号',en:'Trade No.'},
'ord.actContinue':{zh:'继续支付',en:'Continue payment'}, 'ord.actCancel':{zh:'取消订单',en:'Cancel order'},
'ord.actRefresh':{zh:'刷新状态',en:'Refresh status'}, 'ord.actMembership':{zh:'查看会员',en:'View membership'},
'ord.actBuyAgain':{zh:'重新购买',en:'Buy again'}, 'ord.copied':{zh:'已复制',en:'Copied'},
'inv.tgDemoDone':{zh:'演示态 · 已领取',en:'Demo · claimed'},
'inv.tgDemoPending':{zh:'演示态 · 待验证',en:'Demo · pending'},
'inv.tgDoneBtn':{zh:'已领 +3 天',en:'Claimed +3 days'},
'inv.tgJoinBtn':{zh:'加入频道',en:'Join channel'},
'inv.tgSub':{zh:'+3 天',en:'+3 days'},
'inv.tgTitle':{zh:'加入 Telegram 频道',en:'Join Telegram channel'},
'inv.tgVerifyBtn':{zh:'验证领取',en:'Verify & claim'},
'inv.title':{zh:'邀请好友',en:'Invite friends'},
'login.email':{zh:'邮箱',en:'Email'},
'login.frame':{zh:'分屏卡 · 品牌左 / 表单右',en:'Split card · brand left / form right'},
'login.haveAccount':{zh:'已有账户?登录',en:'Have an account? Sign in'},
'login.note':{zh:'(独立静态屏,不并入交互窗口)',en:'(standalone static screen, outside the interactive window)'},
'login.pwd':{zh:'密码',en:'Password'},
'login.pwd2':{zh:'确认密码',en:'Confirm password'},
'login.signin':{zh:'登录',en:'Log in'},
'login.signup':{zh:'没有账户?免费注册',en:'No account? Sign up free'},
'login.signupBtn':{zh:'免费注册',en:'Sign up free'},
'login.signupTitle':{zh:'注册',en:'Sign up'},
'login.slogan':{zh:'极速畅连 · 稳定加速线路<br>隐私保护 · 全程无日志',en:'Fast & stable lines<br>Privacy protected · No logs'},
'login.title':{zh:'登录账户',en:'Sign in'},
'nav.account':{zh:'我的',en:'Account'},
'nav.connect':{zh:'连接',en:'Connect'},
'nav.contact':{zh:'联系我们',en:'Contact us'},
'nav.devices':{zh:'我的设备',en:'My devices'},
'nav.invite':{zh:'邀请好友',en:'Invite friends'},
'nav.nodes':{zh:'节点',en:'Servers'},
'nav.notifications':{zh:'通知',en:'Notifications'},
'nav.orders':{zh:'我的订单',en:'My orders'},
'nav.purchase':{zh:'购买套餐',en:'Purchase'},
'nav.redeem':{zh:'兑换激活码',en:'Redeem a code'},
'nav.routing':{zh:'分流规则',en:'Routing rules'},
'nav.settings':{zh:'设置',en:'Settings'},
'nav.stats':{zh:'统计',en:'Stats'},
'nodes.de':{zh:'德国 · 法兰克福',en:'Germany · Frankfurt'},
'nodes.hk':{zh:'香港 · 优选',en:'Hong Kong · Premium'},
'nodes.jp':{zh:'日本 · 东京',en:'Japan · Tokyo'},
'nodes.rec':{zh:'推荐',en:'Recommended'},
'nodes.search':{zh:'搜索加速线路…',en:'Search lines…'},
'nodes.sg':{zh:'新加坡',en:'Singapore'},
'nodes.smart':{zh:'智能选择',en:'Smart select'},
'nodes.smartSub':{zh:'根据当前网络环境,自动选择最优节点',en:'Picks the best node for your network'},
'nodes.stream':{zh:'流媒体',en:'Streaming'},
'nodes.unavail':{zh:'暂不可用',en:'Unavailable'},
'nodes.us':{zh:'美国 · 洛杉矶',en:'US · Los Angeles'},
'nt.back':{zh:'返回',en:'Back'},
'nt.n1full':{zh:'本次更新新增数据留存与第三方共享条款说明,不影响现有账户与订阅权益,建议登录网页用户中心查看完整版本。',en:'This update adds details on data retention and third-party sharing. It does not affect your existing account or subscription — please review the full version in the web user center.'},
'nt.n1s':{zh:'我们更新了服务条款,请查阅最新内容。',en:'We have updated our terms — please review the latest version.'},
'nt.n1t':{zh:'服务条款与隐私政策更新',en:'Terms & privacy policy updated'},
'nt.n2s':{zh:'三条低延迟线路已上线,欢迎体验。',en:'Three low-latency lines are now live.'},
'nt.n2t':{zh:'新增日本 · 大阪加速线路',en:'New Japan · Osaka lines added'},
'nt.n3s':{zh:'邀请好友注册,双方都可获得会员天数。',en:'Invite friends to sign up — both sides earn membership days.'},
'nt.n3t':{zh:'邀请好友活动进行中',en:'Invite-a-friend event is live'},
'nt.n4s':{zh:'好友已完成注册,会员天数已计入你的账户。',en:'Your friend has completed sign-up — the days have been added to your account.'},
'nt.n4t':{zh:'邀请奖励 +3 天已到账',en:'Referral reward: +3 days credited'},
'nt.n5s':{zh:'修复已知问题,建议尽快更新。',en:'Bug fixes included — update is recommended.'},
'nt.n5t':{zh:'v1.0.73 已发布',en:'v1.0.73 is out'},
'nt.n6s':{zh:'限时活动,PRO 月付低至 ¥6,先到先得。',en:'Limited-time offer — PRO monthly as low as ¥6, while it lasts.'},
'nt.n6t':{zh:'¥6 月付优惠上线',en:'¥6/mo promo is live'},
'nt.tFeature':{zh:'功能',en:'Feature'},
'nt.tImportant':{zh:'重要',en:'Important'},
'nt.tNews':{zh:'新闻',en:'News'},
'nt.tPromo':{zh:'活动',en:'Promo'},
'nt.tReward':{zh:'到账',en:'Credited'},
'nt.tVersion':{zh:'版本',en:'Update'},
'nt.title':{zh:'通知',en:'Notifications'},
'nt.updateBtn':{zh:'去更新',en:'Update now'},
'ord.actBuyAgain':{zh:'重新购买',en:'Buy again'},
'ord.actCancel':{zh:'取消订单',en:'Cancel order'},
'ord.actContinue':{zh:'继续支付',en:'Continue payment'},
'ord.actMembership':{zh:'查看会员',en:'View membership'},
'ord.actRefresh':{zh:'刷新状态',en:'Refresh'},
'ord.back':{zh:'返回',en:'Back'},
'ord.copied':{zh:'已复制',en:'Copied'},
'ord.details':{zh:'明细',en:'Details'},
'ord.kAmount':{zh:'金额',en:'Amount'},
'ord.kCreated':{zh:'创建时间',en:'Created'},
'ord.kDeadline':{zh:'支付截止',en:'Pay before'},
'ord.kMethod':{zh:'支付方式',en:'Payment method'},
'ord.kOrderNo':{zh:'订单号',en:'Order no.'},
'ord.kPlan':{zh:'套餐',en:'Plan'},
'ord.kStatus':{zh:'状态',en:'Status'},
'ord.kTrade':{zh:'交易流水号',en:'Trade No.'},
'ord.kValid':{zh:'有效期至',en:'Valid until'},
'plan.free':{zh:'免费版',en:'Free'},
'pur.address':{zh:'收款地址',en:'Address'},
'pur.aliScan':{zh:'用支付宝扫码支付',en:'Scan with Alipay to pay'},
'pur.alipayHint':{zh:'付款后自动开通,无需手动确认。',en:'Activated automatically after payment — no manual confirmation needed.'},
'pur.amount':{zh:'转账金额',en:'Amount'},
'pur.back':{zh:'返回',en:'Back'},
'pur.proIncludes':{zh:'PRO 全部特性',en:'Everything in PRO'},
'pur.buy':{zh:'立即购买',en:'Buy now'},
'pur.cancel':{zh:'取消订单',en:'Cancel order'},
'pur.chanCny':{zh:'人民币 · 支付宝',en:'CNY · Alipay'},
'pur.chanUsdt':{zh:'USDT · 加密货币',en:'USDT · Crypto'},
'pur.channel':{zh:'支付渠道',en:'Payment channel'},
'pur.demo':{zh:'评审演示',en:'Review demo'},
'pur.done':{zh:'完成',en:'Done'},
'pur.f1':{zh:'不限时长 · 不限流量',en:'Unlimited time & data'},
'pur.f2':{zh:'80+ 全球加速线路',en:'80+ global lines'},
'pur.f3':{zh:'5 台设备同时在线',en:'5 devices at once'},
'pur.f4':{zh:'优先客服支持',en:'Priority support'},
'pur.month':{zh:'按月',en:'Monthly'}, 'pur.quarter':{zh:'按季',en:'Quarterly'}, 'pur.year':{zh:'按年',en:'Yearly'},
'pur.channel':{zh:'支付渠道',en:'Payment channel'},
'pur.chanUsdt':{zh:'USDT · 加密货币',en:'USDT · Crypto'},
'pur.chanCny':{zh:'人民币 · 支付宝',en:'CNY · Alipay'},
'pur.pop':{zh:'最受欢迎',en:'Most popular'}, 'pur.buy':{zh:'立即购买',en:'Buy now'},
'pur.network':{zh:'网络',en:'Network'}, 'pur.address':{zh:'收款地址',en:'Address'}, 'pur.amount':{zh:'精确金额',en:'Exact amount'},
'pur.failSub':{zh:'订单已超时,请重试',en:'Order timed out, please retry'},
'pur.failTitle':{zh:'支付失败',en:'Payment failed'},
'pur.month':{zh:'按月',en:'Monthly'},
'pur.network':{zh:'网络',en:'Network'},
'pur.okTitle':{zh:'已开通',en:'Activated'},
'pur.pop':{zh:'最受欢迎',en:'Popular'},
'pur.proIncludes':{zh:'PRO 全部特性',en:'Everything in PRO'},
'pur.quarter':{zh:'按季',en:'Quarterly'},
'pur.retry':{zh:'重试',en:'Retry'},
'pur.simFail':{zh:'▸ 模拟失败',en:'▸ Simulate failure'},
'pur.simPaid':{zh:'▸ 模拟到账',en:'▸ Simulate paid'},
'pur.switch':{zh:'换一种支付方式',en:'Switch payment method'},
'pur.usdtHint':{zh:'请按精确金额(含小数末位)转账,金额用于自动对账识别,多退少不到账。',en:'Send the exact amount (incl. trailing decimals) — it is used to auto-match your order.'},
'pur.alipayHint':{zh:'付款后自动开通,无需手动确认',en:'Activated automatically after payment — no manual confirmation needed.'},
'pur.waitCrypto':{zh:'等待到账确认…',en:'Waiting for confirmation…'}, 'pur.waitAlipay':{zh:'等待付款确认…',en:'Waiting for payment…'},
'pur.switch':{zh:'更换支付渠道',en:'Change channel'}, 'pur.cancel':{zh:'取消订单',en:'Cancel order'},
'pur.demo':{zh:'评审演示',en:'Review demo'}, 'pur.simPaid':{zh:'▸ 模拟到账',en:'▸ Simulate paid'}, 'pur.simFail':{zh:'▸ 模拟失败',en:'▸ Simulate failure'},
'pur.okTitle':{zh:'支付成功',en:'Payment successful'}, 'pur.done':{zh:'完成',en:'Done'},
'pur.failTitle':{zh:'支付失败',en:'Payment failed'}, 'pur.failSub':{zh:'订单已超时,请重试',en:'Order timed out, please retry'}, 'pur.retry':{zh:'重新支付',en:'Pay again'},
'brand.name':{zh:'穿山甲',en:'Pangolin'},
'plan.free':{zh:'免费版',en:'Free'},
'q.remain':{zh:'今日剩余',en:'Remaining today'}, 'q.zero':{zh:'0 分钟',en:'0 min'},
'nodes.search':{zh:'搜索加速线路…',en:'Search lines…'}, 'nodes.smart':{zh:'智能选择',en:'Smart Select'},
'nodes.smartSub':{zh:'根据当前网络环境,自动选择最优节点',en:'Auto-select the best node for your network'},
'nodes.rec':{zh:'推荐',en:'Recommended'}, 'nodes.stream':{zh:'流媒体',en:'Streaming'},
'nodes.hk':{zh:'香港 · 优选',en:'Hong Kong · Premium'}, 'nodes.jp':{zh:'日本 · 东京',en:'Japan · Tokyo'},
'nodes.sg':{zh:'新加坡',en:'Singapore'}, 'nodes.us':{zh:'美国 · 洛杉矶',en:'US · Los Angeles'},
'nodes.de':{zh:'德国 · 法兰克福',en:'Germany · Frankfurt'}, 'nodes.unavail':{zh:'暂不可用',en:'Unavailable'},
'stats.month':{zh:'本月',en:'This month'}, 'stats.week':{zh:'本周',en:'This week'}, 'stats.today':{zh:'今日',en:'Today'},
'stats.down':{zh:'下行',en:'Down'}, 'stats.up':{zh:'上行',en:'Up'}, 'stats.dur':{zh:'时长',en:'Time'},
'stats.chart':{zh:'最近两周流量',en:'Last 14 days'},
'stats.allDevices':{zh:'全部设备',en:'All devices'},
'acc.info':{zh:'账户信息',en:'Account info'}, 'acc.email':{zh:'邮箱',en:'Email'}, 'acc.pwd':{zh:'密码',en:'Password'},
'acc.change':{zh:'修改',en:'Change'}, 'acc.devices':{zh:'设备管理',en:'Devices'}, 'acc.pref':{zh:'偏好',en:'Preferences'},
'acc.myDevices':{zh:'我的设备',en:'My Devices'}, 'acc.myDevicesSub':{zh:'重命名 · 强制下线 · 移除',en:'Rename · force offline · remove'},
'acc.lang':{zh:'语言',en:'Language'}, 'acc.dark':{zh:'深色外观',en:'Dark appearance'}, 'acc.protocol':{zh:'协议',en:'Protocol'},
'acc.upgrade':{zh:'续费 / 升级',en:'Renew / Upgrade'}, 'acc.logout':{zh:'退出登录',en:'Sign out'},
'set.redeem':{zh:'兑换 & 购买',en:'Redeem & buy'}, 'set.redeemSub':{zh:'PRO 会员',en:'PRO member'},
'set.autostart':{zh:'开机自启',en:'Launch at startup'}, 'set.autostartSub':{zh:'系统启动时自动运行',en:'Run automatically on system start'},
'set.autoconnect':{zh:'自动连接',en:'Auto-connect'}, 'set.autoconnectSub':{zh:'启动时自动连接节点',en:'Connect automatically on launch'},
'set.smart':{zh:'智能分流',en:'Smart routing'}, 'set.smartSub':{zh:'海外应用走加速,国内直连',en:'Accelerate abroad, direct at home'},
'nav.routing':{zh:'分流规则',en:'Routing rules'},
'set.routing':{zh:'分流规则',en:'Routing rules'}, 'set.routingSub':{zh:'自定义直连 / 走隧道 / 拒绝',en:'Custom direct / proxy / reject'}, 'set.routeModeSmart':{zh:'智能分流',en:'Smart routing'},
'set.kill':{zh:'断连保护 Kill Switch',en:'Kill Switch'}, 'set.killSub':{zh:'断线时阻断网络,防止数据泄露',en:'Block traffic if the link drops'},
'set.lang':{zh:'语言',en:'Language'}, 'set.dark':{zh:'深色外观',en:'Dark appearance'},
'set.protocol':{zh:'协议',en:'Protocol'}, 'set.web':{zh:'网页版用户中心',en:'Web User Center'},
'set.grpConn':{zh:'连接',en:'Connection'}, 'set.grpAppear':{zh:'外观',en:'Appearance'}, 'set.grpAbout':{zh:'关于',en:'About'},
'pur.waitAlipay':{zh:'等待付款确认',en:'Waiting for payment…'},
'pur.waitCrypto':{zh:'等待到账确认…',en:'Waiting for confirmation…'},
'pur.year':{zh:'按年',en:'Yearly'},
'q.remain':{zh:'今日剩余',en:'Left today'},
'q.zero':{zh:'0 分钟',en:'0 min'},
'rd.back':{zh:'返回',en:'Back'},
'rd.btn':{zh:'激活',en:'Redeem'},
'rd.hint':{zh:'输入卡密即可激活对应时长,激活后立即生效。',en:'Enter a code to instantly activate plan time.'},
'rd.label':{zh:'兑换码',en:'Redemption code'},
'rd.ph':{zh:'输入激活码',en:'Enter activation code'},
'rd.title':{zh:'兑换激活码',en:'Redeem a code'},
'set.autoconnect':{zh:'自动连接',en:'Auto-connect'},
'set.autoconnectSub':{zh:'启动时自动连接节点',en:'Connect automatically on launch'},
'set.autostart':{zh:'开机自启',en:'Launch at startup'},
'set.autostartSub':{zh:'系统启动时自动运行',en:'Run automatically on system start'},
'set.dark':{zh:'深色外观',en:'Dark appearance'},
'set.grpAbout':{zh:'关于',en:'About'},
'set.grpAppear':{zh:'外观',en:'Appearance'},
'set.grpConn':{zh:'连接',en:'Connection'},
'set.kill':{zh:'Kill Switch',en:'Kill Switch'},
'set.killSub':{zh:'断线时阻断网络,防止泄露',en:'Block traffic if the link drops'},
'set.lang':{zh:'语言',en:'Language'},
'set.orders':{zh:'我的订单',en:'My orders'},
'set.ordersSub':{zh:'查看订单记录',en:'View order history'},
'set.protocol':{zh:'协议',en:'Protocol'},
'set.redeem':{zh:'兑换 & 购买',en:'Redeem & buy'},
'set.redeemSub':{zh:'PRO 会员',en:'PRO member'},
'set.routeModeSmart':{zh:'智能分流',en:'Smart routing'},
'set.routing':{zh:'分流规则',en:'Routing rules'},
'set.routingSub':{zh:'自定义直连 / 走隧道 / 拒绝',en:'Custom direct / tunnel / reject'},
'set.smart':{zh:'智能分流',en:'Smart routing'},
'set.smartSub':{zh:'海外应用走加速,国内直连',en:'Accelerate abroad, direct at home'},
'set.update':{zh:'检查更新',en:'Check for updates'},
'contact.intro':{zh:'遇到问题?通过以下任一渠道联系我们,通常数分钟内回复。',en:'Having trouble? Reach us on any channel below — usually a reply within minutes.'},
'contact.email':{zh:'邮箱客服',en:'Email support'}, 'contact.web':{zh:'官网',en:'Website'},
'contact.hoursTitle':{zh:'服务时间',en:'Support hours'}, 'contact.hours':{zh:'每日 9:00 24:00 (GMT+8)',en:'Daily 9:00 24:00 (GMT+8)'},
'ub.title':{zh:'发现新版本 v2.5.0,建议更新',en:'New version v2.5.0 available'}, 'ub.cta':{zh:'立即更新',en:'Update'},
'dl.title':{zh:'设备数已达上限',en:'Device limit reached'},
'dl.desc':{zh:'你的套餐最多 5 台设备,请移除一台以继续。',en:'Your plan allows up to 5 devices. Remove one to continue.'},
'dl.remove':{zh:'移除最久未用',en:'Remove least recently used'}, 'dl.logout':{zh:'退出登录',en:'Sign out'},
'dev.current':{zh:'本',en:'This device'}, 'dev.remove':{zh:'移除',en:'Remove'}, 'dev.back':{zh:'返回',en:'Back'},
'dev.lastOnline':{zh:'最后在线',en:'Last online'}, 'dev.now':{zh:'刚刚',en:'just now'},
'dev.h2':{zh:'2 小时前',en:'2h ago'}, 'dev.yesterday':{zh:'昨天',en:'yesterday'},
'dev.mRename':{zh:'重命名',en:'Rename'}, 'dev.mForceLogout':{zh:'强制退出',en:'Force logout'}, 'dev.mClearLogin':{zh:'清除登录信息',en:'Clear login info'},
'dev.tRenamed':{zh:'已重命名(演示)',en:'Renamed (demo)'}, 'dev.tLoggedOut':{zh:'已强制退出(演示)',en:'Force logged out (demo)'}, 'dev.tCleared':{zh:'已清除登录信息(演示)',en:'Login info cleared (demo)'},
'state.on':{zh:'已开启',en:'On'}, 'state.off':{zh:'跟随浅色',en:'Off'},
'demo.theme':{zh:'主题',en:'Theme'}, 'demo.light':{zh:'明',en:'Light'}, 'demo.dark':{zh:'暗',en:'Dark'},
'demo.lang':{zh:'语言',en:'Language'}, 'demo.persp':{zh:'视角',en:'Perspective'},
'demo.upd':{zh:'更新条',en:'Banner'}, 'demo.show':{zh:'显',en:'On'}, 'demo.hide':{zh:'隐',en:'Off'},
'demo.gate':{zh:'挡板',en:'Gate'}, 'demo.deviceLimit':{zh:'设备超限',en:'Device limit'},
'login.frame':{zh:'分屏卡 · 品牌左 / 表单右',en:'Split card · brand left / form right'},
'login.note':{zh:'(独立静态屏,不并入交互窗口)',en:'(standalone static screen, outside the interactive window)'},
'login.slogan':{zh:'极速畅连 · 稳定加速线路<br>隐私保护 · 全程无日志',en:'Fast & stable lines<br>Privacy protected · No logs'},
'login.title':{zh:'登录账户',en:'Sign in'}, 'login.email':{zh:'邮箱',en:'Email'}, 'login.pwd':{zh:'密码',en:'Password'},
'login.signin':{zh:'登录',en:'Sign in'}, 'login.signup':{zh:'没有账户?免费注册',en:'No account? Sign up free'},
'login.signupTitle':{zh:'注册账户',en:'Sign up'}, 'login.pwd2':{zh:'确认密码',en:'Confirm password'},
'login.signupBtn':{zh:'免费注册',en:'Sign up free'}, 'login.haveAccount':{zh:'已有账户?登录',en:'Have an account? Sign in'}
'set.web':{zh:'用户中心(网页)',en:'User Center (Web)'},
'state.off':{zh:'跟随浅色',en:'Off'},
'state.on':{zh:'已开启',en:'On'},
'stats.allDevices':{zh:'全部设备',en:'All devices'},
'stats.chart':{zh:'最近两周流量',en:'Last 2 weeks'},
'stats.down':{zh:'下行',en:'Download'},
'stats.dur':{zh:'使用时长',en:'Duration'},
'stats.month':{zh:'本',en:'This month'},
'stats.today':{zh:'今日',en:'Today'},
'stats.up':{zh:'上行',en:'Upload'},
'stats.week':{zh:'本周',en:'This week'},
'ub.cta':{zh:'立即更新',en:'Update'},
'ub.title':{zh:'发现新版本 v2.5.0,建议更新',en:'New version v2.5.0 available'}
};
// <<<end-gen-i18n>>>
var HTML_KEYS = { 'login.slogan':1 };
/* 状态/视角相关的动态串(随 lang 计算,不走 data-i18n */
+493 -156
View File
@@ -928,8 +928,7 @@
<div class="sec-label">内置规则</div>
<div class="card card-flush">
<div class="setting-row"><span class="icon-box"><svg><use href="#i-globe"/></svg></span><div class="st-body"><div class="st-title">国内直连</div><div class="st-sub">GeoIP / GeoSite CN</div></div><div class="st-trail"><button class="toggle is-on"><i></i></button></div></div>
<div class="setting-row"><span class="icon-box"><svg><use href="#i-home"/></svg></span><div class="st-body"><div class="st-title">局域网 / 私网直连</div><div class="st-sub">强制,不可关</div></div><div class="st-trail"><span class="pill is-neutral">🔒</span></div></div>
<div class="setting-row"><span class="icon-box"><svg><use href="#i-shield"/></svg></span><div class="st-body"><div class="st-title">私有服务走隧道</div><div class="st-sub">服务端下发</div></div><div class="st-trail"><span class="pill is-neutral">🔒</span></div></div>
<div class="setting-row"><span class="icon-box"><svg><use href="#i-home"/></svg></span><div class="st-body"><div class="st-title" data-i18n="rr.lan">局域网 / 私网直连</div><div class="st-sub" data-i18n="rr.lanSub">强制,不可关</div></div><div class="st-trail"><span class="pill is-neutral" data-i18n="rr.forced">🔒</span></div></div>
</div>
<div class="sec-label">我的规则 · 首命中生效</div>
<div class="card card-flush">
@@ -1285,170 +1284,508 @@
<script>
/* ---------- i18n 字典(覆盖导航/CTA/标题;数据值不翻) ---------- */
// <<<gen-i18n>>> 由 design/codegen/gen_proto_i18n.mjs 生成(单源 design/i18n/strings.json + i18n/{alias,overlay}.json),勿手改
const I18N = {
zh:{
brandName:'穿山甲', brandLatin:'Pangolin',
demoTheme:'主题', demoLang:'语言', demoView:'视角', demoUpdate:'更新',
demoGate:'挡板', demoDeviceLimit:'设备超限',
dlTitle:'设备数已达上限', dlDesc:'你的账户最多可同时登录 5 台设备,请移除一台后继续。', dlRemoveLru:'移除最久未用', dlRemove:'移除', dlOnline:'在线',
segLight:'明', segDark:'暗', segFree:'免费版', segPro:'PRO',
segShow:'显示', segHide:'隐藏',
navConnect:'连接', navNodes:'节点', navStats:'统计', navAccount:'账户',
rateDown:'下载', rateUp:'上传', latency:'延迟', disconnect:'断开连接',
searchPh:'搜索国家 / 城市', smartTitle:'智能选择', smartSub:'根据当前网络环境,自动选择最优节点', recommend:'推荐',
nHKt:'香港 01', nJPt:'日本 · 东京 02', nSGt:'新加坡 01', nUSt:'美国 · 洛杉矶 03', nTWt:'台湾 01',
tagStream:'流媒体', tagLowLat:'低延迟', tagStable:'高速稳定', tagDistant:'远距离', maintenance:'维护中', unavail:'不可用',
periodMonth:'本月', periodWeek:'本周', periodToday:'今日',
statDownArr:'↓ 下行', statUpArr:'↑ 上行', statDur:'使用时长', chartTwoWeeks:'最近两周流量',
planFree:'免费版', planProMeta:'PRO 会员 · 2027-07-11', upgrade:'续费 / 升级', renew:'续费 / 升级',
secAccount:'账户信息', accEmail:'邮箱', accPassword:'密码', accChange:'修改',
devFreeLbl:'我的设备 · 1 / 1 台', devProLbl:'我的设备 · 3 / 5 台',
secDevices:'设备', myDevices:'我的设备', devMgmt:'设备管理',
thisDevice:'本机', devOnlineNow:'当前在线', lastOnline:'最后在线', rel2h:'2 小时前', relYday:'昨天',
devRename:'重命名', devForceLogout:'强制退出', devClearLogin:'清除登录信息',
devRenamedToast:'已重命名(演示)', devLoggedOutToast:'已强制退出(演示)', devClearedToast:'已清除登录信息(演示)',
secPref:'偏好', prefLang:'语言', prefTheme:'深色外观', prefProtocol:'协议', followLight:'跟随浅色', stateOn:'已开启',
secMore:'更多', navDevices:'设备管理', navSettings:'设置', navRouting:'分流规则', navRedeem:'兑换 & 购买',
navContact:'联系我们', navWebUC:'网页用户中心', logout:'退出登录',
navOrders:'我的订单', ordDetailTitle:'订单详情', ordSecDetail:'明细',
kOrderNo:'订单号', kPlan:'套餐', kAmount:'金额', kMethod:'支付方式', kStatus:'状态',
kCreated:'创建时间', kValid:'有效期至', kDeadline:'支付截止', kTrade:'交易流水号',
actContinue:'继续支付', actCancel:'取消订单', actRefresh:'刷新状态', actMembership:'查看会员', actBuyAgain:'重新购买',
updateTitle:'发现新版本 v1.1.0', updateCta:'更新',
connOff:'点击连接', connDoing:'连接中', cbSubOn:'已加密',
stOff:'未连接 · 轻点连接', stDoing:'连接中…', stOn:'已连接 · 网络已加密',
pillFree:'免费版', pillDoing:'连接中', pillOn:'已加密', pillOffPro:'未连接',
toastUpdate:'演示:前往应用商店更新',
authLogin:'登录', authRegister:'注册', authTagline:'极速 · 稳定 · 省心',
authEmail:'邮箱', authEmailPh:'you@example.com', authPassword:'密码', authForgot:'忘记密码?',
authLoginBtn:'登录', authTos:'继续即代表同意《服务条款》与《隐私政策》',
authCode:'验证码', authCodePh:'6 位验证码', authSendCode:'发送验证码',
authSetPw:'设置密码', authSetPwPh:'至少 6 位', authRegBtn:'注册',
statsFilterLbl:'设备', devAll:'全部设备',
purTitle:'升级 PRO', purCheckout:'完成支付',
proIncludes:'所有套餐均含', featSupport:'优先客服',
planMonth:'按月', planQuarter:'按季', planYear:'按年',
perMo:' / 月', planPop:'最受欢迎',
featUnlimited:'不限时长 · 不限流量', feat80:'80+ 全球加速线路', feat5:'5 台设备同时在线',
accChange:'修改',
accEmail:'邮箱',
accPassword:'密码',
actBuyAgain:'重新购买',
actCancel:'取消订单',
actContinue:'继续支付',
actMembership:'查看会员',
actRefresh:'刷新状态',
authCode:'邮箱验证码',
authCodePh:'6 位验证码',
authEmail:'邮箱',
authEmailPh:'you@example.com',
authForgot:'忘记密码?',
authLogin:'登录',
authLoginBtn:'登录',
authPassword:'密码',
authRegBtn:'注册',
authRegister:'注册',
authSendCode:'发送验证码',
authSetPw:'设置密码',
authSetPwPh:'至少 6 位',
authTagline:'极速 · 稳定 · 省心',
authTos:'继续即代表同意《服务条款》与《隐私政策》',
brandLatin:'Pangolin',
brandName:'穿山甲',
buyNow:'立即购买',
payChannel:'支付渠道',
chanSwUsdt:'USDT · 加密货币', chanSwCny:'人民币 · 支付宝',
chanUsdt:'加密货币 · USDT', chanCny:'支付宝 · 人民币',
ordPlan:'套餐', ordAmount:'金额', ordUntil:'到期',
payNetwork:'网络', payAddr:'收款地址', payAmount:'精确金额',
payHintCryptoTpl:'请转账 {amt} USDT(含小数末位),金额用于自动对账识别,多退少不到账。',
payOpenAlipay:'打开支付宝', payHintAlipay:'将跳转至支付宝完成付款,付款后自动返回本页并开通。',
payWaitCrypto:'等待到账确认…', payWaitAlipay:'等待付款确认…',
paySwitch:'更换支付渠道', payCancel:'取消订单',
demoReview:'评审演示', demoPaid:'▸ 模拟到账', demoFailed:'▸ 模拟失败',
succTitle:'支付成功', succSubTpl:'PRO{name})有效期至 {date}', purDone:'完成',
failTitle:'支付失败', failSub:'订单已超时,请重试', purRetry:'重新支付',
toastCopied:'已复制:{v}', toastAlipay:'已拉起支付宝(演示)',
secBilling:'购买 · 订单 · 兑换', rowBuyPlan:'购买套餐', navRedeemCode:'兑换码',
secInvite:'推广', inviteEntry:'邀请好友得会员', inviteEntrySub:'双方各得订阅天数', secGeneral:'通用',
setGrpConn:'连接', setLaunch:'开机自启', setAutoConn:'自动连接', setSmartRoute:'智能分流', setKill:'断网保护',
setGrpAppr:'外观', setGrpAbout:'关于', setCheckUpdate:'检查更新',
contactEmail:'邮箱', contactWeb:'官网', contactHours:'服务时间', contactHoursVal:'每日 9:0024:00 (GMT+8)',
navNotifications:'通知', notiFoot:'仅显示最近通知(演示占位)',
nt1Type:'重要', nt1Title:'服务条款与隐私政策更新', nt1Sub:'我们更新了服务条款,请查阅最新内容。',
cbSubOn:'已加密',
chanCny:'支付宝 · 人民币',
chanSwCny:'人民币 · 支付宝',
chanSwUsdt:'USDT · 加密货币',
chanUsdt:'加密货币 · USDT',
chartTwoWeeks:'最近两周流量',
connDoing:'连接中',
connOff:'点击连接',
contactEmail:'邮箱',
contactHours:'服务时间',
contactHoursVal:'每日 9:00 24:00 (GMT+8)',
contactWeb:'官网',
demoDeviceLimit:'设备超限',
demoFailed:'▸ 模拟失败',
demoGate:'挡板',
demoLang:'语言',
demoPaid:'▸ 模拟到账',
demoReview:'评审演示',
demoTheme:'主题',
demoUpdate:'更新',
demoView:'视角',
devAll:'全部设备',
devClearLogin:'清除登录信息',
devClearedToast:'已清除登录信息(演示)',
devForceLogout:'强制退出',
devFreeLbl:'我的设备 · 1 / 1 台',
devLoggedOutToast:'已强制退出(演示)',
devMgmt:'我的设备',
devOnlineNow:'当前在线',
devProLbl:'我的设备 · 3 / 5 台',
devRename:'重命名',
devRenamedToast:'已重命名(演示)',
disconnect:'断开连接',
dlDesc:'你的账户最多可同时登录 5 台设备,请移除一台后继续。',
dlOnline:'在线',
dlRemove:'移除',
dlRemoveLru:'移除最久未用',
dlTitle:'设备数已达上限',
failSub:'订单已超时,请重试',
failTitle:'支付失败',
feat5:'5 台设备同时在线',
feat80:'80+ 全球加速线路',
featSupport:'优先客服',
featUnlimited:'不限时长 · 不限流量',
followLight:'跟随浅色',
inviteCode:'邀请码',
inviteEntry:'邀请好友得会员',
inviteEntrySub:'好友注册 · 双方都得会员天数',
inviteHeadline:'邀请好友得会员',
inviteJoinTgBtn:'加入频道',
inviteJoinTgTitle:'加入 Telegram 频道',
inviteLede:'好友注册、首购、加入社区,双方都各得订阅天数。',
inviteLink:'邀请链接',
inviteProgress:'我的奖励',
inviteProgressSub:'已邀请 2 位好友,累计获得 6 天会员(演示占位)',
inviteR1:'好友注册 · 双方各得 3 天',
inviteR2:'好友首购 · 双方各得 7 天',
inviteR3:'加入 TG 频道 · 得 3 天',
inviteRewards:'奖励规则',
inviteShare:'分享邀请链接',
inviteStatConverted:'已转化',
inviteStatDays:'累计获赠(天)',
inviteStatInvited:'已邀请',
inviteTaskDone:'已领 +3 天',
inviteTasksTitle:'更多得会员',
inviteTgDemoDone:'演示态 · 已领取',
inviteTgDemoPending:'演示态 · 待验证',
inviteTgSub:'+3 天',
inviteTitle:'邀请好友',
inviteVerifyBtn:'验证领取',
kAmount:'金额',
kCreated:'创建时间',
kDeadline:'支付截止',
kMethod:'支付方式',
kOrderNo:'订单号',
kPlan:'套餐',
kStatus:'状态',
kTrade:'交易流水号',
kValid:'有效期至',
lastOnline:'最后在线',
latency:'延迟',
logout:'退出登录',
maintenance:'维护中',
myDevices:'我的设备',
nHKt:'香港 01',
nJPt:'日本 · 东京 02',
nSGt:'新加坡 01',
nTWt:'台湾 01',
nUSt:'美国 · 洛杉矶 03',
navAccount:'我的',
navConnect:'连接',
navContact:'联系我们',
navDevices:'我的设备',
navNodes:'节点',
navNotifications:'通知',
navOrders:'我的订单',
navRedeem:'兑换 & 购买',
navRedeemCode:'兑换激活码',
navRouting:'分流规则',
navSettings:'设置',
navStats:'统计',
navWebUC:'用户中心(网页)',
notiFoot:'仅显示最近通知(演示占位)',
nt1Full:'本次更新新增数据留存与第三方共享条款说明,不影响现有账户与订阅权益,建议登录网页用户中心查看完整版本。',
nt2Type:'功能', nt2Title:'新增日本 · 大阪加速线路', nt2Sub:'三条低延迟线路已上线,欢迎体验。',
nt3Type:'新闻', nt3Title:'邀请好友活动进行中', nt3Sub:'邀请好友注册,双方都可获得会员天数。',
nt4Type:'奖励', nt4Title:'邀请奖励 +3 天已到账', nt4Sub:'好友已完成注册,会员天数已计入你的账户。',
nt5Type:'版本', nt5Title:'v1.0.73 已发布', nt5Sub:'修复已知问题,建议尽快更新。', nt5Btn:'去更新',
nt6Type:'优惠', nt6Title:'¥6 月付优惠上线', nt6Sub:'限时活动,PRO 月付低至 ¥6,先到先得。',
inviteTitle:'邀请好友', inviteHeadline:'邀请好友得会员', inviteLede:'好友注册、首购、加入社区,双方都各得订阅天数。',
inviteCode:'邀请码', inviteLink:'邀请链接', inviteRewards:'奖励规则',
inviteR1:'好友注册 · 双方各得 3 天', inviteR2:'好友首次购买 · 双方各得 7 天', inviteR3:'加入 TG 频道 · 获得 3 天',
inviteProgress:'我的奖励', inviteProgressSub:'已邀请 2 位好友,累计获得 6 天会员(演示占位)', inviteShare:'分享邀请链接',
inviteStatInvited:'已邀请', inviteStatConverted:'已转化', inviteStatDays:'累计获赠(天)',
inviteTasksTitle:'更多得会员', inviteJoinTgTitle:'加入 Telegram 频道', inviteTgSub:'+3 天',
inviteJoinTgBtn:'加入频道', inviteVerifyBtn:'验证领取', inviteTaskDone:'已领 +3 天',
inviteTgDemoPending:'演示态 · 待验证', inviteTgDemoDone:'演示态 · 已领取',
redeemLabel:'兑换码', redeemPh:'输入兑换 / 激活码', redeemBtn:'立即兑换', redeemHint:'输入卡密即可激活对应时长,激活后立即生效。'
nt1Sub:'我们更新了服务条款,请查阅最新内容。',
nt1Title:'服务条款与隐私政策更新',
nt1Type:'重要',
nt2Sub:'三条低延迟线路已上线,欢迎体验。',
nt2Title:'新增日本 · 大阪加速线路',
nt2Type:'功能',
nt3Sub:'邀请好友注册,双方都可获得会员天数。',
nt3Title:'邀请好友活动进行中',
nt3Type:'新闻',
nt4Sub:'好友已完成注册,会员天数已计入你的账户。',
nt4Title:'邀请奖励 +3 天已到账',
nt4Type:'到账',
nt5Btn:'去更新',
nt5Sub:'修复已知问题,建议尽快更新。',
nt5Title:'v1.0.73 已发布',
nt5Type:'版本',
nt6Sub:'限时活动,PRO 月付低至 ¥6,先到先得。',
nt6Title:'¥6 月付优惠上线',
nt6Type:'活动',
ordAmount:'金额',
ordDetailTitle:'订单详情',
ordPlan:'套餐',
ordSecDetail:'明细',
ordUntil:'有效期至',
payAddr:'收款地址',
payAmount:'转账金额',
payCancel:'取消订单',
payChannel:'支付渠道',
payHintAlipay:'将跳转至支付宝完成付款,付款后自动返回本页并开通。',
payHintCryptoTpl:'请转账 {amt} USDT(含小数末位),金额用于自动对账识别,多退少不到账。',
payNetwork:'网络',
payOpenAlipay:'打开支付宝支付',
paySwitch:'换一种支付方式',
payWaitAlipay:'等待付款确认…',
payWaitCrypto:'等待到账确认…',
perMo:' /月',
periodMonth:'本月',
periodToday:'今日',
periodWeek:'本周',
pillDoing:'连接中',
pillFree:'免费版',
pillOffPro:'未连接',
pillOn:'已加密',
planFree:'免费版',
planMonth:'按月',
planPop:'最受欢迎',
planProMeta:'PRO 会员 · 2027-07-11',
planQuarter:'按季',
planYear:'按年',
prefLang:'语言',
prefProtocol:'协议',
prefTheme:'深色外观',
proIncludes:'所有套餐均含',
purCheckout:'支付',
purDone:'完成',
purRetry:'重试',
purTitle:'购买套餐',
rateDown:'下载',
rateUp:'上传',
recommend:'推荐',
redeemBtn:'激活',
redeemHint:'输入卡密即可激活对应时长,激活后立即生效。',
redeemLabel:'兑换码',
redeemPh:'输入激活码',
rel2h:'2 小时前',
relYday:'昨天',
renew:'续费 / 升级',
rowBuyPlan:'购买套餐',
'rr.forced':'🔒',
'rr.lan':'局域网 / 私网直连',
'rr.lanSub':'强制,不可关',
searchPh:'搜索国家 / 城市',
secAccount:'账户信息',
secBilling:'购买 · 订单 · 兑换',
secDevices:'设备',
secGeneral:'通用',
secInvite:'推广',
secMore:'更多',
secPref:'偏好',
segDark:'暗',
segFree:'免费版',
segHide:'隐藏',
segLight:'明',
segPro:'PRO',
segShow:'显示',
setAutoConn:'自动连接',
setCheckUpdate:'检查更新',
setGrpAbout:'关于',
setGrpAppr:'外观',
setGrpConn:'连接',
setKill:'Kill Switch',
setLaunch:'开机自启',
setSmartRoute:'智能分流',
smartSub:'根据当前网络环境,自动选择最优节点',
smartTitle:'智能选择',
stDoing:'连接中…',
stOff:'未连接 · 轻点连接',
stOn:'已连接 · 网络已加密',
statDownArr:'↓ 下行',
statDur:'使用时长',
statUpArr:'↑ 上行',
stateOn:'已开启',
statsFilterLbl:'设备',
succSubTpl:'PRO{name})有效期至 {date}',
succTitle:'已开通',
tagDistant:'远距离',
tagLowLat:'低延迟',
tagStable:'高速稳定',
tagStream:'流媒体',
thisDevice:'本机',
toastAlipay:'已拉起支付宝(演示)',
toastCopied:'已复制:{v}',
toastUpdate:'演示:前往应用商店更新',
unavail:'不可用',
updateCta:'更新',
updateTitle:'发现新版本 v1.1.0',
upgrade:'续费 / 升级'
},
en:{
brandName:'Pangolin', brandLatin:'',
demoTheme:'Theme', demoLang:'Language', demoView:'View', demoUpdate:'Update',
demoGate:'Gate', demoDeviceLimit:'Device limit',
dlTitle:'Device limit reached', dlDesc:'Your account allows up to 5 devices at once. Remove one to continue.', dlRemoveLru:'Remove least recently used', dlRemove:'Remove', dlOnline:'Online',
segLight:'Light', segDark:'Dark', segFree:'Free', segPro:'PRO',
segShow:'Show', segHide:'Hide',
navConnect:'Connect', navNodes:'Nodes', navStats:'Stats', navAccount:'Account',
rateDown:'Down', rateUp:'Up', latency:'Ping', disconnect:'Disconnect',
searchPh:'Search country or city', smartTitle:'Smart Select', smartSub:'Auto-picks the best node for your network', recommend:'Best',
nHKt:'Hong Kong 01', nJPt:'Japan · Tokyo 02', nSGt:'Singapore 01', nUSt:'USA · Los Angeles 03', nTWt:'Taiwan 01',
tagStream:'Streaming', tagLowLat:'Low latency', tagStable:'Fast & stable', tagDistant:'Distant', maintenance:'Maintenance', unavail:'Unavailable',
periodMonth:'Month', periodWeek:'Week', periodToday:'Today',
statDownArr:'↓ Down', statUpArr:'↑ Up', statDur:'Duration', chartTwoWeeks:'Last 2 weeks',
planFree:'Free', planProMeta:'PRO member · 2027-07-11', upgrade:'Renew / Upgrade', renew:'Renew / Upgrade',
secAccount:'Account', accEmail:'Email', accPassword:'Password', accChange:'Change',
devFreeLbl:'My devices · 1 / 1', devProLbl:'My devices · 3 / 5',
secDevices:'Devices', myDevices:'My Devices', devMgmt:'Device management',
thisDevice:'This device', devOnlineNow:'Online now', lastOnline:'Last online', rel2h:'2h ago', relYday:'yesterday',
devRename:'Rename', devForceLogout:'Force logout', devClearLogin:'Clear login info',
devRenamedToast:'Renamed (demo)', devLoggedOutToast:'Force logged out (demo)', devClearedToast:'Login info cleared (demo)',
secPref:'Preferences', prefLang:'Language', prefTheme:'Dark appearance', prefProtocol:'Protocol', followLight:'Follow light', stateOn:'On',
secMore:'More', navDevices:'Devices', navSettings:'Settings', navRouting:'Routing rules', navRedeem:'Redeem & Buy',
navContact:'Contact us', navWebUC:'Web user center', logout:'Sign out',
navOrders:'Orders', ordDetailTitle:'Order Detail', ordSecDetail:'Details',
kOrderNo:'Order No.', kPlan:'Plan', kAmount:'Amount', kMethod:'Payment', kStatus:'Status',
kCreated:'Created', kValid:'Valid until', kDeadline:'Pay before', kTrade:'Trade No.',
actContinue:'Continue payment', actCancel:'Cancel order', actRefresh:'Refresh status', actMembership:'View membership', actBuyAgain:'Buy again',
updateTitle:'New version v1.1.0', updateCta:'Update',
connOff:'CONNECT', connDoing:'Connecting', cbSubOn:'SECURE',
stOff:'Tap to connect', stDoing:'Connecting…', stOn:'Connected · Encrypted',
pillFree:'Free', pillDoing:'Connecting', pillOn:'Encrypted', pillOffPro:'Not connected',
toastUpdate:'Demo: go to store to update',
authLogin:'Log In', authRegister:'Sign Up', authTagline:'Fast · Stable · Effortless',
authEmail:'Email', authEmailPh:'you@example.com', authPassword:'Password', authForgot:'Forgot password?',
authLoginBtn:'Log In', authTos:'By continuing you agree to the Terms of Service and Privacy Policy',
authCode:'Verification code', authCodePh:'6-digit code', authSendCode:'Send code',
authSetPw:'Set password', authSetPwPh:'At least 6 characters', authRegBtn:'Create Account',
statsFilterLbl:'Device', devAll:'All devices',
purTitle:'Upgrade to PRO', purCheckout:'Checkout',
proIncludes:'All plans include', featSupport:'Priority support',
planMonth:'Monthly', planQuarter:'Quarterly', planYear:'Yearly',
perMo:' / mo', planPop:'Most popular',
featUnlimited:'Unlimited time & data', feat80:'80+ global nodes', feat5:'5 devices at once',
accChange:'Change',
accEmail:'Email',
accPassword:'Password',
actBuyAgain:'Buy again',
actCancel:'Cancel order',
actContinue:'Continue payment',
actMembership:'View membership',
actRefresh:'Refresh',
authCode:'Verification code',
authCodePh:'6-digit code',
authEmail:'Email',
authEmailPh:'you@example.com',
authForgot:'Forgot password?',
authLogin:'Log in',
authLoginBtn:'Log in',
authPassword:'Password',
authRegBtn:'Sign up',
authRegister:'Sign up',
authSendCode:'Send code',
authSetPw:'Set password',
authSetPwPh:'At least 6 characters',
authTagline:'Fast · Stable · Effortless',
authTos:'By continuing you agree to our Terms & Privacy Policy',
brandLatin:'',
brandName:'Pangolin',
buyNow:'Buy now',
payChannel:'Payment channel',
chanSwUsdt:'USDT · Crypto', chanSwCny:'CNY · Alipay',
chanUsdt:'Crypto · USDT', chanCny:'Alipay · CNY',
ordPlan:'Plan', ordAmount:'Amount', ordUntil:'Valid until',
payNetwork:'Network', payAddr:'Address', payAmount:'Exact amount',
payHintCryptoTpl:'Send exactly {amt} USDT (including the last decimals) — the amount is used for automatic reconciliation.',
payOpenAlipay:'Open Alipay', payHintAlipay:'You will be redirected to Alipay; after payment you return here and get activated.',
payWaitCrypto:'Waiting for confirmation…', payWaitAlipay:'Waiting for payment…',
paySwitch:'Change channel', payCancel:'Cancel order',
demoReview:'Demo', demoPaid:'▸ Simulate paid', demoFailed:'▸ Simulate failure',
succTitle:'Payment successful', succSubTpl:'PRO ({name}) · valid until {date}', purDone:'Done',
failTitle:'Payment failed', failSub:'Order timed out, please retry', purRetry:'Retry',
toastCopied:'Copied: {v}', toastAlipay:'Opened Alipay (demo)',
secBilling:'Buy · Orders · Redeem', rowBuyPlan:'Buy a plan', navRedeemCode:'Redeem code',
secInvite:'Referral', inviteEntry:'Invite friends, earn membership', inviteEntrySub:'Both sides earn plan days', secGeneral:'General',
setGrpConn:'Connection', setLaunch:'Launch at startup', setAutoConn:'Auto-connect', setSmartRoute:'Smart routing', setKill:'Kill Switch',
setGrpAppr:'Appearance', setGrpAbout:'About', setCheckUpdate:'Check for updates',
contactEmail:'Email', contactWeb:'Website', contactHours:'Service hours', contactHoursVal:'Daily 9:0024:00 (GMT+8)',
navNotifications:'Notifications', notiFoot:'Recent notifications only (demo)',
nt1Type:'Important', nt1Title:'Terms & privacy policy updated', nt1Sub:'We have updated our terms — please review the latest version.',
cbSubOn:'SECURE',
chanCny:'Alipay · CNY',
chanSwCny:'CNY · Alipay',
chanSwUsdt:'USDT · Crypto',
chanUsdt:'Crypto · USDT',
chartTwoWeeks:'Last 2 weeks',
connDoing:'Connecting',
connOff:'CONNECT',
contactEmail:'Email',
contactHours:'Support hours',
contactHoursVal:'Daily 9:00 24:00 (GMT+8)',
contactWeb:'Website',
demoDeviceLimit:'Device limit',
demoFailed:'▸ Simulate failure',
demoGate:'Gate',
demoLang:'Language',
demoPaid:'▸ Simulate paid',
demoReview:'Demo',
demoTheme:'Theme',
demoUpdate:'Update',
demoView:'View',
devAll:'All devices',
devClearLogin:'Clear login info',
devClearedToast:'Login info cleared (demo)',
devForceLogout:'Force logout',
devFreeLbl:'My devices · 1 / 1',
devLoggedOutToast:'Force logged out (demo)',
devMgmt:'My devices',
devOnlineNow:'Online now',
devProLbl:'My devices · 3 / 5',
devRename:'Rename',
devRenamedToast:'Renamed (demo)',
disconnect:'Disconnect',
dlDesc:'Your account allows up to 5 devices at once. Remove one to continue.',
dlOnline:'Online',
dlRemove:'Remove',
dlRemoveLru:'Remove least recently used',
dlTitle:'Device limit reached',
failSub:'Order timed out, please retry',
failTitle:'Payment failed',
feat5:'5 devices at once',
feat80:'80+ global nodes',
featSupport:'Priority support',
featUnlimited:'Unlimited time & data',
followLight:'Off',
inviteCode:'Invite code',
inviteEntry:'Invite friends, earn membership',
inviteEntrySub:'Friend signs up · both earn days',
inviteHeadline:'Invite friends, earn membership',
inviteJoinTgBtn:'Join channel',
inviteJoinTgTitle:'Join Telegram channel',
inviteLede:'When friends sign up, buy, or join the community, both of you earn plan days.',
inviteLink:'Invite link',
inviteProgress:'My rewards',
inviteProgressSub:'Invited 2 friends · earned 6 days (demo)',
inviteR1:'Sign up · +3 days each',
inviteR2:'First purchase · +7 days each',
inviteR3:'Join TG · +3 days',
inviteRewards:'Rewards',
inviteShare:'Share invite link',
inviteStatConverted:'Converted',
inviteStatDays:'Days earned',
inviteStatInvited:'Invited',
inviteTaskDone:'Claimed +3 days',
inviteTasksTitle:'More ways to earn',
inviteTgDemoDone:'Demo · claimed',
inviteTgDemoPending:'Demo · pending',
inviteTgSub:'+3 days',
inviteTitle:'Invite friends',
inviteVerifyBtn:'Verify & claim',
kAmount:'Amount',
kCreated:'Created',
kDeadline:'Pay before',
kMethod:'Payment method',
kOrderNo:'Order no.',
kPlan:'Plan',
kStatus:'Status',
kTrade:'Trade No.',
kValid:'Valid until',
lastOnline:'Last online',
latency:'Ping',
logout:'Sign out',
maintenance:'Maintenance',
myDevices:'My devices',
nHKt:'Hong Kong 01',
nJPt:'Japan · Tokyo 02',
nSGt:'Singapore 01',
nTWt:'Taiwan 01',
nUSt:'USA · Los Angeles 03',
navAccount:'Account',
navConnect:'Connect',
navContact:'Contact us',
navDevices:'My devices',
navNodes:'Servers',
navNotifications:'Notifications',
navOrders:'My orders',
navRedeem:'Redeem & buy',
navRedeemCode:'Redeem a code',
navRouting:'Routing rules',
navSettings:'Settings',
navStats:'Stats',
navWebUC:'User Center (Web)',
notiFoot:'Recent notifications only (demo)',
nt1Full:'This update adds details on data retention and third-party sharing. It does not affect your existing account or subscription — please review the full version in the web user center.',
nt2Type:'Feature', nt2Title:'New Japan · Osaka lines added', nt2Sub:'Three low-latency lines are now live.',
nt3Type:'News', nt3Title:'Invite-a-friend event is live', nt3Sub:'Invite friends to sign up — both sides earn membership days.',
nt4Type:'Reward', nt4Title:'Referral reward: +3 days credited', nt4Sub:'Your friend has completed sign-up — the days have been added to your account.',
nt5Type:'Version', nt5Title:'v1.0.73 is out', nt5Sub:'Bug fixes included — update is recommended.', nt5Btn:'Update now',
nt6Type:'Promo', nt6Title:'¥6/mo promo is live', nt6Sub:'Limited-time offer — PRO monthly as low as ¥6, while it lasts.',
inviteTitle:'Invite friends', inviteHeadline:'Invite friends, earn membership', inviteLede:'When friends sign up, buy, or join the community, both of you earn plan days.',
inviteCode:'Invite code', inviteLink:'Invite link', inviteRewards:'How rewards work',
inviteR1:'Friend signs up · +3 days each', inviteR2:'Friend first purchase · +7 days each', inviteR3:'Join TG channel · earn 3 days',
inviteProgress:'My rewards', inviteProgressSub:'Invited 2 friends · earned 6 days (demo)', inviteShare:'Share invite link',
inviteStatInvited:'Invited', inviteStatConverted:'Converted', inviteStatDays:'Days earned',
inviteTasksTitle:'More ways to earn', inviteJoinTgTitle:'Join Telegram channel', inviteTgSub:'+3 days',
inviteJoinTgBtn:'Join channel', inviteVerifyBtn:'Verify & claim', inviteTaskDone:'Claimed +3 days',
inviteTgDemoPending:'Demo · pending', inviteTgDemoDone:'Demo · claimed',
redeemLabel:'Redemption code', redeemPh:'Enter your code', redeemBtn:'Redeem now', redeemHint:'Enter a code to instantly activate plan time.'
nt1Sub:'We have updated our terms — please review the latest version.',
nt1Title:'Terms & privacy policy updated',
nt1Type:'Important',
nt2Sub:'Three low-latency lines are now live.',
nt2Title:'New Japan · Osaka lines added',
nt2Type:'Feature',
nt3Sub:'Invite friends to sign up — both sides earn membership days.',
nt3Title:'Invite-a-friend event is live',
nt3Type:'News',
nt4Sub:'Your friend has completed sign-up — the days have been added to your account.',
nt4Title:'Referral reward: +3 days credited',
nt4Type:'Credited',
nt5Btn:'Update now',
nt5Sub:'Bug fixes included — update is recommended.',
nt5Title:'v1.0.73 is out',
nt5Type:'Update',
nt6Sub:'Limited-time offer — PRO monthly as low as ¥6, while it lasts.',
nt6Title:'¥6/mo promo is live',
nt6Type:'Promo',
ordAmount:'Amount',
ordDetailTitle:'Order details',
ordPlan:'Plan',
ordSecDetail:'Details',
ordUntil:'Valid until',
payAddr:'Address',
payAmount:'Amount',
payCancel:'Cancel order',
payChannel:'Payment channel',
payHintAlipay:'You will be redirected to Alipay; after payment you return here and get activated.',
payHintCryptoTpl:'Send exactly {amt} USDT (including the last decimals) — the amount is used for automatic reconciliation.',
payNetwork:'Network',
payOpenAlipay:'Pay with Alipay',
paySwitch:'Switch payment method',
payWaitAlipay:'Waiting for payment…',
payWaitCrypto:'Waiting for confirmation…',
perMo:' /mo',
periodMonth:'This month',
periodToday:'Today',
periodWeek:'This week',
pillDoing:'Connecting',
pillFree:'Free',
pillOffPro:'Not connected',
pillOn:'SECURE',
planFree:'Free',
planMonth:'Monthly',
planPop:'Popular',
planProMeta:'PRO member · 2027-07-11',
planQuarter:'Quarterly',
planYear:'Yearly',
prefLang:'Language',
prefProtocol:'Protocol',
prefTheme:'Dark appearance',
proIncludes:'All plans include',
purCheckout:'Payment',
purDone:'Done',
purRetry:'Retry',
purTitle:'Purchase',
rateDown:'Down',
rateUp:'Up',
recommend:'Recommended',
redeemBtn:'Redeem',
redeemHint:'Enter a code to instantly activate plan time.',
redeemLabel:'Redemption code',
redeemPh:'Enter activation code',
rel2h:'2h ago',
relYday:'yesterday',
renew:'Renew / Upgrade',
rowBuyPlan:'Purchase',
'rr.forced':'🔒',
'rr.lan':'LAN & private direct',
'rr.lanSub':'Always on',
searchPh:'Search country / city',
secAccount:'Account info',
secBilling:'Buy · Orders · Redeem',
secDevices:'Devices',
secGeneral:'General',
secInvite:'Referral',
secMore:'More',
secPref:'Preferences',
segDark:'Dark',
segFree:'Free',
segHide:'Hide',
segLight:'Light',
segPro:'PRO',
segShow:'Show',
setAutoConn:'Auto-connect',
setCheckUpdate:'Check for updates',
setGrpAbout:'About',
setGrpAppr:'Appearance',
setGrpConn:'Connection',
setKill:'Kill Switch',
setLaunch:'Launch at startup',
setSmartRoute:'Smart routing',
smartSub:'Picks the best node for your network',
smartTitle:'Smart select',
stDoing:'Connecting…',
stOff:'Tap to connect',
stOn:'Connected · Encrypted',
statDownArr:'↓ Down',
statDur:'Duration',
statUpArr:'↑ Up',
stateOn:'On',
statsFilterLbl:'Device',
succSubTpl:'PRO ({name}) · valid until {date}',
succTitle:'Activated',
tagDistant:'Distant',
tagLowLat:'Low latency',
tagStable:'Fast & stable',
tagStream:'Streaming',
thisDevice:'This device',
toastAlipay:'Opened Alipay (demo)',
toastCopied:'Copied: {v}',
toastUpdate:'Demo: go to store to update',
unavail:'Unavailable',
updateCta:'Update',
updateTitle:'New version v1.1.0',
upgrade:'Renew / Upgrade'
}
};
// <<<end-gen-i18n>>>
/* ---------- 节点数据 ---------- */
const NODES = {
@@ -0,0 +1,76 @@
#!/usr/bin/env node
// check-proto-i18n.mjs — 原型 i18n 验收闸
//
// 解析 design/prototype/screens/{ui-desktop,ui-mobile}.html 里所有 data-i18n /
// data-i18n-ph 用到的 key,断言每个 key 在生成的 I18N 块里 **zh 与 en 都非空**
// (产品 key 经 alias 来自 strings.json,挡板 key 来自 overlay)。任一 unresolved
// → 非零退出并列出。
//
// 用法: node design/prototype/tools/check-proto-i18n.mjs
import fs from 'node:fs';
import path from 'node:path';
import url from 'node:url';
const ROOT = path.resolve(path.dirname(url.fileURLToPath(import.meta.url)), '..', '..', '..');
const SCREENS = path.join(ROOT, 'design/prototype/screens');
// 允许 en 为空的装饰性 key(如 latin 品牌副标,en 态刻意留空以隐藏)
const EMPTY_EN_OK = { 'ui-mobile.html': new Set(['brandLatin']) };
// 从 marker 之间 eval 出 I18N 对象
function loadI18N(src) {
const s = src.indexOf('// <<<gen-i18n>>>');
const e = src.indexOf('// <<<end-gen-i18n>>>');
const block = src.slice(s, e);
// 锚定到大写 `I18N` 声明的 `{`(跳过 marker 注释里出现的小写 i18n/{...})
const braceStart = block.indexOf('{', block.indexOf('I18N'));
let depth = 0, i = braceStart, inStr = null;
for (; i < block.length; i++) {
const c = block[i], p = block[i - 1];
if (inStr) { if (c === inStr && p !== '\\') inStr = null; continue; }
if (c === "'" || c === '"' || c === '`') { inStr = c; continue; }
if (c === '{') depth++;
else if (c === '}') { depth--; if (depth === 0) { i++; break; } }
}
const obj = new Function('return (' + block.slice(braceStart, i) + ')')();
// desktop: {k:{zh,en}} → 归一; mobile: {zh:{k},en:{k}} → 归一
if (obj.zh && obj.en && typeof obj.zh === 'object') {
const flat = {};
for (const k of Object.keys(obj.zh)) flat[k] = { zh: obj.zh[k], en: obj.en[k] };
return flat;
}
return obj;
}
// 抽取 HTML 里所有 data-i18n / data-i18n-ph 引用的 key
function usedKeys(src) {
const set = new Set();
for (const m of src.matchAll(/data-i18n(?:-ph)?="([^"]+)"/g)) set.add(m[1]);
return set;
}
let failed = 0;
for (const file of ['ui-desktop.html', 'ui-mobile.html']) {
const src = fs.readFileSync(path.join(SCREENS, file), 'utf8');
const dict = loadI18N(src);
const used = usedKeys(src);
const emptyOk = EMPTY_EN_OK[file] || new Set();
const unresolved = [];
for (const k of [...used].sort()) {
const v = dict[k];
if (!v) { unresolved.push(`${k}: 缺失(不在生成的 I18N)`); continue; }
if (v.zh == null || v.zh === '') unresolved.push(`${k}: zh 为空`);
if ((v.en == null || v.en === '') && !emptyOk.has(k)) unresolved.push(`${k}: en 为空`);
}
if (unresolved.length) {
failed += unresolved.length;
console.error(`${file}: ${unresolved.length} unresolved`);
unresolved.forEach((u) => console.error(` ${u}`));
} else {
console.log(`${file}: ${used.size} data-i18n keys 全部 resolved(zh/en 非空)`);
}
}
if (failed) { console.error(`\n✗ 共 ${failed} 项 unresolved`); process.exit(1); }
console.log('✓ 原型 i18n 验收通过');