Skip to content

[17.0-rc][疑似平台] Console chrome i18n gaps: raw object API name in a lookup placeholder, untranslated view/toolbar strings, CJK comma joiner in the en toast #682

Description

@yinlianghui

Found during the 17.0 GA acceptance sweep on @objectstack/* 17.0.0-rc.2 (current main). Read-only check — the only form submissions were empty ones, rejected client-side, nothing persisted.

Four defects that all live in console-supplied chrome rather than the app's translation bundle, so no amount of work in src/translations/ can fix them. Filed together because they share that root; split if you'd rather track them separately.

1. Raw object API name leaks into a user-facing placeholder

The Contact lookup on the New Case form renders the API name, not the object's translated label, in all four locales:

Locale Rendered
en Select crm_account first
zh-CN 请先选择crm_account
ja-JP まず crm_account を選択してください
es-ES Seleccione primero crm_account

The sentence around it is localized; only the interpolated object name is raw. Note the en case too — this is not only an i18n bug, an English user also sees the internal API name.

Evidence: *-4a-case-new-form.png, *-4-validation.png (all four locales).

2. View-mode and toolbar chrome untranslated in every non-en locale, zh-CN included

Grid / Gallery / Kanban / Calendar / Timeline switcher, More actions, Add reaction, Clear, Close, and the list footer aggregates Sum: / Avg: stay English even in zh-CN, whose app bundle is otherwise complete.

Evidence: zh-CN-2-account-list.png, plus per-locale case_list_toolbar / account_detail_buttons dumps in the run log.

3. Dashboard filter labels and KPI sub-captions hardcoded English in all locales

Filter chips read Owner: / Lead Source: while their values localize correctly (全部 / すべて / Todo), and KPI stat cards carry English sub-captions Total Amount / Accounts / Contacts / Leads. Widget titles and descriptions themselves are correctly translated, which is what makes the mismatch obvious.

Evidence: zh-CN-1-nav.png, ja-JP-1-nav.png, es-ES-1-nav.png.

4. The English validation toast joins field names with the CJK enumeration comma

In the en locale the toast reads:

Please check the highlighted fields: Subject、Account、Status…

The validation.formInvalid joiner is hardcoded 、 (U+3001) rather than locale-aware. Wrong in English; right by accident in zh/ja.

Evidence: shots/en-4-validation.png.

Minor related nit, same layer: the es-ES validation template concatenates without gender agreement — Cuenta es obligatorio should be obligatoria (shots/es-ES-4-validation.png).

Not in scope of this issue

The app-bundle-side debt (ja-JP / es-ES lagging zh-CN by 355 keys each) is tracked under #494; untranslated select options under #645. Those are HotCRM's to fix. The four above are not.

Activity

  1. added
    bugSomething isn't working
    upstream:objectstackBlocked on / caused by the ObjectStack platform — tracked upstream
    on Aug 5, 2026
  2. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    CollaboratorAuthor

    +1 instance from the action sweep: timeline drill-down renders the raw i18n key detail.viewSource

    Same layer as the four defects above (console-supplied chrome, unfixable from the app bundle), found while verifying activity-action artifacts:

    Every activity entry in a record's Activity timeline renders its drill-down link as the literal key detail.viewSource → instead of a localized "View source" label. Screenshot in the acceptance run: case1_timeline_scrolled.png (w2b directory).

    Notable because the earlier i18n sweep (R3) explicitly recorded "no raw-key leaks observed anywhere" — that held for the app-bundle surfaces, and this is the first counter-example, in console chrome, on a surface R3 didn't visit (the timeline only gains these entries after actions write activities).

    Also logged from the same sweep, related-but-distinct console timeline nits, recorded here for the picker's context rather than as separate issues: the Activity tab count says "(3)" while the timeline lists 6 entries (count appears to query only audit rows, ignoring action-written activities — screenshots case1_timeline2.png vs case1_timeline_scrolled.png), and #673's raw actor id is confirmed unchanged and visible in the UI.


    Generated by Claude Code

  3. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    CollaboratorAuthor

    Filed upstream as objectstack-ai/objectstack#5407 — "console: chrome i18n gaps beyond #5084 — raw object API name in a lookup placeholder, untranslated toolbar/filter strings, CJK list joiner in the en validation toast".

    One scoping note from the duplicate check: item 2 of this issue is already tracked upstream as objectstack-ai/objectstack#5084, which covers the Grid / Gallery view-mode switcher and the Sum: / Avg: footer aggregates. #5407 therefore deliberately excludes those and carries only the remainder — the lookup placeholder leaking the raw object API name (which is a defect in en too, not only a translation gap), More actions / Add reaction / Clear / the visible Close button, the dashboard filter chips and KPI sub-captions, and the 、 joiner in the English validation toast.

    Nothing here is fixable in this repo at any level of bundle completeness; all four locales are now complete on every authored surface after #679, #687 and #697.


    Generated by Claude Code

  4. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    CollaboratorAuthor

    [17.0-rc2验收] 同层(console 供给的 chrome i18n)再补两条新证据,均在 rc.2(@objectstack/* 17.0.0-rc.2 / hotcrm@0899b4f)上复现,只读走查(仅提交空表单被前端拦下,无写入)。

    A. 记录详情页的内置标签页「Details / Related / Attachments / Activity」——zh-CN 已译,ja-JP / es-ES 仍是英文(局部 locale 覆盖缺口)

    不是「全 locale 未译」,而是只有 zh-CN 有翻译:

    locale 详情页顶部内置标签
    zh-CN 详情 / 相关 / 附件 / 活动 ✅
    ja-JP Details / Related / Attachments / Activity ❌
    es-ES Details / Related / Attachments / Activity ❌
    • 复现:头像菜单或 Accept-Language 设为对应语言,打开任意 crm_account / crm_contact / crm_opportunity / crm_case 记录详情。四个对象、三种语言均一致复现(zh 译、ja/es 英)。
    • 关键点:HotCRM 应用 bundle 三语言键数完全对齐(0 缺失键),所以这组标签的语言差异不可能来自应用 bundle——只能来自 console 内置串,即 console 自带了 zh-CN 翻译但缺 ja-JP / es-ES。
    • 这条同时修正 zh-CN coverage: dead option/section/widget keys, 3 missing objects, untranslated action params (verified on v2.2.2) #497「Out of scope」里把 detail-page tab 标题归为"untranslatable page metadata"的判断:这些内置标签是可译的(zh 已经译出证明 slot 存在),真实性质是 console 内置串的 ja/es 覆盖缺口,而非架构上无法翻译。补齐 console 自带 ja/es 词条即可。

    B. 地址复合字段的子字段标签在所有非 en locale 都是英文(create/edit 表单)

    crm_account 新建/编辑表单里 billing_address 展开为子输入框,其标签在 zh/ja/es 全部保持英文:Street Address / City / State / Province / ZIP / Postal Code / Country。周围的字段(客户名称、账单地址分组标签「账单地址/請求先住所/Dirección de Facturación」)都正确本地化,唯独地址控件自带的子标签是硬编码英文。属 console 的 address 控件 chrome,应用 bundle 无从覆盖。(与 #664「详情页地址渲染原始 JSON」是不同侧面:此处表单确实渲染成了子输入框,只是子标签未本地化。)

    证据:zh-CN / ja-JP / es-ES 三轮 *-account-new 表单 label dump 与截图;详情页内置标签见各 locale *-crm_account-detail 截图(zh 显示「详情/相关/附件」,ja/es 显示「Details/Related/Attachments」)。
    环境:hotcrm@0899b4f + @objectstack 17.0.0-rc.2,独立 dev server(file DB, --seed-admin, admin@objectos.ai)。


    Generated by Claude Code

  5. hotlong commented on Aug 14, 2026

    @hotlong
    Contributor

    GA re-test on 17.0.0 — three headline symptoms fixed, a residual survives · card stays OPEN

    Version — @objectstack/* 17.0.0 GA (incl. @objectstack/console 17.0.0), hotcrm @ d4ddee0.
    Probe — fresh database, objectstack dev -p 4003 --seed-admin, real Chromium 141 via Playwright, one context per locale (en / zh-CN / ja-JP / es-ES), signed in as admin@objectos.ai. Read-only walk plus two deliberately-empty form submits (rejected client-side, nothing persisted).

    Reported per symptom, as #1154 asked — and they did not all share a fate.


    1. Raw object API name in the lookup placeholder — FIXED in all four locales

    The dependent Contact lookup on the New Case form, re-measured against this card's own table:

    Locale rc.2 (reported) 17.0.0 GA (measured)
    en Select crm_account first ❌ Select Account first ✅
    zh-CN 请先选择crm_account ❌ 请先选择所属客户 ✅
    ja-JP まず crm_account を選択してください ❌ まず 取引先 を選択してください ✅
    es-ES Seleccione primero crm_account ❌ Seleccione primero Cuenta ✅

    Regex scan for crm_[a-z_]+ over the whole dialog text: zero matches in every locale. The interpolated token is now the resolved, translated label. Note this settles the card's en point too — an English user no longer sees an internal identifier.

    Screenshot 682-validation-toast-en.png carries this and symptom 3 in one frame.

    2. Untranslated view/toolbar chrome — FIXED for every string this card named

    Measured in zh-CN on the case list, the opportunity list and a record detail. Literal-English scan for Grid / Gallery / Kanban / Timeline / More actions / Add reaction / Clear / Close / Sum: / Avg::

    • More actions → 更多操作 ✅
    • Sum: → 合计 (footer reads 金额: 合计:5,452,500.00, 预期收入: 合计:3,389,500.00) ✅
    • Add reaction / Clear / Close → not present in any locale ✅ (consistent with the upstream PM's "cannot reproduce" on Clear/Close)
    • toolbar fully localized: 新建 / 导入 / 行内编辑 / 筛选 / 分组 / 排序 / 30 条记录; aria-labels 通知 / 切换侧边栏 / 切换视图 / 搜索… / 打开消息中心 / 在 Studio 中设计 ✅

    One false positive worth recording so nobody re-chases it: a literal Grid does appear in zh-CN page text — it is the seeded record name "Northwind Grid Modernization", not chrome. An exact-text-node query for Grid / Gallery / Kanban returns 0 nodes. The view-mode switcher (visible only below the sm breakpoint; the desktop layout uses view tabs) lists app-authored view names, all correctly translated — no Grid/Gallery mode labels render in this app at all.

    Screenshots 682-list-toolbar-zh-CN.png, 682b-opp-list-zh-CN.png, 682-switcher-mobile-zh-CN.png.

    3. Dashboard filter chips / KPI sub-captions — not re-measured here; attribution was rejected upstream

    The upstream PM ruled this item's attribution unfounded — the chip prefixes are DashboardFilterDef.label and the KPI sub-captions are dataset measure labels, i.e. app metadata, which is why the values localized while the prefixes did not. The genuine renderer defect found underneath it was split out as objectstack-ai/objectstack#5428 (with a needs-user-decision contract question). Recording the ruling rather than re-litigating it.

    4. CJK enumeration comma in the en validation toast — FIXED

    Empty New Case submit, en locale, live toast text:

    Please check the highlighted fields: Subject, Account, Status…
    

    ASCII , + space. Scan for U+3001 (、) across the entire page: absent. The joiner is locale-aware now.

    Screenshot 682-validation-toast-en.png.


    What survives on GA — and why this card stays open

    A. Built-in record-detail tabs are untranslated in ja-JP and es-ES (zh-CN is fine)

    The finding from this card's 2026-08-05 comment reproduces unchanged on GA:

    locale [role="tab"] texts on a crm_account detail
    zh-CN 详情 / 相关 26 / 附件 ✅
    ja-JP Details / Related 26 / Attachments ❌
    es-ES Details / Related 26 / Attachments ❌

    Attribution re-verified rather than inherited — I checked whether this app authors those tabs, because if it did the bug would be ours. It does not: src/pages/account_detail.page.ts declares only page:header and record:chatter, and its own header comment records that the console synthesizer owns "header, highlights, path, tabs with Details/Related/Activity/History, reference rail". (The pages that do author page:tabs with literal label: 'Details' — case/lead/opportunity detail — are a separate, app-side matter and are not what was measured here.) zh-CN rendering translated proves the slot exists; so this is a locale-coverage gap in the console's own bundle, not an architectural limit — which also keeps the correction this card made to #497 standing.

    B. Two console aria-labels stay English in every locale

    Record highlights and Discussion are the only purely-ASCII aria-labels left on a record detail in zh-CN, ja-JP and es-ES (in es-ES they sit among 30+ correctly-Spanish ones — Copiar ID de registro, Filtrar actividad, 26 elementos — which is what makes them conspicuous). Screen-reader-only, same layer, unreachable from any app bundle.

    Screenshots 682-detail-tabs-zh-CN.png / -ja-JP.png / -es-ES.png, 682b-detail-zh-CN.png.


    Mirror status — objectstack-ai/objectstack#5407, as #1150 asked

    It is CLOSED (completed), 2026-08-05, by objectui PR #3379 (merged) — which is why symptoms 1, 2 and 4 read green above. Its per-item acceptance is recorded on that card: ① fixed (the interpolated token turned out to be the controlled field's label, not the object name, delivered via a new dependsOnLabels prop); ② More actions / Add reaction fixed, Clear / Close not reproducible; ③ attribution rejected → #5428; ④ joiner fixed per-locale (Intl.ListFormat was measured and deliberately rejected — unit-type separators are empty strings in zh/ru).

    The sibling card #5084 (Grid/Gallery switcher, Sum:/Avg: footer, dialog a11y fallbacks) was migrated, not rejected, to objectstack-ai/objectui#4024 under the maintainer's file-at-destination ruling (objectstack#7167, 2026-08-10), and closed 2026-08-13 by objectui PR #4602. That is the landing this card's Sum: → 合计 reading confirms shipped in GA.

    So both upstream mirrors for this card are discharged; the residual above is new and needs its own card. Filing it in objectui (see the follow-up comment) — that is where every fix for this card has actually landed (PR #3379, PR #4602) and where the file-at-destination ruling points console work.

    Probed under #1154 (parent #1150).


    Generated by Claude Code

  6. hotlong commented on Aug 14, 2026

    @hotlong
    Contributor

    Mirror for the surviving residual filed: objectstack-ai/objectui#4645 — "console i18n residual on 17.0.0 GA: built-in record-detail tabs untranslated in ja-JP / es-ES (zh-CN fine), plus two English aria-labels in every locale".

    It carries only what actually survives — the ja-JP / es-ES detail-tab gap and the Record highlights / Discussion aria-labels. The three headline symptoms of this card are green on GA and are recorded as such in the reading above, so they are deliberately not re-filed.

    Repo choice: objectui, not objectstack. Both prior mirrors for this card were fixed in objectui (objectstack#5407 → objectui PR #3379; objectstack#5084 → migrated to objectui#4024 → PR #4602), and the maintainer's file-at-destination ruling (objectstack#7167, 2026-08-10) points console work at the destination repo. Filing a third objectstack shadow card would just be migrated again.

    Duplicate check before filing: searched objectui for the detail-tab / locale-coverage cluster — #4024 and #5407's landing are closed and cover different strings; #3134 is Studio form-layout designer i18n; #4474 is the organization/invitation UI. No existing card for this residual.

    Nominated for target:v17 on objectstack-ai/objectstack#8668 (Seat B — console), not #8667, for the routing reason recorded there. No labels applied by me.


    Generated by Claude Code

  7. hotlong commented on Aug 14, 2026

    @hotlong
    Contributor

    Closed — moved upstream to objectstack-ai/objectui#4645

    Dispositioned under the transfer sweep #1156 (part 2). Maintainer ruling, 2026-08-14, quoted verbatim and untranslated:

    hotcrm 席位的原则是用平台的能力做元数据应用的开发,平台的需求应该转给平台

    and for the hotcrm side of a transferred card, the same ruling: 「关掉,只留指向镜像的指针」. Authority: #1156.

    The mirror — verified before this close, not assumed

    objectstack-ai/objectui#4645 — "console i18n residual on 17.0.0 GA: built-in record-detail tabs untranslated in ja-JP / es-ES (zh-CN fine), plus two English aria-labels in every locale". Confirmed open, labelled bug, and carrying exactly what survives on GA — the per-locale tab table and the two aria-labels — with the three fixed headline symptoms recorded as fixed rather than re-filed.

    Mirror is in objectui, not objectstack: both prior mirrors for this card were fixed in objectui (objectstack#5407 → objectui PR #3379; objectstack#5084 → migrated to objectui#4024 → PR #4602), and the file-at-destination ruling (objectstack#7167, 2026-08-10) points console work at the destination repo. A third objectstack shadow card would just be migrated again.

    The reading this close rests on

    The GA re-test already on this card — comment of 2026-08-14, a real browser walk with one context per locale (en / zh-CN / ja-JP / es-ES). Reported per symptom, and they did not share a fate:

    • Fixed: the raw object API name in the lookup placeholder (all four locales; a regex scan for crm_[a-z_]+ over the dialog returns zero matches), the toolbar/view chrome this card named (More actions → 更多操作, Sum: → 合计), and the CJK enumeration comma in the en validation toast (U+3001 absent).
    • Attribution rejected upstream for the dashboard chips / KPI sub-captions — app metadata, not chrome; recorded rather than re-litigated.
    • Survives: built-in record-detail tabs render English in ja-JP and es-ES while zh-CN renders 详情 / 相关 / 附件, plus the Record highlights and Discussion aria-labels in every locale.

    Two things in that reading make this close safe rather than optimistic. Attribution was re-verified, not inherited: account_detail.page.ts declares only page:header and record:chatter, and the console synthesizer owns the tabs — so no app-side bundle work can reach those strings. And a false positive was caught and recorded so nobody re-chases it: a literal Grid does appear in zh-CN page text, but it is the seeded record name "Northwind Grid Modernization"; an exact-text-node query for the mode labels returns zero nodes.

    The zh-CN tab rendering is what makes this a coverage gap rather than an architectural limit — the translation slot exists and is wired, which also keeps this card's correction to #497 standing.

    Why it closes here

    The remedy is console bundle entries for ja-JP / es-ES plus routing two aria-labels through the bundle. This app's four locale bundles are key-aligned with zero missing keys, so no amount of app-side translation can reach these strings — the condition under which the ruling above sends a card upstream.

    Nothing is lost by this close: objectui#4645 is open, carries the surviving items with their attribution, and is readable without hotcrm context.


    Generated by Claude Code


    Generated by Claude Code

  8. added and removed on Sep 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingpriority:p2Medium: important, M3upstream:objectstackBlocked on / caused by the ObjectStack platform — tracked upstream

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions