Creation:2026-06-05Last update:2026-06-05

    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, MCP, e Skill per Agenti, 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 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 self-hosted e un CMS completo 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.

    1. Installare le Dipendenze

      Installa i pacchetti principali di Intlayer e l'adattatore di compatibilità @intlayer/next-intl:

      bash
      npm install intlayer next-intlayer @intlayer/next-intl @intlayer/sync-json-pluginnpx 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.
    2. Configurare Intlayer

      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:

      intlayer.config.ts
      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 per un elenco completo delle opzioni disponibili.
    3. Integrare il plugin Intlayer in Next.js

      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:

      next.config.ts
      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 dizionarioconst t = useTranslations("about");t("counter.label"); // ✓ autocompletatot("does.not.exist"); // ✗ Errore TypeScript// Componente Serverconst 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.

    1. Rinominare Esplicitamente le Importazioni (Opzionale)

      Opzionale

      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.

    2. Abilitare l'Automazione della Traduzione IA

      Opzionale

      Una volta configurato Intlayer, usa la CLI per inserire automaticamente le traduzioni mancanti usando l'LLM di tua scelta:

      bash
      # Testa le traduzioni mancanti (aggiungi alla CI)npx intlayer test# Compila le traduzioni mancanti tramite IAnpx intlayer fill

      Aggiungi OPENAI_API_KEY (o la chiave del tuo fornitore preferito) al tuo file .env ed estendi il tuo intlayer.config.ts:

      intlayer.config.ts
      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 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:

    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:

    .gitignore
    # Ignora i file generati da Intlayer.intlayer

    Esplora oltre