
Der vollständige Leitfaden zur Next.js-Internationalisierung
Richten Sie next-intl mit dem App Router ein, konfigurieren Sie das Locale-Routing und automatisieren Sie Übersetzungen mit KI.
next-intl installieren
next-intl ist ein einzelnes Paket, das Locale-Routing, das Laden von Nachrichten und Übersetzungs-Hooks für den Next.js App Router übernimmt.
npm install next-intli18n-Anfragenkonfiguration erstellen
Erstellen Sie zwei Dateien: src/i18n/request.ts zum Laden von Nachrichten und src/i18n/routing.ts für Locale-Definitionen. Sie legen fest, wie next-intl Nachrichten und Routen auflöst.
// src/i18n/routing.ts
import { defineRouting } from 'next-intl/routing';
import { createNavigation } from 'next-intl/navigation';
export const routing = defineRouting({
locales: ['en', 'de', 'ja', 'es'],
defaultLocale: 'en',
localePrefix: 'as-needed', // /about for en, /de/about for de
});
export const { Link, redirect, usePathname, useRouter } =
createNavigation(routing);Middleware konfigurieren
Fügen Sie middleware.ts hinzu, um Locale-Erkennung, URL-Umschreibung und Weiterleitungen zu verarbeiten. Die Middleware fängt jede Anfrage ab und stellt sicher, dass die richtige Locale angewendet wird.
// middleware.ts <- Must be in project ROOT, not src/
import createMiddleware from 'next-intl/middleware';
import { routing } from './src/i18n/routing';
export default createMiddleware(routing);
export const config = {
matcher: ['/((?!api|_next|.*\\..*).*)'],
};Ordnerstruktur [locale] einrichten
Verschieben Sie Ihre App-Routen nach app/[locale]/. Fügen Sie generateStaticParams hinzu, um beim Build Seiten für jede Locale zu erzeugen. So entsteht die URL-Struktur /en/about, /de/about usw.
// app/[locale]/layout.tsx
import { routing } from '@/i18n/routing';
export function generateStaticParams() {
return routing.locales.map((locale) => ({ locale }));
}Stammlayout aktualisieren
Laden Sie Nachrichten mit getMessages() und übergeben Sie sie in Ihrem Locale-Stammlayout an NextIntlClientProvider. Setzen Sie das lang-Attribut von html anhand des Locale-Parameters.
// app/[locale]/layout.tsx
import { NextIntlClientProvider } from 'next-intl';
import { getMessages, setRequestLocale } from 'next-intl/server';
import { routing } from '@/i18n/routing';
import { notFound } from 'next/navigation';
export function generateStaticParams() {
return routing.locales.map((locale) => ({ locale }));
}
export default async function LocaleLayout({
children,
params,
}: {
children: React.ReactNode;
params: { locale: string };
}) {
const { locale } = await params;
if (!routing.locales.includes(locale as any)) notFound();
setRequestLocale(locale);
const messages = await getMessages();
return (
<html lang={locale}>
<body>
<NextIntlClientProvider locale={locale} messages={messages}>
{children}
</NextIntlClientProvider>
</body>
</html>
);
}Übersetzungen in Komponenten verwenden
Serverkomponenten verwenden getTranslations (asynchron, await), Clientkomponenten useTranslations (Hook). Wählen Sie je nach Renderort Ihrer Komponente; Serverkomponenten halten Übersetzungen vollständig aus dem JavaScript-Bundle heraus.
// Server Component (default)
import { getTranslations, setRequestLocale } from 'next-intl/server';
export default async function AboutPage({
params,
}: { params: { locale: string } }) {
const { locale } = await params;
setRequestLocale(locale);
const t = await getTranslations('AboutPage');
return <h1>{t('title')}</h1>;
}
// Client Component ('use client')
'use client';
import { useTranslations } from 'next-intl';
export default function SearchBar() {
const t = useTranslations('SearchBar');
return <input placeholder={t('placeholder')} />;
}SEO hinzufügen: Metadaten und Hreflang
Erzeugen Sie mit generateMetadata Locale-spezifische Seitentitel und Beschreibungen. Fügen Sie alternates.languages für hreflang-Tags hinzu, damit Suchmaschinen alle Sprachversionen jeder Seite finden.
// app/[locale]/layout.tsx or any page.tsx
import { getTranslations } from 'next-intl/server';
import { routing } from '@/i18n/routing';
export async function generateMetadata({
params,
}: { params: { locale: string } }) {
const { locale } = await params;
const t = await getTranslations({ locale, namespace: 'Metadata' });
return {
title: t('title'),
description: t('description'),
alternates: {
languages: Object.fromEntries(
routing.locales.map((l) => [l, `/${l}`])
),
},
};
}Fehler- und Nicht-gefunden-Seiten verarbeiten
error.tsx und not-found.tsx erfordern eine besondere Behandlung, da sie außerhalb des üblichen Locale-Layouts gerendert werden können. Die not-found.tsx im Stammverzeichnis benötigt eine eigene i18n-Provider-Einrichtung, um lokalisierte Fehlermeldungen anzuzeigen.
// app/[locale]/error.tsx
'use client';
import { useTranslations } from 'next-intl';
export default function Error() {
const t = useTranslations('Error');
return (
<div>
<h1>{t('title')}</h1>
<p>{t('description')}</p>
</div>
);
}
// app/not-found.tsx (root level -- needs own provider)
import { routing } from '@/i18n/routing';
export default async function GlobalNotFound() {
return (
<html lang={routing.defaultLocale}>
<body>
<h1>404 - Page Not Found</h1>
</body>
</html>
);
}Übersetzungen automatisieren
Wenn Ihre i18n-Einrichtung abgeschlossen ist, übersetzen Sie Ihre Nachrichtendateien mit KI direkt aus Ihrer IDE oder verwenden Sie die CLI von i18n Agent in Ihrer CI/CD-Pipeline für automatisierte Übersetzungen bei jeder Bereitstellung.
# In your IDE, ask your AI assistant:
> Translate messages/en.json to German, Japanese, and Spanish
✓ messages/de.json created (1.1s)
✓ messages/ja.json created (1.4s)
✓ messages/es.json created (1.0s)Übersetzungsqualität automatisieren
Open-Source-Werkzeuge für Next.js-i18n
Diese quelloffenen Pakete lösen häufige Probleme in Arbeitsabläufen zur Next.js-Internationalisierung.
next-intl-localechain
Standardmäßig wechselt next-intl bei einer fehlenden Übersetzung direkt zu Ihrer Standard-Locale. Eine Person mit brasilianischem Portugiesisch sieht Englisch statt vollständig geeigneter pt-PT-Übersetzungen. next-intl-localechain ergänzt intelligente Fallback-Ketten und führt Übersetzungen verwandter Locales rekursiv zusammen, sodass regionale Personen stets die ähnlichste verfügbare Übersetzung sehen.
import { getRequestConfig } from 'next-intl/server';
import { withLocaleChain } from 'next-intl-localechain';
export default getRequestConfig(withLocaleChain({
loadMessages: (locale) =>
import(`../../messages/${locale}.json`).then(m => m.default),
defaultLocale: 'en'
}));@i18n-agent/cli
Ein Befehlszeilenwerkzeug zum Übersetzen Ihrer Next.js-Nachrichtendateien, ohne das Terminal zu verlassen. Übersetzen Sie Dateien direkt, prüfen Sie den Auftragsstatus und laden Sie Ergebnisse herunter. Funktioniert mit API-Schlüssel-Authentifizierung in CI/CD-Pipelines und ermöglicht vollständig automatisierte Lokalisierungsabläufe.
# Install the CLI
npm install -g @i18n-agent/cli
# Authenticate
i18nagent login
# Translate your message files
i18nagent translate ./messages/en.json --lang de,ja,es
# Or use in CI/CD with an API key
export I18N_AGENT_API_KEY=your-key-here
i18nagent translate ./messages/en.json --lang de,ja,esHäufige Fallstricke
„Unable to find next-intl locale“
Die Middleware entsprach der Anfrage nicht. Prüfen Sie: Befindet sich middleware.ts im Projektstamm? Schließt das matcher-Muster statische Dateien korrekt aus? Ist die Locale in Ihrer Routing-Konfiguration enthalten?
Unerwartetes dynamisches Rendering
setRequestLocale(locale) fehlt auf einer Seite oder in einem Layout. Ohne diesen Aufruf verwendet next-intl Header/Cookies zur Erkennung der Locale, was dynamisches Rendering erzwingt und statische Erzeugung verhindert.
Parallele Routen funktionieren mit i18n nicht
Parallele Routen (@modal) und abfangende Routen ((.)photo) weisen bekannte Unvereinbarkeiten mit dem dynamischen Segment [locale] auf. Verwenden Sie für diese erweiterten Routing-Muster als Behelfslösung Middleware-basiertes Routing.
Beim Sprachwechsel geht die aktuelle Route verloren
Behalten Sie beim Wechseln der Locale den aktuellen Pfadnamen mit usePathname() bei und ersetzen Sie nur das Locale-Segment. Gehen Sie bei dynamischen Routenparametern vorsichtig vor: Sie müssen für die neue Locale erneut aufgelöst werden.
Empfohlene Dateistruktur
my-nextjs-app/
├── middleware.ts # Locale routing (project root!)
├── next.config.mjs
├── messages/
│ ├── en.json # Source messages
│ ├── de.json
│ └── ja.json
├── src/
│ ├── i18n/
│ │ ├── request.ts # Message loading config
│ │ └── routing.ts # Locale definitions
│ └── app/
│ └── [locale]/
│ ├── layout.tsx # Root locale layout
│ ├── page.tsx # Home page
│ ├── error.tsx # Localized error page
│ ├── not-found.tsx # Localized 404
│ └── about/
│ └── page.tsx
└── package.jsoni18n Agent jetzt testen
Legen Sie Ihre Übersetzungsdatei hier ab
JSON, YAML, PO, XML, CSV, Markdown, Properties
oder zum Auswählen klicken
Zielsprachen
Locale-Fallback mit next-intl-localechain
Fehlt ein Übersetzungsschlüssel in einer regionalen Locale wie pt-BR, wechselt next-intl direkt zur Standard-Locale, statt zuerst die übergeordnete Locale pt zu prüfen.
npm install next-intl-localechainimport { withLocaleChain } from 'next-intl-localechain';
export default withLocaleChain({
fallbacks: {
'pt-BR': ['pt', 'en'],
'zh-Hant-HK': ['zh-Hant', 'zh', 'en'],
},
defaultLocale: 'en',
loadMessages: (locale) => import(`./messages/${locale}.json`),
});In unserem Leitfaden zu Locale-Fallbacks finden Sie die vollständige Liste unterstützter Frameworks und 75 integrierter Ketten. Learn more →