Repository navigation
[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
Activity
- addedbugSomething isn't workingSomething isn't workingupstream:objectstackBlocked on / caused by the ObjectStack platform — tracked upstreamBlocked on / caused by the ObjectStack platform — tracked upstream
on Aug 5, 2026 - added a commit that references this issue
on Aug 5, 2026 +1 instance from the action sweep: timeline drill-down renders the raw i18n key
detail.viewSourceSame 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.pngvscase1_timeline_scrolled.png), and #673's raw actor id is confirmed unchanged and visible in the UI.
Generated by Claude Code
- added a commit that references this issue
on Aug 5, 2026 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
envalidation 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/Galleryview-mode switcher and theSum:/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 inentoo, not only a translation gap),More actions/Add reaction/Clear/ the visibleClosebutton, 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
[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
- 复现:头像菜单或
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/console17.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 asadmin@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'senpoint too — an English user no longer sees an internal identifier.Screenshot
682-validation-toast-en.pngcarries 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" onClear/Close)- toolbar fully localized: 新建 / 导入 / 行内编辑 / 筛选 / 分组 / 排序 / 30 条记录; aria-labels 通知 / 切换侧边栏 / 切换视图 / 搜索… / 打开消息中心 / 在 Studio 中设计 ✅
One false positive worth recording so nobody re-chases it: a literal
Griddoes appear in zh-CN page text — it is the seeded record name "Northwind Grid Modernization", not chrome. An exact-text-node query forGrid/Gallery/Kanbanreturns 0 nodes. The view-mode switcher (visible only below thesmbreakpoint; the desktop layout uses view tabs) lists app-authored view names, all correctly translated — noGrid/Gallerymode 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.labeland 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 aneeds-user-decisioncontract question). Recording the ruling rather than re-litigating it.4. CJK enumeration comma in the
envalidation toast — FIXEDEmpty New Case submit,
enlocale, 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 acrm_accountdetailzh-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.tsdeclares onlypage:headerandrecord: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 authorpage:tabswith literallabel: '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 highlightsandDiscussionare 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
dependsOnLabelsprop); ②More actions/Add reactionfixed,Clear/Closenot reproducible; ③ attribution rejected → #5428; ④ joiner fixed per-locale (Intl.ListFormatwas measured and deliberately rejected — unit-type separators are empty strings in zh/ru).The sibling card #5084 (
Grid/Galleryswitcher,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'sSum:→合计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
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/Discussionaria-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, notobjectstack. 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:v17on objectstack-ai/objectstack#8668 (Seat B — console), not #8667, for the routing reason recorded there. No labels applied by me.
Generated by Claude Code
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 theenvalidation 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 highlightsandDiscussionaria-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.tsdeclares onlypage:headerandrecord: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 literalGriddoes 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
- Fixed: the raw object API name in the lookup placeholder (all four locales; a regex scan for
- addedpriority:p2Medium: important, M3Medium: important, M3and removed
on Sep 9, 2026
Found during the 17.0 GA acceptance sweep on
@objectstack/*17.0.0-rc.2 (currentmain). 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:
Select crm_account first请先选择crm_accountまず crm_account を選択してくださいSeleccione primero crm_accountThe sentence around it is localized; only the interpolated object name is raw. Note the
encase 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 / Timelineswitcher,More actions,Add reaction,Clear,Close, and the list footer aggregatesSum:/Avg:stay English even in zh-CN, whose app bundle is otherwise complete.Evidence:
zh-CN-2-account-list.png, plus per-localecase_list_toolbar/account_detail_buttonsdumps 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-captionsTotal 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:
The
validation.formInvalidjoiner 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 obligatorioshould beobligatoria(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.