拓冰建站拓冰建站
首页 / 资讯中心 / 正文

OmniRoute 国际化(i18n)工程指南:30+ 语言的 UI 与文档翻译、增量管线与自动化 QA

OmniRoute 国际化i18n工程指南30 语言的 UI 与文档翻译、增量管线与自动化 QA【免费下载链接】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本指南基于 OmniRoute 仓库的 i18n 工具链文档docs/i18n/cs/docs/guides/I18N.md 及其英文主文档 docs/guides/I18N.md系统梳理 OmniRoute 的多语言体系从next-intl驱动的仪表盘 UI 翻译、CLI 独立 i18n 层到基于 LLM 与 Google Translate 的文档自动翻译管线再到覆盖键位校验、术语一致性、视觉回归的完整 QA 工具链。读完本文你将掌握如何为 OmniRoute 添加一门新语言、运行增量翻译、校验翻译质量以及在 CI 中建立防漂移门禁。快速参考i18n 常用命令一览任务命令增量翻译文档推荐基于哈希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:dryCI 漂移门禁npm run i18n:check一键新增语言配置→文档→CLI→站点npm run i18n:add-locale -- --codeel …翻译 UI 字符串npm run i18n:sync-ui -- --translate-markers --batch-size40校验单个语言环境python3 scripts/i18n/validate_translation.py quick -l cs检查代码内键位python3 scripts/i18n/check_translations.py生成静态 QA 报告node scripts/i18n/generate-qa-checklist.mjsPlaywright 视觉 QAnode scripts/i18n/run-visual-qa.mjs架构概览数据源Source of TruthOmniRoute 的 i18n 体系分为三块各有明确的唯一权威UI 字符串src/i18n/messages/en.json英文源约 2800 个键语言环境文件src/i18n/messages/{locale}.json框架next-intl基于 Cookie 的运行时语言解析语言注册表config/i18n.json—— 这是唯一声明语言的地方定义了全部 locale、RTL 集合、别名与排除项src/i18n/config.ts只是它的类型化适配层源码注释明确要求不要在此手维护语言列表config/i18n.json的顶层结构config/i18n.json{ $schema: ./i18n-schema.json, default: en, rtl: [ar, fa, he, ur], uiOnly: [en], docsExcluded: [en], locales: [ { code: cs, label: CS, name: Čeština, flag: , ... } ] }关键字段说明default默认语言enrtl从右向左排版的语言集合当前为ar、fa、he、uruiOnly/docsExcluded仅 UI 使用或从文档翻译中排除的语言locales[]每个条目的code、label、name、native、english、flag以及可选aliases旧代码别名如id声明aliases: [in]zh-TW声明[zh-hk, zh-mo, zh-hant]运行时语言解析流程仪表盘侧由src/i18n/request.ts驱动request.ts完整流程如下用户选择语言 → 写入NEXT_LOCALECookie请求时先读NEXT_LOCALECookie为空则读x-locale请求头再交给resolveRequestedLocale解析解析规则resolveRequestedLocale.ts精确匹配 → 大小写不敏感匹配 → 别名匹配如in→id、uk→uk-UA→ 回退en动态 import 加载messages/{locale}.json组件通过useTranslations(namespace)与t(key)消费值得注意的细节request.ts实现了EN 兜底合并。当活跃语言不是英文时会通过deepMergeFallback深度合并缺失键并用__MISSING__:前缀哨兵由scripts/i18n/sync-ui-keys.mjs写入识别未翻译的占位值从而让英文原文优先兜底request.ts。同时还会对新加入的命名空间做整命名空间级别的浅合并保证新增 UI 在翻译落地前始终以英文显示。支持的语言环境当前仓库的 config/i18n.json 共注册 42 个语言环境含en。下面按文档表格结构列出全部语言、RTL 标志与 Google Translate 代码代码语言RTLGoogle Translate 代码arالعربيةYesarazAzərbaycan diliNoazbgБългарскиNobgbnবাংলাNobncsČeštinaNocsdaDanskNodadeDeutschNodeenEnglishNoenesEspañolNoesfaفارسیYesfafiSuomiNofifrFrançaisNofrguગુજરાતીNoguheעבריתYesiwhiहिन्दीNohihuMagyarNohuidBahasa IndonesiaNoid别名initItalianoNoitja日本語Nojako한국어NokomrमराठीNomrmsBahasa MelayuNomsnlNederlandsNonlnoNorskNonophiFilipinoNotl别名filplPolskiNoplptPortuguês (Portugal)Noptpt-BRPortuguês (Brasil)NoptroRomânăNororuРусскийNoruskSlovenčinaNosksvSvenskaNosvswKiswahiliNoswtaதமிழ்NotateతెలుగుNotethไทยNothtrTürkçeNotruk-UAУкраїнськаNouk别名ukurاردوYesurviTiếng ViệtNovizh-CN中文 (简体)Nozh-CNzh-TW中文 (繁體)Nozh-TW别名zh-hk等注早期版本文档如 docs/i18n/cs/docs/guides/I18N.md记录为 30 种语言当前仓库的config/i18n.json已扩展至 42 个语言环境且fa、ur也加入了 RTL 集合。添加一门新语言推荐方式一键add-locale.mjs从当前仓库的英文主文档看新增语言已收敛为一条命令scripts/i18n/add-locale.mjs会同时更新配置、国旗、仪表盘目录、文档镜像、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对应的单元测试 tests/unit/i18n-locale-surfaces-parity.test.ts 双向守护语言表面一致性配置中声明的文档语言必须有一行索引记录索引中的每一行必须能映射回配置。传统手动步骤旧流程理解用早期文档记录的手动流程在generate-multilang.mjs时代包含以下步骤仍可作为理解内部机制参考注册语言在src/i18n/config.ts的LOCALES数组添加xx在LANGUAGES数组添加{ code: xx, label: XX, name: Language Name, flag: ️ }加入生成器在scripts/i18n/generate-multilang.mjs的LOCALE_SPECS添加条目含code、googleTl、label、flag、languageName、readmeName、docsName生成初始翻译node scripts/i18n/generate-multilang.mjs messages从en.json经 Google Translate 生成src/i18n/messages/xx.json人工复核自动翻译只是起点重点检查技术准确性、语境术语、占位符{count}、{value}等是否妥善处理校验python3 scripts/i18n/validate_translation.py quick -l xx与python3 scripts/i18n/validate_translation.py diff common -l xx生成翻译文档node scripts/i18n/generate-multilang.mjs docs重要提醒generate-multilang.mjsGoogle Translate 引擎在 docs/guides/I18N.md 中已被标记为弃用计划 v3.10 移除新流程一律走基于 LLM 的npm run i18n:run。仅readme模式根 README 多语言变体暂时没有替代方案。自动翻译管线推荐管线run-translation.mjs哈希驱动的增量翻译当前主推的是 scripts/i18n/run-translation.mjs它对文档做增量、确定性翻译背后是任意 OpenAI 兼容的 LLM 端点典型如 OmniRoute Cloud 的cx/gpt-5.4-mini# 增量运行——只动有变化的源文件 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 # 预演 npm run i18n:run:dry # CI 门禁——状态漂移时以非零码退出 npm run i18n:check状态重建re-bootstrapnpm run i18n:run -- --adopt可从磁盘上已有的镜像重建.i18n-state.json全程不调用 API、不写任何.md。适用于源文件改动但无需重译如链接列表、计数或状态文件丢失的场景可用--files…/--locale…限定子集加--dry-run预演。--adopt --targets-only则只重新哈希磁盘上的镜像文件保留全部source_hash让机械性的镜像重写不再被误报为目标漂移。后端配置run-translation.mjs 与 docs/guides/I18N.md 中的环境变量表环境变量用途默认值OMNIROUTE_TRANSLATION_API_URLOpenAI 兼容 base URL如…/v1必填OMNIROUTE_TRANSLATION_API_KEYBearer token不写入日志必填OMNIROUTE_TRANSLATION_MODEL模型 ID如cx/gpt-5.4-mini必填OMNIROUTE_TRANSLATION_TIMEOUT_MS单请求超时60000OMNIROUTE_TRANSLATION_CONCURRENCY并发请求数4脚本内置轻量.env加载器不依赖 dotenv已设置的进程环境变量优先。调用 LLM 时使用temperature: 0.15、非流式/chat/completions对 408/429/5xx 与超时/网络错误各重试一次。状态跟踪.i18n-state.json已提交按源文件 每个语言记录 SHA-256 哈希。i18n:checkcheck-translation-drift.mjs只做状态与磁盘的确定性对比不调用任何 API严格模式任一漂移即退出码 1可加--warn仅告警退出 0或--json机器可读报告。输出形态每个翻译文件生成顶部# headingnative、 Languages: …语言栏、---分隔线再跟翻译正文——这与 scripts/check/check-docs-sync.mjs 对llm.txt、CHANGELOG.md镜像的校验规则完全一致。翻译前先用 Prettier 的 markdown 解析器格式化保证落盘内容与 lint-staged 产物一致避免哈希漂移。其他内部机制可从 run-translation.mjs 源码验证分块正文超过 6000 字符时按顶层##标题拆块逐块翻译再以空行拼接术语归一译文产出后调用normalizeLocaleTextglossary-normalize.mjs按语言环境的规范术语表做后处理修正模型会转字不会转词的问题如 zh-TW 输出被大陆用词污染系统提示词要求保留所有 Markdown 语法、不翻译源码/URL/路径/命令/环境变量名只输出译文本身遗留引擎一generate-multilang.mjsGoogle Translate主自动翻译引擎已弃用——使用 Google Translate 免费 API 生成 UI 字符串、README 与文档翻译node scripts/i18n/generate-multilang.mjs [messages|readme|docs|all]模式行为messages从en.json翻译src/i18n/messages/{locale}.json中缺失的键readme把README.md翻译为根目录的README.{code}.mddocs把DOC_SOURCE_FILES翻译到docs/i18n/{locale}/{docName}all依次执行以上三种模式实现特性文本保护翻译前遮蔽代码块、行内代码、Markdown 链接/图片text、HTML 标签、表格与 ICU 占位符{count}、{value}、{total}等翻译后还原分块批处理用__OMNIROUTE_I18N_SEPARATOR__分隔符拼接多条字符串以减少 API 调用单请求上限 1800 字符内存缓存会话内重复字符串不重复调用重试逻辑对 429/5xx 指数退避最多 5 次300ms × 尝试序号超时单请求 20 秒跳过已有文件目标文件已存在则不覆盖需要注意的行为docs/i18n/README.md每次运行会被整体重新生成它是自动生成的语言索引根目录README.{code}.md仅在不存在时创建跳过EXISTING_README_CODES中已有的语言语言栏 **Languages:** ...会自动插入/更新到所有翻译文档。遗留引擎二i18n_autotranslate.pyLLM 文档翻译次级翻译器已弃用——使用任意 OpenAI 兼容 LLM API包括 OmniRoute 自身翻译docs/i18n/下的 Markdown 文件质量优于 Google Translate适合润色或重译python3 scripts/i18n/i18n_autotranslate.py \ --api-url http://localhost:20128/v1 \ --api-key sk-your-key \ --model gpt-4o特性扫描docs/i18n/中的英文段落跳过代码块、表格与已翻译内容以技术翻译系统提示词驱动支持全部语言。CLI 的独立 i18n 层除 Next.js 仪表盘外omnirouteCLI 拥有独立的 i18n 层bin/cli/i18n.mjs、bin/cli/locales/与仪表盘共享config/i18n.json作为语言权威所有用户可见字符串经t(module.key, vars)输出目录文件随包发布 42 个语言环境任何缺失键回退到en因此部分翻译也是合法的语言选择优先级优先级来源示例1--lang参数omniroute --lang de status2OMNIROUTE_LANG环境变量OMNIROUTE_LANGja omniroute providers3LC_ALL系统环境按终端语言自动检测4LC_MESSAGES系统环境按终端语言自动检测5LANG系统环境按终端语言自动检测6回退en下划线形式pt_BR会被规范化为连字符形式pt-BR语言代码用/^[a-zA-Z0-9-]$/校验拒绝路径穿越。持久化语言偏好与一次性覆盖# 设置语言并保存到 ~/.omniroute/.env跨会话持久 omniroute config lang set pt-BR # 查看当前语言 omniroute config lang get # 列出全部可用语言 omniroute config lang list omniroute config lang list --output json # 仅当前命令生效的一次性覆盖不写环境文件 omniroute --lang de providers list偏好以原子方式写入~/.omniroute/.envCLI 引导阶段在任何命令运行前加载。新增 CLI 语言环境的流程为在config/i18n.json添加条目 → 运行node bin/cli/scripts/generate-locales.mjs生成语言文件 → 翻译键或留空{}走 en 兜底脚手架→ PR 至少保证en.json与pt-BR.json的字符串齐全。验证与 QA 工具链validate_translation.py翻译校验器将任意语言环境 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 python3 scripts/i18n/validate_translation.py csv -l cs report.csv # 导出 Markdown python3 scripts/i18n/validate_translation.py md -l cs report.md # 完整报告默认 python3 scripts/i18n/validate_translation.py -l cs检测四类问题缺失键存在于en.json但不在语言文件中多余键存在于语言文件但不在en.json中未翻译键语言文件值与英文源相同排除 allowlist占位符不匹配ICU 占位符在源与译文之间不一致退出码约定退出码含义0正常1通用错误2缺失字符串硬错误3未翻译警告软性环境变量设置TRANSLATION_LANGcs或使用-l cs参数。check_translations.py代码到 JSON 的键位检查扫描src/**/*.tsx与src/**/*.ts中的useTranslations()调用验证所有引用的键都存在于en.jsonpython3 scripts/i18n/check_translations.py # 基本检查 python3 scripts/i18n/check_translations.py --verbose # 详细输出 python3 scripts/i18n/check_translations.py --fix # 自动补缺失键到 en.jsongenerate-qa-checklist.mjs静态分析 QA扫描 Next.js 页面文件输出 i18n 风险度量的 Markdown 报告node scripts/i18n/generate-qa-checklist.mjs检查项固定宽度 class 使用溢出风险、方向性 left/right classRTL 风险、易裁剪模式、与en.json的语言对齐缺失/多余键、重点语言es、fr、de、ja、arREADME 的语言选择栏。输出到docs/reports/i18n-qa-checklist-{date}.md。run-visual-qa.mjsPlaywright 视觉回归对多个语言与视口下的全部仪表盘路由截图并评估页面健康# 默认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 报告。术语表超越键位对齐的语义一致性键位对齐check-ui-keys-coverage.mjs与 ICU 合法性validate_translation.py无法发现语义漂移——例如同一个英文概念 provider 在中文里被分别译成提供商与提供者。仓库由此增加了按语言维护的术语层docs/guides/I18N.md 中的 Terminology Glossary 章节源自 issue #8038从 zh-CN 起步。术语表文件scripts/i18n/glossary/zh-CN.json另有 zh-TW、ko版本化的常见概念表provider、connection、routing、fallback、quota、context window、reasoning、tool call、cache、circuit breaker 等。每个概念有canonical规范译法与可选synonyms列表目录中发现任何同义词即标记为漂移。synonyms为空数组表示已记录但暂不强制目录中仍存在合法混用规范化是后续工作scripts/i18n/glossary/protected-terms.json产品/厂商/模型/协议/CLI/环境变量/标识符名称OmniRoute、OAuth、MCP、A2A、DATA_DIR等必须原样出现在任何译文值中。它按概念concept而非键路径key path检查粒度与untranslatable-keys.json整键排除不同校验入口# 默认 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 --report核心函数checkGlossaryConsistency(localeMessages, glossary, protectedTerms)返回{ violations: [...] }非规范术语产生glossary-synonym违规被改写的受保护名称产生protected-term-altered违规。已接入 CI 的i18n-glossary-zhcn作业.github/workflows/ci.yml。管理不可翻译键untranslatable-keys.json文件位置scripts/i18n/untranslatable-keys.json当前约 236 个键。允许保持与英文源完全一致的键名单用于避免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数组并重新运行校验。历史上这份名单从validate_translation.py内联的 Python set 迁移到外部 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此外还有多条专职 i18n 作业见 .github/workflows/ci.ymli18n-ui-coverage键位覆盖率阈值 65跳过草稿 PR、i18n-glossary-zhcn术语表、i18n-translation-ratio真实翻译占比/占位符比例棘轮、check-ui-value-drift陈旧翻译、check-translation-drift文档漂移当前以--warn运行、CLI i18n 一致性npm run check:cli-i18n硬门禁。文件结构config/ └── i18n.json # 唯一语言权威42 locales、RTL 集、别名、排除项 src/i18n/ ├── config.ts # 语言定义的薄类型化适配层 ├── request.ts # 运行时语言解析Cookie → 请求头 → en 兜底 ├── resolveRequestedLocale.ts # 无依赖的 locale 解析含别名 └── messages/ ├── en.json # 英文源~2800 键 ├── cs.json # 捷克语翻译 ├── de.json # 德语翻译 └── ... # 42 个语言文件 scripts/i18n/ ├── run-translation.mjs # 推荐哈希增量文档翻译LLM 后端 ├── check-translation-drift.mjs # 漂移检查CI 门禁无 API ├── add-locale.mjs # 一键新增语言 ├── sync-ui-keys.mjs # UI 键位回填/翻译 ├── check-ui-keys-coverage.mjs # UI 键位覆盖率 ├── check-ui-value-drift.mjs # UI 值漂移 ├── check-translation-ratio.mjs # 真实翻译占比 ├── check-glossary-consistency.mjs # 术语表一致性 ├── glossary/ # zh-CN/zh-TW/ko 术语表 protected-terms.json ├── generate-multilang.mjs # 弃用Google Translate 自动翻译 ├── i18n_autotranslate.py # 弃用LLM 文档翻译器 ├── generate-qa-checklist.mjs # 静态分析 QA ├── run-visual-qa.mjs # Playwright 视觉 QA ├── untranslatable-keys.json # 校验用 allowlist ├── validate_translation.py # 翻译校验器 └── check_translations.py # 代码到 JSON 键位检查 bin/cli/ ├── i18n.mjs # CLI 翻译层 └── locales/ # 42 个 CLI 语言目录 docs/ ├── guides/I18N.md # 本文英文主文档手写维护 ├── i18n/ # 自动生成的翻译文档镜像每语言一份 │ ├── README.md # 自动生成的语言索引 │ └── cs/docs/guides/I18N.md # 本文的捷克语版本 └── reports/ # QA 报告 ├── i18n-qa-checklist-*.md └── i18n-visual-qa-*.md .i18n-state.json # 提交的翻译状态源/目标哈希最佳实践编辑翻译时的守则永远先改en.json——它是唯一权威运行npm run i18n:sync-ui -- --translate-markers --batch-size40把新键传播到各语言旧流程为generate-multilang.mjs messages人工复核自动翻译——自动引擎只是起点而非终点提交前校验python3 scripts/i18n/validate_translation.py quick -l lang若某键应保持英文更新untranslatable-keys.json占位符安全ICU 占位符{count}、{value}、{total}、{seconds}必须逐字保留复数格式{count, plural, one {# model} other {# models}}必须保持结构校验器会自动检测占位符不匹配在代码中新增翻译键// 使用命名空间键 const t useTranslations(settings); t(cacheSettings); // 映射到 JSON 中的 settings.cacheSettings // 运行 check_translations.py 验证键存在 python3 scripts/i18n/check_translations.py --verboseRTL 注意事项阿拉伯语ar、希伯来语he以及当前配置中的波斯语fa、乌尔都语ur是 RTL 语言避免硬编码left/rightCSS——使用start/end逻辑属性视觉 QArun-visual-qa.mjs负责捕获 RTL 布局错位已知问题与历史in.json→hi.json修复生成器最初为印地语使用code: in已弃用的 Google Translate 代码而非正确的 ISO 639-1hi产生了孤立的in.json重复文件。已通过把generate-multilang.mjs中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实现见 resolveRequestedLocale.ts。docs/i18n/README.md改为手写维护它过去被generate-multilang.mjs docs整体重新生成现在不再如此npm run i18n:add-locale会就地插入新语言的索引行并更新计数句其余编辑均手动完成。tests/unit/i18n-locale-surfaces-parity.test.ts双向守护这一约束。validate_translation.py的忽略计数输出quick检查现在显示来自untranslatable-keys.json的忽略键数量Missing: 0 Untranslated: 0 Ignored (UNTRANSLATABLE_KEYS): varies per release架构示意图上图为 i18n 管线的总体流程源码docs/diagrams/i18n-flow.mmd从config/i18n.json的语言注册、en.json源字符串到 LLM 增量翻译、.i18n-state.json状态跟踪最终产出docs/i18n/{locale}/文档镜像与src/i18n/messages/{locale}.jsonUI 目录并由 CI 中的校验与 QA 作业闭环守护。总结OmniRoute 的 i18n 体系是一个单一权威 双翻译引擎 多层校验门禁的完整工程config/i18n.json统一声明 42 个语言环境仪表盘侧next-intl提供 Cookie 级语言解析与 EN 兜底CLI 侧有独立的--lang/OMNIROUTE_LANG选择链路文档翻译以哈希驱动的npm run i18n:run增量管线为主旧 Google Translate 引擎保留但弃用质量保障由键位校验、术语表一致性、静态 QA、Playwright 视觉回归与 CI 矩阵共同构成。对于任何需要长期维护多语言、多端Web CLI界面的团队这套以英文为唯一源、自动化翻译打底、确定性校验兜底的实践都极具参考价值。【免费下载链接】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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门