Uh oh!
There was an error while loading. Please reload this page.
fix(i18n): converge the merged Loading… group to one rendering per language - #6612
Merged
os-sales merged 1 commit intoAug 27, 2026
Merged
Conversation
…language objectui#3878 merged the ASCII and U+2026 ellipsis groups, leaving the ten keys whose `en` value is `Loading…` rendered four ways in `de`, two in `ko` and two in `ar`. Converge each pack on its majority/most-idiomatic form — de `Wird geladen…`, ko `로딩 중…`, ar `جارٍ التحميل…` — and pin per-language uniformity beside the glyph rule that created the group. `de` `auth.device.loading` stays `Lade…`: it is register-coherent with its two namespace siblings `Genehmige…`/`Ablehne…` on the same DeviceAuthPage screen, and those are outside this group. Reported as a fork and pinned as a named exemption rather than picked. Translation copy only — no key added or removed, no `en` value touched, every value keeps its U+2026. Card relationships are declared once in the PR body, since this branch squashes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CRJge11jso9TpXRWFt1Z49
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
|
os-sales
marked this pull request as ready for review
August 27, 2026 13:40
Uh oh!
There was an error while loading. Please reload this page.
os-sales
deleted the
claude/issue-5972-loading-group-per-language-uniformity
branch
August 27, 2026 13:53
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.
Fixes#5972
objectui#3878 converged all ten packs on the typographic ellipsis and, as a side effect, merged the ASCII
Loading...group into the U+2026Loading…group. Nobody re-measured the wording afterwards. This converges each pack to one rendering across that merged group and pins it beside the glyph rule that created it.Working the grading ruling (concentrated triage, 2026-08-25), not the card body's "Suggested disposition", which the ruling superseded.
Population, re-derived on today's tree
Not taken from the card's table. Flattened all ten packs from source and selected every key whose
envalue is byte-identicallyLoading…, onorigin/main@22ba9271f:10 keys —
lookup.loading,common.loading,fields.recipient.loading,grid.import.historyLoading,grid.bulk.loading,detail.loading,report.loading,dashboard.loading,auth.device.loading,approvalsInbox.loadingMore.Tallies matched the filer's reading exactly:
defour renderings,kotwo,artwo; en/zh/ja/fr/es/pt/ru unanimous at ten.What moved — 9 values, copy only
deWird geladen…detail.loading,report.loading(wereLaden…);approvalsInbox.loadingMore(wasLädt…)ko로딩 중…fields.recipient.loading,grid.bulk.loading,grid.import.historyLoading,approvalsInbox.loadingMore(were불러오는 중…)arجارٍ التحميل…common.loading,detail.loading(wereجاري التحميل…)Each direction is the group majority and independently supported:
enis a bare gerund render asWird ….불러오는 중is whatkouses when the string names the thing being loaded (객체를 불러오는 중…,에이전트를 불러오는 중…,초대를 불러오는 중…); the bare form, which is what all ten of these are, is로딩 중(그리드 로딩 중…,차트 로딩 중…,양식 로딩 중…).No key is added or removed, no
envalue is touched, and every value keeps its U+2026.check:i18n-driftsays so directly: "No en value changed in this range."The
arpair is an orthography split, not a wording split — reported as its own classThe dispatch asked whether the
ardifference is a separate class rather than one more majority vote. It is.جارٍandجاريare not two translations; they are two spellings of one word, differing by a single code point at the end of the first word.جارٍ(jārin) is the indefinite منقوص participle — final yāʾ dropped, tanwīn on the rāʾ — which is the prescriptive MSA form;جاريretains the yāʾ and is the definite/annexed form, common informally.The consequence that matters: the split does not respect this group's boundary. Counted pack-wide with a Unicode-aware standalone-word match (positive and negative controls run, including the
التجاريةsubstring trap an ASCII-boundary regex falls into), the participle isجارٍ×90 againstجاري×10 — and only 2 of those 10 are in this group. Converging the 2 is what the ruling asks for and what the pin can hold; the other 8 are filed as objectui#6610 rather than smuggled in here, the same way #3878 fenced off the per-package fallback tables. Read this PR's green as a statement about this group only.The fork:
deauth.device.loadingstaysLade…The card floated two members as possibly deliberate. Measurement splits them.
approvalsInbox.loadingMore— hypothesis falsified, converged. The theory was that a continuation load may want its own wording. Inde, the namespace's other four in-flight states are all passive (Wird genehmigt…,Wird abgelehnt…,Wird zurückgezogen…,Wird erneut eingereicht…), soLädt…broke with its own neighbours rather than marking anything — converging it restores the namespace. Inko, the same불러오는 중…sits on three plainly initial loads (fields.recipient.loading,grid.bulk.loading,grid.import.historyLoading), so it cannot have been marking continuation either.auth.device.loading— genuine fork, not picked.apps/console/src/pages/auth/DeviceAuthPage.tsxrenders all three of that namespace's in-flight states, anddewrites all three in the same first-person voice:Genehmige…,Ablehne…,Lade…. The first two are outside this group (theirenisApproving…/Denying…), so converging the third alone would leave that one screen readingGenehmige… / Ablehne… / Wird geladen…— a new same-screen inconsistency manufactured by the pass meant to remove one. Resolving it the other way means moving the whole namespace to the passive, which is a copy-voice decision over keys this card does not fence in.So it is held out by name, in
LOADING_GROUP_FORKS, with the reason. The decision is filed as objectui#6611 — which also records a second thing found while measuring:Ablehne…is not a grammatical German form (ablehnenis separable; first-person singular is ich lehne ab). That weakens, without settling, the reading that the first person was deliberate here. objectui#6611 stays open either way; this PR does not act on it.The pin, and proof it can go red
packages/i18n/src/__tests__/ellipsis-glyph-3878.test.tsgains a seconddescribe. #3878's own assertions are untouched — the glyph invariant, theCONVERGED_KEYScensus, the four drift waivers and the placeholder check all stand exactly as they were; this adds a rule beside them.The new block derives the group from
enand asserts membership and per-language value counts before asserting uniformity, because a uniformity assertion over an empty set passes while checking nothing. Ablation, run from the committed tree with a restoringtrap, each mutation confirmed on disk by grepping for the injected and removed text and each restore proven by an emptygit diff HEAD:dereport.loadingback toLaden…Wird geladen…on 8 keys |Laden…on report.loading"enreport.loading→Loading report…en(diagnostics multiplied — the predicted direction held, plus one)deauth.device.loading→Wird geladen…Leg C is the point of the exemption: the waiver cannot outlive its reason. The pin asserts both the forked value and that it still differs from the converged rendering, so converging it later fails until the row is deleted.
No rebuild was needed for the ablation and none could have masked it: the test imports
../locales/index— a relative source import, not the packageexportsfield — andpackages/i18nhas novitest.config.*of its own, so nothing resolves throughdist/.Verification
All of the below ran on the final commit,
daa1f57, with a clean tree.Chained with
&&under the shared verify lock, whose verdict line certifies the whole chain:VERDICT command-exit 0.The new test file really is type-checked rather than excluded:
tsc -p tsconfig.test.json --listFileslistsellipsis-glyph-3878.test.tsin the program.Lint is a narrowed run, and the narrowing is measured, not assumed.
pnpm --filter @object-ui/i18n run lintiseslint .inside the only package this PR touches. Population read from eslint's own file selection rather than my guess:--format jsonreports 82 files underpackages/i18n, 0 errors and 34 pre-existing warnings, with all four edited files present at 0/0. Invariance for everything not in the diff:eslint.config.jsconfigures no type-aware linting (noparserOptions.project, noprojectService), so a string-literal change in three locale files plus one new test file cannot move the verdict on any file it does not itself contain. The repo-wide farm runs in CI regardless.Changeset:
.changeset/5972-loading-group-per-language-uniformity.md,patchon@object-ui/i18n(user-visible copy; nevermajor, per the fixed-group rule).Out of scope, filed rather than fixed
arparticiple spelled two ways pack-wide (92:8 after this PR); the 8 remaining are outside this group and ungated. Not addressed here.deauth.devicein-flight register, this PR's reported fork, plus the ungrammaticalAblehne…. Not addressed here.Neither is touched by this branch. The card body's other open question — whether
approvalsInbox.loadingMore'senshould becomeLoading more…— is the forked outcome the dispatch fenced off, so it is reported and not taken; note the surface already readsLoad moreon the button (approvalsInbox.loadMore) withLoading…while it fetches, which is coherent as it stands.Generated by Claude Code