118 lines
5.1 KiB
Markdown
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
|