feat(i18n): 分流规则页静态标签接单源 + 修 mobile 设置行模式 pill 语言

路由页此前静态标签硬编码中文,EN 模式混语。全部接进 strings.json 单源:
- 新增 26 个 routing* 产品 getter(6 语):代理模式/内置规则/国内直连/我的规则/
  添加规则/从文本导入/重置默认/最终/直连·走隧道·拒绝/域名后缀/GeoSite 规则集/返回设置…
  (复用 smartRoute;seg 三项 EN 取短词 Global/Smart/Direct 适配段宽)。
- app_text.dart +26 抽象声明;重生成 6 份 strings_*.dart;alias.json desktop +24 / mobile +19。
- markup 加 data-i18n;JS pill(直连/走隧道/拒绝、FINAL)统一改从生成的 I18N 单源取(_ri),
  与静态 pill 同源。JS-owned 的模式说明 rtModeNote 保留 _t 双语(不加 data-i18n)。
- desktop LAN 行(此前未接)补接 rr.lan/rr.lanSub + 新 routingForcedPill。
- 修 mobile 设置行「Routing rules」的模式 pill:缺 data-i18n → EN 显中文,补 setSmartRoute
  (en=Smart routing,与 desktop 一致)。

验收:l10n 重生成+analyze 0 issue、原型 0 unresolved、生成器零 diff、244 测试全绿、无红线词。

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 11:09:03 +08:00
parent a78364ebec
commit 64b1ec10c2
11 changed files with 650 additions and 43 deletions
+192
View File
@@ -2000,6 +2000,198 @@
"ko": "항상 켜짐",
"ru": "Всегда включено",
"es": "Siempre activo"
},
"routingForcedPill": {
"zh": "🔒 强制",
"en": "🔒 Forced",
"ja": "🔒 強制",
"ko": "🔒 강제",
"ru": "🔒 Принудительно",
"es": "🔒 Forzado"
},
"routingProxyMode": {
"zh": "代理模式",
"en": "Proxy mode",
"ja": "プロキシモード",
"ko": "프록시 모드",
"ru": "Режим прокси",
"es": "Modo de proxy"
},
"routingModeGlobal": {
"zh": "全局代理",
"en": "Global",
"ja": "グローバル",
"ko": "전체",
"ru": "Глобально",
"es": "Global"
},
"routingModeSmart": {
"zh": "智能分流",
"en": "Smart",
"ja": "スマート",
"ko": "스마트",
"ru": "Умный",
"es": "Inteligente"
},
"routingModeDirect": {
"zh": "全部直连",
"en": "Direct",
"ja": "直接",
"ko": "직접",
"ru": "Напрямую",
"es": "Directo"
},
"routingBuiltin": {
"zh": "内置规则",
"en": "Built-in rules",
"ja": "組み込みルール",
"ko": "기본 규칙",
"ru": "Встроенные правила",
"es": "Reglas integradas"
},
"routingCnDirect": {
"zh": "国内直连",
"en": "China direct",
"ja": "国内は直接接続",
"ko": "국내 직접 연결",
"ru": "Прямой доступ внутри страны",
"es": "Directo nacional"
},
"routingMyRulesOrdered": {
"zh": "我的规则 · 有序,首命中生效",
"en": "My rules · ordered, first match wins",
"ja": "マイルール · 順序あり、最初の一致が有効",
"ko": "내 규칙 · 순서대로, 첫 일치 적용",
"ru": "Мои правила · по порядку, срабатывает первое совпадение",
"es": "Mis reglas · en orden, gana la primera coincidencia"
},
"routingMyRulesFirst": {
"zh": "我的规则 · 首命中生效",
"en": "My rules · first match wins",
"ja": "マイルール · 最初の一致が有効",
"ko": "내 규칙 · 첫 일치 적용",
"ru": "Мои правила · срабатывает первое совпадение",
"es": "Mis reglas · gana la primera coincidencia"
},
"routingFinalLong": {
"zh": "最终(未命中任何规则)",
"en": "Final (no rule matched)",
"ja": "最終(どのルールにも一致しない)",
"ko": "최종(일치하는 규칙 없음)",
"ru": "Итог (ни одно правило не совпало)",
"es": "Final (ninguna regla coincide)"
},
"routingFinalShort": {
"zh": "最终(未命中)",
"en": "Final (no match)",
"ja": "最終(一致なし)",
"ko": "최종(일치 없음)",
"ru": "Итог (нет совпадений)",
"es": "Final (sin coincidencia)"
},
"routingFinalFallback": {
"zh": "FINAL 兜底",
"en": "FINAL fallback",
"ja": "FINAL フォールバック",
"ko": "FINAL 폴백",
"ru": "FINAL — резерв",
"es": "FINAL — reserva"
},
"routingTypeDomainSuffix": {
"zh": "域名后缀",
"en": "Domain suffix",
"ja": "ドメインサフィックス",
"ko": "도메인 접미사",
"ru": "Суффикс домена",
"es": "Sufijo de dominio"
},
"routingTypeDomainSuffixCi": {
"zh": "域名后缀 · CI 源",
"en": "Domain suffix · CI source",
"ja": "ドメインサフィックス · CI ソース",
"ko": "도메인 접미사 · CI 소스",
"ru": "Суффикс домена · CI-источник",
"es": "Sufijo de dominio · fuente CI"
},
"routingTypeDomainSuffixMirror": {
"zh": "域名后缀 · 镜像",
"en": "Domain suffix · Mirror",
"ja": "ドメインサフィックス · ミラー",
"ko": "도메인 접미사 · 미러",
"ru": "Суффикс домена · зеркало",
"es": "Sufijo de dominio · espejo"
},
"routingTypeGeosite": {
"zh": "GeoSite 规则集",
"en": "GeoSite rule-set",
"ja": "GeoSite ルールセット",
"ko": "GeoSite 규칙 세트",
"ru": "Набор правил GeoSite",
"es": "Conjunto de reglas GeoSite"
},
"routingActDirect": {
"zh": "直连",
"en": "Direct",
"ja": "直接接続",
"ko": "직접 연결",
"ru": "Напрямую",
"es": "Directo"
},
"routingActProxy": {
"zh": "走隧道",
"en": "Tunnel",
"ja": "トンネル",
"ko": "터널",
"ru": "Туннель",
"es": "Túnel"
},
"routingActReject": {
"zh": "拒绝",
"en": "Reject",
"ja": "拒否",
"ko": "거부",
"ru": "Отклонить",
"es": "Rechazar"
},
"routingForcedRow": {
"zh": "⚠ 该域名由系统强制走隧道,此规则不生效",
"en": "⚠ Forced to tunnel by the system; this rule is inactive",
"ja": "⚠ このドメインはシステムにより強制的にトンネル経由となり、このルールは無効です",
"ko": "⚠ 이 도메인은 시스템에 의해 강제로 터널을 사용하며, 이 규칙은 적용되지 않습니다",
"ru": "⚠ Домен принудительно направлен через туннель системой; правило неактивно",
"es": "⚠ El sistema fuerza el túnel para este dominio; esta regla no se aplica"
},
"routingAddRule": {
"zh": "添加规则",
"en": "Add rule",
"ja": "ルールを追加",
"ko": "규칙 추가",
"ru": "Добавить правило",
"es": "Añadir regla"
},
"routingImport": {
"zh": "从文本导入",
"en": "Import from text",
"ja": "テキストから読み込み",
"ko": "텍스트에서 가져오기",
"ru": "Импорт из текста",
"es": "Importar desde texto"
},
"routingReset": {
"zh": "重置默认",
"en": "Reset defaults",
"ja": "デフォルトに戻す",
"ko": "기본값 재설정",
"ru": "Сбросить настройки",
"es": "Restablecer"
},
"routingBack": {
"zh": "返回设置",
"en": "Back to settings",
"ja": "設定に戻る",
"ko": "설정으로 돌아가기",
"ru": "Назад к настройкам",
"es": "Volver a ajustes"
}
},
"lists": {