1. Documentation
    2. Ambiente
    3. Intlayer con Vite e React

    Getting Started Internationalizing (i18n) with Intlayer and Vite and React

    What is Intlayer?

    Intlayer è una libreria innovativa e open-source di internazionalizzazione (i18n) progettata per semplificare il supporto multilingue nelle moderne applicazioni web.

    Con Intlayer, puoi:

    • Gestire facilmente le traduzioni utilizzando dizionari dichiarativi a livello di componente.
    • Localizzare dinamicamente metadati, percorsi e contenuti.
    • Garantire il supporto TypeScript con tipi autogenerati, migliorando l'autocompletamento e la rilevazione degli errori.
    • Beneficiare di funzionalità avanzate, come il rilevamento e il cambio dinamici della lingua.

    Step-by-Step Guide to Set Up Intlayer in a Vite and React Application

    Step 1: Install Dependencies

    Installa i pacchetti necessari utilizzando npm:

    bash
    1npm install intlayer react-intlayer
    bash
    1yarn add intlayer react-intlayer
    bash
    1pnpm add intlayer react-intlayer

    Step 2: Configuration of your project

    Crea un file di configurazione per configurare le lingue della tua applicazione:

    typescript
    1// intlayer.config.ts 2 3import { Locales, type IntlayerConfig } from "intlayer"; 4 5const config: IntlayerConfig = { 6 internationalization: { 7 locales: [ 8 Locales.ITALIAN, // Modificato per includere l'italiano 9 Locales.ENGLISH, 10 Locales.FRENCH, 11 Locales.SPANISH, 12 // Altre lingue 13 ], 14 defaultLocale: Locales.ENGLISH, 15 }, 16}; 17 18export default config;

    Per vedere tutti i parametri disponibili, consulta la documentazione di configurazione qui.

    Step 3: Integrate Intlayer in Your Vite Configuration

    Aggiungi il plugin intlayer nella tua configurazione.

    typescript
    1import { defineConfig } from "vite"; 2import react from "@vitejs/plugin-react-swc"; 3import { intLayerPlugin } from "react-intlayer/vite"; 4 5// https://vitejs.dev/config/ 6export default defineConfig({ 7 plugins: [react(), intLayerPlugin()], 8});

    Step 4: Declare Your Content

    Crea e gestisci i tuoi dizionari di contenuti:

    tsx
    1// src/app.content.tsx 2import { t, type DeclarationContent } from "intlayer"; 3import { type ReactNode } from "react"; 4 5const appContent = { 6 key: "app", 7 content: { 8 viteLogo: t({ 9 it: "Logo Vite", // Tradotto in italiano 10 en: "Vite logo", 11 fr: "Logo Vite", 12 es: "Logo Vite", 13 }), 14 reactLogo: t({ 15 it: "Logo React", // Tradotto in italiano 16 en: "React logo", 17 fr: "Logo React", 18 es: "Logo React", 19 }), 20 21 title: "Vite + React", 22 23 count: t({ 24 it: "il conteggio è ", // Tradotto in italiano 25 en: "count is ", 26 fr: "le compte est ", 27 es: "el recuento es ", 28 }), 29 30 edit: t<ReactNode>({ 31 // Non dimenticare di importare React se utilizzi un nodo React nel tuo contenuto 32 it: ( 33 <> 34 Modifica <code>src/App.tsx</code> e salva per testare HMR 35 </> 36 ), 37 en: ( 38 <> 39 Edit <code>src/App.tsx</code> and save to test HMR 40 </> 41 ), 42 fr: ( 43 <> 44 Éditez <code>src/App.tsx</code> et enregistrez pour tester HMR 45 </> 46 ), 47 es: ( 48 <> 49 Edita <code>src/App.tsx</code> y guarda para probar HMR 50 </> 51 ), 52 }), 53 54 readTheDocs: t({ 55 it: "Clicca sui loghi di Vite e React per saperne di più", // Tradotto in italiano 56 en: "Click on the Vite and React logos to learn more", 57 fr: "Cliquez sur les logos Vite et React pour en savoir plus", 58 es: "Haga clic en los logotipos de Vite y React para obtener más información", 59 }), 60 }, 61} satisfies DeclarationContent; 62 63export default appContent;

    Note: Se il tuo file di contenuto include codice TSX, dovresti considerare di importare import React from "react"; nel tuo file di contenuto.

    See how to declare your Intlayer declaration files.

    Step 5: Utilize Intlayer in Your Code

    Accedi ai tuoi dizionari di contenuto in tutta la tua applicazione:

    tsx
    1import { useState } from "react"; 2import reactLogo from "./assets/react.svg"; 3import viteLogo from "/vite.svg"; 4import "./App.css"; 5import { LocaleSwitcher } from "./components/LangSwitcherDropDown"; 6import { IntlayerProvider, useIntlayer } from "react-intlayer"; 7 8function AppContent() { 9 const [count, setCount] = useState(0); 10 const content = useIntlayer("app"); 11 12 return ( 13 <> 14 <div> 15 <a href="https://vitejs.dev" target="_blank"> 16 <img src={viteLogo} className="logo" alt={content.viteLogo.value} /> 17 </a> 18 <a href="https://react.dev" target="_blank"> 19 <img 20 src={reactLogo} 21 className="logo react" 22 alt={content.reactLogo.value} 23 /> 24 </a> 25 </div> 26 <h1>{content.title}</h1> 27 <div className="card"> 28 <button onClick={() => setCount((count) => count + 1)}> 29 {content.count} 30 {count} 31 </button> 32 <p>{content.edit}</p> 33 </div> 34 <p className="read-the-docs">{content.readTheDocs}</p> 35 <div className="absolute bottom-5 right-5 z-50"> 36 <LocaleSwitcher /> 37 </div> 38 </> 39 ); 40} 41 42function App() { 43 return ( 44 <IntlayerProvider> 45 <AppContent /> 46 </IntlayerProvider> 47 ); 48} 49 50export default App;

    Note: Se vuoi utilizzare il tuo contenuto in un attributo string, come alt, title, href, aria-label, ecc., devi chiamare il valore della funzione, come:

    tsx
    1<img src={content.image.src.value} alt={content.image.value} />

    (Optional) Step 6: Change the language of your content

    Per cambiare la lingua del tuo contenuto, puoi usare la funzione setLocale fornita dal hook useLocale. Questa funzione consente di impostare la lingua dell'applicazione e aggiornare di conseguenza il contenuto.

    tsx
    1import { Locales } from "intlayer"; 2import { useLocale } from "react-intlayer"; 3 4const LocaleSwitcher = () => { 5 const { setLocale } = useLocale(); 6 7 return ( 8 <button onClick={() => setLocale(Locales.ITALIAN)}> 9 {" "} 10 {/* Modificato per includere l'italiano */} 11 Cambia lingua in Italiano 12 </button> 13 ); 14};

    (Optional) Step 7: Add localized Routing to your application

    Lo scopo di questo passaggio è creare percorsi unici per ogni lingua. Questo è utile per SEO e URL amichevoli per SEO. Esempio:

    tsx
    1// /dashboard 2// /it/dashboard 3// /fr/dashboard

    Per impostazione predefinita, i percorsi non sono prefissati per la lingua predefinita. Se desideri prefissare la lingua predefinita, puoi impostare l'opzione middleware.prefixDefault su true nella tua configurazione. Consulta la documentazione di configurazione per ulteriori informazioni.

    Per aggiungere il routing localizzato alla tua applicazione, puoi creare un componente LocaleRouter che racchiude i percorsi della tua applicazione e gestisce il routing basato sulla lingua. Ecco un esempio usando React Router:

    tsx
    1// Importazione delle dipendenze e delle funzioni necessarie 2import { Locales, getConfiguration, getPathWithoutLocale } from "intlayer"; // Funzioni e tipi utili da 'intlayer' 3import { FC, PropsWithChildren } from "react"; // Tipi React per componenti funzionali e props 4import { IntlayerProvider } from "react-intlayer"; // Provider per il contesto di internazionalizzazione 5import { 6 BrowserRouter, 7 Routes, 8 Route, 9 useParams, 10 Navigate, 11 useLocation, 12} from "react-router-dom"; // Componenti Router per gestire la navigazione 13 14// Destrutturazione della configurazione da Intlayer 15const { internationalization, middleware } = getConfiguration(); 16const { locales, defaultLocale } = internationalization; 17 18/** 19 * Un componente che gestisce la localizzazione e avvolge i figli con il contesto di lingua appropriato. 20 * Gestisce la rilevazione e la validazione della lingua basata sull'URL. 21 */ 22const AppLocalized: FC<PropsWithChildren> = ({ children }) => { 23 const path = useLocation().pathname; // Ottieni il percorso URL corrente 24 const { locale } = useParams<{ locale: Locales }>(); // Estrai il parametro lingua dall'URL 25 26 // Determina la lingua corrente, tornando alla predefinita se non fornita 27 const currentLocale = locale ?? defaultLocale; 28 29 // Rimuovi il prefisso della lingua dal percorso per costruire un percorso base 30 const pathWithoutLocale = getPathWithoutLocale( 31 path // Percorso URL corrente 32 ); 33 34 /** 35 * Se middleware.prefixDefault è vero, la lingua predefinita dovrebbe sempre essere prefissata. 36 */ 37 if (middleware.prefixDefault) { 38 // Valida la lingua 39 if (!locale || !locales.includes(locale)) { 40 // Reindirizza alla lingua predefinita con il percorso aggiornato 41 return ( 42 <Navigate 43 to={`/${defaultLocale}/${pathWithoutLocale}`} 44 replace // Sostituisci l'attuale voce della storia con la nuova 45 /> 46 ); 47 } 48 49 // Avvolgi i figli con IntlayerProvider e imposta la lingua corrente 50 return ( 51 <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider> 52 ); 53 } else { 54 /** 55 * Quando middleware.prefixDefault è falso, la lingua predefinita non è prefissata. 56 * Assicurati che la lingua corrente sia valida e non sia la lingua predefinita. 57 */ 58 if ( 59 currentLocale.toString() !== defaultLocale.toString() && 60 !locales 61 .filter( 62 (locale) => locale.toString() !== defaultLocale.toString() // Escludi la lingua predefinita 63 ) 64 .includes(currentLocale) // Controlla se la lingua corrente è nella lista delle lingue valide 65 ) { 66 // Reindirizza al percorso senza prefisso della lingua 67 return <Navigate to={pathWithoutLocale} replace />; 68 } 69 70 // Avvolgi i figli con IntlayerProvider e imposta la lingua corrente 71 return ( 72 <IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider> 73 ); 74 } 75}; 76 77/** 78 * Un componente router che imposta percorsi specifici per la lingua. 79 * Usa React Router per gestire la navigazione e rendere componenti localizzati. 80 */ 81export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => ( 82 <BrowserRouter> 83 <Routes> 84 <Route 85 // Modello di percorso per catturare la lingua (es., /it/, /fr/) e corrispondere a tutti i percorsi successivi 86 path="/:locale/*" 87 element={<AppLocalized>{children}</AppLocalized>} // Avvolge i figli con la gestione della lingua 88 /> 89 90 { 91 // Se il prefisso della lingua predefinita è disabilitato, renderizza i figli direttamente nel percorso principale 92 !middleware.prefixDefault && ( 93 <Route 94 path="*" 95 element={<AppLocalized>{children}</AppLocalized>} // Avvolge i figli con la gestione della lingua 96 /> 97 ) 98 } 99 </Routes> 100 </BrowserRouter> 101);

    In parallelo, puoi anche usare il intLayerMiddlewarePlugin per aggiungere il routing sul server alla tua applicazione. Questo plugin rileverà automaticamente la lingua corrente in base all'URL e imposterà il cookie della lingua appropriata. Se nessuna lingua è specificata, il plugin determinerà la lingua più appropriata in base alle preferenze linguistiche del browser dell'utente. Se non viene rilevata alcuna lingua, verrà reindirizzato alla lingua predefinita.

    ts
    1import { defineConfig } from "vite"; 2import react from "@vitejs/plugin-react-swc"; 3import { intLayerPlugin, intLayerMiddlewarePlugin } from "react-intlayer/vite"; 4 5// https://vitejs.dev/config/ 6export default defineConfig({ 7 plugins: [react(), intLayerPlugin(), intLayerMiddlewarePlugin()], 8});

    (Optional) Step 8: Change the URL when the locale changes

    Per cambiare l'URL quando cambia la lingua, puoi usare la prop onLocaleChange fornita dal hook useLocale. In parallelo, puoi usare i hook useLocation e useNavigate da react-router-dom per aggiornare il percorso URL.

    tsx
    1import { Locales, getLocalizedUrl } from "intlayer"; 2import { useLocale } from "react-intlayer"; 3import { useLocation, useNavigate } from "react-router-dom"; 4 5const LocaleSwitcher = () => { 6 const location = useLocation(); // Ottieni il percorso URL corrente. Esempio: /it/about 7 const navigate = useNavigate(); 8 9 const changeUrl = (locale: Locales) => { 10 // Costruisci l'URL con la lingua aggiornata 11 // Esempio: /fr/about con la lingua impostata su francese 12 const pathWithLocale = getLocalizedUrl(location.pathname, locale); 13 14 // Aggiorna il percorso URL 15 navigate(pathWithLocale); 16 }; 17 18 const { setLocale } = useLocale({ 19 onLocaleChange: changeUrl, 20 }); 21 22 return ( 23 <button onClick={() => setLocale(Locales.ITALIAN)}> 24 Cambia lingua in Italiano 25 </button> 26 ); 27};

    Configure TypeScript

    Intlayer utilizza l'augmentation del modulo per ottenere i benefici di TypeScript e rendere il tuo codice più robusto.

    alt text

    alt text

    Assicurati che la tua configurazione TypeScript includa i tipi autogenerati.

    json5
    1// tsconfig.json 2 3{ 4 // la tua configurazione personalizzata 5 include: [ 6 "src", 7 "types", // <- Includi i tipi auto generati 8 ], 9}

    Git Configuration

    Si consiglia di ignorare i file generati da Intlayer. Questo ti permette di evitare di commetterli nel tuo repository Git.

    Per fare ciò, puoi aggiungere le seguenti istruzioni al tuo file .gitignore:

    gitignore
    1# Ignora i file generati da Intlayer 2.intlayer

    Se hai un’idea per migliorare questa documentazione, non esitare a contribuire inviando una pull request su GitHub.

    Collegamento GitHub alla documentazione

    In questa pagina