Créer une application React pour une audience mondiale nécessite une stratégie d'internationalisation (i18n) robuste. react-i18next est la bibliothèque de localisation React la plus populaire, construite sur le framework i18next éprouvé. Ce guide vous accompagne dans tout ce dont vous avez besoin pour localiser votre application React, de la configuration initiale à l'automatisation prête pour la production avec la traduction assistée par IA.
react-i18next est le standard de facto pour l'internationalisation React, approuvé par des milliers d'applications en production dans le monde. Voici pourquoi les développeurs le choisissent :
Installez react-i18next et la bibliothèque principale i18next :
npm install react-i18next i18nextCes plugins populaires améliorent votre configuration i18next avec la détection automatique de langue et le chargement différé des traductions :
# Language detector (auto-detects user language)
npm install i18next-browser-languagedetector
# HTTP backend (load translations from server)
npm install i18next-http-backendUne structure de projet bien organisée permet de maintenir vos traductions à mesure que vous ajoutez des langues :
src/
├── i18n/
│ └── i18n.ts ← i18next configuration
├── locales/
│ ├── en/
│ │ └── translation.json ← English (source)
│ ├── fr/
│ │ └── translation.json ← French
│ ├── de/
│ │ └── translation.json ← German
│ ├── ja/
│ │ └── translation.json ← Japanese
│ └── es/
│ └── translation.json ← Spanish
├── components/
├── App.tsx
└── index.tsxreact-i18next utilise des fichiers JSON imbriqués pour les traductions. Les clés supportent la notation par points, l'interpolation avec {{variables}} et la pluralisation intégrée :
// locales/en/translation.json
{
"welcome": {
"title": "Welcome to our platform",
"greeting": "Hello, {{name}}!",
"description": "Explore features and get started."
},
"nav": {
"home": "Home",
"dashboard": "Dashboard",
"settings": "Settings",
"logout": "Log out"
},
"cart": {
"empty": "Your cart is empty",
"item_one": "{{count}} item in your cart",
"item_other": "{{count}} items in your cart",
"checkout": "Proceed to checkout"
}
}i18next supporte deux approches principales pour charger les traductions : le backend HTTP (chargement différé) et les ressources groupées. Choisissez selon les besoins de votre application.
Chargez les traductions à la demande depuis des fichiers JSON sur votre serveur. Cela garde votre bundle initial léger et est idéal pour les applications avec beaucoup de langues ou de gros fichiers de traduction :
// src/i18n/i18n.ts
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import LanguageDetector from "i18next-browser-languagedetector";
import HttpBackend from "i18next-http-backend";
i18n
.use(HttpBackend)
.use(LanguageDetector)
.use(initReactI18next)
.init({
fallbackLng: "en",
supportedLngs: ["en", "fr", "de", "ja", "es"],
defaultNS: "translation",
interpolation: {
escapeValue: false, // React already escapes by default
},
backend: {
loadPath: "/locales/{{lng}}/{{ns}}.json",
},
detection: {
order: ["localStorage", "navigator", "htmlTag"],
caches: ["localStorage"],
},
});
export default i18n;Importez les traductions directement dans le bundle. Idéal pour les petites applications ou lorsque vous avez besoin que les traductions soient disponibles immédiatement sans requêtes réseau :
// src/i18n/i18n.ts — Bundled approach (no HTTP backend)
import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import LanguageDetector from "i18next-browser-languagedetector";
import en from "../locales/en/translation.json";
import fr from "../locales/fr/translation.json";
import de from "../locales/de/translation.json";
i18n
.use(LanguageDetector)
.use(initReactI18next)
.init({
fallbackLng: "en",
supportedLngs: ["en", "fr", "de"],
defaultNS: "translation",
interpolation: {
escapeValue: false,
},
resources: {
en: { translation: en },
fr: { translation: fr },
de: { translation: de },
},
});
export default i18n;Importez le fichier de configuration i18n dans le point d'entrée de votre application avant de rendre les composants. Cela garantit que les traductions sont chargées avant le rendu de votre interface :
// src/index.tsx
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import "./i18n/i18n"; // Initialize i18next before rendering
const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement
);
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
);react-i18next fournit deux API principales pour traduire les composants : le hook useTranslation pour un accès programmatique et le composant Trans pour le texte riche avec JSX.
Le hook useTranslation est le moyen le plus courant d'accéder aux traductions dans les composants fonctionnels. Il fournit la fonction t() et déclenche un re-rendu automatique lors du changement de langue :
import { useTranslation } from "react-i18next";
function WelcomeBanner() {
const { t } = useTranslation();
return (
<div>
<h1>{t("welcome.title")}</h1>
<p>{t("welcome.greeting", { name: "Alice" })}</p>
<p>{t("welcome.description")}</p>
</div>
);
}Lorsque les traductions contiennent des éléments HTML ou JSX (gras, liens, etc.), utilisez le composant Trans. Il préserve votre arbre de composants React au sein des traductions :
import { Trans } from "react-i18next";
function RichTextExample() {
return (
<p>
<Trans i18nKey="richText.welcome">
Welcome to <strong>our platform</strong>.
Visit your <a href="/dashboard">dashboard</a> to get started.
</Trans>
</p>
);
}
// In the translation file:
// "richText.welcome": "Welcome to <1>our platform</1>. Visit your <3>dashboard</3> to get started."i18next gère automatiquement les formes plurielles selon les règles ICU de chaque langue. Passez un paramètre count, et i18next sélectionne la forme correcte :
// In translation JSON:
// "cart.item_one": "{{count}} item in your cart"
// "cart.item_other": "{{count}} items in your cart"
import { useTranslation } from "react-i18next";
function CartSummary({ itemCount }: { itemCount: number }) {
const { t } = useTranslation();
return (
<p>{t("cart.item", { count: itemCount })}</p>
);
}
// itemCount=0 → "0 items in your cart"
// itemCount=1 → "1 item in your cart"
// itemCount=5 → "5 items in your cart"Les espaces de noms permettent de diviser les traductions en fichiers séparés par fonctionnalité ou domaine. Cela améliore la maintenabilité et permet le chargement différé des bundles de traduction :
// src/i18n/i18n.ts
i18n.init({
defaultNS: "common",
ns: ["common", "dashboard", "auth", "errors"],
backend: {
loadPath: "/locales/{{lng}}/{{ns}}.json",
},
});
// Usage in components:
import { useTranslation } from "react-i18next";
function DashboardPage() {
// Load specific namespace
const { t } = useTranslation("dashboard");
return <h1>{t("title")}</h1>;
}
function LoginForm() {
// Load multiple namespaces
const { t } = useTranslation(["auth", "common"]);
return (
<form>
<h2>{t("auth:login.title")}</h2>
<button>{t("common:submit")}</button>
</form>
);
}react-i18next rend le changement de langue fluide. Appelez i18n.changeLanguage() et tous les composants utilisant useTranslation se re-rendent automatiquement avec la nouvelle langue :
import { useTranslation } from "react-i18next";
const LANGUAGES = [
{ code: "en", label: "English" },
{ code: "fr", label: "Français" },
{ code: "de", label: "Deutsch" },
{ code: "ja", label: "日本語" },
{ code: "es", label: "Español" },
];
function LanguageSwitcher() {
const { i18n } = useTranslation();
const changeLanguage = (lng: string) => {
i18n.changeLanguage(lng);
};
return (
<select
value={i18n.language}
onChange={(e) => changeLanguage(e.target.value)}
>
{LANGUAGES.map(({ code, label }) => (
<option key={code} value={code}>
{label}
</option>
))}
</select>
);
}react-i18next s'intègre à React Suspense pour gérer le chargement asynchrone des traductions avec élégance. Lors de l'utilisation du backend HTTP, Suspense fournit un état de chargement propre pendant la récupération des traductions :
import { Suspense } from "react";
import { useTranslation } from "react-i18next";
// i18next supports React Suspense for async translation loading
function App() {
return (
<Suspense fallback={<div>Loading translations...</div>}>
<MainContent />
</Suspense>
);
}
function MainContent() {
const { t, ready } = useTranslation();
// With Suspense, 'ready' is always true here
return <h1>{t("welcome.title")}</h1>;
}i18next supporte une intégration TypeScript complète. En augmentant le module i18next, vous bénéficiez de l'autocomplétion et d'une vérification à la compilation pour toutes les clés de traduction, évitant les fautes de frappe et les traductions manquantes :
// src/i18n/types.ts
import "i18next";
import translation from "../locales/en/translation.json";
declare module "i18next" {
interface CustomTypeOptions {
defaultNS: "translation";
resources: {
translation: typeof translation;
};
}
}
// Now t() calls are fully type-safe:
// t("welcome.title") ✅ Autocomplete works
// t("welcome.greeting") ✅ Valid key
// t("invalid.key") ❌ TypeScript errorPour les applications Next.js utilisant l'App Router, vous pouvez utiliser i18next à la fois sur le serveur et le client. Créez une instance i18next séparée pour les traductions côté serveur afin d'éviter de partager l'état entre les requêtes :
// next-i18next.config.js (Next.js App Router)
// For Next.js 13+ with App Router, use next-intl or i18next directly
// src/i18n/server.ts
import { createInstance } from "i18next";
import { initReactI18next } from "react-i18next/initReactI18next";
export async function getServerTranslation(lng: string) {
const i18nInstance = createInstance();
await i18nInstance.use(initReactI18next).init({
lng,
fallbackLng: "en",
resources: {
[lng]: {
translation: (await import(`../locales/${lng}/translation.json`)).default,
},
},
});
return i18nInstance;
}
// In a Server Component:
export default async function Page({ params }: { params: { lng: string } }) {
const i18n = await getServerTranslation(params.lng);
const t = i18n.t.bind(i18n);
return <h1>{t("welcome.title")}</h1>;
}Configurer react-i18next n'est que la moitié du travail ; vous avez toujours besoin de traductions de haute qualité pour chaque langue cible. Traduire manuellement des dizaines de fichiers JSON est lent, coûteux et sujet aux erreurs. La traduction assistée par IA change la donne.
l10n.dev est conçu spécifiquement pour les flux de travail de localisation des développeurs. Il comprend nativement vos fichiers de traduction JSON et produit des traductions qui semblent naturelles, et non générées par une machine :
Le package npm ai-l10n intègre la traduction par IA directement dans votre flux de travail de développement. Traduisez vos fichiers JSON depuis la ligne de commande :
# Install the l10n.dev CLI
npm install ai-l10n
# Translate your JSON files to multiple languages at once
npx ai-l10n translate src/locales/en/translation.json \
--languages fr,de,ja,es,ko,zh-CNAjoutez l'automatisation de la traduction à votre pipeline de build pour que les traductions soient toujours à jour :
{
"scripts": {
"translate": "ai-l10n translate src/locales/en/translation.json --languages fr,de,ja,es,ko --update",
"pretranslate": "npm run translate",
"dev": "vite",
"build": "npm run translate && vite build"
}
}LANGUAGES = fr,de,ja,es,ko,zh-CN
translate:
npx ai-l10n translate src/locales/en/translation.json --languages $(LANGUAGES) --update
dev: translate
npx vite
build: translate
npx vite buildPour plus de détails sur l'intégration CI/CD et l'automatisation, consultez notre Guide d'automatisation de la localisation
Traduisez vos fichiers JSON React i18next directement depuis VS Code. L'extension l10n.dev vous permet de traduire des fichiers sans quitter votre éditeur :
Vous avez maintenant tout ce qu'il faut pour construire une application React entièrement localisée avec react-i18next. Combinez la puissance de l'écosystème mature d'i18next avec la traduction par IA pour déployer votre application dans n'importe quelle langue, rapidement.
Découvrez pourquoi la traduction alimentée par l'IA est meilleure pour les fichiers i18n que les méthodes traditionnelles
Intégrez la localisation alimentée par l'IA directement dans votre pipeline CI/CD
Apportez la localisation par IA dans votre flux de travail avec nos extensions et plugins
react-i18next fournit une solution de localisation complète et prête pour la production pour les applications React. Avec une API basée sur les hooks, le support des espaces de noms, l'intégration TypeScript et la compatibilité SSR, il gère toutes les exigences i18n que votre application pourrait avoir.
Associez react-i18next à la traduction assistée par IA de l10n.dev pour éliminer le goulot d'étranglement de la traduction. Traduisez vos fichiers JSON en quelques secondes, intégrez-les à votre pipeline CI/CD et déployez mondialement en toute confiance.
Notre mission est de rendre la localisation logicielle rapide, abordable et conviviale pour les développeurs. Essayez l10n.dev dès aujourd'hui et voyez comment l'IA peut transformer votre flux de travail de localisation React.