Skip to content

[finding] PR #3847 的「括号复数记法」普查用了 ASCII \w,所以 ru 的结论(0 处)是错的(实为 13 处),同一写法的断言对全部非拉丁语言包空转 #3866

Description

@yinlianghui

#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);   // 记录旧写法为什么不行

建议

  1. fix(i18n): 回填 marketplace + preview 两命名空间 37 个缺失语言 key 及 marketplace.disclosure.runtime. 前缀家族,十包补齐 (#3546 切片五) #3847 那条断言的正则改成 Unicode 属性类(一行),它就恢复对五个包的覆盖 —— 顺手核实一下改完是否仍绿(切片六实测:ru/ar 的 preview.history.itemsэлементов / عناصر,不含括号,所以应当仍绿)。
  2. packages/i18n 的测试里凡按"排版记法"做普查/断言的正则,一律带 u + \p{L};这条值得进 AGENTS.md 的 i18n 取证纪律,因为本仓十个包里有五个是非拉丁文字。

关联:#3546(切片五 PR #3847 是本条的来源,切片六实测)、#3847

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions