Uh oh!
There was an error while loading. Please reload this page.
fix(i18n): the es pack says Listo at all four Done sites (#3880) - #5971
Merged
Conversation
`grid.bulk.done` read `Hecho` while `common.done`, `view.done` and `form.fullscreen.done` read `Listo` — the same English word rendering two ways in Spanish. All four keys hold the byte-identical `en` value `Done` and all four call sites are the same dialog-footer button that finishes or dismisses the surface, the nine other packs render all four identically, and the neighbouring `Deshecho: ` is `undonePrefix` (a result-line status) rather than a pair for a button — so this is a typo, not a contextual split. It moves to the 3:1 majority `Listo`. `residue-namespaces-3546.test.tsx` pinned the outlier as a recorded example of deliberate divergence; it now pins the four as one value, keeping the history and the `Pending`/zh row that is still a genuine split. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSoz9uGhaaSgiq3hshtN7L
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
yinlianghui
marked this pull request as ready for review
August 24, 2026 10:20
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 24, 2026
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 freeto 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.
Part of #3880
Part of, not a closing keyword, on purpose — see "What stays on the card" below. Two ofthat card's three halves are not delivered here: one is documentation by ruling, and one
had its premise fall out from under it.
The change
One Spanish value, plus the pin that recorded it.
grid.bulk.donereadHechowhile the other three sites that sayDoneinen—common.done,view.done,form.fullscreen.done— all readListo. It moves toListo.Why this is a typo and not a deliberate contextual split
That distinction is the whole risk on this card: 58% of shared English strings in this
repo are translated differently per key on purpose (ru
Deleteis the nounУдалениеfor an activity-feed event type and the verb
Удалитьelsewhere; jaClearis選択解除for
grid.bulkClear). So "make identical English identical" is the wrong instinct bydefault, and each of these has to be argued rather than swept. Three independent checks,
each of which could have stopped the change:
The
envalues are byte-identical. Measured by flattening all ten packs to dottedkey paths and grouping by exact value, not by grepping for a spelling: exactly four keys
hold the
envalueDone.All four call sites are the same control — a dialog-footer button whose click
finishes or dismisses the surface. Read at the call site, not inferred from the key name:
grid.bulk.donepackages/plugin-grid/src/components/BulkActionDialog.tsx:557onClose(result)view.donepackages/plugin-view/src/ManageViewsDialog.tsx:583onOpenChange(false)form.fullscreen.donepackages/components/src/custom/fullscreen-editor.tsx:432commitFullscreencommon.donepackages/app-shell/src/console/organizations/manage/InviteMemberDialog.tsx:216The nine other packs render all four identically — de
Fertig, frTerminé, ptConcluído, ruГотово, ja完了, ko완료, zh完成, arتم. Nine independenttranslation passes each found no context worth splitting on. This is the check that
separates this group from the legitimate divergences above, where the split is visible
in the data.
One hypothesis that would have justified
Hechowas tested and refuted: the siblinggrid.bulk.undonePrefixisDeshecho:, which looks like a deliberateHecho/Deshechopairing. It is not one —
undonePrefixis a result-line status rendered atBulkActionDialog.tsx:461whenundoneAt !== null, whiledoneis a button; thebutton
donewould pair withgrid.bulk.undo, and that is the verbDeshacer.Listois the 3:1 majority and is already the value #3546 slice seven chose forcommon.done.The pin
packages/i18n/src/__tests__/residue-namespaces-3546.test.tsxnamed this value as arecorded example of deliberate divergence — the evidence for "picking a neighbour is a
choice that has to be made rather than derived". That note is now false for
Done, so it isrewritten rather than merely re-valued: it keeps the history and the
Pending/zh row (whichis still a genuine deliberate split), and pins the four
Donevalues together so theoutlier cannot regrow. The
REUSEDlist itself is unchanged — its['common.done', 'view.done']row was alreadyListoon both sides.Reverse-verified: with the fix reverted on disk (mutation confirmed by anchored counts —
"Hecho"1,"Listo"3 where it had been 4 — not by an editor exit code), the pin failswith
AssertionError: es grid.bulk.done (objectui#3880 converged these on one value): expected 'Hecho' to be 'Listo', 1 failed / 42 passed. The restore leg is proven clean:git diffvsHEADis empty and"Hecho"is back to 0 occurrences ines.ts. Themutation script carried a
trap … EXIT INT TERMrestore.What stays on the card
enstrings are shared by ≥2 keys; 164 have a legitimately divergent translation in atleast one pack. A "same
enimplies same translation" gate would emit 164 false reds, sono lint rule, script or test asserting that invariant is added by this PR.
Loading...— is not delivered, because its premiseno longer holds. The card cited
common.loadingWird geladen...againstdetail.loadingLaden..., both ASCII. There is no ASCII...left in any of the tenpacks: [finding] en 包 32 个值用 ASCII "..." 结尾、113 个用 U+2026 "…" —— 同一屏上省略号两种字形,且九包各自跟着抄 #3878 landed as PR fix(i18n): one ellipsis glyph across the ten packs, es usted single-form, pt de-contraction (#3878 #3875 #3877) #4378 and converged every one on U+2026, and both of these
keys are named in that pass's own
CONVERGED_KEYScensus inpackages/i18n/src/__tests__/ellipsis-glyph-3878.test.ts. That merged the ASCII andU+2026 groups, so what the card saw as a 2-key pair is now one 10-key group carrying
four German spellings:
Wird geladen…×6,Laden…×2 (detail.loadingandreport.loading),Lade…×1 (auth.device.loading),Lädt…×1(
approvalsInbox.loadingMore). Changing only the key the card named would leavereport.loading— the identical spelling at an equally same-context site — untouched, sothe majority-vote argument that settles
Donecleanly does not transfer. That is adifferent decision than the one adjudicated on 2026-08-09 and it is filed separately
rather than half-made here.
Verification
All at
88707ef9(the pushed commit), each exit code captured before any pipe:pnpm exec vitest run packages/i18n/Test Files 53 passed (53)·Tests 893 passed (893)pnpm --filter @object-ui/i18n type-checktsc --noEmit && tsc -p tsconfig.test.json)check:i18n-drift0 en value(s) changed … No en value changed in this range.check:i18n-keysEvery in-scope call-site key resolves against the en pack (2934 keys)check:i18n-dead-keyscheck:control-bytesOK (scanned 4951 tracked text file(s))check-changeset-no-major.mjsNo changeset declares a major bump.check:i18n-driftreporting zeroenchanges is the intended reading, not an emptyresult: only an
esvalue moved, so no pack is asked to follow and no waiver is needed.Lint is a declared narrowing, not a full run.
npx eslint . --no-inline-configwas runin
packages/i18n— the only package with code changes — giving exit 0, 0 errors, 34pre-existing warnings, over 78 files that eslint's own config selected (count read from
--format json, not enumerated by hand); both changed files are in that set at 0/0. Thenarrowing excludes nothing: type-aware linting is not configured (no
projectServiceand no
parserOptions.projectineslint.config.js— verified with a control probe provingthe grep is well-formed), so a file's verdict depends only on that file plus the shared
config, and this diff changes neither the config nor any file outside
packages/i18n. CIruns the full farm regardless.
Generated by Claude Code