diff --git a/docs/superpowers/specs/2026-07-13-i18n-full-rollout-design.md b/docs/superpowers/specs/2026-07-13-i18n-full-rollout-design.md index 9104db75..bb7cbbd5 100644 --- a/docs/superpowers/specs/2026-07-13-i18n-full-rollout-design.md +++ b/docs/superpowers/specs/2026-07-13-i18n-full-rollout-design.md @@ -95,6 +95,8 @@ nicht der englische Text als Key). Geteilte Begriffe wandern nach `common`. Legende: ⬜ offen · 🔧 in Arbeit · ✅ fertig (Dateien aus Allowlist entfernt, Scanner grün, en/de gepflegt, Build grün, Browser-Check ok). +> ✅ **ROLLOUT COMPLETE (S0–S18):** every user-facing frontend string runs through `t()`; `i18n-allowlist.json = []`; scanner + en/de parity green in CI. Backend `MessageSource` remains backlog **#16**. + > **Session-Nummerierung `S#` ist eigenständig** und hat nichts mit den Backlog-Item- > Nummern (#13/#15/#16) zu tun. @@ -119,7 +121,7 @@ grün, en/de gepflegt, Build grün, Browser-Check ok). | S15 | `servicedesk` | ✅ | Both files localized (new `servicedesk` ns); scanner-blind SLA status localized (`'N/A'`→`'NA'` sentinel); resolved timestamp via `formatDateTime`; `t`-shadow (ticket) handled; P1–P4 severity + status left as data | | S16 | `orgs` | ✅ | All 3 files localized (new `orgs` ns); scanner-blind ROLE_LABELS localized at render site; `memberActionErrorMessage` takes `t`; `settingsTitle`/`removeConfirm` interpolation; timeout-var `t`-shadow renamed to `handle` | | S17 | `settings` (Rest) | ✅ | All 4 files localized by extending the existing `settings` ns (shared/tokens/apiKeys/integrations/webhooks groups; no new ns); DataTable headers + secret-reveal blocks + `{{provider}}`/`{{count}}` interpolation localized; dates via `formatDate`/`formatDateTime`; AccessTokens `cell: t`→`tok` shadow handled; event codes left as data | -| S18 | `shared`/Cleanup | ⬜ | DataTable, Table-Komponenten, NavItem, SidebarSection, VersionTag/StatusBadge falls geteilt, Rest-`common`; **finaler Scanner-auf-Null-Sweep** (Allowlist muss danach leer sein) | +| S18 | `shared`/Cleanup | ✅ | VersionTag `v`-Prefix folded to `{\`v${__APP_VERSION__}\`}` + `i18n-ignore` (Scanner prüft auch Template-Literal-Expr — fold allein reicht nicht; Wolfgang-approved); AuthLayout brand `i18n-ignore` (pilot pattern); DataTable/NavItem/SidebarSection/StatusBadge/table components already string-free (never allowlisted). **Allowlist = `[]`; scanner 0; parity green — #15 i18n full-rollout COMPLETE.** | > Hinweis: Diese Liste basiert auf dem Datei-Bestand vom 2026-07-13. Kommen bis zum > Abschluss neue Seiten/Komponenten hinzu, fängt der Scanner sie automatisch (neue diff --git a/frontend/scripts/i18n-allowlist.json b/frontend/scripts/i18n-allowlist.json index 994c33d1..fe51488c 100644 --- a/frontend/scripts/i18n-allowlist.json +++ b/frontend/scripts/i18n-allowlist.json @@ -1,4 +1 @@ -[ - "src/components/VersionTag.tsx", - "src/layouts/AuthLayout.tsx" -] +[] diff --git a/frontend/src/components/VersionTag.tsx b/frontend/src/components/VersionTag.tsx index 97e45476..a085d04a 100644 --- a/frontend/src/components/VersionTag.tsx +++ b/frontend/src/components/VersionTag.tsx @@ -1,7 +1,8 @@ export function VersionTag({ className = '' }: { className?: string }) { return ( - v{__APP_VERSION__} + {/* i18n-ignore: version format prefix, not UI copy */} + {`v${__APP_VERSION__}`} ) } diff --git a/frontend/src/layouts/AuthLayout.tsx b/frontend/src/layouts/AuthLayout.tsx index 7ecc3a1a..a1bdfa5d 100644 --- a/frontend/src/layouts/AuthLayout.tsx +++ b/frontend/src/layouts/AuthLayout.tsx @@ -5,6 +5,7 @@ export function AuthLayout() { return (