Skip to main content

The Complete Guide to Next.js Internationalization

Set up next-intl with the App Router, configure locale routing, and automate translations with AI.

1

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.

Terminal
npm install next-intl
Miért next-intl a next-i18next helyett? A next-intl az App Routerhez és a szerverkomponensekhez készült. A next-i18next a Pages Routerhez készült, és csak korlátozottan támogatja az App Routert.
2

Az 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
// 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 Turbopackhez (a Next.js 15 alapértelmezett csomagolója) szükséges az experimental.turbo.resolveAlias beállítás a next.config.js fájlban. Enélkül „Couldn't find next-intl config file” hibát kap.
3

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
// 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 middleware.ts fájlnak a projekt gyökérkönyvtárában KELL lennie, nem a src/ mappában. Ez a next-intl leggyakoribb beállítási hibája.
4

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
// app/[locale]/layout.tsx
import { routing } from '@/i18n/routing';

export function generateStaticParams() {
  return routing.locales.map((locale) => ({ locale }));
}
Minden fordítást használó page.tsx és layout.tsx fájlban meg KELL hívnia a setRequestLocale(locale) függvényt. Enélkül a Next.js dinamikus renderelésre vált, és jelentősen romlik a build teljesítménye.
5

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
// 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>
  );
}
A NextIntlClientProvider kifejezett locale propot igényel. Ennek kihagyása nehezen felderíthető, rejtett hibákat okoz az ügyfélkomponensekben.
6

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.

app/[locale]/page.tsx
// 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')} />;
}
A lefordított tartalmakhoz részesítse előnyben a szerverkomponenseket. Így a fordítási karakterláncok nem kerülnek az ügyféloldali JavaScript-csomagba, ami csökkenti a felhasználók betöltési idejét.
7

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
// 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}`])
      ),
    },
  };
}
A Vercelen a buildek localhost kanonikus URL-t hozhatnak létre, ha nincs beállítva a metadataBase. A gyökérelrendezés metadataBase értékét mindig az éles tartományra állítsa.
8

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
// 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>
  );
}
A Next.js csak akkor rendereli a lokalizált 404-es oldalt, ha a kódban kifejezetten meghívja a notFound() függvényt. Az egyező oldal nélküli ismeretlen útvonalak a Next.js alapértelmezett 404-es oldalát jelenítik meg, nem az Ön lokalizált változatát.
9

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.

Terminal
# 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)
Használja a next-intl-localechain csomagot intelligens területitartalékokhoz — így a pt-BR felhasználó angol helyett pt-PT fordítást lát, ha nem érhető el brazíliai portugál változat.

A fordítási minőség automatizálása

Az i18n-validate segítségével még kiadás előtt észlelheti a hiányzó kulcsokat és hibás helyőrzőket. A valódi fordítások elkészülte előtt az i18n-pseudo álfordításaival tesztelheti a felületet.

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.

src/i18n/request.ts
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'
}));
Fordítások automatikus mély egyesítése a területi láncokon
Beépített láncok portugálhoz, spanyolhoz, franciához, némethez és más nyelvekhez
A hiányzó üzenetfájlok szabályos, hibamentes kihagyása
Egysoros beállítás — a meglévő getRequestConfig burkolása
Megtekintés a GitHubon

@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.

Terminal
# 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,es
JSON-, YAML-, PO- és más i18n-fájlformátumok fordítása a terminálból
CI/CD-kompatibilis — hitelesítés környezeti változóval automatizált folyamatokhoz
Feladatállapot követése, sikertelen feladatok folytatása és eredmények letöltése
Géppel olvasható JSON-kimenet szkriptekhez és automatizáláshoz
Megtekintés a GitHubon

Gyakori 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

Project Structure
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.json

Try i18n Agent Now

Drop your translation file here

JSON, YAML, PO, XML, CSV, Markdown, Properties

or click to browse

Target languages

No signup requiredInstant estimate

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.

Terminal
npm install next-intl-localechain
Configuration
import { 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 →

Frequently Asked Questions