Guide de localisation avec React
Localisation avec React : le guide i18n complet
Comparez les principales bibliothèques i18n pour React, structurez les catalogues de messages, mettez en œuvre les pluriels et le formatage, changez de langue de manière accessible et préparez les pages localisées pour les performances et le référencement.
Pourquoi la localisation relève de l'application dans React
React se concentre délibérément sur la composition d'interfaces utilisateur. Il n'impose ni catalogue de messages, ni routeur de langue, ni chargeur de traductions, ni processus de contenu. Cette souplesse est utile, mais elle confie l'architecture de localisation à l'application. Si les chaînes restent intégrées aux composants jusqu'au lancement, l'ajout de la première langue révèle d'un seul coup toutes les hypothèses relatives à la grammaire, au formatage, à la mise en page et au chargement des données.
La localisation ne se résume pas à remplacer des mots anglais. Une formule de salutation peut interpoler un nom, le nombre d'articles dans un panier peut nécessiter plusieurs catégories de pluriel, et un prix combine les règles de devise au formatage régional. Les traducteurs ont besoin de messages complets et de contexte ; les composants, d'API stables et de replis prévisibles. Traiter chaque nœud de texte comme une recherche indépendante produit généralement des formulations maladroites et du code fragile.
Les pages React publiques ajoutent une autre contrainte : les utilisateurs et les robots d'exploration doivent recevoir un contenu pertinent à une URL de langue stable. Un changement de langue uniquement dans le navigateur après l'hydratation peut afficher brièvement la mauvaise langue, dupliquer les URL et masquer des variantes aux moteurs de recherche. Même lorsque le produit lui-même est une application client, ses pages marketing et d'aide bénéficient de la génération statique ou du rendu serveur via un framework React.
- Le JSX codé en dur mélange le texte produit et le comportement du composant.
- Les fragments concaténés nuisent à la grammaire lorsque l'ordre des mots change.
- Les dates, les nombres, les devises et les pluriels obéissent à des règles propres à chaque langue.
- La détection de langue uniquement côté client peut provoquer un scintillement et nuire à l'explorabilité.
Les concepts fondamentaux avant de choisir une bibliothèque
Commencez par une source de vérité unique pour les langues prises en charge. Stockez ensemble le code de langue, le nom affiché, le sens du texte et la relation de repli. L'analyse des routes, le sélecteur de langue, les outils de formatage Intl et le chargement des catalogues doivent tous utiliser cette configuration. Vous éviterez ainsi qu'un composant accepte fr-CA tandis qu'un autre se replie silencieusement sur fr ou l'anglais selon des règles différentes.
Les messages doivent exprimer des idées complètes. Donnez-leur des clés sémantiques stables comme checkout.payment.failed plutôt que des clés copiées de la phrase anglaise actuelle. Transmettez les variables sous forme de valeurs nommées, utilisez les placeholders de balisage de manière intentionnelle et laissez la syntaxe du message sélectionner les pluriels ou les variantes grammaticales. Vous préservez ainsi le contexte du traducteur et permettez à une autre langue de modifier l'ordre des mots sans changer le code React.
- Locale : la préférence linguistique ou régionale validée et active pour un rendu.
- Catalogue de messages : des identifiants de messages stables associés à des valeurs traduites.
- Interpolation : des valeurs d'exécution insérées dans un message traduit complet.
- Règles de pluriel et de sélection : des variantes grammaticales choisies à partir de données sensibles à la langue.
- Repli : le comportement défini lorsqu'une langue ou un message n'est pas disponible.
react-i18next ou React Intl ou Lingui
Les principales bibliothèques React couvrent les mêmes bases, mais privilégient des processus différents. Comparez leur syntaxe de messages, leur pipeline d'extraction, leur gestion de la sûreté des types, leur prise en charge du serveur et leur écosystème de catalogues. Ne choisissez pas uniquement selon la taille du téléchargement : les mesures précises des bundles varient avec les versions, les plugins, le tree shaking et le nombre de messages envoyés au navigateur.
react-i18next est l'intégration React d'i18next. Elle privilégie les clés et les espaces de noms, avec des plugins pour le chargement, la détection, la mise en cache et, en option, ICU. React Intl est la couche React de FormatJS et utilise directement ICU MessageFormat au moyen de composants et de hooks. Lingui compile également les messages ICU et y ajoute des macros ainsi qu'un processus intégré d'extraction et de compilation des catalogues.
| Bibliothèque | Style d'API React | Syntaxe des messages | Processus d'extraction | TypeScript | Idéal pour |
|---|---|---|---|---|---|
| react-i18next | useTranslation, t et Trans | Syntaxe i18next ; ICU via un plugin | CLI i18next et outils de l'écosystème | Typage des ressources via la configuration | Applications basées sur des clés et écosystème i18next |
| React Intl | IntlProvider, hooks et composants Formatted | ICU MessageFormat natif | Extraction et compilation avec la CLI FormatJS | Définitions de premier ordre ; typage des descripteurs | Textes produit et formatage axés sur ICU |
| Lingui | Macros, Trans et hooks | ICU via des macros compilées | CLI intégrée d'extraction et de compilation | API typées ; l'extraction valide les catalogues | Processus à la compilation et catalogues PO |
Choisissez react-i18next si vous accordez de l'importance au vaste écosystème d'i18next, si vous avez besoin d'espaces de noms dans un produit de grande taille ou si vous partagez déjà des catalogues avec du JavaScript non React. Choisissez React Intl si les messages ICU et le formatage cohérent des nombres et dates par FormatJS correspondent au modèle conceptuel de l'équipe. Choisissez Lingui si les développeurs recherchent des macros concises et un traitement à la compilation dans un processus de traduction axé sur les fichiers PO.
La prise en charge de TypeScript ne se résume pas à une fonction t typée. Vérifiez que les clés peuvent être dérivées de votre véritable catalogue par défaut, que les variables d'interpolation sont contrôlées et que l'extraction détecte les messages avant la publication. i18next peut générer ou enrichir les types de ressources, FormatJS extrait les descripteurs analysables statiquement et Lingui compile les messages extraits. Le meilleur processus est celui que votre CI peut appliquer de manière cohérente.
Configurer la localisation avec React étape par étape
Cette configuration utilise react-i18next, car son modèle JSON basé sur des clés est familier à de nombreuses équipes React. La même séquence s'applique aux autres bibliothèques : définir les catalogues, initialiser une instance unique sensible à la langue, la fournir à la frontière de l'application, traduire des messages complets dans les composants et faire en sorte que le changement de langue mette à jour l'interface visible ainsi que l'URL ou la préférence persistante de l'application.
-
Étape 1
Structurer les catalogues
Créez un catalogue source et des fichiers de langues correspondants. Regroupez les clés par domaines produit stables, comme la navigation, le paiement et la validation. Synchronisez les jeux de clés de toutes les langues et fournissez du contexte aux traducteurs pour les messages ambigus.
-
Étape 2
Initialiser l'instance i18n
Créez l'instance i18next dans un module dédié, enregistrez uniquement les plugins nécessaires à l'application, définissez les langues prises en charge et de repli, et séparez les diagnostics de développement du comportement en production.
-
Étape 3
Fournir la localisation à la racine
Rendez l'instance initialisée disponible à la racine de l'application. Dans les frameworks avec rendu serveur, suivez l'intégration du framework afin que la langue active et les ressources restent cohérentes entre la sortie serveur et l'hydratation.
-
Étape 4
Traduire des messages de composant complets
Appelez useTranslation pour l'espace de noms concerné et transmettez les valeurs d'interpolation sous forme de données nommées. N'utilisez Trans que lorsqu'un message cohérent contient des éléments React, et non pour assembler des fragments arbitraires.
-
Étape 5
Créer un sélecteur de langue accessible
Modifiez la langue active de la bibliothèque et accédez à l'URL correspondante lorsque les routes sont localisées. Ne conservez une préférence que par commodité ; n'en faites pas l'unique source de vérité des pages publiques.
{
"navigation": {
"home": "Home"
},
"cart": {
"items_one": "{{count}} item",
"items_other": "{{count}} items"
}
} import {useTranslation} from 'react-i18next';
export function CartSummary({count}: {count: number}) {
const {t, i18n} = useTranslation('common');
return (
<section>
<h2>{t('cart.title')}</h2>
<p>{t('cart.items', {count})}</p>
<button onClick={() => i18n.changeLanguage('fr')}>
{t('language.french')}
</button>
</section>
);
} Initialisez i18next avant le premier rendu visible par l'utilisateur. Dans une application uniquement côté client, affichez un état de chargement intentionnel pendant l'arrivée du catalogue actif plutôt que des clés brutes. En SSR, créez ou obtenez une instance isolée en toute sécurité pour la requête, chargez la langue résolue, effectuez le rendu avec celle-ci et sérialisez uniquement les ressources dont le client a besoin pour hydrater la même arborescence.
Un sélecteur de langue doit afficher des noms de langues lisibles, indiquer le choix actuel et préserver la route équivalente de l'utilisateur. Pour les pages publiques localisées, les liens sont préférables, car chaque langue possède une véritable URL. Un champ de sélection ou un menu peut améliorer l'interaction, mais l'accès au clavier, la gestion du focus et un chemin de navigation sans JavaScript doivent rester opérationnels.
Pluriels, dates, nombres et RTL
Ne traduisez pas des valeurs préformatées. Conservez une date sous forme de Date ou de timestamp, un prix sous forme de nombre accompagné d'un code de devise, et une liste sous forme de tableau jusqu'au rendu. Intl.DateTimeFormat, Intl.NumberFormat, Intl.RelativeTimeFormat et Intl.ListFormat appliquent les conventions propres à la langue sans ajouter de moteur de formatage distinct. La plupart des bibliothèques i18n encapsulent ces API afin que les messages et les valeurs utilisent la même langue active.
La pluralisation est un choix grammatical, pas la condition count === 1. i18next utilise les catégories d'Intl.PluralRules et les suffixes JSON v4 actuels comme _one et _other ; certaines langues exigent aussi zero, two, few ou many. React Intl et Lingui expriment les variantes dans des messages ICU. Transmettez toujours count comme donnée et conservez la phrase complète dans le catalogue.
Pour les langues qui s'écrivent de droite à gauche, définissez dir sur la racine du document lorsque le système d'écriture actif l'exige et privilégiez les propriétés CSS logiques comme margin-inline-start. Vérifiez les icônes directionnelles, les graphiques et les saisies multilingues au lieu de tout inverser mécaniquement. Définissez séparément html lang pour la prononciation et les comportements sensibles à la langue ; la langue et le sens du texte sont des valeurs de configuration liées, mais ne se substituent pas l'une à l'autre.
export function LocalizedPrice({locale, value}: Props) {
const currency = new Intl.NumberFormat(locale, {
style: 'currency',
currency: 'EUR'
});
const date = new Intl.DateTimeFormat(locale, {
dateStyle: 'long'
});
return <p>{currency.format(value)} · {date.format(new Date())}</p>;
} Performances et SEO multilingue
Un catalogue pour chaque langue peut devenir l'un des fichiers les plus volumineux de l'application s'il est importé immédiatement. Divisez d'abord les catalogues par langue, puis par route ou espace de noms lorsque le produit est assez grand pour en bénéficier. Chargez le catalogue actif avant d'afficher l'interface critique, mettez en cache les ressources immuables et versionnées, et évitez de déclencher une seconde requête pour des messages que le serveur a déjà utilisés pour produire la page.
Pour le contenu public, privilégiez un framework React capable de produire du HTML localisé par génération statique ou rendu serveur. L'hydratation doit conserver la langue et les messages ayant servi à produire la sortie du serveur. Si le client redétecte la langue indépendamment, cela peut provoquer un scintillement du contenu et des incohérences d'hydratation. Transmettez la langue résolue à travers la frontière de rendu au lieu de la deviner deux fois.
Le SEO multilingue dépend de variantes faciles à découvrir. Publiez une URL stable par langue, localisez le titre et la description, émettez une URL canonique autoréférentielle et reliez les pages équivalentes avec des valeurs hreflang réciproques. Les robots des moteurs de recherche peuvent ne pas envoyer d'en-tête Accept-Language utile : ne faites donc jamais de la détection du navigateur le seul moyen d'accéder aux traductions. Un sélecteur de langue visible et composé de liens aide à la fois les visiteurs et les robots.
- Ne chargez que la langue active et les espaces de noms nécessaires à la route.
- Effectuez le rendu de la langue sélectionnée sur le serveur ou à la compilation pour les pages publiques.
- Préchargez les messages critiques afin d'éviter un affichage fugace des clés ou de la langue de repli.
- Donnez à chaque page localisée une URL et une URL canonique distinctes, ainsi que des liens hreflang réciproques.
- Présentez le sélecteur de langue sous forme de liens ordinaires et préservez la route équivalente.
Créer un processus de traduction évolutif
La qualité des catalogues relève de la qualité logicielle. Révisez les messages sources avant de les traduire, donnez suffisamment de contexte à chacun et conservez des placeholders stables. Les contrôles automatisés doivent détecter les clés manquantes, les expressions ICU mal formées, les variables d'interpolation incompatibles et les catalogues qui se désynchronisent. Ces erreurs coûtent moins cher à corriger dans une pull request qu'après la publication d'une langue.
La pseudo-localisation est l'un des tests précoces les plus rentables. Allongez les caractères, ajoutez des marqueurs visibles et simulez le sens de droite à gauche pour révéler les mises en page qui dépendent de la longueur ou de l'ordre de l'anglais. Associez-la à des captures représentatives ou à des parcours de bout en bout pour le paiement, l'authentification, la validation et les autres chemins critiques. La révision par des locuteurs natifs reste essentielle, mais l'ingénierie peut éliminer de nombreux défauts structurels avant même qu'elle ne commence.
- Utilisez des clés sémantiques et documentez le contexte que le traducteur ne peut pas déduire.
- Ne concaténez jamais des fragments traduits et ne réutilisez pas un message dans des contextes sans rapport.
- Avant la publication, vérifiez la parité des clés, la syntaxe, l'interpolation et les messages inutilisés.
- Utilisez la pseudo-localisation pour révéler rapidement les troncatures, les textes codés en dur et les problèmes de mise en page bidirectionnelle.
- Définissez les responsabilités relatives aux textes sources, à la révision des traductions et à la diffusion en production.
La place de Translatable
La bibliothèque React gère les besoins à l'exécution : sélection des messages, interpolation des valeurs et mise à jour des composants. Une plateforme de localisation prend en charge le processus autour de ces messages : maintien de la parité des clés, invitation des réviseurs, traduction à grande échelle, enregistrement des modifications et intégration des catalogues approuvés dans l'application. La séparation de ces responsabilités protège la couche des composants contre la dépendance envers un fournisseur.
Translatable fonctionne avec les catalogues JSON et les processus des développeurs. Importez les fichiers de langues existants, gérez les valeurs dans une interface dédiée, utilisez l'aide de l'IA pour les brouillons ou les traductions en masse, synchronisez les changements via des fournisseurs Git et, si vous le souhaitez, diffusez les mises à jour des catalogues par un CDN. React reste connecté au moyen de la bibliothèque i18n déjà choisie par l'équipe.
Adoptez progressivement l'automatisation du processus. Une petite équipe peut commencer par des exports versionnés et réviser chaque changement dans une pull request. À mesure que le rythme des publications s'accélère, ajoutez la synchronisation automatique ou la diffusion par CDN tout en conservant la validation et une solution de repli intégrée. Vous accélérerez ainsi les itérations sur les textes sans faire dépendre le rendu de l'application d'un tiers indisponible.
Questions fréquentes
Quelle est la meilleure bibliothèque i18n pour React ?
Il n'existe pas de meilleure bibliothèque universelle. react-i18next est un excellent choix par défaut pour les équipes qui souhaitent profiter du vaste écosystème i18next et d'espaces de noms fondés sur des clés. React Intl convient aux équipes qui préfèrent une API ICU MessageFormat directe. Lingui est particulièrement intéressant lorsque les macros à la compilation et un processus intégré d'extraction et de compilation sont importants. Choisissez selon la complexité de vos messages, vos besoins d'extraction, votre architecture serveur et votre écosystème existant.
Quelle est la différence entre react-i18next et React Intl ?
react-i18next utilise le modèle de clés et d'espaces de noms d'i18next, son écosystème de plugins et ses règles de pluriel, avec ICU disponible grâce à un plugin. React Intl privilégie ICU et fournit des composants déclaratifs ainsi qu'un formatage impératif via l'API Intl. Les deux sont des choix éprouvés ; le plus adapté dépend du format des catalogues, du processus des traducteurs et de l'utilisation éventuelle d'i18next dans le reste de l'application.
Comment les applications React doivent-elles gérer les pluriels ?
Transmettez le nombre à un message unique et laissez la bibliothèque appliquer les catégories de pluriel de la langue. Les catalogues i18next JSON v4 actuels utilisent des suffixes comme _one et _other ; les bibliothèques basées sur ICU utilisent une expression de pluriel contenant les catégories dans le message. Ne choisissez jamais le singulier ou le pluriel anglais dans le code du composant, car de nombreuses langues possèdent des formes supplémentaires.
Ai-je besoin d'une plateforme de gestion des traductions ?
Un petit projet peut gérer directement des fichiers JSON ou PO dans Git. Une plateforme devient utile lorsque plusieurs langues, des modifications fréquentes des textes, des réviseurs non développeurs, la traduction par IA ou par des humains, un historique d'audit et l'automatisation de la diffusion rendent coûteuse la coordination manuelle des fichiers. Gardez la bibliothèque d'exécution indépendante afin que l'adoption d'une plateforme n'impose pas de réécrire les composants.
Comment optimiser le SEO d'une application React localisée ?
Attribuez une URL stable à chaque langue, produisez un HTML localisé pertinent avant ou pendant la réponse initiale, localisez les métadonnées et reliez les équivalents à l'aide de balises canonical et hreflang. Le texte rendu uniquement côté client peut être indexé de façon irrégulière et provoque souvent un changement de langue visible. Lorsque le trafic issu des moteurs de recherche compte, utilisez pour les pages publiques un framework prenant en charge la génération statique ou le rendu serveur.
Créez un processus de localisation facile à maintenir pour votre équipe
Regroupez vos catalogues JSON, traduisez-les avec l'aide de l'IA et diffusez les mises à jour via Git ou un CDN mondial.
Commencer gratuitement