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

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:
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:
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.
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.
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.
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.offlineEntscheiden 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.
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.
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:
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.
Ü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.
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.
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.
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.
Ein praktisches Setup ist ein kleines „i18n‑Paket“ oder Ordner, das enthält:
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.
Erstellen Sie ein kleines Regelwerk und setzen Sie es in Code‑Reviews durch:
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.
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.
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:
billing.plan_name.pro oder auth.error.invalid_password. Verwenden Sie dieselben Keys überall.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.{count, plural, one {# file} other {# files}} und Hello, {name}. So vermeiden Sie if‑Statements wie if (count === 1) in einzelnen Screens.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.
Ü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.
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.
Ü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:
Ü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 teuersten Probleme sind diejenigen, die sich in der App ausbreiten und schwer zu finden sind:
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.
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:
billing.invoice.paidStatus, nicht billing.greenLabel).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:
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.