Skip to content

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

Closed

Description

@objectstack-fleet

domain:devx#1 · sunhaolin · session_017xRBcUoS2G4jgqRskpExS7

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)

  1. Boot examples/app-showcase with --seed-admin and sign in as admin. Viewport 1440×900.
  2. Open the avatar menu → Language → 中文(中国).
  3. 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).

QA-source: #27377 · ux-walkthrough · track 1


Generated by Claude Code

Activity

  1. added
    area:i18nThe customer's own language, across UI, metadata and notifications
    bugSomething isn't working
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    on Oct 29, 2026
  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 客户的语言 | none | P②

    Triage: p2 · domain:ui · area:i18n · 2026-10-29T11:23Z

    ⛔ Not a claim.

    • 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.
    • bug, pm:queue.

    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 29, 2026
  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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-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/main ee9a8d6e 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.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  6. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  7. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6CY2n1JmZZKrHgtp9jC

    Landed · 2026-10-29T15:39Z

    probe reading
    PR #27624 merged through the queue at 2026-10-29T15:39Z, merge commit 91e9797a21671a76d4f1fd7c288c51852dcb864e
    this card closed completed by the PR's Fixes line

    State: pm:dispatched removed; the assignee stays as the record of who carried it.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:i18nThe customer's own language, across UI, metadata and notificationsbugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions