Scopri come tradurre un’app React utilizzando react-i18next e file JSON in questa guida passo-passo all’internazionalizzazione di React.
Questa guida utilizza un piccolo progetto React + Vite e lo prepara per la localizzazione, includendo:
- Caricamento dei file JSON di traduzione
- Utilizzo della funzione
t()per le traduzioni - Gestione del testo dinamico (interpolazione, plurali, testo formattato con
<Trans />) - Traduzione di file JSON con l’IA
Puoi seguire gli esempi di commit o applicare gli stessi passaggi alla tua app React esistente.
In questa pagina
Cosa ti serve per tradurre un’app React
Per seguire questo tutorial, avrai bisogno di:
- Node.js e npm
- Conoscenza di base di React
- Un editor di codice come VS Code
Naturalmente, avrai bisogno anche di uno strumento di traduzione. Useremo PTC (Private Translation Cloud) per creare file JSON tradotti. Puoi registrarti per una prova gratuita ora o aspettare di arrivare al passaggio della traduzione.
Configura l’internazionalizzazione di React (con esempi di commit)
1
Configura la tua app React per la traduzione
Se hai già un’applicazione React, passa al Passaggio 2.
Per creare una nuova app React + TypeScript, apri il terminale, naviga nella cartella dove tieni i tuoi progetti e esegui:
npm create vite@latest react-localization-demo -- --template react-ts
cd react-localization-demo
npm install
npm run devQuesto avvia un server di sviluppo e apre la pagina predefinita di Vite + React nel tuo browser.
Riferimento Commit: Crea un progetto React con Vite e TypeScript
2
Aggiungi testo visibile all’utente alla tua app React
Prima di aggiungere react-i18next, devi preparare il testo nella lingua sorgente che vuoi tradurre. Apri src/App.tsx e aggiungi le tue stringhe visibili all’utente:
function App() {
return (
<div>
<h1>Welcome</h1>
<p>This is a localization demo.</p>
<button onClick={() => alert('Click me')}>Click me</button>
</div>
);
}
Ai fini della nostra demo, abbiamo mantenuto la nostra interfaccia utente semplice con un titolo, una descrizione e un pulsante.
Riferimento Commit: Crea l’interfaccia utente di base con stringhe statiche in inglese
3
Configura react-i18next nella tua app React
Ora che la tua app React mostra del testo di base in inglese, è il momento di connettere react-i18next in modo che quelle stringhe possano provenire da un file di traduzione anziché essere codificate direttamente.
Questo passaggio ha tre parti:
- Installa
i18nextereact-i18next - Crea il tuo file di traduzione inglese (
en.json) - Aggiorna il tuo componente per utilizzare l’hook
useTranslation
3.1 installa le librerie i18n
Dalla cartella del tuo progetto, installa le librerie:
npm install i18next react-i18nextIn questo esempio:
i18nextè la libreria di internazionalizzazione principalereact-i18nextaggiunge binding React come l’hookuseTranslation
3.2 crea il file sorgente inglese per la traduzione (en.json)
Crea la seguente struttura di cartelle:
src/
i18n/
locales/
en.jsonQuindi aggiungi le tue stringhe inglesi a src/i18n/locales/en.json:
{
"welcome": "Welcome",
"description": "This is a localization demo.",
"clickMe": "Click me"
}Ogni chiave (welcome, description, clickMe) mappa al testo che vuoi visualizzare nell’interfaccia utente.
3.3 aggiorna app.tsx per usare useTranslation
Sostituisci il tuo testo inglese codificato direttamente con chiamate alla funzione di traduzione t().
L’hook useTranslation() dà al tuo componente accesso a:
t()– cerca una stringa per chiavei18n– ti permette di cambiare lingua programmaticamente
Aggiorna src/App.tsx:
import { useTranslation } from 'react-i18next';
function App() {
const { t } = useTranslation();
return (
<div>
<h1>{t('welcome')}</h1>
<p>{t('description')}</p>
<button onClick={() => alert(t('clickMe'))}>{t('clickMe')}</button>
</div>
);
}
export default App;
Riferimento Commit: Crea il file inglese iniziale per la traduzione
4
Inizializza i18next e carica automaticamente i file JSON
Al momento il tuo componente chiama t('welcome'), ma i18next non sa ancora:
- Dove si trova
en.json - Quali lingue esistono
- Quale dovrebbe essere la lingua predefinita
In questo passaggio, inizializzerai i18next e gli dirai di caricare automaticamente tutti i file JSON dalla tua cartella `locales` usando import.meta.glob di Vite.
4.1 crea il file di configurazione i18n
Crea un nuovo file in:
src/i18n/index.tsAggiungi la seguente configurazione:
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
type TranslationResources = string | { [k: string]: TranslationResources } | TranslationResources[];
const modules = import.meta.glob<{default: Record<string, TranslationResources>}>('./locales/*.json', { eager: true })
const resources: Record<string, { translation: Record<string, TranslationResources> }> = {};
for (const path in modules) {
const lang = path.match(/\.\/locales\/(.*)\.json$/)?.[1];
if (lang) {
resources[lang] = { translation: modules[path].default };
}
}
i18n
.use(initReactI18next)
.init({
resources,
fallbackLng: 'en',
interpolation: { escapeValue: false },
});
export default i18n;Questa configurazione è utile perché:
- Ogni file
*.jsonche aggiungi asrc/i18n/locales/diventa disponibile automaticamente. - Quando PTC crea nuovi file di lingua (ad esempio
ar.json), verranno caricati automaticamente da questa configurazione — senza bisogno di importazioni o modifiche al codice.
Riferimento commit: configura la configurazione i18n
4.2 importa i18n nel punto di ingresso della tua app
Prima che React renderizzi la tua app, i18next ha bisogno di essere inizializzato. Per fare ciò, devi importare la tua configurazione i18n nel file di ingresso.
Se salti questo passaggio, t() restituirà solo le chiavi di traduzione invece del testo tradotto.
Apri src/main.tsx e aggiungi l’import evidenziato:
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App.tsx'
import './index.css'
import './i18n' // ← Add this import!
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<App />
</React.StrictMode>,
)
5
Gestisci plurali, interpolazione e testo formattato
Finora, hai usato solo stringhe statiche come “Benvenuto” e “Cliccami”. Ma le app reali hanno bisogno di contenuti dinamici:
- Includere link o formattazione all’interno del testo tradotto
- Salutare gli utenti per nome
- Mostrare conteggi (“1 messaggio” vs “3 messaggi”)
5.1 interpolazione: aggiungere variabili alle traduzioni
Invece di codificare direttamente valori che cambiano a runtime, puoi interpolarli nelle tue traduzioni.
Per fare ciò, includi una variabile all’interno di {{ }} nel tuo JSON, quindi passa il valore effettivo quando chiami t().
Aggiorna src/i18n/locales/en.json:
{
"welcome": "Welcome",
"userGreeting": "Welcome back, {{firstName}}!",
"description": "This is a localization demo.",
"clickMe": "Click me"
}
Ora aggiorna il tuo componente per usare il saluto interpolato:
import { useTranslation } from 'react-i18next';
function App() {
const { t } = useTranslation();
const user = { firstName: 'Sarah' };
return (
<div>
<h1>{t('welcome')}</h1>
<p>{t('userGreeting', { firstName: user.firstName })}</p>
<p>{t('description')}</p>
<button onClick={() => alert(t('clickMe'))}>{t('clickMe')}</button>
</div>
);
}
export default App;
Il secondo argomento di t() è un oggetto con i valori che vuoi sostituire. Puoi avere tutte le variabili di cui hai bisogno — assicurati solo che ognuna appaia nelle tue traduzioni.
5.2 Aggiungi forme plurali
Alcuni testi cambiano in base a un numero. Ad esempio, “1 nuovo messaggio” vs “3 nuovi messaggi”. i18next gestisce questo automaticamente quando fornisci le forme plurali.
Aggiorna src/i18n/locales/en.json:
{
"welcome": "Welcome",
"userGreeting": "Welcome back, {{firstName}}!",
"description": "This is a localization demo.",
"clickMe": "Click me",
"newMessages_one": "You have {{count}} new message.",
"newMessages_other": "You have {{count}} new messages."
}
Affinché la pluralizzazione funzioni, la variabile interpolata deve essere chiamata count. i18next utilizza questo valore per scegliere la forma plurale corretta per ogni lingua.
Ora usalo nel tuo componente:
import { useTranslation } from 'react-i18next';
function App() {
const { t } = useTranslation();
const user = { firstName: 'Sarah' };
const [messageCount, setMessageCount] = useState<number>(1);
const handleIncrement = () => {
setMessageCount(messageCount + 1);
};
return (
<div>
<h1>{t('welcome')}</h1>
<p>{t('userGreeting', { firstName: user.firstName })}</p>
<p>{t('newMessages', { count: messageCount })}</p>
<p>{t('description')}</p>
<button onClick={handleIncrement}>{t('clickMe')}</button>
</div>
);
}
export default App;
i18next sceglierà automaticamente newMessages (singolare) quando count è 1, e newMessages_other (plurale) per qualsiasi altro numero.
5.3 componente trans: aggiungere formattazione e link
A volte hai bisogno di formattazione (come testo in grassetto) o elementi interattivi (come link) all’interno di una stringa tradotta. Il componente Trans ti permette di includere elementi JSX (JavaScript XML) all’interno delle tue traduzioni.
Per prima cosa, importa il componente Trans:
import { useTranslation, Trans } from 'react-i18next';Aggiungi una nuova chiave a src/i18n/locales/en.json:
{
"welcome": "Welcome",
"userGreeting": "Welcome back, {{firstName}}!",
"newMessages_one": "You have {{count}} new message.",
"newMessages_other": "You have {{count}} new messages.",
"description": "This is a localization demo.",
"termsText": "I agree to the <1>Terms of Service</1> and <3>Privacy Policy</3>.",
"clickMe": "Click me"
}
Nota i tag <1> e <3>. Questi sono segnaposto che mappano a componenti figli per indice (a partire da 0).
Ora usa il componente Trans nel tuo JSX:
import { useTranslation, Trans } from 'react-i18next';
function App() {
const { t } = useTranslation();
const user = { firstName: "Sarah" };
const [messageCount, setMessageCount] = useState<number>(1);
const handleIncrement = () => {
setMessageCount(messageCount + 1);
};
return (
<div>
<h1>{t("welcome")}</h1>
<p>{t("userGreeting", { firstName: user.firstName })}</p>
<p>{t("newMessages", { count: messageCount })}</p>
<p>{t("description")}</p>
<p>
<Trans i18nKey="termsText">
I agree to the <a href="/terms">Terms of Service</a> and
<a href="/privacy">Privacy Policy</a>.
</Trans>
</p>
<button onClick={handleIncrement}>{t("clickMe")}</button>
</div>
);
}
export default App;
Traduci la tua app React
A questo punto, la tua app è completamente pronta per l’internazionalizzazione. Ora è il momento di tradurre il tuo file en.json.
Ci sono diversi modi per farlo, ma ci concentreremo sull’utilizzo di PTC per generare automaticamente file JSON tradotti. Permette caricamenti manuali di file, integrazione Git o l’utilizzo dell’API.
Per il nostro progetto demo, integreremo PTC con il nostro repository GitHub.
Passaggio 1
Configura un progetto in PTC per tradurre il file JSON
Per connettere il tuo progetto a PTC, registrati per una prova gratuita.
- Segui i passaggi nella Guida introduttiva per creare un nuovo progetto.
- Nel wizard di configurazione, seleziona il tuo file sorgente (nel nostro caso,
src/i18n/locales/en.json) e scegli il tuo percorso di output:
src/i18n/locales/{{lang}}.jsonQuesto pattern crea un file per lingua (ad esempio, fr.json, de.json) utilizzando la stessa struttura di cartelle che la tua app già si aspetta.
Passaggio 2
Ottieni i file JSON tradotti e aggiungili al tuo progetto
Quando le tue traduzioni sono pronte, PTC ti avviserà. I tuoi prossimi passaggi dipendono da come stai usando PTC:
| Se usi… | Cosa succede dopo |
|---|---|
| Integrazione Git | PTC apre una Pull/Merge Request con nuovi file di lingua |
| Caricamento manuale di file | Scarica il file JSON e posizionalo in src/i18n/locales/ |
| API PTC | Usa l’endpoint di recupero file |
Ad esempio, se traduci in francese e usi l’integrazione Git, PTC restituirà fr.json e posizionerà il file in src/i18n/locales/fr.json.
Riferimento commit: PTC ReactLocalizationDemo : traduzioni automatiche
Passaggio 3
Testa la tua app React tradotta con un selettore di lingua
Ora che hai almeno un file di traduzione, aggiungiamo un semplice selettore di lingua per verificare che tutto funzioni.
Aggiorna src/App.tsx per aggiungere i pulsanti del selettore di lingua:
import { useTranslation } from 'react-i18next';
function App() {
const { t, i18n } = useTranslation();
return (
<div>
<h1>{t('welcome')}</h1>
<p>{t('userGreeting', { firstName: user.firstName })}</p>
<p>{t('newMessages', { count: messageCount })}</p>
<p>{t('description')}</p>
<p>
<Trans i18nKey="termsText">
I agree to the <a href="/terms">Terms of Service</a> and <a href="/privacy">Privacy Policy</a>.
</Trans>
</p>
<button onClick={() => alert(t('clickMe'))}>{t('clickMe')}</button>
<button onClick={() => i18n.changeLanguage('en')}>EN</button>
<button onClick={() => i18n.changeLanguage('fr')}>FR</button>
</div>
);
}
Esegui la tua app (npm run dev) e clicca sui pulsanti EN / FR. Quando esegui l’app in francese, il layout dovrebbe apparire esattamente come in inglese — solo la lingua del testo cambia.
Riferimento commit: Aggiungi un selettore di lingua per testare la traduzione
Ottimizza il caricamento delle traduzioni e il rilevamento della lingua
Ora che le tue traduzioni funzionano, puoi ottimizzare i18next per rendere la tua app più veloce e user-friendly, specialmente se supporti più lingue.
Rilevamento automatico della lingua dell’utente
Per impostazione predefinita, la tua app si avvia in inglese e richiede agli utenti di cambiare lingua manualmente. Con il rilevamento automatico della lingua, i18next controlla il browser, l’URL o le preferenze salvate e carica la lingua corretta istantaneamente.
- Aggiungi il pacchetto
i18next-browser-languagedetector:
npm install i18next-browser-languagedetector- Aggiorna il tuo
src/i18n/index.ts:
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import LanguageDetector from "i18next-browser-languagedetector";
type TranslationResources = string | { [k: string]: TranslationResources } | TranslationResources[];
const modules = import.meta.glob<{default: Record<string, TranslationResources>}>('./locales/*.json', { eager: true })
const resources: Record<string, { translation: Record<string, TranslationResources> }> = {};
for (const path in modules) {
const lang = path.match(/\.\/locales\/(.*)\.json$/)?.[1];
if (lang) {
resources[lang] = { translation: modules[path].default };
}
}
i18n
.use(LanguageDetector) // detect browser/localStorage/etc.
.use(initReactI18next)
.init({
resources,
fallbackLng: "en",
supportedLngs: ["en", "fr", "de", "ar"], // adjust to your languages
interpolation: { escapeValue: false },
detection: {
order: ["querystring", "localStorage", "cookie", "navigator"],
caches: ["localStorage", "cookie"],
}
});
export default i18n;
Con questa configurazione, gli utenti vedranno automaticamente l’app nella loro lingua preferita, quando disponibile. Possono comunque cambiare manualmente se necessario.
Caricamento lazy delle traduzioni
Al momento, i18next carica ogni file di traduzione all’avvio. Va bene per una o due lingue, ma se supporti molte lingue, la dimensione del tuo bundle può crescere rapidamente.
Il caricamento lazy risolve questo problema scaricando solo i file di lingua di cui l’utente ha bisogno.
- Installa il backend HTTP:
npm install i18next-http-backend- Aggiorna il tuo
src/i18n/index.ts:
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import Backend from "i18next-http-backend";
import LanguageDetector from "i18next-browser-languagedetector";
i18n
.use(Backend) // load JSON over HTTP
.use(LanguageDetector)
.use(initReactI18next)
.init({
fallbackLng: "en",
supportedLngs: ["en", "fr"],
interpolation: { escapeValue: false },
backend: {
loadPath: "/locales/{{lng}}/{{ns}}.json"
}
});
export default i18n;
- Dopo aver abilitato il backend, i18next caricherà i file di traduzione tramite HTTP invece di includerli nel bundle. Affinché ciò funzioni, le tue traduzioni devono essere servite da un percorso pubblico che il browser possa richiedere:
public/
locales/
en/
translation.json
fr/
translation.jsonCon questa struttura, ogni lingua si trova nella propria cartella, rispecchiando la parte {{lng}} del tuo loadPath. Quindi, ad esempio, quando un utente passa al francese, i18next recupererà:
/locales/fr/translation.json
Traduci la tua app React con PTC
La tua app è pronta per la localizzazione con i18next. Ora, lascia che PTC si occupi del lavoro di traduzione per te.
Inizia la tua prova gratuita e traduci fino a 2.500 parole in 2 lingue, quindi attiva il pagamento a consumo per pagare solo ciò che traduci.


Traduci file JSON nelle app React con l’AI
Ottieni traduzioni contestualizzate in pochi minuti
Carica file o automatizza tramite API o integrazione Git
1
Inizia una prova gratuita
Traduci 2500 parole gratis.
2
Aggiungi i dettagli rapidi del progetto
Fornisci un contesto sulla tua app e sui tuoi utenti.
3
Ottieni traduzioni
Scarica un file ZIP o esegui il merge nel tuo repository.