Internationalisierungsarchitektur für per Chat erstellte Apps
Internationalisierungsarchitektur für per Chat erstellte Apps: Definieren Sie stabile String‑Keys, Pluralregeln und einen einheitlichen Übersetzungsablauf für Web und Mobile.

Was zuerst kaputtgeht, wenn Sie mehr Sprachen hinzufügen
Das Erste, was kaputtgeht, ist nicht der Code. Es sind die Worte.
Per Chat erstellte Apps beginnen oft als schneller Prototyp: Sie tippen „Füge einen Button hinzu mit dem Text Speichern“, die UI erscheint und Sie gehen weiter. Wochen später möchten Sie Spanisch und Deutsch und entdecken, dass diese „vorübergehenden“ Bezeichnungen über Bildschirme, Komponenten, E‑Mails und Fehlermeldungen verstreut sind.
Texte ändern sich außerdem häufiger als Code. Produktnamen werden umbenannt, rechtlicher Text ändert sich, das Onboarding wird umgeschrieben und der Support fordert klarere Fehlermeldungen. Wenn Text direkt im UI‑Code steht, wird jede kleine Formulierungsänderung zu einem riskanten Release, und Sie übersehen Stellen, an denen dieselbe Idee anders formuliert ist.
Frühe Symptome, die auf Übersetzungs‑Schulden hinweisen:
- Gemischte Sprachen auf einem Bildschirm (einige Strings übersetzt, andere noch auf Englisch).
- Dieselbe Beschriftung mehrfach mit kleinen Unterschieden („Sign up“, „Sign Up“, „Create account“).
- Kaputte Layouts, wenn Text länger wird (Buttons laufen über, Überschriften umbrechen ungünstig).
- Mobile und Web driftet auseinander (unterschiedliche Begriffe für dieselbe Aktion).
- Support‑Inhalte und Systemmeldungen hinken der UI hinterher.
Ein realistisches Beispiel: Sie bauen ein einfaches CRM in Koder.ai. Die Web‑App sagt „Deal stage“, die Mobile‑App „Pipeline step“ und ein Fehler‑Toast „Invalid status“. Selbst wenn alle drei übersetzt sind, wirkt die App inkonsistent, weil die Konzepte nicht übereinstimmen.
„Konsistent“ heißt nicht „überall dieselben Zeichen“. Es bedeutet:
- Dasselbe Konzept verwendet überall denselben Key und dieselbe Bedeutung.
- Web und Mobile teilen dieselbe Quelle der Wahrheit für Übersetzungen.
- Ton und Terminologie sind stabil (formell vs. locker, „customer“ vs. „client“).
- UI‑Layouts sind so gestaltet, dass sie längere und kürzere Phrasen verkraften.
Wenn Sie Text als Produkt‑Daten statt als Dekoration behandeln, wird das Hinzufügen von Sprachen kein Chaos mehr, sondern ein routinemäßiger Bestandteil der Entwicklung.
Grundbegriffe und ein einfaches Ziel
Internationalisierung (i18n) ist die Arbeit, damit eine App viele Sprachen ohne Umbaumaßnahmen unterstützen kann. Lokalisierung (l10n) ist der eigentliche Inhalt für eine bestimmte Sprache und Region — zum Beispiel Französisch (Kanada) mit den passenden Wörtern, Datumsformaten und dem richtigen Ton.
Ein einfaches Ziel: Jeder sichtbare Text für Nutzer wird über einen stabilen Key ausgewählt, nicht direkt im UI‑Code getippt. Wenn Sie einen Satz ändern können, ohne eine React‑Komponente oder ein Flutter‑Widget zu öffnen, sind Sie auf dem richtigen Weg. Das ist der Kern einer Internationalisierungsarchitektur für per Chat erstellte Apps, in denen man leicht aus Versehen hartkodierte Texte erzeugt.
Nutzernahe Texte sind breiter gefasst, als viele Teams denken. Sie umfassen Buttons, Labels, Validierungsfehler, Empty States, Onboarding‑Tipps, Push‑Benachrichtigungen, E‑Mails, PDF‑Exporte und jede Nachricht, die ein Nutzer sehen oder hören kann. In der Regel gehören interne Logs, Datenbankspaltennamen, Analytics‑Event‑IDs, Feature‑Flags oder Admin‑Debugausgaben nicht dazu.
Wo sollen Übersetzungen liegen? In der Praxis oft sowohl im Frontend als auch im Backend, mit einer klaren Grenze.
- Frontend ist verantwortlich für die UI‑Einfassung: Navigation, Formulare, Menüs und die meisten Bildschirminhalte.
- Backend ist verantwortlich für die Nachrichten, die es erzeugt: Transaktionale E‑Mails, serverseitige Validierungsfehler und alles, was als Error‑Response zurückkommt.
- Gemeinsame Bereiche (z. B. Bezeichner von Bestellstatus) sollten aus einer einzigen Quelle stammen, damit Web und Mobile nicht auseinanderdriften.
Der Fehler, den Sie vermeiden sollten, ist das Vermischen der Verantwortlichkeiten. Wenn das Backend fertig geschriebene englische Sätze für UI‑Fehler zurückgibt, kann das Frontend sie nicht sauber lokalisieren. Eine bessere Variante: Das Backend gibt einen Fehlercode (und eventuell sichere Parameter) zurück, und der Client mappt diesen Code auf eine lokalisierte Nachricht.
Texteigentum ist eine Produktentscheidung, kein technisches Detail. Entscheiden Sie früh, wer Wörter ändern und den Ton freigeben darf.
Wenn das Produkt die Texte verwaltet, behandeln Sie Übersetzungen wie Inhalte: versionieren, reviewen und Produkt eine sichere Möglichkeit geben, Änderungen anzufordern. Wenn das Engineering die Texte verwaltet, legen Sie fest, dass jeder neue UI‑String mit einem Key und einer Standardübersetzung geliefert werden muss, bevor er shipped.
Beispiel: Wenn Ihr Signup‑Flow auf drei Bildschirmen „Create account“ sagt, machen Sie daraus einen Key, der überall verwendet wird. So bleibt die Bedeutung konsistent, Übersetzer arbeiten schneller und kleine Formulierungsänderungen führen nicht später zu einer aufwändigen Bereinigung.
Wie man String‑Keys so strukturiert, dass sie stabil bleiben
Keys sind der Vertrag zwischen Ihrer UI und Ihren Übersetzungen. Wenn dieser Vertrag ständig bricht, haben Sie fehlende Texte, hektische Fixes und inkonsistente Formulierungen auf Web und Mobile. Eine gute Internationalisierungsarchitektur für per Chat erstellte Apps beginnt mit einer Regel: Keys sollten die Bedeutung beschreiben, nicht den aktuellen englischen Satz.
Verwenden Sie stabile IDs als Keys (z. B. billing.invoice.payNow) statt des vollständigen Texts (z. B. "Pay now"). Satz‑Keys brechen, sobald jemand die Formulierung, Satzzeichen oder Großschreibung ändert.
Ein praktikables, gut lesbares Muster ist: Bildschirm (oder Domäne) + Komponente + Intent. Halten Sie es langweilig und vorhersehbar.
Beispiele:
auth.login.titleauth.login.emailLabelbilling.checkout.payButtonnav.settingserrors.network.offline
Entscheiden Sie, wann Sie einen Key wiederverwenden oder neu anlegen, indem Sie fragen: „Ist die Bedeutung an jedem Ort identisch?“ Verwenden Sie Keys für wirklich generische Aktionen wieder, aber teilen Sie auf, wenn sich der Kontext ändert. „Speichern“ im Profil kann ein einfacher Action‑Button sein, während „Speichern“ in einem komplexeren Editor in manchen Sprachen einen anderen Ton braucht.
Halten Sie gemeinsame UI‑Texte in dedizierten Namespaces, damit sie nicht über Bildschirme hinweg dupliziert werden. Nützliche Buckets sind z. B.:
common.actions.*(save, cancel, delete)common.status.*(loading, success)common.fields.*(search, password)errors.*(validation, network)nav.*(tabs, menu items)
Wenn sich die Formulierung ändert, die Bedeutung aber gleich bleibt, behalten Sie den Key und aktualisieren nur die übersetzten Werte. Das ist der Sinn stabiler IDs. Wenn sich die Bedeutung ändert (auch nur leicht), legen Sie einen neuen Key an und lassen den alten bestehen, bis Sie sicher sind, dass er nicht mehr verwendet wird. So vermeiden Sie „stille“ Fehlauslegungen, bei denen eine alte Übersetzung technisch vorhanden, aber nun falsch ist.
Ein kleines Beispiel aus einem Koder.ai‑ähnlichen Flow: Ihr Chat erzeugt sowohl eine React‑Web‑App als auch eine Flutter‑Mobile‑App. Wenn beide common.actions.save nutzen, sind die Übersetzungen überall konsistent. Wenn die Web‑App dagegen profile.save und Mobile account.saveButton verwendet, driften sie mit der Zeit auseinander, auch wenn das Englische heute gleich aussieht.
Wo Strings liegen sollten und wie man Übersetzungsdateien organisiert
Behandeln Sie Ihre Quellsprache (häufig Englisch) als einzige Quelle der Wahrheit. Bewahren Sie sie an einem Ort, reviewen Sie Änderungen wie Code und vermeiden Sie, dass Strings zufällig in Komponenten auftauchen „nur fürs Erste“. Das ist der schnellste Weg, hartkodierte UI‑Texte und späteren Mehraufwand zu vermeiden.
Eine einfache Regel: Die App darf Texte nur aus dem i18n‑System anzeigen. Wenn jemand neuen Text braucht, fügt er zuerst einen Key und eine Standardnachricht hinzu und nutzt dann diesen Key in der UI. So bleibt Ihre Internationalisierungsarchitektur stabil, auch wenn Features verschoben werden.
Ein Ordner‑Layout, das überschaubar bleibt
Wenn Sie Web und Mobile ausliefern, wollen Sie einen gemeinsamen Katalog von Keys plus Platz für Feature‑Teams, ohne sich gegenseitig in die Quere zu kommen. Ein praktikables Layout:
- /i18n
- /i18n/locales/en.json (Quelle)
- /i18n/locales/es.json, /i18n/locales/fr.json, ...
- /i18n/features/billing.json, /i18n/features/auth.json, ...
- /i18n/shared.json (Buttons, gemeinsame Labels, Fehler)
Halten Sie Keys auf allen Plattformen identisch, auch wenn die Implementierung unterschiedlich ist (React im Web, Flutter auf Mobile). Wenn Sie eine Plattform wie Koder.ai nutzen, um beide Apps per Chat zu generieren, ist es leichter zu warten, wenn beide Projekte dieselben Key‑Namen und dasselbe Nachrichtenformat verwenden.
Versionierung und Reviews zur Vermeidung von Übersetzungs‑Schulden
Übersetzungen ändern sich mit der Zeit. Behandeln Sie Änderungen wie Produktänderungen: klein, geprüft und nachvollziehbar. Ein gutes Review konzentriert sich auf Bedeutung und Wiederverwendung, nicht nur auf Rechtschreibung.
- PR‑Review für jede Änderung an der Quell‑Locale verlangen
- Löschen von Keys blockieren, ohne Suche und Plan
- Anmerkungen für Übersetzer hinzufügen, wenn Text mehrdeutig ist
- Eine einfache „fehlende Übersetzungen“‑Prüfung in CI einbauen
Um zu verhindern, dass Keys zwischen Teams auseinanderdriften, ordnen Sie Keys Features zu (billing., auth.) und benennen Sie Keys nicht um, nur weil sich die Formulierung ändert. Keys sind Identifikatoren, nicht Text.
Plural‑ und Grammatikregeln ohne Hacks
Pluralregeln variieren stark zwischen Sprachen, daher bricht die einfache englische Logik (1 vs. alle anderen) schnell. Manche Sprachen haben eigene Formen für 0, 1, 2–4 und viele andere verändern sogar den ganzen Satz. Wenn Sie Plural‑Logik im UI mit if‑else‑Konstrukten einbacken, duplizieren Sie Texte und übersehen Randfälle.
Ein sicherer Ansatz ist, eine flexible Nachricht pro Bedeutung zu behalten und die i18n‑Schicht die passende Form wählen zu lassen. ICU‑ähnliche Messages sind dafür gedacht: Sie halten grammatische Entscheidungen in den Übersetzungen, nicht in Ihren Komponenten.
Hier ein kleines Beispiel, das häufig vergessene Fälle abdeckt:
itemsCount = "{count, plural, =0 {No items} one {# item} other {# items}}"
Dieser eine Key deckt 0, 1 und alle anderen Fälle ab. Übersetzer können ihn für ihre Sprache mit den richtigen Pluralformen ersetzen, ohne dass Sie Code anfassen müssen.
Wenn Sie geschlechts‑ oder rollenabhängige Formulierungen brauchen, vermeiden Sie separate Keys wie welcome_male und welcome_female, außer das Produkt verlangt es wirklich. Verwenden Sie select, damit der Satz eine Einheit bleibt:
welcomeUser = "{gender, select, female {Welcome, Ms. {name}} male {Welcome, Mr. {name}} other {Welcome, {name}}}"
Um sich nicht in grammatische Fallen mit Fällen hineinmanövrieren, halten Sie Sätze so vollständig wie möglich. Vermeiden Sie, Fragmente zusammenzukleben wie "{count} " + t('items'), denn viele Sprachen können die Wortreihenfolge nicht so koppeln. Bevorzugen Sie eine Nachricht, die Zahl, Nomen und umgebende Wörter enthält.
Eine einfache Regel, die in per Chat erstellten Apps gut funktioniert (inklusive Koder.ai‑Projekten): Wenn ein Satz eine Zahl, eine Person oder einen Status enthält, machen Sie ihn von Anfang an als ICU. Das kostet etwas Aufwand upfront und spart viel Übersetzungs‑Schulden später.
Web‑ und Mobile‑Übersetzungen konsistent halten
Wenn Ihre React‑Web‑App und Ihre Flutter‑Mobile‑App jeweils eigene Übersetzungsdateien pflegen, driften sie auseinander. Derselbe Button bekommt unterschiedliche Formulierungen, ein Key bedeutet auf Web etwas anderes als auf Mobile und Support‑Tickets beginnen zu berichten „die App sagt X, die Website sagt Y“.
Die einfachste und wichtigste Lösung: Wählen Sie ein gemeinsames Format als Quelle der Wahrheit und behandeln Sie es wie Code. Für die meisten Teams heißt das: ein gemeinsamer Satz Locale‑Dateien (z. B. JSON mit ICU‑Messages), den sowohl Web als auch Mobile nutzen. Beim Entwickeln per Chat und mit Generatoren ist das noch wichtiger, weil leicht versehentlich neuer Text an zwei Stellen entsteht.
Eine gemeinsame Quelle der Wahrheit
Ein praktisches Setup ist ein kleines „i18n‑Paket“ oder Ordner, das enthält:
- Locale‑Dateien für jede Sprache (überall dieselben Keys)
- Regeln fürs Nachrichtenformat (ICU für Plurale und Platzhalter)
- Eine kurze README, wie Keys hinzugefügt werden
React und Flutter sind dann Konsumenten. Sie sollten keine neuen Keys lokal erfinden. In einem Koder.ai‑ähnlichen Workflow (React Web, Flutter Mobile) können Sie beide Clients aus demselben Key‑Set generieren und Änderungen wie jeden anderen Code‑Change reviewen.
Die Ausrichtung mit dem Backend gehört ebenfalls dazu. Fehler, Benachrichtigungen und E‑Mails sollten nicht als handgeschriebene englische Sätze im Servercode liegen. Stattdessen geben Sie stabile Fehlercodes zurück (z. B. auth.invalid_password) plus sichere Parameter. Dann mappen Clients Codes auf übersetzten Text. Für serverseitig versendete E‑Mails kann der Server Templates mit denselben Keys und Locale‑Dateien rendern.
Regeln, die Sie synchron halten
Erstellen Sie ein kleines Regelwerk und setzen Sie es in Code‑Reviews durch:
- Neuer UI‑Text erfordert zuerst einen neuen Key in den gemeinsamen Locale‑Dateien
- Keys müssen ein klares Namespace und Intent enthalten (nicht Bildschirmpositionen)
- Jeder Key muss Platzhalter einmal definieren und überall gleich verwenden
- Wenn zwei Phrasen sich in der Bedeutung unterscheiden, dürfen sie keinen gemeinsamen Key haben
- Wenn zwei Keys dasselbe bedeuten, löschen Sie einen und wählen einen Gewinner
Um doppelte Keys mit unterschiedlicher Bedeutung zu verhindern, fügen Sie ein „description“‑Feld (oder eine Kommentar‑Datei) für Übersetzer und das zukünftige Ich hinzu. Beispiel: billing.trial_days_left sollte erklären, ob es als Banner, E‑Mail oder beides gezeigt wird. Ein Satz wie dieser verhindert oft das „nahe genug“‑Wiederverwenden, das Übersetzungs‑Schulden schafft.
Diese Konsistenz ist das Rückgrat einer Internationalisierungsarchitektur für per Chat erstellte Apps: ein gemeinsamer Wortschatz, viele Oberflächen und keine Überraschungen beim Ausliefern einer neuen Sprache.
Schritt‑für‑Schritt‑Setup für ein echtes Projekt
Eine gute Internationalisierungsarchitektur für per Chat erstellte Apps beginnt einfach: ein Satz Message‑Keys, eine Quelle der Wahrheit für Texte und dieselben Regeln für Web und Mobile. Wenn Sie schnell bauen (z. B. mit Koder.ai), erhält diese Struktur die Geschwindigkeit, ohne Übersetzungs‑Schulden zu produzieren.
Ein praktisches Setup (Web + Mobile)
Wählen Sie Ihre Locales früh und entscheiden Sie, was passiert, wenn eine Übersetzung fehlt. Eine übliche Wahl: Zeige die bevorzugte Sprache des Nutzers, falls vorhanden, sonst Fallback auf Englisch, und logge fehlende Keys, damit Sie sie vor dem nächsten Release beheben.
Dann setzen Sie Folgendes um:
- Locales und Fallback definieren: Legen Sie unterstützte Sprachen, Default‑Locale und eine klare Fallback‑Reihenfolge fest. Vereinbaren Sie außerdem, wie die Locale erkannt wird (Browser/App‑Einstellung, Nutzerprofil).
- Eine Übersetzungsfunktion und Key‑Konvention erstellen: Nutzen Sie stabile, bedeutungsbasierte Keys (nicht ganze Sätze). Beispiel:
billing.plan_name.prooderauth.error.invalid_password. Verwenden Sie dieselben Keys überall. - In React und Flutter integrieren: In React die App mit einem i18n‑Provider umwickeln und
t("key")in Komponenten nutzen. In Flutter einen Lokalisierungs‑Wrapper nutzen und denselben Key‑Lookup in Widgets aufrufen. Ziel sind dieselben Keys, nicht dieselbe Bibliothek. - Variablen und Pluralregeln von Anfang an unterstützen: Verwenden Sie ICU‑ähnliche Messages für Pluralisierung und Platzhalter, wie
{count, plural, one {# file} other {# files}}undHello, {name}. So vermeiden Sie if‑Statements wieif (count === 1)in einzelnen Screens. - Eine leichte Copy‑Review‑Stufe hinzufügen: Vor dem Release neue oder geänderte Strings prüfen: Key‑Benennung, hartkodierte Texte entfernen, Platzhalter prüfen und sicherstellen, dass Web und Mobile die Änderung beide übernommen haben.
Testen Sie schließlich eine Sprache mit längeren Wörtern (Deutsch ist klassisch) und eine mit anderer Zeichensetzung. Das zeigt schnell Buttons, die überlaufen, Überschriften, die ungünstig umbrechen, und Layouts, die Englisch‑Längen voraussetzen.
Wenn Sie Übersetzungen in einem gemeinsamen Ordner (oder generiertem Paket) pflegen und Textänderungen wie Code‑Änderungen behandeln, bleiben Web und Mobile konsistent, selbst wenn Features schnell per Chat gebaut werden.
Dynamische Inhalte: Daten, Zahlen und Nutzertest
Übersetzte UI‑Strings sind nur die halbe Miete. Die meisten Apps zeigen auch sich ändernde Werte wie Daten, Preise, Zähler und Namen. Behandeln Sie diese Werte nicht als einfachen Text, sonst landen Sie bei falschen Formaten, falschen Zeitzonen und Sätzen, die sich in vielen Sprachen „komisch“ anhören.
Formatieren Sie Zahlen, Währungen und Daten mit den Regeln der Locale, nicht mit eigener Logik. Ein Nutzer in Frankreich erwartet „1 234,50 €“, ein Nutzer in den USA „$1,234.50“. Gleiches gilt für Daten: „03/04/2026“ ist mehrdeutig, Locale‑Formatierung macht es klar.
Zeitzonen sind die nächste Falle. Server sollten Zeitstempel neutral speichern (meist UTC), aber Nutzer erwarten Zeiten in ihrer eigenen Zone. Eine Bestellung, die um 23:30 UTC angelegt wurde, kann für jemanden in Tokio „morgen“ sein. Legen Sie pro Bildschirm eine Regel fest: Bei persönlichen Ereignissen die Nutzer‑Lokale Zeit zeigen, bei geschäftlichen Zeiten eine feste Business‑Zeitzone (und diese klar kennzeichnen).
Vermeiden Sie Sätze, die durch Aneinanderreihung übersetzter Fragmente entstehen. Das bricht Grammatik, weil die Wortreihenfolge sich zwischen Sprachen ändert. Anstelle von:
"{count} " + t("items") + " " + t("in_cart")
nutzen Sie eine einzelne Nachricht mit Platzhaltern, z. B.: „{count} items in your cart“. Der Übersetzer kann Wörter sicher umsortieren.
Rechts‑nach‑links (RTL) Sprachen
RTL ist nicht nur Textausrichtung. Der Layoutfluss dreht sich, manche Icons müssen gespiegelt werden (z. B. Zurück‑Pfeile), und gemischte Inhalte (Arabisch plus englischer Produktcode) können in überraschender Reihenfolge erscheinen. Testen Sie reale Screens, nicht nur ein einzelnes Label, und stellen Sie sicher, dass Ihre UI‑Komponenten Richtungswechsel unterstützen.
Nutzergenerierter Inhalt
Übersetzen Sie niemals, was der Nutzer geschrieben hat (Namen, Adressen, Support‑Tickets, Chat‑Nachrichten). Sie können Labels darum herum übersetzen und Metadaten (Daten, Zahlen) formatieren, aber der Inhalt selbst bleibt unverändert. Wenn Sie später automatische Übersetzung anbieten, machen Sie daraus eine explizite Funktion mit Umschalter „Original/Übersetzt".
Ein praktisches Beispiel: Eine Koder.ai‑App könnte „{name} renewed on {date} for {amount}“ anzeigen. Halten Sie das als eine Nachricht, formatieren Sie {date} und {amount} nach Locale und zeigen Sie die Nutzer‑Zeitzone an. Dieses Muster verhindert viele Übersetzungsprobleme.
Kurze Regeln, die Fehler vermeiden:
- Speichern Sie Zeitstempel in UTC, formatieren Sie für die Locale und Zeitzone des Betrachters.
- Nutzen Sie Platzhalter in vollständigen Sätzen, niemals zusammengeklebte Fragmente.
- Formatieren Sie Währung nach Locale und mit korrektem Währungscode.
- Testen Sie mindestens ein RTL‑Locale auf realen Bildschirmen.
- Übersetzen Sie nutzergenerierten Text nicht standardmäßig.
Häufige Fehler, die Übersetzungs‑Schulden erzeugen
Übersetzungs‑Schulden beginnen meist mit „nur ein kurzer String“ und werden später zur wochenlangen Aufräumarbeit. In per Chat erstellten Projekten geht das noch schneller, weil UI‑Texte oft direkt in Komponenten, Formularen und sogar Backend‑Nachrichten generiert werden.
Die Probleme, die später teuer werden
Die teuersten Probleme sind diejenigen, die sich in der App ausbreiten und schwer zu finden sind:
- Hartkodierter Text in UI‑Komponenten, inklusive Platzhalter, Empty States und Button‑Labels. Das lässt sich nicht auditieren oder wiederverwenden und kleine Textänderungen erfordern Code‑Änderungen.
- Backend‑Validierung und API‑Fehler, die englische Sätze zurückgeben. Die UI zeigt gemischte Sprachen und Sie können Fehler nicht zuverlässig auf übersetzte Meldungen abbilden.
- Die komplette englische Satz als Übersetzungs‑Key verwenden. Das fühlt sich praktisch an, bis sich der Text ändert; dann churnen Keys, alte Keys bleiben erhalten und Sie verlieren Übersetzungs‑Erinnerung.
- Keys zwischen Web und Mobile kopieren und dann getrennt bearbeiten. Mit der Zeit driften „gleiche“ Screens auseinander und Nutzer bemerken inkonsistente Formulierungen.
- Pluralregeln bis zur Einführung der ersten Nicht‑Englischen Sprache aufschieben. Dann findet man Dutzende von „1 items“‑Bugs und Grammatik, die nicht mehr mit einfachen If‑Statements zu lösen ist.
Ein schnelles Beispiel aus dem echten Leben
Stellen Sie sich vor, eine React‑Web‑App und eine Flutter‑Mobile‑App zeigen beide einen Billing‑Banner: „You have 1 free credit left“. Jemand ändert den Web‑Text zu „You have one credit remaining“ und verwendet denselben Text als Key. Mobile nutzt weiterhin den alten Key. Jetzt haben Sie zwei Keys für dasselbe Konzept und Übersetzer sehen beide.
Ein besseres Muster sind stabile Keys (z. B. billing.creditsRemaining) und ICU‑Pluralisierung, damit die Grammatik in allen Sprachen korrekt ist. Wenn Sie ein Tool wie Koder.ai nutzen, fügen Sie früh eine Regel hinzu: Jeder nutzernahe Text, der im Chat entsteht, muss in Übersetzungsdateien landen, nicht in Komponenten oder Serverfehlern. Diese kleine Gewohnheit schützt Ihre Internationalisierungsarchitektur, während das Projekt wächst.
Kurze Checkliste, ein realistisches Beispiel und nächste Schritte
Wenn Internationalisierung chaotisch wirkt, liegt das meist daran, dass die Basics nie dokumentiert wurden. Eine kleine Checkliste und ein konkretes Beispiel halten Ihr Team (und Ihr zukünftiges Ich) fern von Übersetzungs‑Schulden.
Hier eine Checkliste, die Sie bei jedem neuen Bildschirm durchgehen können:
- Stabile Keys: ein Key pro Bedeutung, nicht pro Formulierung (Beispiel:
billing.invoice.paidStatus, nichtbilling.greenLabel). - Fallbacks: Definieren Sie eine Standardsprache und was bei fehlenden Keys passiert (Fallbacktext zeigen, loggen oder Release blockieren).
- Pluralregeln: Verwenden Sie ICU‑ähnliche Messages für Zählungen (0, 1, viele) statt String‑Hacks.
- Formatierung: Formatieren Sie Daten, Geld und Zahlen nach Locale (und trennen Sie Währung von Sprache).
- RTL‑Check: Testen Sie früh mindestens eine rechts‑nach‑links Sprache, damit Layoutprobleme auftauchen, bevor Sie 200 Bildschirme haben.
Ein einfaches Beispiel: Sie starten einen Billing‑Screen in Englisch, Spanisch und Japanisch. Die UI enthält: „Invoice“, „Paid“, „Due in 3 days“, „1 payment method“ / „2 payment methods“ und ein Total wie „$1,234.50“. Wenn Sie das mit einer Internationalisierungsarchitektur für per Chat erstellte Apps bauen, definieren Sie Keys einmal (gemeinsam für Web und Mobile) und jede Sprache füllt nur Werte. „Due in {days} days" wird zu einer ICU‑Nachricht, und Geldformatierung kommt aus einem locale‑bewussten Formatter, nicht aus hartkodierten Kommas.
Rollen Sie Sprachunterstützung Feature für Feature aus, nicht als großen Rewrite:
- Starten Sie mit einem stark frequentierten Flow (Billing, Onboarding oder Checkout).
- Verschieben Sie hartkodierte UI‑Texte in Übersetzungsdateien und ersetzen Sie sie durch Keys.
- Fügen Sie Plural‑Messages und Formatierung für denselben Flow hinzu.
- Gehen Sie zum nächsten Feature erst über, wenn fehlende Keys near zero sind.
Dokumentieren Sie zwei Dinge, damit neue Features konsistent bleiben: Ihre Key‑Benennungsregeln (mit Beispielen) und eine „Definition of done“ für Strings (keine hartkodierten Texte, ICU für Plurale, Formatierung für Daten/Zahlen, hinzugefügt zum gemeinsamen Katalog).
Nächste Schritte: Wenn Sie in Koder.ai bauen, nutzen Sie den Planning Mode, um Bildschirme und Keys zu definieren, bevor Sie die UI generieren. Verwenden Sie Snapshots und Rollback, um Texte und Übersetzungen über Web und Mobile hinweg sicher zu iterieren, ohne ein gebrochenes Release zu riskieren.
FAQ
Wie sollte ich Übersetzungsschlüssel benennen?
Verwende stabile, bedeutungsbasierte Schlüssel wie billing.invoice.payNow statt des englischen Satzes selbst. So kannst du den Wortlaut ändern, ohne Code-Referenzen anzupassen oder doppelte Übersetzungen zu erzeugen.
Welche Texte gehören in Übersetzungsdateien?
Lege jeden für Nutzer sichtbaren Text in deinem Übersetzungssystem ab, einschließlich Fehlermeldungen, Leerzuständen, E-Mails, Benachrichtigungen und Onboarding-Hinweisen. Interne Logs, Analytics-IDs und Datenbankfelder brauchen in der Regel keine Übersetzung.
Wie halte ich die Formulierungen auf Web und Mobilgeräten konsistent?
Verwende für beide Clients einen gemeinsamen Katalog aus Schlüsseln und Locale-Nachrichten. React und Flutter können unterschiedliche Bibliotheken nutzen, sollten aber auf dieselben Schlüsselnamen und Nachrichtenregeln verweisen.
Sollte das Backend übersetzte Fehlermeldungen zurückgeben?
Lass das Backend einen stabilen Fehlercode plus unbedenkliche Werte zurückgeben, und zeige die lokalisierte Nachricht im Client an. Gib zum Beispiel auth.invalid_password statt eines englischen Satzes zurück.
Wie gehe ich mit Pluralformen in verschiedenen Sprachen um?
Verwende Pluralnachrichten im ICU-Stil, damit jede Sprache ihre eigenen Grammatikregeln anwenden kann. Lege den vollständigen Satz in einer Nachricht ab, statt eine Zahl mit einem separat übersetzten Substantiv zu kombinieren.
Wo sollten Übersetzungsdateien liegen?
Behalte die Ausgangssprache, oft Englisch, als maßgebliche Quelle bei und prüfe Änderungen zusammen mit dem Code. Gruppiere Nachrichten nach Funktion und reserviere gemeinsame Namespaces für häufige Aktionen, Felder, Navigation und Fehler.
Brauche ich jedes Mal einen neuen Schlüssel, wenn sich ein Text ändert?
Behalte den vorhandenen Schlüssel, wenn die Bedeutung gleich bleibt, auch wenn sich der Wortlaut ändert. Erstelle einen neuen Schlüssel nur, wenn sich Bedeutung oder Kontext ändern, und entferne den alten, nachdem du bestätigt hast, dass ihn nichts mehr verwendet.
Wie lokalisiere ich Daten, Geldbeträge und Zeitzonen?
Speichere Zeitstempel in UTC und formatiere Daten, Uhrzeiten, Zahlen und Währungen für das Gebietsschema und die Zeitzone der betrachtenden Person. Verwende Formatter, die das Gebietsschema berücksichtigen, statt fest codierter Kommas, Währungssymbole oder Datumsformate.
Was sollte ich für Rechts-nach-links-Sprachen testen?
Gestalte vollständige Bildschirme in einer RTL-Locale, nicht nur Beschriftungen. Drehe bei Bedarf die Layoutrichtung um, spiegele richtungsabhängige Symbole wie Zurück-Pfeile und teste gemischten arabischen und lateinischen Text wie Produktcodes.
Wie füge ich einer bestehenden App am einfachsten i18n hinzu?
Beginne mit einem viel genutzten Ablauf wie Onboarding, Abrechnung oder Checkout. Verschiebe dessen fest codierte Texte in gemeinsame Nachrichten, ergänze Unterstützung für Pluralformen und Formatierung, teste längere Übersetzungen und wiederhole das dann für die nächste Funktion.