Statisches vs. dynamisches Rendering mit i18n in Next.js
Das Problem mit next-intl
Was passiert? Wenn Sie
useTranslations,getTranslationsoder einen anderen next-intl-Helfer innerhalb einer Server-Komponente in einer i18n-gerouteten App (/en/…,/fr/…) verwenden, markiert Next.js die gesamte Route als dynamisch. ([Next Intl][1])Warum? next-intl liest die aktuelle Locale aus einem nur bei der Anfrage verfügbaren Header (
x-next-intl-locale) überheaders()aus. Daheaders()eine dynamische API ist, verliert jede Komponente, die darauf zugreift, die statische Optimierung. ([Next Intl][1], [Next.js][2])Offizieller Workaround (Boilerplate)
- Exportieren Sie
generateStaticParamsmit jeder unterstützten Locale. - Rufen Sie
setRequestLocale(locale)in jedem Layout/Seite vor dem Aufruf vonuseTranslationsauf. ([Next Intl][1]) Dies entfernt die Abhängigkeit vom Header, aber Sie haben nun zusätzlichen Code zu pflegen und eine instabile API in der Produktion.
- Exportieren Sie
Wie intlayer das Problem umgeht
Designentscheidungen
- Nur Routen-Parameter – Die Locale stammt aus dem
[locale]URL-Segment, das Next.js bereits an jede Seite übergibt. - Kompilierungszeit-Bundles – Übersetzungen werden als reguläre ES-Module importiert, sodass sie baumgeschüttelt und zur Build-Zeit eingebettet werden.
- Keine dynamischen APIs –
useT()liest aus dem React-Kontext, nicht ausheaders()odercookies(). - Keine zusätzliche Konfiguration – Sobald Ihre Seiten unter
app/[locale]/liegen, rendert Next.js automatisch eine HTML-Datei pro Locale vor.