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:
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 字典(产品内单显中/EN;langsel 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) */
|
||||
|
||||
@@ -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:00–24: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:00–24: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 验收通过');
|
||||
Reference in New Issue
Block a user