
Celovit vodnik po internacionalizaciji v Next.js
Nastavite next-intl z App Routerjem, določite usmerjanje jezikovnih različic in avtomatizirajte prevode z umetno inteligenco.
Namestite next-intl
next-intl je en sam paket, ki za Next.js App Router obravnava usmerjanje jezikovnih različic, nalaganje sporočil in prevajalske hooke.
npm install next-intlUstvarite nastavitve zahtev i18n
Ustvarite dve datoteki: src/i18n/request.ts za nalaganje sporočil in src/i18n/routing.ts za opredelitve jezikovnih različic. Obe določata, kako next-intl razrešuje sporočila in poti.
// 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);Nastavite vmesno programsko opremo
Dodajte middleware.ts, ki obravnava zaznavanje jezikovne različice, prepisovanje naslovov URL in preusmeritve. Vmesna programska oprema prestreže vsako zahtevo in zagotovi uporabo pravilne jezikovne različice.
// 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|.*\\..*).*)'],
};Nastavite strukturo map [locale]
Poti aplikacije premaknite v app/[locale]/. Dodajte generateStaticParams, da med gradnjo ustvarite strani za vsako jezikovno različico. Tako nastane struktura naslovov URL /en/about, /de/about itd.
// app/[locale]/layout.tsx
import { routing } from '@/i18n/routing';
export function generateStaticParams() {
return routing.locales.map((locale) => ({ locale }));
}Posodobite svojo korensko postavitev
S getMessages() naložite sporočila in jih v korenski jezikovni postavitvi podajte v NextIntlClientProvider. Atribut html lang nastavite iz parametra jezikovne različice.
// 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>
);
}Uporabljajte prevode v komponentah
Strežniške komponente uporabljajo getTranslations (async, await), odjemalske pa useTranslations (hook). Izberite glede na mesto izrisa komponente: strežniške komponente prevodov sploh ne vključijo v paket JavaScript.
// 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')} />;
}Dodajte SEO: metapodatke in hreflang
Z generateMetadata ustvarite naslove in opise strani za posamezne jezikovne različice. Dodajte alternates.languages za oznake hreflang, da iskalniki odkrijejo vse jezikovne različice vsake strani.
// 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}`])
),
},
};
}Obravnavajte strani z napakami in neobstoječe strani
error.tsx in not-found.tsx potrebujeta posebno obravnavo, ker se lahko izrišeta zunaj običajne jezikovne postavitve. Korenski not-found.tsx potrebuje lastno nastavitev ponudnika i18n, da prikaže lokalizirana sporočila o napakah.
// 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>
);
}Avtomatizirajte prevode
Ko je nastavitev i18n končana, svoje datoteke sporočil prevedite z umetno inteligenco neposredno iz razvojnega okolja IDE ali pa v pipelineu CI/CD uporabite CLI i18n Agent za samodejno prevajanje ob vsaki uvedbi.
# 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)Avtomatizirajte kakovost prevodov
Odprtokodna orodja za i18n v Next.js
Ti odprtokodni paketi rešujejo pogoste težave v potekih dela internacionalizacije Next.js.
next-intl-localechain
Običajni next-intl se ob manjkajočem prevodu vrne neposredno k Vaši privzeti jezikovni različici. Uporabnik brazilske portugalščine namesto povsem ustreznih prevodov pt-PT vidi angleščino. next-intl-localechain doda pametne nadomestne verige: globoko združi prevode sorodnih jezikovnih različic, tako da regionalni uporabniki vedno vidijo najbližji razpoložljivi prevod.
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
Orodje ukazne vrstice za prevajanje datotek sporočil Next.js, ne da bi zapustili terminal. Prevajajte datoteke neposredno, preverjajte stanje opravil in prenašajte rezultate. Deluje v pipelineih CI/CD z overjanjem s ključem API za povsem avtomatizirane lokalizacijske poteke dela.
# 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,esPogoste pasti
"Unable to find next-intl locale"
Vmesna programska oprema se ni ujemala z zahtevo. Preverite: ali je middleware.ts v korenu projekta? Ali vzorec matcher pravilno izključuje statične datoteke? Ali je jezikovna različica vključena v Vaše nastavitve usmerjanja?
Nepričakovan dinamični izris
Na strani ali v postavitvi manjka setRequestLocale(locale). Brez tega next-intl za zaznavanje jezikovne različice uporablja glave in piškotke, kar vsili dinamični izris ter prepreči statično ustvarjanje.
Vzporedne poti ne delujejo z i18n
Vzporedne poti (@modal) in prestrezne poti ((.)photo) imajo znane nezdružljivosti z dinamičnim odsekom [locale]. Kot rešitev za te napredne vzorce usmerjanja uporabite usmerjanje na podlagi vmesne programske opreme.
Preklop jezika izgubi trenutno pot
Pri preklopu jezikovne različice z usePathname() ohranite trenutno pathname in zamenjajte samo jezikovni odsek. Bodite previdni pri dinamičnih parametrih poti: za novo jezikovno različico jih morate znova razrešiti.
Priporočena struktura datotek
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.jsonPreizkusite i18n Agent zdaj
Spustite prevajalsko datoteko sem
JSON, YAML, PO, XML, CSV, Markdown, Properties
ali kliknite za izbiro
Ciljni jeziki
Nadomestne jezikovne različice z next-intl-localechain
Ko v regionalni jezikovni različici, kot je pt-BR, manjka prevajalski ključ, next-intl preskoči naravnost na privzeto jezikovno različico, namesto da bi najprej preveril nadrejeno različico pt.
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`),
});V našem vodniku po nadomestnih jezikovnih različicah si oglejte celoten seznam podprtih ogrodij in 75 vgrajenih verig. Learn more →