Доки по разработке
This project is maintained by teniryte
В вашем проекте модуль 16-i18n пока минимален (простая страница), но он служит якорем для темы i18n — поддержки нескольких языков.
Здесь собраны общие принципы и базовые паттерны того, как обычно строят i18n в App Router.
i18n (internationalization) — это:
В Next.js есть два основных подхода:
i18n в next.config + App Router, когда язык — часть URL;next-intl, next-translate, react-intl, i18next и т.п.).В вашем проекте есть простая страница:
export default function Page() {
return <div>16-i18n</div>;
}
Её можно развивать до полноценного примера:
Один из типичных подходов — язык как первый сегмент URL:
/en/.../ru/.../de/... и т.п.Структура app может выглядеть так:
app/
[locale]/
layout.tsx
page.tsx
about/
page.tsx
Пример app/[locale]/layout.tsx:
export default function LocaleLayout({
children,
params,
}: {
children: React.ReactNode;
params: { locale: string };
}) {
const { locale } = params;
return (
<html lang={locale}>
<body>
{/* Здесь можно отрисовать переключатель языков и т.п. */}
{children}
</body>
</html>
);
}
Пример app/[locale]/page.tsx:
const messages = {
ru: {
title: 'Главная страница',
},
en: {
title: 'Home page',
},
};
export default function HomePage({ params }: { params: { locale: 'ru' | 'en' } }) {
const t = messages[params.locale];
return <h1>{t.title}</h1>;
}
Хотя в вашем коде конкретная библиотека i18n не используется, общий паттерн выглядит так:
// messages.ru.json
{
"home.title": "Главная страница",
"home.description": "Описание по-русски"
}
// messages.en.json
{
"home.title": "Home",
"home.description": "English description"
}
Контекст переводов (TranslationsProvider), оборачивающий приложение.
Хук useTranslations или аналог для получения строк:
const t = useTranslations();
return <h1>{t('home.title')}</h1>;
Даже без специальных библиотек можно использовать стандартный Intl API:
const date = new Date();
const formattedDateRu = new Intl.DateTimeFormat('ru-RU', {
dateStyle: 'long',
}).format(date);
const formattedCurrencyEn = new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD',
}).format(1234.56);
В Next.js это можно делать:
Типичный вид переключателя языка (для URL‑подхода):
'use client';
import Link from 'next/link';
import { usePathname } from 'next/navigation';
const locales = ['en', 'ru'] as const;
export function LocaleSwitcher({ currentLocale }: { currentLocale: string }) {
const pathname = usePathname();
// Простейший пример: заменяем первый сегмент на новый locale
const segments = pathname.split('/');
segments[1] = currentLocale; // /en/..., /ru/...
return (
<div>
{locales.map((locale) => (
<Link key={locale} href={`/${locale}${segments.slice(2).join('/')}`}>
{locale.toUpperCase()}
</Link>
))}
</div>
);
}
/ru/...) — обычно предпочтительный вариант;ru.example.com) — отдельный уровень конфигурации;home.title, home.description и т.п.).lang в <html lang="...">;hreflang в метаданные/head.Модуль 16-i18n в вашем коде пока служит точкой входа в тему, а этот раздел конспекта помогает вспомнить основные подходы к i18n в Next.js и то, как их можно развить поверх существующей структуры App Router.