在 #3546 切片五(回填 marketplace + preview 两命名空间 37 个缺失 key)裁定 es 敬称时量出,不在该 PR 范围内 (这两个 key 早已存在、值也不由本切片改动),单独记录。
现象
packages/i18n/src/locales/es.ts 的 preview.draftBar 是同一条横幅 (DraftPreviewBar)的两条互斥文案 —— 有待发布变更时渲染 message,没有时渲染 messageClean。两条的第二人称不一致:
key
es 值
人称
preview.draftBar.message
Vista previa de borrador — estás viendo cambios sin publicar. Nada está en producción hasta que publiques.
tú (estás、publiques)
preview.draftBar.messageClean
Vista previa del borrador: no hay cambios sin publicar; todo lo que ve aquí ya está activo.
usted (ve)
preview.draftBar.sampleDataBody
Está viendo la estructura de su aplicación. Publíquela para cargar registros de ejemplo y activarla.
usted (Está、su、Publíquela)
后果:一个西语用户在同一个预览横幅上,发布掉手上的草稿之后 ,横幅从 tú 切到 usted。同一个组件、同一个位置、同一次会话。
顺带一处同类的小分歧:message 用长破折号 — 分隔,messageClean 用冒号 :(en 两条都是 —)。
为什么三道 i18n 门禁都看不见
和 #3810 / #3582 / #3625 同属"值域盲区",但又是新的一类:不是与 en 不一致(两条译文都正确表达了 en 的意思),而是同一语言包内部、同一 UI 表面上的语域不一致 。任何按值比对 en 的启发式都读不出来。
量出来的分母
范围
usted 标记
tú 标记
es 全包
102
30
es marketplace.*
9
0
es preview.*
2(draftBar.messageClean、draftBar.sampleDataBody)
2(draftBar.message、empty.notReadyDescription)
es home.pendingDrafts.published
¡Publicado! Sus cambios están activos. → usted
—
所以 es 包的默认语域是 usted ,tú 是有标记的例外,且集中在 auth 登录/注册、report editor、organizations 这几个邻域(#3546 切片二当时正确裁定那几个邻域一致非正式)。preview 邻域的 2:2 是这个模式之外的一处真正分裂,而分裂恰好落在同一条横幅的两句话 上。
#3546 切片五对它做了什么(以及没做什么)
切片五需要给 preview.unpublishedBar.*(ADR-0045 未发布横幅,draftBar 的姐妹)与 preview.history.* 共 19 个新 key 定一个语域。取 usted ,依据是:(1) es 包全局默认 usted;(2) 这 19 个 key 与 marketplace.*(9:0 usted)同处 console 外壳;(3) 最强的一条 —— preview.unpublishedBar.published 的结构孪生 home.pendingDrafts.published 就是 usted(Sus cambios)。该裁定连同上面的分母写进了 PR 的测试断言,不是随手一挑。
没做的 :没有改这两个既有 key。它们不在切片围栏内(切片只新增 key),而且改哪一条是取舍 —— 见下。
收口方向(未裁决)
A. 把 message 改成 usted ,与 messageClean / sampleDataBody / unpublishedBar.* 对齐。最小改动,且与 es 包默认语域一致。顺带把 messageClean 的 : 改回 — 跟 en 对齐。
B. 把 messageClean / sampleDataBody 改成 tú ,并把 preview 整个命名空间(含切片五新增的 19 个)划成非正式邻域。改动面大得多,且会与紧邻的 marketplace.* / console.ai.* 冲突。
C. 加一道门禁 :同一命名空间(或同一组件的 key 集合)内 es 的敬称标记必须一致。判据可靠性存疑 —— 敬称需要形态学识别,正则会误报(本次量分母的正则就把 Revisa 误算成 tú 标记),而且 258 个 t() 调用点引用的 key 在任何语言包里都不存在(#3530 守卫首跑实测),其中 8 处直接把 raw key 渲染给用户 #3546 切片二已经立了"同一规则、不同答案 "的先例:按邻域裁定是正确的,所以门禁只能判"同一邻域内一致",邻域边界本身还得人来划。
倾向 A (单条对齐,与包默认语域和新增的 19 个 key 一致),C 不建议现在做 。
关联:#3546 (切片五裁定 es 敬称时量出本条)、#3810 / #3582 / #3625 (值域盲区的前几类)、#3530 (调用点门禁)、#3650 (en-drift 门禁)。
在 #3546 切片五(回填
marketplace+preview两命名空间 37 个缺失 key)裁定 es 敬称时量出,不在该 PR 范围内(这两个 key 早已存在、值也不由本切片改动),单独记录。现象
packages/i18n/src/locales/es.ts的preview.draftBar是同一条横幅(DraftPreviewBar)的两条互斥文案 —— 有待发布变更时渲染message,没有时渲染messageClean。两条的第二人称不一致:preview.draftBar.messageVista previa de borrador — estás viendo cambios sin publicar. Nada está en producción hasta que publiques.estás、publiques)preview.draftBar.messageCleanVista previa del borrador: no hay cambios sin publicar; todo lo que ve aquí ya está activo.ve)preview.draftBar.sampleDataBodyEstá viendo la estructura de su aplicación. Publíquela para cargar registros de ejemplo y activarla.Está、su、Publíquela)后果:一个西语用户在同一个预览横幅上,发布掉手上的草稿之后,横幅从 tú 切到 usted。同一个组件、同一个位置、同一次会话。
顺带一处同类的小分歧:
message用长破折号—分隔,messageClean用冒号:(en 两条都是—)。为什么三道 i18n 门禁都看不见
scripts/check-i18n-call-site-keys.mjs([finding] 没有任何守卫断言组件 t() 引用的 key 存在于 en 包 —— parity 测试只管包际一致,调用点→包的一致性是盲区 #3530):只问 key 在en存不存在。all-locales-key-parity.test.ts:只比键名集合与占位符形状,从不读值。scripts/check-i18n-en-drift.mjs(i18n 门禁:en 文案变更时其余九包必须同批跟改(或显式挂账)——#3582/#3625 族缺陷缺的那道不变量 #3650):只在 en 值发生变化时要求九包跟改;这两条 en 值静止不动。和 #3810 / #3582 / #3625 同属"值域盲区",但又是新的一类:不是与 en 不一致(两条译文都正确表达了 en 的意思),而是同一语言包内部、同一 UI 表面上的语域不一致。任何按值比对 en 的启发式都读不出来。
量出来的分母
marketplace.*preview.*draftBar.messageClean、draftBar.sampleDataBody)draftBar.message、empty.notReadyDescription)home.pendingDrafts.published¡Publicado! Sus cambios están activos.→ usted所以 es 包的默认语域是 usted,tú 是有标记的例外,且集中在 auth 登录/注册、report editor、organizations 这几个邻域(#3546 切片二当时正确裁定那几个邻域一致非正式)。
preview邻域的 2:2 是这个模式之外的一处真正分裂,而分裂恰好落在同一条横幅的两句话上。#3546 切片五对它做了什么(以及没做什么)
切片五需要给
preview.unpublishedBar.*(ADR-0045 未发布横幅,draftBar的姐妹)与preview.history.*共 19 个新 key 定一个语域。取 usted,依据是:(1) es 包全局默认 usted;(2) 这 19 个 key 与marketplace.*(9:0 usted)同处 console 外壳;(3) 最强的一条 ——preview.unpublishedBar.published的结构孪生home.pendingDrafts.published就是 usted(Sus cambios)。该裁定连同上面的分母写进了 PR 的测试断言,不是随手一挑。没做的:没有改这两个既有 key。它们不在切片围栏内(切片只新增 key),而且改哪一条是取舍 —— 见下。
收口方向(未裁决)
message改成 usted,与messageClean/sampleDataBody/unpublishedBar.*对齐。最小改动,且与 es 包默认语域一致。顺带把messageClean的:改回—跟 en 对齐。messageClean/sampleDataBody改成 tú,并把preview整个命名空间(含切片五新增的 19 个)划成非正式邻域。改动面大得多,且会与紧邻的marketplace.*/console.ai.*冲突。Revisa误算成 tú 标记),而且 258 个 t() 调用点引用的 key 在任何语言包里都不存在(#3530 守卫首跑实测),其中 8 处直接把 raw key 渲染给用户 #3546 切片二已经立了"同一规则、不同答案"的先例:按邻域裁定是正确的,所以门禁只能判"同一邻域内一致",邻域边界本身还得人来划。倾向 A(单条对齐,与包默认语域和新增的 19 个 key 一致),C 不建议现在做。
关联:#3546(切片五裁定 es 敬称时量出本条)、#3810 / #3582 / #3625(值域盲区的前几类)、#3530(调用点门禁)、#3650(en-drift 门禁)。