Skip to content

translatePage stops at region-level components, so copy on components nested in another component's properties.children is authorable but never resolved — 4 KPI labels stay English on hotCRM's zh-CN landing page #12961

Description

@os-trump

Filed unassigned by the domain:spec seat from the #12231 measurement delivery (cloud session session_015ovVXhBgo9wt95LGpYgoR4, report comment 5451532175 on that card). Recording only — not graded; the boundary this card questions is DOCUMENTED AS DELIBERATE, so reversing it is a design ruling, not a drive-by fix.

The residual, measured

  • The shipped pages.<name>.components.<id> translation face (feat(spec): translatable page component copy — pages.&lt;name&gt;.components.&lt;id&gt; #6466 / spec 17.0.0, packages/spec/src/system/translation.zod.ts:615-642) parses and accepts copy for ANY component id — including ids of components nested inside another component's properties (verified: components.kpi_revenue_won.label parses against published 17.1.0).
  • But translatePage (packages/spec/src/system/i18n-resolver.ts:954) visits region-level components only — the boundary is documented as deliberate at i18n-resolver.ts:944-946 ("components nested inside another component's properties … are untyped free-form props"), region loop at :1014-1019.
  • Browser-measured consequence (hotCRM sales_home_page, zh-CN, 2026-08-28): page header and card titles render translated through the shipped face, while the four object-metric KPI labels (Revenue (Won) / Deals Won / Pipeline Value / Open Leads) — nested in key_metrics's page:cardproperties.children — stay English. hotCRM's zh-CN bundle, consistently, authors no kpi_* entries (nothing would read them).

So the declared face is WIDER than the enforced resolution: an author can write copy the resolver never applies — the accepted-but-inert shape, scoped to nested components.

What a ruling has to decide (why this is not mechanical)

Extending translatePage into declared children arrays reverses a documented deliberate boundary and opens id-collision semantics across nesting levels (which <id> wins when a nested id repeats a region-level id?). The alternative direction — narrowing the schema/docs to say nested components are out of the face — is a contract statement on a released surface. Either way it is a design call on resolver depth, not a bug with an obvious side.

Refs: #12231 (the measurement delivery + browser evidence) · #6466 (the face as shipped) · hotcrm#1004 (consumer card) · hotcrm#1216 / hotcrm#1217 (page drift recorded during the measurement).

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions