在 #3546 切片六复用切片五(PR #3847 )的取证方法时发现。观察级:结论本身没害到用户,坏的是方法 和一条空转的断言 ,而后者会让下一个切片踩同一个坑。
事实
PR #3847 正文写:
ru | 全包 0 处 使用括号复数记法(改写句式或缩写,如 {{count}} дн.)
实测(用 Unicode 属性类 /\([\p{L}]{1,4}\)/u 扫十包全部值):
包
命中
例
en
28
{{count}} row(s) with errors
ko
63
{{field}}은(는) 필수입니다
fr
36
{{count}} ligne(s) modifiée(s)
pt
33
{{count}} linha(s) modificada(s)
es
27
{{count}} fila(s) corregida(s)
ar
24
{{count}} صف(صفوف) معدّل(ة)
de
16
{{count}} Zeile(n) importiert.
ru
13
appDesigner.objectManager.fieldCount = {{count}} поле(й)
zh
9
(已编辑)
ja
8
(編集済み)
原因:JS 正则的 \w 不带 u 时等于 [A-Za-z0-9_],所以 поле(й) / صف(صفوف) / (已编辑) 一个都匹配不到。ru 的真实结论恰恰相反 —— 该包用 这个记法,而且用在与切片五那个 key 结构完全相同的「计数 + 单位」标签上({{count}} поле(й))。
连带:一条已合并的空转断言
packages/i18n/src/__tests__/marketplace-preview-namespace-3546.test.tsx 里(PR #3847 ):
for ( const lang of LANGS . filter ( ( l ) => l !== 'en' ) ) {
expect (
/ \( \w { 1 , 4 } \) / . test ( at ( builtInLocales [ lang ] , 'preview.history.items' ) as string ) ,
`${ lang } items reintroduced a "(s)" marker` ,
) . toBe ( false ) ;
}
对 zh / ja / ko / ru / ar 五个包这条恒为 false ,无论值写成什么 —— 它只对 de/fr/es/pt 真正起作用。断言想守的正是"ru 不要引入 (ов) 这类记法",而那一半守不到。
影响与不影响
expect ( MARKER . test ( 'поле(й)' ) ) . toBe ( true ) ;
expect ( / \( \w { 1 , 4 } \) / . test ( 'поле(й)' ) ) . toBe ( false ) ; // 记录旧写法为什么不行
建议
把 fix(i18n): 回填 marketplace + preview 两命名空间 37 个缺失语言 key 及 marketplace.disclosure.runtime. 前缀家族,十包补齐 (#3546 切片五) #3847 那条断言的正则改成 Unicode 属性类(一行),它就恢复对五个包的覆盖 —— 顺手核实一下改完是否仍绿(切片六实测:ru/ar 的 preview.history.items 是 элементов / عناصر,不含括号,所以应当仍绿)。
packages/i18n 的测试里凡按"排版记法"做普查/断言的正则,一律带 u + \p{L};这条值得进 AGENTS.md 的 i18n 取证纪律,因为本仓十个包里有五个是非拉丁文字。
关联:#3546 (切片五 PR #3847 是本条的来源,切片六实测)、#3847 。
在 #3546 切片六复用切片五(PR #3847)的取证方法时发现。观察级:结论本身没害到用户,坏的是方法和一条空转的断言,而后者会让下一个切片踩同一个坑。
事实
PR #3847 正文写:
实测(用 Unicode 属性类
/\([\p{L}]{1,4}\)/u扫十包全部值):{{count}} row(s) with errors{{field}}은(는) 필수입니다{{count}} ligne(s) modifiée(s){{count}} linha(s) modificada(s){{count}} fila(s) corregida(s){{count}} صف(صفوف) معدّل(ة){{count}} Zeile(n) importiert.appDesigner.objectManager.fieldCount={{count}} поле(й)(已编辑)(編集済み)原因:JS 正则的
\w不带u时等于[A-Za-z0-9_],所以поле(й)/صف(صفوف)/(已编辑)一个都匹配不到。ru 的真实结论恰恰相反 —— 该包用这个记法,而且用在与切片五那个 key 结构完全相同的「计数 + 单位」标签上({{count}} поле(й))。连带:一条已合并的空转断言
packages/i18n/src/__tests__/marketplace-preview-namespace-3546.test.tsx里(PR #3847):对 zh / ja / ko / ru / ar 五个包这条恒为
false,无论值写成什么 —— 它只对 de/fr/es/pt 真正起作用。断言想守的正是"ru 不要引入(ов)这类记法",而那一半守不到。影响与不影响
preview.history.items最终改用common.itemCount的既有单位词(элементов/عناصر…),那个决定的依据是"复用既有邻键译文",与本条无关,结论正确。\w会对五个包给出假的 0。258 个 t() 调用点引用的 key 在任何语言包里都不存在(#3530 守卫首跑实测),其中 8 处直接把 raw key 渲染给用户 #3546 切片六因此改用/\([\p{L}]{1,4}\)/u,并在自己的测试里把这一点连同反例一起钉住:建议
preview.history.items是элементов/عناصر,不含括号,所以应当仍绿)。packages/i18n的测试里凡按"排版记法"做普查/断言的正则,一律带u+\p{L};这条值得进 AGENTS.md 的 i18n 取证纪律,因为本仓十个包里有五个是非拉丁文字。关联:#3546(切片五 PR #3847 是本条的来源,切片六实测)、#3847。