SuperAPI AI 工具集

i18n-localization

编程与开发

查看项目

更新于 11-06 12:08

技能介绍

i18n Localization 是一个面向应用国际化的检查与生成工具集,可移植性为 3 个纯 Python 标准库脚本,无需网络,也不依赖翻译服务。这些脚本只负责检查和生成文件,从不翻译文本或调用 API。

用途

发布一个包含新语言的版本时,通常会在相同的地方出问题:英文新增的键从未同步、翻译者重命名了占位符、俄语或阿拉伯语文件直接复制了英文的两种复数形式、界面文本从未经过 t()、日期使用服务器区域设置格式化。该技能把上述每一项变成发布前会失败的检查,而不是发布后的缺陷报告。

主要能力

第一步,翻译文件检查:python scripts/locale_sync.py locales/ --source-locale en。该脚本读取 JSON/ARB(i18next 或 ICU)、.properties、Apple .strings、Android strings.xml 和 gettext .po,将每个目标文件与同一命名空间的源文件配对,并在以下情况阻断:缺失或为空的键、占位符被更改、ICU 语法错误、复数/选择缺少 other、永远无法匹配的零分支、以及目标区域设置所需的复数类别(俄语 few/many,阿拉伯语六种形式),使用内置的 CLDR 49 表。未翻译的值、孤立键、模糊条目和标记漂移为警告。

第二步,代码检查:python scripts/hardcoded_strings.py src/。该脚本在以下情况阻断:标签之间的字面文本和面向用户的字面属性(placeholder、alt、aria-label、title 等),并对以下情况发出警告:从 {cond ? 'Saving...' : ...} 渲染的字面量、t('a') + x 拼接、没有区域设置的 toLocaleString()、'$' + amount 以及硬编码的日期模式。这是一种文本启发式检查:请阅读每条发现。可使用 --warn-only 在遗留代码库上采用,使用 i18n-ignore 忽略某一行,使用 .i18n-allow 处理品牌名称。

第三步,布局检查:python scripts/pseudo_localize.py locales/en/common.json -o locales/en-XA/common.json 以及 python scripts/pseudo_localize.py locales/en/common.json --bidi -o locales/ar-XB/common.json。该脚本为每个字符串添加重音、填充(按翻译增长率)和括号,同时保持占位符和 ICU 语法不变。屏幕上出现纯英文即为硬编码字符串;[[... 被截断表示截断;[[a]] [[b]] 表示拼接。

使用方式

按上述三步工作流运行脚本。所有脚本支持 --help、--sample 和 --output json。退出码:locale_sync.py 为 0 · 2 警告 · 3 输入错误 · 4 阻断;hardcoded_strings.py 为 0 · 2 · 3 · 4;pseudo_localize.py 为 0 · 3。

硬性规则

切勿拼接翻译片段。每句一条消息,使用命名占位符和复数分支。

复数形式遵循目标区域设置的 CLDR,而非英语。切勿将 _one/_other 复制到 ru、pl、uk、cs、ar、he 文件后就认为完成。

在 ICU 中,空计数消息使用 =0,而非 zero。

将区域设置传递给每个格式化器。货币来自数据,而非界面区域设置。

占位符是代码。翻译者可以移动它们,但绝不能重命名或删除;在顺序可能变化时使用位置参数 %1$s。

不要为了让检查器通过而进行机器翻译。缺失的翻译会回退到源语言;错误的翻译会静默发布。请为翻译者标记缺口。

适用场景

适用于添加界面文本、添加或发布语言、审查翻译文件,或在应用中构建 i18n 时。

限制

脚本只检查和生成文件,不翻译文本,也不调用 API。第二步是文本启发式检查,需要人工阅读每条发现。资料未提供其他限制说明。

参考资料与资产

references/plurals_and_messages.md:各区域设置的 CLDR 类别、ICU 规则、库键形状、占位符(8 个来源)

references/string_routing_and_formatting.md:应通过 t() 路由的内容、Intl 格式化、BCP 47 与回退(7 个来源)

references/layout_rtl_pseudo.md:文本扩展、伪区域设置、RTL、发布检查清单(7 个来源)

assets/i18n-gate.yml:CI 作业示例

assets/i18n-allow.example:允许列表格式