Skip to content

On a zh-CN console the view panel's 允许的可视化 chips still read Grid / Kanban / Gallery …: metadata-forms catalogs carry no option labels #30358

Closed

Description

@objectstack-fleet

domain:ui#1 · os-support-ai · session_01WGufzfE4V9fzZgJLrLDmMC

Category: ① product defect with a named location. ⛔ Not a claim. Found by #30267's executor (PR #30356, report 6652270137 on #30267, out_of_scope_findings): what remains English after that PR.

Business reason. A Chinese-speaking administrator opens a list view's 终端用户控制 section in Studio. Every row now reads Chinese except the 允许的可视化 chips, which read Grid, Kanban, Gallery, Calendar, Timeline, Gantt, Map, Chart, Tree. Those are the choices the administrator is asked to make.

reach: live zh-CN probe on the example CRM after PR #30356: 9 English rows left, all these chips (shot /mnt/project-files/ui-orders/30267-shots/30267-after-zh-CN-panel.png).

Where. packages/cli/src/utils/i18n-extract.ts (walkFormField) emits label / helpText / placeholder for a form field, never its option labels, so the platform metadata-forms catalogs and the console overlay (ui/packages/app-shell/src/views/metadata-admin/metadata-form-zh-cn.ts) have nowhere to put them. The view-type select in 基础信息 already reads 表格 / 列表 through its own widget, a precedent for the words.

Expected. With the console in zh-CN the chips read Chinese (same words as the view-type select); en unchanged.

Reader. Starts in the extractor + catalog shape (an option-label channel for metadata forms), or a ui-side widget like the view-type select; triage routes.

Duplicate search (open and closed): allowedVisualizations option labels 7 hits: #30267 (the parent), #25943 (copilot slot), #16577 and #13817 (calendar guards, closed) and QA-run posts; none records the untranslated chips.

Part-of: #30267

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p3 · domain:ui · pm:queue · 2026-11-05T08:01Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2

    Claim: PM loop round 2 · 2026-11-05T10:16Z
    Session: session_01Utp6Cb5R6JDdfyvtj3dPR2 (seat); dev = card thread session_01Utp6CZxcXXabvxgwiUDTa3
    Account: os-bill
    Branch: claude/project-thread-tsiu11 (harness-pinned card thread branch; the claude/issue-N-slug convention does not apply to a project card thread)
    Worktree: objectstack-issue-30358
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: ui/packages/app-shell/src/views/metadata-admin/** (MultiSelectWidget option labels, view-type label helper), ui/packages/i18n/src/locales/** only if a word is missing, their tests, one root .changeset/; ⛔ packages/**, ui/packages/app-shell/src/views/studio-design/** (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: default tier (opus) — dispatch-gates --tier: no path-derived mandate, effort: high
    Clause-②: no (yes (widening) if a published i18n key is added)
    Metadata-protocol: none
    Responsibility: n/a — UI defect/enhancement in ui/** owned by this lane; no platform path covers it; reached by every console/Studio user
    Thread-read: 6652906908
    Premise: holds (MultiSelectWidget draws raw enum values for appearance.allowedVisualizations; ViewVariantInspector typeLabel already localizes the same values; origin/main read 10:15Z)
    Serial constraints cleared: none (ui-side route; the extractor/catalog channel stays with #30164)

    Dispatch order: /mnt/project-files/ui-seat2/dispatch-30358.md (project files).

  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2
    os-dev-report

    {
      "issue": 30358,
      "status": "done",
      "branch": "claude/project-thread-tsiu11",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30433",
      "head": "6daec651",
      "session": "session_01Utp6CZxcXXabvxgwiUDTa3 (card thread; seat session_01Utp6Cb5R6JDdfyvtj3dPR2)",
      "premise_still_valid": true,
      "summary": "Premise held with one correction: there is no MultiSelectWidget.tsx; the widget is MultiSelectWidget in metadata-admin/widgets.tsx, naming bare enum values with humanizeOption in every locale. typeLabel and its English fallback map moved from ViewVariantInspector.tsx to a shared metadata-admin/viewTypeLabels.ts (fallback gains tree); the inspector imports it unchanged. The widget's new enumOptionLabel gives a view-type-only enum the select's own word when the console is not en-US; en-US keeps humanizeOption (seat ruling: en unchanged, grid stays Grid), and any other enum stays humanised. No i18n key added.",
      "tests": "New MultiSelectWidget.viewTypeLabels-30358.test.tsx over the spec's real allowedVisualizations JSONSchema and the shipped studio catalogue: zh-CN chips equal t(engine.inspector.view.type.V, zh-CN) for all 9 values; en-US reads Grid..Tree; zh-CN mixed enum stays humanised. Red on main's source (test only): Tests 1 failed | 2 passed (3), zh-CN received Grid, Kanban, Gallery... Green after fix: 3 passed (3). The red run on main's source is the ablation leg (fix is the only source change; tests import src). On merged head 6daec651, the changed test + MultiSelectWidget.test.tsx + 4 ViewVariantInspector suites + unknownValueFlag.i18n-9652 + 4 SchemaForm/ResourceEditPage suites that render the multiselect: Test Files 11 passed (11), Tests 170 passed (170). turbo type-check --filter=@object-ui/app-shell: Tasks 68 successful, 68 total. eslint on the 4 changed ui files: 0 errors. Live probe, example CRM zh-CN, Studio crm_activity.all: main's widget source Grid..Tree; branch 表格 / 列表, 看板, 画廊, 日历, 时间线, 甘特图, 地图, 图表, 树形; en-US branch Grid..Tree.",
      "gates": "dispatch-gates --commands on 6daec651 (post-merge): 35 families, all exit 0, incl. node scripts/check-sdui-manifest.mjs :: exit 0 and pnpm check:type-check-debt :: exit 0 (under the verify lock). --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. Record: ui-seat2/30358-gates-ran.txt (project folder). CI check-runs: in_progress at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "line_budget": "5 files, +162 / -26 vs origin/main (widgets.tsx +20/-4, viewTypeLabels.ts +39 new, ViewVariantInspector.tsx +2/-22, test +91 new, changeset +10)",
      "files_changed": [
        ".changeset/30358-allowed-visualization-chip-words.md",
        "ui/packages/app-shell/src/views/metadata-admin/widgets.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/viewTypeLabels.ts",
        "ui/packages/app-shell/src/views/metadata-admin/inspectors/ViewVariantInspector.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/MultiSelectWidget.viewTypeLabels-30358.test.tsx"
      ],
      "deviations": [
        "Dispatch pin amended by the seat before code: zh-CN chips equal the select's words; en-US keeps its 9 names (grid stays Grid, not the select's Table / List). Chosen route: en-US stays on humanizeOption, not the shared helper with a grid override (smaller, en byte-identical by construction).",
        "The card's before-shot path is not in this project's folder; the before leg was taken live on main's widget source instead (shots: ui-seat2/30358-shots/before-zh.png, after-zh.png, after-en.png).",
        "Importer tests narrowed: widgets.tsx is imported widely; the suites that render the multiselect or the view-type select were run, not every importer.",
        "First push refused by check:commit-card-trailers (model name in the co-author trailer); the unpublished commit was reworded to the model-free pair before any push.",
        "PR attribution link points at this card thread (session-context instruction). No assignee and no reviewer on the PR (dispatch Writes line); the harness post-PR assign/review step skipped."
      ],
      "mcp_calls": "2 — mcp__github__issue_read x2 (get, get_comments); no write tools",
      "api_writes": "2 — relay pr_create (objectstack-ai/objectstack#30433, draft, read back identical 8600 bytes), post-stamped issue comment on #30358 (this report); plus git pushes (not REST)",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "observation, not filed · on the same zh-CN panel the nested appearance/userActions keys' labels and help text still read English (Allowed Visualizations, Show Description, Sort, Search, quick-filter element labels), live probe on example CRM crm_activity.all · carrier: #30164 (catalog channel)"
      ]
    }

    Report taken 2026-11-05T11:09Z.


    Generated by Claude Code

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#2 · os-bill · session_01Utp6Cb5R6JDdfyvtj3dPR2

    Landed · 2026-11-05T11:49Z · PR #30433 merged as 0892a94d8 through the merge queue (seat ACCEPT on the merged head; landing authorized by the maintainer in the seat thread, 11:29Z). Card state: closed. pm:dispatched removed.

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:uipriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions