594d6099dd
Beide Korrekturen im Browser gegengeprueft. Der aussagekraeftigste Fall ist die Gruppe "Alle Benutzer" mit zwei Mitgliedern und einer Freigabe: der Dialog schreibt "2 Mitglieder und 1 Modul-Freigabe" — Mehrzahl und Einzahl im selben Satz, jede Zahl einzeln richtig. Bei "Vertrieb Innendienst" mit je einem heisst es durchgaengig Einzahl. Die vier Du-Stellen sind ebenfalls im Browser bestaetigt: Aktivierungsdialog, Sperrseite und Marktplatz-Hinweis siezen jetzt. Der Leerzustand der Gruppenliste ist live nicht erreichbar, weil Gruppen existieren — er bleibt durch den Komponententest abgedeckt. Der UAT-Bericht zu Phase 15, in dem beide Maengel urspruenglich notiert wurden, ist entsprechend nachgezogen. Dort war nur der Aktivierungsdialog als Du-Stelle vermerkt; bei der Korrektur kamen drei weitere zum Vorschein. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01K5jtbGzC5Sf9npJ3JCjKhq
141 lines
7.0 KiB
Markdown
141 lines
7.0 KiB
Markdown
---
|
|
quick_id: 260907-ipz
|
|
subsystem: i18n
|
|
tags: [next-intl, icu-plural, de.json, en.json, vitest]
|
|
|
|
provides:
|
|
- "Vier deutsche Oberflaechentexte auf Sie-Form umgestellt (leere Gruppenliste, Modul-Aktivierungsdialog, Modul-Sperrseite, Marktplatz-Hinweis)"
|
|
- "ICU-Plural fuer memberCount/grantCount im Gruppen-Loeschdialog (de + en), behebt falsche Mehrzahl bei genau 1"
|
|
- "Mock-Uebersetzer in groups-page.test.tsx kann jetzt ICU-Plural aufloesen (nach Vorbild der select-Aufloesung in grants-matrix.test.tsx)"
|
|
- "Neuer Regressionstest fuer den Einzahl-Fall (memberCount: 1, grantCount: 1)"
|
|
affects: []
|
|
|
|
actuals:
|
|
tokens: 2409
|
|
tasks: 2
|
|
commits: 3
|
|
plan_head_before: 04827a4
|
|
|
|
tech-stack:
|
|
added: []
|
|
patterns:
|
|
- "ICU-Plural in next-intl-Nachrichten: `{name, plural, one {# Form} other {# Formen}}`, wie bereits bei admin.ldap...resultSummary etabliert"
|
|
|
|
key-files:
|
|
created: []
|
|
modified:
|
|
- apps/web/src/messages/de.json
|
|
- apps/web/src/messages/en.json
|
|
- "apps/web/src/app/(portal)/admin/groups/groups-page.test.tsx"
|
|
- "apps/web/src/app/(portal)/admin/modules/grants/grants-matrix.test.tsx"
|
|
- apps/web/src/components/modules/module-access-gate.test.tsx
|
|
|
|
key-decisions:
|
|
- "Neuer Einzahl-Test wurde angelegt (nicht nur der bestehende Text korrigiert), weil beide bestehenden Loeschdialog-Tests nur mit memberCount:4/grantCount:2 laufen und den Einzahl-Fall nie abgedeckt haetten"
|
|
- "Keiner der fuenf bestehenden Test-Fundstellen wurde geloescht — alle wurden auf den neuen Wortlaut nachgezogen"
|
|
- "en.json wurde nur fuer den Loeschdialog (Defekt 2) angefasst, nicht fuer die Anrede (Defekt 1) — Englisch kennt die Du/Sie-Unterscheidung nicht"
|
|
|
|
requirements-completed: []
|
|
|
|
duration: 12min
|
|
completed: 2026-09-07
|
|
status: complete
|
|
---
|
|
|
|
# Quick Task 260907-ipz: Anrede vereinheitlichen (Duzen auf Siezen) und Einzahl korrigieren Summary
|
|
|
|
**Vier duzende deutsche Texte auf Sie-Form umgestellt und die falsche Mehrzahl im Gruppen-Loeschdialog durch echtes ICU-Plural in de.json/en.json ersetzt.**
|
|
|
|
## Performance
|
|
|
|
- **Duration:** 12min
|
|
- **Commits:** 3
|
|
- **Files changed:** 5
|
|
|
|
## Accomplishments
|
|
|
|
### Task 1: Anrede auf Siezen vereinheitlichen (Defekt 1)
|
|
|
|
Alle vier bisher duzenden Werte in `apps/web/src/messages/de.json` wurden auf die Sie-Form
|
|
umgestellt:
|
|
|
|
- `admin.groups.noGroupsBody`: "Legen Sie Ihre erste Gruppe an, um Modulzugriff gezielt zu vergeben."
|
|
- `adminModules.activationDialog.body`: "… oder möchten Sie die Freigaben separat konfigurieren?"
|
|
- `modules.accessDenied.body`: "Sie haben für dieses Modul keine Freigabe. Wenden Sie sich an Ihren Administrator."
|
|
- `marketplace.toastNoAccess`: "Kein Zugriff auf dieses Modul — wenden Sie sich an Ihren Administrator."
|
|
|
|
`en.json` blieb fuer diese Aufgabe unveraendert. Die drei betroffenen Testdateien
|
|
(`groups-page.test.tsx`, `grants-matrix.test.tsx`, `module-access-gate.test.tsx`) wurden mit
|
|
ihren Mock-Nachrichten und der einen betroffenen Zusicherung (Leerzustand-Text in
|
|
`groups-page.test.tsx`) auf denselben Wortlaut nachgezogen. Kein Test wurde geloescht.
|
|
|
|
**Commit:** `b701617` — fix(260907-ipz): Anrede in vier deutschen Texten auf Siezen umstellen
|
|
|
|
### Task 2: Ein-/Mehrzahl im Loeschdialog korrigieren (Defekt 2), TDD
|
|
|
|
**RED:** Der Mock-Uebersetzer `resolve()` in `groups-page.test.tsx` wurde um eine
|
|
ICU-Plural-Aufloesung erweitert (Regex `/\{(\w+),\s*plural,\s*one\s*\{...\}\s*other\s*\{...\}\}/g`,
|
|
nach dem Vorbild der bestehenden `select`-Aufloesung in `grants-matrix.test.tsx`). Ein neuer Test
|
|
`'uses singular wording for exactly one member and one module grant'` mit
|
|
`impact: { memberCount: 1, grantCount: 1 }` wurde direkt nach dem bestehenden Mehrzahl-Test
|
|
eingefuegt. Zu diesem Zeitpunkt trug die Mock-Nachricht noch den alten Wortlaut
|
|
(`{memberCount} Mitglieder`), sodass der Test nachweislich rot lief mit dem Rendering
|
|
"Diese Gruppe hat 1 Mitglieder und 1 Modul-Freigaben." — exakt der live beobachtete Defekt.
|
|
**Commit:** `dee52a2` — test(260907-ipz): failing test fuer Einzahl im Loeschdialog
|
|
|
|
**GREEN:** `admin.groups.deleteConfirm.body` wurde in `de.json` und `en.json` auf ICU-Plural
|
|
umgestellt (`memberCount` und `grantCount` je mit eigenem `plural`-Argument, Zweige `one`/`other`,
|
|
Zahl als `#`), im selben Stil wie das bestehende `admin.ldap.…resultSummary`. Die Mock-Nachricht
|
|
in `groups-page.test.tsx` wurde wortgleich nachgezogen. Danach liefen alle 12 Tests in der Datei
|
|
gruen — der neue Einzahl-Test, die beiden bestehenden Mehrzahl-Tests und alle uebrigen.
|
|
**Commit:** `3746754` — feat(260907-ipz): ICU-Plural fuer Mitglieder- und Freigabenzahl im Loeschdialog
|
|
|
|
Kein REFACTOR-Commit war noetig — die Implementierung war bereits minimal.
|
|
|
|
## Verification
|
|
|
|
- `grep` ueber `de.json` und alle drei Testdateien nach Du-Formen: leer.
|
|
- `pnpm --dir apps/web test -- groups-page.test.tsx grants-matrix.test.tsx module-access-gate.test.tsx umlaut-guard.spec.ts` — 4 Testdateien, 26 Tests, alle gruen.
|
|
- `pnpm --dir apps/web test` (volle Suite) — **38 Testdateien, 226 Tests, alle gruen.**
|
|
- `pnpm --dir apps/web run type-check` — `tsc --noEmit`, keine Fehler, keine Ausgabe.
|
|
- Schluesselsatz-Parität `de.json`/`en.json`: 787 Schluessel identisch (Node-Skript, beide Richtungen leer).
|
|
- `grep -c 'memberCount, plural'` und `grep -c 'grantCount, plural'`: je genau 1 Treffer in beiden Sprachdateien.
|
|
|
|
## Deviations from Plan
|
|
|
|
None - plan executed exactly as written.
|
|
|
|
## Known Stubs
|
|
|
|
None.
|
|
|
|
## TDD Gate Compliance
|
|
|
|
RED-Commit (`test(260907-ipz): ...`) und GREEN-Commit (`feat(260907-ipz): ...`) sind in dieser
|
|
Reihenfolge im Git-Log vorhanden. Kein Gate-Verstoss.
|
|
|
|
## Not Yet Verified (Human/Browser)
|
|
|
|
Die im Plan genannte Sichtpruefung im Browser (Docker-Rebuild + manuelle Pruefung aller vier
|
|
Textstellen plus des Loeschdialogs auf Deutsch und Englisch) wurde bewusst NICHT von diesem
|
|
Executor durchgefuehrt — das obliegt laut Ausfuehrungsauftrag dem Orchestrator/User.
|
|
|
|
## Abnahme im Browser am 2026-09-07 — alle sechs Punkte bestanden
|
|
|
|
Web neu gebaut, echter Chrome, beide Konten.
|
|
|
|
| Prüfpunkt | Ergebnis |
|
|
|---|---|
|
|
| Löschdialog "Vertrieb Innendienst" (1 Mitglied, 1 Freigabe) | „Diese Gruppe hat **1 Mitglied und 1 Modul-Freigabe**." |
|
|
| Löschdialog "Alle Benutzer" (2 Mitglieder, 1 Freigabe) | „Diese Gruppe hat **2 Mitglieder und 1 Modul-Freigabe**." — Mehrzahl und Einzahl im selben Satz, beide richtig |
|
|
| Aktivierungsdialog | „… oder **möchten Sie** die Freigaben separat konfigurieren?" |
|
|
| Sperrseite als `nutzer2` | „**Sie haben** für dieses Modul keine Freigabe. **Wenden Sie sich** an **Ihren** Administrator." |
|
|
| Marktplatz-Hinweis als `nutzer2` | „Kein Zugriff auf dieses Modul — **wenden Sie sich** an **Ihren** Administrator." |
|
|
| Duz-Formen irgendwo in `de.json` | keine mehr (Wortgrenzen-Suche über alle Werte) |
|
|
|
|
Der gemischte Fall bei "Alle Benutzer" ist der aussagekräftigste: er zeigt, dass die
|
|
Pluralregel je Zahl einzeln greift und nicht pauschal auf eine Form umschaltet.
|
|
|
|
Der Leerzustand der Gruppenliste (`admin.groups.noGroupsBody`) ist live nicht
|
|
erreichbar, weil Gruppen existieren — er bleibt durch den Komponententest abgedeckt.
|