fix(core,react,auth,app-shell,i18n,console): the zh-CN leftovers from the 2026-09-28 cloud E2E read the session's language (objectui#10900) - #10953
Conversation
… the 2026-09-28 cloud E2E read the session's language Four surfaces a zh-CN session read in English now go through the packs, with English unchanged as the default: - the runner's generic success toast, through a translator the runner takes (ActionRunner.setTranslator) and ActionProvider / useActionRunner install; an author's successMessage and a server message stay verbatim; - the social sign-in button and divider, through LoginForm / RegisterForm labels (a new socialButton template, and the orText label that was documented as the divider but rendered nowhere); - the Build Doctor button and drawer title; - the Setup marketplace breadcrumb segment, and the zh search placeholder without the manifest ID jargon. Nine keys in all ten packs; pins for each surface under zh and en. Claude-Session: https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk Co-authored-by: Claude <noreply@anthropic.com>
useState's initializer overload left the nested arrow's parameters without a contextual type (TS7006 under the package build). Claude-Session: https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk Co-authored-by: Claude <noreply@anthropic.com>
|
changeset-claim-re-read
|
✅ 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
|
Contract reviewServed-tier: Isolated, adversarial Clause-② review of PR objectui#10953 (card objectui#10900). Inputs: the card and its four comments (handoff ① Derived judgmentsRunner translator.
Auth.
Build Doctor. Breadcrumb. The zh placeholder. The filter is Locales. The nine keys are in all ten packs (per-pack grep: 10 hits each, the tenth being the pre-existing top-level Pins. Reproduced in a detached worktree of the head, offline install, CI. 43 check-runs on Commits. Three commits on ② Semver level
③ Boundary flags
Defects, in one place: (D1) changeset and body: "as the server reports it" is not true for the nine branded provider ids — amend the sentence (wording; no code change owed). (D2) body: the drift gate is Implemented-by: VERDICT: PASS Generated by Claude Code |
…n shows For the branded provider ids it knows, SocialSignInButtons inserts its own label, not the name the server reports; the changeset now says so. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk
✅ 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
|
Contract reviewServed-tier: Delta review over record ① Derived judgmentsThe commit. The sentence. "The provider's display name is inserted as-is: the component's own label for the branded providers it knows, otherwise the name the server reports." Read against The commit message. objectstack's CI on The PR body. A diff of the current body against the body
The seven pending changesets (
No pending sentence is made false by this diff, so no dated note is owed. (For the record: the objectui#10533 note form is not spelled in either repository's AGENTS.md; it was not needed.) ② Semver levelUnchanged from ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #10900
Clause-②: yes
The four surfaces the 2026-09-28 cloud E2E read in English under zh-CN now read the session's language. English is unchanged and stays the default.
Clause-②: noon the premise "display strings and locale entries only; no published type". The implementation widens the public surface by four optional members, so this body declaresyes:ActionRunner.setTranslator(@object-ui/core),SocialSignInButtonsProps.buttonText,LoginFormLabels.socialButtonandRegisterFormLabels.socialButton(@object-ui/auth). Nothing is removed, renamed or narrowed, and no accept set changes. The changeset declaresminorfor those two packages (the repository's precedent for a widening) andpatchfor@object-ui/react,@object-ui/i18n,@object-ui/app-shelland@object-ui/console. The seat may amend either.Strings
actions.completedSuccessfullyauth.login.socialButtonauth.login.orTextauth.register.socialButtonauth.register.orTextconsole.ai.buildDoctorconsole.ai.buildDoctorTitleconsole.ai.buildDoctorDisabledTitleconsole.breadcrumb.marketplacemarketplace.searchPlaceholder{provider}is the component's own single-brace hole (the{seconds}convention inauth.login), filled with the provider's display name: the component's own label for the branded providers it knows, otherwise the name the server reports. The nine new keys are in all ten packs; the eight other packs carry their own translations (see the diff).What was measured before each choice
@object-ui/corecannot reach a translator (@object-ui/i18ndepends on core). A toast handler receives only the final string, so it cannot tell the runner's fallback from an author's identical text. The only two sites in this repository that install a toast handler on a runner areActionProvideranduseActionRunnerin@object-ui/react, which already depends on@object-ui/i18n. Three other constructors (the provider-lessuseAction()fallback,useActionEngine's standalone engine, and core's one-offexecuteAction()) never receive a toast handler from this repository's code. So the runner takes an injected translator (the same seamrecordDeletetakes itstthrough) and those two owners install the session'st, read at call time so a language switch reaches an existing runner. It is asked only for the fallback: an author'ssuccessMessageand a server message stay verbatim. No new dependency edge. The provider-lessuseAction()fallback runner shows no toast unless a consumer installs a handler by hand, and then it is English.@object-ui/authtakes text only throughlabelswith English defaults.LoginForm/RegisterFormpassed no text toSocialSignInButtons, and theirorTextlabel was documented as the divider but rendered nowhere.orTextnow feeds the divider and a newsocialButtontemplate feeds the button. All four callers pass the keys: the console'sLoginPage/RegisterPageand@object-ui/app-shell'sDefaultLoginPage/DefaultRegisterPage. The capitals in the E2E are the divider'suppercaseclass.console.ai.*throughChatPane'st; the Build Doctor button andBuildDebugDrawer's title now use the same translator.console/marketplace/**as the claim assumed.AppHeader'ssystembranch drew the segment after System fromhumanizeSlugof the URL. Only thesystem/marketplaceroutes are mounted by this package, so that segment now reads the pack; host-mountedsystem/*pages keep their slug. The search matches the localized display name,manifest_idand the localized description. The zh placeholder names the name and 标识, the identifier each card prints under its name, which is the zh pack's existing word for identifiers. It promises nothing the filter does not match, and a pin measures both halves through the page's own filter. The en value is unchanged.all-locales-key-parity.test.tsrequires everyenkey in all nine other packs and nothing extra, so each key is in all ten packs.check:i18n-driftreads noenvalue change.commentFailedand thewidgetForbidden*keys in blocks this change does not touch. ItsAppHeader.tsxhunks (the imports, the admin-status block and thestudioDesignPathblock) are more than thirty lines from this change'ssystembranch edit.MarketplacePackagePage.tsxis untouched here.Tests
I18nProviderin zh and en:ActionRunner.defaultSuccessToast-10900(@object-ui/core);ActionProvider.defaultSuccessToast-10900, forActionProvideranduseActionRunner, including a language switch on an existing runner (@object-ui/react);socialButtonLabels-10900(@object-ui/auth);socialButtonsLocale-10900(the console's login and sign-up pages);authPages.socialLabels-10900(DefaultLoginPage/DefaultRegisterPage);buildDoctor.locale-10900(button and drawer);AppHeader.marketplaceBreadcrumb-10900;MarketplacePage.searchPlaceholder-10900(placeholder plus the filter it describes).1dae95a41. The fix's anchors were counted at 0 on disk, then the eight suites ran:Test Files 8 failed (8),Tests 19 failed | 17 passed (36). The passing 17 are the English controls and the checks that already held. The restore from HEAD was proved by blob hashes and an emptygit diff HEAD. On head:Test Files 8 passed (8).DefaultLoginPagegives exactlyTS2353 … 'orTextTypo' does not exist in type 'LoginFormLabels'against the rebuilt@object-ui/authdeclarations, so the type-check reads the new.d.ts, not a stale one. It was restored by blob check.f6582636f(after mergingmainat5c94589f0):@object-ui/consolewas rebuilt (34 of 34 tasks);type-checkexits 0 for@object-ui/core,i18n,react,auth,app-shellandconsole;vitestoverpackages/core/,packages/react/,packages/auth/andpackages/i18n/, plus the four touchedapp-shelldirectories (layout,console/ai,console/auth,console/marketplace) and the console'spages/auth:Test Files 479 passed (479),Tests 7063 passed | 13 skipped;check:control-bytes,check:i18n-keys,check:i18n-drift,check-changeset-presenceandcheck:new-line-citationspass.9ab3b7207, before the merge:packages/app-shell/andapps/console/suites:Test Files 978 passed | 1 skipped (979),Tests 10202 passed | 9 skipped;scripts/suite:Test Files 177 passed | 2 skipped (179);.ts/.tsxfiles: 0 errors, and each changed source file's warning count is equal on base and head.app-shell,consoleandscripts/suites were not re-run locally; CI runs the full farm onf6582636f.i18n-locale-enchunk). Reason: it needs a consolevite build, which CI runs.Acceptance notes (observed, not changed here, not filed)
system/*breadcrumb segments the console host mounts (settings, apps, profile, approvals, ai-approvals, audit-log) still show their humanized English slug under zh.setTranslatoris the seam any of them would use.LoginFormkeeps ahasSocialProvidersstate that nothing reads (an existing lint warning).Generated by Claude Code
Body wording amended by the
domain:uiseat #1 after contract review5868740252(its D1 to D3); no code claim moved.