feat(i18n): convert product name catalog batch 1 - #4656
Conversation
Convert the first 60 debt-free product-name keys across every locale to
{{productName}}. Splitting by key across all locales preserves placeholder
parity while keeping the review diff below the 1 MB pipeline limit.
Regenerate en-XA from the merged English catalog. Korean particles whose
form depends on the rendered product name use both forms because an edition
can override the default with a name whose final consonant is unknown at
authoring time.
Twelve keys carrying inherited untranslated values are deliberately left
for the final batch: touching them without translating them fails the
changed-passthrough gate and would mix translation cleanup into this
mechanical chunk.
Refs kirodotdev#1957
GPT 5.6 Review (fork) — ✅ no blocking findingsReviewed Review detailsNo findings. |
Design Review (Fable 5, fork) — ✅ PASSDesign-level review of The design checks out: the interpolation seam exists in the base ( Design-Verdict: PASS Mechanical catalog conversion riding a seam built for exactly this, batched on the only axis the parity gates permit; no design-level concerns. [DESIGN-REVIEWED] 088c1bb |
UX Review (Fable 5, fork) — 🟡 CONCERNSUX-level review of Reviewed the full patch (14 locale files, 60 keys), the i18n interpolation seam in UX-Verdict: CONCERNS Rendering is byte-identical for stock users everywhere except Korean, where correct particles were downgraded to hedged dual forms across ~30 visible strings. Watch
[UX-REVIEWED] 088c1bb |
First Principles Review (Fable 5, fork) — ✅ PASSPremise-level review of All evidence checked. The patch is a pure data conversion: every one of its 780 added lines carries First-Principles-Verdict: PASS Completes a documented, already-seamed migration in declared mechanical batches; every difference is either the conversion itself or a deferral the description names. What this change shipsIntent: make existing catalog copy actually render an edition's overridden product name — a FIX of the gap #1964 left (seam live, catalogs still literal).
No new key, flag, code path, or public surface is introduced; the only consumer mechanism ( [FIRST-PRINCIPLES-REVIEWED] 088c1bb |
Opus 4.8 Review (fork) — ✅ no blocking findingsReviewed Review detailsI've verified the key risks directly from the code:
The discovery pass produced no candidates, and I could not ground any defect myself to the (a)/(b)/(c) bar at 80+ confidence. No findings. [OPUS-REVIEWED] 088c1bb |
Problem / Motivation
#1964 added the supported
{{productName}}interpolation seam, but the existing i18n catalogs still hardcodeKiro Crew. Converting all 181 eligible keys in one PR produces a diff over the 1 MB review-pipeline limit, while splitting by locale would violatecatalogParityplaceholder parity.Why it matters
Until the catalog conversion finishes, a downstream edition can call
setProductName()but most visible copy still renders the stock name. Converting reviewable batches closes that gap without asking maintainers or AI review lanes to audit a 1.4 MB mechanical diff, and without leaving any intermediate commit where one locale carries a placeholder that another drops.What changed (motivation → approach → change)
This is batch 1 of 3 catalog PRs. It converts exactly 60 product-name keys across every catalog at once:
Kiro Crewwith{{productName}}in the same 60 logical keys acrossen.json,en.manual.json, and all 11 shipped translations.en-XA.jsonfrom the merged English catalog; it is not edited by hand.apps.<id>.manifest.*value unchanged because[manifest-sync]requires byte-identical Pythonapp.jsonprose.이(가),을(를),은(는),와(과),(으)로). An edition may supply a name with or without a final consonant, so a single fixed form is no longer grammatically valid.[changed-passthrough]gate correctly fail; the final batch will translate and convert them together rather than mixing translation cleanup into this mechanical chunk.For every non-Korean shipped value in this diff, resolving
productNameto the stock default reproduces the previous value exactly. The Korean differences are only the required variable-dependent particle forms.Tests
I18N_BASE_REF=upstream/main npm run i18n:check— all 18 checks pass, including placeholder parity, changed-value QA, changed-passthrough, pseudolocale freshness, DNT integrity, and manifest sync.npx vitest run src/i18n/— 604 passed, 1 expected failure.npm run build— passes.BRAND_BASE_REF=upstream/main python3 scripts/check_brand_name.pyand./scripts/scrub-lint.sh --no-history— pass.CliPanelCoverage.test.tsxtheme-sync suite failed only in the 38-minute whole-suite run. That file passes 41/41 in isolation, and this PR changes catalog JSON only. Electron tests pass.Manual verification
N/A — the structural behavior is covered more strongly by the catalog-wide parity and changed-value gates: all locales carry the same placeholder set, non-Korean stock rendering is exactly preserved, and Korean variable-dependent grammar is enforced by its style gate.
Related Issues
Checklist
feat|fix|docs|refactor|perf|test|chore|ci|build|revert: ...)