From 55e62f7b77850c6adcbd6b74c1de9a11018561f6 Mon Sep 17 00:00:00 2001 From: Wolfgang Kozian Date: Sat, 18 Jul 2026 09:17:04 +0200 Subject: [PATCH 1/3] feat(i18n): make version tag scanner-clean (fold v prefix into expression) --- frontend/scripts/i18n-allowlist.json | 1 - frontend/src/components/VersionTag.tsx | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/scripts/i18n-allowlist.json b/frontend/scripts/i18n-allowlist.json index 994c33d1..25e75aef 100644 --- a/frontend/scripts/i18n-allowlist.json +++ b/frontend/scripts/i18n-allowlist.json @@ -1,4 +1,3 @@ [ - "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__}`} ) } From 4609d4bc8fd238465725e92d0eaeaed72691ca03 Mon Sep 17 00:00:00 2001 From: Wolfgang Kozian Date: Sat, 18 Jul 2026 09:22:26 +0200 Subject: [PATCH 2/3] feat(i18n): mark auth-layout brand i18n-ignore; empty the allowlist --- frontend/scripts/i18n-allowlist.json | 4 +--- frontend/src/layouts/AuthLayout.tsx | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/frontend/scripts/i18n-allowlist.json b/frontend/scripts/i18n-allowlist.json index 25e75aef..fe51488c 100644 --- a/frontend/scripts/i18n-allowlist.json +++ b/frontend/scripts/i18n-allowlist.json @@ -1,3 +1 @@ -[ - "src/layouts/AuthLayout.tsx" -] +[] 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 (
+ {/* i18n-ignore: brand name, not translated */}

🐺 TaskWolf

From 13468ae716579edd9338560764abed9030d17170 Mon Sep 17 00:00:00 2001 From: Wolfgang Kozian Date: Sat, 18 Jul 2026 09:25:17 +0200 Subject: [PATCH 3/3] docs(i18n): mark S18 + entire #15 i18n full-rollout complete (allowlist empty) --- docs/superpowers/specs/2026-07-13-i18n-full-rollout-design.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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