Stellen Sie Ihre Frage und erhalten Sie einen Resümee des Dokuments, indem Sie diese Seite und den AI-Anbieter Ihrer Wahl referenzieren
Durch die Integration des Intlayer MCP-Servers in Ihren bevorzugten AI-Assistenten können Sie alle Dokumente direkt von ChatGPT, DeepSeek, Cursor, VSCode usw. abrufen.
Dokumentation des MCP-Servers ansehenDer 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
next-i18next VS next-intl VS intlayer | Next.js Internationalisierung (i18n)
Werfen wir einen Blick auf die Gemeinsamkeiten und Unterschiede zwischen drei i18n-Optionen für Next.js: next-i18next, next-intl und Intlayer.
Dies ist kein vollständiges Tutorial. Es ist ein Vergleich, der Ihnen bei der Auswahl helfen soll.
Wir konzentrieren uns auf den Next.js 13+ App Router (mit React Server Components) und bewerten:
- Architektur & Inhaltsorganisation
- TypeScript & Sicherheit
- Umgang mit fehlenden Übersetzungen
- Routing & Middleware
- Performance & Ladeverhalten
- Entwicklererfahrung (DX), Tools & Wartung
- SEO & Skalierbarkeit bei großen Projekten
Kurzfassung: Alle drei können eine Next.js-App lokalisieren. Wenn Sie komponentenbezogenen Inhalt, strenge TypeScript-Typen, Build-Zeit-Prüfungen fehlender Schlüssel, tree-shakbare Wörterbücher und erstklassige App Router- und SEO-Hilfen wünschen, ist Intlayer die vollständigste und modernste Wahl.
Eine häufige Verwirrung bei Entwicklern ist die Annahme, dass next-intl die Next.js-Version von react-intl sei. Das ist nicht der Fall – next-intl wird von Amann gepflegt, während react-intl von FormatJS betreut wird.
Kurz gesagt
- next-intl – Leichtgewichtiges, unkompliziertes Nachrichtenformat mit solider Next.js-Unterstützung. Zentralisierte Kataloge sind üblich; die Entwicklererfahrung (DX) ist einfach, aber Sicherheit und großflächige Wartung bleiben größtenteils Ihre Verantwortung.
- next-i18next – i18next im Next.js-Gewand. Ausgereiftes Ökosystem und Funktionen über Plugins (z. B. ICU), aber die Konfiguration kann umfangreich sein und Kataloge neigen dazu, mit wachsendem Projekt zentralisiert zu werden.
- Intlayer – Komponentenorientiertes Inhaltsmodell für Next.js, strikte TS-Typisierung, Build-Zeit-Prüfungen, Tree-Shaking, eingebaute Middleware- & SEO-Hilfen, optionaler Visueller Editor/CMS und KI-unterstützte Übersetzungen.
Abzeichen werden automatisch aktualisiert. Schnappschüsse können sich im Laufe der Zeit ändern.
Gegenüberstellung der Funktionen (Fokus auf Next.js)
| Funktion | next-intlayer (Intlayer) | next-intl | next-i18next |
Abzeichen werden automatisch aktualisiert. Screenshots können sich im Laufe der Zeit ändern.
Gegenüberstellung der Funktionen (Fokus auf Next.js)
Funktion | next-intlayer (Intlayer) | next-intl | next-i18next |
---|---|---|---|
Übersetzungen in der Nähe der Komponenten | ✅ Ja, Inhalt ist mit jeder Komponente zusammengefasst | ❌ Nein | ❌ Nein |
TypeScript-Integration | ✅ Fortgeschritten, automatisch generierte strenge Typen | ✅ Gut | ⚠️ Grundlegend |
Erkennung fehlender Übersetzungen | ✅ TypeScript-Fehlerhervorhebung und Fehler-/Warnmeldung zur Build-Zeit | ⚠️ Laufzeit-Fallback | ⚠️ Laufzeit-Fallback |
Reicher Inhalt (JSX/Markdown/Komponenten) | ✅ Direkte Unterstützung | ❌ Nicht für komplexe Knoten ausgelegt | ⚠️ Eingeschränkt |
KI-gestützte Übersetzung | ✅ Ja, unterstützt mehrere KI-Anbieter. Nutzbar mit eigenen API-Schlüsseln. Berücksichtigt den Kontext Ihrer Anwendung und den Umfang des Inhalts | ❌ Nein | ❌ Nein |
Visueller Editor | ✅ Ja, lokaler visueller Editor + optionales CMS; kann Codebasis-Inhalte auslagern; einbettbar | ❌ Nein / verfügbar über externe Lokalisierungsplattformen | ❌ Nein / verfügbar über externe Lokalisierungsplattformen |
Lokalisierte Routenführung | ✅ Ja, unterstützt lokalisierte Pfade direkt (funktioniert mit Next.js & Vite) | ✅ Eingebaut, App Router unterstützt [locale] Segment | ✅ Eingebaut |
Dynamische Routen-Generierung | ✅ Ja | ✅ Ja | ✅ Ja |
Pluralisierung | ✅ Aufzählungsbasierte Muster | ✅ Gut | ✅ Gut |
Formatierung (Daten, Zahlen, Währungen) | ✅ Optimierte Formatierer (Intl im Hintergrund) | ✅ Gut (Intl-Helfer) | ✅ Gut (Intl-Helfer) |
Inhaltsformat | ✅ .tsx, .ts, .js, .json, .md, .txt, (.yaml in Arbeit) | ✅ .json, .js, .ts | ⚠️ .json |
ICU-Unterstützung | ⚠️ In Arbeit | ✅ Ja | ⚠️ Über Plugin (i18next-icu) |
SEO-Helfer (hreflang, Sitemap) | ✅ Eingebaute Werkzeuge: Helfer für Sitemap, robots.txt, Metadaten | ✅ Gut | ✅ Gut |
Ökosystem / Community | ⚠️ Kleiner, wächst aber schnell und ist reaktiv | ✅ Gut | ✅ Gut |
Server-seitiges Rendering & Server-Komponenten | ✅ Ja, optimiert für SSR / React Server-Komponenten | ⚠️ Auf Seitenebene unterstützt, aber t-Funktionen müssen im Komponentenbaum an untergeordnete Server-Komponenten weitergegeben werden | ⚠️ Auf Seitenebene unterstützt, aber t-Funktionen müssen im Komponentenbaum an untergeordnete Server-Komponenten weitergegeben werden |
Tree-shaking (nur verwendeten Inhalt laden) | ✅ Ja, pro Komponente zur Build-Zeit über Babel/SWC-Plugins | ⚠️ Teilweise | ⚠️ Teilweise |
Lazy Loading | ✅ Ja, pro Sprache / pro Wörterbuch | ✅ Ja (pro Route/pro Sprache), benötigt Namespace-Verwaltung | ✅ Ja (pro Route/pro Sprache), benötigt Namespace-Verwaltung |
Bereinigung ungenutzter Inhalte | ✅ Ja, pro Wörterbuch zur Build-Zeit | ❌ Nein, kann manuell mit Namespace-Verwaltung gehandhabt werden | ❌ Nein, kann manuell mit Namespace-Verwaltung gehandhabt werden |
Verwaltung großer Projekte | ✅ Fördert Modularität, geeignet für Design-Systeme | ✅ Modular mit Setup | ✅ Modular mit Setup |
Testen fehlender Übersetzungen (CLI/CI) | ✅ CLI: npx intlayer content test (CI-freundliches Audit) | ⚠️ Nicht eingebaut; Dokumentation empfiehlt npx @lingual/i18n-check | ⚠️ Nicht eingebaut; verlässt sich auf i18next-Tools / Laufzeit saveMissing |
Einführung
Next.js bietet integrierte Unterstützung für internationalisierte Routen (z.B. Lokalisierungssegmente). Diese Funktion übernimmt jedoch nicht automatisch die Übersetzungen. Sie benötigen weiterhin eine Bibliothek, um lokalisierten Inhalt für Ihre Nutzer darzustellen.
Es gibt viele i18n-Bibliotheken, aber in der Next.js-Welt gewinnen heute drei an Bedeutung: next-i18next, next-intl und Intlayer.
Architektur & Skalierbarkeit
- next-intl / next-i18next: Standardmäßig zentralisierte Kataloge pro Locale (plus Namespaces in i18next). Funktioniert anfangs gut, wird aber oft zu einer großen gemeinsamen Oberfläche mit zunehmender Kopplung und Schlüsselwechsel.
- Intlayer: Fördert pro-Komponenten (oder pro-Feature) Wörterbücher, die am selben Ort wie der zugehörige Code liegen. Dies reduziert die kognitive Belastung, erleichtert die Duplizierung/Migration von UI-Teilen und verringert Konflikte zwischen Teams. Unbenutzter Inhalt ist so natürlicherweise leichter zu erkennen und zu entfernen.
Warum das wichtig ist: In großen Codebasen oder Design-System-Setups skaliert modularer Inhalt besser als monolithische Kataloge.
Bundle-Größen & Abhängigkeiten
Nach dem Erstellen der Anwendung ist das Bundle das JavaScript, das der Browser zum Rendern der Seite lädt. Die Bundle-Größe ist daher wichtig für die Anwendungsleistung.
Zwei Komponenten sind im Kontext eines mehrsprachigen Anwendungs-Bundles wichtig:
- Der Anwendungscode
- Der vom Browser geladene Inhalt
Anwendungscode
Die Bedeutung des Anwendungscodes ist in diesem Fall minimal. Alle drei Lösungen sind tree-shakable, was bedeutet, dass ungenutzte Teile des Codes nicht im Bundle enthalten sind.
Hier ist ein Vergleich der JavaScript-Bundle-Größe, die der Browser für eine mehrsprachige Anwendung mit den drei Lösungen lädt.
Wenn wir keinen Formatter in der Anwendung benötigen, ist die Liste der exportierten Funktionen nach dem Tree-Shaking wie folgt:
- next-intlayer: useIntlayer, useLocale, NextIntlClientProvider, (Paketgröße ist 180,6 kB -> 78,6 kB (gzip))
- next-intl: useTranslations, useLocale, NextIntlClientProvider, (Paketgröße ist 101,3 kB -> 31,4 kB (gzip))
- next-i18next: useTranslation, useI18n, I18nextProvider, (Paketgröße ist 80,7 kB -> 25,5 kB (gzip))
Diese Funktionen sind nur Wrapper um den React-Kontext/-Status, daher ist der Gesamteinfluss der i18n-Bibliothek auf die Paketgröße minimal.
Intlayer ist etwas größer als next-intl und next-i18next, da es mehr Logik in der Funktion useIntlayer enthält. Dies hängt mit der Integration von Markdown und intlayer-editor zusammen.
Inhalt und Übersetzungen
Dieser Teil wird von Entwicklern oft ignoriert, aber betrachten wir den Fall einer Anwendung, die aus 10 Seiten in 10 Sprachen besteht. Nehmen wir zur Vereinfachung der Berechnung an, dass jede Seite zu 100 % einzigartigen Inhalt enthält (in Wirklichkeit ist viel Inhalt zwischen den Seiten redundant, z. B. Seitentitel, Kopfzeile, Fußzeile usw.).
Ein Benutzer, der die Seite /fr/about besuchen möchte, lädt den Inhalt einer Seite in einer bestimmten Sprache. Das Ignorieren der Inhaltsoptimierung würde bedeuten, dass unnötigerweise 8.200 % ((1 + (((10 Seiten - 1) × (10 Sprachen - 1)))) × 100) des Anwendungsinhalts geladen werden. Sehen Sie das Problem? Selbst wenn dieser Inhalt nur Text ist und Sie wahrscheinlich eher daran denken, die Bilder Ihrer Website zu optimieren, senden Sie unnötigen Inhalt über den Globus und lassen die Computer der Benutzer ihn umsonst verarbeiten.
Zwei wichtige Probleme:
Aufteilung nach Route:
Wenn ich mich auf der Seite /about befinde, möchte ich nicht den Inhalt der Seite /home laden.
Aufteilung nach Sprache:
Wenn ich mich auf der Seite /fr/about befinde, möchte ich nicht den Inhalt der Seite /en/about laden.
Alle drei Lösungen sind sich dieser Probleme bewusst und ermöglichen die Verwaltung dieser Optimierungen. Der Unterschied zwischen den drei Lösungen liegt in der DX (Developer Experience).
next-intl und next-i18next verwenden einen zentralisierten Ansatz zur Verwaltung von Übersetzungen, der es erlaubt, JSON-Dateien nach Sprache und Unterdateien aufzuteilen. In next-i18next nennen wir die JSON-Dateien „Namespaces“; next-intl erlaubt das Deklarieren von Nachrichten. In intlayer nennen wir die JSON-Dateien „Dictionaries“.
- Im Fall von next-intl, ähnlich wie bei next-i18next, wird der Inhalt auf Seiten-/Layout-Ebene geladen, und dieser Inhalt wird dann in einen Context-Provider geladen. Das bedeutet, dass der Entwickler die JSON-Dateien, die für jede Seite geladen werden sollen, manuell verwalten muss.
In der Praxis bedeutet dies, dass Entwickler diese Optimierung oft überspringen und es vorziehen, aus Einfachheitsgründen den gesamten Inhalt im Context-Provider der Seite zu laden.
- Im Fall von intlayer wird der gesamte Inhalt in der Anwendung geladen. Anschließend kümmert sich ein Plugin (@intlayer/babel / @intlayer/swc) darum, das Bundle zu optimieren, indem nur der auf der Seite verwendete Inhalt geladen wird. Der Entwickler muss daher die zu ladenden Wörterbücher nicht manuell verwalten. Dies ermöglicht eine bessere Optimierung, bessere Wartbarkeit und reduziert die Entwicklungszeit.
Da die Anwendung wächst (insbesondere wenn mehrere Entwickler an der Anwendung arbeiten), ist es üblich, dass vergessen wird, nicht mehr verwendete Inhalte aus den JSON-Dateien zu entfernen.
Beachten Sie, dass in allen Fällen (next-intl, next-i18next, intlayer) alle JSON-Dateien geladen werden.
Deshalb ist der Ansatz von Intlayer leistungsfähiger: Wenn eine Komponente nicht mehr verwendet wird, wird ihr Wörterbuch nicht im Bundle geladen.
Wie die Bibliothek mit Fallbacks umgeht, ist ebenfalls wichtig. Nehmen wir an, die Anwendung ist standardmäßig auf Englisch eingestellt und der Benutzer besucht die Seite /fr/about. Wenn Übersetzungen auf Französisch fehlen, wird der englische Fallback berücksichtigt.
Im Fall von next-intl und next-i18next erfordert die Bibliothek das Laden der JSON-Dateien, die sowohl zur aktuellen Locale als auch zur Fallback-Locale gehören. Somit lädt jede Seite, vorausgesetzt alle Inhalte sind übersetzt, 100 % unnötigen Inhalt. Im Vergleich dazu verarbeitet intlayer das Fallback bereits zur Build-Zeit des Wörterbuchs. Dadurch lädt jede Seite nur den tatsächlich genutzten Inhalt.
Hier ein Beispiel für die Auswirkung der Bundle-Größenoptimierung mit intlayer in einer vite + react Anwendung:
Optimiertes Bundle | Nicht optimiertes Bundle |
---|---|
![]() | ![]() |
TypeScript & Sicherheit
next-intl
- Solide TypeScript-Unterstützung, aber Schlüssel sind standardmäßig nicht strikt typisiert; Sicherheitsmuster müssen manuell gepflegt werden.
next-i18next
- Basis-Typen für Hooks; strikte Schlüsseltypisierung erfordert zusätzliche Werkzeuge/Konfiguration.
intlayer
- Erzeugt strenge Typen aus Ihrem Inhalt. IDE-Autovervollständigung und Kompilierzeit-Fehler erkennen Tippfehler und fehlende Schlüssel vor der Bereitstellung.
Warum das wichtig ist: Starke Typisierung verschiebt Fehler nach links (CI/Build) statt nach rechts (Laufzeit).
Umgang mit fehlenden Übersetzungen
next-intl
- Verwendet Fallbacks zur Laufzeit (z. B. Anzeige des Schlüssels oder der Standardsprache). Der Build schlägt nicht fehl.
next-i18next
- Verwendet Fallbacks zur Laufzeit (z. B. Anzeige des Schlüssels oder der Standardsprache). Der Build schlägt nicht fehl.
intlayer
- Erkennung zur Build-Zeit mit Warnungen/Fehlern bei fehlenden Sprachen oder Schlüsseln.
Warum das wichtig ist: Das Erkennen von Lücken während des Builds verhindert „mysteriöse Strings“ in der Produktion und entspricht strengen Release-Gates.
Routing, Middleware & URL-Strategie
next-intl
- Funktioniert mit Next.js lokalisiertem Routing im App Router.
next-i18next
- Funktioniert mit Next.js lokalisiertem Routing im App Router.
intlayer
- Alles Genannte, plus i18n Middleware (Locale-Erkennung über Header/Cookies) und Hilfsmittel zur Generierung lokalisierter URLs und <link rel="alternate" hreflang="…"> Tags.
Warum es wichtig ist: Weniger benutzerdefinierte Verbindungs-Schichten; konsistente Benutzererfahrung (UX) und sauberes SEO über alle Sprachen hinweg.
Ausrichtung auf Server Components (RSC)
next-intl
- Unterstützt Next.js 13+. Erfordert oft das Weiterreichen von t-Funktionen/Formatierern durch Komponentenbäume in hybriden Setups.
next-i18next
- Unterstützt Next.js 13+. Ähnliche Einschränkungen beim Weitergeben von Übersetzungswerkzeugen über Grenzen hinweg.
intlayer
- Unterstützt Next.js 13+ und erleichtert die Server/Client-Grenze mit einer konsistenten API und RSC-orientierten Providern, wodurch das Hin- und Herschicken von Formatierern oder t-Funktionen vermieden wird.
Warum es wichtig ist: Klareres mentales Modell und weniger Randfälle in hybriden Bäumen.
DX, Tools & Wartung
next-intl
- Wird häufig mit externen Lokalisierungsplattformen und redaktionellen Workflows kombiniert.
next-i18next
- Wird häufig mit externen Lokalisierungsplattformen und redaktionellen Workflows kombiniert.
intlayer
- Bietet einen kostenlosen Visual Editor und ein optionales CMS (Git-freundlich oder externalisiert) sowie eine VSCode-Erweiterung und KI-unterstützte Übersetzungen mit Ihren eigenen Anbieter-Schlüsseln.
Warum das wichtig ist: Senkt die Betriebskosten und verkürzt den Kommunikationszyklus zwischen Entwicklern und Inhaltserstellern.
Integration mit Lokalisierungsplattformen (TMS)
Große Organisationen verlassen sich oft auf Translation Management Systeme (TMS) wie Crowdin, Phrase, Lokalise, Localizely oder Localazy.
Warum Unternehmen das wichtig finden
- Zusammenarbeit & Rollen: Mehrere Akteure sind beteiligt: Entwickler, Produktmanager, Übersetzer, Prüfer, Marketingteams.
- Skalierung & Effizienz: kontinuierliche Lokalisierung, kontextbezogene Überprüfung.
next-intl / next-i18next
- Verwenden typischerweise zentralisierte JSON-Kataloge, sodass der Export/Import mit TMS unkompliziert ist.
- Ausgereifte Ökosysteme und Beispiele/Integrationen für die oben genannten Plattformen.
Intlayer
- Fördert dezentralisierte, komponentenbezogene Wörterbücher und unterstützt TypeScript/TSX/JS/JSON/MD Inhalte.
- Dies verbessert die Modularität im Code, kann jedoch die Plug-and-Play-Integration von TMS erschweren, wenn ein Tool zentralisierte, flache JSON-Dateien erwartet.
- Intlayer bietet Alternativen: KI-unterstützte Übersetzungen (unter Verwendung eigener Anbieter-Schlüssel), einen Visuellen Editor/CMS und CLI/CI Workflows, um Lücken zu erkennen und vorab zu füllen.
Hinweis: next-intl und i18next akzeptieren ebenfalls TypeScript-Kataloge. Wenn Ihr Team Nachrichten in .ts-Dateien speichert oder diese nach Features dezentralisiert, können ähnliche Schwierigkeiten mit TMS auftreten. Viele next-intl-Setups bleiben jedoch zentralisiert in einem locales/-Ordner, was die Umwandlung in JSON für TMS etwas erleichtert.
Entwicklererfahrung
Dieser Abschnitt bietet einen tiefgehenden Vergleich der drei Lösungen. Anstatt einfache Fälle zu betrachten, wie sie in der „Erste Schritte“-Dokumentation jeder Lösung beschrieben sind, betrachten wir einen realen Anwendungsfall, der einem echten Projekt ähnlicher ist.
App-Struktur
Die App-Struktur ist wichtig, um eine gute Wartbarkeit Ihres Codes sicherzustellen.
.├── locales│ ├── en│ │ ├── home.json│ │ └── navbar.json│ ├── fr│ │ ├── home.json│ │ └── navbar.json│ └── es│ ├── home.json│ └── navbar.json├── i18n.ts└── src ├── middleware.ts ├── app │ └── home.tsx └── components └── Navbar └── index.tsx
Vergleich
- next-intl / next-i18next: Zentralisierte Kataloge (JSON; Namespaces/Nachrichten). Klare Struktur, gute Integration mit Übersetzungsplattformen, kann jedoch bei wachsender App zu mehr Datei-übergreifenden Änderungen führen.
- Intlayer: Pro-Komponenten .content.{ts|js|json} Wörterbücher, die direkt bei den Komponenten liegen. Einfachere Wiederverwendung von Komponenten und lokale Nachvollziehbarkeit; fügt Dateien hinzu und setzt auf Build-Zeit-Tools.
Einrichtung und Laden von Inhalten
Wie bereits erwähnt, müssen Sie optimieren, wie jede JSON-Datei in Ihren Code importiert wird. Wie die Bibliothek das Laden von Inhalten handhabt, ist wichtig.
Kopieren Sie den Code in die Zwischenablage
import { getRequestConfig } from "next-intl/server";import { notFound } from "next/navigation";// Kann aus einer gemeinsamen Konfiguration importiert werdenconst locales = ["en", "fr", "es"];export default getRequestConfig(async ({ locale }) => { // Überprüfen Sie, ob der eingehende `locale`-Parameter gültig ist if (!locales.includes(locale as any)) notFound(); return { messages: (await import(`../messages/${locale}.json`)).default, };});
Kopieren Sie den Code in die Zwischenablage
import { NextIntlClientProvider } from "next-intl";import { getMessages, unstable_setRequestLocale } from "next-intl/server";import pick from "lodash/pick";export default async function LocaleLayout({ children, params,}: { children: React.ReactNode; params: { locale: string };}) { const { locale } = params; // Setze die aktive Anfragelocale für dieses Server-Rendering (RSC) unstable_setRequestLocale(locale); // Nachrichten werden serverseitig über src/i18n/request.ts geladen // (siehe next-intl Dokumentation). Hier senden wir nur einen Teil an den Client, // der für Client-Komponenten benötigt wird (Payload-Optimierung). const messages = await getMessages(); const clientMessages = pick(messages, ["common", "about"]); return ( <html lang={locale}> <body> <NextIntlClientProvider locale={locale} messages={clientMessages}> {children} </NextIntlClientProvider> </body> </html> );}
Kopieren Sie den Code in die Zwischenablage
import { getTranslations } from "next-intl/server";import { ClientComponent, ServerComponent } from "@components";export default async function LandingPage({ params,}: { params: { locale: string };}) { // Streng serverseitiges Laden (nicht auf den Client hydriert) const t = await getTranslations("about"); return ( <main> <h1>{t("title")}</h1> <ClientComponent /> <ServerComponent /> </main> );}
Vergleich
Alle drei unterstützen das Laden von Inhalten und Providern pro Locale.
Mit next-intl/next-i18next laden Sie typischerweise ausgewählte Nachrichten/Namensräume pro Route und platzieren Provider dort, wo sie benötigt werden.
Mit Intlayer wird eine Build-Zeit-Analyse hinzugefügt, um die Nutzung abzuleiten, was manuelle Verkabelung reduzieren und möglicherweise einen einzigen Root-Provider ermöglichen kann.
Wählen Sie je nach Teampräferenz zwischen expliziter Kontrolle und Automatisierung.
Verwendung in einer Client-Komponente
Nehmen wir ein Beispiel einer Client-Komponente, die einen Zähler rendert.
Übersetzungen (Struktur wiederverwendet; laden Sie sie in die next-intl-Nachrichten, wie Sie möchten)
Kopieren Sie den Code in die Zwischenablage
{ "counter": { "label": "Counter", "increment": "Increment" }}
Kopieren Sie den Code in die Zwischenablage
{ "counter": { "label": "Compteur", "increment": "Incrémenter" }}
Client-Komponente
Kopieren Sie den Code in die Zwischenablage
"use client";import React, { useState } from "react";import { useTranslations, useFormatter } from "next-intl";const ClientComponentExample = () => { // Direkt auf das verschachtelte Objekt zugreifen const t = useTranslations("about.counter"); const format = useFormatter(); const [count, setCount] = useState(0); return ( <div> <p>{format.number(count)}</p> <button aria-label={t("label")} onClick={() => setCount((count) => count + 1)} > {t("increment")} </button> </div> );};
Vergessen Sie nicht, die "about"-Nachricht auf der Client-Seite der Seite hinzuzufügen
Vergleich
Zahlenformatierung
- next-i18next: kein useNumber; verwendet Intl.NumberFormat (oder i18next-icu).
- next-intl: useFormatter().number(value).
- Intlayer: integriertes useNumber().
Schlüssel
- Behalte eine verschachtelte Struktur bei (about.counter.label) und passe deinen Hook entsprechend an (useTranslation("about") + t("counter.label") oder useTranslations("about.counter") + t("label")).
Dateiablagen
- next-i18next erwartet JSON in public/locales/{lng}/{ns}.json.
- next-intl ist flexibel; lade Nachrichten wie du es konfigurierst.
- Intlayer speichert Inhalte in TS/JS Wörterbüchern und löst sie über Schlüssel auf.
Verwendung in einer Server-Komponente
Wir betrachten den Fall einer UI-Komponente. Diese Komponente ist eine Server-Komponente und sollte als Kind einer Client-Komponente eingefügt werden können. (Seite (Server-Komponente) -> Client-Komponente -> Server-Komponente). Da diese Komponente als Kind einer Client-Komponente eingefügt werden kann, darf sie nicht asynchron sein.
Kopieren Sie den Code in die Zwischenablage
type ServerComponentProps = { count: number; t: (key: string) => string;};const ServerComponent = ({ t, count }: ServerComponentProps) => { const formatted = new Intl.NumberFormat(i18n.language).format(count); return ( <div> <p>{formatted}</p> <button aria-label={t("label")}>{t("increment")}</button> </div> );};
Da die Server-Komponente nicht asynchron sein kann, müssen Sie die Übersetzungen und die Formatierungsfunktion als Props übergeben.
- const t = await getTranslations("about.counter");
- const format = await getFormatter();
Intlayer stellt server-sichere Hooks über next-intlayer/server bereit. Damit sie funktionieren, verwenden useIntlayer und useNumber eine hook-ähnliche Syntax, ähnlich wie die Client-Hooks, basieren aber im Hintergrund auf dem Server-Kontext (IntlayerServerProvider).
Metadaten / Sitemap / Robots
Inhalte zu übersetzen ist großartig. Aber oft wird vergessen, dass das Hauptziel der Internationalisierung darin besteht, Ihre Website für die Welt sichtbarer zu machen. I18n ist ein unglaublicher Hebel, um die Sichtbarkeit Ihrer Website zu verbessern.
Hier ist eine Liste von Best Practices bezüglich mehrsprachigem SEO.
- Setzen Sie hreflang-Meta-Tags im <head>-Tag > Dies hilft Suchmaschinen zu verstehen, welche Sprachen auf der Seite verfügbar sind
- Listen Sie alle Seitenübersetzungen in der sitemap.xml unter Verwendung des XML-Schemas http://www.w3.org/1999/xhtml auf >
- Vergessen Sie nicht, vorangestellte Seiten in der robots.txt auszuschließen (z. B. /dashboard sowie /fr/dashboard, /es/dashboard) >
- Verwenden Sie eine benutzerdefinierte Link-Komponente, um auf die am besten lokalisierte Seite weiterzuleiten (z. B. auf Französisch <a href="/fr/about">A propos</a>) >
Entwickler vergessen oft, ihre Seiten über verschiedene Sprachversionen hinweg korrekt zu referenzieren.
Kopieren Sie den Code in die Zwischenablage
import type { Metadata } from "next";import { locales, defaultLocale } from "@/i18n";import { getTranslations } from "next-intl/server";function localizedPath(locale: string, path: string) { return locale === defaultLocale ? path : "/" + locale + path;}export async function generateMetadata({ params,}: { params: { locale: string };}): Promise<Metadata> { const { locale } = params; const t = await getTranslations({ locale, namespace: "about" }); const url = "/about"; const languages = Object.fromEntries( locales.map((locale) => [locale, localizedPath(locale, url)]) ); return { title: t("title"), description: t("description"), alternates: { canonical: localizedPath(locale, url), languages: { ...languages, "x-default": url }, }, };}// ... Restlicher Seiten-Code
Kopieren Sie den Code in die Zwischenablage
import type { MetadataRoute } from "next";import { locales, defaultLocale } from "@/i18n";const origin = "https://example.com";const formatterLocalizedPath = (locale: string, path: string) => locale === defaultLocale ? origin + path : origin + "/" + locale + path;export default function sitemap(): MetadataRoute.Sitemap { const aboutLanguages = Object.fromEntries( locales.map((l) => [l, formatterLocalizedPath(l, "/about")]) ); return [ { url: formatterLocalizedPath(defaultLocale, "/about"), lastModified: new Date(), changeFrequency: "monatlich", priority: 0.7, alternates: { languages: aboutLanguages }, }, ];}
Kopieren Sie den Code in die Zwischenablage
import type { MetadataRoute } from "next";import { locales, defaultLocale } from "@/i18n";const origin = "https://example.com";const withAllLocales = (path: string) => [ path, ...locales .filter((locale) => locale !== defaultLocale) .map((locale) => "/" + locale + path),];export default function robots(): MetadataRoute.Robots { const disallow = [ ...withAllLocales("/dashboard"), ...withAllLocales("/admin"), ]; return { rules: { userAgent: "*", allow: ["/"], disallow }, host: origin, sitemap: origin + "/sitemap.xml", };}
Intlayer stellt eine getMultilingualUrls-Funktion bereit, um mehrsprachige URLs für Ihre Sitemap zu generieren.
Und der Gewinner ist…
Es ist nicht einfach. Jede Option hat ihre Vor- und Nachteile. So sehe ich das:
next-intl
- am einfachsten, leichtgewichtig, weniger Entscheidungen, die dir aufgezwungen werden. Wenn du eine minimale Lösung möchtest, mit zentralisierten Katalogen zurechtkommst und deine App klein bis mittelgroß ist.
next-i18next
- ausgereift, vollgepackt mit Funktionen, viele Community-Plugins, aber höherer Einrichtungsaufwand. Wenn du das Plugin-Ökosystem von i18next benötigst (z. B. erweiterte ICU-Regeln über Plugins) und dein Team i18next bereits kennt, und du mehr Konfiguration für Flexibilität akzeptierst.
Intlayer
- entwickelt für modernes Next.js, mit modularen Inhalten, Typsicherheit, Werkzeugen und weniger Boilerplate. Wenn Sie komponentenbezogene Inhalte, striktes TypeScript, Build-Zeit-Garantien, Tree-Shaking und batteriebetriebene Routing/SEO/Editor-Werkzeuge schätzen – besonders für den Next.js App Router, Design-Systeme und große, modulare Codebasen.
Wenn Sie eine minimale Einrichtung bevorzugen und etwas manuelle Verkabelung akzeptieren, ist next-intl eine gute Wahl. Wenn Sie alle Funktionen benötigen und Komplexität kein Problem ist, funktioniert next-i18next. Aber wenn Sie eine moderne, skalierbare, modulare Lösung mit integrierten Werkzeugen wollen, zielt Intlayer darauf ab, Ihnen genau das sofort bereitzustellen.
Alternative für Enterprise-Teams: Wenn Sie eine bewährte Lösung benötigen, die perfekt mit etablierten Lokalisierungsplattformen wie Crowdin, Phrase oder anderen professionellen Übersetzungsmanagementsystemen zusammenarbeitet, sollten Sie next-intl oder next-i18next wegen ihres ausgereiften Ökosystems und bewährten Integrationen in Betracht ziehen.
Zukünftige Roadmap: Intlayer plant außerdem die Entwicklung von Plugins, die auf den i18next- und next-intl-Lösungen aufbauen. Dies bietet Ihnen die Vorteile von Intlayer für Automatisierung, Syntax und Inhaltsverwaltung, während die Sicherheit und Stabilität dieser etablierten Lösungen in Ihrem Anwendungscode erhalten bleibt.
GitHub-STARS
GitHub-Sterne sind ein starkes Indiz für die Popularität eines Projekts, das Vertrauen der Community und die langfristige Relevanz. Obwohl sie kein direktes Maß für die technische Qualität sind, spiegeln sie wider, wie viele Entwickler das Projekt nützlich finden, seinen Fortschritt verfolgen und es wahrscheinlich übernehmen werden. Zur Einschätzung des Werts eines Projekts helfen Sterne dabei, die Resonanz im Vergleich zu Alternativen zu vergleichen und Einblicke in das Wachstum des Ökosystems zu geben.
Fazit
Alle drei Bibliotheken sind im Kern der Lokalisierung erfolgreich. Der Unterschied liegt darin, wie viel Arbeit Sie investieren müssen, um eine robuste, skalierbare Einrichtung in modernem Next.js zu erreichen:
- Mit Intlayer sind modularer Inhalt, striktes TypeScript, Build-Zeit-Sicherheit, tree-shaken Bundles und erstklassiger App Router + SEO-Tools Standard, nicht lästige Pflicht.
- Wenn Ihr Team Wartbarkeit und Geschwindigkeit in einer mehrsprachigen, komponentenbasierten Anwendung schätzt, bietet Intlayer heute die vollständigste Erfahrung.
Weitere Details finden Sie im Dokument 'Warum Intlayer?'.