Pose una domanda e ottieni un riassunto del documento facendo riferimento a questa pagina e al provider AI di tua scelta
Cronologia delle versioni
- "Versione iniziale"v9.5.1026/09/2026
Il contenuto di questa pagina è stato tradotto con un'IA.
Vedi l'ultima versione del contenuto originale in ingleseSe hai un’idea per migliorare questa documentazione, non esitare a contribuire inviando una pull request su GitHub.
Collegamento GitHub alla documentazioneCopia il Markdown del documento nella porta-documenti
Come internazionalizzare la tua applicazione Next.js usando Lingui nel 2026
Indice
Cos'è Lingui?
Lingui è una libreria di internazionalizzazione (i18n) basata su macro ed estrazione dei messaggi. Scrivi il testo di origine nei tuoi componenti ( t`Hello` , <Trans>Hello</Trans>), lingui extract raccoglie ogni messaggio nei cataloghi (file PO per impostazione predefinita) e un loader li compila in JavaScript compatto. I messaggi utilizzano ICU MessageFormat e Lingui supporta i React Server Components nell'App Router.
Questa guida illustra la configurazione di Lingui in un progetto Next.js 16 App Router, con:
- Macro compilate tramite SWC, preservando la velocità di Turbopack.
- Server e Client Components che condividono la stessa API
TranseuseLingui. - Routing dei percorsi localizzati tramite
proxy.ts:/aboutper la lingua predefinita,/fr/aboutper le altre e rilevamento della lingua alla prima visita. - Rendering statico di ogni lingua tramite
generateStaticParams. - SEO multilingue completo:
generateMetadatatradotto, canonical,hreflangconx-default, impostazioni locali Open Graph, JSON-LD,sitemap.ts,robots.tse pagine 404 localizzate.
Cerchi un'altra libreria? Consulta la guida a next-intl, la guida a next-i18next o la guida a Next.js + Intlayer.
Usi TanStack Start? Consulta la guida a TanStack Start + Lingui. Vuoi confrontare le librerie? Leggi Lingui vs Intlayer e next-i18next vs next-intl vs Intlayer.
Cosa dice il benchmark su Lingui in Next.js
Il benchmark i18n esegue la stessa applicazione Next.js con 10 pagine e 10 lingue con tutte le principali librerie e misura ciò che il browser scarica effettivamente.
Caricamento JSON dinamico
Carica le traduzioni in modalità lazy durante l'esecuzione
JSON con ambito (namespacing)
Spazi dei nomi di traduzione per pagina
Benchmark delle prestazioni I18n
Cos'è questa metrica?
La dimensione totale compressa con gzip del bundle della libreria di internazionalizzazione. Include solo il provider e la logica di recupero dei contenuti dopo il tree-shaking e la minificazione.
Perché è importante?
Una dimensione della libreria più piccola riduce il payload JavaScript iniziale, portando a tempi di download ed esecuzione più rapidi sul client.
Visualizza come
Dati principali per @lingui/core@6.6.0 su Next.js 16, misurati il 2026-09-26 (gzip):
Apri la tabella in una finestra modale per visualizzare tutti i dati in modo chiaro
| Configurazione | Dimensione libreria | JS per pagina | Perdita altre lingue | Perdita altre pagine |
|---|---|---|---|---|
| Nessuna i18n (app base) | - | 141.0 KB | 0% | 0% |
| Lingui, un catalogo per lingua | 72.1 KB | 145.4 KB | 2.8% | 89.9% |
@intlayer/lingui (compat) | 10.7 KB | 221.6 KB | 50% | 90% |
next-intlayer (Intlayer nativo) | 4.9 KB | 141.5 KB | 0% | 0% |
Cosa tenere a mente:
- Un singolo catalogo per lingua perde comunque i messaggi delle altre pagine verso il provider client. Mantieni quanto più testo possibile nei Server Components, che inviano HTML renderizzato e non cataloghi.
- Il runtime di Lingui pesa circa 72 KB gzip. L'adattatore di compatibilità
@intlayer/linguiriduce il runtime a circa 11 KB, ma in questo benchmark la configurazione compatibile Next.js invia comunque interi cataloghi alla pagina. L'API nativanext-intlayerè la configurazione che mantiene le dimensioni dell'app base.
Consulta i dati completi: Rapporto benchmark Next.js e il repository del benchmark.
Confronto delle funzionalità su Next.js
Come si confronta Lingui con next-intl e Intlayer sulle funzionalità comunemente necessarie in un progetto Next.js App Router:
Apri la tabella in una finestra modale per visualizzare tutti i dati in modo chiaro
| Funzionalità | next-intlayer (Intlayer) | Lingui | next-intl |
|---|---|---|---|
| Traduzioni vicine ai componenti | ✅ Contenuto co-locato con ogni componente | ⚠️ Testo sorgente nei componenti, cataloghi centralizzati | ❌ JSON centralizzato |
| Integrazione TypeScript | ✅ Tipi rigorosi generati automaticamente | ⚠️ Macro tipizzate, cataloghi di messaggi non tipizzati | ✅ Buona, tramite estensione AppConfig |
| Rilevamento traduzioni mancanti | ✅ Errori TypeScript e avvisi in fase di build | ⚠️ Fallback a runtime al testo sorgente | ⚠️ Fallback a runtime |
| Contenuto ricco (JSX, Markdown) | ✅ Supporto diretto | ✅ JSX all'interno di <Trans>, nessun supporto Markdown | ⚠️ Tag tramite t.rich, nessun Markdown |
| Traduzione AI | ✅ Provider e chiave API propri, con contesto app | ❌ No | ❌ No |
| Editor visuale / CMS | ✅ Editor visuale locale + CMS opzionale | ❌ Tramite piattaforme esterne | ❌ Tramite piattaforme esterne |
| Routing localizzato | ✅ Integrato | ❌ Scrivi il tuo proxy.ts | ✅ Segmento [locale] integrato |
| Pluralizzazione | ✅ Basata su enumerazione | ✅ ICU, macro <Plural> | ✅ ICU |
| Formati di contenuto | ✅ .ts, .tsx, .js, .json, .md, .yaml | ✅ PO, JSON, CSV | ✅ .json, .js, .ts |
| ICU MessageFormat | ✅ Tramite format: "icu" | ✅ Nativo | ✅ Nativo |
| Helper SEO (hreflang, sitemap) | ✅ Helper per metadata, sitemap e robots.txt | ❌ Manuale | ✅ Buono |
| Server Components | ✅ Accesso diretto in qualsiasi Server Component | ⚠️ setI18n in ogni layout e pagina | ⚠️ await getTranslations() per componente |
| Tree-shaking per componente | ✅ In fase di build (Babel / SWC) | ⚠️ Un catalogo per lingua, l'estrattore per pagina è sperimentale | ⚠️ Manuale, con pick() per route |
| Dimensione runtime (gzip, bench) | 4.9 KB | 72.1 KB | 14.7 KB |
| Traduzioni mancanti in CI | ✅ npx intlayer test | ✅ lingui compile --strict | ⚠️ Non integrato |
| Ecosistema / community | ⚠️ Più piccolo, in rapida crescita | ✅ Maturo | ✅ Ampio |
Le dimensioni del runtime provengono dal benchmark Next.js. Per una discussione dettagliata, leggi Lingui vs Intlayer.
Altre guide Next.js: next-intl, next-i18next e Intlayer.
Pratiche consigliate da seguire
- Imposta
langedirsu<html>nel layout[locale]. - Preferisci i Server Components per il testo: eseguono il rendering dell'HTML sul server e non richiedono il catalogo sul client.
- Chiama
initLingui(locale)in ogni layout e pagina. I layout non vengono renderizzati nuovamente durante la navigazione, quindi una pagina non può fare affidamento sul fatto che il layout abbia impostato la lingua. - Mantieni un URL per lingua ed esegui il pre-rendering di ogni lingua con
generateStaticParams. - Traduci i tuoi metadati in
generateMetadata, concanonical,hreflangex-default. - Genera una sitemap multilingue e un file robots.txt con le convenzioni
sitemap.tserobots.ts. - Usa collegamenti reali per il selettore di lingua, in modo che i crawler possano scoprire tutte le versioni linguistiche.
- Esegui
lingui extractnella pipeline CI in modo che nessun nuovo messaggio venga rilasciato senza traduzione.
Consulta la nostra guida su internazionalizzazione e SEO, la guida su hreflang e il confronto SEO multilingue in Next.js.
Guida passo dopo passo per configurare Lingui in un'applicazione Next.js
Ecco la struttura del progetto che creeremo:
Copiare il codice nella clipboard
Installa le dipendenze
bashCopiare il codiceCopiare il codice nella clipboard
- @lingui/core / @lingui/react: runtime,
I18nProvider,setI18nper Server Components e le macro (@lingui/core/macro,@lingui/react/macro). - @lingui/swc-plugin: compila le macro all'interno della pipeline SWC di Next.js.
- @lingui/loader: compila i cataloghi
.poall'importazione, rendendo superfluolingui compile. - @lingui/cli:
lingui extractper raccogliere i messaggi nei cataloghi.
@lingui/swc-pluginè un plugin WebAssembly associato alla versione SWC di Next.js. Se la build fallisce dopo un aggiornamento di Next.js, aggiorna il plugin alla versione indicata come compatibile nel suo README.- @lingui/core / @lingui/react: runtime,
Centralizza la configurazione delle lingue
Un singolo file definisce le lingue e gli helper per gli URL. Routing, metadati, sitemap e Lingui leggono tutti da qui.
src/i18n/config.tsCopiare il codiceCopiare il codice nella clipboard
Configura Lingui e Next.js
lingui.config.tsCopiare il codiceCopiare il codice nella clipboard
Il plugin SWC compila le macro e il loader compila i file
.po, sia per Turbopack (predefinito in Next.js 16) che per webpack:next.config.tsCopiare il codiceCopiare il codice nella clipboard
Aggiungi gli script di estrazione:
package.jsonCopiare il codiceCopiare il codice nella clipboard
Carica i cataloghi e crea le istanze server
I Server Components non dispongono del contesto React, quindi Lingui fornisce
setI18nper registrare l'istanza per il render corrente. Questo modulo carica ogni catalogo una sola volta per processo server e crea un'istanzaI18nper ogni lingua. Essendoserver-only, i cataloghi delle altre lingue non raggiungono mai il bundle client.src/i18n/appRouterI18n.tsCopiare il codiceCopiare il codice nella clipboard
src/i18n/initLingui.tsCopiare il codiceCopiare il codice nella clipboard
Affinché TypeScript accetti l'importazione dei file
.po, dichiara il modulo una volta:src/i18n/po.d.tsCopiare il codiceCopiare il codice nella clipboard
Crea il provider client
I Client Components leggono le traduzioni da un contesto React. Il provider riceve il catalogo della lingua attiva dal layout server e crea la propria istanza una sola volta.
src/components/LinguiClientProvider.tsxCopiare il codiceCopiare il codice nella clipboard
Definisci le route dinamiche per le lingue
Il segmento
[locale]contiene il layout radice.generateStaticParamspre-renderizza ogni lingua in fase di build edynamicParams = falserestituisce un errore 404 per qualsiasi altro prefisso.src/app/[locale]/layout.tsxCopiare il codiceCopiare il codice nella clipboard
Il provider client riceve l'intero catalogo della lingua attiva. Questo è ciò che il benchmark definisce come "perdita altre pagine". Mantenere il testo nei Server Components riduce ciò di cui il client ha effettivamente bisogno. Per applicazioni di grandi dimensioni, l'estrattore per pagina sperimentale di Lingui (
experimental.extractorinlingui.config.ts) suddivide i cataloghi per punto di ingresso.Utilizza le traduzioni nei Server Components
I Server Components utilizzano le stesse macro dei Client Components.
initLinguideve essere eseguito anche nella pagina, poiché un layout non viene ri-renderizzato quando si naviga tra le sue pagine.src/app/[locale]/about/page.tsxCopiare il codiceCopiare il codice nella clipboard
Utilizza le traduzioni nei Client Components
I Client Components utilizzano le stesse importazioni. Le macro leggono l'istanza da
LinguiClientProvider.src/components/Counter.tsxCopiare il codiceCopiare il codice nella clipboard
Estrai e traduci i tuoi messaggi
Esegui l'estrazione. Lingui scrive ogni messaggio trovato in
srcnel catalogo di ciascuna lingua:bashCopiare il codiceCopiare il codice nella clipboard
Quindi traduci il campo
msgstrdi ciascuna voce:src/locales/fr/messages.poCopiare il codiceCopiare il codice nella clipboard
src/locales/es/messages.poCopiare il codiceCopiare il codice nella clipboard
I segnaposto
<0>mantengono gli elementi JSX di un tag<Trans>al loro posto, consentendo ai traduttori di spostarli senza toccare il markup.Configura il proxy per il routing delle lingue
OpzionaleNext.js 16 ha rinominato
middleware.tsinproxy.ts. Il proxy implementa la strategia del prefisso solo quando necessario:/fr/aboutviene servito così com'è;/en/aboutreindirizza a/about, in modo che la lingua predefinita abbia un singolo URL;/aboutviene riscritto internamente in/en/about, senza modificare l'URL visibile;- una prima visita su
/reindirizza alla lingua preferita (prima controlla il cookie, poiAccept-Language).
src/i18n/negotiateLocale.tsCopiare il codiceCopiare il codice nella clipboard
src/proxy.tsCopiare il codiceCopiare il codice nella clipboard
Cambia la lingua dei tuoi contenuti
OpzionaleusePathnamerestituisce l'URL visto dal browser (/abouto/fr/about). Rimuovi la lingua dal prefisso, quindi crea il link per ogni lingua. Il selettore renderizza link HTML reali, consentendo ai crawler di raggiungere ogni versione linguistica, mentre il cookie memorizza la scelta esplicita.src/components/LocaleSwitcher.tsxCopiare il codiceCopiare il codice nella clipboard
Crea un componente Link localizzato
Opzionalesrc/components/LocalizedLink.tsxCopiare il codiceCopiare il codice nella clipboard
Funziona anche dai Server Components, poiché viene renderizzato all'interno di
LinguiClientProvider:tsxCopiare il codiceCopiare il codice nella clipboard
Internazionalizza i tuoi metadati
OpzionaleOgni versione linguistica può posizionarsi autonomamente nei motori di ricerca, a condizione che ogni pagina fornisca:
- un
titlee unadescriptiontradotti; - un URL canonical che punti a se stesso;
- un alternativo
hreflangper ogni lingua, oltre ax-default; - campi Open Graph
locale,alternateLocaleeurl; - JSON-LD con
inLanguage.
generateMetadataviene eseguito all'esterno dell'albero React, quindi utilizza direttamente l'istanza server con la macromsg:src/i18n/metadata.tsCopiare il codiceCopiare il codice nella clipboard
src/app/[locale]/about/page.tsxCopiare il codiceCopiare il codice nella clipboard
Il markup JSON-LD viene renderizzato dalla pagina stessa. I file di pagina possono esportare solo campi speciali di Next.js, quindi mantieni il componente in un file separato:
src/components/WebPageJsonLd.tsxCopiare il codiceCopiare il codice nella clipboard
src/app/[locale]/about/page.tsxCopiare il codiceCopiare il codice nella clipboard
- un
Internazionalizza la tua sitemap
OpzionaleLa convenzione
sitemap.tssupportaalternates.languages, che Next.js renderizza come alternativixhtml:link. Elenca ogni URL per ogni lingua:src/app/sitemap.tsCopiare il codiceCopiare il codice nella clipboard
Internazionalizza il tuo robots.txt
OpzionaleI percorsi privati esistono in ogni lingua, quindi
disallowdeve coprire ogni percorso localizzato:src/app/robots.tsCopiare il codiceCopiare il codice nella clipboard
Gestisci le pagine 404 localizzate
Opzionalenot-found.tsxviene renderizzato all'interno del layout[locale], quindi ha accesso al provider client. La route catch-all reindirizza ad esso i percorsi sconosciuti all'interno di una lingua. Next.js aggiunge automaticamentenoindexalle risposte 404.src/app/[locale]/not-found.tsxCopiare il codiceCopiare il codice nella clipboard
src/app/[locale]/[...rest]/page.tsxCopiare il codiceCopiare il codice nella clipboard
Accedi alla lingua nelle Server Actions
OpzionaleLe Server Actions non ricevono i parametri di route. L'approccio più affidabile consiste nell'inviare la lingua con il modulo, dalla pagina che la conosce:
src/app/[locale]/contact/page.tsxCopiare il codiceCopiare il codice nella clipboard
src/app/actions/sendContactMessage.tsCopiare il codiceCopiare il codice nella clipboard
Mantieni le tue macro e riduci il runtime con Intlayer
OpzionaleL'adattatore di compatibilità
@intlayer/linguimantiene il codice sorgente intatto: le macro vengono compilate come prima e le conseguenti chiamate ai18n._(),useLingui()e<Trans>vengono gestite dai dizionari Intlayer. Nel benchmark Next.js, il runtime scende da ~72.1 KB a ~10.7 KB gzip.Su Next.js, l'adattatore viene collegato creando un alias per
@lingui/coree@lingui/reactverso@intlayer/linguiinnext.config.ts(webpack e Turbopack) e avvolgendo la configurazione conwithIntlayerdanext-intlayer/server. Mantieni@lingui/swc-pluginin modo che le macro vengano comunque compilate per prime. La configurazione completa è disponibile nella guida alla compatibilità di Lingui.Come mostrato nella tabella del benchmark, l'adattatore riduce il runtime ma non ancora il catalogo inviato a ogni pagina su Next.js. È ideale come soluzione ponte per la migrazione: una volta in esecuzione, puoi spostare i componenti uno alla volta verso l'API nativa
useIntlayer, che invia solo il contenuto renderizzato da ciascun componente. Consulta la guida a Next.js + Intlayer, Lingui vs @intlayer/lingui e tutti gli adattatori di compatibilità.Automatizza le tue traduzioni usando Intlayer
OpzionaleLingui estrae i messaggi, ma compilare decine di cataloghi a mano richiede la maggior parte del tempo. Intlayer è gratuito e open source, e i suoi strumenti funzionano perfettamente insieme a Lingui:
- Traduci con l'IA utilizzando la tua chiave API e il tuo provider preferito. Consulta auto fill e la CLI.
- Mantieni i tuoi file PO come fonte di verità con il plugin sync PO.
- Verifica le traduzioni mancanti nella pipeline CI. Consulta testare le traduzioni.
- Analizza il tuo sito pubblicato per individuare tag
hreflangmancanti, canonical errati e perdite di lingua con il comando scan.
Domande frequenti
Sì. @lingui/react supporta i React Server Components. I Server Components registrano l'istanza con setI18n da @lingui/react/server, i Client Components la leggono da I18nProvider, ed entrambi utilizzano le stesse macro Trans e useLingui.
I Server Components non hanno contesto, quindi l'istanza viene registrata per singolo render. I layout vengono preservati durante le navigazioni e non vengono renderizzati nuovamente, quindi una pagina non può fare affidamento sul layout per impostare la lingua. Chiamare initLingui(locale) all'inizio di ogni layout e pagina li mantiene indipendenti.
Usa @lingui/swc-plugin. Mantiene la pipeline SWC e Turbopack. L'aggiunta di una configurazione Babel disabilita SWC in Next.js e rallenta le build. L'unico vincolo è mantenere la versione del plugin compatibile con la versione di SWC della tua release di Next.js.
Ottieni l'istanza server con getI18nInstance(locale) e traduci i descrittori dichiarati con la macro msg: i18n._(msg`About us`). Restituisci alternates.canonical, alternates.languages con x-default e openGraph.locale. Il passaggio 13 fornisce un helper riutilizzabile.
Il benchmark misura circa 72 KB gzip per il runtime. Con un catalogo per lingua, le pagine pesano circa 145 KB rispetto ai 141 KB senza i18n, ma ogni pagina riceve comunque i messaggi delle altre pagine attraverso il provider client.
Lingui è adatto ai team che preferiscono scrivere il testo sorgente nei componenti e lavorare con file PO e traduttori. next-intl è ideale per i team che preferiscono cataloghi JSON e un'API t("key") strettamente integrata con Next.js. next-i18next offre l'ecosistema di plugin i18next. Consulta next-i18next vs next-intl vs Intlayer e il benchmark Next.js.
Commenti
Ancora nessun commento. Sii il primo a condividere i tuoi pensieri.
