Статическая и динамическая отрисовка с i18n в Next.js
Проблема с next-intl
Что происходит? Когда вы используете
useTranslations,getTranslationsили любой помощник next-intl внутри серверного компонента в приложении с i18n-маршрутизацией (/en/…,/fr/…), Next.js помечает весь маршрут как динамический. ([Next Intl][1])Почему? next-intl получает текущую локаль из заголовка, доступного только в запросе (
x-next-intl-locale) черезheaders(). Посколькуheaders()- это динамический API, любой компонент, который его использует, теряет статическую оптимизацию. ([Next Intl][1], [Next.js][2])Официальное решение (шаблон)
- Экспортируйте
generateStaticParamsдля каждой поддерживаемой локали. - Вызывайте
setRequestLocale(locale)в каждом layout/странице до вызоваuseTranslations. ([Next Intl][1]) Это устраняет зависимость от заголовка, но теперь у вас появляется дополнительный код для поддержки и нестабильный API в продакшене.
- Экспортируйте
Как intlayer обходит эту проблему
Выбор архитектуры
- Только параметр маршрута – Локаль берется из сегмента URL
[locale], который Next.js уже передает каждой странице. - Пакеты на этапе компиляции – Переводы импортируются как обычные ES-модули, поэтому они подвергаются tree-shaking и встраиваются на этапе сборки.
- Отсутствие динамических API –
useT()читает данные из контекста React, а не изheaders()илиcookies(). - Никакой дополнительной настройки – Как только ваши страницы находятся в папке
app/[locale]/, Next.js автоматически предварительно рендерит один HTML-файл для каждой локали.