Skip to content

fix(i18n): three screen-flow dialogs title the step, not the flow, in zh-CN, es-ES and ja-JP - #2100

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-2096-screen-titles
Oct 14, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-2096-screen-titles

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #2096

Clause-②: no

What changes

In zh-CN, es-ES and ja-JP, three screen-flow dialogs showed the flow's own name twice: once on the small line above the title (the flow label) and again as the title. Each title now names the step, as English already did. The fix is nine strings in three language packs, plus a corrected comment in the same three files.

Cause (measured on 2f3d898d, @objectstack/* 18.0.0-next.0)

  • The executor heads a screen with heading() ?? node.label (@objectstack/service-automation dist/index.js L11247). heading() is the translation at flows.FLOW.screens.NODE.title, or the authored config.title. None of the three screen_1 nodes authors config.title, so English shows the node label: "Conversion Details", "Quote Details", "Enrollment Criteria". The CLI extractor uses the same fallback for the key's seed (@objectstack/cli dist/utils/i18n-extract.js L1371: "A screen's title falls back to the node label").
  • The zh-CN, es-ES and ja-JP packs set screens.screen_1.title equal to flows.FLOW.label on those three flows. A comment in each pack gave the wrong fallback as the reason: "A screen with no authored title shows its flow's label in every locale, so each screen_1.title repeats the flow label."
  • H3 confirmed: es-ES and ja-JP had the same defect on the same three keys. A tsx probe over the flow barrels and the three packs found the screen title equal to the flow label on all three keys in all three packs.
  • The other four screen flows (escalate_case, close_case, claim_case, schedule_followup) use a node label equal to the flow label, in English too. Their translated titles match English and stay unchanged (see Acceptance notes).

Before → after (console DOM probe: the eyebrow / the title)

Measured with Playwright against objectstack dev -p 4104 on this worktree, admin session, browser locale set per row. Each row opens the record's action and reads [role=dialog] p.text-xs (eyebrow) and [role=dialog] h2 (title). Before = 2f3d898d, after = 470b5406.

locale flow (action) before after
en-US lead_conversion (Convert Lead) Lead Conversion Process / Conversion Details unchanged
en-US quote_generation (Generate Quote) Generate Quote from Opportunity / Quote Details unchanged
en-US campaign_enrollment (Enroll Members) Enroll Members in Campaign / Enrollment Criteria unchanged
zh-CN lead_conversion (转化线索) 线索转化流程 / 线索转化流程 线索转化流程 / 转化详情
zh-CN quote_generation (生成报价单) 从商机生成报价单 / 从商机生成报价单 从商机生成报价单 / 报价单详情
zh-CN campaign_enrollment (批量加入成员) 将成员加入营销活动 / 将成员加入营销活动 将成员加入营销活动 / 加入条件
es-ES lead_conversion (Convertir Prospecto) Proceso de conversión de prospecto / Proceso de conversión de prospecto Proceso de conversión de prospecto / Detalles de la Conversión
es-ES quote_generation (Generar Cotización) Generar cotización desde la oportunidad / Generar cotización desde la oportunidad Generar cotización desde la oportunidad / Detalles de la Cotización
es-ES campaign_enrollment (Inscribir Miembros) Inscribir miembros en la campaña / Inscribir miembros en la campaña Inscribir miembros en la campaña / Criterios de Inscripción
ja-JP lead_conversion (リード変換) リード変換プロセス / リード変換プロセス リード変換プロセス / 変換詳細
ja-JP quote_generation (見積を作成) 商談から見積を作成 / 商談から見積を作成 商談から見積を作成 / 見積詳細
ja-JP campaign_enrollment (メンバーを一括登録) キャンペーンにメンバーを登録 / キャンペーンにメンバーを登録 キャンペーンにメンバーを登録 / 登録条件

Wording: each term comes from the same pack

en term zh-CN es-ES ja-JP where the pack already uses it
Details (X Details page labels) 详情 (线索详情, 商机详情, 工单详情) Detalles de la/del X (Detalles del Prospecto, Detalles de la Oportunidad) X詳細 (リード詳細, 商談詳細, 取引先詳細) page labels in app.ts
Conversion 转化 Conversión 変換 the lead's conversion section label
Quote 报价单 Cotización 見積 crm_quote object label
Enroll 加入 (批量加入成员) Inscripción / Inscribir (Inscribir Miembros) 登録 (メンバーを一括登録) the enroll_leads action label and the screen's field labels
Criteria 条件 (符合条件的成员) Criterios 条件 (支払条件, 契約条件) existing message and field labels

File surface

  • The claim's surface: the screens.screen_1.title of lead_conversion, quote_generation and campaign_enrollment in src/sales/translations/zh-CN/app.ts. The same three keys in es-ES/app.ts and ja-JP/app.ts are included because H3 measured them equal to the flow label. Also .changeset/2096-screen-titles.md.
  • One change outside the claimed keys, in the same three files: the pack comment above flows: is corrected in each pack. It now says that a screen with no authored title is headed by its node label. Two reasons: (1) the old comment is the rationale the duplicated titles followed, and after this change it no longer describes the pack; (2) left as it was, it tells the next translator to undo this fix. The executor line and the CLI extractor line quoted under Cause are the evidence.
  • No test is added. No test pins these titles, and the claim admits tests only if one already does. A guard that compares screen titles with flow labels would be new tooling of the kind AGENTS.md §3 rules out. The DOM probe above is the one-time proof.

Verification (at 470b5406)

  • pnpm validate: exit 0, ✓ Validation passed
  • pnpm typecheck: exit 0 (tsc --noEmit)
  • pnpm lint: exit 0, 18 suggestion(s)
  • pnpm lint:i18n-gate: exit 0, ✓ i18n lint gate: 0 i18n/missing-* issues (18 total lint issue(s) reported, unaffected by this gate)
  • pnpm hygiene: exit 0, ✓ source hygiene clean
  • pnpm hygiene:tokens: exit 0, ✓ source token ratchet clean (translations are outside the ratchet by ruling)
  • pnpm build: exit 0, ✓ Build complete
  • pnpm test: exit 0, Test Files 179 passed (179), Tests 3659 passed | 1 skipped (3660)
  • Playwright e2e is left to CI.

Acceptance notes

  • Single-screen flows repeat their name in every locale, English included. Measured on this branch: Schedule Follow-up on a lead reads Schedule Follow-up / Schedule Follow-up in en-US and 安排跟进 / 安排跟进 in zh-CN. Reading the source, Escalate Case, Close Case and Claim Case have the same shape: node label equals flow label. The console renders the eyebrow unconditionally (objectui packages/app-shell/src/views/FlowRunner.tsx L619 on 2312bd9). This is not zh-CN: three screen-flow dialogs repeat the flow's own label as the screen title (Convert Lead shows 线索转化流程 twice): the zh-CN pack translates screens.screen_1.title as the flow label #2096's defect, because there the translation differed from English. It is passed to the seat as a finding and is not fixed here.
  • The docs keep the English screen name (Enrollment Criteria) on the zh-Hans and zh-Hant pages, following Documentation rule 6 (a pack-carried UI noun other than a list view name keeps its English spelling). No doc page changes.
  • test/automation-docs-coverage.test.ts pins the zh flow label 线索转化流程. The flow labels do not change, and the suite is green.

Generated by Claude Code

… zh-CN, es-ES and ja-JP

The zh-CN, es-ES and ja-JP packs translated `screens.screen_1.title` of
`lead_conversion`, `quote_generation` and `campaign_enrollment` as the flow's
own label, so the dialog showed the flow name twice: once as the eyebrow (the
flow label) and again as the title. The executor heads a screen with no
authored `title` by its node `label` (`config.title ?? node.label`), and those
three node labels are "Conversion Details", "Quote Details" and "Enrollment
Criteria", which English already shows.

Each title now translates its node label, worded with the term the same pack
already carries: zh-CN 转化详情 / 报价单详情 / 加入条件, es-ES Detalles de la
Conversión / Detalles de la Cotización / Criterios de Inscripción, ja-JP
変換詳細 / 見積詳細 / 登録条件. The pack comment that stated the wrong fallback
(a screen with no title "shows its flow's label") is corrected in all three
packs, since it is the rationale the duplicated titles followed.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv
@vercel

vercel Bot commented Oct 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
hotcrm Ignored Ignored Oct 14, 2026 8:49am UTC

Request Review

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

Labels

metadata Declarative metadata — schema, security posture, UI surfaces

Projects

None yet

2 participants