Rendering Statico vs Dinamico con i18n in Next.js
Il problema con next-intl
Cosa succede? Quando usi
useTranslations,getTranslationso qualsiasi helper di next-intl all'interno di un Componente Server in un'app con routing i18n (/en/…,/fr/…), Next.js marca l'intero percorso come dinamico. ([Next Intl][1])Perché? next-intl recupera la locale corrente da un header disponibile solo nella richiesta (
x-next-intl-locale) tramiteheaders(). Poichéheaders()è un'API dinamica, qualsiasi componente che la utilizza perde l'ottimizzazione statica. ([Next Intl][1], [Next.js][2])Soluzione ufficiale (boilerplate)
- Esporta
generateStaticParamscon ogni locale supportata. - Chiama
setRequestLocale(locale)in ogni layout/pagina prima di chiamareuseTranslations. ([Next Intl][1]) Questo rimuove la dipendenza dall'header, ma ora hai codice extra da mantenere e un'API instabile in produzione.
- Esporta
Come intlayer evita il problema
Scelte di design
- Solo parametro di rotta – La locale proviene dal segmento URL
[locale]che Next.js passa già a ogni pagina. - Bundle a tempo di compilazione – Le traduzioni sono importate come normali moduli ES, quindi vengono ottimizzate tramite tree-shaking e incorporate al momento della build.
- Nessuna API dinamica –
useT()legge dal contesto React, non daheaders()ocookies(). - Nessuna configurazione aggiuntiva – Una volta che le tue pagine risiedono sotto
app/[locale]/, Next.js prerenderizza automaticamente un file HTML per ogni locale.