Pose una domanda e ottieni un riassunto del documento facendo riferimento a questa pagina e al provider AI di tua scelta
Cronologia delle versioni
- "Aggiornare l'uso dell'API useIntlayer di Solid all'accesso diretto alle proprietà"v8.9.004/05/2026
- "Rilascio iniziale"v8.0.010/01/2026
Il contenuto di questa pagina è stato tradotto con un'IA.
Vedi l'ultima versione del contenuto originale in ingleseIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
Traduci il tuo sito Next.js 16 (senza [locale] nel percorso della pagina) usando Intlayer | Internazionalizzazione (i18n)
Vedi il template dell'applicazione su GitHub.
Indice
Perché Intlayer rispetto alle alternative?
Rispetto alle soluzioni principali come next-intl o i18next, Intlayer è una soluzione dotata di ottimizzazioni integrate come:
Intlayer è ottimizzato per funzionare con Componenti server per un rendering efficiente ed è completamente compatibile con Turbopack. Non blocca il rendering statico e offre middleware e tutte le funzionalità necessarie per scalare l'internazionalizzazione (i18n).
Intlayer è compatibile con Next.js 12, 13, 14, 15 e 16. Se stai utilizzando Next.js Pages Router, puoi fare riferimento a questa guida. Il routing per locale è utile per SEO, dimensioni del pacchetto e prestazioni. Se non ti serve, puoi fare riferimento a questa guida. Per Next.js 12, 13, 14 e 15 con App Router, fare riferimento a questa guida.
Invece di caricare enormi file JSON nelle tue pagine, carica solo il contenuto necessario. Intlayer aiuta a ridurre le dimensioni del bundle e della pagina fino al 50%.
L'ambito del contenuto dell'applicazione facilita la manutenzione per applicazioni su larga scala. Puoi duplicare o eliminare una singola cartella di funzionalità senza l'onere mentale di rivedere l'intera codebase dei contenuti. Inoltre, Intlayer è completamente tipizzato (fully typed) per garantire l'accuratezza dei tuoi contenuti.
La co-localizzazione dei contenuti riduce il contesto necessario dai Large Language Models (LLM). Intlayer viene fornito anche con una suite di strumenti, come una CLI per verificare le traduzioni mancanti,LSP, MCP e capacità dell'agente, per rendere l'esperienza dello sviluppatore (DX) ancora più fluida per gli agenti IA.
Utilizza l'automazione per tradurre nella tua pipeline CI/CD utilizzando il LLM di tua scelta al costo del tuo provider di intelligenza artificiale. Intlayer offre anche un compilatore per automatizzare l'estrazione dei contenuti, nonché una piattaforma web per aiutare a tradurre in background.
La connessione di enormi file JSON ai componenti può portare a problemi di prestazioni e reattività. Intlayer ottimizza il caricamento dei contenuti in fase di compilazione.
Più di una semplice soluzione i18n, Intlayer fornisce un editor visivo self-hosted e un CMS completo per aiutarti gestisci i tuoi contenuti multilingue in tempo reale, semplificando la collaborazione con traduttori, copywriter e altri membri del team. I contenuti possono essere archiviati localmente e/o in remoto.
Guida passo-passo per configurare Intlayer in un'applicazione Next.js
Installa le dipendenze
Installa i pacchetti necessari usando npm:
bashCopiare il codiceCopiare il codice nella clipboard
npm install intlayer next-intlayernpx intlayer initintlayer
Il pacchetto core che fornisce strumenti di internazionalizzazione per la gestione della configurazione, la traduzione, la dichiarazione dei contenuti, la transpilation e i comandi CLI.
next-intlayer
Il pacchetto che integra Intlayer con Next.js. Fornisce provider di contesto e hook per l'internazionalizzazione in Next.js. Inoltre include il plugin per Next.js per integrare Intlayer con Webpack o Turbopack, oltre a un proxy per rilevare la locale preferita dall'utente, gestire i cookie e gestire il reindirizzamento degli URL.
Configura il tuo progetto
Ecco la struttura finale che creeremo:
bashCopiare il codiceCopiare il codice nella clipboard
.├── src│ ├── app│ │ ├── layout.tsx│ │ ├── page.content.ts│ │ └── page.tsx│ ├── components│ │ ├── clientComponentExample│ │ │ ├── client-component-example.content.ts│ │ │ └── ClientComponentExample.tsx│ │ ├── localeSwitcher│ │ │ ├── localeSwitcher.content.ts│ │ │ └── LocaleSwitcher.tsx│ │ └── serverComponentExample│ │ ├── server-component-example.content.ts│ │ └── ServerComponentExample.tsx│ └── proxy.ts├── intlayer.config.ts├── next.config.ts├── package.json└── tsconfig.jsonSe non vuoi il routing delle localizzazioni, intlayer può essere utilizzato come semplice provider / hook. Consulta questa guida per maggiori dettagli.
Crea un file di configurazione per impostare le lingue della tua applicazione:
intlayer.config.tsCopiare il codiceCopiare il codice nella clipboard
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // Le tue altre localizzazioni ], defaultLocale: Locales.ENGLISH, }, routing: { mode: "search-params", // oppure `no-prefix` - Utile per il rilevamento nel middleware }, }; export default config;Attraverso questo file di configurazione, puoi impostare URL localizzati, reindirizzamenti proxy, nomi dei cookie, la posizione e l'estensione delle tue dichiarazioni di contenuto, disabilitare i log di Intlayer nella console e altro. Per l'elenco completo dei parametri disponibili, fai riferimento alla documentazione di configurazione.
Integra Intlayer nella tua configurazione Next.js
Configura il progetto Next.js per utilizzare Intlayer:
next.config.tsCopiare il codiceCopiare il codice nella clipboard
import type { NextConfig } from "next"; import { withIntlayer } from "next-intlayer/server"; const nextConfig: NextConfig = { /* opzioni di configurazione qui */ }; export default withIntlayer(nextConfig);Il plugin Next.js
withIntlayer()viene utilizzato per integrare Intlayer con Next.js. Garantisce la generazione dei file di dichiarazione dei contenuti e il loro monitoraggio in modalità di sviluppo. Definisce le variabili d'ambiente di Intlayer negli ambienti Webpack o Turbopack. Inoltre fornisce alias per ottimizzare le prestazioni e assicura la compatibilità con i server components.La funzione
withIntlayer()è una funzione che restituisce una Promise. Permette di preparare i dizionari di Intlayer prima dell'inizio della build. Se vuoi usarla con altri plugin, puoi metterla in await. Esempio:tsCopiare il codiceCopiare il codice nella clipboard
const nextConfig = await withIntlayer(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;Se vuoi usarlo in modo sincrono, puoi usare la funzione
withIntlayerSync(). Esempio:tsCopiare il codiceCopiare il codice nella clipboard
const nextConfig = withIntlayerSync(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;Intlayer rileva automaticamente se il tuo progetto utilizza webpack o Turbopack in base ai flag della riga di comando
--webpack,--turboo--turbopack, oltre che alla tua versione corrente di Next.js.Dal momento che
next>=16, se stai usando Rspack, devi forzare esplicitamente Intlayer a usare la configurazione webpack disabilitando Turbopack:tsCopiare il codiceCopiare il codice nella clipboard
withRspack(withIntlayer(nextConfig, { enableTurbopack: false }));Definire le rotte locali dinamiche
Rimuovi tutto da
RootLayoute sostituiscilo con il codice seguente:src/app/layout.tsxCopiare il codiceCopiare il codice nella clipboard
import type { Metadata } from "next"; import type { ReactNode } from "react"; import "./globals.css"; import { IntlayerClientProvider, LocalPromiseParams } from "next-intlayer"; import { getHTMLTextDir, getIntlayer } from "intlayer"; import { getLocale } from "next-intlayer/server"; export { generateStaticParams } from "next-intlayer"; export const generateMetadata = async (): Promise<Metadata> => { const locale = await getLocale(); const { title, description, keywords } = getIntlayer("metadata", locale); return { title, description, keywords, }; }; const RootLayout = async ({ children, }: Readonly<{ children: ReactNode; }>) => { const locale = await getLocale(); return ( <html lang={locale} dir={getHTMLTextDir(locale)}> <IntlayerClientProvider defaultLocale={locale}> <body>{children}</body> </IntlayerClientProvider> </html> ); }; export default RootLayout;Dichiarare i tuoi contenuti
Crea e gestisci le tue dichiarazioni di contenuto per memorizzare le traduzioni:
src/app/metadata.content.tsCopiare il codiceCopiare il codice nella clipboard
import { t, type Dictionary } from "intlayer"; import { Metadata } from "next"; const metadataContent = { key: "metadata", content: { title: t({ it: "Il Titolo del mio Progetto", en: "My Project Title", fr: "Le Titre de mon Projet", es: "El Título de mi Proyecto", }), description: t({ it: "Scopri la nostra piattaforma innovativa progettata per semplificare il tuo flusso di lavoro e aumentare la produttività.", en: "Discover our innovative platform designed to streamline your workflow and boost productivity.", fr: "Découvrez notre plateforme innovante conçue pour simplifier votre flux de travail et booster votre productivité.", es: "Descubra nuestra plataforma innovadora diseñada para simplificar su flujo de trabajo y aumentar su productividad.", }), keywords: t({ it: ["innovazione", "produttività", "flusso di lavoro", "SaaS"], en: ["innovation", "productivity", "workflow", "SaaS"], it: ["innovazione", "produttività", "flusso di lavoro", "SaaS"], fr: ["innovation", "productivité", "flux de travail", "SaaS"], es: ["innovación", "productividad", "flujo de trabajo", "SaaS"], }), }, } as Dictionary<Metadata>; export default metadataContent;src/app/page.content.tsCopiare il codiceCopiare il codice nella clipboard
import { t, type Dictionary } from "intlayer"; const pageContent = { key: "page", content: { getStarted: { main: t({ it: "Inizia modificando", en: "Get started by editing", fr: "Commencez par éditer", es: "Comience por editar", }), pageLink: "src/app/page.tsx", }, }, } satisfies Dictionary; export default pageContent;Le dichiarazioni di contenuto possono essere definite in qualsiasi punto della tua applicazione non appena vengono incluse nella directory
contentDir(per impostazione predefinita,./src). E devono corrispondere all'estensione dei file di dichiarazione del contenuto (per impostazione predefinita,.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}).Per maggiori dettagli, consulta la documentazione sulle dichiarazioni di contenuto.
Utilizzare il contenuto nel codice
Accedi ai tuoi dizionari di contenuto in tutta l'applicazione:
src/app/page.tsxCopiare il codiceCopiare il codice nella clipboard
import type { FC } from "react"; import { ClientComponentExample } from "@components/clientComponentExample/ClientComponentExample"; import { ServerComponentExample } from "@components/serverComponentExample/ServerComponentExample"; import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server"; import { NextPage } from "next"; import { getLocale } from "next-intlayer/server"; import { headers, cookies } from "next/headers"; const PageContent: FC = () => { const content = useIntlayer("page"); return ( <> <p>{content.getStarted.main}</p> <code>{content.getStarted.pageLink}</code> </> ); }; const Page: NextPage = async () => { const locale = await getLocale(); return ( <IntlayerServerProvider locale={locale}> <PageContent /> <ServerComponentExample /> <ClientComponentExample /> </IntlayerServerProvider> ); }; export default Page;IntlayerClientProviderè usato per fornire la locale ai componenti lato client. Può essere posizionato in qualsiasi componente genitore, incluso il layout. Tuttavia, posizionarlo in un layout è consigliato perché Next.js condivide il codice del layout tra le pagine, rendendolo più efficiente. UsandoIntlayerClientProvidernel layout, eviti di reinizializzarlo per ogni pagina, migliorando le prestazioni e mantenendo un contesto di localizzazione coerente in tutta l'applicazione.IntlayerServerProviderviene utilizzato per fornire la locale ai componenti figli lato server. Non può essere impostato nel layout.Layout e pagina non possono condividere un contesto server comune perché il sistema di contesto server si basa su un archivio di dati per richiesta (tramite il meccanismo della cache di React), causando la ricreazione di ogni "context" per segmenti diversi dell'applicazione. Posizionare il provider in un layout condiviso romperebbe questo isolamento, impedendo la corretta propagazione dei valori del contesto server ai tuoi componenti server.
src/components/clientComponentExample/ClientComponentExample.tsxCopiare il codiceCopiare il codice nella clipboard
"use client"; import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; export const ClientComponentExample: FC = () => { const content = useIntlayer("client-component-example"); // Crea la dichiarazione del contenuto correlato return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };src/components/serverComponentExample/ServerComponentExample.tsxCopiare il codiceCopiare il codice nella clipboard
import type { FC } from "react"; import { useIntlayer } from "next-intlayer/server"; export const ServerComponentExample: FC = () => { const content = useIntlayer("server-component-example"); // Crea la dichiarazione di contenuto correlata return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };Se vuoi utilizzare il tuo contenuto in un attributo di tipo
string, comealt,title,href,aria-label, ecc., devi invocare il valore della funzione, ad esempio:htmlCopiare il codiceCopiare il codice nella clipboard
<img src="{content.image.src.value}" alt="{content.image.value}" /><img src="{content.image.src.toString()}" alt="{content.image.toString()}" /><img src="{String(content.image.src)}" alt="{String(content.image)}" />Per saperne di più sull'hook
useIntlayer, consulta la documentazione.Configurare il proxy per il rilevamento della locale
OpzionaleConfigura il proxy per rilevare la locale preferita dell'utente:
src/proxy.tsCopiare il codiceCopiare il codice nella clipboard
export { intlayerProxy as proxy } from "next-intlayer/proxy"; export const config = { matcher: "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)", };Il
intlayerProxyviene usato per rilevare la locale preferita dell'utente e reindirizzarlo all'URL appropriato come specificato nella configurazione. Inoltre, permette di salvare la locale preferita dell'utente in un cookie.Se hai bisogno di concatenare più proxy insieme (per esempio,
intlayerProxycon autenticazione o proxy personalizzati), Intlayer fornisce ora un helper chiamatomultipleProxies.tsCopiare il codiceCopiare il codice nella clipboard
import { multipleProxies, intlayerProxy } from "next-intlayer/proxy";import { customProxy } from "@utils/customProxy";export const proxy = multipleProxies([intlayerProxy, customProxy]);Cambiare la lingua del tuo contenuto
OpzionalePer cambiare la lingua dei tuoi contenuti in Next.js, il modo consigliato è utilizzare il componente
Linkper reindirizzare gli utenti alla pagina localizzata appropriata. Il componenteLinkabilita il prefetching della pagina, il che aiuta a evitare un ricaricamento completo della pagina.src/components/localeSwitcher/LocaleSwitcher.tsxCopiare il codiceCopiare il codice nella clipboard
"use client"; import type { FC } from "react"; import { Locales, getHTMLTextDir, getLocaleName } from "intlayer"; import { useLocale } from "next-intlayer"; export const LocaleSwitcher: FC = () => { const { locale, availableLocales, setLocale } = useLocale(); return ( <div> <button popoverTarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <button key={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={() => setLocale(localeItem)} > <span> {/* Codice locale - es. FR */} {localeItem} </span> <span> {/* Nome della lingua nella propria lingua - es. Français */} {getLocaleName(localeItem, locale)} </span> <span dir={getHTMLTextDir(localeItem)} lang={localeItem}> {/* Nome della lingua nella lingua corrente - es. Francés con la locale corrente impostata su Locales.SPANISH */} {getLocaleName(localeItem)} </span> <span dir="ltr" lang={Locales.ENGLISH}> {/* Lingua in inglese - es. Francese */} {getLocaleName(localeItem, Locales.ENGLISH)} </span> </button> ))} </div> </div> ); };Un modo alternativo è usare la funzione
setLocalefornita dall'hookuseLocale. Questa funzione non permette il prefetch della pagina. Vedi la documentazione dell'hookuseLocaleper maggiori dettagli.Riferimenti alla documentazione:
Ottenere la locale corrente nelle Server Actions
OpzionaleSe hai bisogno della locale attiva all'interno di una Server Action (es., per localizzare email o eseguire logica dipendente dalla locale), chiama
getLocaledanext-intlayer/server:src/app/actions/getLocale.tsCopiare il codiceCopiare il codice nella clipboard
"use server";import { getLocale } from "next-intlayer/server";export const myServerAction = async () => { const locale = await getLocale(); // Esegui qualcosa con la locale};La funzione
getLocalesegue una strategia a cascata per determinare la locale dell'utente:- Per prima cosa, controlla gli header della richiesta per un valore di locale che potrebbe essere stato impostato dal proxy
- Se non viene trovata una locale negli header, cerca una locale memorizzata nei cookie
- Se non viene trovato alcun cookie, tenta di rilevare la lingua preferita dell'utente dalle impostazioni del browser
- Come ultima risorsa, ricorre alla locale predefinita configurata nell'applicazione
Questo garantisce che venga selezionata la locale più appropriata in base al contesto disponibile.
Ottimizza la dimensione del bundle
OpzionaleQuando usi
next-intlayer, i dizionari vengono inclusi nel bundle per ogni pagina per impostazione predefinita. Per ottimizzare la dimensione del bundle, Intlayer fornisce un plugin SWC opzionale che sostituisce in modo intelligente le chiamate auseIntlayerusando delle macro. Questo assicura che i dizionari vengano inclusi solo nei bundle delle pagine che li utilizzano effettivamente.Per abilitare questa ottimizzazione, installa il pacchetto
@intlayer/swc. Una volta installato,next-intlayerrileverà e userà automaticamente il plugin:bashCopiare il codiceCopiare il codice nella clipboard
npm install @intlayer/swc --save-devNota: Questa ottimizzazione è disponibile solo per Next.js 13 e versioni successive.
Nota: Questo pacchetto non è installato di default perché i plugin SWC sono ancora sperimentali su Next.js. Potrebbe cambiare in futuro.
Nota: Se imposti l'opzione come
importMode: 'dynamic'oimportMode: 'fetch'(in thedictionaryconfiguration), si baserà su Suspense, quindi dovrai avvolgere le chiamate auseIntlayerin un boundarySuspense. Ciò significa che non potrai utilizzareuseIntlayerdirettamente a livello superiore del tuo componente Page/Layout.
Monitorare le modifiche dei dizionari con Turbopack
Quando usi Turbopack come server di sviluppo con il comando next dev, le modifiche ai dizionari non verranno rilevate automaticamente per impostazione predefinita.
Questa limitazione si verifica perché Turbopack non può eseguire in parallelo i plugin di webpack per monitorare le modifiche nei file di contenuto. Per aggirare questo problema, dovrai usare il comando intlayer watch per eseguire simultaneamente sia il server di sviluppo che il watcher di build di Intlayer.
Copiare il codice nella clipboard
{ // ... Le tue configurazioni esistenti di package.json "scripts": { // ... Le tue configurazioni esistenti degli script "dev": "intlayer watch --with 'next dev'", },}Se stai usando next-intlayer@<=6.x.x, devi mantenere il flag --turbopack affinché l'applicazione Next.js 16 funzioni correttamente con Turbopack. Raccomandiamo di usare next-intlayer@>=7.x.x per evitare questa limitazione.
Configurare TypeScript
Intlayer usa il module augmentation per ottenere i benefici di TypeScript e rendere la tua codebase più solida.


Assicurati che la tua configurazione TypeScript includa i tipi autogenerati.
Copiare il codice nella clipboard
{ // ... Le tue configurazioni TypeScript esistenti "include": [ // ... Le tue configurazioni TypeScript esistenti ".intlayer/**/*.ts", // Includi i tipi generati automaticamente ],}Configurazione Git
Si consiglia di ignorare i file generati da Intlayer. Questo ti permette di evitare di committarli nel tuo repository Git.
Per farlo, puoi aggiungere le seguenti istruzioni al file .gitignore:
Copiare il codice nella clipboard
# Ignora i file generati da Intlayer.intlayerEstensione VS Code
Per migliorare la tua esperienza di sviluppo con Intlayer, puoi installare l'estensione ufficiale Intlayer per VS Code.
Installa dal Marketplace di VS Code
Questa estensione offre:
- Autocompletion per le chiavi di traduzione.
- Rilevamento errori in tempo reale per traduzioni mancanti.
- Anteprime inline del contenuto tradotto.
- Azioni rapide per creare e aggiornare facilmente le traduzioni.
Per maggiori dettagli su come usare l'estensione, consulta la documentazione dell'Intlayer VS Code Extension.
Approfondisci
Per approfondire, puoi implementare il visual editor o esternalizzare il tuo contenuto usando il CMS.