Introduction
Après avoir aidé des milliers d'équipes à internationaliser leurs applications, nous avons identifié les pratiques qui séparent les implémentations i18n fluides et évolutives de celles qui sont pénibles et buggées.
Voici 15 règles à suivre pour une internationalisation réussie.
Architecture de code
1. Extraire toutes les chaînes visibles par l'utilisateur dès le premier jour
N'attendez pas de "devoir traduire". D'ici là, vous aurez des milliers de chaînes codées en dur.
JavaScript1// Mauvais - chaîne codée en dur 2<button>Submit</button> 3 4// Bon - extrait dès le départ 5<button>{t('form.submit')}</button>
Astuce : Utilisez le CLI d'IntlPull pour vérifier le statut de la traduction :
Terminalnpx @intlpullhq/cli status
2. Ne jamais concaténer les chaînes
Différentes langues ont différents ordres de mots. La concaténation brise les traductions.
JavaScript1// Mauvais - casse en allemand, japonais, arabe... 2const message = "Hello " + name + ", you have " + count + " messages"; 3 4// Bon - utilise l'interpolation 5const message = t('greeting', { name, count }); 6// en: "Hello {name}, you have {count} messages" 7// de: "Hallo {name}, Sie haben {count} Nachrichten" 8// ja: " {name}さん、{count}件のメッセージがあります"
3. Utiliser le format de message ICU pour les chaînes complexes
ICU gère les pluriels, le genre et la sélection élégamment :
{count, plural,
=0 {No messages}
one {# message}
other {# messages}
}
{gender, select,
male {He liked your post}
female {She liked your post}
other {They liked your post}
}
4. Garder les clés de traduction sémantiques
Les clés doivent décrire le contenu, pas l'emplacement :
JavaScript1// Mauvais - lié à l'emplacement UI 2"homepage_header_title" 3"sidebar_menu_item_3" 4 5// Bon - décrit le contenu 6"welcome.title" 7"navigation.settings" 8"error.network_unavailable"
5. Organiser les clés par fonctionnalité, pas par fichier
Structurez les traductions par domaine de fonctionnalité :
/locales/en.json
{
"auth": {
"login": { ... },
"signup": { ... }
},
"dashboard": {
"overview": { ... },
"settings": { ... }
},
"checkout": {
"cart": { ... },
"payment": { ... }
}
}
Formatage
6. Utiliser les API de formatage natives
Ne codez jamais en dur les formats de nombre, date ou devise :
JavaScript1// Mauvais - format US uniquement 2const date = `${month}/${day}/${year}`; 3const price = `$${amount}`; 4 5// Bon - conscient de la locale 6const date = new Intl.DateTimeFormat(locale).format(dateObj); 7const price = new Intl.NumberFormat(locale, { 8 style: 'currency', 9 currency: userCurrency 10}).format(amount);
Différences de locale :
| US | Allemagne | Japon | |
|---|---|---|---|
| Date | 12/31/2026 | 31.12.2026 | 2026/12/31 |
| Nombre | 1,234.56 | 1.234,56 | 1,234.56 |
| Devise | $99.99 | 99,99 € | ¥100 |
7. Gérer la pluralisation correctement
Différentes langues ont différentes règles de pluriel :
| Langue | Formes plurielles |
|---|---|
| Anglais | 2 (one, other) |
| Français | 2+ (one, other, many) |
| Russe | 3 (one, few, many) |
| Arabe | 6 (zero, one, two, few, many, other) |
JavaScript// Utiliser le format pluriel ICU t('items', { count: 5 }) // La config gère les règles par langue
8. Supporter les langues RTL
L'arabe, l'hébreu, le persan et l'urdu se lisent de droite à gauche :
CSS1/* Utiliser des propriétés logiques */ 2.card { 3 margin-inline-start: 1rem; /* Pas margin-left */ 4 padding-inline-end: 1rem; /* Pas padding-right */ 5} 6 7/* Laisser l'attribut dir gérer la mise en page */ 8[dir="rtl"] .icon { 9 transform: scaleX(-1); 10}
JSX<html dir={isRTL ? 'rtl' : 'ltr'}>
Qualité de la traduction
9. Fournir un contexte pour les traducteurs
Les traducteurs ont besoin de savoir où et comment les chaînes sont utilisées :
JSON1{ 2 "save": { 3 "value": "Save", 4 "context": "Button to save user profile changes, appears at bottom of form", 5 "maxLength": 10, 6 "screenshot": "save-button.png" 7 } 8}
10. Utiliser un glossaire
Maintenez une terminologie cohérente à travers les traductions :
| Anglais | Espagnol | Allemand | Contexte |
|---|---|---|---|
| Dashboard | Panel de control | Dashboard | Main user interface |
| Settings | Configuración | Einstellungen | User preferences |
| Submit | Enviar | Absenden | Form submission button |
11. Exploiter la mémoire de traduction
Ne traduisez pas la même phrase deux fois. La TM capture :
- Correspondances exactes : "Save changes" = "Save changes"
- Correspondances floues : "Save changes" ≈ "Save all changes"
ROI : Réduction de 30-60 % des coûts de traduction au fil du temps.
Processus
12. Automatiser la synchronisation des traductions
La synchronisation manuelle gaspille du temps et mène à des traductions obsolètes :
Terminal1# Synchroniser les traductions dans CI 2npx @intlpullhq/cli upload 3npx @intlpullhq/cli download 4 5# Ou utiliser le mode watch pour le développement local 6npx @intlpullhq/cli sync --watch
13. Utiliser la localisation continue
Ne groupez pas les traductions. Localisez en continu :
YAML1# Exemple GitHub Action 2on: 3 push: 4 branches: [main] 5 paths: 6 - 'src/**' 7 - 'locales/en.json' 8 9jobs: 10 sync: 11 runs-on: ubuntu-latest 12 steps: 13 - uses: actions/checkout@v3 14 - run: npx @intlpullhq/cli upload 15 - run: npx @intlpullhq/cli download 16 - uses: stefanzweifel/git-auto-commit-action@v4
14. Tester avec la pseudo-localisation
Avant les vraies traductions, testez avec des pseudo-traductions :
"Welcome" → "[Ẃéĺćőḿé !!!!!!]"
La pseudo-localisation révèle :
- Chaînes codées en dur (non transformées)
- Problèmes de mise en page (expansion du texte)
- Problèmes de troncature
- Problèmes d'encodage de caractères
15. Implémenter les mises à jour OTA pour Mobile
N'attendez pas les versions de l'App Store pour corriger les traductions :
Swift// Avec OTA, les mises à jour de traduction sont instantanées let message = IntlPull.t("welcome.message") // Changement dans le tableau de bord → les utilisateurs le voient immédiatement
Sans OTA : Délai de 1-2 semaines pour tout changement de traduction Avec OTA : Mises à jour instantanées, aucune version d'application nécessaire
Anti-Patterns à éviter
À ne pas faire : Utiliser la concaténation de chaînes
JavaScript// Ne jamais faire ceci "Welcome, " + name
À ne pas faire : Coder en dur le formatage
JavaScript// Ne jamais faire ceci date.toLocaleDateString('en-US')
À ne pas faire : Diviser les phrases
JavaScript1// Ne jamais faire ceci 2<span>{t('click')}</span> 3<Link>{t('here')}</Link> 4<span>{t('to_continue')}</span>
À ne pas faire : Supposer que Langue = Pays
JavaScript// Ne jamais faire ceci if (country === 'US') language = 'en'; // Hispanophones aux US, lusophones aux US, etc.
À ne pas faire : Oublier l'expansion du texte
CSS1/* Ne jamais faire ceci */ 2.button { 3 width: 100px; /* Casse en allemand */ 4}
Liste de contrôle
Avant de lancer dans une nouvelle langue :
- Toutes les chaînes extraites et traduites
- Pluralisation testée
- Formatage date/nombre/devise correct
- Mise en page RTL fonctionne (si applicable)
- Images et icônes localisées
- Métadonnées SEO traduites
- Messages d'erreur traduits
- Modèles d'e-mail traduits
- Pages juridiques traduites
- Testé par des locuteurs natifs
Outils qui aident
| Besoin | Outil |
|---|---|
| Gestion de la traduction | IntlPull |
| Extraction de chaînes | IntlPull CLI |
| Transformation de code | IntlPull CLI |
| Traduction IA | IntlPull (GPT-4, Claude) |
| Mises à jour OTA | IntlPull SDK |
| Pseudo-localisation | IntlPull |
Conclusion
Une bonne i18n concerne :
- Architecture propre : Extraire les chaînes tôt, utiliser l'interpolation
- Formatage approprié : Laisser les API gérer les différences de locale
- Traductions de qualité : Contexte, glossaires, TM
- Processus intelligent : Automatisation, flux continu, tests
Suivez ces 15 pratiques et vous construirez des applications qui s'adaptent mondialement sans la douleur typique de l'i18n.
Prêt à améliorer votre i18n ? Essayez IntlPull gratuitement et implémentez ces bonnes pratiques avec les bons outils.
