--- name: translation-review description: Überprüft Django .po Übersetzungsdateien auf Qualität, Kontext-Passgenauigkeit, Konsistenz und fehlende Übersetzungen. Verbessert Übersetzungen direkt. Für Translation-QA und Review. argument-hint: "[locale] [--dry-run]" allowed-tools: Glob, Grep, Read, Edit, Write user-invocable: true --- # Django Translation Review Überprüft und verbessert Django `.po` Übersetzungsdateien im league-planner Projekt. Stellt sicher, dass Übersetzungen kontextgerecht, konsistent und vollständig sind. ## Argumente - `locale` (optional): Bestimmte Sprache prüfen, z.B. `de`, `fr`, `ko`. Ohne Angabe → alle Locales. - `--dry-run` (optional): Nur Bericht erstellen, keine Änderungen vornehmen. ## Workflow ### Phase 1: Discovery 1. Finde alle `.po` Files mit Glob: `**/locale/*/LC_MESSAGES/django.po` 2. Filtere nach dem angegebenen Locale (falls angegeben) 3. Überspringe `locale/common/` (das ist ein Referenz-File, kein echtes Locale) 4. Lies die `.po` Files und erstelle eine Übersicht: Locale, Anzahl Einträge, leere msgstr, fuzzy-Einträge ### Phase 2: Kontext-Analyse Um kontextgerechte Übersetzungen sicherzustellen, lies diese Kontext-Quellen: 1. **`scheduler/choices.py`** — Enthält Sport-spezifische Choice-Tuples mit `gettext_lazy`. Hier ist der Fachkontext (Sport/Liga-Planung) am klarsten. 2. **Source-Referenzen in .po** — Jeder `msgid` hat `#:` Kommentare die zeigen, wo der String verwendet wird. Nutze diese um den Kontext zu verstehen: - Strings aus `templates/` → UI-Labels, Buttons, Überschriften - Strings aus `models.py` → Feld-Labels, verbose_names - Strings aus `choices.py` → Dropdown-/Select-Optionen - Strings aus `views.py` → Nachrichten, Fehlermeldungen - Strings aus `helpers.py` → Solver-/System-Meldungen ### Phase 3: Qualitätsprüfung Prüfe jede Übersetzung auf diese Kriterien: #### Kritisch - **Leere Übersetzungen**: `msgstr ""` wo eine Übersetzung erwartet wird - **Fuzzy-Markierungen**: `#, fuzzy` Einträge die manuell bestätigt werden müssen - **Falsche Platzhalter**: `%(name)s`, `{0}`, `%d` müssen exakt übereinstimmen #### Kontext - **Sport-Fachbegriffe**: Im Kontext von Liga-Planung die richtigen Begriffe verwenden: - "Match" → "Spiel" (nicht "Übereinstimmung") - "Day" (als Spieltag) → "Spieltag" (nicht "Tag") - "Round" → "Runde" oder "Spieltag" je nach Kontext - "Home/Away" → "Heim/Auswärts" - "Fixture" → "Begegnung" oder "Ansetzung" - "Draw" → "Auslosung" (nicht "Zeichnung") - "Group" (im Turnier) → "Gruppe" - "Seed" → "Setzliste"/"gesetzt" (nicht "Samen") - "Clash" → "Überschneidung" oder "Konflikt" - "Scenario" → "Szenario" - "Constraint" → "Nebenbedingung" oder "Einschränkung" - "Wish" → "Wunsch" (Planungswunsch) - "Run" (Solver-Run) → "Lauf" oder "Durchlauf" - "Slot" → "Zeitfenster" oder "Slot" #### Konsistenz - **Gleiche Begriffe gleich übersetzen**: Wenn "Scenario" einmal "Szenario" ist, muss es überall "Szenario" sein - **Stil-Konsistenz**: Formell/Informell einheitlich (Du vs. Sie). league-planner verwendet **Du-Form** - **Groß-/Kleinschreibung**: Deutsche Substantive groß, UI-Labels konsistent #### Stil - **Natürliche Sprache**: Übersetzungen sollen sich natürlich anfühlen, nicht wie maschinelle Übersetzung - **Kürze**: UI-Labels kurz halten, keine unnötigen Wörter - **Aktive Sprache**: "Szenario wurde erstellt" statt "Es wurde ein Szenario erstellt" ### Phase 4: Änderungen anwenden Wenn NICHT `--dry-run`: 1. Für jede gefundene Verbesserung, nutze das Edit-Tool um den `msgstr` zu aktualisieren 2. Entferne `#, fuzzy` Markierungen wenn die Übersetzung korrekt bestätigt wurde 3. Fülle leere `msgstr` aus, sofern der Kontext eine sichere Übersetzung erlaubt 4. **WICHTIG**: Ändere NIEMALS `msgid` — nur `msgstr` darf geändert werden 5. **WICHTIG**: Erhalte alle `#:` Source-Referenz-Kommentare unverändert 6. **WICHTIG**: Erhalte Python-Format-Strings exakt (`%(name)s`, `{0}`, `%d` etc.) ### Phase 5: Zusammenfassung Gib am Ende eine strukturierte Zusammenfassung: ``` ## Translation Review — [Locale] ### Statistik - Geprüfte Einträge: X - Verbesserungen: Y - Fehlende Übersetzungen (gefüllt): Z - Fuzzy aufgelöst: W - Unverändert: V ### Änderungen | # | msgid | Alt | Neu | Grund | |---|-------|-----|-----|-------| | 1 | "..." | "..." | "..." | Kontext/Konsistenz/Stil | ### Offene Punkte - [Einträge die manuelle Prüfung brauchen] ``` ## Wichtige Regeln - **Konservativ sein**: Im Zweifel lieber nicht ändern als eine falsche Übersetzung einführen - **Kontext prüfen**: Immer die `#:` Source-Referenzen lesen bevor eine Übersetzung geändert wird - **Format-Strings erhalten**: `%(count)d Spiele` nicht `%(anzahl)d Spiele` - **Plural-Forms beachten**: `msgid_plural` / `msgstr[0]` / `msgstr[1]` korrekt handhaben - **Kein Overengineering**: Wenn eine Übersetzung gut genug ist, nicht ändern nur um sie "schöner" zu machen - **Locale `en`**: Englische .po Files haben typischerweise leere msgstr — das ist korrekt, da `msgid` bereits Englisch ist. Diese NICHT ausfüllen. - **Locale `common`**: Ist ein Referenz-File, nicht bearbeiten