俄语站 3 件和 5 件都渲染成“3 товара”,语法格不一致,本地化验收单里有 46 条同类文案被打回。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,文案只写了一条“{0} items”,没有按语言提供复数分支。俄语有 one/few/many 三套规则,数字 3 和 5 落到的分支不同,单条模板无法覆盖。MessageFormat 的 choice 格式又依赖传入的 plural 参数,代码里没算。

「复数规则缺失」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

{count, plural, one{# товар} few{# товара} many{# товаров} other{# товара}}
MessageFormat fmt = new MessageFormat(pattern, new Locale("ru"));
System.out.println(fmt.format(new Object[]{5}));

权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

具体做法是,把文案改成 ICU plural 按语言配置 one/few/many/other;用 ICU MessageFormat 解析 不要用 java.text 的 choice 拼;让翻译按分支提交 每个分支单独校验数字;用 1 3 5 21 各跑一遍 对比输出。

最后用这个标准收尾,俄语站在 1、3、5、21 四个数字下分别输出 товар、товара、товаров、товар。

作者 9823189