---
createdAt: 2026-06-05
updatedAt: 2026-06-05
title: "Migrazione da next-intl a Intlayer | Internazionalizzazione (i18n)"
description: "Scopri come migrare la tua applicazione Next.js da next-intl a Intlayer — passo dopo passo, senza interrompere il tuo codice esistente. Utilizza l'adattatore di compatibilità @intlayer/next-intl per una transizione fluida."
keywords:
- next-intl
- intlayer
- migrazione
- internazionalizzazione
- i18n
- Next.js
- JavaScript
- React
slugs:
- doc
- migration
- next-intl
history:
- version: 8.13.0
date: 2026-06-05
changes: "Init history"
---
# Migrazione da next-intl a Intlayer
## Perché migrare da next-intl a Intlayer?
Invece di caricare enormi file JSON nelle tue pagine, carica solo i contenuti necessari. Intlayer ti aiuta a **ridurre la dimensione del bundle e delle pagine fino al 50%**.
Definire lo scope dei contenuti della tua applicazione **facilita la manutenzione** per applicazioni su larga scala. Puoi duplicare o eliminare un'intera cartella di funzionalità senza lo sforzo mentale di revisionare l'intero codice dei contenuti. Inoltre, Intlayer è **completamente tipizzato** per garantire la correttezza dei tuoi contenuti.
Intlayer è anche la soluzione con lo **sviluppo più attivo** nell'ecosistema i18n — i problemi vengono risolti rapidamente, nuovi adattatori per framework vengono aggiunti regolarmente e l'API principale viene continuamente affinata sulla base di feedback reali in produzione.
La co-localizzazione dei contenuti **riduce il contesto necessario** per i Modelli Linguistici di Grandi Dimensioni (LLM). Intlayer offre inoltre una suite di strumenti, come una **CLI** per testare le traduzioni mancanti, **[LSP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/lsp.md)**, **[MCP](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/mcp_server.md)**, e **[Skill per Agenti](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/agent_skills.md)**, per rendere l'Esperienza Sviluppatore (DX) per gli agenti IA ancora più fluida.
Utilizza l'automazione per tradurre nella tua pipeline CI/CD impiegando l'LLM di tua scelta al costo del tuo provider IA. Intlayer offre inoltre un **compilatore** per automatizzare l'estrazione dei contenuti, così come una [piattaforma web](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_CMS.md) per facilitare **la traduzione in background**.
Collegare enormi file JSON ai componenti può portare a problemi di performance e reattività. Intlayer ottimizza il caricamento dei contenuti a tempo di build (build-time).
Molto più di una semplice soluzione i18n, Intlayer fornisce un **[editor visivo](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_visual_editor.md)** self-hosted e un **[CMS completo](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_CMS.md)** per aiutarti a gestire i tuoi contenuti multilingue in **tempo reale**, rendendo fluida la collaborazione con traduttori, copywriter e altri membri del team. Il contenuto può essere archiviato localmente e/o in remoto.
---
## Strategia di Migrazione
L'approccio raccomandato per le applicazioni esistenti è l'**adattatore di compatibilità**: Installa `@intlayer/next-intl`. Questo adattatore espone **esattamente la stessa API** di `next-intl`, ma delega tutto il lavoro di traduzione dietro le quinte a Intlayer.
Mantenere intatti i tuoi file esistenti `useTranslations`, `getTranslations`, `NextIntlClientProvider` e altri — **l'unico cambiamento necessario è il percorso di importazione**. Nessuna necessità di refactoring delle firme di chiamata, delle props o della struttura dei componenti.
Nel tempo, potrai opzionalmente migrare singoli file verso il formato più ricco `.content.ts` di Intlayer per sbloccare l'editor visivo, il CMS e lo scoping a livello di componente — ma questo passaggio è completamente opzionale e può essere fatto in modo incrementale.
---
## Indice
---
## Migrazione rapida
I seguenti passaggi rappresentano il minimo indispensabile per far funzionare la tua app `next-intl` esistente su Intlayer, senza modifiche al codice sorgente.
Installa i pacchetti principali di Intlayer e l'adattatore di compatibilità `@intlayer/next-intl`:
```bash packageManager="npm"
npm install intlayer next-intlayer @intlayer/next-intl @intlayer/sync-json-plugin
npx intlayer init
```
```bash packageManager="pnpm"
pnpm add intlayer next-intlayer @intlayer/next-intl @intlayer/sync-json-plugin
pnpm intlayer init
```
```bash packageManager="yarn"
yarn add intlayer next-intlayer @intlayer/next-intl @intlayer/sync-json-plugin
yarn intlayer init
```
```bash packageManager="bun"
bun add intlayer next-intlayer @intlayer/next-intl @intlayer/sync-json-plugin
bun x intlayer init
```
> Tieni installato `next-intl` — è ancora richiesto per il **routing degli URL** (`createNavigation`, `createMiddleware`, `Link`, `redirect`, `usePathname`, `useRouter`). L'adattatore di compatibilità **non** sostituisce il layer di routing.
Il comando `intlayer init` crea un file iniziale `intlayer.config.ts`. Aggiornalo affinché corrisponda alle tue lingue esistenti e indirizza il plugin `syncJSON` ai tuoi file di messaggi:
```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
import { Locales, type IntlayerConfig } from "intlayer";
import { syncJSON } from "@intlayer/sync-json-plugin";
const config: IntlayerConfig = {
internationalization: {
locales: [
Locales.ENGLISH,
Locales.FRENCH,
Locales.SPANISH,
// Aggiungi qui tutti i tuoi locale esistenti
],
defaultLocale: Locales.ENGLISH,
},
plugins: [
syncJSON({
// 'icu' corrisponde alla sintassi dei placeholder ICU di next-intl: {name}, {count, plural, ...}
format: "icu",
source: ({ locale }) => `./messages/${locale}.json`,
location: "messages",
}),
],
};
export default config;
```
> **`source`** mappa un locale al percorso del suo file JSON. **`location`** dice al watcher di Intlayer quale cartella monitorare per le modifiche. L'opzione `format: 'icu'` assicura che i placeholder ICU come `{name}` e `{count, plural, one {# item} other {# items}}` vengano analizzati correttamente.
> Vedi la [Documentazione di Configurazione](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/configuration.md) per un elenco completo delle opzioni disponibili.
Avvolgi la tua configurazione esistente in Next.js usando `createNextIntlPlugin` da `@intlayer/next-intl/plugin`. Questo wrapper applica `withIntlayer` **e** registra automaticamente l'alias `next-intl` → `@intlayer/next-intl`:
```typescript fileName="next.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
import type { NextConfig } from "next";
import { createNextIntlPlugin } from "@intlayer/next-intl/plugin";
const withIntlayer = createNextIntlPlugin();
const nextConfig: NextConfig = {
/* Le tue opzioni di configurazione esistenti */
};
export default withIntlayer(nextConfig);
```
> `createNextIntlPlugin()` avvolge `withIntlayer`, rileva automaticamente **Webpack** o **Turbopack**, si collega al watch dei contenuti, compila i dizionari e, soprattutto, **inietta alias per moduli**, così che le chiamate esistenti a `import … from 'next-intl'` vengano reindirizzate trasparentemente a `@intlayer/next-intl` a tempo di build. L'entry point di routing `next-intl/routing` continuerà a puntare al pacchetto reale. Non sono necessarie modifiche ai file sorgente.
>
> Preferisci usare il puro plugin `withIntlayer` da `next-intlayer/server`? Questo compila i dizionari ma **non** aggiunge gli alias di `next-intl` — in tal caso dovresti rinominare manualmente le importazioni a `@intlayer/next-intl` (vedi Passaggio 4).
> **`getRequestConfig` o `loadMessages` non sono più necessari.** Con `next-intl` era necessario scrivere un file `src/i18n.ts` che caricasse i messaggi JSON per ogni richiesta usando `getRequestConfig`. Intlayer compila tutti i dizionari **a tempo di build** (build-time), eliminando il passaggio di caricamento a runtime. Puoi eliminare tranquillamente questo file (oppure mantenere solo le parti di routing se continui a usare `createNavigation`).
Questo è tutto per la migrazione rapida. La tua app ora è in esecuzione su Intlayer pur mantenendo intatte tutte le importazioni e le API di `next-intl`.
> **Chiavi di traduzione tipizzate — automaticamente.** Una volta che Intlayer compila i tuoi dizionari, `useTranslations` e `getTranslations` sono tipizzati sul tuo contenuto effettivo. Le chiavi si autocompleteranno nel tuo IDE e i percorsi non validi restituiranno errori TypeScript al momento della build, senza alcuna configurazione extra richiesta.
>
> ```tsx
> // Componente Client — 'about' è una chiave registrata nel dizionario
> const t = useTranslations("about");
> t("counter.label"); // ✓ autocompletato
> t("does.not.exist"); // ✗ Errore TypeScript
>
> // Componente Server
> const t = await getTranslations("about");
> t("counter.label"); // ✓ tipizzato
> ```
---
## Migrazione completa
I passaggi seguenti sono opzionali e possono essere eseguiti in modo incrementale. Sbloccano l'intera gamma delle funzionalità di Intlayer: editor visivo, CMS, file di contenuto tipizzati, automazione della traduzione basata sull'IA e altro ancora.
Il wrapper `createNextIntlPlugin()` gestisce già l'aliasing di `next-intl` → `@intlayer/next-intl` a livello di bundler. Se preferisci rendere la dipendenza esplicita nei tuoi file di codice (e usare invece il puro plugin `withIntlayer`), puoi rinominare le importazioni manualmente:
| Prima | Dopo |
| ---------------------------------------------------- | -------------------------------------------------------------- |
| `import { useTranslations } from 'next-intl'` | `import { useTranslations } from '@intlayer/next-intl'` |
| `import { useLocale } from 'next-intl'` | `import { useLocale } from '@intlayer/next-intl'` |
| `import { NextIntlClientProvider } from 'next-intl'` | `import { NextIntlClientProvider } from '@intlayer/next-intl'` |
| `import { getTranslations } from 'next-intl/server'` | `import { getTranslations } from '@intlayer/next-intl/server'` |
| `import { getLocale } from 'next-intl/server'` | `import { getLocale } from '@intlayer/next-intl/server'` |
| `import { setLocale } from 'next-intl/server'` | `import { setLocale } from '@intlayer/next-intl/server'` |
| `import { getMessages } from 'next-intl/server'` | `import { getMessages } from '@intlayer/next-intl/server'` |
> Mantieni sempre le importazioni di routing dal vero `next-intl` — l'adattatore di compatibilità **non** sostituisce il layer di routing URL:
>
> ```ts
> // ✅ Mantieni queste dal vero 'next-intl'
> import { createNavigation } from "next-intl/routing";
> import { createMiddleware } from "next-intl/server";
> import { defineRouting } from "next-intl/routing";
> ```
>
> In alternativa, usare `defineRouting` da `@intlayer/next-intl/routing` permetterà l'unione automatica delle tue impostazioni locali in `intlayer.config.ts`.
Una volta configurato Intlayer, usa la CLI per inserire automaticamente le traduzioni mancanti usando l'LLM di tua scelta:
```bash packageManager="npm"
# Testa le traduzioni mancanti (aggiungi alla CI)
npx intlayer test
# Compila le traduzioni mancanti tramite IA
npx intlayer fill
```
```bash packageManager="pnpm"
pnpm intlayer test
pnpm intlayer fill
```
```bash packageManager="yarn"
yarn intlayer test
yarn intlayer fill
```
```bash packageManager="bun"
bun x intlayer test
bun x intlayer fill
```
Aggiungi `OPENAI_API_KEY` (o la chiave del tuo fornitore preferito) al tuo file `.env` ed estendi il tuo `intlayer.config.ts`:
```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
import { Locales, type IntlayerConfig } from "intlayer";
import { syncJSON } from "@intlayer/sync-json-plugin";
const config: IntlayerConfig = {
internationalization: {
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
defaultLocale: Locales.ENGLISH,
},
plugins: [
syncJSON({
format: "icu",
source: ({ locale }) => `./messages/${locale}.json`,
location: "messages",
}),
],
ai: {
apiKey: process.env.OPENAI_API_KEY,
// provider: "openai", // default
// model: "gpt-4o-mini", // default
},
};
export default config;
```
> Controlla la [Documentazione CLI Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/cli/index.md) per esplorare tutte le opzioni disponibili.
---
## Cosa si può cancellare post-migrazione
Una volta configurato `@intlayer/next-intl`, il seguente boilerplate standard di `next-intl` può essere cancellato:
| File / Modello | Perché non è più necessario |
| --------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| L'export di `getRequestConfig` in `src/i18n.ts` | Intlayer compila i dizionari a tempo di build; nessun caricamento di messaggi per-richiesta. Mantieni il file solo se esporta anche gli helper di routing di `createNavigation`. |
| La chiamata `loadMessages()` / `getMessages()` nel layout | `NextIntlClientProvider` da `@intlayer/next-intl` legge dall'output compilato; la prop `messages` non è richiesta. |
| Le importazioni di `locales/{locale}/*.json` nel layout | I bundle JSON sono necessari solo se si continua a utilizzare il plugin `syncJSON`. Una volta migrati verso file `.content.ts`, puoi rimuovere la cartella JSON. |
Quando sei pronto per andare oltre, Intlayer **scopre automaticamente ogni file `.content.ts` e `.content.json` ovunque nella tua codebase** (per impostazione predefinita, in qualsiasi punto all'interno di `./src`). Puoi posizionare un file `about.content.ts` proprio accanto al tuo `about/page.tsx`, ed Intlayer lo rileverà a tempo di build senza alcuna configurazione aggiuntiva — nessuna importazione, nessuna registrazione, nessun file index centrale necessario. Questo rende la co-localizzazione delle traduzioni con pagine e componenti completamente fluida.
---
## Setup TypeScript
Intlayer sfrutta l'estensione dei moduli (module augmentation) per offrire un completamento automatico (IntelliSense) TypeScript completo per le tue chiavi di traduzione. Assicurati che il tuo `tsconfig.json` includa i tipi generati automaticamente:
```json5 fileName="tsconfig.json"
{
// ... Le tue configurazioni TypeScript esistenti
"include": [
// ... Le tue configurazioni TypeScript esistenti
".intlayer/**/*.ts", // Includi i tipi auto-generati
],
}
```
---
## Configurazione Git
Aggiungi la directory generata da Intlayer al tuo `.gitignore`:
```plaintext fileName=".gitignore"
# Ignora i file generati da Intlayer
.intlayer
```
---
## Esplora oltre
- **Editor Visivo** — Gestisci le traduzioni in modo visivo nel tuo browser: [Intlayer Visual Editor](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_visual_editor.md)
- **CMS** — Esternalizza e gestisci i contenuti da remoto: [Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_CMS.md)
- **Estensione VS Code** — Ottieni il completamento automatico delle traduzioni e il rilevamento degli errori in tempo reale: [Intlayer VS Code Extension](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/vs_code_extension.md)
- **Riferimento CLI** — Elenco completo dei comandi CLI: [Intlayer CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/cli/index.md)
- **Intlayer con Next.js** — Guida completa all'installazione per Next.js: [intlayer_with_nextjs_16.md](https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/intlayer_with_nextjs_16.md)