ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

OmniRoute i18n 国际化体系深度指南:从 51 语言 UI 到哈希增量文档翻译管线

OmniRoute i18n 国际化体系深度指南:从 51 语言 UI 到哈希增量文档翻译管线 OmniRoute i18n 国际化体系深度指南从 51 语言 UI 到哈希增量文档翻译管线【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 352 providers (150 free), 1200 models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline Copilot. Quota-aware auto-fallback, RTKCaveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550 contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute本指南基于仓库 docs/guides/I18N.mdi18n 工具链官方文档其多语言镜像位于 docs/i18n/mr/docs/guides/I18N.md编写并结合当前仓库源码、配置与脚本进行印证扩充。OmniRoute 的国际化不只是翻译 UI 文案而是一套覆盖Next.js 仪表盘 UI、CLI 命令、Markdown 文档三个层面的完整体系51 种语言、RTL 布局支持、哈希增量文档翻译、多级自动校验与 CI 门禁。读完本文你将掌握 OmniRoute i18n 的整体架构、推荐工作流npm run i18n:run、新语言接入流程、翻译质量保障手段以及 CLI 语言偏好配置可直接复用到自己的多语言项目里。上图源文件docs/diagrams/i18n-flow.mmd直观展示了源文档 → SHA-256 哈希 → 状态文件 → 差异检测 → LLM 翻译 → 镜像落盘 → CI 漂移校验的完整流程。一、体系总览UI、文档、CLI 三层国际化OmniRoute 的 i18n 不是一个单一模块而是分布在三个独立但共享同一份语言清单的层面层面承载内容关键位置仪表盘 UI前端全部界面文案src/i18n/messages/51 个{locale}.json文档镜像README、docs 下的全部 Markdowndocs/i18n/{locale}/每个语言一个目录CLIomniroute命令的用户可见字符串bin/cli/locales/51 个 JSON 目录三个层面共享同一份语言注册表config/i18n.json。这是当前仓库的单一事实源Source of Truth其中声明了默认语言、RTL 语言集合、UI-only 语言、文档排除语言以及 51 个语言条目的code、label、name、native、english、flag与aliases别名如id的[in]、phi的[fil,tl]。二、架构与运行时单一事实源 next-intl 解析2.1 配置层级JSON 为源TS 仅作适配从源码注释可以明确看出设计原则见 src/i18n/config.tssrc/i18n/config.ts被明确要求保持为薄类型适配器不允许手工维护语言列表——所有语言声明都放在config/i18n.json由config.ts通过 JSON import 直接读取并导出LOCALES、LANGUAGES、RTL_LOCALES、LOCALE_ALIASES等常量。这意味着新增一种语言本质上只改一个文件其余所有表面CLI 目录、文档镜像、前端文案目录都围绕它生成或校验。2.2 运行时解析流程仪表盘采用next-intl框架基于 Cookie 解析语言运行时链路位于 src/i18n/request.ts用户切换语言 → 写入NEXT_LOCALECookie常量定义于 src/i18n/config.ts请求进入 src/i18n/request.ts 的getRequestConfig依次读取NEXT_LOCALECookie →x-locale请求头 → 交给resolveRequestedLocale做合法性归一含别名解析例如保存的NEXT_LOCALEin会被解析为id动态import加载messages/{locale}.json组件通过useTranslations(namespace)与t(key)消费。值得注意的运行时细节request.ts实现了三层英语回退机制——缺失键回退 ENdeepMergeFallback且对__MISSING__:哨兵占位值视为缺失、缺失命名空间整块回退 EN、以及命名空间级浅合并保证任何语言在任何键缺失时都不会出现空白界面而 EN 只在非 EN 语言活跃时才被加载避免重复 import。2.3 支持的语言清单当前仓库 config/i18n.json 与src/i18n/messages/目录一致共51 个语言其中 RTL 语言为ar、fa、he、ur见config/i18n.json的rtl数组CodeLanguageRTLGoogle Translate CodearالعربيةYesarazAzərbaycan diliNoazbgБългарскиNobgbnবাংলাNobncsČeštinaNocsdaDanskNodadeDeutschNodeelΕλληνικάNoelenEnglishNoenesEspañolNoesetEestiNoetfaفارسیYesfafiSuomiNofifrFrançaisNofrgaGaeilgeNogaguગુજરાતીNoguheעבריתYesiwhiहिन्दीNohihrHrvatskiNohrhuMagyarNohuidBahasa IndonesiaNoiditItalianoNoitja日本語Nojako한국어NokoltLietuviųNoltlvLatviešuNolvmrमराठीNomrmsBahasa MelayuNomsmtMaltiNomtnlNederlandsNonlnoNorskNonophiFilipinoNotlplPolskiNoplptPortuguês (Portugal)Noptpt-BRPortuguês (Brasil)NoptroRomânăNororuРусскийNoruskSlovenčinaNoskslSlovenščinaNoslsrСрпскиNosrsvSvenskaNosvswKiswahiliNoswtaதமிழ்NotateతెలుగుNotethไทยNothtrTürkçeNotruk-UAУкраїнськаNoukurاردوYesurviTiếng ViệtNovizh-CN中文 (简体)Nozh-CNzh-TW中文 (繁體)Nozh-TW说明上表 Google Translate Code 列为历史 Google 翻译后端使用的映射新管线已转向 LLM 后端该列仅作遗留参考。三、文档翻译管线推荐方案v3.83.1 核心思路哈希增量只翻译变化的文件v3.8 起OmniRoute 文档翻译采用基于 SHA-256 的增量管线实现位于 scripts/i18n/run-translation.mjs681 行后端是任意 OpenAI 兼容的 LLM 接口通常通过 OmniRoute 自身的/chat/completions端点访问。核心机制每个源文件与每个已生成的目标文件都在 .i18n-state.json已提交仓库约 348KB中记录 SHA-256 哈希重新运行时只对哈希变化的源文件或缺失的目标文件执行重译i18n:checkCI 门禁只做哈希比对不发任何 API 请求漂移检测是确定性的。3.2 常用命令# 运行翻译增量——只触碰变化的源文件 npm run i18n:run # 只处理一个语言 npm run i18n:run -- --localept-BR # 只处理指定文件逗号分隔仓库相对路径 npm run i18n:run -- --filesCLAUDE.md,docs/architecture/ARCHITECTURE.md # 强制全量重译代价较高 npm run i18n:run -- --force # 预演不发 API、不写文件 npm run i18n:run:dry # CI 门禁状态漂移时以非零码退出 npm run i18n:check状态重引导re-bootstrappingnpm run i18n:run -- --adopt会根据磁盘上已存在的镜像文件重建.i18n-state.json——不调用 API、不写任何.md。适用场景源文件只改了链接列表或数字无需重译、状态文件丢失可加--files…/--locale…只收养子集加--dry-run预演。3.3 后端环境变量翻译后端通过环境变量配置写入.env不入库VariablePurposeOMNIROUTE_TRANSLATION_API_URLOpenAI 兼容的 base URL如…/v1OMNIROUTE_TRANSLATION_API_KEYbearer token不会出现在日志中OMNIROUTE_TRANSLATION_MODEL模型 ID如cx/gpt-5.4-miniOMNIROUTE_TRANSLATION_TIMEOUT_MS可选默认60000OMNIROUTE_TRANSLATION_CONCURRENCY可选默认4从 scripts/i18n/run-translation.mjs 源码可见脚本自带轻量.env加载器不依赖 dotenv且已设置的进程环境变量优先便于 shell/CI 覆盖同时按需惰性加载 Prettier在没有node_modules的环境也能以警告方式继续运行。3.4 输出格式约定每份翻译文件获得统一的外壳与scripts/check/check-docs-sync.mjs对llm.txt和CHANGELOG.md镜像的要求一致顶部一行# heading (native)一条 Languages: …语言选择栏一个---分隔线之后是翻译正文。你可以直接打开 docs/i18n/mr/docs/guides/I18N.md马拉地语版本文档观察这种输出形态。四、添加新语言一条命令打通所有表面新增语言不再需要手工修改六七个地方——scripts/i18n/add-locale.mjs880 行一条命令同时覆盖配置config/i18n.json、旗帜文件、仪表盘文案目录、文档镜像、CLI 目录、README 与索引、语言选择栏以及可选站点表面。# 需要 .env 中配置 OMNIROUTE_TRANSLATION_API_URL / _API_KEY / _MODEL node scripts/i18n/add-locale.mjs --codeel --englishGreek --nativeΕλληνικά --flag # 印度语言共享 in.svg 旗帜文件 node scripts/i18n/add-locale.mjs --codekn --englishKannada --nativeಕನ್ನಡ --flag --flag-filein.svg # 仅预演 node scripts/i18n/add-locale.mjs --codeel --englishGreek --nativeΕλληνικά --flag --dry-run新增后执行全套校验node --import tsx/esm --test tests/unit/i18n-locale-surfaces-parity.test.ts npm run i18n:check-ui-coverage npm run i18n:check-ratio npm run check:docs-all npm run check:cli-i18n强调一个容易踩坑的点config/i18n.json是语言唯一声明处src/i18n/config.ts只是类型化适配器绝不手工编辑而遗留的 Google 翻译生成器generate-multilang.mjs已废弃不在本流程中。五、UI 字符串翻译与同步UI 文案的源文件是 src/i18n/messages/en.json数千条翻译键随功能迭代持续增长。填充各语言缺失键的推荐命令# 为每个语言目录中所有缺失/占位的 UI 键补上翻译 npm run i18n:sync-ui -- --translate-markers --batch-size40相关辅助脚本均在 scripts/i18n/ 下脚本作用sync-ui-keys.mjs用__MISSING__:哨兵回填缺失键src/i18n/request.ts 会将其视为缺失并回退 ENcheck-ui-keys-coverage.mjs键覆盖率检查对应npm run i18n:check-ui-coveragefill-missing-from-en.mjs从 EN 填充缺失键merge-keys.mjs键合并工具check-translation-drift.mjs翻译漂移检查对应npm run i18n:checkcheck-translation-ratio.mjs真实翻译率棘轮对应npm run i18n:check-ratio约束与英文相同/占位符占比sync-language-bars.mjs重生成 语言选择栏对应npm run i18n:sync-bars六、遗留翻译脚本已弃用v3.10 移除6.1 generate-multilang.mjsGoogle 翻译scripts/i18n/generate-multilang.mjs1041 行曾是主翻译引擎现带弃用横幅禁止再用其messages模式翻译 UI 字符串。其能力记录如下仅作历史参考node scripts/i18n/generate-multilang.mjs [messages|readme|docs|all]ModeWhat it doesmessages从en.json翻译src/i18n/messages/{locale}.json中的缺失键readme将README.md翻译为项目根目录下的README.{code}.mddocs将DOC_SOURCE_FILES翻译为docs/i18n/{locale}/{docName}all运行以上全部模式其技术要点历史上曾承担大量工作文本保护翻译前遮蔽代码块、行内代码、Markdown 链接/图片、HTML 标签、表格与 ICU 占位符翻译后还原、分块批处理用__OMNIROUTE_I18N_SEPARATOR__连接多条字符串单请求上限 1800 字符、内存缓存会话内重复字符串不重复调用、指数退避重试429/5xx 最多 5 次300ms × 尝试次数、单请求 20 秒超时、已存在文件不覆盖。行为约定docs/i18n/README.md曾每次运行全量重生成根目录README.{code}.md仅当不存在时创建所有翻译文档自动插入/更新语言选择栏。目前只有readme模式根 README 变体还没有替代方案。6.2 i18n_autotranslate.pyLLM 二次翻译scripts/i18n/i18n_autotranslate.py161 行是次生翻译器使用任意 OpenAI 兼容 LLM API包括 OmniRoute 自身翻译docs/i18n/下已存在的 Markdown适合用比 Google 翻译更好的质量打磨或重译文档python3 scripts/i18n/i18n_autotranslate.py \ --api-url http://localhost:20128/v1 \ --api-key sk-your-key \ --model gpt-4o特性扫描docs/i18n/中英文段落跳过代码块、表格与已翻译内容以技术翻译 system prompt 发送段落支持全部语言。七、验证与 QA五层质量保障7.1 validate_translation.py —— 翻译校验器scripts/i18n/validate_translation.py635 行将任意语言 JSON 与en.json比对# 快速检查仅计数 python3 scripts/i18n/validate_translation.py quick -l cs # 输出 # Missing: 0 # Untranslated: 0 # Ignored (UNTRANSLATABLE_KEYS): 236 # 按分类输出详细差异 python3 scripts/i18n/validate_translation.py diff common -l cs python3 scripts/i18n/validate_translation.py diff settings -l cs # 导出 CSV / Markdown / 全量报告 python3 scripts/i18n/validate_translation.py csv -l cs report.csv python3 scripts/i18n/validate_translation.py md -l cs report.md python3 scripts/i18n/validate_translation.py -l cs检测四类问题缺失键en.json 有而语言文件无、多余键语言文件有而 en.json 无、未翻译键值等于英文源排除允许清单、占位符不匹配ICU 占位符在源与译文间不一致。退出码约定CodeMeaning0OK1Generic error2Missing strings (hard error)3Untranslated warning (soft)环境变量方式设置TRANSLATION_LANGcs或使用-l cs标志。7.2 check_translations.py —— 代码键检查器scripts/i18n/check_translations.py173 行扫描src/**/*.tsx与src/**/*.ts中的useTranslations()调用验证引用的每个键都存在于en.json# 基本检查 python3 scripts/i18n/check_translations.py # 详细输出 python3 scripts/i18n/check_translations.py --verbose # 自动修复向 en.json 补缺失键 python3 scripts/i18n/check_translations.py --fix7.3 generate-qa-checklist.mjs —— 静态分析 QAscripts/i18n/generate-qa-checklist.mjs 扫描 Next.js 页面文件输出 i18n 风险指标的 Markdown 报告node scripts/i18n/generate-qa-checklist.mjs检查项固定宽度 class 使用溢出风险、方向性 left/right classRTL 风险、裁剪倾向模式、语言 parity相对en.json的缺失/多余键、优先语言es、fr、de、ja、ar中 README 语言选择栏的存在性。输出docs/reports/i18n-qa-checklist-{date}.md。7.4 run-visual-qa.mjs —— Playwright 视觉 QAscripts/i18n/run-visual-qa.mjs 用 Playwright 在多种语言与视口下对全部仪表盘路由截图并评估页面健康# 默认es, fr, de, ja, ar, zh-CN目标 localhost:20128 node scripts/i18n/run-visual-qa.mjs # 自定义 base URL 与语言 QA_BASE_URLhttp://staging.example.com QA_LOCALESde,fr node scripts/i18n/run-visual-qa.mjs # 自定义路由 QA_ROUTES/dashboard/settings,/dashboard/providers node scripts/i18n/run-visual-qa.mjs检测文本溢出、元素裁剪、RTL 布局错位。输出docs/reports/i18n-visual-qa-{date}.md JSON 报告。7.5 术语表一致性检查 —— 语义漂移拦截键对齐check-ui-keys-coverage.mjs与 ICU 合法性validate_translation.py之外OmniRoute 还维护了按语言的术语表层拦截两类校验看不见的语义漂移例如同一英文概念 provider 在数千条字符串中被译成两个不同的中文词 提供商 vs 提供者scripts/i18n/glossary/zh-CN.json以及ko.json、zh-TW.json、protected-terms.json版本化术语表每个概念有canonical规范译法与可选synonyms列表目录中出现同义词即标记为漂移空synonyms表示已记录但暂不强制scripts/i18n/glossary/protected-terms.json产品/提供方/模型/协议/CLI/环境/标识符名称OmniRoute、OAuth、MCP、A2A、DATA_DIR等的扁平清单必须在任何译文值中原样出现。它与untranslatable-keys.json粒度不同——后者按整键排除检查前者按概念在任何值内部检查scripts/i18n/check-glossary-consistency.mjs215 行导出纯函数checkGlossaryConsistency(localeMessages, glossary, protectedTerms)返回{ violations: [...] }glossary-synonym用了非规范术语或protected-term-altered改写了受保护名称。# 默认检查 zh-CN npm run i18n:check-glossary # 显式语言 / JSON 报告 / 非失败报告模式 node scripts/i18n/check-glossary-consistency.mjs --localezh-CN node scripts/i18n/check-glossary-consistency.mjs --localezh-CN --json node scripts/i18n/check-glossary-consistency.mjs --localezh-CN --reportCI 中以i18n-glossary-zhcn作业接入门禁逻辑与i18n-ui-coverage相同跳过草稿 PRi18n 或代码变更时运行。八、不可翻译键管理untranslatable-keys.jsonscripts/i18n/untranslatable-keys.json 是应保持与英文源一致的键允许清单供validate_translation.py避免误报{ description: Keys that should remain untranslated..., keys: [ common.model, common.oauth, health.cpu ] }适合放入此清单的键类型品牌/产品名landing.brandName、common.social-github技术术语/缩写health.cpu、mcpDashboard.pid、settings.aiICU/格式串apiManager.modelsCount、health.millisecondsShort占位符值providers.openaiBaseUrlPlaceholder、cliTools.baseUrlPlaceholder协议名common.http、common.oauth、providers.oauth2Label导航区块sidebar.primarySection、sidebar.cliSection新增键只需编辑keys数组并重跑校验。九、CLI 的独立 i18n 层omnirouteCLI 拥有独立于 Next.js 仪表盘的 i18n 层所有面向用户的字符串都经t(module.key, vars)实现于 bin/cli/i18n.mjs语言目录为 bin/cli/locales/ 下的 JSON 文件——当前仓库内置 51 个与仪表盘语言清单同步缺失键自动回退en因此部分翻译也是合法状态可用语言的事实源同样是 config/i18n.json。9.1 语言选择优先级首个命中生效PrioritySourceExample1--lang标志omniroute --lang de status2OMNIROUTE_LANG环境变量OMNIROUTE_LANGja omniroute providers3LC_ALL系统环境变量从终端区域设置自动探测4LC_MESSAGES系统环境变量从终端区域设置自动探测5LANG系统环境变量从终端区域设置自动探测6回退en实现细节下划线形式pt_BR归一化为连字符形式pt-BR语言码按/^[a-zA-Z0-9-]$/校验拒绝路径穿越。9.2 保存语言偏好# 设置语言并保存到 ~/.omniroute/.env跨会话持久化 omniroute config lang set pt-BR # 查看当前语言 omniroute config lang get # 列出全部可用语言 omniroute config lang list # JSON 输出 omniroute config lang list --output json保存的偏好会原子写入~/.omniroute/.env并在 CLI 引导阶段、任何命令运行前加载。9.3 单次覆盖不持久化# 仅对本次命令生效 omniroute --lang de providers list注意--lang标志不会写入 env 文件只影响当前调用要持久化请用config lang set。9.4 各语言完成度状态51 个语言目录中en、pt-BR为完整翻译bn、gu、he、mr、ms、phi、sw、ta、te、ur为脚手架态所有键回退en其余语言翻译了commonprogram两个核心命名空间。9.5 新增 CLI 语言在config/i18n.json添加语言条目运行node bin/cli/scripts/generate-locales.mjs生成语言文件翻译键或留空{}作为 en 回退脚手架PR 必须向en.json与pt-BR.json添加字符串其余文件尽力而为。十、CI 集成每次提交都在校验翻译CI 流水线.github/workflows/ci.yml在每次 push 与 PR 上校验全部语言i18n-matrix作业——动态发现所有语言文件排除en.jsoni18n作业——并行对每个语言运行validate_translation.py quick -l langci-summary作业——聚合结果输出仪表盘摘要。# i18n-matrix: 发现语言 LANGS$(ls src/i18n/messages/*.json | xargs -n1 basename | sed s/.json$// | grep -v ^en$) # i18n: 校验每个语言 python3 scripts/i18n/validate_translation.py quick -l ${{ matrix.lang }}仪表盘输出形态## Translations | Metric | Value | |--------|------| | Languages checked | 30 | | Total untranslated | 0 | ✅ All translations complete此外文档翻译管线的npm run i18n:check也是 CI 门禁只要.i18n-state.json与磁盘镜像发生漂移即失败。十一、文件结构一览config/ └── i18n.json # 单一事实源51 语言、RTL 集合、别名 src/i18n/ ├── config.ts # 类型化适配器不手工编辑 ├── request.ts # 运行时语言解析与 EN 回退 ├── resolveRequestedLocale.ts # 语言码归一与别名解析 ├── detectBrowserLocale.ts # 浏览器语言探测 └── messages/ ├── en.json # UI 英文源数千条键 ├── cs.json ├── de.json └── ... # 共 51 个语言文件 scripts/i18n/ ├── run-translation.mjs # 哈希增量文档翻译管线681 行 ├── add-locale.mjs # 一键新增语言880 行 ├── validate_translation.py # 翻译校验器635 行 ├── check_translations.py # 代码键检查器173 行 ├── check-glossary-consistency.mjs # 术语表一致性215 行 ├── check-ui-keys-coverage.mjs # UI 键覆盖率 ├── check-translation-drift.mjs # 漂移检查 ├── check-translation-ratio.mjs # 真实翻译率棘轮 ├── sync-ui-keys.mjs # UI 键同步 ├── sync-language-bars.mjs # 语言选择栏同步 ├── generate-qa-checklist.mjs # 静态分析 QA ├── run-visual-qa.mjs # Playwright 视觉 QA ├── generate-multilang.mjs # Google 翻译引擎已弃用1041 行 ├── i18n_autotranslate.py # LLM 文档翻译已弃用161 行 ├── untranslatable-keys.json # 不可翻译键允许清单 └── glossary/ # 按语言术语表 受保护术语 ├── zh-CN.json / zh-TW.json / ko.json └── protected-terms.json bin/cli/ ├── i18n.mjs # CLI 翻译函数 t(module.key, vars) └── locales/ # 51 个 CLI 语言目录 docs/ ├── guides/I18N.md # 本指南英文原版手工维护 ├── i18n/ │ ├── README.md # 自动/半自动生成的语言索引 │ └── {locale}/docs/... # 各语言文档镜像含 mr/、zh-CN/ 等 ├── reports/ │ ├── i18n-qa-checklist-*.md # 静态分析报告 │ └── i18n-visual-qa-*.md # 视觉 QA 报告 └── diagrams/ ├── i18n-flow.mmd # 管线架构图源文件 └── exported/i18n-flow.svg # 导出图 .i18n-state.json # 已提交的翻译状态SHA-256 哈希表十二、最佳实践12.1 编辑翻译时永远先改en.json——它是唯一事实源用npm run i18n:sync-ui -- --translate-markers --batch-size40将新键传播到所有语言人工审阅自动翻译——机器翻译是起点而非终点提交前校验python3 scripts/i18n/validate_translation.py quick -l lang若某键应保持英文更新untranslatable-keys.json。12.2 占位符安全ICU 占位符{count}、{value}、{total}、{seconds}必须原样保留复数格式{count, plural, one {# model} other {# models}}必须保持结构完整校验器会自动检测占位符不匹配。12.3 在代码中新增翻译键// 使用命名空间键 const t useTranslations(settings); t(cacheSettings); // 映射到 JSON 中的 settings.cacheSettings // 运行 check_translations.py 验证键存在 python3 scripts/i18n/check_translations.py --verbose12.4 RTL 注意事项RTL 语言为ar、fa、he、ur见config/i18n.json的rtl数组避免硬编码left/rightCSS改用start/end逻辑属性用run-visual-qa.mjs捕获 RTL 布局错位。十三、已知问题与历史踩坑记录in.json→hi.json修复生成器最初为印地语使用了已废弃的 Google 翻译码in而非正确的 ISO 639-1hi产生了孤立的in.json副本。通过将code: in改为code: hi并删除孤立文件修复。in语言退役2026-09-02in后来作为第二个印尼语区域设置存活——config/i18n.json称其为 Indonesian (Legacy)README 却仍标注为印地语。现已从所有表面移除配置、目录、docs/i18n/in/、README、索引、基线。id现在声明aliases: [in]因此保存的NEXT_LOCALEin或OMNIROUTE_LANGin都会解析为id。docs/i18n/README.md改为手工维护它过去由generate-multilang.mjs docs全量重生成现已不再如此npm run i18n:add-locale原位插入新语言的行并更新计数句其余编辑手工完成。tests/unit/i18n-locale-surfaces-parity.test.ts双向守护——已配置的文档语言必须有对应行行必须能映射回已配置的语言。不可翻译键清单外部化untranslatable-keys.json允许清单从validate_translation.py内联的 Python set 移出为独立 JSON 文件便于维护校验器运行时加载。校验器快速检查输出忽略计数quick检查现在会展示来自untranslatable-keys.json的忽略键数量输出形态Missing: 0 Untranslated: 0 Ignored (UNTRANSLATABLE_KEYS): varies per release结语OmniRoute 的国际化体系给多语言工程的启示是清晰的单一事实源声明语言、自动化工具生成与补齐翻译、纯函数式校验器拦截键级与语义级漂移、CI 门禁兜底。从 51 语言的仪表盘 UI、哈希增量文档镜像到 CLI 的运行时语言探测与持久化偏好再到术语表与视觉 QA 的纵深防御整套管线既可直接照搬工作流也能拆出单个脚本如validate_translation.py、check-glossary-consistency.mjs复用到你自己的项目。相关英文原版文档与多语言镜像分别位于 docs/guides/I18N.md 与 docs/i18n/可继续深入研读。【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 352 providers (150 free), 1200 models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline Copilot. Quota-aware auto-fallback, RTKCaveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550 contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表