La Confusion
Les développeurs entendent ces termes lancés autour d'eux :
- "Nous devons mondialiser l'application"
- "Ajouter la localisation pour l'Europe"
- "La base de code est-elle internationalisée ?"
Quelle est la différence ? Est-ce la même chose ?
Non. Ils sont liés mais distincts. Voici la répartition simple :
| Terme | Abréviation | Signification | Qui le fait |
|---|---|---|---|
| Internationalisation | i18n | Concevoir votre application pour supporter plusieurs langues | Développeurs |
| Localisation | L10n | Traduire le contenu pour des marchés spécifiques | Traducteurs |
| Mondialisation | G11n | La stratégie globale | Produit + Marketing |
Pensez-y de cette façon :
- i18n = Construire une voiture avec une direction modulaire (gauche ou droite)
- L10n = Installer la direction à gauche pour le Royaume-Uni, à droite pour les États-Unis
- G11n = Décider dans quels pays vendre des voitures
Décomposons chacun d'eux.
Internationalisation (i18n)
Définition : Concevoir une architecture logicielle pour prendre en charge plusieurs langues et régions sans modifications de code.
C'est ce que font les développeurs avant de traduire quoi que ce soit.
Ce que comprend l'i18n
1. Extraire le texte visible par l'utilisateur du code :
JSX1// ❌ Pas internationalisé 2<button>Save</button> 3 4// ✅ Internationalisé 5<button>{t('save')}</button>
2. Supporter différents formats de données :
- Dates : US (MM/JJ/AAAA) vs Europe (JJ/MM/AAAA) vs ISO (AAAA-MM-JJ)
- Nombres : 1,234.56 (US) vs 1.234,56 (Allemagne)
- Devises : 99 $ vs 99 € vs 100 ¥
3. Gérer la directionnalité du texte :
- Gauche-à-droite (LTR) : Anglais, Espagnol, Français
- Droite-à-gauche (RTL) : Arabe, Hébreu, Persan
4. Supporter la pluralisation :
- Anglais : 1 article, 2 articles (2 formes)
- Polonais : 1 przedmiot, 2 przedmioty, 5 przedmiotów (3 formes)
- Arabe : 0, 1, 2, 3-10, 11-99, 100+ (6 formes !)
5. Permettre l'expansion du texte :
- L'allemand est ~30 % plus long que l'anglais
- L'UI doit s'adapter : "Save" → "Speichern" (10 carac. vs 4)
i18n en Pratique
Exemple React :
TSX1import { useTranslation } from 'react-i18next'; 2import { useFormatter } from '@/lib/intl'; 3 4function ProductCard({ product }) { 5 const { t } = useTranslation('common'); 6 const { formatCurrency, formatDate } = useFormatter(); 7 8 return ( 9 <div> 10 <h3>{product.name}</h3> 11 {/* Chaîne internationalisée */} 12 <p>{t('product.price_label')}: {formatCurrency(product.price)}</p> 13 14 {/* Date internationalisée */} 15 <time>{formatDate(product.releaseDate)}</time> 16 17 {/* Pluriel internationalisé */} 18 <span>{t('product.reviews', { count: product.reviewCount })}</span> 19 </div> 20 ); 21}
Fichiers de traduction :
JSON1// en.json 2{ 3 "product": { 4 "price_label": "Price", 5 "reviews": "{{count}} review", 6 "reviews_plural": "{{count}} reviews" 7 } 8} 9 10// de.json 11{ 12 "product": { 13 "price_label": "Preis", 14 "reviews": "{{count}} Bewertung", 15 "reviews_plural": "{{count}} Bewertungen" 16 } 17}
Vous faites l'internationalisation une fois. Ensuite, vous pouvez ajouter des langues sans toucher au code.
Localisation (L10n)
Définition : Adapter le contenu pour une locale spécifique (langue + région).
C'est ce que font les traducteurs. Mais c'est plus que de la simple traduction.
Ce que comprend la L10n
1. Traduction (évident)
- "Save" → "Guardar" (Espagnol)
- "Hello" → "你好" (Chinois)
2. Adaptation culturelle
- Couleurs : Blanc = pureté (Occident), deuil (Chine)
- Images : Montrer de la peau sur les marchés conservateurs
- Icônes : Pouce en l'air 👍 offensant au Moyen-Orient
- Exemples : Utiliser des noms locaux, pas "John Smith"
3. Formatage régional
- Devise : $ aux US, € en Europe, £ au Royaume-Uni (même si tout est en anglais)
- Adresses : Les US ont un ZIP, le Royaume-Uni a un code postal
- Numéros de téléphone : Différents formats mondialement
4. Juridique/Conformité
- RGPD pour l'UE
- Politiques de confidentialité différentes par région
- Variations des conditions d'utilisation
5. Changements de contenu
- Noms de produits : Coca-Cola est 可口可乐 (Kěkǒukělè, "plaisir savoureux") en chinois
- Slogans adaptés, pas traduits littéralement
- Fonctionnalités différentes par marché (WeChat Pay pour la Chine, pas les US)
Exemple L10n : Espagnol pour l'Espagne vs le Mexique
Même langue, locale différente :
| Chaîne | Espagne (es-ES) | Mexique (es-MX) |
|---|---|---|
| "Computer" | "Ordenador" | "Computadora" |
| "Car" | "Coche" | "Carro" |
| "You (formal)" | "Usted" | "Tú" (plus informel) |
| Devise | € (Euro) | $ (Peso) |
Vous avez besoin de fichiers es-ES.json et es-MX.json séparés.
L10n dans le Code
TSX1// Charger le contenu spécifique à la locale 2import { getLocale } from 'next-intl/server'; 3 4async function getLocalizedContent() { 5 const locale = await getLocale(); 6 7 // Contenu différent par locale 8 const pricing = { 9 'en-US': { currency: 'USD', price: 99 }, 10 'en-GB': { currency: 'GBP', price: 79 }, 11 'es-ES': { currency: 'EUR', price: 89 }, 12 'es-MX': { currency: 'MXN', price: 1799 } 13 }; 14 15 return pricing[locale]; 16}
Quand la L10n tourne mal
Pepsi en Chine :
- Slogan anglais : "Come alive with Pepsi"
- Traduction chinoise : "Pepsi ramène vos ancêtres d'entre les morts"
- Échec épique.
KFC en Chine :
- Anglais : "Finger-lickin' good"
- Chinois : "Mangez vos doigts"
- Aussi un échec épique.
La L10n n'est pas juste de la traduction ; c'est une adaptation culturelle.
Mondialisation (G11n)
Définition : La stratégie commerciale globale de s'implanter à l'échelle mondiale.
C'est ce que font les équipes produit et marketing.
Ce que comprend la G11n
1. Étude de marché
- Quels pays cibler ?
- Quel est le TAM (marché total adressable) ?
- Concurrence locale ?
2. Adaptation produit
- Avons-nous besoin de fonctionnalités différentes par région ?
- Devrions-nous supprimer des fonctionnalités qui ne fonctionneront pas localement ?
3. Stratégie de distribution
- Comment atteignons-nous les clients ? (App stores, web, partenariats)
- Méthodes de paiement : Cartes de crédit (US), Alipay (Chine), Paytm (Inde)
- Canaux marketing : Google Ads (mondial), Baidu (Chine), Yandex (Russie)
4. Conformité
- RGPD (UE)
- CCPA (Californie)
- Exigences de résidence des données (Russie, Chine)
5. Opérations
- Support client local
- Documentation localisée
- Bureaux régionaux
Exemple G11n : Uber
Stratégie de mondialisation d'Uber :
- Produit principal : Le même dans le monde entier (VTC)
- Fonctionnalités localisées : Paiements en espèces en Inde (faible adoption des cartes de crédit)
- Tarification localisée : Dynamique, par ville
- Partenaires localisés : Intégration différente des chauffeurs par région
- Marketing localisé : Campagnes différentes par pays
Ils n'ont pas juste traduit l'application ; ils ont adapté leur modèle économique.
Comment ils travaillent ensemble
Voici un flux réel :
Phase 1 : Internationaliser (Développeurs)
Terminal1# Mois 1-2 2- Extraire toutes les chaînes codées en dur 3- Utiliser une bibliothèque i18n (react-i18next, next-intl) 4- Supporter le formatage date/nombre/devise 5- Tester avec les langues RTL 6- Gérer l'expansion du texte
Sortie : L'application est prête pour la traduction. Toujours uniquement en anglais, mais architecturée pour le multilingue.
Phase 2 : Localiser (Traducteurs)
Terminal1# Mois 3 2- Traduire les chaînes en espagnol, français, allemand 3- Adapter les images/icônes pour l'ajustement culturel 4- Localiser la copie marketing (pas de traduction littérale) 5- L'équipe juridique adapte les Conditions d'utilisation
Sortie : L'application fonctionne maintenant en 4 langues.
Phase 3 : Mondialiser (Business)
Terminal1# Mois 4-6 2- Lancer sur les marchés cibles 3- Campagnes marketing locales 4- Partenariat avec des fournisseurs de paiement locaux 5- Mettre en place un support client régional 6- Surveiller et itérer
Sortie : Vous vendez mondialement.
Glocalisation (L'approche moderne)
Glocalisation = Mondialisation + Localisation
Penser globalement, agir localement.
Exemples
McDonald's :
- Marque mondiale, cœur de menu mondial (Big Mac)
- Adaptations locales : McSpicy Paneer (Inde), Teriyaki Burger (Japon)
Netflix :
- Plateforme mondiale, bibliothèque de contenu mondiale
- Contenu local : Dramas coréens, séries espagnoles, films français
- Tarification locale : 199 ₹/mois (Inde) vs 15,99 $/mois (US)
Airbnb :
- Plateforme mondiale
- Réglementations locales : Règles différentes par ville
- Méthodes de paiement locales : Alipay, virements bancaires locaux
Glocalisation dans le Code
TSX1// Indicateurs de fonctionnalité par marché 2const features = { 3 'us': { paymentMethods: ['card', 'paypal'], showTipping: true }, 4 'cn': { paymentMethods: ['alipay', 'wechat'], showTipping: false }, 5 'in': { paymentMethods: ['card', 'upi', 'paytm'], showTipping: false } 6}; 7 8function CheckoutPage() { 9 const locale = useLocale(); 10 const marketFeatures = features[locale.split('-')[1].toLowerCase()]; 11 12 return ( 13 <div> 14 {marketFeatures.paymentMethods.map(method => ( 15 <PaymentOption key={method} type={method} /> 16 ))} 17 {marketFeatures.showTipping && <TipSelector />} 18 </div> 19 ); 20}
Implémentation technique
Construisons une application React correctement internationalisée, localisée et mondialisée.
Étape 1 : Internationalisation (Architecture de code)
Terminalnpm install react-i18next i18next
TSX1// i18n.ts 2import i18n from 'i18next'; 3import { initReactI18next } from 'react-i18next'; 4 5i18n.use(initReactI18next).init({ 6 resources: { 7 en: { translation: require('./locales/en.json') }, 8 es: { translation: require('./locales/es.json') }, 9 de: { translation: require('./locales/de.json') }, 10 }, 11 lng: 'en', 12 fallbackLng: 'en', 13 interpolation: { escapeValue: false } 14}); 15 16export default i18n;
TSX1// Composant avec i18n approprié 2import { useTranslation } from 'react-i18next'; 3 4function HomePage() { 5 const { t, i18n } = useTranslation('common'); 6 7 // Internationalisé : supporte n'importe quelle langue 8 return ( 9 <div dir={i18n.dir()}> {/* Support RTL */} 10 <h1>{t('home.title')}</h1> 11 <p>{t('home.subtitle', { name: 'Utilisateur' })}</p> 12 13 {/* Formatage de date */} 14 <time>{new Intl.DateTimeFormat(i18n.language).format(new Date())}</time> 15 16 {/* Formatage de nombre */} 17 <span>{new Intl.NumberFormat(i18n.language).format(1234567)}</span> 18 </div> 19 ); 20}
Étape 2 : Localisation (Contenu)
Créez du contenu spécifique à la locale :
JSON1// locales/en-US.json 2{ 3 "home": { 4 "title": "Welcome to Our App", 5 "cta": "Get Started Free", 6 "features": { 7 "speed": "Lightning fast", 8 "security": "Bank-level security" 9 } 10 }, 11 "pricing": { 12 "currency": "USD", 13 "monthly": "$99/month" 14 } 15}
JSON1// locales/en-GB.json 2{ 3 "home": { 4 "title": "Welcome to Our App", 5 "cta": "Get Started Free", // Même que US 6 "features": { 7 "speed": "Lightning fast", 8 "security": "Bank-level security" 9 } 10 }, 11 "pricing": { 12 "currency": "GBP", 13 "monthly": "£79/month" // Prix/devise différents 14 } 15}
JSON1// locales/es-MX.json 2{ 3 "home": { 4 "title": "Bienvenido a Nuestra App", 5 "cta": "Comienza Gratis", 6 "features": { 7 "speed": "Increíblemente rápido", 8 "security": "Seguridad de nivel bancario" 9 } 10 }, 11 "pricing": { 12 "currency": "MXN", 13 "monthly": "$1,799/mes" 14 } 15}
Étape 3 : Mondialisation (Fonctionnalités spécifiques au marché)
TSX1// Configuration du marché 2const markets = { 3 'us': { 4 paymentMethods: ['stripe', 'paypal'], 5 supportedCurrencies: ['USD'], 6 complianceDocuments: ['privacy-policy-ccpa'], 7 features: { 8 tipping: true, 9 cashPayments: false 10 } 11 }, 12 'eu': { 13 paymentMethods: ['stripe'], 14 supportedCurrencies: ['EUR', 'GBP'], 15 complianceDocuments: ['privacy-policy-gdpr', 'cookie-policy'], 16 features: { 17 tipping: false, 18 cashPayments: false 19 } 20 }, 21 'in': { 22 paymentMethods: ['razorpay', 'paytm', 'upi'], 23 supportedCurrencies: ['INR'], 24 complianceDocuments: ['privacy-policy'], 25 features: { 26 tipping: false, 27 cashPayments: true 28 } 29 } 30}; 31 32// Composant 33function CheckoutPage() { 34 const locale = useLocale(); // 'en-US', 'en-GB', 'fr-FR', etc. 35 const market = locale.split('-')[1].toLowerCase(); 36 const config = markets[market] || markets['us']; 37 38 return ( 39 <div> 40 <PaymentMethods methods={config.paymentMethods} /> 41 {config.features.cashPayments && <CashOption />} 42 {config.features.tipping && <TipSelector />} 43 </div> 44 ); 45}
Erreurs courantes
1. Confondre i18n avec L10n
Faux : "Nous avons internationalisé l'application en espagnol."
Vrai : "Nous avons internationalisé l'application (elle supporte maintenant plusieurs langues), puis l'avons localisée en espagnol."
L'internationalisation est agnostique à la langue. La localisation est spécifique à la langue.
2. Ignorer les variantes régionales
Ne traitez pas l'"espagnol" comme une seule chose. C'est :
es-ES(Espagne)es-MX(Mexique)es-AR(Argentine)es-CO(Colombie)
Chacun a des différences de vocabulaire.
3. Traduire littéralement
Mauvaise localisation : Anglais : "Don't put all your eggs in one basket" Allemand (littéral) : "Lege nicht alle Eier in einen Korb" (sans signification) Allemand (localisé) : "Setze nicht alles auf eine Karte" (idiome correct)
Utilisez des traducteurs professionnels qui comprennent le contexte culturel.
4. Oublier la détection de locale
TSX1// ❌ Mauvais : Forcer l'anglais 2const locale = 'en'; 3 4// ✅ Bon : Détecter depuis le navigateur 5const locale = navigator.language || 'en'; 6 7// ✅ Mieux : Laisser l'utilisateur choisir, se souvenir de la préférence 8const locale = localStorage.getItem('locale') || navigator.language || 'en';
5. Ne pas tester le RTL
Si vous supportez l'arabe/hébreu, testez le RTL :
CSS/* Utiliser des propriétés logiques */ margin-inline-start: 1rem; /* Pas margin-left */ padding-inline-end: 1rem; /* Pas padding-right */
TSX// Définir l'attribut de direction <html dir={i18n.dir()}> {/* 'ltr' ou 'rtl' */}
Bonnes pratiques
1. Espaces de noms pour les traductions
JSON1// ❌ Structure plate (difficile à gérer) 2{ 3 "button_save": "Save", 4 "button_cancel": "Cancel", 5 "button_delete": "Delete" 6} 7 8// ✅ Avec espaces de noms 9{ 10 "buttons": { 11 "save": "Save", 12 "cancel": "Cancel", 13 "delete": "Delete" 14 }, 15 "forms": { 16 "email_label": "Email", 17 "password_label": "Password" 18 } 19}
2. Utiliser des routes spécifiques à la locale
/en/pricing (Anglais)
/es/precios (Espagnol - URL traduite)
/de/preise (Allemand - URL traduite)
Configuration Next.js :
TypeScript1// next.config.ts 2export default { 3 i18n: { 4 locales: ['en', 'es', 'de'], 5 defaultLocale: 'en', 6 localeDetection: true 7 } 8};
3. Implémenter des replis
TSX1// Si la clé manque en espagnol, repli vers l'anglais 2i18n.init({ 3 fallbackLng: 'en', 4 // Si 'es-MX' manque, essayer 'es', puis 'en' 5 fallbackLng: { 6 'es-MX': ['es', 'en'], 7 'es-AR': ['es', 'en'], 8 'default': ['en'] 9 } 10});
4. Contrôle de version des traductions
Stockez les traductions dans Git. Suivez les changements :
Terminalgit log locales/es.json # Voir qui a changé quelle traduction quand
Ou utilisez un TMS avec synchronisation Git (comme IntlPull).
5. Automatiser les flux de traduction
Terminal1# Exemple IntlPull 2npx @intlpullhq/cli upload # Télécharger les nouvelles chaînes anglaises 3# Les traducteurs travaillent dans l'interface web 4npx @intlpullhq/cli download # Télécharger les chaînes traduites
Évite l'édition manuelle de JSON par les traducteurs.
Étude de cas réelle : Application SaaS
Scénario : Application SaaS React, lancement aux US, Europe, Amérique latine.
Phase 1 : Internationalisation (Semaine 1-2)
Terminalnpm install next-intl
- Extrait 1 200 chaînes des composants
- Configuré
next-intlavec détection de locale - Implémenté le formatage date/nombre avec l'API
Intl - Testé avec pseudo-localisation (détecté des bugs UI)
Résultat : Application prête pour la traduction.
Phase 2 : Localisation (Semaine 3-4)
- Embauché des traducteurs pour ES, FR, DE
- Traduit les chaînes (1 200 × 3 = 3 600 traductions)
- Adapté la copie marketing (pas de traduction littérale)
- Localisé les images (photos différentes pour le marché UE)
Coût : 0,08 $/mot × 1 200 mots × 3 langues = 288 $
Résultat : Application disponible en 4 langues.
Phase 3 : Mondialisation (Semaine 5-8)
- Intégré Stripe pour US/UE, MercadoPago pour l'Amérique latine
- Configuré la conformité RGPD pour l'UE (bannières de cookies, suppression de données)
- Localisé la tarification ($ pour US, € pour UE, MXN pour le Mexique)
- Lancé des campagnes marketing régionales
Impact sur les revenus : +180 % provenant des marchés internationaux au T1.
Quand faire quoi
| Étape | Quand |
|---|---|
| i18n | Jour 1 (ou refactoriser l'application existante avant de traduire) |
| L10n | Avant le lancement sur un nouveau marché |
| G11n | Continu (au fur et à mesure que vous vous étendez à de nouveaux marchés) |
Ne traduisez pas avant d'internationaliser. Vous devrez tout refactoriser plus tard.
Outils pour chaque phase
Internationalisation (i18n) :
- React : react-i18next, react-intl
- Next.js : next-intl, next-i18next
- Vue : vue-i18n
- Svelte : svelte-i18n
Localisation (L10n) :
- Traduction : API DeepL, ChatGPT, traducteurs humains
- Gestion : IntlPull, Lokalise, Phrase, Crowdin
Mondialisation (G11n) :
- Paiements : Stripe (mondial), MercadoPago (LATAM), Razorpay (Inde)
- Analytique : Mixpanel, Amplitude (support multi-région)
- Conformité : OneTrust (RGPD), TrustArc
Prêt à vous mondialiser ?
Essayez IntlPull. Gère les chaînes i18n, les flux de travail L10n et le déploiement G11n avec des mises à jour OTA. Commencez à traduire en 5 minutes.
Ou construisez votre propre système i18n si vous êtes à l'aise avec la gestion manuelle des fichiers de traduction.
