
Ang Kumpletong Gabay sa Next.js Internationalization
I-set up ang next-intl gamit ang App Router, i-configure ang locale routing, at i-automate ang pagsasalin gamit ang AI.
I-install ang next-intl
Ang next-intl ay iisang package na humahawak ng locale routing, message loading, at translation hook para sa Next.js App Router.
npm install next-intlGumawa ng i18n Request Config
Gumawa ng 2 file: src/i18n/request.ts para sa message loading at src/i18n/routing.ts para sa locale definition. Kino-configure ng mga ito kung paano nireresolba at niroroute ng next-intl ang mga message.
// 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);I-configure ang Middleware
Magdagdag ng middleware.ts para pangasiwaan ang locale detection, URL rewriting, at redirect. Hinahadlangan ng middleware ang bawat request at tinitiyak na naa-apply ang tamang locale.
// 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|.*\\..*).*)'],
};I-set up ang Istruktura ng Folder na [locale]
Ilipat ang inyong mga app route sa loob ng app/[locale]/. Idagdag ang generateStaticParams para mag-generate ng mga page para sa bawat locale sa build time. Lumilikha ito ng istruktura ng URL na /en/about, /de/about, atbp.
// app/[locale]/layout.tsx
import { routing } from '@/i18n/routing';
export function generateStaticParams() {
return routing.locales.map((locale) => ({ locale }));
}I-update ang Root Layout
I-load ang mga message gamit ang getMessages() at ipasa ang mga ito sa NextIntlClientProvider sa inyong root locale layout. Itakda ang html lang attribute mula sa locale parameter.
// 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>
);
}Gamitin ang mga Translation sa mga Component
Gumagamit ang mga server component ng getTranslations (async, await). Gumagamit ang mga client component ng useTranslations (hook). Pumili batay sa kung saan nagre-render ang inyong component — pinananatiling wala sa JavaScript bundle ang mga translation kapag server component ang gamit.
// 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')} />;
}Magdagdag ng SEO: Metadata at Hreflang
Gamitin ang generateMetadata para gumawa ng mga page title at description na partikular sa locale. Idagdag ang alternates.languages para sa mga hreflang tag para matuklasan ng mga search engine ang lahat ng bersyon ng wika ng bawat page.
// 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}`])
),
},
};
}I-handle ang mga Error at Not-Found Page
Kailangan ng espesyal na pag-handle ang error.tsx at not-found.tsx dahil maaari silang mag-render sa labas ng karaniwang locale layout. Nangangailangan ang root not-found.tsx ng sarili nitong i18n provider setup para maipakita ang mga localized na error message.
// 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>
);
}I-automate ang mga Pagsasalin
Kapag kumpleto na ang inyong i18n setup, isalin ang inyong mga message file gamit ang AI nang direkta mula sa inyong IDE, o gamitin ang i18n Agent CLI sa inyong CI/CD pipeline para sa awtomatikong pagsasalin sa bawat deploy.
# 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)I-automate ang Kalidad ng Pagsasalin
Mga Open-Source Tool para sa Next.js i18n
Tinutugunan ng mga open-source package na ito ang mga karaniwang pain point sa mga workflow ng internationalization sa Next.js.
next-intl-localechain
Direktang nagfa-fallback ang standard next-intl sa inyong default locale kapag may nawawalang translation. Nakakakita ang isang Brazilian Portuguese user ng English sa halip na maayos na mga pagsasalin sa pt-PT. Nagdaragdag ang next-intl-localechain ng intelligent fallback chain — dini-deep-merge nito ang mga pagsasalin mula sa mga magkakaugnay na locale para laging makita ng mga user sa bawat rehiyon ang pinakamalapit na available na pagsasalin.
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
Isang command-line tool para isalin ang inyong mga Next.js message file nang hindi umaalis sa terminal. Isalin ang mga file nang direkta, suriin ang job status, at i-download ang mga resulta. Gumagana ito sa mga CI/CD pipeline gamit ang API key authentication para sa ganap na automated na localization workflow.
# 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,esMga Karaniwang Pitfall
"Unable to find next-intl locale"
Hindi tumugma ang middleware sa request. Suriin: nasa project root ba ang middleware.ts? Tama bang nag-e-exclude ng mga static file ang matcher pattern? Kasama ba ang locale sa inyong routing config?
Hindi Inaasahang Dynamic Rendering
Wala ang setRequestLocale(locale) sa isang page o layout. Kapag wala ito, gumagamit ang next-intl ng headers/cookies para i-detect ang locale, na nagpu-force ng dynamic rendering at pumipigil sa static generation.
Nasira ang Parallel Routes kapag may i18n
May mga kilalang incompatibility ang parallel routes (@modal) at intercepting routes ((.)photo) sa [locale] dynamic segment. Gamitin ang middleware-based routing bilang workaround para sa mga advanced routing pattern na ito.
Nawawala ang Kasalukuyang Route kapag Nagpapalit ng Wika
Kapag nagpapalit ng locale, panatilihin ang kasalukuyang pathname gamit ang usePathname() at palitan lang ang locale segment. Mag-ingat sa mga dynamic route parameter — kailangan silang i-resolve muli para sa bagong locale.
Inirerekomendang Istruktura ng File
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.jsonSubukan ang i18n Agent Ngayon
I-drop dito ang inyong translation file
JSON, YAML, PO, XML, CSV, Markdown, Properties
o i-click para mag-browse
Mga target language
Locale Fallback gamit ang next-intl-localechain
Kapag nawawala ang translation key sa isang regional locale tulad ng pt-BR, dumidiretso ang next-intl sa default locale sa halip na suriin muna ang parent locale na 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`),
});Tingnan ang aming Locale Fallback Guide para sa kumpletong listahan ng mga sinusuportahang framework at 75 built-in chain. Learn more →