Dev Highlights

Доки по разработке

This project is maintained by teniryte

8. Введение в i18n (международзация) в Next.js

В вашем проекте модуль 16-i18n пока минимален (простая страница), но он служит якорем для темы i18n — поддержки нескольких языков. Здесь собраны общие принципы и базовые паттерны того, как обычно строят i18n в App Router.

8.1. Что такое i18n в контексте Next.js

i18n (internationalization) — это:

В Next.js есть два основных подхода:

8.2. Базовая страница модуля i18n

В вашем проекте есть простая страница:

export default function Page() {
  return <div>16-i18n</div>;
}

Её можно развивать до полноценного примера:

8.3. i18n через URL и App Router

Один из типичных подходов — язык как первый сегмент URL:

Структура 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>;
}

8.4. Использование библиотек для локализации (общий паттерн)

Хотя в вашем коде конкретная библиотека i18n не используется, общий паттерн выглядит так:

  1. Хранение переводов в JSON/YAML‑файлах:
// messages.ru.json
{
  "home.title": "Главная страница",
  "home.description": "Описание по-русски"
}
// messages.en.json
{
  "home.title": "Home",
  "home.description": "English description"
}
  1. Контекст переводов (TranslationsProvider), оборачивающий приложение.

  2. Хук useTranslations или аналог для получения строк:

const t = useTranslations();

return <h1>{t('home.title')}</h1>;

8.5. Форматирование чисел, дат и валют

Даже без специальных библиотек можно использовать стандартный 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 это можно делать:

8.6. Переключатель языка

Типичный вид переключателя языка (для 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>
  );
}

8.7. Практические рекомендации по i18n

Модуль 16-i18n в вашем коде пока служит точкой входа в тему, а этот раздел конспекта помогает вспомнить основные подходы к i18n в Next.js и то, как их можно развить поверх существующей структуры App Router.