Internationalisierung (i18n) Routing
Beispiele
Next.js bietet seit Version v10.0.0
integrierte Unterstützung für internationalisiertes (i18n) Routing. Sie können eine Liste von Locales, das Standard-Locale und domänenspezifische Locales angeben, und Next.js wird das Routing automatisch verwalten.
Die i18n-Routing-Unterstützung soll bestehende i18n-Bibliothekslösungen wie react-intl
, react-i18next
, lingui
, rosetta
, next-intl
, next-translate
, next-multilingual
, tolgee
, paraglide-next
und andere ergänzen, indem Routen und Locale-Parsing vereinfacht werden.
Erste Schritte
Fügen Sie zunächst die i18n
-Konfiguration in Ihrer next.config.js
-Datei hinzu.
Locales sind UTS-Locale-Bezeichner, ein standardisiertes Format zur Definition von Locales.
Ein Locale-Bezeichner besteht in der Regel aus Sprache, Region und Schrift, getrennt durch einen Bindestrich: Sprache-Region-Schrift
. Region und Schrift sind optional. Ein Beispiel:
en-US
- Englisch wie in den Vereinigten Staaten gesprochennl-NL
- Niederländisch wie in den Niederlanden gesprochennl
- Niederländisch, keine spezifische Region
Wenn das Benutzerlocale nl-BE
ist und nicht in Ihrer Konfiguration aufgeführt ist, wird der Benutzer zu nl
weitergeleitet, falls verfügbar, andernfalls zum Standard-Locale.
Wenn Sie nicht alle Regionen eines Landes unterstützen möchten, ist es daher eine gute Praxis, Länder-Locales einzubeziehen, die als Fallback dienen.
Locale-Strategien
Es gibt zwei Strategien zur Locale-Behandlung: Sub-Path-Routing und Domain-Routing.
Sub-Path-Routing
Sub-Path-Routing platziert das Locale im URL-Pfad.
Mit dieser Konfiguration sind en-US
, fr
und nl-NL
zum Routing verfügbar, und en-US
ist das Standard-Locale. Bei einer pages/blog.js
stehen folgende URLs zur Verfügung:
/blog
/fr/blog
/nl-nl/blog
Das Standard-Locale hat kein Präfix.
Domain-Routing
Beim Domain-Routing können Sie Locales so konfigurieren, dass sie von verschiedenen Domains bedient werden:
Bei einer pages/blog.js
stehen z.B. folgende URLs zur Verfügung:
example.com/blog
www.example.com/blog
example.fr/blog
example.nl/blog
example.nl/nl-BE/blog
Automatische Locale-Erkennung
Wenn ein Benutzer die Anwendungswurzel (normalerweise /
) besucht, versucht Next.js, das bevorzugte Locale des Benutzers basierend auf dem Accept-Language
-Header und der aktuellen Domain automatisch zu erkennen.
Wird ein anderes Locale als das Standard-Locale erkannt, wird der Benutzer weitergeleitet zu:
- Bei Sub-Path-Routing: Der locale-präfixierte Pfad
- Bei Domain-Routing: Die Domain, für die dieses Locale als Standard festgelegt ist
Beim Domain-Routing wird ein Benutzer mit dem Accept-Language
-Header fr;q=0.9
, der example.com
besucht, zu example.fr
weitergeleitet, da diese Domain standardmäßig das fr
-Locale verarbeitet.
Beim Sub-Path-Routing würde der Benutzer zu /fr
weitergeleitet.
Präfixierung des Standard-Locales
Mit Next.js 12 und Middleware können wir dem Standard-Locale ein Präfix hinzufügen.
Beispielsweise ist hier eine next.config.js
-Datei mit Unterstützung für einige Sprachen. Beachten Sie, dass das Locale "default"
absichtlich hinzugefügt wurde.
Als Nächstes können wir Middleware verwenden, um benutzerdefinierte Routing-Regeln hinzuzufügen:
Diese Middleware überspringt das Hinzufügen des Standard-Präfixes zu API-Routen und öffentlichen Dateien wie Schriftarten oder Bildern. Wenn eine Anfrage an das Standard-Locale gesendet wird, leiten wir zu unserem Präfix /en
um.
Deaktivierung der automatischen Locale-Erkennung
Die automatische Locale-Erkennung kann mit Folgendem deaktiviert werden:
Wenn localeDetection
auf false
gesetzt ist, wird Next.js nicht mehr automatisch basierend auf dem bevorzugten Locale des Benutzers umleiten und nur Locale-Informationen bereitstellen, die vom locale-basierten Domain oder Locale-Pfad erkannt wurden.
Zugriff auf Locale-Informationen
Sie können auf Locale-Informationen über den Next.js-Router zugreifen. Beispielsweise sind beim Verwenden des useRouter()
-Hooks folgende Eigenschaften verfügbar:
locale
enthält das aktuell aktive Locale.locales
enthält alle konfigurierten Locales.defaultLocale
enthält das konfigurierte Standard-Locale.
Beim Pre-Rendering von Seiten mit getStaticProps
oder getServerSideProps
wird die Locale-Information in dem Kontext bereitgestellt, der der Funktion übergeben wird.
Bei Verwendung von getStaticPaths
werden die konfigurierten Locales im Kontextparameter der Funktion unter locales
und der konfigurierte Standardstandort unter defaultLocale
bereitgestellt.
Wechsel zwischen Locales
Sie können next/link
oder next/router
verwenden, um zwischen Locales zu wechseln.
Bei next/link
kann eine locale
-Eigenschaft bereitgestellt werden, um zu einem anderen Locale als dem aktuellen zu wechseln. Wenn keine locale
-Eigenschaft angegeben wird, wird der aktuell aktive locale
während Clientübergängen verwendet. Beispiel:
Bei der direkten Verwendung der next/router
-Methoden können Sie den locale
über die Übergabeoptionen angeben. Beispiel:
Hinweis: Um nur den locale
zu wechseln und gleichzeitig alle Routing-Informationen wie dynamische Routenwerte oder versteckte href-Abfragewerte zu erhalten, können Sie den href
-Parameter als Objekt übergeben:
Weitere Informationen zur Objektstruktur von router.push
finden Sie hier.
Wenn Ihre href
bereits den Locale enthält, können Sie die automatische Locale-Präfixbehandlung deaktivieren:
Nutzung des NEXT_LOCALE
-Cookies
Next.js ermöglicht das Setzen eines NEXT_LOCALE=the-locale
-Cookies, der Vorrang vor dem Accept-Language-Header hat. Dieser Cookie kann mit einem Sprachschalter gesetzt werden und beim erneuten Seitenbesuch wird der im Cookie angegebene Locale bei der Weiterleitung von /
zum korrekten Locale-Standort verwendet.
Beispiel: Wenn ein Benutzer den Locale fr
in seinem Accept-Language-Header bevorzugt, aber ein NEXT_LOCALE=en
-Cookie gesetzt ist, wird beim Besuch von /
zum en
-Locale weitergeleitet, bis der Cookie entfernt oder abgelaufen ist.
Suchmaschinenoptimierung
Da Next.js weiß, welche Sprache der Benutzer besucht, fügt es automatisch das lang
-Attribut zum <html>
-Tag hinzu.
Next.js kennt keine Varianten einer Seite, daher liegt es an Ihnen, die hreflang
-Meta-Tags mit next/head
hinzuzufügen. Mehr über hreflang
erfahren Sie in der Google Webmasters-Dokumentation.
Wie funktioniert das mit Static Generation?
Hinweis: Internationalisiertes Routing ist nicht mit
output: 'export'
kompatibel, da es nicht die Next.js-Routing-Schicht nutzt. Hybride Next.js-Anwendungen, dieoutput: 'export'
nicht verwenden, werden vollständig unterstützt.
Dynamische Routen und getStaticProps
-Seiten
Für Seiten mit getStaticProps
bei dynamischen Routen müssen alle gewünschten Locale-Varianten der Seite von getStaticPaths
zurückgegeben werden. Zusätzlich zum params
-Objekt können Sie auch ein locale
-Feld zurückgeben, das angibt, welchen Locale Sie rendern möchten. Beispiel:
Für Automatisch statisch optimierte und nicht-dynamische getStaticProps
-Seiten wird eine Version der Seite für jeden Locale generiert. Dies ist wichtig zu beachten, da es die Buildzeiten je nach Anzahl konfigurierter Locales erhöhen kann.
Beispiel: Bei 50 konfigurierten Locales mit 10 nicht-dynamischen Seiten mit getStaticProps
bedeutet dies, dass getStaticProps
500 Mal aufgerufen wird. 50 Versionen der 10 Seiten werden während jedes Builds generiert.
Um die Buildzeit dynamischer Seiten mit getStaticProps
zu reduzieren, verwenden Sie einen fallback
-Modus. Dies ermöglicht es Ihnen, nur die beliebtesten Pfade und Locales von getStaticPaths
für das Prerendering während des Builds zurückzugeben. Anschließend erstellt Next.js die restlichen Seiten zur Laufzeit, wenn sie angefordert werden.
Automatisch statisch optimierte Seiten
Für Seiten, die automatisch statisch optimiert sind, wird eine Version der Seite für jeden Locale generiert.
Nicht-dynamische getStaticProps-Seiten
Für nicht-dynamische getStaticProps
-Seiten wird wie oben beschrieben eine Version für jeden Locale generiert. getStaticProps
wird mit jedem zu rendernden locale
aufgerufen. Wenn Sie bestimmte Locales vom Prerendering ausschließen möchten, können Sie notFound: true
von getStaticProps
zurückgeben, und diese Variante der Seite wird nicht generiert.
Grenzen für die i18n-Konfiguration
locales
: 100 Locales insgesamtdomains
: 100 Locale-Domain-Einträge insgesamt
Hinweis: Diese Grenzen wurden zunächst hinzugefügt, um potenzielle Leistungsprobleme zur Buildzeit zu verhindern. Sie können diese Grenzen mit benutzerdefiniertem Routing unter Verwendung von Middleware in Next.js 12 umgehen.