Спросите свой вопрос и получите сводку документа, используя эту страницу и выбранного вами поставщика AI
Содержимое этой страницы было переведено с помощью ИИ.
Смотреть последнюю версию оригинального контента на английскомЕсли у вас есть идея по улучшению этой документации, не стесняйтесь внести свой вклад, подав запрос на вытягивание на GitHub.
Ссылка на документацию GitHubКопировать Markdown документа в буфер обмена
Перевод вашего сайта на Next.js 15 с использованием next-i18next и Intlayer | Интернационализация (i18n)
Для кого это руководство
- Junior: Следуйте точным шагам и копируйте блоки кода. Вы получите работающее многоязычное приложение.
- Mid-level: Используйте контрольные списки и рекомендации по лучшим практикам, чтобы избежать распространённых ошибок.
- Senior: Просмотрите разделы с общей структурой, SEO и автоматизацией; вы найдёте разумные настройки по умолчанию и точки расширения.
Что вы создадите
- Проект с App Router и локализованными маршрутами (например,
/,/fr/...) - Конфигурация i18n с локалями, локаль по умолчанию, поддержка RTL
- Инициализация i18n на стороне сервера и провайдер на клиенте
- Пространства имён для переводов, загружаемые по требованию
- SEO с
hreflang, локализованная карта сайта (sitemap),robots - Middleware для маршрутизации по локали
- Интеграция Intlayer для автоматизации рабочих процессов перевода (тесты, заполнение AI, синхронизация JSON)
Примечание: next-i18next построен на основе i18next. В этом руководстве используются примитивы i18next, совместимые с next-i18next в App Router, при этом архитектура остаётся простой и готовой к продакшену. Для более широкого сравнения смотрите next-i18next vs next-intl vs Intlayer.
1) Структура проекта
Установите зависимости next-i18next -
Начните с чёткой структуры. Держите сообщения разделёнными по локалям и namespace.
Контрольный список (mid/senior):
- Храните по одному JSON на namespace для каждой локали
- Не централизуйте сообщения чрезмерно; используйте небольшие namespace, ограниченные страницей или функционалом
- Избегайте одновременного импорта всех локалей; загружайте только то, что нужно
2) Установка зависимостей
Если вы планируете использовать API или конфигурацию next-i18next, также выполните:
3) Основная конфигурация i18n
Определите локали, локаль по умолчанию, RTL и вспомогательные функции для локализованных путей/URL.
Важное замечание: если вы используете next-i18next.config.js, поддерживайте его в синхронизации с i18n.config.ts, чтобы избежать рассогласования.
4) Инициализация i18n на стороне сервера
Инициализируйте i18next на сервере с динамическим backend, который импортирует только необходимые JSON-файлы локали/пространства имён.
Среднее замечание: Держите список пространств имён коротким для каждой страницы, чтобы ограничить объём загружаемых данных. Избегайте глобальных «ловящих всё» пакетов.
5) Провайдер клиента для React-компонентов
Оборачивайте клиентские компоненты провайдером, который повторяет конфигурацию сервера и загружает только запрошенные пространства имён.
Совет для начинающих: вам не нужно передавать все сообщения клиенту. Начинайте только с пространств имён страницы.
6) Локализованный layout и маршруты
Установите язык и направление, а также предварительно сгенерируйте маршруты для каждой локали, чтобы способствовать статической отрисовке.
7) Пример страницы с использованием на сервере и клиенте
Переводы (один JSON на namespace в папке src/locales/...):
Клиентский компонент (загружает только необходимый namespace):
Убедитесь, что страница/провайдер включает только необходимые вам пространства имён (например,
about). Если вы используете React ниже версии 19, мемоизируйте тяжёлые форматтеры, такие какIntl.NumberFormat.
Синхронный серверный компонент, встроенный в клиентскую границу:
8) SEO: Метаданные, Hreflang, Sitemap, Robots
Перевод контента, это способ расширить охват. Тщательно настройте многоязычное SEO.
Лучшие практики:
- Установите
langиdirв корне - Добавьте
alternates.languagesдля каждого локали (+x-default) - Включите переведённые URL в
sitemap.xmlи используйтеhreflang - Исключите локализованные приватные области (например,
/fr/admin) вrobots.txt
9) Middleware для маршрутизации локали
Определяет локаль и перенаправляет на локализованный маршрут, если он отсутствует.
10) Лучшие практики производительности и удобства разработки (DX)
- Установите атрибуты html
langиdir: Выполнено вsrc/app/[locale]/layout.tsx. - Разделяйте сообщения по namespace: Держите бандлы маленькими (
common.json,about.jsonи т.д.). - Минимизируйте нагрузку на клиент: На страницах передавайте провайдеру только необходимые namespace.
- Предпочитайте статические страницы: Используйте
export const dynamic = 'force-static'иgenerateStaticParamsдля каждого локаля. - Синхронизируйте серверные компоненты: Передавайте заранее вычисленные строки/форматирование вместо асинхронных вызовов во время рендера.
- Мемоизируйте тяжёлые операции: Особенно в клиентском коде для старых версий React.
- Кэш и заголовки: Предпочитайте статический рендеринг или
revalidateвместо динамического, когда это возможно.
11) Тестирование и CI
- Добавьте unit-тесты для компонентов, использующих
t, чтобы гарантировать наличие ключей. - Проверяйте, что в каждом namespace присутствуют одинаковые ключи во всех локалях.
- Отображайте отсутствующие ключи во время CI перед деплоем.
Intlayer автоматизирует большую часть этого (см. следующий раздел).
12) Добавление Intlayer сверху (автоматизация)
Intlayer помогает поддерживать JSON-переводы в синхронизации, тестировать отсутствие ключей и заполнять их с помощью ИИ при необходимости.
Установите зависимости intlayer:
Добавьте скрипты в package.json:
Типичные сценарии использования:
pnpm i18n:testв CI для прерывания сборки при отсутствии ключейpnpm i18n:fillлокально для предложения AI-переводов для недавно добавленных ключей
Вы можете передавать аргументы CLI; смотрите документацию Intlayer CLI.
13) Устранение неполадок
- Ключи не найдены: Убедитесь, что страница/провайдер перечисляет правильные пространства имён, и что JSON-файл существует по пути
src/locales/<locale>/<namespace>.json. - Неправильный язык/мигание английского: Проверьте обнаружение локали в
middleware.tsи параметрlngу провайдера. - Проблемы с RTL-версткой: Убедитесь, что
dirполучается изisRtl(locale), и что ваш CSS учитывает[dir="rtl"]. - Отсутствуют SEO-альтернативы: Проверьте, что
alternates.languagesвключает все локали иx-default. - Слишком большие бандлы: Разбейте пространства имён на более мелкие и избегайте импорта всего дерева
localesна клиенте.
14) Что дальше
- Добавляйте больше локалей и пространств имён по мере роста функционала
- Локализуйте страницы ошибок, электронные письма и контент, управляемый через API
- Расширяйте рабочие процессы Intlayer для автоматического открытия PR с обновлениями переводов
Если вы предпочитаете стартовый шаблон, попробуйте: https://github.com/aymericzip/intlayer-next-i18next-template.