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/i18next | Gleiche API, anderes Bundle
@intlayer/i18next, @intlayer/react-i18next und @intlayer/next-i18next sind Kompatibilitätsadapter. Sie stellen die i18next-API bereit, die Ihr Code bereits verwendet (useTranslation, t(), <Trans>, i18n.changeLanguage(), getFixedT, serverSideTranslations...), und bedienen sie aus von Intlayer kompilierten Wörterbüchern. Die Komponenten ändern sich nicht. Die Runtime darunter jedoch schon.
Dieser Artikel misst diesen Austausch an derselben Next.js-Anwendung, die einmal mit next-i18next und einmal mit @intlayer/next-i18next gebaut wurde. Die Zahlen stammen aus Benchmark Bloom. Für einen Vergleich von i18next und Intlayer als eigenständige Bibliotheken lesen Sie i18next vs Intlayer. Hier geht es darum, was der Adapter verändert, wenn Sie Ihren bestehenden Code unverändert beibehalten.
tl;dr: In derselben Next.js-App reduzierte der Wechsel vonnext-i18nextzu@intlayer/next-i18nextdas JavaScript pro Seite von 218.5 KB auf 150.7 KB gzip (Basis-Setup) und unterbot selbst das vollständig optimiertenext-i18next-Setup (163.4 KB) um 12.7 KB. Die durchschnittliche Komponentengröße sank von 78.5 KB auf 9.7 KB, das String-Leakage fremder Seiten von ~90% auf 0%, die Hydration-Dauer von 15.6 ms auf 11.3 ms und die Runtime von 19.7 KB auf 9.4 KB. Keine einzige Komponente musste angepasst werden; lediglich eine Provider-Datei wurde geändert.i18next-Plugins (Backends, Spracherkenner) werden akzeptiert, bewirken aber nichts: Zur Laufzeit muss nichts mehr geladen oder erkannt werden.
Was @intlayer/i18next ist
i18next ist eine Runtime. i18n.init({ resources }) oder ein Backend-Plugin lädt locales/{lng}/{ns}.json in eine globale Instanz; useTranslation("about") abonniert die Komponente darauf; t("title") schlägt den Schlüssel zur Renderzeit nach. Namespaces, Lazy Loading, seitenbasierte Namespace-Listen und Typsicherheit müssen von Ihnen konfiguriert und gepflegt werden.
Die Adapter behalten die API bei und ersetzen die globale Instanz:
- Import-Aliasing.
createNextI18nPlugin()aus@intlayer/next-i18next/plugin(oderwithI18next) umschließtwithIntlayerund richtet Webpack- / Turbopack-Aliase ein, sodassnext-i18next,react-i18nextundi18nextauf ihre@intlayer/*-Gegenstücke aufgelöst werden. Unter Vite übernimmtreactI18nextVitePlugin()aus@intlayer/react-i18next/plugindie gleiche Aufgabe. Kein einziger Import muss umbenannt werden. - JSON als Source of Truth. Das
syncJSON-Plugin liest Ihre bestehendenlocales/{lng}/{ns}.json-Dateien mitformat: "i18next"(sodass{{name}},$t()-Verschachtelungen,_one/_otherund Kontext-Suffixe korrekt geparst werden) und schreibt Übersetzungen zurück, sobald die CLI oder das CMS sie aktualisiert. - Bindung am Aufrufpunkt. Der Optimierungsschritt von Intlayer schreibt
useTranslation("about")in einen Aufruf um, der das Wörterbuchaboutdirekt in der aktiven Locale empfängt. Die Komponente greift nicht mehr auf den globalen Store zu.
Kopieren Sie den Code in die Zwischenablage
Kopieren Sie den Code in die Zwischenablage
Dieser Umschreibprozess sorgt für die drastische Verkleinerung der Komponenten und den Wegfall des Seiten-Leakages in den folgenden Messungen.
Was die Adapter beibehalten, ignorieren und nicht ersetzen
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
i18next-API | Mit @intlayer/* |
|---|---|
useTranslation("ns"), useTranslation("ns", { keyPrefix }) | ✅ Beibehalten. Zur Build-Zeit an das ns-Wörterbuch gebunden; typisiert gegen Ihre Inhalte |
t("key", { name }), {{interpolation}}, $t(key)-Verschachtelung | ✅ Beibehalten |
Pluralformen key_one / key_other, Kontext key_male, returnObjects | ✅ Beibehalten. Plurale werden über Intl.PluralRules ausgewertet |
<Trans> mit components, nummerierten Tags <1>...</1>, values | ✅ Beibehalten |
withTranslation, Translation, I18nContext | ✅ Beibehalten |
i18n.changeLanguage(), i18n.language, i18n.dir(), on("languageChanged") | ✅ Beibehalten. changeLanguage steuert die Locale von Intlayer |
getFixedT(lng, ns, keyPrefix), i18n.exists(), hasLoadedNamespace() | ✅ Beibehalten |
i18n.use(Backend).use(LanguageDetector).init({...}) | ⚠️ use() ruft init des Plugins auf und beendet; Backends und Detectors müssen nichts laden oder ermitteln |
init({ resources }), addResourceBundle() | ⚠️ resources wird mit einer Warnung ignoriert; entfernen Sie JSON-Imports für optimale Bundle-Größen |
I18nextProvider i18n={i18n} | ⚠️ Rendert einen IntlayerProvider; die i18n-Prop wird ignoriert. Im App Router Locale übergeben (siehe unten) |
serverSideTranslations(locale, ["common"]) (next-i18next) | ⚠️ Gibt die erwartete Struktur zurück und lädt nichts. Unschädlich beizubehalten, sicher zu löschen |
appWithTranslation(App) (next-i18next) | ✅ Beibehalten |
next-i18next.config.js | ⚠️ Wird nicht gelesen. Locales stammen aus intlayer.config.ts |
Einfaches useTranslation() ohne Namespace | ✅ Funktioniert gegen das translation-Gesamtwörterbuch der Datei (splitKeys: false) |
Der Benchmark
Was gemessen wurde
Die Testsuite Benchmark Bloom erstellt dieselbe Anwendung in jedem Setup: 10 Seiten (Home, About, Blog, Careers, Contact, FAQ, Pricing, Products, Settings, Team), 10 Locales (en, fr, es, de, it, pt, zh, ja, ko, ru), identische Komponenten und identischer Inhalt. Die Seiten werden in en und fr gemessen.
next-i18next wurde in vier Ladestrategien getestet: vom Import aller Locale-JSONs in resources (static) bis hin zu einem Namespace pro Route, der über ein Backend nachgeladen wird (scoped-dynamic). Der Adapter lief auf denselben Komponenten wie das Basis-Setup, wobei lediglich next.config.ts, intlayer.config.ts und die Provider-Datei angepasst wurden. Er benötigt keine manuell "gescopte" Variante: Der Compiler grenzt den Inhalt automatisch pro Komponente ab.
Für jeden Build erfasst die Suite:
- Lib-Größe: gzip-Größe einer leeren Komponente, die lediglich die i18n-Bibliothek importiert.
- Seiten-JS: Durchschnittliches gzip-JavaScript, das pro Seite über alle Seiten und Locales heruntergeladen wird.
- Locale-Leakage %: Anteil übersetzter Strings im heruntergeladenen JS, der zu einer Sprache gehört, die der Nutzer nicht betrachtet.
- Seiten-Leakage %: Anteil übersetzter Strings im heruntergeladenen JS, der zu einer Seite gehört, auf der sich der Nutzer nicht befindet.
- Komponenten-Durchschnitt: Durchschnittliche gzip-Größe jeder isoliert kompilierten Komponente.
- E2E-Reaktivität: Gemessene Zeitspanne zwischen der Sprachauswahl und der Aktualisierung von
html[lang]im DOM (Playwright, 5 Durchläufe). - Hydration: Dauer der React-Hydration-Phase.
Die folgenden Zahlen stammen aus dem Durchlauf vom 12.09.2026 mitnext-i18next16.3.0 (react-i18next17.0.13,i18next26.4.2) und@intlayer/next-i18next9.5.1. Die Testanwendung ist bewusst kompakt gehalten (wenige Dutzend Zeichenketten pro Sprache), sodass die Leakage-Prozentwerte ein Muster abbilden: Sie steigen mit wachsendem Content, während die Runtime-Kosten konstant bleiben.
Ergebnisse auf Next.js
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Setup | Strategie | Lib-Größe (gz) | Seiten-JS Ø (gz) | Locale-Leakage | Seiten-Leakage | Komp Ø (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 |
@intlayer/next-i18next | static | 9.4 KB | 150.7 KB | 0.0% | 0.0% | 9.7 KB | 10.7 ms | 11.3 ms |
@intlayer/next-i18next | dynamic | 9.4 KB | 150.7 KB | 0.0% | 0.0% | 9.7 KB | 11.9 ms | 10.6 ms |
next-intlayer (nativ) | static | 5.5 KB | 141.3 KB | 0.0% | 0.0% | 8.5 KB | 15.5 ms | 16.9 ms |
next-intlayer (nativ) | dynamic | 5.5 KB | 141.3 KB | 0.0% | 0.0% | 6.9 KB | 15.3 ms | 15.9 ms |
Einordnung der Ergebnisse
- 68 KB weniger pro Seite gegenüber dem Basis-Setup.
resources: { en, fr, ... }liefert jede Sprache und jeden Namespace auf jeder Seite aus: 218.5 KB. Der Adapter-Build derselben Komponenten landet bei 150.7 KB. Er unterbietet auch die beste Konfiguration vonnext-i18next(163.4 KB, ein Namespace pro Route, nachgeladen) um 12.7 KB, da diei18next-Runtime allein 19.7 KB gegenüber 9.4 KB wiegt. - Leakage sinkt auf 0%, ohne Komponenten zu verändern. Jedes
next-i18next-Setup außer der vollkommen isolierten Variante liefert ~90% fremde Seiten-Strings aus. Dasdynamic-Setup schneidet schlechter ab als erwartet: Es behält das Seiten-Leakage bei und erzeugt zusätzlich 50% Locale-Leakage, da das Backend pro Sprache stets den gesamtentranslation-Namespace abruft. Der Adapter erreicht 0% / 0% direkt auf dem Ursprungscode. - Komponenten: 8x kleiner. Eine isoliert kompilierte
useTranslation()-Komponente wiegt durchschnittlich 78.5 KB mit eingebettetenresourcesund 26-27 KB mit Backend, datan den globalen Store gebunden ist. Mit dem Adapter sind es durchschnittlich 9.7 KB. - Schnellere Hydration und Sprachwechsel. Die Hydration sinkt von 15.6 ms auf 11.3 ms (und von 27.7 ms im
dynamic-Setup, wo der Backend-Aufruf auf dem kritischen Pfad liegt). Der Sprachwechsel beschleunigt sich von 15-16 ms auf 11-12 ms. - Der Adapter ist nicht die native Runtime.
next-intlayerkommt auf 141.3 KB, lediglich +0.3 KB über der Basis-App. Der Adapter bringt die API-Oberfläche voni18next(Interpolation, Plural- und Kontext-Suffixe,<Trans>-Parsing) auf dem Core von Intlayer mit: 9.4 KB und +9.4 KB pro Seite über nativ. Er ist die Brücke, nicht das Endziel.
Derreact-i18next-Adapter unter Vite / TanStack Start war nicht Teil dieser Messreihe. Die Werte fürreact-i18nextauf TanStack Start finden sich in i18next vs Intlayer: 127-184 KB pro Seite und 123-185 ms beim Sprachwechsel bei nachgeladenem Backend.
Warum sich die Zahlen verändern
Am Ordner components/ wurde nichts geändert; die Einsparungen resultieren daraus, woran useTranslation gebunden ist.
Bei i18next erfolgt die Bindung an die globale Instanz. Alles, was hineingeladen wurde (alle Sprachen bei static, der gesamte Namespace der aktiven Sprache bei dynamic), ist für jede Komponente erreichbar, die useTranslation() aufruft. Der Bundler kann nicht feiner trennen als der Instanzinhalt, und die Runtime kann nicht wissen, welche Schlüssel eine Komponente beim Rendern anfordern wird.
Kopieren Sie den Code in die Zwischenablage
Bei @intlayer/next-i18next bindet der Aufruf direkt an das Wörterbuch. syncJSON wandelt jede Namespace-Datei in ein Wörterbuch um; der Optimierungsschritt übergibt der Komponente exakt das benötigte Wörterbuch als Import, den der Bundler pro Seite und pro Sprache isolieren und aufteilen kann.
Kopieren Sie den Code in die Zwischenablage
i18n/i18n.ts und dessen resources-Import werden zu totem Code. Genau daraus resultieren die 68 KB Einsparung.
Migration in drei Schritten
Installation
bashCode kopierenKopieren Sie den Code in die Zwischenablage
Der Befehl erkennt
i18next/react-i18next/next-i18next, installiertintlayer, das Framework-Paket (next-intlayeroderreact-intlayer), den passenden@intlayer/*-Adapter sowie@intlayer/sync-json-pluginund fülltintlayer.config.tsvor. Behalten Sie die bisherigen Pakete installiert: Sie fungieren als Peer-Dependencies und liefern die TypeScript-Definitionen.Intlayer auf Ihre Sprachdateien ausrichten
intlayer.config.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Wenn Sie eine einzige
translation.jsonpro Sprache verwenden (der Standard-Namespace von i18next), setzen SiesplitKeys: false, damit die gesamte Datei ein einziges Wörterbuch bleibt und einfache Aufrufe vonuseTranslation()weiterhin funktionieren.Plugin hinzufügen
next.config.tsCode kopierenKopieren Sie den Code in die Zwischenablage
Im App Router erhalten Client-Komponenten ihre Sprache über das
[locale]-Segment. DerI18nextProviderdes Adapters nimmt keine Sprache entgegen, daher ersetzen Sie ihn einmalig in Ihrer Provider-Datei:components/AppProviders.tsxCode kopierenKopieren Sie den Code in die Zwischenablage
Alle darunter liegenden Komponenten rufen weiterhin wie gewohnt
useTranslation()auf.vite.config.tsCode kopierenKopieren Sie den Code in die Zwischenablage
reactI18nextVitePlugin()umschließtvite-intlayerund richtet Aliase fürreact-i18nextundi18nextein. Für ein Projekt ohne React aliasti18nextVitePlugin()aus@intlayer/i18next/plugindas Basispaketi18next.
Was Sie anschließend entfernen können
Tabelle in einem Modal öffnen, um alle Daten übersichtlich anzuzeigen
| Datei / Muster | Grund |
|---|---|
resources: { en, fr, ... } und die JSON-Imports | Werden vom Adapter ignoriert. Hier lagen die 68 KB |
i18next-http-backend, i18next-resources-to-backend | Zur Laufzeit muss nichts mehr abgerufen werden |
i18next-browser-languagedetector | Die Spracherkennung übernimmt das Routing von Intlayer (URL-Präfix, Cookie, Header) |
serverSideTranslations() in getStaticProps | Liefert eine leere Struktur; harmlos, aber überflüssig |
next-i18next.config.js | Wird nicht gelesen. Sprachen liegen in intlayer.config.ts |
Listen mit ns: [...] pro Seite | Der Compiler wählt Namespaces komponentenweise aus |
Was Sie über Dateigrößen hinaus gewinnen
- Typisierte Schlüssel.
useTranslation("about")ist gegen das kompilierteabout-Wörterbuch typisiert;t("does.not.exist")führt zu einem TypeScript-Fehler statt zu einem zurückgegebenen Key-String. npx intlayer testlässt die CI bei fehlenden Schlüsseln in beliebigen Sprachen fehlschlagen.npx intlayer fillübersetzt fehlende Einträge mit Ihrem eigenen Provider-Schlüssel (OpenAI, Anthropic, Mistral, Gemini...) und schreibt sie inlocales/{lng}/{ns}.jsonzurück.- Visueller Editor und CMS arbeiten auf demselben JSON, sodass Übersetzer Inhalte per UI bearbeiten können und Dateien synchronisiert werden.
- Schrittweiser Wechsel zu
.content.ts. Jede Komponente kann unabhängig vonuseTranslation("about")aufuseIntlayer("about")mit einer zugehörigen Inhaltsdatei umgestellt werden. JSON und.content.ts-Dateien koexistieren reibungslos.
Grenzen, die Sie vorab kennen sollten
- Backends und Detektoren sind inaktiv.
i18n.use(HttpBackend)ruft dasinitdes Plugins auf und nichts weiter. Wenn Ihre App darauf angewiesen war, Übersetzungen zur Laufzeit von einem CMS abzurufen, entfällt dieser Pfad; nutzen Sie stattdessen das Intlayer-CMS oder die Befehleintlayer pull/push. resourceswird ignoriert, nicht zusammengeführt. Im Gegensatz zu manchen anderen Adaptern nutzt@intlayer/i18nexteingebetteteresourcesnicht als Fallback. Jeder Schlüssel muss in den synchronisierten Wörterbüchern vorhanden sein, wasintlayer testabsichert.- App Router erfordert die Provider-Änderung. Eine Datei, oben dargestellt. Pages Router mit
appWithTranslationbenötigt keinerlei Änderungen. next-i18next.config.jswird ignoriert.localePath,fallbackLng,reloadOnPrerenderund Verwandte haben keine Wirkung; Sprachen und Fallbacks werden inintlayer.config.tsdefiniert.- Der Adapter ist nicht kostenlos. 9.4 KB Runtime und +9.4 KB pro Seite gegenüber
next-intlayer. Sobald alle Komponenten aufuseIntlayerumgestellt sind, kann er entfernt werden.
Wann welche Lösung wählen?
- Bleiben Sie bei
i18next, wenn Ihre Anwendung zwingend auf Runtime-Backends (zur Anfragezeit aus einem CMS geladene Übersetzungen), das Plugin-Ökosystem oder ein Nicht-React-Target angewiesen ist, das die Adapter nicht abdecken. - Nutzen Sie
@intlayer/*, wenn Siereact-i18next/next-i18nexteinsetzen und 68 KB sparen, 8x kleinere Komponenten, 0% Leakage, typisierte Schlüssel und CI-Prüfungen ohne Code-Rewrite erhalten möchten. Dies ist der beste Einstieg für bestehendei18next-Codebasen. - Wählen Sie nativ (
next-intlayer/react-intlayer) für Neuprojekte oder sobald der Adapter seinen Dienst getan hat. Es ist die schlankste Variante (5.5 KB, +0.3 KB pro Seite) und schaltet synchrone Server-Komponenten sowie komponentenbasierte.content.ts-Dateien frei.
Verwandte Vergleiche
- i18next vs Intlayer (Bibliotheksvergleich, gleiche Benchmark-Basis)
- next-intl vs @intlayer/next-intl (gleiche Adapter-Serie)
- Lingui vs @intlayer/lingui (gleiche Adapter-Serie)
- vue-i18n vs @intlayer/vue-i18n (gleiche Adapter-Serie)
- Migrationsanleitungen: i18next, react-i18next, next-i18next
- Adapter-Referenzen: i18next, react-i18next, next-i18next
Fazit
i18next ist die schwerste Runtime in diesem Benchmark, und die Adapter entfernen den Großteil davon, ohne dass Sie die gewohnte API aufgeben müssen. Auf derselben Next.js-App bedeutet das 68 KB weniger pro Seite als im Basis-Setup, 12.7 KB weniger als in der am stärksten handoptimierten Version, 8x kleinere Komponenten, 0% Leakage und 4 ms schnellere Hydration für den Preis einer Konfigurationsdatei, einer Plugin-Zeile und einer Provider-Anpassung. Backends und Detektoren werden wirkungslos, resources wird ignoriert statt gemergt, und die native next-intlayer-Runtime bleibt nochmals 9 KB schlanker.
Alle Rohdaten, Testanwendungen und Skripte stehen im Benchmark Bloom Repository bereit.
Weitere Details finden Sie in der Dokumentation Warum Intlayer?.
Kommentare
Noch keine Kommentare. Seien Sie der Erste, der seine Gedanken teilt.
