feat(i18n): Regelverstöße lokalisieren über stabile Fehlercodes - #28
Conversation
Die Engine warf ihre Meldungen als fertigen deutschen Text, den der Adapter roh an die UI durchreichte. Im englischen Modus stand damit deutscher Text im Toast. Naheliegend waere gewesen, in der Engine nach Sprache zu verzweigen - das widerspricht aber ihrem Kerndesign: sie ist UI-frei und soll spaeter autoritativ auf einem Server laufen, der gar nicht weiss, welche Sprache ein Client eingestellt hat. Uebersetzen ist Sache des Clients. Deshalb traegt EngineError jetzt einen stabilen, sprachfreien Code (EngineErrorCode) plus eine englische Entwickler-Message fuer Logs und Stacktraces. Der Adapter reicht den Code weiter statt des Textes - auch im GameAdapter-Interface, damit ein RemoteAdapter denselben Code unveraendert ueber die Leitung schicken kann. Erst die UI bildet ihn ueber t.errors[code] auf einen uebersetzten String ab. ENGINE_ERROR_CODES ist bewusst ein Array mit abgeleitetem Typ und nicht nur eine Union: nur so laesst sich zur Laufzeit pruefen, dass jeder Code uebersetzt ist. Der Code mustPlayZero ist bereits definiert, wird aber erst mit #27 geworfen - so passen die Branches beim Merge zusammen, ohne dass einer auf den anderen warten muss. Tests: 35 statt 32. Die bestehenden Fehlertests pruefen jetzt konkrete Codes statt nur die Fehlerklasse, dazu drei neue: jeder Code hat in jeder Sprache einen nicht-leeren Text, die Sprachen unterscheiden sich tatsaechlich (faengt einen versehentlich kopierten Block), und der Adapter meldet den Code statt des Textes. Verifiziert, dass derselbe Verstoss je nach Spracheinstellung "Karte nicht auf der Hand." bzw. "That card isn't in your hand." ergibt. Nebenbei: EngineError nutzt ein normales Feld statt einer Parameter-Property, weil Node die Tests im strip-only-Modus ausfuehrt, der keinen Code erzeugen darf.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
🚧 Files skipped from review as they are similar to previous changes (3)
📝 WalkthroughWalkthroughThe engine now emits stable error codes with English developer messages. Adapters pass codes to the UI, which displays localized German or English translations. Tests cover code propagation, message format, and translation completeness. ChangesEngine error localization
Estimated code review effort: 3 (Moderate) | ~20 minutes Mergeability Score: ⚪ Minimal · up to The change routes stable error codes to the UI for language-specific messages, with reported passing checks and tests; no actionable merge-blocking risk remains beyond normal review. Sequence Diagram(s)sequenceDiagram
participant Engine
participant LocalAdapter
participant AppSvelte
participant i18n
Engine->>LocalAdapter: throw EngineError with code
LocalAdapter->>AppSvelte: onError(code)
AppSvelte->>i18n: resolve t.errors[code]
i18n-->>AppSvelte: localized error text
Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Comment |
Neben der Versionsnummer (jetzt 1.4.3, da #27 die 1.4.2 belegt) gab es den erwarteten inhaltlichen Ueberlapp: #27 hat eine Wurfstelle fuer die Null-Kette ergaenzt, die noch den alten einargumentigen Aufruf mit deutschem Text nutzte. Git konnte das nicht sehen und hat engine.ts sauber automerged - die Stelle ist jetzt auf den bereits vorbereiteten Code mustPlayZero umgestellt. Verifiziert, dass beide Features zusammen greifen: code: mustPlayZero de: "Du musst eine 0 legen." en: "You have to play a 0." 37/37 Tests, 0 Fehler, 0 Warnungen.
Die Engine warf ihre Meldungen als fertigen deutschen Text, den der Adapter roh an die UI durchreichte. Im englischen Modus stand damit deutscher Text im Toast.
Warum nicht einfach in der Engine übersetzen
Das hätte ihrem Kerndesign widersprochen: Die Engine ist UI-frei und soll später autoritativ auf einem Server laufen, der gar nicht weiß, welche Sprache ein Client eingestellt hat. Übersetzen ist Sache des Clients.
Deshalb:
EngineErrorträgt einen stabilencodeplus eine englische Entwickler-Message für Logs und StacktracesGameAdapter.onErrorreicht den Code weiter statt des Textes – einRemoteAdapterkann denselben Code unverändert über die Leitung schickent.errors[code]abENGINE_ERROR_CODESist bewusst ein Array mit abgeleitetem Typ und nicht nur eine Union – nur so lässt sich zur Laufzeit prüfen, dass jeder Code übersetzt ist.Verifikation
Derselbe Verstoß, je nach Spracheinstellung:
Und die Null-Ketten-Regel aus #27, die dieser Branch mit übernimmt:
Tests
37/37 (die 32 aus #27 plus 5 neue). Die bestehenden Fehlertests prüfen jetzt konkrete Codes statt nur die Fehlerklasse, dazu drei neue:
npm run check: 0 Fehler, 0 Warnungen. Build grün.Merge-Stand
mainist eingemergt (Stand nach #26 und #27). Der inhaltliche Überlapp mit #27 ist aufgelöst: Dessen neue Wurfstelle für die Null-Kette nutzte noch den alten einargumentigen Aufruf mit deutschem Text – Git hatengine.tssauber automerged und konnte das nicht sehen. Die Stelle ist jetzt aufmustPlayZeroumgestellt und verifiziert.Hinweis
EngineErrornutzt ein normales Feld statt einer Parameter-Property (constructor(readonly code…)), weil Node die Tests im strip-only-Modus ausführt, der keinen Code erzeugen darf.Summary by CodeRabbit
Bug Fixes
Quality Improvements