
The Complete Guide to Next.js Internationalization
Set up next-intl with the App Router, configure locale routing, and automate translations with AI.
A next-intl telepítése
A next-intl egyetlen csomagban kezeli a területi beállítások útválasztását, az üzenetek betöltését és a Next.js App Router fordítási hookjait.
npm install next-intlAz i18n-kérésbeállítás létrehozása
Hozzon létre két fájlt: a src/i18n/request.ts fájlt az üzenetek betöltéséhez és a src/i18n/routing.ts fájlt a területi beállítások meghatározásához. Ezek szabályozzák, hogyan oldja fel a next-intl az üzeneteket és az útvonalakat.
// 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);A middleware beállítása
Adja hozzá a middleware.ts fájlt a területi beállítás észleléséhez, az URL-ek átírásához és az átirányításokhoz. A middleware minden kérést elfog, és gondoskodik a megfelelő területi beállítás alkalmazásáról.
// 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|.*\\..*).*)'],
};A [locale] mappaszerkezet beállítása
Helyezze át az alkalmazás útvonalait az app/[locale]/ mappába. A generateStaticParams hozzáadásával buildeléskor minden területi beállításhoz létrehozhatja az oldalakat. Így olyan URL-szerkezet jön létre, mint /en/about, /de/about stb.
// app/[locale]/layout.tsx
import { routing } from '@/i18n/routing';
export function generateStaticParams() {
return routing.locales.map((locale) => ({ locale }));
}A gyökérelrendezés frissítése
Töltse be az üzeneteket a getMessages() segítségével, és adja át őket a NextIntlClientProvider elemnek a területi gyökérelrendezésben. A html lang attribútumát a területi paraméterből állítsa be.
// 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>
);
}Fordítások használata komponensekben
A szerverkomponensek a getTranslations függvényt használják (aszinkron, await), az ügyfélkomponensek pedig a useTranslations hookot. A komponens renderelési helye alapján válasszon — a szerverkomponensek teljesen kihagyják a fordításokat a JavaScript-csomagból.
// 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 hozzáadása: metaadatok és hreflang
A generateMetadata használatával hozzon létre területspecifikus oldalcímeket és leírásokat. Adjon meg alternates.languages értékeket a hreflang címkékhez, hogy a keresőmotorok minden oldal összes nyelvi változatát megtalálják.
// 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}`])
),
},
};
}Hiba- és nem található oldalak kezelése
Az error.tsx és a not-found.tsx különleges kezelést igényel, mert a normál területi elrendezésen kívül is renderelődhet. A gyökér not-found.tsx saját i18n-szolgáltatóbeállítást igényel a lokalizált hibaüzenetek megjelenítéséhez.
// 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>
);
}Fordítások automatizálása
A kész i18n-beállítással fordítsa le üzenetfájljait mesterséges intelligenciával közvetlenül az IDE-ből, vagy használja az i18n Agent parancssori eszközét a CI/CD-folyamatban a minden telepítéskor futó automatizált fordításhoz.
# 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)A fordítási minőség automatizálása
Nyílt forráskódú eszközök a Next.js i18n-hez
Ezek a nyílt forráskódú csomagok a Next.js nemzetköziesítési munkafolyamatainak gyakori nehézségeit oldják meg.
next-intl-localechain
A szabványos next-intl hiányzó fordítás esetén közvetlenül az alapértelmezett területi beállításra vált. Egy brazíliai portugál felhasználó angol szöveget lát a megfelelő pt-PT fordítás helyett. A next-intl-localechain intelligens tartalékláncokat ad hozzá — mélyen egyesíti a kapcsolódó területek fordításait, így a regionális felhasználók mindig a legközelebbi elérhető fordítást látják.
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
Parancssori eszköz Next.js-üzenetfájlok fordításához a terminál elhagyása nélkül. Fordítson közvetlenül fájlokat, ellenőrizze a feladat állapotát, és töltse le az eredményeket. API-kulcsos hitelesítéssel CI/CD-folyamatokban is használható a teljesen automatizált lokalizációhoz.
# 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,esGyakori buktatók
„Unable to find next-intl locale”
A middleware nem illeszkedett a kérésre. Ellenőrizze: a middleware.ts a projekt gyökerében található? A matcher minta helyesen kizárja a statikus fájlokat? A területi beállítás szerepel az útválasztási konfigurációban?
Váratlan dinamikus renderelés
A setRequestLocale(locale) hiányzik egy oldalról vagy elrendezésből. Enélkül a next-intl fejlécekből vagy cookie-kból észleli a területi beállítást, ami dinamikus renderelést kényszerít ki, és megakadályozza a statikus generálást.
A párhuzamos útvonalak nem működnek az i18n-nel
A párhuzamos útvonalak (@modal) és az elfogó útvonalak ((.)photo) ismerten nem kompatibilisek a dinamikus [locale] szegmenssel. Ezekhez a fejlett útválasztási mintákhoz kerülő megoldásként használjon middleware-alapú útválasztást.
A nyelvváltás elveszíti az aktuális útvonalat
A területi beállítás váltásakor őrizze meg az aktuális elérési utat a usePathname() segítségével, és csak a területi szegmenst cserélje le. Legyen óvatos a dinamikus útvonalparaméterekkel — az új területi beállításhoz ismét fel kell oldani őket.
Ajánlott fájlszerkezet
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.jsonTry i18n Agent Now
Drop your translation file here
JSON, YAML, PO, XML, CSV, Markdown, Properties
or click to browse
Target languages
Területi tartalék a next-intl-localechain használatával
Ha egy fordítási kulcs hiányzik egy regionális területi beállításból, például a pt-BR változatból, a next-intl a pt szülőterület ellenőrzése helyett közvetlenül az alapértelmezett területre vált.
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`),
});A támogatott keretrendszerek és a 75 beépített lánc teljes listájáért tekintse meg Területi tartalék útmutatónkat. Learn more →