Back to Guides
Anleitung

10 häufige i18n-Fehler und wie du sie vermeidest

Lerne die häufigsten Internationalisierungsfehler kennen, die Entwickler machen, und wie du sie behebst. Verbessere die Lokalisierungsqualität deiner App mit diesen Best Practices.

5 Min. Lesezeit
Von shipglobal.dev
#i18n#developer#user experience#best practices#internationalization#common mistakes

Internationalisierung (i18n) wirkt unkompliziert — bis du herausfindest, dass deine deutschen Nutzer abgeschnittene Buttons sehen, deine japanischen Nutzer verstümmelte Satzfragmente bekommen und deine arabischsprachigen Nutzer komplett kaputte Layouts vor sich haben. Das sind keine Randfälle. Es sind die vorhersehbaren Folgen häufiger Fehler, die die meisten Entwicklungsteams machen, wenn sie zum ersten Mal Lokalisierung angehen. In diesem Guide gehen wir die 10 häufigsten i18n-Fehler durch, erklären genau, warum sie passieren, und zeigen dir Schritt für Schritt, wie du jeden einzelnen behebst. Egal ob du eine neue App baust oder eine bestehende nachrüstest — diese Fallstricke zu vermeiden spart dir Wochen an Debugging.

Fehler #1: Hardcodierte Strings

Strings hardcoden ist der grundlegendste i18n-Fehler. Er passiert, weil Entwickler sich zuerst darauf konzentrieren, Features zum Laufen zu bringen, und planen, 'später aufzuräumen'. Aber später kommt nie, und plötzlich hast du tausende Strings verteilt über hunderte Dateien.

['Richte dein i18n-Framework ein, bevor du die erste Zeile UI-Code schreibst', 'Verwende ein Linter-Plugin, um hardcodierte Strings in Templates und Komponenten zu erkennen', 'Halte Übersetzungs-Keys beschreibend und organisiert nach Feature oder Seite']

Richte dein i18n-Framework ein, bevor du die erste Zeile UI-Code schreibst

Verwende ein Linter-Plugin, um hardcodierte Strings in Templates und Komponenten zu erkennen

Halte Übersetzungs-Keys beschreibend und organisiert nach Feature oder Seite

Ein typisches Szenario

1

Ein Entwickler schreibt ein Button-Label direkt in JSX: <button>Submit Order</button>.

2

Die App wird auf Englisch ausgeliefert und funktioniert einwandfrei. Sechs Monate später expandiert das Unternehmen nach Deutschland.

3

Das Lokalisierungsteam entdeckt 2.000+ hardcodierte Strings. Die Nachrüstung dauert 3 Wochen und verursacht 47 Bugs.

Warum das ein Problem ist

In einer ausgereiften Codebase können hardcodierte Strings in die Tausende gehen. Sie nachträglich zu extrahieren erfordert, jede Datei anzufassen, jede Komponente neu zu testen und überall Regressionen zu riskieren.

Hardcodierte Strings sind direkt in Quellcode, Templates oder Komponenten eingebettet. Sie können nicht extrahiert, übersetzt oder zur Laufzeit ausgetauscht werden, ohne den Code selbst zu ändern.

Nutzer in nicht-englischen Locales sehen unübersetzte UI-Elemente gemischt mit übersetztem Inhalt — ein chaotischer und unprofessioneller Eindruck.

So behebst du es

Lagere alle nutzersichtbaren Strings von Anfang an in Ressourcen-Dateien aus.

1

Richte ein Übersetzungs-Framework ein (z.B. next-intl, react-i18next, vue-i18n), bevor du deine erste Komponente schreibst.

2

Erstelle eine Ressourcen-Dateistruktur (z.B. messages/de.json) und referenziere alle Strings über Übersetzungs-Keys wie t('checkout.submitButton').

3

Füge eine Linting-Regel oder einen Pre-Commit-Hook hinzu, der rohes String-Literal in UI-Komponenten flaggt.

Fehler #10: Alles wörtlich übersetzen

Nicht alle Inhalte sollten übersetzt werden. Markennamen, Namen juristischer Personen, technische Fachbegriffe und bestimmte Produktnamen müssen in ihrer Originalsprache bleiben. Übereifrige Übersetzung kann rechtliche Probleme, Markeninkonsistenz und Nutzerverwirrung verursachen.

["Pflege ein 'Nicht übersetzen'-Glossar und teile es mit allen Übersetzern", 'Nutze gesperrte Segmente oder separate Namespaces für Marken- und Rechtsbegriffe', 'Stelle immer Kontextnotizen für mehrdeutige Strings bereit, um Fehlübersetzungen zu verhindern']

Pflege ein 'Nicht übersetzen'-Glossar und teile es mit allen Übersetzern

Nutze gesperrte Segmente oder separate Namespaces für Marken- und Rechtsbegriffe

Stelle immer Kontextnotizen für mehrdeutige Strings bereit, um Fehlübersetzungen zu verhindern

Ein typisches Szenario

1

Eine Übersetzungsdatei enthält den Firmennamen 'CloudForge Inc.' und den technischen Begriff 'OAuth 2.0 Token' als reguläre übersetzbare Strings.

2

Der spanische Übersetzer übersetzt 'CloudForge' zu 'ForjaNube' und 'OAuth 2.0 Token' zu 'ficha OAuth 2.0'.

3

Ergebnis: Nutzer finden das Unternehmen nicht unter seinem echten Namen, und Entwickler, die die spanische Dokumentation lesen, sind verwirrt durch unbekannte übersetzte Fachbegriffe.

Warum das ein Problem ist

Ein einzelner falsch übersetzter Markenname in einem Rechtsdokument kann Verträge ungültig machen. Überübersetzungen zu korrigieren erfordert die Prüfung jedes Strings in jeder Sprache — ein Aufwand von mehreren Wochen.

Wenn alle Strings ohne Kontext an die Übersetzung geschickt werden, übersetzen Übersetzer möglicherweise Markennamen ('Apple' → 'Apfel'), Rechtsbegriffe ('GmbH' → 'LLC') oder technische Bezeichner, die auf Englisch bleiben müssen.

Nutzer finden Produkte nicht unter ihrem bekannten Markennamen, Rechtsdokumente referenzieren die falsche Gesellschaft, und technische Dokumentation wird unverständlich, wenn Begriffe wie 'API Endpoint' übersetzt werden.

So behebst du es

Markiere nicht-übersetzbare Inhalte klar und stelle Kontextnotizen für Übersetzer bereit.

1

Erstelle ein 'Nicht übersetzen'-Glossar, das alle Markennamen, Produktnamen, juristische Personen und Fachbegriffe auflistet, die unverändert bleiben müssen.

2

Verwende einen separaten Namespace oder spezielle Keys für nicht-übersetzbare Inhalte. Viele i18n-Tools unterstützen 'gesperrte' Segmente, die Übersetzer nicht bearbeiten können.

3

Füge Übersetzer-Kommentare/Beschreibungen zu deinen Übersetzungsdateien hinzu, die den Kontext erklären: 'Dies ist ein Markenname — nicht übersetzen' oder 'Fachbegriff — auf Englisch belassen'.

Fehler #2: String-Verkettung

Sätze aus Fragmenten zusammenzukleben wirkt auf Englisch logisch, funktioniert aber in anderen Sprachen nicht. Wortstellung, Grammatik und Satzstruktur variieren dramatisch zwischen Sprachen, was verkettete Strings unübersetzbar macht.

['Baue niemals Sätze durch Verkettung übersetzter Fragmente zusammen', 'Verwende benannte Platzhalter ('{name}') statt positioneller ({0}) für Klarheit', 'Stelle Kontextkommentare für Übersetzer bereit, die erklären, was jeder Platzhalter enthält']

Baue niemals Sätze durch Verkettung übersetzter Fragmente zusammen

Verwende benannte Platzhalter ('{name}') statt positioneller ({0}) für Klarheit

Stelle Kontextkommentare für Übersetzer bereit, die erklären, was jeder Platzhalter enthält

Ein typisches Szenario

1

Entwickler schreibt: 'You have ' + count + ' items in your ' + cartType + ' cart' — funktioniert perfekt auf Englisch.

2

Der deutsche Übersetzer erhält drei separate Fragmente und kann keinen grammatisch korrekten Satz bilden, weil die Wortstellung sich ändern muss.

3

Ergebnis: Deutsche Nutzer sehen 'Sie haben 5 Artikel in Ihrem Warenkorb Standard' — holprig und unprofessionell.

Warum das ein Problem ist

Jeder verkettete String ist eine tickende Zeitbombe. Bei 20 Sprachen und 50 verketteten Strings hast du 1.000 potenzielle Grammatikfehler, die manuell behoben werden müssen.

String-Verkettung wie 'Willkommen ' + userName + ', du hast ' + count + ' neue Nachrichten' setzt eine bestimmte Wortstellung voraus. Übersetzer erhalten zusammenhanglose Fragmente, die sie nicht umstellen können.

Nutzer sehen grammatisch falsche Sätze. Im Deutschen steht das Verb oft am Ende. Im Arabischen ist die gesamte Struktur umgekehrt. Das Ergebnis liest sich wie Unsinn.

So behebst du es

Verwende parametrisierte Nachrichten mit benannten Platzhaltern, damit Übersetzer den ganzen Satz umstellen können.

1

Ersetze Verkettung durch einen einzelnen Message-Key mit Platzhaltern: 'cart.summary': 'Du hast {count} Artikel in deinem '{cartType}'-Warenkorb'.

2

Übergib Variablen als Parameter an deine Übersetzungsfunktion: t('cart.summary', { count: 5, cartType: 'Premium' }).

3

Übersetzer können jetzt frei umstellen: 'In deinem '{cartType}'-Warenkorb befinden sich {count} Artikel' — grammatisch korrektes Deutsch.

Fehler #3: Pluralisierung ignorieren

Englisch hat zwei Pluralformen: Singular und Plural. Entwickler nehmen oft an, alle Sprachen funktionieren genauso. Tun sie nicht. Polnisch hat 4 Formen, Arabisch hat 6, und selbst Sprachen wie Französisch behandeln die Null anders als Englisch.

['Verwende immer ICU MessageFormat oder eine äquivalente Library für zählbare Inhalte', 'Schreibe niemals eigene Plural-Logik — vertraue den CLDR-Regeln', 'Teste Plurale mit Werten wie 0, 1, 2, 5, 21 und 100, um alle Kategorien abzudecken']

Verwende immer ICU MessageFormat oder eine äquivalente Library für zählbare Inhalte

Schreibe niemals eigene Plural-Logik — vertraue den CLDR-Regeln

Teste Plurale mit Werten wie 0, 1, 2, 5, 21 und 100, um alle Kategorien abzudecken

Ein typisches Szenario

1

Entwickler schreibt: count + (count === 1 ? ' Datei' : ' Dateien') — behandelt Deutsch korrekt.

2

Der polnische Übersetzer braucht 4 Formen: 1 plik, 2-4 pliki, 5-21 plików, 22-24 pliki. Der einfache Ternär kann das nicht ausdrücken.

3

Ergebnis: Polnische Nutzer sehen '5 pliki' (falsche Form) statt '5 plików' (korrekte Form), und die App wirkt kaputt.

Warum das ein Problem ist

Jedes zählbare Substantiv in deiner App braucht Plural-Behandlung. Bei 50 solchen Strings und 20 Sprachen sind das 1.000 Pluralregeln — unmöglich, manuell zu verwalten.

Einfache if/else-Prüfungen (count === 1 ? 'Datei' : 'Dateien') behandeln nur Deutsch/Englisch. Der CLDR definiert bis zu 6 Plural-Kategorien: zero, one, two, few, many und other. Jede Sprache nutzt eine andere Teilmenge.

Nutzer sehen grammatisch falsche Texte wie '1 Nachrichten' oder komplett falsche Pluralformen. In formellen Kontexten zerstört das die Glaubwürdigkeit.

So behebst du es

Verwende ICU MessageFormat, das alle CLDR-Pluralregeln out of the box unterstützt.

1

Definiere Nachrichten mit ICU-Syntax: 'fileCount': '{count, plural, one {# Datei} other {# Dateien}}'.

2

Übersetzer stellen alle benötigten Pluralformen für ihre Sprache bereit. Polnisch: '{count, plural, one {# plik} few {# pliki} many {# plików} other {# pliku}}'.

3

Deine i18n-Library wählt zur Laufzeit automatisch die korrekte Form basierend auf den CLDR-Regeln der aktiven Locale.

Fehler #4: Feste UI-Element-Breiten

Designer erstellen pixelgenaue Layouts auf Englisch, und Entwickler implementieren sie mit festen Breiten. Aber übersetzter Text kann dramatisch länger oder kürzer sein. Deutscher Text ist etwa 30% länger als Englisch, während chinesischer Text 50% kürzer sein kann.

['Verwende niemals feste Pixel-Breiten bei Elementen mit übersetzbarem Text', 'Plane für 40% Texterweiterung als Baseline — manche Sprachen expandieren noch mehr', 'Nutze CSS Flexbox oder Grid für Layouts, die sich an variierende Inhaltslängen anpassen']

Verwende niemals feste Pixel-Breiten bei Elementen mit übersetzbarem Text

Plane für 40% Texterweiterung als Baseline — manche Sprachen expandieren noch mehr

Nutze CSS Flexbox oder Grid für Layouts, die sich an variierende Inhaltslängen anpassen

Ein typisches Szenario

1

Designer erstellt eine Navigationsleiste mit 5 Buttons, jeweils exakt 100px breit — sieht auf Englisch super aus.

2

Deutsche Übersetzung: 'Settings' wird zu 'Einstellungen' (13 vs 8 Zeichen), 'Submit' wird zu 'Absenden' (8 vs 6). Die Navbar läuft über.

3

Ergebnis: Auf Mobilgeräten stapeln sich Buttons übereinander oder Text wird abgeschnitten, was die Navigation für deutsche Nutzer unbrauchbar macht.

Warum das ein Problem ist

Jedes Element mit fester Breite ist ein potenzieller Bruchpunkt. Eine typische App hat hunderte Buttons, Labels und Cards, die alle Texterweiterung verkraften müssen.

Container mit fester Breite (width: 120px) und Buttons fester Größe schneiden ab oder laufen über, wenn Text sich ausdehnt. CSS overflow: hidden versteckt Inhalt stillschweigend, während overflow: visible das Layout zerstört.

Nutzer sehen abgeschnittene Labels wie 'Einstellu...' statt 'Einstellungen', oder Buttons die benachbarte Elemente überlappen. Kritische Aktionen werden unlesbar oder unklickbar.

So behebst du es

Gestalte und implementiere flexible Layouts, die sich an die Inhaltslänge aller Locales anpassen.

1

Ersetze feste Breiten durch min-width, max-width und Flex-Layouts. Nutze CSS Grid oder Flexbox, um Platz dynamisch zu verteilen.

2

Setze Textcontainer auf Umbruch: verwende overflow-wrap: break-word und vermeide white-space: nowrap bei übersetzbarem Content.

3

Teste dein UI mit Pseudo-Lokalisierung, die alle Strings um 40% verlängert, um den Worst Case zu simulieren — noch bevor du Strings an Übersetzer schickst.

Fehler #5: Datums- und Zahlenformatierung

Daten und Zahlen wirken täuschend universell. Aber 01/02/2025 bedeutet den 2. Januar in den USA und den 1. Februar in Europa. Kommas und Punkte tauschen bei Zahlen ihre Bedeutung: 1,000.50 (USA) vs 1.000,50 (Deutschland). Das falsch zu machen führt zu Verwirrung, Datenfehlern und Vertrauensverlust.

['Formatiere Daten oder Zahlen niemals manuell mit String-Templates — nutze immer Intl-APIs', 'Speichere alle Daten in ISO 8601 und Währungen in der kleinsten Einheit (Cent) intern', 'Teste mit Locales, die unterschiedliche Dezimaltrennzeichen, Datumsreihenfolgen und Kalendersysteme verwenden']

Formatiere Daten oder Zahlen niemals manuell mit String-Templates — nutze immer Intl-APIs

Speichere alle Daten in ISO 8601 und Währungen in der kleinsten Einheit (Cent) intern

Teste mit Locales, die unterschiedliche Dezimaltrennzeichen, Datumsreihenfolgen und Kalendersysteme verwenden

Ein typisches Szenario

1

Entwickler formatiert ein Datum als MM/DD/YYYY und einen Preis als $1,234.50 — korrekt für US-Nutzer.

2

Ein deutscher Nutzer sieht das Datum 03/04/2025 und liest es als 3. April (DD/MM/YYYY-Konvention). Der Preis $1,234.50 sieht aus, als sollte es 1.234,50 sein.

3

Ergebnis: Der Nutzer bucht einen Flug für das falsche Datum und hinterfragt das Preisformat. Support-Tickets steigen im deutschen Markt um 15%.

Warum das ein Problem ist

Datums- und Zahlenformatierung betrifft jede Datenanzeige in deiner App: Tabellen, Diagramme, Formulare, Rechnungen, Berichte. Ein globaler Fix deckt hunderte Instanzen ab.

Hardcodierte Formatstrings wie toLocaleDateString('en-US') oder manuelle Formatierung mit Template-Literals ignorieren die tatsächliche Locale des Nutzers. Selbst die richtige Locale aber das falsche Kalendersystem (Gregorianisch vs. Hijri) verursacht Probleme.

Nutzer lesen Daten falsch und geben Daten im falschen Format ein. Ein europäischer Nutzer, der 03/04/2025 sieht, interpretiert es möglicherweise als 3. April statt 4. März — verpasste Termine oder falsche Buchungen.

So behebst du es

Verwende die eingebaute Intl-API oder eine locale-aware Formatierungsbibliothek für alle Daten, Zeiten, Zahlen und Währungen.

1

Ersetze manuelle Formatierung durch Intl.DateTimeFormat(locale) für Daten und Intl.NumberFormat(locale, { style: 'currency', currency }) für Preise.

2

Speichere Daten intern im ISO 8601 Format (YYYY-MM-DD) und formatiere sie nur für die Anzeige mit der Locale des Nutzers.

3

Teste kritische Datums-/Zahlenanzeigen mit mindestens 5 verschiedenen Locales: en-US, de-DE, ja-JP, ar-SA und zh-CN, um die wichtigsten Formatierungsvarianten abzudecken.

Fehler #6: RTL-Sprachen vergessen

Rechts-nach-links (RTL) Sprachen wie Arabisch, Hebräisch und Persisch werden von über 500 Millionen Menschen genutzt. Trotzdem werden die meisten Apps ausschließlich für Links-nach-rechts (LTR) Layouts gestaltet. RTL-Support bedeutet nicht nur Text umdrehen — das gesamte UI muss gespiegelt werden.

['Verwende von Tag eins an ausschließlich logische CSS-Properties (inline-start/end, block-start/end)', "Teste deine App mit dir='rtl' auf dem HTML-Element bei jedem Sprint-Review", 'Erstelle eine RTL-Test-Checkliste für Navigation, Icons, Formulare und Fortschrittsanzeigen']

Verwende von Tag eins an ausschließlich logische CSS-Properties (inline-start/end, block-start/end)

Teste deine App mit dir='rtl' auf dem HTML-Element bei jedem Sprint-Review

Erstelle eine RTL-Test-Checkliste für Navigation, Icons, Formulare und Fortschrittsanzeigen

Ein typisches Szenario

1

Entwickler verwendet margin-left: 16px und text-align: left durch die gesamte App — Standard-LTR-Praxis.

2

Die App startet in Saudi-Arabien. Zurück-Pfeile zeigen vorwärts, Sidebars erscheinen auf der falschen Seite, und numerische Daten sind falsch ausgerichtet.

3

Ergebnis: Arabische Nutzer verlassen die App nach 30 Sekunden. Das Team braucht 4 Wochen Notfall-CSS-Refactoring, um das Problem zu beheben.

Warum das ein Problem ist

RTL-Support betrifft jede einzelne Komponente in deiner App. RTL nachträglich einzuführen erfordert typischerweise das Neuschreiben von 30-50% aller CSS-Regeln und die Prüfung jedes Icons und Layouts.

CSS-Properties wie margin-left, padding-right, text-align: left und float: left hardcoden die Richtung. Icons mit Richtungsbedeutung (Pfeile, Fortschrittsanzeigen) zeigen in die falsche Richtung. Selbst border-radius-Werte müssen gespiegelt werden.

Arabische Nutzer sehen Navigation in der falschen Ecke, Fortschrittsbalken die rückwärts laufen, und Text der mit UI-Elementen kollidiert. Die App fühlt sich fremd und unbenutzbar an.

So behebst du es

Verwende logische CSS-Properties und teste mit RTL-Layout von Anfang an.

1

Ersetze alle physischen CSS-Properties durch logische Äquivalente: margin-left → margin-inline-start, padding-right → padding-inline-end, text-align: left → text-align: start.

2

Setze das dir-Attribut auf deinem HTML-Root-Element basierend auf der aktiven Locale. Nutze die :dir(rtl) CSS-Pseudoklasse für RTL-spezifische Overrides.

3

Prüfe alle Icons auf Richtungsbedeutung. Ersetze richtungsgebundene Icons durch gespiegelte Versionen oder nutze CSS transform: scaleX(-1) für RTL-Kontexte.

Fehler #7: Bilder mit Text

Text in Bilder einzubetten — ob in Hero-Bannern, Buttons, Infografiken oder Screenshots — ist ein Lokalisierungs-Alptraum. Jedes Bild mit Text muss für jede Sprache neu erstellt werden, was Designkosten vervielfacht und Releases verzögert.

['Bette übersetzbaren Text niemals direkt in Rasterbilder (PNG, JPG) ein', 'Nutze CSS-Text-Overlays auf Hintergrundbildern für Hero-Banner und CTAs', 'Automatisiere die Screenshot-Generierung für App Store Listings und Marketing-Seiten']

Bette übersetzbaren Text niemals direkt in Rasterbilder (PNG, JPG) ein

Nutze CSS-Text-Overlays auf Hintergrundbildern für Hero-Banner und CTAs

Automatisiere die Screenshot-Generierung für App Store Listings und Marketing-Seiten

Ein typisches Szenario

1

Ein Designer erstellt ein Promo-Banner mit dem Text 'Start Your Free Trial' direkt im Bild eingebettet.

2

Das Lokalisierungsteam übersetzt alle UI-Strings, aber das Banner zeigt auf der deutschen Seite immer noch englischen Text.

3

Ergebnis: Die deutsche Landingpage hat ein irritierendes englisches Banner. Lokalisierte Banner für 15 Sprachen zu erstellen dauert 3 Tage Designarbeit und verzögert den Launch.

Warum das ein Problem ist

Eine typische Marketing-Seite hat 5-10 Bilder mit Text. Bei 15 Sprachen sind das 75-150 Bildvarianten, die erstellt, gepflegt und bei jeder Designänderung aktualisiert werden müssen.

Text, der in Bilder eingebacken ist (PNG, JPG, SVG mit eingebettetem Text), kann nicht von Übersetzungstools extrahiert werden. Jede lokalisierte Version erfordert, dass ein Designer die Quelldatei manuell bearbeitet, exportiert und hochlädt.

Nutzer sehen Bilder mit Text in einer Fremdsprache, oder schlimmer, eine Mischung aus übersetztem UI und unübersetzten Bildern. Das wirkt inkonsistent und untergräbt das Markenvertrauen.

So behebst du es

Trenne Text von Bildern mithilfe von CSS-Overlays, SVGs mit übersetzbaren Textelementen oder dynamischer Bildgenerierung.

1

Nutze CSS, um übersetzbaren Text über Hintergrundbilder zu legen: positioniere die Textebene mit absolute Positioning über dem Bild-Container.

2

Für Infografiken oder Diagramme nutze SVGs mit <text>-Elementen, die Übersetzungs-Keys referenzieren, statt rohe Strings einzubetten.

3

Für App-Screenshots in Marketingmaterialien automatisiere die Screenshot-Generierung mit Tools wie Fastlane (Mobile) oder Playwright (Web), die Screens in jeder Locale aufnehmen.

Fehler #8: Fehlende Übersetzungen nicht behandelt

Übersetzungen sind während der Entwicklung immer unvollständig. Neue Features fügen schneller Strings hinzu, als Übersetzer sie übersetzen können. Ohne richtiges Fallback-Handling verursachen fehlende Übersetzungen Abstürze, leere UI-Elemente oder rohe Übersetzungs-Keys, die Nutzern angezeigt werden.

['Konfiguriere immer mindestens eine Fallback-Sprache in deinem i18n-Setup', 'Logge fehlende Übersetzungs-Keys an dein Monitoring-System zur Nachverfolgung', 'Setze einen Mindest-Übersetzungsabdeckungsgrad, bevor eine Locale live gehen darf']

Konfiguriere immer mindestens eine Fallback-Sprache in deinem i18n-Setup

Logge fehlende Übersetzungs-Keys an dein Monitoring-System zur Nachverfolgung

Setze einen Mindest-Übersetzungsabdeckungsgrad, bevor eine Locale live gehen darf

Ein typisches Szenario

1

Entwickler fügt einen neuen 'Premium Features'-Bereich mit 15 neuen Übersetzungs-Keys hinzu. Die englische Version wird sofort ausgeliefert.

2

Die französischen Übersetzungen sind noch nicht fertig. Die französische Seite zeigt rohe Keys: 'premium.feature1.title', 'premium.feature1.description'.

3

Ergebnis: Französische Nutzer sehen eine kaputte Seite voller entwicklerseitiger Key-Namen. Das Support-Team erhält dutzende Bug-Reports.

Warum das ein Problem ist

Je größer deine App wird, desto größer wird die Lücke zwischen englischen Strings und Übersetzungen in anderen Sprachen. Eine App mit 100 Sprachen und 2.000 Strings könnte zu jedem Zeitpunkt 10.000+ fehlende Übersetzungen haben.

Ohne Fallback-Logik gibt ein fehlender Übersetzungs-Key undefined, null oder den rohen Key-String zurück (z.B. 'checkout.confirmButton'). Template-Engines können Fehler werfen, die Seite crashen oder gar nichts rendern.

Nutzer sehen kaputtes UI: leere Buttons, fehlende Labels oder kryptische Strings wie 'nav.settings.title' statt echtem Text. Das ist verwirrend und unprofessionell.

So behebst du es

Konfiguriere eine robuste Fallback-Kette und überwache die Übersetzungsabdeckung über alle Locales hinweg.

1

Richte eine Fallback-Sprachkette in deiner i18n-Konfiguration ein: fehlende französische (fr) Keys fallen automatisch auf Englisch (en) zurück.

2

Füge einen Missing-Key-Handler hinzu, der unübersetzte Keys an dein Monitoring-System (z.B. Sentry, Datadog) loggt, ohne das Nutzererlebnis zu brechen.

3

Erstelle ein Übersetzungs-Coverage-Dashboard, das den Fertigstellungsgrad pro Locale trackt und Releases blockiert, wenn die Abdeckung unter einen Schwellenwert fällt (z.B. 95%).

Fehler #9: Zeichenkodierungsprobleme

Zeichenkodierungsprobleme sind der stille Killer der Lokalisierung. Alles sieht auf Englisch und europäischen Sprachen gut aus, aber sobald du Chinesisch, Japanisch, Koreanisch, Arabisch oder Emoji hinzufügst, tauchen verstümmelte Zeichen (Mojibake) auf. Diese Bugs sind berüchtigt schwer aufzuspüren.

['Verwende UTF-8-Kodierung überall — Quelldateien, Datenbank, API-Antworten und HTML-Meta-Tags', 'Nutze utf8mb4 in MySQL (nicht utf8), um den vollen Unicode-Bereich einschließlich Emoji zu unterstützen', 'Teste mit echtem Content in CJK, Arabisch und Emoji, um Kodierungsprobleme früh zu fangen']

Verwende UTF-8-Kodierung überall — Quelldateien, Datenbank, API-Antworten und HTML-Meta-Tags

Nutze utf8mb4 in MySQL (nicht utf8), um den vollen Unicode-Bereich einschließlich Emoji zu unterstützen

Teste mit echtem Content in CJK, Arabisch und Emoji, um Kodierungsprobleme früh zu fangen

Ein typisches Szenario

1

Entwickler richtet eine MySQL-Datenbank mit latin1-Collation ein (der alte Standard). Der App-Quellcode nutzt UTF-8.

2

Japanische Nutzer registrieren sich mit ihrem echten Namen. Die Datenbank speichert '田中太郎' als beschädigte Bytes.

3

Ergebnis: Das Nutzerprofil zeigt verstümmelten Text. Schlimmer noch: Suche und Sortierung brechen für alle CJK-Namen, was tausende Nutzer betrifft.

Warum das ein Problem ist

Kodierungsprobleme breiten sich durch deinen gesamten Stack aus. Eine falsch konfigurierte Datenbank-Collation kann Millionen von Datensätzen beschädigen — die Reparatur erfordert teure Datenmigrationen.

Inkonsistente Kodierung über den Stack hinweg — UTF-8 in den Quelldateien, Latin-1 in der Datenbank und Windows-1252 in der API-Antwort — zerstört Multibyte-Zeichen. Eine einzige falsch konfigurierte Schicht verwandelt '日本語' in '????' oder '日本èª'.

Nutzer sehen verstümmelte Texte, Fragezeichen oder leere Kästchen, wo ihre Sprache stehen sollte. Im schlimmsten Fall werden Formular-Eingaben permanent in der Datenbank beschädigt.

So behebst du es

Erzwinge UTF-8-Kodierung konsistent über jede Schicht deines Application Stacks.

1

Setze alle Quelldateien auf UTF-8 (konfiguriere deinen Editor und .editorconfig). Füge <meta charset='UTF-8'> in dein HTML und 'Content-Type: application/json; charset=utf-8' in API-Antworten ein.

2

Konfiguriere deine Datenbank auf utf8mb4 (nicht nur utf8, was in MySQL ein 3-Byte-Subset ist). Setze die Connection-Collation auf utf8mb4_unicode_ci.

3

Wähle Schriftarten, die deine Zielschriftsysteme abdecken: Lateinisch, Kyrillisch, CJK, Arabisch, Devanagari. Nutze System-Font-Stacks oder Google Fonts mit Sprach-Subsets für optimales Laden.

Deine i18n-Implementierung testen

Längenerweiterungstest

Erweitere alle übersetzten Strings um 30-40%, um die Texterweiterung zu simulieren, die in wortreichen Sprachen wie Deutsch, Finnisch oder Griechisch auftritt. Das deckt Container mit fester Breite, abgeschnittene Labels und überlaufende Buttons auf, bevor du überhaupt mit dem Übersetzen anfängst. Viele Pseudo-Lokalisierungstools bieten das als eingebautes Feature.

"Senden" → "Ṡééééñðéñ_éxpáñðéð" (40% länger)

Pseudo-Lokalisierung

Pseudo-Lokalisierung ersetzt jedes Zeichen durch ein akzentuiertes Äquivalent (z.B. 'a' → 'á') und umschließt Strings mit Markierungen wie [!! und !!]. Dadurch wird sofort sichtbar, welche Strings hardcodiert sind und welche aus dem Übersetzungssystem kommen. Führe Pseudo-Lokalisierung als Teil deiner CI-Pipeline aus, um Regressionen automatisch zu fangen.

Jeder Text auf dem Bildschirm, der NICHT in [!! !!]-Markierungen eingeschlossen ist, ist hardcodiert und muss ausgelagert werden. Dieser Test fängt 95% der übersehenen Strings in unter einer Minute.

"Nachricht senden" → "[!! Ñáçḥŕíçḥṫ ṡéñðéñ !!]"

RTL-Layout-Test

Auch ohne arabische oder hebräische Übersetzungen kannst du RTL-Layout testen, indem du dir='rtl' zu deinem HTML-Root-Element hinzufügst. Das deckt sofort direktionale CSS-Bugs auf: falsch ausgerichtete Icons, Margins auf der falschen Seite, kaputte Navigation und falsch sortierte Flex-Items. Mach das zu einem Standard-Check in jedem Sprint-Review — es dauert 10 Sekunden zum Umschalten und fängt Probleme, die sonst Wochen an Fixes in Production bedeuten würden.

Die i18n-Checkliste

['Alle nutzersichtbaren Strings in Ressourcen-Dateien ausgelagert', 'Keine String-Verkettung zum Erstellen von Sätzen verwendet', 'Pluralregeln mit ICU MessageFormat oder Äquivalent implementiert', 'Datums-, Zeit- und Zahlenformatierung nutzt locale-aware APIs', 'RTL-Layout mit arabischen oder hebräischen Inhalten getestet', 'Flexibles UI ohne feste Breiten bei texthaltigen Elementen', 'Fallback-Sprache konfiguriert und bei fehlenden Keys getestet', 'UTF-8-Kodierung konsistent über alle Dateien und Datenbanken', 'App Store und Play Store Metadaten für jeden Markt lokalisiert', 'Screenshots und Marketing-Assets für jede Sprache aktualisiert']

Artikel teilen

Bereit, deine App zu übersetzen?

Übersetze deine iOS-, Android- oder Web-App in über 29 Sprachen mit KI-gestützter Übersetzung.

Kostenlos starten