Leitfaden zur Next.js-Lokalisierung

Next.js-Lokalisierung für App Router und Pages Router

Erstellen Sie sprachspezifische Routen, laden Sie Nachrichten effizient in Server und Client Components, vergleichen Sie next-intl mit next-i18next und veröffentlichen Sie crawlbare lokalisierte Seiten mit korrekten Metadaten.

Die Grundlage einer lokalisierten Next.js-Anwendung

Next.js ist eine starke Grundlage für mehrsprachige Websites, da es nützliches HTML rendern kann, bevor der Browser Anwendungs-JavaScript ausführt. Statische Generierung eignet sich gut für Produktseiten und Dokumentation; dynamisches Rendering kann kontospezifische oder häufig wechselnde Inhalte bereitstellen. Keiner der beiden Rendering-Modi erzeugt von selbst eine Lokalisierungsstrategie. Sie benötigen weiterhin sprachspezifische Routen, Kataloge, Formatierungsregeln und einen Übersetzungsworkflow.

Die erste Architekturentscheidung betrifft den Router. Der App Router verwendet Layouts, Server Components und Routensegmente. Sein offizielles Lokalisierungsmuster legt die Sprache in einem dynamischen Segment der obersten Ebene wie app/[lang] ab. Der Pages Router besitzt eine separate i18n-Konfiguration, die Unterpfad- oder Domain-Routing hinzufügen und Sprachdaten für Seiten bereitstellen kann. Diese Systeme sollten nicht als austauschbar beschrieben werden.

Machen Sie die Sprache zu einem validierten Anwendungskonzept, statt beliebigen URL-Text an Katalogimporte zu übergeben. Pflegen Sie eine einzige Liste unterstützter Sprachen mit Sprachcode, Anzeigename, Textrichtung und Fallback. Verwenden Sie diese Liste, um Routen zu generieren, eine Sprachauswahl zu erstellen, Kataloge auszuwählen und Metadaten auszugeben. Eine Anfrage für eine nicht unterstützte Sprache sollte vorhersehbar zu einer Nicht-gefunden-Antwort oder einem bewusst gewählten Fallback führen.

  • Eine stabile URL für jede Sprache und Inhaltsseite
  • Eine Katalogladegrenze, die auf dem Server funktioniert
  • Eine durchdachte Richtlinie für Erkennung, Fallback und Wechsel
  • Lokalisierte Metadaten und Signale für alternative Seiten für Crawler

Eine Strategie für sprachspezifisches Routing wählen

Unterpfad-Routing gibt jeder Sprache eine sichtbare URL wie /en/pricing und /fr/pricing. Es funktioniert auf einer einzigen Domain, lässt sich einfach testen und macht den Sprachwechsel zu einer Pfadtransformation. Domain-Routing wie example.fr kann marktspezifisches Branding oder rechtliche Anforderungen unterstützen, verursacht aber zusätzlichen Aufwand für DNS, Bereitstellung, Analysen und Kanonisierung. Wählen Sie Domains aus Produktgründen und nicht, weil die Lokalisierung sie erfordert.

Legen Sie im App Router alle lokalisierten Seiten unter app/[locale] ab. Ein Proxy kann den Pfadnamen, ein Cookie oder den Accept-Language-Header zur Anfragezeit prüfen und eine neutrale Einstiegs-URL zu einer Sprache weiterleiten. Next.js 16 hat middleware.ts in proxy.ts umbenannt, ältere Anwendungen verwenden jedoch weiterhin den Namen middleware. Betrachten Sie die Erkennung als Komfortfunktion: Jede lokalisierte URL muss direkt erreichbar bleiben, und die Sprachauswahl sollte gewöhnliche crawlbare Links verwenden.

Ein rein statischer Export kann keinen Proxy ausführen, keine Anfrage-Cookies lesen und keine Weiterleitungen zur Anfragezeit vornehmen. Zählen Sie für output: 'export' die Sprachsegmente mit generateStaticParams auf und stellen Sie einen statischen Einstieg bereit, etwa eine Startseite in der Standardsprache oder eine sichtbare Sprachauswahl. Versprechen Sie keine automatische Erkennung der Browsersprache in einer Umgebung ohne Anfrage-Laufzeit.

Die i18n-Option in next.config.js des Pages Routers unterstützt in bereitgestellten Next.js-Anwendungen sprachspezifische Unterpfade und Domains. Sie ist nicht mit output: 'export' kompatibel. Wenn ein Pages-Router-Projekt ausschließlich statische Dateien erzeugen muss, modellieren Sie die Sprache als explizites dynamisches Segment und generieren Sie diese Routen, statt das integrierte i18n-Feld zu aktivieren. Statische Generierung und statischer Export hängen zusammen, sind aber nicht derselbe Bereitstellungsmodus.

Eine sprachzentrierte App-Router-Struktur
app/
  [locale]/
    layout.tsx
    page.tsx
    pricing/
      page.tsx
messages/
  en.json
  fr.json
  de.json

next-intl vs. next-i18next vs. eigene Wörterbücher

Eine Bibliothek sollte wiederkehrende Infrastruktur reduzieren, ohne zu verschleiern, wie sprachspezifische URLs und Rendering funktionieren. Vergleichen Sie die Unterstützung Ihres Routers, das Laden von Nachrichten auf Server und Client, ICU- oder i18next-Syntax, statische Generierung, Routing-Hilfen und Extraktionswerkzeuge. Treffen Sie Ihre Wahl nicht allein anhand eines Einstiegsbeispiels: Lokalisierung betrifft Navigation, Metadaten, Fehler, Formulare und Hintergrundinhalte in der gesamten Anwendung.

next-intl und next-i18next unterstützen heute sowohl App Router als auch Pages Router, folgen jedoch unterschiedlichen Denkmodellen. next-intl stellt ICU-Nachrichten und Next.js-spezifisches Routing in den Mittelpunkt. next-i18next bringt das i18next-Ökosystem mit, einschließlich Namespaces, Detektoren, Loadern und vertrauten APIs im Stil von react-i18next. Ein eigener Wörterbuchansatz hat die kleinste Abstraktionsfläche, überträgt jedoch mehr Verantwortung an Ihre Codebasis.

Ansatz Routing Nachrichtenmodell Server Components Statische Generierung Am besten geeignet für
next-intl App Router bevorzugt; Pages Router unterstützt ICU-Nachrichten und Formatierer APIs für Server und Client Components Unterstützt mit statischen Sprachparametern Next.js-orientierte Anwendungen mit ICU
next-i18next App Router und Pages Router i18next-Schlüssel, Namespaces, optional ICU Server-APIs getT und Client-APIs useT Unterstützt bei expliziter Generierung der Sprachvarianten Teams mit bestehender i18next-Nutzung
Next.js + eigene Wörterbücher Explizite [locale]-Routen Gewählte JSON- oder Modulstruktur Direktes Laden in Server Components Ja, wenn die Routen aufzählbar sind Kleine Websites mit einfachen Nachrichten

Für eine neue App-Router-Anwendung mit anspruchsvollen Nachrichten und lokalisierter Navigation ist next-intl eine fokussierte Standardwahl. Für eine bestehende i18next-Organisation oder eine Anwendung, die mit anderen React-Oberflächen geteilt wird, kann next-i18next Katalog- und Plugin-Konventionen bewahren. Prüfen Sie vor einer Migration die versionsspezifische Einrichtung erneut: Beide Bibliotheken haben sich erheblich weiterentwickelt, während Next.js seine Server-APIs verändert hat.

Die reine Framework-Option ist sinnvoll, wenn der Katalog klein und die Nachrichten einfach sind und das Team bereit ist, Validierung und Extraktion selbst zu entwickeln. Das Laden eines Wörterbuchs in einer Server Component hält dessen Inhalt vom Client fern, Routing-Grundbausteine bieten jedoch weder Pluralsyntax noch Übersetzerkontext, Katalog-Linting oder Prüfworkflows. Fügen Sie diese Funktionen erst hinzu, wenn das Produkt sie benötigt, und kapseln Sie den Katalogzugriff hinter einer kleinen Schnittstelle.

Eine produktionsreife App-Router-Einrichtung

Die folgende Abfolge verwendet eine App-Router-Anwendung, da sie die Entscheidungen sichtbar macht, vor denen die meisten neuen Projekte stehen. Die genauen Importe unterscheiden sich je nach Bibliothek, doch die Grenzen bleiben gleich: Validieren Sie die Sprache an der Route, laden Sie Servernachrichten für diese Anfrage, stellen Sie nur das bereit, was Client Components benötigen, und generieren Sie bekannte Sprachen während des Builds, wenn die Seite statisch sein kann.

  1. Schritt 1

    Das sprachspezifische Routensegment hinzufügen

    Erstellen Sie app/[locale] und verschieben Sie lokalisierte Layouts und Seiten darunter. Validieren Sie Parameter anhand einer einzigen Liste unterstützter Sprachen und geben Sie für unbekannte Werte eine Nicht-gefunden-Antwort zurück.

  2. Schritt 2

    Spracherkennung und Fallback definieren

    Legen Sie fest, was bei einer URL ohne Sprache geschieht. Eine Anfrage-Laufzeit kann die Sprache aushandeln und weiterleiten; ein statischer Export benötigt eine deterministische Standardseite oder Sprachauswahl. Bewahren Sie stets den direkten Zugriff auf sprachspezifische URLs.

  3. Schritt 3

    Abgegrenzte Nachrichtenkataloge erstellen

    Ordnen Sie Nachrichten nach Produktbereich oder Route, statt die gesamte Anwendung in einer Datei abzulegen. Behalten Sie in allen Sprachen dieselbe Namespace-Struktur bei, validieren Sie fehlende Schlüssel in CI und vermeiden Sie es, alle Sprachen in eine Client Component zu importieren.

  4. Schritt 4

    Nachrichten auf dem Server laden

    Ermitteln Sie für jede Anfrage oder generierte Route genau einen validierten Katalog. Halten Sie Serverinstanzen anfragegebunden, wenn die Bibliothek den Status der aktiven Sprache speichert, damit parallele Anfragen keine Sprachauswahl untereinander übertragen.

  5. Schritt 5

    Server- und Client-Übersetzung trennen

    Übersetzen Sie standardmäßig in Server Components. Fügen Sie einen Provider oder Client-Hook nur über die kleinstmögliche interaktive Grenze hinzu, die ihn benötigt, und übergeben Sie übersetzte Beschriftungen als Props, wenn dies einfacher ist.

  6. Schritt 6

    Sprachvarianten generieren

    Geben Sie aus generateStaticParams für statische Seiten jede unterstützte Sprache zurück. Dynamische Inhalte benötigen möglicherweise zusätzlich Kombinationen aus Slug und Sprache. Führen Sie einen erneuten Build aus, wenn sich Kataloge oder die Sprachenliste ändern.

Nachrichten in einem sprachspezifischen Layout laden
import {NextIntlClientProvider} from 'next-intl';
import {getMessages} from 'next-intl/server';

export default async function LocaleLayout({children, params}: Props) {
  const {locale} = await params;
  const messages = await getMessages();

  return (
    <html lang={locale}>
      <body>
        <NextIntlClientProvider messages={messages}>
          {children}
        </NextIntlClientProvider>
      </body>
    </html>
  );
}
Für jede Sprache einen Routenbaum generieren
const locales = ['en', 'fr', 'de'] as const;

export function generateStaticParams() {
  return locales.map((locale) => ({locale}));
}

Das oberste Sprachlayout sollte für sprachübergreifende Belange verantwortlich sein: Parameter validieren, den Katalog laden, html lang und dir setzen und gegebenenfalls einen Client-Provider einrichten. Seiten sollten Nachrichten nach Namespace anfordern und nicht wissen müssen, wo Kataloge gespeichert sind. Diese Trennung ermöglicht es, lokale JSON-Importe durch einen Download zur Build-Zeit oder einen CDN-gestützten Workflow zu ersetzen, ohne jede Komponente umzuschreiben.

Übertragen Sie beim Pages Router dieselben Verantwortlichkeiten auf das sprachspezifische Routing in next.config.js, das Laden von Nachrichten mit getStaticProps oder getServerSideProps und getStaticPaths für dynamische lokalisierte Seiten. Die Router-APIs unterscheiden sich, Katalog- und Komponentenebenen können jedoch einheitlich bleiben. Unterstützen Sie während einer Migration beide Router bewusst und prüfen Sie, dass die Navigation das Sprachpräfix nie verliert.

Formatierung, Pluralformen und Rechts-nach-links-Layouts

Formatierung gehört zur Übersetzung, ist aber nicht dieselbe Aufgabe. Nachrichten erklären, was ein Wert bedeutet; sprachspezifische Formatierer bestimmen, wie Datum, Zahl, Währung, relative Zeit oder Liste dargestellt werden. Integrationen von next-intl und i18next stellen Formatierungshilfen bereit, während eine eigene Wörterbuchebene direkt die Intl-APIs der Plattform aufrufen kann. Behalten Sie Rohdaten für Datums- und Zahlenwerte bis zur Rendering-Grenze bei, damit ein Quellwert in jeder Sprache korrekt dargestellt werden kann.

Pluralregeln gehören ebenfalls zur Zielsprache und nicht in eine englische Bedingung für Singular oder Plural. ICU-Nachrichten können Kategorien wie one, few, many und other auswählen. i18next ordnet Zählwerte über Intl.PluralRules zu. Übergeben Sie in beiden Fällen den numerischen Wert an die Nachricht und lassen Sie die Bibliothek die grammatische Form auswählen. Hängen Sie kein übersetztes Substantiv an eine formatierte Zahl an.

Setzen Sie das Attribut html lang anhand der validierten Routensprache und dir bei von rechts nach links geschriebenen Schriften auf rtl. Die Sprache legt in HTML nicht automatisch die Schreibrichtung fest. Machen Sie die Richtung daher zu einer expliziten Eigenschaft Ihrer Sprachkonfiguration. Spiegeln Sie richtungsabhängige Abstände und Symbole, wenn deren Bedeutung von der Richtung abhängt, und verwenden Sie logische CSS-Eigenschaften, damit sich Layouts ohne zweites Stylesheet anpassen.

Lokalisierte Metadaten und alternative Links generieren
export async function generateMetadata({params}: Props) {
  const {locale} = await params;
  const t = await getTranslations({locale, namespace: 'Metadata'});

  return {
    title: t('title'),
    description: t('description'),
    alternates: {
      canonical: `https://example.com/${locale}`,
      languages: {en: '/en', fr: '/fr', de: '/de'}
    }
  };
}

Mehrsprachige SEO für Next.js

Gerendertes HTML ist nur der Anfang mehrsprachiger SEO. Suchmaschinen benötigen für jede Sprachversion eine eindeutige, stabile URL und klare Verknüpfungen zwischen den Alternativen. Im App Router kann generateMetadata lokalisierte Titel und Beschreibungen sowie alternates.canonical und alternates.languages erzeugen. Eine Sitemap kann ebenfalls Sprachalternativen aufführen. Verwenden Sie eine einheitliche URL-Richtlinie, damit Metadaten, Navigation und Sitemap-Einträge nie voneinander abweichen.

Jede lokalisierte Seite sollte mit wechselseitigen hreflang-Annotationen auf sich selbst und jede gleichwertige Sprachvariante verweisen. Verwenden Sie in der Produktion absolute URLs und fügen Sie x-default hinzu, wenn eine neutrale Auswahl oder Standardansicht sinnvoll ist. Die kanonische URL verweist normalerweise auf die aktuelle Sprachversion und nicht automatisch auf Englisch. Wenn eine Seite in einer Sprache nicht verfügbar ist, lassen Sie diese nicht unterstützte Alternative weg, statt Crawler zu nicht verwandten Inhalten zu führen.

Verlassen Sie sich nicht allein auf Accept-Language. Googlebot crawlt häufig ohne brauchbare Sprachpräferenz, und sprachadaptiver Inhalt unter einer einzigen URL kann Varianten verbergen. Halten Sie Sprachseiten über normale Links erreichbar. Setzen Sie html lang für Browser und Hilfstechnologien, beachten Sie jedoch, dass Google die Sprache hauptsächlich anhand sichtbarer Inhalte bestimmt. Die Übersetzung selbst muss daher substanziell und stimmig sein.

  • Geben Sie vollständiges lokalisiertes HTML unter einer stabilen, crawlbaren URL zurück.
  • Lokalisieren Sie Titel, Beschreibung, Überschriften und sichtbaren Inhalt – nicht nur die Navigationshülle.
  • Geben Sie eine kanonische URL für die aktuelle Seite und wechselseitige hreflang-Links für jede verfügbare Sprache aus.
  • Nehmen Sie lokalisierte URLs in die Sitemap auf und verwenden Sie gegebenenfalls x-default für einen neutralen Fallback.
  • Behalten Sie eine crawlbare Sprachauswahl bei und vermeiden Sie erzwungene Weiterleitungen, die Nutzer oder Bots in einer Sprache festhalten.

Lokalisierte Seiten schnell halten

Server Components bieten eine wichtige Performancechance: Kataloge, die ausschließlich auf dem Server geladen und verwendet werden, müssen nicht Teil des Client-JavaScripts werden. Belassen Sie Überschriften auf Seitenebene, Navigationsbeschriftungen und größtenteils statische Texte auf dem Server. Wenn eine interaktive Client Component Nachrichten benötigt, stellen Sie nur den relevanten Namespace oder übersetzte Props bereit, statt den gesamten Sprachkatalog in jede Seite zu serialisieren.

Statische Generierung verlagert Arbeit von der Anfrage- in die Build-Zeit. Jede Sprache vervielfacht die Anzahl der Seitenvarianten. Messen Sie daher mit wachsender Website die Build-Dauer und Ausgabegröße. Generieren Sie wichtige Seiten im Voraus, teilen Sie Kataloge nach Route oder Domäne auf und vermeiden Sie es, jede Sprache aus einem gemeinsamen Client-Modul zu importieren. Ziel ist lokalisiertes HTML, ohne dass Besucher Inhalte für Sprachen herunterladen müssen, die sie nie ausgewählt haben.

  • Laden Sie nur die aktive Sprache und die für die Route erforderlichen Namespaces.
  • Formatieren und übersetzen Sie in Server Components, sofern die Browserinteraktivität keine Client-Grenze erfordert.
  • Generieren Sie jede unterstützte Sprachvariante explizit und überwachen Sie mit wachsendem Routenumfang die Build-Zeit.
  • Halten Sie die Sprachkonfiguration deterministisch, damit dieselbe URL dieselbe statische Ausgabe erzeugt.

Wie Translatable in den Workflow passt

Eine Next.js-Bibliothek bestimmt, wie die Anwendung Nachrichten auswählt und rendert. Eine Lokalisierungsplattform kümmert sich um den begleitenden Lebenszyklus: Schlüssel erfassen, Werte übersetzen, Änderungen prüfen, Sprachkataloge abgleichen und freigegebene Inhalte bereitstellen. Diese Anforderungen werden sichtbar, sobald sich Texte häufiger als Bereitstellungen ändern oder neben einem einzelnen Entwickler weitere Mitwirkende hinzukommen.

Translatable basiert auf JSON-Lokalisierungsdateien. Teams können vorhandene Kataloge importieren, sie mit KI-Unterstützung bearbeiten oder übersetzen, über Git-Anbieter synchronisieren und Aktualisierungen über ein CDN verteilen. Die Anwendung behält die Kontrolle über Routing und i18n-Bibliothek, sodass sich die Nachrichtenbereitstellung weiterentwickeln kann, ohne View-Komponenten an eine proprietäre Laufzeit zu binden.

Beginnen Sie mit eingecheckten Katalogen und einem Workflow zur Build-Zeit. Führen Sie die Remote-Bereitstellung nur dort ein, wo schnellere Textaktualisierungen echten Mehrwert schaffen, und bewahren Sie für kritische Seiten einen gebündelten Fallback. Dieser schrittweise Ansatz hält statisches Rendering deterministisch und bietet Content-Teams zugleich einen einfacheren Weg in die Produktion, wenn das Produkt wächst.

Häufig gestellte Fragen

Was ist für i18n besser: App Router oder Pages Router?

Für neue Anwendungen ist der App Router im Allgemeinen der bessere Ausgangspunkt, da Server Components Nachrichten laden können, ohne vollständige Kataloge an den Browser zu senden. Der Pages Router bleibt für etablierte Anwendungen eine gültige Wahl und enthält sprachspezifisches Routing über next.config.js. Wählen Sie zuerst den Router, der zur Anwendung passt, und anschließend eine i18n-Bibliothek, die ihn unterstützt.

Sollte ich next-intl oder next-i18next verwenden?

Wählen Sie next-intl, wenn Sie eine ICU-orientierte API und tief integriertes sprachspezifisches Routing wünschen. Wählen Sie next-i18next, wenn Ihr Team das i18next-Ökosystem, Namespaces und Plugins bevorzugt; aktuelle Versionen unterstützen beide Router. Ein reiner Framework-Ansatz mit Wörterbüchern eignet sich für kleine Projekte mit einfachen Nachrichten, allerdings müssen Sie Formatierung, Extraktion, Validierung und Workflow-Werkzeuge selbst bereitstellen.

Verfügt der Next.js App Router über integriertes i18n-Routing?

Der App Router stellt die für die Lokalisierung benötigten Routing- und Rendering-Grundbausteine bereit, bietet aber kein vollständiges Nachrichtensystem. Sie erstellen ein Sprachsegment wie app/[locale], laden Wörterbücher oder verwenden eine Bibliothek und implementieren bei Bedarf eine Spracherkennung. Der Pages Router bietet separat ein integriertes sprachspezifisches Routing über das Feld i18n in next.config.js.

Kann eine lokalisierte Next.js-Website einen statischen Export verwenden?

Ja, wenn jede lokalisierte Route im Voraus generiert werden kann. Verwenden Sie beim App Router ein explizites Segment [locale] und generateStaticParams. Ein rein statischer Export kann nicht von Proxy, Cookies, Weiterleitungen oder einer Spracherkennung zur Anfragezeit abhängen. Das integrierte i18n-Routing des Pages Routers ist nicht mit output: 'export' kompatibel, daher benötigen Exportprojekte stattdessen explizite sprachspezifische Routen.

Kann ich Next.js-Sprachen ohne Codeänderungen hinzufügen?

In der Regel nicht vollständig. Eine neue Sprache benötigt einen Katalog, eine Aktualisierung der Konfiguration unterstützter Sprachen, statische Parameter oder eine Routing-Konfiguration, lokalisierte Metadaten und einen erneuten Build. Eine Übersetzungsplattform kann einen Großteil der manuellen Katalogarbeit übernehmen, die Anwendung muss die Sprache jedoch weiterhin zuverlässig erkennen und veröffentlichen können.

Erstellen Sie einen Lokalisierungsworkflow, den Ihr Team langfristig pflegen kann

Führen Sie Ihre JSON-Kataloge zusammen, übersetzen Sie mit KI-Unterstützung und stellen Sie Aktualisierungen über Git oder ein globales CDN bereit.

Kostenlos starten