Lingui.js è un framework di internazionalizzazione (i18n) leggero ma potente per applicazioni JavaScript e React. Utilizza file PO (Portable Object) standard del settore per i cataloghi di traduzione, potenti macro in fase di compilazione per un'esperienza di sviluppo pulita e produce bundle ottimizzati inferiori a 2 kB. Questa guida copre tutto, dalla configurazione del progetto ai flussi di lavoro dei file PO, la pluralizzazione e l'automazione delle traduzioni con l10n.dev.
Lingui.js si distingue tra le librerie i18n per JavaScript per la sua combinazione di esperienza di sviluppo, prestazioni e flussi di lavoro di traduzione professionali:
Installa i pacchetti principali e gli strumenti di sviluppo di Lingui. I pacchetti runtime (@lingui/core e @lingui/react) sono necessari in produzione, mentre la CLI, il plugin Vite e la macro Babel sono solo per lo sviluppo:
npm install @lingui/core @lingui/react
npm install --save-dev @lingui/cli @lingui/vite-plugin @lingui/babel-plugin-lingui-macroLingui richiede due file di configurazione: la configurazione di Lingui (che definisce le lingue e i percorsi dei cataloghi) e la configurazione del tuo strumento di build (per abilitare le macro in fase di compilazione).
Crea un file lingui.config.js nella root del progetto. Questo definisce la lingua sorgente, le lingue di destinazione, dove archiviare i cataloghi PO e il formato del catalogo. Il formato PO è la scelta predefinita e consigliata:
// lingui.config.js
import { defineConfig } from "@lingui/cli";
import { formatter } from "@lingui/format-po";
export default defineConfig({
sourceLocale: "en",
locales: ["en", "fr", "de", "ja", "es", "zh-CN"],
catalogs: [
{
path: "<rootDir>/src/locales/{locale}/messages",
include: ["src"],
},
],
format: formatter({ lineNumbers: false }),
});Se usi Vite, aggiungi il plugin Lingui insieme al plugin React con la macro Babel. Ciò abilita la trasformazione dei messaggi in fase di compilazione e la compilazione del catalogo al volo:
// vite.config.ts
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { lingui } from "@lingui/vite-plugin";
export default defineConfig({
plugins: [
react({
babel: {
plugins: ["@lingui/babel-plugin-lingui-macro"],
},
}),
lingui(),
],
});PO (Portable Object) è il formato di file di traduzione standard del settore, derivante dal sistema GNU gettext. Lingui utilizza PO come formato di catalogo predefinito perché è ampiamente supportato da strumenti di traduzione, piattaforme TMS e traduttori professionisti in tutto il mondo.
#: src/components/WelcomeBanner.js:6
msgid "Welcome to our platform"
msgstr ""
#: src/components/WelcomeBanner.js:8
msgid "Hello {userName}, check out your <0>dashboard</0> to get started."
msgstr ""
#: src/components/CartSummary.js:5
msgid "{itemCount, plural, =0 {Your cart is empty} one {You have # item in your cart} other {You have # items in your cart}}"
msgstr ""Dopo la traduzione, ogni msgstr viene popolato con la versione localizzata. Lingui preserva la sintassi ICU MessageFormat, i tag indicizzati per i componenti React e le variabili segnaposto in tutte le traduzioni.
#: src/components/WelcomeBanner.js:6
msgid "Welcome to our platform"
msgstr "Bienvenue sur notre plateforme"
#: src/components/WelcomeBanner.js:8
msgid "Hello {userName}, check out your <0>dashboard</0> to get started."
msgstr "Bonjour {userName}, consultez votre <0>tableau de bord</0> pour commencer."
#: src/components/CartSummary.js:5
msgid "{itemCount, plural, =0 {Your cart is empty} one {You have # item in your cart} other {You have # items in your cart}}"
msgstr "{itemCount, plural, =0 {Votre panier est vide} one {Vous avez # article dans votre panier} other {Vous avez # articles dans votre panier}}"Organizza i tuoi cataloghi PO all'interno di una directory locales con una sottocartella per ogni lingua. La CLI di Lingui crea e aggiorna automaticamente questi file durante l'estrazione. I moduli JS compilati vengono generati durante la build e non dovrebbero essere modificati manualmente.
src/
├── locales/
│ ├── en/
│ │ └── messages.po ← Source (English)
│ ├── fr/
│ │ └── messages.po ← French
│ ├── de/
│ │ └── messages.po ← German
│ ├── ja/
│ │ └── messages.po ← Japanese
│ ├── es/
│ │ └── messages.po ← Spanish
│ └── zh-CN/
│ └── messages.po ← Chinese Simplified
├── components/
├── i18n.ts
├── App.tsx
└── ...Lingui fornisce due approcci principali per contrassegnare i messaggi: macro JSX per il contenuto dei componenti e l'hook useLingui per stringhe imperative. Entrambi sono macro in fase di compilazione che producono output ottimizzato.
Avvolgi qualsiasi contenuto JSX nella macro Trans per renderlo traducibile. Variabili, elementi HTML e componenti React sono pienamente supportati: la macro li trasforma automaticamente in ICU MessageFormat con tag indicizzati.
import { Trans } from "@lingui/react/macro";
function WelcomeBanner({ userName }) {
return (
<div>
<h1>
<Trans>Welcome to our platform</Trans>
</h1>
<p>
<Trans>
Hello {userName}, check out your <a href="/dashboard">dashboard</a> to
get started.
</Trans>
</p>
</div>
);
}Per stringhe al di fuori di JSX (messaggi di avviso, etichette aria, valori di attributi o qualsiasi codice imperativo), usa l'hook macro useLingui con template letterali taggati:
import { useLingui } from "@lingui/react/macro";
function NotificationButton() {
const { t } = useLingui();
const showAlert = () => {
alert(t`Your changes have been saved.`);
};
return (
<button onClick={showAlert} aria-label={t`Save changes`}>
<Trans>Save</Trans>
</button>
);
}Lingui supporta due approcci per l'identificazione dei messaggi: ID generati automaticamente (derivati dal contenuto del messaggio sorgente) e ID espliciti (chiavi definite dallo sviluppatore). Entrambi gli approcci funzionano con i file PO.
import { Trans } from "@lingui/react/macro";
// Auto-generated ID (from message content)
<Trans>Welcome to our platform</Trans>
// Explicit ID (developer-defined key)
<Trans id="nav.welcome">Welcome to our platform</Trans>Usa la prop comment su qualsiasi macro per aggiungere una descrizione. Questo commento viene estratto nel file PO come nota per il traduttore, fornendo un contesto critico su dove e come appare il messaggio.
import { Trans } from "@lingui/react/macro";
<Trans comment="Shown on the homepage hero section above the fold">
Start building with confidence
</Trans>Lingui utilizza ICU MessageFormat per la pluralizzazione, che supporta tutte le categorie plurali CLDR. La macro Plural facilita la gestione di diverse forme plurali direttamente in JSX:
import { Plural } from "@lingui/react/macro";
function CartSummary({ itemCount }) {
return (
<p>
<Plural
value={itemCount}
_0="Your cart is empty"
one="You have # item in your cart"
other="You have # items in your cart"
/>
</p>
);
}Dopo aver estratto e compilato i messaggi, configura l'istanza i18n e avvolgi la tua app nell'I18nProvider.
Crea un modulo i18n che carica dinamicamente i cataloghi di messaggi compilati. Il plugin Lingui Vite abilita l'importazione diretta dei file PO, che vengono compilati al volo durante lo sviluppo:
// src/i18n.ts
import { i18n } from "@lingui/core";
export async function loadCatalog(locale: string) {
const { messages } = await import(`./locales/${locale}/messages.po`);
i18n.load(locale, messages);
i18n.activate(locale);
}
// Initialize with default locale
loadCatalog("en");
export default i18n;Avvolgi l'intera app con I18nProvider per rendere le traduzioni disponibili a tutti i componenti tramite il contesto React:
// src/App.tsx
import { I18nProvider } from "@lingui/react";
import { i18n } from "./i18n";
function App() {
return (
<I18nProvider i18n={i18n}>
<YourAppContent />
</I18nProvider>
);
}Cambiare lingua è semplice: carica il nuovo catalogo, attiva la lingua e React esegue automaticamente il re-render di tutti i contenuti tradotti. Ecco un componente completo per il cambio lingua:
import { useState } from "react";
import { loadCatalog } from "./i18n";
import { Trans } from "@lingui/react/macro";
const LANGUAGES = {
en: "English",
fr: "Français",
de: "Deutsch",
ja: "日本語",
es: "Español",
};
function LanguageSwitcher() {
const [currentLocale, setCurrentLocale] = useState("en");
const handleChange = async (locale: string) => {
await loadCatalog(locale);
setCurrentLocale(locale);
};
return (
<select
value={currentLocale}
onChange={(e) => handleChange(e.target.value)}
>
{Object.entries(LANGUAGES).map(([code, name]) => (
<option key={code} value={code}>
{name}
</option>
))}
</select>
);
}La CLI di Lingui fornisce due comandi chiave che formano il nucleo del tuo flusso di lavoro di traduzione: extract per estrarre i messaggi dal codice sorgente nei cataloghi PO e compile per convertire i file PO in moduli JavaScript ottimizzati per la produzione.
# Extract messages from source code into PO catalogs
npx lingui extract
# Translate your PO files (manually, with a TMS, or with AI)
# Compile PO catalogs into optimized JS modules for production
npx lingui compilel10n.dev fornisce supporto nativo per i file PO, rendendolo il compagno perfetto per i progetti Lingui.js. Carica il tuo catalogo PO sorgente e ricevi file tradotti accuratamente:
Usa il pacchetto npm ai-l10n per tradurre i tuoi cataloghi Lingui PO dalla riga di comando o come parte di una pipeline CI/CD. Installa una volta, poi traduci in qualsiasi numero di lingue con un singolo comando.
# Install the CLI
npm install ai-l10n
# Translate your source PO file to multiple languages
npx ai-l10n translate src/locales/en/messages.po \
--languages fr,de,ja,zh-CN,es,koCollega ai-l10n direttamente al tuo processo di build Lingui in modo che le traduzioni siano sempre aggiornate. Combina estrazione, traduzione e compilazione in un unico flusso di lavoro.
Aggiungi extract, translate e compile come script e concatenali. Lo script i18n esegue l'intera pipeline; usalo in prebuild per assicurarti che le traduzioni siano sempre aggiornate prima del rilascio.
{
"scripts": {
"extract": "lingui extract",
"compile": "lingui compile",
"translate": "ai-l10n translate src/locales/en/messages.po --languages fr,de,ja,zh-CN,es,ko --update",
"i18n": "npm run extract && npm run translate && npm run compile",
"prebuild": "npm run i18n",
"build": "vite build",
"dev": "vite"
}
}Se il tuo team usa Make, dichiara estrazione, traduzione e compilazione come target separati con le dipendenze corrette:
LANGUAGES = fr,de,ja,zh-CN,es,ko
extract:
npx lingui extract
translate:
npx ai-l10n translate src/locales/en/messages.po --languages $(LANGUAGES) --update
compile:
npx lingui compile
i18n: extract translate compile
dev: i18n
npx vite
build: i18n
npx vite buildPer l'integrazione CI/CD, aggiornamenti incrementali, traduzione batch su più file ed esempi di workflow GitHub Actions, consulta la Guida all'automazione della localizzazione.
L'estensione VS Code di l10n.dev porta la traduzione dei file PO direttamente nel tuo editor. Traduci i tuoi cataloghi Lingui senza lasciare VS Code.
Pronto a raggiungere utenti globali? Traduci i tuoi file PO Lingui direttamente nell'area di lavoro l10n.dev, automatizza con la CLI npm o traduci direttamente dentro VS Code:
Scopri perché la traduzione potenziata dall'IA è migliore per i file i18n rispetto ai metodi tradizionali
Integra la localizzazione potenziata dall'IA direttamente nella tua pipeline CI/CD
Porta la localizzazione AI nel tuo flusso di lavoro con le nostre estensioni e plugin
Grazie per aver utilizzato l10n.dev per localizzare il tuo progetto Lingui.js! 🚀
Se questa guida ti è stata utile, condividila con altri sviluppatori React che hanno bisogno di internazionalizzare le loro applicazioni con file PO.
Insieme, possiamo rendere le applicazioni JavaScript più accessibili e pronte per un pubblico globale.