问题
packages/i18n/src/locales/ 的 10 个语言包顶层命名空间是齐的(57 个),但下一层已经烂了。而 i18n.ts:135 设了 fallbackLng: 'en',missingKeyHandler(:145)只在 dev 生效——所以线上一律静默回退,表现为"看起来只是没翻完"。
实测数据
用 flatten 后的 key 集合与 en 对比:
| 包 |
key 数 |
相对 en 缺失 |
en 中没有的 |
| en |
2243 |
— |
— |
| zh |
2313 |
4 |
74 |
| ja / ko / de / es |
1886 |
357 |
0 |
| fr / pt / ru / ar |
1884 |
359 |
0 |
(a) 357–359 个 en 键在 8 个非中文包里不存在
按命名空间(以 ja 为例):console 141、gantt 58、grid 29、dashboard 25、home 19、list 18、topbar 12、layout 12、marketplace 8、capability 7,其余零散。
实际效果:德语/日语管理员看到的整个 AI 控制台(console.ai.*)、Gantt 工具栏、grid 批量选择全是英文。
(b) 74 个键只存在于 zh.ts,从没进过 en.ts
grid.import.* — 62 键。packages/plugin-grid/src/ImportWizard.tsx:39-45 自带一份私有 DEFAULTS 映射兜底,所以英文"碰巧"能显示——但其余 8 语拿到的是那份英文兜底,且无处可翻;两份文案还会各自漂移。
auth.setPassword.* — 12 键。调用点(apps/console/src/pages/auth/SetPasswordPage.tsx:55-108)传 defaultValue: 英文,同样是 en 能显示、其余 8 语无法翻译。
这两处是本仓库已经修过两次的同一形态:字符串只加进一个包,在大家日常测试的两种语言下"一切正常"。
(c) 4 个 en 键中文包缺失
console.commandPalette.title
console.ai.suggestions.metadataAssistant.buildInventory
console.ai.suggestions.metadataAssistant.buildRecruiting
help.keyboardShortcuts
缺一条测试
packages/i18n/src/__tests__/ 目前没有任何跨语言包 parity 测试。一个 flatten + keySet(en) === keySet(locale) 的断言可以一次性拦下 (a)(b)(c)。
写法可直接复用刚合入的 packages/i18n/src/__tests__/cloudConnection-locale-parity.test.ts(objectui#2865),它已按同样思路守住 cloudConnection 命名空间,并做过变异验证。
⚠️ 注意实施顺序:全量 parity 测试加进去会立刻失败(357×8 + 74 + 4)。所以必须"补齐 + 测试"同 PR,或者先落一份 baseline 允许列表再逐步收敛。只加测试会直接卡红 CI。
需要先决策的一点
补齐 (a) 意味着为 8 种语言生成约 2800 条译文。这是产品质量决策,不该默认由 agent 直接生成后发版:
- 接受机器翻译先行、后续人工校订?
- 还是只补齐高频命名空间(
console / home / topbar / layout),其余保持英文回退?
- 或者引入 TMS / 人工翻译流程?
(b)(c) 与这个决策无关,可以立刻做:(b) 是把已有中文补上英文原文并让其余语言可翻,(c) 是 4 条中文补全。
建议拆法
发现来源
objectstack#3589 收尾时的全仓库 i18n 覆盖排查。相关:objectui#2870(P0 全屏拦截层)、objectui#2871(手搓 zh 判断绕开语言包)。
问题
packages/i18n/src/locales/的 10 个语言包顶层命名空间是齐的(57 个),但下一层已经烂了。而i18n.ts:135设了fallbackLng: 'en',missingKeyHandler(:145)只在 dev 生效——所以线上一律静默回退,表现为"看起来只是没翻完"。实测数据
用 flatten 后的 key 集合与
en对比:(a) 357–359 个 en 键在 8 个非中文包里不存在
按命名空间(以 ja 为例):
console141、gantt58、grid29、dashboard25、home19、list18、topbar12、layout12、marketplace8、capability7,其余零散。实际效果:德语/日语管理员看到的整个 AI 控制台(
console.ai.*)、Gantt 工具栏、grid 批量选择全是英文。(b) 74 个键只存在于
zh.ts,从没进过en.tsgrid.import.*— 62 键。packages/plugin-grid/src/ImportWizard.tsx:39-45自带一份私有DEFAULTS映射兜底,所以英文"碰巧"能显示——但其余 8 语拿到的是那份英文兜底,且无处可翻;两份文案还会各自漂移。auth.setPassword.*— 12 键。调用点(apps/console/src/pages/auth/SetPasswordPage.tsx:55-108)传defaultValue:英文,同样是 en 能显示、其余 8 语无法翻译。这两处是本仓库已经修过两次的同一形态:字符串只加进一个包,在大家日常测试的两种语言下"一切正常"。
(c) 4 个 en 键中文包缺失
缺一条测试
packages/i18n/src/__tests__/目前没有任何跨语言包 parity 测试。一个 flatten +keySet(en) === keySet(locale)的断言可以一次性拦下 (a)(b)(c)。写法可直接复用刚合入的
packages/i18n/src/__tests__/cloudConnection-locale-parity.test.ts(objectui#2865),它已按同样思路守住cloudConnection命名空间,并做过变异验证。需要先决策的一点
补齐 (a) 意味着为 8 种语言生成约 2800 条译文。这是产品质量决策,不该默认由 agent 直接生成后发版:
console/home/topbar/layout),其余保持英文回退?(b)(c) 与这个决策无关,可以立刻做:(b) 是把已有中文补上英文原文并让其余语言可翻,(c) 是 4 条中文补全。
建议拆法
grid.import.*/auth.setPassword.*归位到en.ts,并消除ImportWizard的私有DEFAULTS兜底发现来源
objectstack#3589 收尾时的全仓库 i18n 覆盖排查。相关:objectui#2870(P0 全屏拦截层)、objectui#2871(手搓 zh 判断绕开语言包)。