feat: Dynamisches Sprachpaket-System für die Bedienoberfläche
Teil 1 des "mehrsprachig variabel"-Umbaus (Speiseplan-Inhalte folgen
in einer späteren Version). Sprachen sind jetzt zur Laufzeit über eine
neue Admin-Seite "Sprachen" verwaltbar statt fest im Code zu stehen:
- Neue Tabellen languages/ui_translations (Migration 0004), bestehende
Englisch-/Polnisch-Texte per generiertem Seed automatisch übernommen
(Migration 0005) - keine manuelle Nacharbeit, nichts geht verloren.
- lib/i18n/flatten.ts: verschachtelte Dict-Objekte (inkl. Arrays wie
weekdays.long) <-> flache Schlüssel-Wert-Paare, Basis für Vorlage-
Export/-Import.
- lib/i18n/template.ts: Vollständigkeits-/Veraltet-Berechnung (Hash
über die DE-Schlüsselliste) und Import-Validierung (Platzhalter wie
{message} müssen erhalten bleiben, unbekannte Schlüssel werden
ignoriert statt Fehler zu werfen).
- getDictionary()/getLocale() (lib/i18n/index.ts) jetzt asynchron und
DB-gestützt für Nicht-Basis-Sprachen, mit Fallback auf Deutsch für
fehlende Schlüssel. Locale-Typ bewusst von festem TypeScript-Tupel
auf string generalisiert (Kompromiss: Compiler prüft Vollständigkeit
nicht mehr automatisch, das übernimmt jetzt die Veraltet-Erkennung
zur Laufzeit).
- LanguageSwitcher/LocaleProvider lesen aktive Sprachen jetzt aus dem
Context statt aus einer festen Konstante; blendet sich bei nur einer
aktiven Sprache automatisch aus.
- Neue Admin-Routen app/api/admin/languages/* (Liste inkl.
Vollständigkeit, Anlegen, Aktivieren/Deaktivieren mit
"mindestens eine muss aktiv bleiben"-Schutz, Löschen außer
Basis-Sprache, Vorlage-Download, Datei-Import) + LanguageManager.tsx.
Vollständig gegen echten DB-Zustand getestet: Vorlage-Export/-Import
inkl. Platzhalter-Validierung, neue Sprache anlegen, auf eine Sprache
reduzieren (Umschalter verschwindet, "letzte Sprache"-Schutz greift),
Veraltet-Erkennung nach simuliertem neuen Schlüssel, Cascade-Delete.
Version 1.10.0.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,33 @@ Alle nennenswerten Änderungen an diesem Projekt werden hier dokumentiert.
|
||||
Format angelehnt an [Keep a Changelog](https://keepachangelog.com/de/1.1.0/),
|
||||
Versionierung nach [Semantic Versioning](https://semver.org/lang/de/).
|
||||
|
||||
## [1.10.0] – 2026-07-20
|
||||
|
||||
### Hinzugefügt
|
||||
- Dynamisches Sprachpaket-System für die Bedienoberfläche (Teil 1 des
|
||||
"mehrsprachig variabel"-Umbaus, Speiseplan-Inhalte folgen in einer
|
||||
späteren Version). Sprachen sind jetzt zur Laufzeit über eine neue
|
||||
Admin-Seite „Sprachen" verwaltbar statt fest im Code zu stehen:
|
||||
- Vorlage der aktuellen deutschen Texte herunterladen, übersetzt
|
||||
wieder hochladen – neue Übersetzungen werden sofort aktiv, ohne
|
||||
Deployment.
|
||||
- Fehlende Begriffe fallen automatisch auf Deutsch zurück statt leer
|
||||
zu bleiben; die Admin-Seite zeigt pro Sprache Vollständigkeit in %
|
||||
sowie „N neue Begriffe seit letztem Import", falls eine neue
|
||||
App-Version zusätzliche Texte eingeführt hat.
|
||||
- Sprachen lassen sich einzeln deaktivieren, bis auf eine einzige
|
||||
reduzierbar (der Sprachumschalter blendet sich dann automatisch
|
||||
aus) – mindestens eine muss aktiv bleiben.
|
||||
- Neue Sprachen lassen sich direkt anlegen (Code + Anzeigename),
|
||||
Deutsch bleibt als einzige garantiert vollständige Basis-Sprache
|
||||
unlöschbar.
|
||||
- Import validiert hochgeladene Übersetzungen gegen die aktuelle
|
||||
Vorlage: Platzhalter wie `{message}` müssen erhalten bleiben,
|
||||
unbekannte Schlüssel werden ignoriert statt Fehler zu werfen.
|
||||
- Neue Tabellen `languages`/`ui_translations` (Migration `0004`),
|
||||
bestehende Englisch-/Polnisch-Texte automatisch übernommen
|
||||
(Migration `0005`) – keine manuelle Nacharbeit nötig.
|
||||
|
||||
## [1.9.5] – 2026-07-20
|
||||
|
||||
### Hinzugefügt
|
||||
|
||||
Reference in New Issue
Block a user