2026-02-20 22:08:04 +01:00

118 lines
5.1 KiB
Markdown

---
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