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
i18next VS Intlayer | React & Next.js Internationalisierungs-Benchmark (i18n)
i18next ist das am weitesten verbreitete i18n-Framework im JavaScript-Ökosystem. Über react-i18next und next-i18next betreibt es einen großen Teil der React- und Next.js-Anwendungen. Intlayer ist eine compilerbasierte, komponentenzentrierte Alternative.
Dieser Artikel vergleicht beide anhand echter Messwerte anstelle von Feature-Listen. Die Zahlen stammen aus dem Benchmark Bloom, einer Open-Source-Suite, die dieselbe Anwendung mit jeder Bibliothek erstellt und misst, was der Browser tatsächlich herunterlädt.
tl;dr:i18nextist die schwerste Runtime im Benchmark: +77 KB gzip pro Seite auf Next.js im Standard-Setup (naiv), +22 KB nach vollständiger Namespace- und Lazy-Loading-Optimierung. Intlayer fügt lediglich +0.3 KB hinzu. Jedei18next-Konfiguration mit Ausnahme der vollständig isolierten (scoped) liefert ~90% Zeichenketten fremder Seiten aus; Intlayer liefert standardmäßig 0% aus. Der Sprachwechsel mit einem dynamisch nachgeladenen Backend dauerte 123-185 ms mitreact-i18nextgegenüber 3-4 ms mit Intlayer. Der Adapter@intlayer/next-i18nextbehält diei18next-API bei und erzielte 150.7 KB pro Seite gegenüber 218.5 KB für das Original.
Kurz zusammengefasst
- i18next / react-i18next / next-i18next - Ausgereift, pluginreich, framework-agnostisch. Namespaces, Spracherkenner, Backends, ICU über Plugins,
<Trans>für Rich Content. Inhalte sind zentral inlocales/{lng}/{ns}.jsonorganisiert. Mächtig, aber jede Optimierung (Namespace-Aufteilung, seitenweises Laden, Typsicherheit) ist Konfigurationsaufwand, den Sie selbst verwalten müssen. - Intlayer - Komponentenzentriertes Inhaltsmodell.
.content.ts-Wörterbücher liegen direkt neben der jeweiligen Komponente, ein Build-Time-Compiler übernimmt Tree-Shaking und Lazy Loading pro Komponente und Sprache, strikte TypeScript-Typen werden aus den Inhalten generiert und fehlende Übersetzungen führen zu Build-Fehlern. Bietet Middleware, SEO-Helfer, einen visuellen Editor / CMS und KI-gestützte Übersetzung.
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
Badges aktualisieren sich automatisch. Snapshots variieren im Zeitverlauf.
Direkter Funktionsvergleich
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Feature | Intlayer (react-intlayer / next-intlayer) | i18next (react-i18next / next-i18next) |
|---|---|---|
| Übersetzungen direkt an Komponenten | ✅ Ja, .content.ts direkt bei der jeweiligen Komponente | ❌ Nein, zentralisiert in locales/{lng}/{ns}.json |
| TypeScript-Integration | ✅ Strikte Typen automatisch aus dem Inhalt generiert | ⚠️ Basis; strikte Schlüssel benötigen CustomTypeOptions-Erweiterung |
| Erkennung fehlender Übersetzungen | ✅ TypeScript-Fehler + Build-Time-Fehler/Warnung | ⚠️ Runtime-Fallback (saveMissing, Schlüssel-Echo) |
| Rich Content (JSX / Markdown / Komponenten) | ✅ Direkte Unterstützung | ⚠️ <Trans> mit indizierten Platzhaltern |
| ICU-Unterstützung | ⚠️ In Arbeit | ⚠️ Über Plugin (i18next-icu) |
| Pluralisierung | ✅ Auf Aufzählungen basierende Muster | ✅ Suffixe _one / _other (Intl.PluralRules) |
| Formatierung (Datum, Zahlen, Währungen) | ✅ useNumber, useDate, ... (Intl integriert) | ⚠️ Interpolations-Formatierer oder manuelles Intl.* |
| Lokalisiertes Routing & Middleware | ✅ Integrierter Proxy / Middleware, getMultilingualUrls | ⚠️ Nicht im Core; eigene Middleware oder Drittanbieter-Lösung |
| SEO-Helfer (hreflang, Sitemap, robots) | ✅ Integrierte Hilfsfunktionen | ❌ Manuell |
| Synchrone Server-Komponenten | ✅ useIntlayer aus next-intlayer/server in jeder Server-Komponente einsetzbar | ⚠️ getFixedT auf Seitenebene, danach t als Props weiterreichen |
| Tree-Shaking (nur genutzten Inhalt liefern) | ✅ Pro Komponente, pro Sprache, automatisch durch Compiler | ⚠️ Manuell: Namespaces + ns-Liste pro Seite + Backend |
| Lazy Loading | ✅ importMode: 'dynamic' (eine Zeile Konfiguration) | ✅ Über Backend-Plugins (i18next-resources-to-backend, i18next-http-backend) |
| Ungenutzte Inhalte bereinigen | ✅ Verwaiste Wörterbücher werden beim Build entfernt | ❌ Nicht integriert |
| Fehlende Übersetzungen testen (CLI / CI) | ✅ npx intlayer content test | ⚠️ i18next-parser / Drittanbieter-Tools |
| KI-gestützte Übersetzung | ✅ Integriert, nutzt Ihre eigenen API-Schlüssel | ❌ Nein (Locize ist ein separater, kostenpflichtiger Dienst) |
| Visueller Editor / CMS | ✅ Kostenloser visueller Editor + optionales CMS | ❌ Nein (Locize / externe Plattformen) |
| MCP-Server & Agent Skills | ✅ Ja | ❌ Nein |
| Ökosystem & Community | ⚠️ Jünger, aber rasant wachsend | ✅ Größtes und ausgereiftestes Ökosystem |
Der Benchmark
Was gemessen wurde
Die Benchmark Bloom-Suite erstellt dieselbe Anwendung mit jeder Bibliothek: 10 Seiten (Startseite, Über uns, Blog, Karriere, Kontakt, FAQ, Preise, Produkte, Einstellungen, Team), 10 Sprachen (en, fr, es, de, it, pt, zh, ja, ko, ru), identische Komponenten und identische Inhalte. Die Seiten werden in en und fr gemessen. Jede Bibliothek wird in bis zu vier Ladestrategien implementiert:
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Strategie | Beschreibung | Typischer Einsatz |
|---|---|---|
| static | Alle Sprachen und Seiten zusammen gebündelt (resources in init() eingebunden) | Schnelle Prototypen, KI-generierter Code |
| dynamic | Nur die aktive Sprache wird über ein Backend geladen, aber alle Namespaces gleichzeitig | Die meisten Projekte |
| scoped-static | Ein Namespace pro Route, alle vorab gebündelt | Selten |
| scoped-dynamic | Ein Namespace pro Route + Lazy Loading über Backend. Nur aktuelle Seite, aktuelle Sprache | Anwendungen mit strengem Performance-Budget |
Intlayer benötigt keine "scoped"-Variante: Der Compiler grenzt den Inhalt automatisch pro Komponente ein, sodass bereits die Zeilen static und dynamic optimiert sind.
Für jeden Build erfasst die Suite:
- Lib size: gzip-Größe einer leeren Komponente, die nur die i18n-Bibliothek importiert.
- Page JS: gzip-JavaScript pro Seite heruntergeladen, gemittelt über alle Seiten und Sprachen.
- Locale leak %: Anteil der übersetzten Zeichenketten im JS, die zu einer Sprache gehören, die der Nutzer nicht betrachtet.
- Page leak %: Anteil der übersetzten Zeichenketten im JS, die zu einer Seite gehören, auf der sich der Nutzer nicht befindet.
- Component avg: durchschnittliche gzip-Größe jeder isoliert kompilierten Komponente.
- E2E reactivity: gemessene Zeitspanne zwischen Sprachauswahl und Aktualisierung von
html[lang]im DOM (Playwright, 5 Iterationen). - Hydration: Dauer der React-Hydratisierungsphase.
Die nachfolgenden Werte stammen aus dem Durchlauf vom 2026-09-12 mitnext-i18next16.3.0,react-i18next17.0.13 undintlayer9.5.1. Die Testanwendung ist bewusst kompakt gehalten (einige Dutzend Strings pro Sprache), daher spiegeln die Leckage-Werte ein Muster wider: Sie wachsen proportional zu Ihrem Inhalt, während die Runtime-Kosten konstant bleiben.
Ergebnisse auf Next.js (next-i18next)
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Bibliothek | Strategie | Lib size (gz) | Page JS avg (gz) | Locale leak | Page leak | Component avg (gz) | E2E-Reaktivität | Hydration |
|---|---|---|---|---|---|---|---|---|
| base (ohne i18n) | - | 0.0 KB | 141.0 KB | 0.0% | 0.0% | 0.9 KB | 13.4 ms | 11.8 ms |
next-i18next | static | 19.7 KB | 218.5 KB | 0.0% | 89.8% | 78.5 KB | 16.4 ms | 15.6 ms |
next-i18next | dynamic | 19.7 KB | 169.5 KB | 50.0% | 89.8% | 26.1 KB | 15.4 ms | 27.7 ms |
next-i18next | scoped-static | 19.7 KB | 220.1 KB | 0.0% | 89.8% | 78.9 KB | 16.4 ms | 14.7 ms |
next-i18next | scoped-dynamic | 19.7 KB | 163.4 KB | 0.0% | 0.0% | 27.1 KB | 15.9 ms | 15.1 ms |
next-intlayer | static | 5.5 KB | 141.3 KB | 0.0% | 0.0% | 8.5 KB | 15.5 ms | 16.9 ms |
next-intlayer | dynamic | 5.5 KB | 141.3 KB | 0.0% | 0.0% | 6.9 KB | 15.3 ms | 15.9 ms |
@intlayer/next-i18next (compat) | static | 9.4 KB | 150.7 KB | 0.0% | 0.0% | 9.7 KB | 10.7 ms | 11.3 ms |
@intlayer/next-i18next (compat) | dynamic | 9.4 KB | 150.7 KB | 0.0% | 0.0% | 9.7 KB | 11.9 ms | 10.6 ms |
Interpretation der Messwerte
- Runtime-Kosten. Der
i18next-Core samtreact-i18nextist die größte gemessene Runtime: 19.7 KB gzip für eine leere Komponente gegenüber 5.5 KB beinext-intlayer. - Das Standard-Setup ist kostspielig. Das direkte Einbetten von
resourcesininit()führt zu 218.5 KB pro Seite, +77.5 KB über der Basisanwendung. Jede Seite trägt sämtliche Namespaces mit. - Optimierung erfordert viel Aufwand. Der Wechsel zu einem Backend (
dynamic) spart 49 KB ein, lässt aber weiterhin 90% an Zeichenketten fremder Seiten durchsickern, und in dieser Konfiguration gehört die Hälfte der Strings zur falschen Sprache. Erst die zusätzliche Aufteilung in routenbasierte Namespaces (scoped-dynamic) eliminiert die Lecks vollständig bei 163.4 KB - immer noch +22.4 KB pro Seite mehr als Intlayer mit 141.3 KB, das ganz ohne manuelle Konfiguration auskam. - Komponentengröße. Eine Komponente mit
useTranslation()kompiliert je nach Konfiguration auf 26 bis 79 KB; dieselbe Komponente mituseIntlayer()benötigt lediglich 6.9 KB. - Die Hydratisierung steigt im
dynamic-Setup auf 27.7 ms an: Die i18next-Instanz initialisiert sich und löst ihr Backend auf dem Client auf, bevor React die Hydratisierung abschließen kann.
Ergebnisse auf TanStack Start (react-i18next)
Dieselbe Testanwendung auf TanStack Start mit reinem react-i18next, wodurch Next.js-spezifische Eigenheiten aus dem Vergleich herausgefiltert werden.
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Bibliothek | Strategie | Lib size (gz) | Page JS avg (gz) | Locale leak | Page leak | Component avg (gz) | E2E-Reaktivität | Hydration |
|---|---|---|---|---|---|---|---|---|
| base (ohne i18n) | - | 0.0 KB | 111.0 KB | 0.0% | 0.0% | 0.7 KB | 8.1 ms | 21.6 ms |
react-i18next | static | 18.4 KB | 180.3 KB | 50.0% | 89.8% | 24.3 KB | 12.9 ms | 85.1 ms |
react-i18next | dynamic | 18.4 KB | 136.4 KB | 23.1% | 89.8% | 24.8 KB | 123.1 ms | 32.9 ms |
react-i18next | scoped-static | 18.4 KB | 184.2 KB | 50.7% | 89.8% | 25.3 KB | 185.1 ms | 25.2 ms |
react-i18next | scoped-dynamic | 18.4 KB | 127.2 KB | 0.0% | 0.0% | 26.7 KB | 17.6 ms | 11.3 ms |
intlayer | static | 5.0 KB | 125.8 KB | 50.0% | 0.0% | 8.1 KB | 3.2 ms | 11.5 ms |
intlayer | dynamic | 5.0 KB | 118.6 KB | 0.0% | 0.0% | 6.3 KB | 3.6 ms | 14.1 ms |
Interpretation der Messwerte
- Die unoptimierte
react-i18next-App liefert +69 KB pro Seite mehr als die Basisanwendung aus, und die Hydratisierung dauert 85 ms (das Vierfache der Basis), da der gesamte Ressourcenbaum vor dem ersten Rendern auf dem Client analysiert und registriert werden muss. - Sprachwechsel macht Backend-Latenzen spürbar. Werden Ressourcen erst bei Bedarf geladen, erfordert der Sprachwechsel einen zusätzlichen Netzwerk-Roundtrip vor der
html[lang]-Aktualisierung: 123 ms beidynamic, 185 ms beiscoped-static. Intlayer aktualisiert das DOM in beiden Modi in 3-4 ms: Der Wechsel erfolgt sofort und blockiert nicht auf Netzwerkanfragen. - Die voll optimierte
scoped-dynamic-Konfiguration erreicht 0% Leckage bei 127.2 KB, liegt aber immer noch +8.6 KB über Intlayersdynamic-Zeile - und erforderte dafür eine Routen-zu-Namespace-Zuordnung, ein Backend und Suspense-Grenzen pro Route. - Intlayers
static-Zeile weist bereits 0% Seitenleckage auf, weil ausschließlich die von den Komponenten der jeweiligen Seite importierten Wörterbücher gebündelt werden. Das Aktivieren vonimportMode: 'dynamic'eliminiert auch die Sprachleckage vollständig. - Komponentengröße: 24-27 KB pro Komponente mit
react-i18nextgegenüber 6-8 KB mit Intlayer.useTranslation()bindet jede Komponente an die globale i18next-Instanz.
Woher kommt der Unterschied? Globale Instanz vs. kompilierte Wörterbücher
i18next wurde 2012 als Runtime konzipiert: Eine globale Instanz verwaltet einen Ressourcenspeicher, Plugins erweitern ihn und t() schlägt Schlüssel zur Renderzeit nach. Das macht es sehr flexibel (für jedes Framework, Backend und Format), führt aber auch zu Mehrgewicht:
Kopieren Sie den Code in die Zwischenablage
Die Instanz kann nicht wissen, welche Schlüssel eine Komponente anfordern wird. Optimierung bedeutet daher: Sie unterteilen Kataloge in Namespaces, Sie listen die Namespaces für jede Seite auf und Sie halten diese Liste synchron, wenn Komponenten verschoben werden. Wie die Benchmark-Hinweise festhalten: "Typsicherheit zu wahren und exakt zu wissen, welcher Namespace auf welcher Seite eingebunden werden muss, ist ein Albtraum".
Intlayer verzichtet auf die globale Instanz. Inhalte werden direkt bei der Komponente deklariert und der Compiler löst den Abhängigkeitsgraphen zur Build-Zeit auf:
Kopieren Sie den Code in die Zwischenablage
@intlayer/swc / @intlayer/babel erkennt, welche Komponente welches Wörterbuch importiert, bündelt nur diese und nur für die aktive Sprache und verwirft Unbenutztes. Das "scoped-dynamic"-Muster ist das automatische Ergebnis des Builds und keine mühsame manuelle Disziplin mehr.
Um die Werte derdynamic-Zeile zu erhalten, setzen Siedictionary.importMode: 'dynamic'inintlayer.config.ts. Details finden Sie in der Dokumentation zur Bundle-Optimierung.
Entwicklererfahrung
Einrichtung
next-i18next (App Router)
Kopieren Sie den Code in die Zwischenablage
Dazu kommt ein clientseitiger I18nProvider, der die Instanz mit identischen Optionen instanziiert, generateStaticParams und eine namespaces-Liste auf jeder Seite.
Intlayer
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Client-Komponente
react-i18next
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Die Seite, die diese Komponente einbindet, muss den Namespaceaboutladen, undt("counter.label")bleibt ein einfacher String, sofernCustomTypeOptionsnicht erweitert wird.
Intlayer
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
label und increment sind strikt typisiert; Tippfehler werden als TypeScript-Fehler gemeldet und fehlende Übersetzungen verhindern den Build.
Synchrone Server-Komponente
next-i18next
Kopieren Sie den Code in die Zwischenablage
Die Seite ruft i18n.getFixedT(locale, "about") auf und reicht t und locale als Props nach unten weiter.
Intlayer
Kopieren Sie den Code in die Zwischenablage
i18next-API behalten, Intlayer-Performance nutzen
Sie müssen keine Komponenten neu schreiben, um von den Benchmark-Ergebnissen zu profitieren. @intlayer/i18next, @intlayer/react-i18next und @intlayer/next-i18next sind Drop-in-Adapter: useTranslation, t(), <Trans>, {{interpolation}}, _one / _other-Plurale, Kontext-Suffixe und returnObjects funktionieren weiterhin, bereitgestellt aus vorkompilierten Intlayer-Wörterbüchern.
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Im Benchmark sank die angepasste Version derselben Next.js-Anwendung von 218.5 KB auf 150.7 KB pro Seite, von 78.5 KB auf 9.7 KB pro Komponente, von ~90% Inhaltslecks auf 0% und die Hydratisierung von 15.6 ms auf 11.3 ms - bei unverändertem Anwendungscode. Ihre bestehenden locales/{lng}/{ns}.json-Dateien können über das JSON-Sync-Plugin weiterhin die Source of Truth bleiben.
Siehe die Migrationsanleitungen: i18next, react-i18next, next-i18next.
Wann welche Lösung wählen?
- Wählen Sie i18next, wenn Sie dessen Plugin-Ökosystem (Detektoren, Backends, ICU, Locize) benötigen, Lokalisierung auch außerhalb von React stattfindet (Node-Dienste, Vanilla JS, andere Frameworks), Ihr Team bereits damit vertraut ist oder Übersetzungsplattformen
locales/{lng}/{ns}.jsonerwarten. Planen Sie die Zeit ein, um Kataloge in Namespaces aufzuteilen, ein Backend einzubinden und das Seiten-Mapping manuell zu pflegen. - Wählen Sie Intlayer, wenn Sie komponentenzentrierte Inhalte, strikte TypeScript-Typen, Build-Time-Fehler bei fehlenden Übersetzungen, automatisiertes Tree-Shaking und Lazy Loading, sofortige Sprachwechsel, synchrone Server-Komponenten und integrierte redaktionelle Werkzeuge (visueller Editor, CMS, KI-Übersetzung, MCP-Server) wünschen. Besonders wertvoll für modulare Codebases und Design-Systeme.
- Wählen Sie die
@intlayer/*-i18next-Adapter, wenn Sie bereits auf i18next setzen und die Bundle- sowie Reaktivitätsgewinne ohne Refactoring realisieren möchten.
Verwandte Vergleiche
- next-intl vs Intlayer (gleicher Benchmark)
- Lingui vs Intlayer (gleicher Benchmark)
- vue-i18n vs Intlayer Benchmark (gleicher Benchmark)
- next-i18next vs next-intl vs Intlayer
- react-i18next vs react-intl vs Intlayer
- Ist i18next veraltet?
GitHub-Sterne
GitHub-Sterne sind ein aussagekräftiger Indikator für Popularität, Vertrauen der Community und Zukunftsfähigkeit eines Projekts. Sie messen zwar nicht direkt die Codequalität, zeigen aber, wie viele Entwickler das Projekt schätzen, verfolgen und einsetzen.
Fazit
i18next hat seinen Platz verdient: Es läuft überall, bietet Plugins für jeden Anwendungsfall und wird seit über zehn Jahren gepflegt. Der Benchmark verdeutlicht jedoch die Kosten dieser runtime-fokussierten Architektur. Das typische Setup kostet +70-77 KB gzip pro Seite, transportiert ~90% Daten fremder Seiten mit sich und benötigt bei Lazy Loading über 100 ms für einen Sprachwechsel. 0% Leckage ist machbar, erfordert aber ein Backend, getrennte Namespaces pro Route und manuelle Pflege - und bleibt dennoch +9-22 KB schwerer als Intlayer.
Intlayer verlagert diese Arbeit in den Compiler. Wörterbücher pro Komponente, Lazy Loading pro Sprache und das Bereinigen ungenutzter Inhalte sind Ergebnisse des Builds statt manueller Konventionen. Auf derselben Anwendung: +0.3 KB pro Seite, 0% Leckage, Komponenten 3 bis 10 Mal kleiner und Sprachwechsel in 3-4 ms.
Alle Rohdaten, Testanwendungen und Skripte stehen im Benchmark Bloom Repository bereit. Probieren Sie es selbst aus.
Weitere Details finden Sie in der Dokumentation 'Warum Intlayer?'.
Kommentare
Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.
