fix(i18n): de approvalsInbox 三值用德语引号 „…“ 而非 ASCII 直引号 (#3919) - #3954
Merged
Conversation
`approvalsInbox.rejectOneTitle` / `inlineApproved` / `inlineRejected` 三个值在
标题两侧都用 ASCII 直引号,而同一命名空间的兄弟 `approveOneTitle` 用的是正确的
德语引号(U+201E 开、U+201C 闭)。德语审批者因此在同一屏、同一个操作对里看到
两种引号排印:批准确认是 „…“,驳回确认与两个 inline toast 是 "…"。
`„…“` 是 de 包自己的多数派(50 处配对)也是 DUDEN R11 的规定,所以这三个值是
离群值。只改值域排印,键名与 `{{title}}` 占位符不动;en 侧按设计两侧都是 ASCII,
不受影响。
这与 #3876 是不同的缺陷形态:#3876 是德语开引号配了 ASCII 闭引号,而这三个值
两侧都是 ASCII、自身"配平",所以 #3876 留下的配对不变量结构上看不到它们 —— 那
个扫描器从每个 `„` 向前找第一个引号字符,而这三个值里根本没有 `„`。
de 包直引号清零后,把 `de-quote-pairing-3876.test.ts` 里的显式三键清单升级为更
强的形态:断言 de 包任何值都不含 U+0022。它同时覆盖两种缺陷形态,且不需要逐键
维护 —— 以后新落地的值带上打字机引号会直接按键名翻红。清零断言配了反空转守卫
(en 包同一谓词必须仍能找到 40 个值),避免"因为什么都没产出而绿"。同时新增
approvalsInbox 四值的逐字节钉子,因为清零断言本身不再点名任何键。
包内计数 47/47/0/6 → 50/50/0/0,三处字面量随之更新。
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
那张按包统计 {{placeholder}} 包裹风格的普查表里,de 行的「ASCII 3」正是
approvalsInbox rejectOneTitle / inlineApproved / inlineRejected 这三个值。本
分支把它们德语化后该列归零,de 的裁定从 38 比 3 变为一致。
刻意不在此处给出新的 „…“ 计数:该表是在**排除** #3920 移除的两处英文残留的
前提下测得的,在当前包上重测是另一种口径,两者不可比(实测重算会得到 43 而非
38+3=41,差额正是那两处已翻译的 grid.import 值)。表保持原样作为当时裁定的
依据;活的不变量在 de-quote-pairing-3876.test.ts。
反空转守卫的注释写「see the it below」,但钉住 en 用 ASCII 引号的 `leaves en alone` 那条 it 在它上面。改为按名字点明。
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
Collaborator
Author
|
PM 验收(session_01GTRjn8xBqp75dk7kFupVRt):通过,转 ready 并挂 auto-merge。#3919 落地。 核验记录(head
注意事项转告维护者(dev concern,合理保留):零直引号钉现在治理整个 de 包 —— 未来任何 de 值合法需要直引号(代码样例/CLI flag)会大声红,届时按需放行。 Generated by Claude Code |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #3919
改了什么
packages/i18n/src/locales/de.ts里approvalsInbox三个值,标题两侧的 ASCII 直引号改成德语引号(U+201E 低位开引号、U+201C 闭引号):approvalsInbox.rejectOneTitle"{{title}}" ablehnen?„{{title}}“ ablehnen?approvalsInbox.inlineApproved"{{title}}" genehmigt„{{title}}“ genehmigtapprovalsInbox.inlineRejected"{{title}}" abgelehnt„{{title}}“ abgelehnt同命名空间的兄弟
approveOneTitle本来就是正确的„{{title}}“ genehmigen?,所以德语审批者在同一屏、同一个操作对里看到两种引号排印:批准确认是德语引号,驳回确认和两个 inline toast 是打字机引号。„…“是 de 包自己的多数派(50 处配对)也是 DUDEN R11 的规定,这三个值是离群值。只改值域排印 —— 键名不动、
{{title}}占位符不动(placeholder 形状是all-locales-key-parity比对的东西),en 侧按设计两侧都是 ASCII,一个字节没碰。正文前提复核(与 issue 的差异)
issue 正文的行号取自 main@2937bcf7d;在本 PR 的基线
65bb513dc上三个值仍在 3279 / 3285 / 3286,approveOneTitle仍在 3180 —— 行号恰好未漂,值域缺陷与正文描述完全一致,前提成立。一处需要写明的度量口径:正文说「改完 de 包的 U+0022 应为 0」。这指的是包内值的普查(#3876 钉子文件里
flatten(builtInLocales.de)得到的 2914 个字符串叶子),不是de.ts的文件字节 —— 该文件本身有 5000 多个 ASCII 双引号在做字符串定界符(本仓无 prettier 配置,de.ts 的定界符风格本就混用双引号和单引号)。按值域口径,改后确为 0;这也正是钉子断言的口径。钉子升级(#3876 的显式清单 → de 包零 U+0022)
de-quote-pairing-3876.test.ts原来把这三个键钉成显式清单(expect(straight).toEqual([...三个键...]))。三个值修完后清单塌缩成更强的形态:de 包任何值都不含 U+0022。更强在于它同时覆盖两种缺陷形态,而且不需要逐键维护 —— 以后新落地的值带打字机引号会直接按键名翻红,没人需要回来编辑清单:
„向前找第一个引号字符,而这三个值里根本没有„。这个盲区在下面的反向验证里被实测钉住了。两条防退化措施:
toEqual([])恰好是「什么都没产出也会绿」的断言形状,所以谓词必须被证明仍能找到东西:en 包按设计用 ASCII 引号,同一个谓词在 en 上必须仍返回一长串(落地时 40 个值)。flatten坏掉、包被清空或导出被改名都会让它归零,从而在这里翻红,而不是在上面一路绿。it把 approvalsInbox 四值(批准/驳回确认标题 + 两个孪生 toast)整句钉住,并逐值断言{{title}}与„{{title}}“仍在 —— 一个什么都不点名的不变量会丢掉「这次改动动了什么」的记录。包内计数
„47 /“47 /”0 /"6 → 50 / 50 / 0 / 0,文件里三处字面量(okSpans、计数恒等式、头注释普查)随之更新。#3876 自己的 20 键 / 22 span 普查表原样保留,不把后来的修复折进去。反向验证(先预判方向,再跑)
预判:把
inlineRejected单值临时改回 ASCII 引号,4 条断言翻红、#3876 的配对扫描器保持绿 —— 后者不是遗漏,正是本卡描述的结构盲区。实测(9 个 test 里 4 红 5 绿)与预判逐条吻合:
holds pack-wide: no de value quotes with a U+0022 at all (objectui#3919)—— 精确点名approvalsInbox.inlineRejectedpins the approvalsInbox quartet objectui#3919 converged, byte-for-byteopen/close50 → 49\p{L}-aware 正则 ——okSpans50 → 49holds pack-wide: no „ in de is closed by anything but “ (the durable invariant)—— 两侧 ASCII 的值里没有„可扫,de 语言包 20 个值把德语开引号 „ 和 ASCII 直引号 " 配成一对(正确配对的只有 21 个),德语用户看到的收尾引号是错的 #3876 的不变量按设计看不见它。这正是为什么清零断言必须存在。变异已还原,还原后 de.ts 与变异前逐字节一致(
diff无输出),全套 34 文件 600 test 全绿。变异不提交。消费半径清扫
三个键在全仓的引用面:十个 locale 包各自的翻译(未动其他包)、
de-quote-pairing-3876.test.ts的清单(本 PR 升级)、apps/console/src/pages/system/ApprovalsInboxPage.tsx的三处tr(key, en-fallback)调用(fallback 是 en 字面量,不受影响)。另外两个提到 straight quote 的 i18n 测试(residue-namespaces-3546、organization-namespace-3546)只涉及别的键,已逐个确认无关。顺带核了一遍其他包这三个键是否也离群:ko / pt / es / ar 用 ASCII,而这四个包按 #3920 实测的裁定就是 ASCII;fr / ru 用
«…»、zh 用全角弯引号、ja 用「」,都与各自裁定一致。只有 de 是离群值,没有需要另开单的兄弟缺陷。一处刻意的小范围外改动(注释)
gridImportSavedMapping-i18n-3920.test.ts头注释里那张按包统计{{placeholder}}包裹风格的普查表,de 行写着「ASCII 3」—— 那 3 个正是本 PR 修的三个值。改完该列归零,于是给表加了一句脚注说明,免得后来人去找三个已经不存在的 ASCII 值。纯注释,不动断言。脚注里刻意不给新的
„…“计数:该表是在排除 #3920 移除的两处英文残留的前提下测得的,在当前包上重测是另一种口径 —— 实测重算得 43,而不是 38+3=41,差额正好是那两处已翻译的grid.import值。与其写一个口径混用的数字,不如只写已核实的部分。验证
pnpm exec vitest run packages/i18n --maxWorkers=2—— 34 文件 / 600 test 全绿pnpm exec turbo run type-check --concurrency=2—— 78/78 successfulnode scripts/check-control-bytes.mjs—— OK(3850 个文件,零报告);另对改动文件自查了 gate 扫不到的控制字节范围,无命中pnpm changeset:check—— fixed group / no-major 双绿pnpm check:i18n-keys—— 2316/2316 字面量键可解析pnpm check:i18n-drift—— 0 en 值变化(本 PR 没碰 en)pnpm exec eslint改动文件 —— 干净changeset:
.changeset/de-approvals-inbox-quotes-3919.md,@object-ui/i18n: patch(与 #3918 / #3936 两个同族 PR 一致)。