From 470b540634f3803fd11fa832b68124f28591e6dc Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Oct 2026 08:28:47 +0000 Subject: [PATCH] fix(i18n): three screen-flow dialogs title the step, not the flow, in zh-CN, es-ES and ja-JP MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv --- .changeset/2096-screen-titles.md | 5 +++++ src/sales/translations/es-ES/app.ts | 14 +++++++++----- src/sales/translations/ja-JP/app.ts | 14 +++++++++----- src/sales/translations/zh-CN/app.ts | 14 +++++++++----- 4 files changed, 32 insertions(+), 15 deletions(-) create mode 100644 .changeset/2096-screen-titles.md diff --git a/.changeset/2096-screen-titles.md b/.changeset/2096-screen-titles.md new file mode 100644 index 00000000..93e1835e --- /dev/null +++ b/.changeset/2096-screen-titles.md @@ -0,0 +1,5 @@ +--- +'hotcrm': patch +--- + +Three screen-flow dialogs no longer repeat their own name as the step title in Chinese, Spanish and Japanese. The small line above the dialog's title names the flow, and the title names the step, as it already did in English: **Convert Lead** now opens on **转化详情** / **Detalles de la Conversión** / **変換詳細** (Conversion Details), **Generate Quote** on **报价单详情** / **Detalles de la Cotización** / **見積詳細** (Quote Details), and **Enroll Members** on **加入条件** / **Criterios de Inscripción** / **登録条件** (Enrollment Criteria). Each wording reuses the term the app already uses for that object or action. Before this change, all three dialogs showed the flow's name twice, for example **线索转化流程** on both lines. diff --git a/src/sales/translations/es-ES/app.ts b/src/sales/translations/es-ES/app.ts index e55003fb..f1ba35f6 100644 --- a/src/sales/translations/es-ES/app.ts +++ b/src/sales/translations/es-ES/app.ts @@ -594,8 +594,12 @@ export const appSurface: Omit = { // `screens..title` and `screens..fields..{label,placeholder}` // — the keys `os lint`'s `i18n/missing-flow` names, read by the console's // flow runner since @objectstack 17.7.0 (the spec's `flows` liveness row is - // `live` there). A screen with no authored `title` shows its flow's label in - // every locale, so each `screen_1.title` repeats the flow label. Since + // `live` there). A screen with no authored `title` is headed by its node + // `label` (the executor's `config.title ?? node.label`, measured on + // 18.0.0-next.0), so each `screens..title` translates that node label, + // never the flow label: the dialog shows the flow label as its eyebrow above + // the title, and the two differ on `lead_conversion`, `quote_generation` and + // `campaign_enrollment` (#2096). Since // 18.0.0-next.0 three more surfaces are keys the engine reads in the run's // locale, and `i18n/missing-flow` names each missing one: a select field's // `options.` (worded as the object field's own option in this pack), @@ -609,7 +613,7 @@ export const appSurface: Omit = { label: 'Inscribir miembros en la campaña', screens: { screen_1: { - title: 'Inscribir miembros en la campaña', + title: 'Criterios de Inscripción', fields: { memberSource: { label: 'Tipo de miembro a inscribir', options: { leads: 'Prospectos', contacts: 'Contactos' } }, leadStatus: { label: 'Inscribir prospectos con estado', options: { new: 'Nuevo', contacted: 'Contactado', qualified: 'Calificado' } }, @@ -655,7 +659,7 @@ export const appSurface: Omit = { label: 'Proceso de conversión de prospecto', screens: { screen_1: { - title: 'Proceso de conversión de prospecto', + title: 'Detalles de la Conversión', // The duplicate warning's text is a variable the flow assigns; this // key can only carry the hole that shows it. description: '{{duplicateWarning}}', @@ -706,7 +710,7 @@ export const appSurface: Omit = { refusals: { refuse_held: { message: 'Primero va la aprobación de calificación: marque Solicitar Aprobación de Calificación. No se creó nada.' } }, screens: { screen_1: { - title: 'Generar cotización desde la oportunidad', + title: 'Detalles de la Cotización', fields: { quoteName: { label: 'Nombre de Cotización' }, expirationDays: { label: 'Válida por (días)' }, diff --git a/src/sales/translations/ja-JP/app.ts b/src/sales/translations/ja-JP/app.ts index 33df2202..0782cd47 100644 --- a/src/sales/translations/ja-JP/app.ts +++ b/src/sales/translations/ja-JP/app.ts @@ -596,8 +596,12 @@ export const appSurface: Omit = { // `screens..title` and `screens..fields..{label,placeholder}` // — the keys `os lint`'s `i18n/missing-flow` names, read by the console's // flow runner since @objectstack 17.7.0 (the spec's `flows` liveness row is - // `live` there). A screen with no authored `title` shows its flow's label in - // every locale, so each `screen_1.title` repeats the flow label. Since + // `live` there). A screen with no authored `title` is headed by its node + // `label` (the executor's `config.title ?? node.label`, measured on + // 18.0.0-next.0), so each `screens..title` translates that node label, + // never the flow label: the dialog shows the flow label as its eyebrow above + // the title, and the two differ on `lead_conversion`, `quote_generation` and + // `campaign_enrollment` (#2096). Since // 18.0.0-next.0 three more surfaces are keys the engine reads in the run's // locale, and `i18n/missing-flow` names each missing one: a select field's // `options.` (worded as the object field's own option in this pack), @@ -611,7 +615,7 @@ export const appSurface: Omit = { label: 'キャンペーンにメンバーを登録', screens: { screen_1: { - title: 'キャンペーンにメンバーを登録', + title: '登録条件', fields: { memberSource: { label: '登録するメンバーの種類', options: { leads: 'リード', contacts: '取引先責任者' } }, leadStatus: { label: '登録するリードのステータス', options: { new: '新規', contacted: 'コンタクト済み', qualified: '適格' } }, @@ -657,7 +661,7 @@ export const appSurface: Omit = { label: 'リード変換プロセス', screens: { screen_1: { - title: 'リード変換プロセス', + title: '変換詳細', // The duplicate warning's text is a variable the flow assigns; this // key can only carry the hole that shows it. description: '{{duplicateWarning}}', @@ -708,7 +712,7 @@ export const appSurface: Omit = { refusals: { refuse_held: { message: '先に案件化承認が必要です。「案件化承認を申請」にチェックを入れてください。何も作成されていません。' } }, screens: { screen_1: { - title: '商談から見積を作成', + title: '見積詳細', fields: { quoteName: { label: '見積名' }, expirationDays: { label: '有効期間(日)' }, diff --git a/src/sales/translations/zh-CN/app.ts b/src/sales/translations/zh-CN/app.ts index 0f8eca7c..dd55500c 100644 --- a/src/sales/translations/zh-CN/app.ts +++ b/src/sales/translations/zh-CN/app.ts @@ -595,8 +595,12 @@ export const appSurface: Omit = { // `screens..title` and `screens..fields..{label,placeholder}` // — the keys `os lint`'s `i18n/missing-flow` names, read by the console's // flow runner since @objectstack 17.7.0 (the spec's `flows` liveness row is - // `live` there). A screen with no authored `title` shows its flow's label in - // every locale, so each `screen_1.title` repeats the flow label. Since + // `live` there). A screen with no authored `title` is headed by its node + // `label` (the executor's `config.title ?? node.label`, measured on + // 18.0.0-next.0), so each `screens..title` translates that node label, + // never the flow label: the dialog shows the flow label as its eyebrow above + // the title, and the two differ on `lead_conversion`, `quote_generation` and + // `campaign_enrollment` (#2096). Since // 18.0.0-next.0 three more surfaces are keys the engine reads in the run's // locale, and `i18n/missing-flow` names each missing one: a select field's // `options.` (worded as the object field's own option in this pack), @@ -610,7 +614,7 @@ export const appSurface: Omit = { label: '将成员加入营销活动', screens: { screen_1: { - title: '将成员加入营销活动', + title: '加入条件', fields: { memberSource: { label: '加入的成员类型', options: { leads: '线索', contacts: '联系人' } }, leadStatus: { label: '加入以下状态的线索', options: { new: '新建', contacted: '已联系', qualified: '已确认' } }, @@ -656,7 +660,7 @@ export const appSurface: Omit = { label: '线索转化流程', screens: { screen_1: { - title: '线索转化流程', + title: '转化详情', // The duplicate warning's text is a variable the flow assigns; this // key can only carry the hole that shows it. description: '{{duplicateWarning}}', @@ -707,7 +711,7 @@ export const appSurface: Omit = { refusals: { refuse_held: { message: '需先完成立项审批:请勾选「申请立项审批」。尚未创建任何内容。' } }, screens: { screen_1: { - title: '从商机生成报价单', + title: '报价单详情', fields: { quoteName: { label: '报价名称' }, expirationDays: { label: '有效期(天)' },