You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
zh-CN: list grid date cells render English month abbreviations ("Oct 11", "Nov 1") while the same record's page renders 2026年10月11日 #27498
Found in the 18.3.0 release-candidate browser walkthrough (wave anchor #27377, card W3-UX), at framework main @ c4c515ad, Console built in-repo from the same commit.
Repro (fresh boot)
Boot examples/app-showcase with --seed-admin and sign in as admin. Viewport 1440×900.
Open the avatar menu → Language → 中文(中国).
Open 功能展示 → 任务 (All Tasks).
Expected
The 截止日期 column is formatted for zh-CN, consistent with the record page.
Actual
Every cell reads Oct 11, Nov 1, Nov 18 and so on, under Chinese column headers, status chips and footer (10 条记录). The same task's record page shows 2026年10月11日.
Also on that screen, the object description under the title stays English: A unit of work inside a project.. That may be the showcase bundle's coverage rather than the platform. The other English leftovers seen under zh-CN were showcase example content (dashboard KPI captions and axis titles on Delivery Operations, the search group Account (Success Overlay)), so they are not raised here.
Related, closed: #25884 (one date column mixing relative and absolute formats).
Read fresh. Under zh-CN, list grid date cells render English month abbreviations, while the same record's page renders 2026年10月11日. The locale is not honoured and the grid disagrees with its sibling: p2.
Format grid date cells through the same locale-aware formatter the record page uses. No second date formatter.
Claim: PM loop round 1 · 2026-10-29T13:20Z
Session: session_01Utp6CY2n1JmZZKrHgtp9jC (seat; implementation by a card thread, mode:thread)
Account: os-bill
Branch: claude/project-thread-b2omyd (the card thread's harness push branch, self-reported — the measured platform exception to claude/issue-N-slug)
Worktree: objectstack-issue-27498
Domain: domain:ui
Seat: domain:ui#2
File surface: ui/packages/i18n/src/useDisplayLocale.ts, ui/apps/console/src/LocalizationFetchProvider.tsx, ui/packages/fields/src/index.tsx / ui/packages/plugin-grid/src/** only if the cause is grid-specific, tests beside, a changeset (stop on breach; explain in the report)
Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: high
Clause-②: no (expected)
Metadata-protocol: none (expected; the dev measures from the diff)
Responsibility: unproven: the display-locale derivation (ui/packages/i18n / console localization provider) or a grid-specific path — the dev measures | none | every zh-CN user of a list grid, today
Thread-read: 6495313192
Premise: unverified — code reading on origin/mainee9a8d6e finds the grid's date cells already locale-aware (DateCellRenderer → useDisplayLocale → formatDate); the cause is unproven (hypothesis: a stale server locale outranks the switched UI language). The dev reproduces first; a non-repro is a legal premise_still_valid: false report.
Serial constraints cleared: none — no open PR touches these files
Dispatch order: /mnt/project-files/ui-seat2/dispatch-27498.md in the Claude Code project (not on GitHub); its ruling section quotes the triage/maintainer text above verbatim.
{
"issue": 27498,
"status": "done",
"branch": "claude/project-thread-b2omyd",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27624",
"head": "416229c1bbe508d13cf64b35dec7475d309583ba",
"session": "session_01Utp6CakU47s2AYQsrXttMo (card thread; seat session_01Utp6CY2n1JmZZKrHgtp9jC)",
"premise_still_valid": true,
"summary": "Reproduced on app-showcase (fresh backend + console vite from source, en-US browser): after avatar menu -> Language -> 中文, All Tasks shows Nov 18 / Oct 11 under 截止日期 while a record page loaded by URL shows 2026年10月11日. Cause: the switch changes the UI language first (remounting LocalizationFetchProvider via the console shell's key={language}) and writes sys_user.locale second; the remount's GET /auth/me/localization can reach the server before the write commits and answers en-US, and useDisplayLocale ranks that answer above the UI language for the rest of the session. Not grid-specific: the record page reached by click in the same session also read Oct 11, 2026. Fix in the console provider only: re-read on every data-invalidation of the signed-in user's own sys_user row, the re-read opting out of joining a pre-write in-flight request (AbortController signal); formatter, renderers and useDisplayLocale unchanged (ruling 6495313192 holds).",
"tests": "head eda50a4a: pnpm --dir ui exec vitest run apps/console/src/LocalizationFetchProvider.test.tsx -> Tests 18 passed (18), 4 new cases in 're-reads after a write to the signed-in user's own row'. Ablation 1 (scripts/ablation-replace.mjs, anchor '}, [endpoint, userRowWrites]);' -> '}, [endpoint]);', anchor 1->0): red 'a read that lost the race with the language write is replaced after the write' + 'the re-read does not join a request still in flight from before the write'; restored, hash equal to HEAD. Ablation 2 (delete 'signal: reread?.signal,', anchor 1->0): red 'the re-read does not join…' only, 1 failed | 17 passed; restored, hash equal. Source-resolved suite, no dist leg. Live stack, PATCH held 1.5 s: before fix cells 'Nov 18, Nov 8, Nov 1…', after fix '11月18日, 11月8日, 11月1日…', record by click '2026年10月11日'; PATCH held 0 s: same after-fix reading.",
"gates": "head 416229c1 (after merging origin/main 1ed336097). dispatch-gates --commands: 33 derived; --ran: 33 run, 0 NOT-MEASURED, 0 UNRUN. 32 exit 0 (check-sdui-manifest.mjs and --self-test included). 'pnpm --dir ui exec vitest run scripts/' exit 1: 2 failed | 4899 passed, both 'Test timed out in 15000ms' on tree-wide scans while dev servers shared the box (check-hand-rolled-comment-mask.test.ts, check-vi-mock-inherit.test.ts); re-run alone under the lock: Test Files 2 passed, Tests 105 passed. Outside derivation: console suite Test Files 262 passed, Tests 2599 passed; eslint --no-inline-config on both touched files exit 0; pnpm --filter @object-ui/console type-check exit 0 after building '@object-ui/console^...' (first run exit 2 on unresolved @object-ui/* declarations before that build); console tsconfig includes src with no exclude. PR check-runs: not yet concluded at report time (in_progress).",
"line_budget": "+152 / -4 across 3 files (changeset 12, provider +35/-2, test +105/-2); under the 3000 human-merge threshold",
"files_changed": [".changeset/27498-display-locale-after-language-switch.md", "ui/apps/console/src/LocalizationFetchProvider.tsx", "ui/apps/console/src/LocalizationFetchProvider.test.tsx"],
"deviations": ["The harness's post-PR assignee + review-request step was skipped on purpose (dispatch order and the maintainer's routing rule): PR has no assignee and no reviewer.", "One extra test commit (in-flight registry reset between the new cases) after ablation 2 first showed cross-case pollution; ablation 2 was re-run on that head.", "Merge commit amended before its first push to carry the trailer pair."],
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create -> #27624), POST /repos/objectstack-ai/objectstack/issues/27498/comments (this report, post-stamped); plus 3 git pushes to the branch",
"open_questions": [],
"out_of_scope_findings": ["class: a · reach: console sign-in page, device language 中文 (objectui-locale = zh) with sys_user.locale unset, sign in, open All Tasks: headers 截止日期, cells 'Nov 18, Nov 8, Nov 1, Nov 28' on every load · evidence: GET /auth/me/localization answers the Accept-Language rung en-US for a user with no column, and useDisplayLocale ranks it above the UI language; measured on this stack with the column reset to null; not closed by this PR (no write happens to trigger a re-read). A fix changes useDisplayLocale's documented precedence or needs the endpoint to say which rung answered: a design call · dedupe words: useDisplayLocale precedence, Accept-Language outranks UI language, sys_user.locale unset, device language, date cells English", "carrier: seat 2 · noted in PR Acceptance notes: useDisplayLocale docblock says the tenant locale is 'Frequently undefined'; an authenticated read always answered a locale here", "carrier: none · object description staying English under zh-CN is showcase bundle coverage, out of scope per the card"]
}
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 客户的语言 | none | P②
Triage: p2 ·
domain:ui·area:i18n· 2026-10-29T11:23Z⛔ Not a claim.
bug,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
Claim: PM loop round 1 · 2026-10-29T13:20Z
Session:
session_01Utp6CY2n1JmZZKrHgtp9jC(seat; implementation by a card thread,mode:thread)Account:
os-billBranch:
claude/project-thread-b2omyd(the card thread's harness push branch, self-reported — the measured platform exception toclaude/issue-N-slug)Worktree:
objectstack-issue-27498Domain:
domain:uiSeat:
domain:ui#2File surface:
ui/packages/i18n/src/useDisplayLocale.ts,ui/apps/console/src/LocalizationFetchProvider.tsx,ui/packages/fields/src/index.tsx/ui/packages/plugin-grid/src/**only if the cause is grid-specific, tests beside, a changeset (stop on breach; explain in the report)Container & model:
M,mode:thread,model: TIER_DEFAULT(dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no (expected)
Metadata-protocol: none (expected; the dev measures from the diff)
Responsibility: unproven: the display-locale derivation (
ui/packages/i18n/ console localization provider) or a grid-specific path — the dev measures | none | every zh-CN user of a list grid, todayThread-read: 6495313192
Premise: unverified — code reading on
origin/mainee9a8d6efinds the grid's date cells already locale-aware (DateCellRenderer→useDisplayLocale→formatDate); the cause is unproven (hypothesis: a stale server locale outranks the switched UI language). The dev reproduces first; a non-repro is a legalpremise_still_valid: falsereport.Serial constraints cleared: none — no open PR touches these files
Dispatch order:
/mnt/project-files/ui-seat2/dispatch-27498.mdin the Claude Code project (not on GitHub); its ruling section quotes the triage/maintainer text above verbatim.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
os-dev-report
{ "issue": 27498, "status": "done", "branch": "claude/project-thread-b2omyd", "pr": "https://github.com/objectstack-ai/objectstack/pull/27624", "head": "416229c1bbe508d13cf64b35dec7475d309583ba", "session": "session_01Utp6CakU47s2AYQsrXttMo (card thread; seat session_01Utp6CY2n1JmZZKrHgtp9jC)", "premise_still_valid": true, "summary": "Reproduced on app-showcase (fresh backend + console vite from source, en-US browser): after avatar menu -> Language -> 中文, All Tasks shows Nov 18 / Oct 11 under 截止日期 while a record page loaded by URL shows 2026年10月11日. Cause: the switch changes the UI language first (remounting LocalizationFetchProvider via the console shell's key={language}) and writes sys_user.locale second; the remount's GET /auth/me/localization can reach the server before the write commits and answers en-US, and useDisplayLocale ranks that answer above the UI language for the rest of the session. Not grid-specific: the record page reached by click in the same session also read Oct 11, 2026. Fix in the console provider only: re-read on every data-invalidation of the signed-in user's own sys_user row, the re-read opting out of joining a pre-write in-flight request (AbortController signal); formatter, renderers and useDisplayLocale unchanged (ruling 6495313192 holds).", "tests": "head eda50a4a: pnpm --dir ui exec vitest run apps/console/src/LocalizationFetchProvider.test.tsx -> Tests 18 passed (18), 4 new cases in 're-reads after a write to the signed-in user's own row'. Ablation 1 (scripts/ablation-replace.mjs, anchor '}, [endpoint, userRowWrites]);' -> '}, [endpoint]);', anchor 1->0): red 'a read that lost the race with the language write is replaced after the write' + 'the re-read does not join a request still in flight from before the write'; restored, hash equal to HEAD. Ablation 2 (delete 'signal: reread?.signal,', anchor 1->0): red 'the re-read does not join…' only, 1 failed | 17 passed; restored, hash equal. Source-resolved suite, no dist leg. Live stack, PATCH held 1.5 s: before fix cells 'Nov 18, Nov 8, Nov 1…', after fix '11月18日, 11月8日, 11月1日…', record by click '2026年10月11日'; PATCH held 0 s: same after-fix reading.", "gates": "head 416229c1 (after merging origin/main 1ed336097). dispatch-gates --commands: 33 derived; --ran: 33 run, 0 NOT-MEASURED, 0 UNRUN. 32 exit 0 (check-sdui-manifest.mjs and --self-test included). 'pnpm --dir ui exec vitest run scripts/' exit 1: 2 failed | 4899 passed, both 'Test timed out in 15000ms' on tree-wide scans while dev servers shared the box (check-hand-rolled-comment-mask.test.ts, check-vi-mock-inherit.test.ts); re-run alone under the lock: Test Files 2 passed, Tests 105 passed. Outside derivation: console suite Test Files 262 passed, Tests 2599 passed; eslint --no-inline-config on both touched files exit 0; pnpm --filter @object-ui/console type-check exit 0 after building '@object-ui/console^...' (first run exit 2 on unresolved @object-ui/* declarations before that build); console tsconfig includes src with no exclude. PR check-runs: not yet concluded at report time (in_progress).", "line_budget": "+152 / -4 across 3 files (changeset 12, provider +35/-2, test +105/-2); under the 3000 human-merge threshold", "files_changed": [".changeset/27498-display-locale-after-language-switch.md", "ui/apps/console/src/LocalizationFetchProvider.tsx", "ui/apps/console/src/LocalizationFetchProvider.test.tsx"], "deviations": ["The harness's post-PR assignee + review-request step was skipped on purpose (dispatch order and the maintainer's routing rule): PR has no assignee and no reviewer.", "One extra test commit (in-flight registry reset between the new cases) after ablation 2 first showed cross-case pollution; ablation 2 was re-run on that head.", "Merge commit amended before its first push to carry the trailer pair."], "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create -> #27624), POST /repos/objectstack-ai/objectstack/issues/27498/comments (this report, post-stamped); plus 3 git pushes to the branch", "open_questions": [], "out_of_scope_findings": ["class: a · reach: console sign-in page, device language 中文 (objectui-locale = zh) with sys_user.locale unset, sign in, open All Tasks: headers 截止日期, cells 'Nov 18, Nov 8, Nov 1, Nov 28' on every load · evidence: GET /auth/me/localization answers the Accept-Language rung en-US for a user with no column, and useDisplayLocale ranks it above the UI language; measured on this stack with the column reset to null; not closed by this PR (no write happens to trigger a re-read). A fix changes useDisplayLocale's documented precedence or needs the endpoint to say which rung answered: a design call · dedupe words: useDisplayLocale precedence, Accept-Language outranks UI language, sys_user.locale unset, device language, date cells English", "carrier: seat 2 · noted in PR Acceptance notes: useDisplayLocale docblock says the tenant locale is 'Frequently undefined'; an authenticated read always answered a locale here", "carrier: none · object description staying English under zh-CN is showcase bundle coverage, out of scope per the card"] }Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
ACCEPT → PR #27624 comment 6500810015 (head
416229c1); contract review not owed (Clause-②: no,Metadata-protocol: none); landing through the merge queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC
Landed · 2026-10-29T15:39Z
91e9797a21671a76d4f1fd7c288c51852dcb864ecompletedby the PR'sFixeslineState:
pm:dispatchedremoved; the assignee stays as the record of who carried it.Generated by Claude Code