Found while executing #3878 (ellipsis convergence) on branch claude/issue-3878-i18n-copy-trio — list.loading is one of the 35 keys that pass touched, and converging its glyph made the untranslated body of the value obvious. Out of #3878's scope (that card is about a glyph, this is about the sentence), so recorded separately.
Measured
list.loading, on origin/main at 2fea4d2fa:
| pack |
value |
| en |
Loading records... |
| zh |
正在加载记录... |
| ja, ko, de, fr, es, pt, ru, ar |
Loading records... — byte-identical to en |
Eight of nine packs serve the English sentence. zh is the only one that translated it. A Japanese, Korean, Russian or Arabic user reading a list view sees a Latin-script English sentence in the middle of an otherwise translated screen — and in ar it is left-to-right text inside a right-to-left layout.
The same probe over the whole pack set
A value byte-identical to en inside a non-Latin-script pack (zh/ja/ko/ru/ar) is untranslated with near-certainty, since a real translation cannot be byte-equal to the English. 26 keys match. Most are legitimate and should be left alone — proper nouns and format strings that are the same in every language:
name@example.com, Acme Inc., JSON, Webhook, v{{version}}, {{current}} / {{total}}, {{name}} ({{reason}}), Logo URL, Favicon URL, Beta, Freemium, headless, Powered by ObjectStack, {{object}}-import-template.
That leaves four that are real English prose and should be translated:
| key |
en value |
identical in |
list.loading |
Loading records... |
ja, ko, ru, ar (and de, fr, es, pt — 8 of 9) |
designer.undo |
Undo |
all 9 |
designer.redo |
Redo |
all 9 |
appDesigner.snakeCaseHint |
Must be snake_case (e.g. my_app) |
ko, ru, ar |
designer.undo / designer.redo are the arguable pair — some product vocabularies keep them English — but zh, ja, ko, ru and ar all have ordinary native words for undo/redo, and this repo translates every neighbouring designer action, so the identity reads as an omission rather than a decision. appDesigner.snakeCaseHint is unambiguous: a full English sentence with a parenthetical example.
Why no gate sees it
The same value-domain blind spot as #3582 / #3625 / #3810 / #3875, one more shape:
all-locales-key-parity compares key sets and placeholder shapes, never values — all four keys are present in all ten packs with matching holes.
scripts/check-i18n-call-site-keys.mjs asks only whether a key resolves. All four resolve.
scripts/check-i18n-en-drift.mjs fires on an en value change. These values were identical from the day the packs landed, so no drift event ever existed.
Worth noting the probe used here is cheap and mechanical for the five non-Latin packs, where byte-identity is decisive: value === en[key] && /[A-Za-z]{4,}/.test(value). It is not sound for de/fr/es/pt, where identity can be genuine — which is exactly why list.loading needs the eight-pack count stated by hand. #3582 already measured that the inverse probe ("no ASCII English in a non-Latin pack") produces false negatives; this one is the narrower, decidable form, and could be a gate if the ~14 legitimate identities were listed as an allowlist. Recording that as an option, not a recommendation — the allowlist is the cost.
Anchor
Verified on origin/main at 2fea4d2fa. Related: #3878 (glyph convergence, where this surfaced), #3582 / #3625 (the two value-blind-spot defects that motivated the drift gate), #3810.
Generated by Claude Code
Found while executing #3878 (ellipsis convergence) on branch
claude/issue-3878-i18n-copy-trio—list.loadingis one of the 35 keys that pass touched, and converging its glyph made the untranslated body of the value obvious. Out of #3878's scope (that card is about a glyph, this is about the sentence), so recorded separately.Measured
list.loading, onorigin/mainat2fea4d2fa:Loading records...正在加载记录...Loading records...— byte-identical to enEight of nine packs serve the English sentence.
zhis the only one that translated it. A Japanese, Korean, Russian or Arabic user reading a list view sees a Latin-script English sentence in the middle of an otherwise translated screen — and inarit is left-to-right text inside a right-to-left layout.The same probe over the whole pack set
A value byte-identical to
eninside a non-Latin-script pack (zh/ja/ko/ru/ar) is untranslated with near-certainty, since a real translation cannot be byte-equal to the English. 26 keys match. Most are legitimate and should be left alone — proper nouns and format strings that are the same in every language:name@example.com,Acme Inc.,JSON,Webhook,v{{version}},{{current}} / {{total}},{{name}} ({{reason}}),Logo URL,Favicon URL,Beta,Freemium,headless,Powered by ObjectStack,{{object}}-import-template.That leaves four that are real English prose and should be translated:
list.loadingLoading records...designer.undoUndodesigner.redoRedoappDesigner.snakeCaseHintMust be snake_case (e.g. my_app)designer.undo/designer.redoare the arguable pair — some product vocabularies keep them English — butzh,ja,ko,ruandarall have ordinary native words for undo/redo, and this repo translates every neighbouring designer action, so the identity reads as an omission rather than a decision.appDesigner.snakeCaseHintis unambiguous: a full English sentence with a parenthetical example.Why no gate sees it
The same value-domain blind spot as #3582 / #3625 / #3810 / #3875, one more shape:
all-locales-key-paritycompares key sets and placeholder shapes, never values — all four keys are present in all ten packs with matching holes.scripts/check-i18n-call-site-keys.mjsasks only whether a key resolves. All four resolve.scripts/check-i18n-en-drift.mjsfires on anenvalue change. These values were identical from the day the packs landed, so no drift event ever existed.Worth noting the probe used here is cheap and mechanical for the five non-Latin packs, where byte-identity is decisive:
value === en[key] && /[A-Za-z]{4,}/.test(value). It is not sound forde/fr/es/pt, where identity can be genuine — which is exactly whylist.loadingneeds the eight-pack count stated by hand. #3582 already measured that the inverse probe ("no ASCII English in a non-Latin pack") produces false negatives; this one is the narrower, decidable form, and could be a gate if the ~14 legitimate identities were listed as an allowlist. Recording that as an option, not a recommendation — the allowlist is the cost.Anchor
Verified on
origin/mainat2fea4d2fa. Related: #3878 (glyph convergence, where this surfaced), #3582 / #3625 (the two value-blind-spot defects that motivated the drift gate), #3810.Generated by Claude Code