Stellen Sie Ihre Frage und erhalten Sie einen Resümee des Dokuments, indem Sie diese Seite und den AI-Anbieter Ihrer Wahl referenzieren
Der Inhalt dieser Seite wurde mit einer KI übersetzt.
Den englischen Originaltext ansehenWenn Sie eine Idee haben, um diese Dokumentation zu verbessern, zögern Sie bitte nicht, durch das Einreichen eines Pull-Requests auf GitHub beizutragen.
GitHub-Link zur DokumentationMarkdown des Dokuments in die Zwischenablage kopieren
Wie man die richtige React i18n-Bibliothek auswählt
React liefert keine native i18n-Primitive mit. Die Bibliothek, für die Sie sich an Tag eins entscheiden, bestimmt, wie Übersetzungen gespeichert werden, wie sie in das Bundle gelangen und wie viel Arbeit in den nächsten Jahren bei Ihnen verbleibt. Die meisten Teams wählen nach Popularität und entdecken die Kompromisse erst bei 2.000 Schlüsseln.
Dieser Leitfaden wählt den umgekehrten Weg: Beantworten Sie zuerst einige Fragen zu Ihrem Projekt und ordnen Sie die Antworten dann den passenden Bibliotheken zu. Er konzentriert sich auf reines React (Vite, React Router, TanStack Start). Next.js hat eigene Einschränkungen, die im Next.js-Vergleich behandelt werden.

Inhaltsverzeichnis
Sechs Fragen vor dem Vergleich von Bibliotheken
Eine Feature-Tabelle ist nutzlos, wenn man nicht weiß, welche Zeilen für einen relevant sind. Gehen Sie diese Punkte zuerst durch.
- Wie wird die App gerendert? Reine SPA, SSR mit Hydration oder React Server Components. Kontextbasierte Hooks funktionieren überall in einer SPA. Bei RSC erzwingt ein Hook
"use client"für jede Komponente, die Text rendert, sodass Sie auch eine serverseitige API benötigen. - Wer schreibt die Übersetzungen? Entwickler, ein internes Team mit einem TMS, eine Agentur, die ICU-Dateien liefert, oder eine KI-Pipeline. Dies bestimmt das Katalogformat weit mehr als jedes API-Detail.
- Wie viele Sprachen und Seiten? Zwei Sprachen und fünf Seiten können es sich leisten, alles auf einmal auszuliefern. Zehn Sprachen und fünfzig Routen können das nicht, und die Ladestrategie wird zum Hauptkostenfaktor.
- Benötigen Sie Typisierung für Schlüssel? Ein Tippfehler in
t("checkout.totl")kompiliert in jeder schlüsselbasierten Bibliothek, es sei denn, Sie richten die Typen selbst ein. Entscheiden Sie, ob das akzeptabel ist. - Was enthält der String? Reinen Text, Pluralformen oder Sätze mit einem
<Link>in der Mitte. Bei Rich Content werden die meisten APIs unhandlich. - Wie lange wird das Projekt leben? Ein Drei-Monats-Prototyp und ein Fünf-Jahres-Produkt benötigen nicht denselben Umfang an Build-Tooling.
Schreiben Sie die Antworten auf. Alles Folgende bezieht sich darauf.
Die Landschaft auf einen Blick
Fünfzehn Jahre JavaScript-i18n lassen sich in vier architektonische Wellen unterteilen, und die React-Bibliotheken, die Sie vergleichen werden, stammen aus unterschiedlichen Epochen.

JSON-Kataloge werden in den Speicher geladen, t("a.b") wird zur Laufzeit nachgeschlagen, ICU oder eine eigene Syntax wird im Browser geparst. Größte Ökosysteme, schwerste Laufzeiten, Typen sind rein optional.
Nachrichten werden beim Build extrahiert, zu kompakten Katalogen kompiliert, mit typisierten Argumenten. Ein zusätzlicher Build-Schritt (extract, compile) im Tausch gegen kleinere Bundles.
Entwickelt rund um SSR und Server Components. Rendern auf dem Server, Hydration nur für das, was der Client benötigt. Weiterhin schlüsselbasiert und zentralisiert.
Inhalte werden in Tree-shakable-Funktionen oder Pro-Komponenten-Wörterbücher kompiliert. Typen werden automatisch generiert, fehlende Übersetzungen führen zu Build-Fehlern, und KI-Übersetzungen laufen direkt über die CLI.
Die Geschichte von JavaScript i18n beschreibt detailliert, wie jede Welle auf die Probleme der vorherigen reagierte.
Die wichtigste Entscheidung: Wo Inhalte liegen und wann sie laden
Jede React i18n-Bibliothek besitzt die gleiche Grundstruktur: ein Store, ein Provider, ein Hook. Was immer der Provider empfängt, landet im Client-Bundle oder im Hydration-Payload. Die beiden strukturellen Entscheidungen lauten daher:
- Zentralisierter oder abgegrenzter (scoped) Inhalt. Eine
en.jsonfür die gesamte App oder eine Deklaration pro Komponente (bzw. pro Namespace). - Statischer oder dynamischer Import. Alles beim Start gebündelt oder die aktive Sprache und Route bei Bedarf nachgeladen.
Die folgende Grafik schätzt den Payload für eine theoretische App mit 1 bis 10 Seiten, übersetzt in 1 bis 10 Sprachen, mit etwa 30 KB Text pro Seite.

Zentralisierter Inhalt mit statischen Importen wächst entlang beider Achsen: 10 Seiten mal 10 Sprachen ergeben 300 KB Text auf jeder einzelnen Seite. Dynamische Importe eliminieren die Sprachachse. Scoping eliminiert die Seitenachse. Nur die Kombination aus beidem bleibt konstant flach.
Dies ist keine reine Eigenschaft der Bibliothek, sondern eine Frage der Disziplin. react-i18next kann mit Namespaces und Lazy-Backends aufgeteilt werden. use-intl lässt sich pro Route splitten. Aber nichts erzwingt es, und ein geteilter <Button>, der auf t("common:cta") zugreift, macht common unbemerkt zu einer Abhängigkeit jeder Route. Der Benchmark misst dies als "Leakage von anderen Routen" und "Leakage von anderen Sprachen", und genau hier entsteht der größte Unterschied zwischen den Bibliotheken.
Wenn Ihre Antwort auf Frage 3 "viele Sprachen, viele Seiten" war, gewichten Sie diesen Abschnitt höher als jede API-Präferenz. Der Beitrag Per-Komponente vs. Zentralisiertes i18n geht tiefer auf die Wartungsseite derselben Entscheidung ein.
Die Kandidaten
Die Bibliotheksgrößen stammen aus dem TanStack Start-Benchmark: Provider plus Hook in einer leeren Komponente nach Bundling, Tree-Shaking und Minifizierung bei 10 Seiten und 10 Sprachen. Der Inhalt wird separat gemessen.
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Bibliothek | Welle | Inhaltsmodell | Typen auf Schlüsseln | Nachrichtenformat | Bibliotheksgröße |
|---|---|---|---|---|---|
react-i18next | Runtime | Zentrales JSON, Namespaces | Opt-in (CustomTypeOptions) | i18next (Suffix-Plurale) | ~18,4 kB |
react-intl (FormatJS) | Runtime | Zentrales JSON, ICU | Opt-in (Extraktion + Union) | ICU | ~15,3 kB |
use-intl | Server-first | Zentrales JSON, ICU | Opt-in (Declaration Merging) | ICU | ~14,1 kB |
@tolgee/react | Runtime | Zentral, In-Context-Bearbeitung | Nein | ICU | ~11,1 kB |
| Lingui | Macro | Quelltext im Code, kompilierte Kataloge | Gut, direkt vom Compiler | ICU via Makros | Gering |
| Paraglide | Compiler | inlang-Projekt, generierte Funktionen | Generiert | Eigenes | Nahezu null |
| Intlayer | Compiler | .content.ts pro Komponente | Generiert, standardmäßig an | Helfer (plural, enu) | Basislinie |
Die Zahlen sind eine Momentaufnahme der Benchmark-Versionen und ändern sich mit neuen Releases. Führen Sie den Benchmark für Ihre eigene Anwendung aus, bevor Sie sich allein aufgrund der Größe entscheiden.
Zwei Aspekte, die die Tabelle nicht zeigt: Paraglide liefert kaum eigenen Bibliothekscode aus, da es Code direkt in Ihr Repository generiert. Das bedeutet einen Regenerierungsschritt vor jedem Commit und potenzielle Merge-Konflikte in generierten Dateien. Und Intlayer benötigt ein Bundler-Plugin (vite-intlayer oder ein Äquivalent), weshalb es nicht in einem No-Build-Setup laufen kann.
Ordnen Sie Ihre Antworten einer Bibliothek zu
Wählen Sie die einfachste Lösung, die funktioniert, und investieren Sie nicht zu viel im Voraus. react-i18next mit einer einzelnen JSON-Datei pro Sprache reicht völlig aus, und die über ein Jahrzehnt gewachsenen Antworten auf Stack Overflow sparen viel Zeit. Verzichten Sie auf Namespaces, bis Sie sie wirklich benötigen. Wenn aus dem Prototyp ein Produkt wird, planen Sie eine Migration zu Scoped Content ein; der react-i18next Compat-Adapter ermöglicht dies schrittweise.
Ihr Katalogformat ist vorgegeben. react-intl ist nativ auf ICU ausgelegt und die FormatJS-Extraktionswerkzeuge sind für diese Pipeline optimiert. use-intl verarbeitet ebenfalls ICU. react-i18next benötigt dafür das ICU-Plugin oder nutzt ansonsten eigene Plural-Schlüssel. Die ICU-Unterstützung von Intlayer ist derzeit noch partiell; wenn Sie heute ICU-Strings erhalten, ist dies ein Blocker, bis die volle Unterstützung bereitsteht.
Bevorzugen Sie Scoped Content und dynamisches Laden standardmäßig, nicht nur als Konvention. Lingui und Paraglide erreichen dies durch Kompilierung. Intlayer erreicht dies durch Deklarationen pro Komponente, und der Compiler liefert nur das aus, was eine Route tatsächlich rendert. Bei react-i18next oder use-intl sollten Sie die Namespace- und Lazy-Loading-Strategie ab Tag eins planen und im Code-Review durchsetzen, da die Tooling-Kette dies nicht automatisch erzwingt.
Jede schlüsselbasierte Bibliothek lässt sich typisieren, aber fast keine ist es von Haus aus. Wenn Sie kein Declaration Merging pflegen möchten, das auch über nachgeladene Namespaces hinweg stabil bleiben muss, wählen Sie eine Bibliothek, bei der Typen direkt aus dem Inhalt generiert werden: Lingui, Paraglide oder Intlayer. Der Beitrag zur Erkennung fehlender Übersetzungen vergleicht, was die jeweiligen Bibliotheken zur Build-Zeit abfangen.
Rich-Text-Knoten sind der Punkt, an dem t(), das nur einen String zurückgibt, an seine Grenzen stößt. react-i18next und Lingui bieten <Trans>, react-intl nutzt Rich-Text-Tags, was in allen Fällen umständlicher ist als einfache Strings. Die Inhaltsknoten von Intlayer akzeptieren JSX, Markdown und verschachtelte Objekte direkt, was deutlich besser passt, wenn Inhalte über einfache UI-Labels hinausgehen.
In diesem Fall ist ein zentrales JSON keine zwingende Voraussetzung mehr, da kein externes TMS für den Import nötig ist. Kolokalisierter Inhalt kombiniert mit einer CLI, die fehlende Sprachen ergänzt, ist der kürzere Weg. Der fill-Befehl von Intlayer arbeitet mit Ihrem eigenen API-Schlüssel (OpenAI, Anthropic, Mistral, Gemini) und übersetzt nur geänderte Inhalte. Paraglide und Tolgee bieten gehostete Alternativen mit eigenen Preismodellen an.
React Context überschreitet die Server/Client-Grenze nicht. Bibliotheken, die ausschließlich auf einem Client-Hook basieren (react-i18next, react-intl), benötigen eine parallele Server-API, sobald Sie RSC einführen. use-intl (als next-intl) und Intlayer (als next-intlayer) bringen diese Trennung bereits mit. Lesen Sie den Next.js i18n-Beitrag, bevor Sie ein einheitliches Muster festlegen.
Wo die Schwachstellen der einzelnen Bibliotheken liegen
Ehrliche Einschränkungen, denn jede Option hat Kompromisse.
react-i18next: schwerstes Paket der Auswahl, eigenes Pluralformat, Typen müssen manuell konfiguriert und gepflegt werden, verwaiste Schlüssel sammeln sich unbemerkt an.react-intl: ausführliche Developer Experience (useIntl(), dannformatMessage({ id })), globale Instanz ist an viele Knoten gekoppelt.use-intl: einfacher Einstieg, mühsam zu optimieren. Namespaces, dynamisches Laden und Typen verlangsamen in Kombination die Entwicklung spürbar.Lingui: zusätzlicherextract/compileBuild-Schritt, mehrere überlappende Syntaxen (t(), Tagged Templates,i18n.t(),<Trans>), die sowohl Menschen als auch KI-Assistenten verwirren können.Paraglide: generierte Dateien im Repository, Tree-Shaking griff im React-Benchmark nicht wie erwartet, und die Sprache wird an jedem Knoten aus dem Storage statt aus einem zentralen Store gelesen.Tolgee: keine Schlüssel-Typen, steilere Einarbeitung, In-Context-Bearbeitung ist das Hauptargument.Intlayer: verpflichtendes Build-Plugin, kleineres Ökosystem, partielle ICU-Unterstützung, Inhalte sind per Design über die Codebase verteilt, sodass der Export einer einzelnen JSON-Datei für Übersetzer zusätzliches Tooling erfordert.gt-react,lingo.dev: im Benchmark nicht empfohlen: Quota-Fehler beim Build, Vendor-Lock-in und Reaktivitätsprobleme, die erzwungene Provider-Re-Renders erforderten.
Wie die Optionen im Code aussehen
Die gleiche Komponente, eine Warenkorb-Zusammenfassung mit Titel und Pluralform, umgesetzt mit jedem Kandidaten. Der interessante Teil ist nicht die Komponente selbst, sondern wo der Inhalt liegt und was die Typprüfung darüber weiß.
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Pluralformen sind Suffix-Schlüssel, die über Intl.PluralRules aufgelöst werden. t ist (key: string) => string, sofern Sie keine CustomTypeOptions deklarieren, sodass t("titel") fehlerfrei kompiliert.
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Durchgängig ICU, was dem Standardexport der meisten TMS-Plattformen entspricht. Typen für id entstehen erst über den Extraktionsschritt von formatjs plus eine generierte Union, nicht out of the box.
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Gleiche Struktur wie next-intl, jedoch ohne Next.js-Bindings. Schlüssel sind typisiert, sobald Sie AppConfig mit dem Typ der Nachrichten erweitern; das Aufteilen der Namespaces liegt bei Ihnen.
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Die Ausgangssprache verbleibt in der Komponente; andere Sprachen liegen nach lingui extract in .po-Dateien unter gehashten IDs. Wird extract oder compile vergessen, fällt die Anzeige stillschweigend auf Englisch zurück.
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Jede Nachricht ist eine generierte, typisierte Funktion, sodass ein fehlender Schlüssel einen Import-Fehler auslöst. Der Ordner paraglide/ wird direkt im Repository generiert und bei jeder Änderung aktualisiert.
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Alle Sprachen in einer Datei direkt neben der Komponente. Typen werden beim Build generiert, sodass title automatisch vervollständigt wird und ein Tippfehler tsc ohne Declaration Merging fehlschlagen lässt. Das Löschen des Ordners löscht auch die zugehörigen Texte.
Nutzen Sie bereits react-i18next, react-intl oder Lingui? Die Compat-Adapter (react-i18next, react-intl, Lingui) vergeben Alias-Namen für Importe auf Bundler-Ebene, sodass die bestehende API weiterfunktioniert, während Sie Komponente für Komponente migrieren. Der Migrationsleitfaden deckt die weiteren Schritte ab.
Vor Ihrer endgültigen Entscheidung
Eine Feature-Tabelle zeigt, was eine Bibliothek heute leistet. Die folgenden Punkte zeigen, wie sich der Alltag damit anfühlt.
Überprüfen Sie die Aktivität im Repository.
Commits, Antwortzeiten bei Issues und ob das letzte Minor-Release in diesem Jahr stattfand. Ein solides Konzept ohne aktiven Maintainer ist eine vorprogrammierte Migration.
Wählen Sie nicht rein nach npm-Downloadzahlen.
Die am häufigsten installierte Bibliothek ist diejenige, die zuerst veröffentlicht wurde, nicht zwingend diejenige, die zu einer React-Codebase im Jahr 2026 passt. Downloadzahlen spiegeln Historie wider, nicht Passgenauigkeit.

Hinterfragen Sie, wer die Maintainer finanziert und was verkauft wird.
i18next wird von Locize unterstützt. next-intl / use-intl, vue-i18n, svelte-i18n und Lingui werden von Crowdin unterstützt. Tolgee, Paraglide (inlang) und Intlayer betreiben jeweils eine eigene Plattform. Ein Anbieter, dessen Umsatz auf gehosteter Übersetzung basiert, hat wenig Interesse daran, Übersetzungen innerhalb Ihrer eigenen Toolchain kostenlos zu machen. Intlayer ist die einzige Option im Feld, die KI-Übersetzungen über die CLI mit Ihrem eigenen API-Schlüssel bereitstellt sowie ein CMS bietet, das Sie selbst hosten können.
Ist die Lösung bereit für KI-Agenten?
Agenten haben nach wie vor Schwierigkeiten mit i18n: Sie vergessen Sprachen, erfinden Schlüssel und vermischen Nachrichtensyntaxen. Bietet die Bibliothek Agent Skills oder einen MCP-Server, damit der Agent Inhalte auflisten, auffüllen und testen kann? Und ist das Laden von Inhalten standardmäßig optimiert, oder muss vierteljährlich jemand Namespaces und Lazy-Imports manuell überprüfen?
Typsicherheit out of the box.
Nicht "kann mit zusätzlichem Konfigurationsaufwand typisiert werden", sondern "ein falscher Schlüssel lässt tsc bei einer Neuinstallation fehlschlagen". Prüfen Sie das Verhalten bei einem Schlüssel, der nicht existiert, sowie bei einer Sprache, in der eine Übersetzung fehlt.
Erkennung ungenutzter Inhalte.
Kataloge wachsen meist nur an. Der Build von Intlayer bereinigt ungenutzte Felder und protokolliert diese (build.purge). Paraglide erreicht dies durch seine Architektur, da eine nicht aufgerufene Nachrichtenfunktion dem Tree-Shaking zum Opfer fällt. Alle anderen Optionen überlassen das Aufräumen Ihnen.
Developer Experience.
Einrichtungszeit bis zum ersten übersetzten String, ein LSP oder eine VS Code-Erweiterung, die Übersetzungen beim Hovern anzeigt und zur Deklaration springt, eine CLI zum Befüllen, Testen und Pushen sowie eine Möglichkeit für Nicht-Entwickler, Inhalte über einen visuellen Editor oder ein CMS ohne Pull Request zu bearbeiten.
Häufig gestellte Fragen (FAQ)
Ja, für die meisten Teams. Es bietet das größte Ökosystem und die meisten Lösungen im Netz. Die Nachteile sind real, aber kalkulierbar: die schwerste Laufzeit, ein eigenes Pluralformat sowie Typsicherheit und Scoping, die Sie selbst einrichten und pflegen müssen.
Nur wenn Bundle-Größe, generierte Typen oder Prüfungen auf fehlende Schlüssel zur Build-Zeit zu Ihren Anforderungen gehören. Für eine kleine App mit zwei Sprachen ist eine Laufzeit-Bibliothek unkomplizierter. Der Beitrag Compiler vs. deklarative i18n erläutert die Vor- und Nachteile von Compilern.
Teilweise. Schlüsselbasierte Bibliotheken ähneln sich strukturell so stark, dass ein Compat-Adapter eine API auf eine andere abbilden kann, so wie es die Intlayer-Adapter tun. Nachrichtenformate (ICU vs. i18next vs. Helfer) konvertieren sich jedoch nicht automatisch, sodass Pluralformen und Variablen-Interpolation manuell angepasst werden müssen.
Indirekt. Was Crawler sehen, hängt von Routing, hreflang, <html lang> und davon ab, ob Texte im serverseitig gerenderten HTML vorhanden sind. Einige Bibliotheken liefern dafür Helfer mit, die meisten überlassen dies Ihnen. Siehe den hreflang-Leitfaden.
Weiterführende Links
- i18n-Bibliotheken-Benchmark: Bundle-Größe, Leakage und Sprachwechsel-Timings und der TanStack Start-Bericht
- React i18n: Wie das Provider-Modell funktioniert und was es kostet
- react-i18next vs. react-intl vs. Intlayer, Feature für Feature
- next-i18next vs. next-intl vs. Intlayer
- Die Geschichte von JavaScript i18n
- Compiler vs. deklarative i18n
- Per-Komponente vs. Zentralisiertes i18n
- Wie Bundle-Optimierung zur Build-Zeit funktioniert
- i18n in einer Vite + React-App einrichten
- Der gleiche Leitfaden für Vue, Svelte und Solid
Kommentare
Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.
