Pourquoi l'internationalisation PHP n'est pas simplement une « traduction de mots »
\n\nImaginez : vous avez écrit un super projet PHP. Il fonctionne, ravit les utilisateurs, génère des profits. Mais un jour, vous remarquez dans les statistiques que 30 % du trafic provient d'Allemagne, 15 % du Japon et 10 % des Émirats Arabes Unis. Votre site ne parle que le russe. Les utilisateurs partent sans trouver le bouton « Acheter » dans leur langue.
\n\nUne situation familière ? L'internationalisation (i18n) des applications PHP n'est pas simplement un remplacement de mots dans un modèle. C'est une approche architecturale qui permet à votre code de « comprendre » la culture, la devise, les dates et même la direction du texte (de gauche à droite ou de droite à gauche).
\n\nDans cet article, nous allons voir comment transformer un site PHP ordinaire en une plateforme multilingue en utilisant des outils natifs et les meilleures pratiques. Vous apprendrez comment fonctionne gettext en PHP, en quoi la localisation diffère de l'internationalisation, et comment éviter les pièges de la pluralisation.
\n\ni18n vs l10n : quelle est la différence (et pourquoi c'est important)
\n\nAvant d'écrire du code, mettons-nous d'accord sur les termes. L'internationalisation (i18n) est la préparation du code à la traduction : externalisation des chaînes, gestion des formats de nombres, dates, devises. La localisation (l10n) est le processus même de traduction et d'adaptation à une région spécifique.
\n\nUne analogie simple : l'internationalisation, c'est la construction d'une maison avec des pièces vides où l'on peut mettre n'importe quel meuble. La localisation, c'est la disposition des meubles selon les goûts d'un habitant particulier.
\n\nPour un développeur PHP, cela signifie : ne codez pas en dur les chaînes ! Jamais. Même si le site n'est actuellement qu'en russe. Chaque phrase doit être encapsulée dans une fonction de traduction.
\n\nStack technologique pour l'i18n en PHP
\n\nDans l'écosystème PHP, il existe plusieurs outils puissants. Nous allons examiner deux approches principales : le classique gettext et le moderne ICU MessageFormat via l'extension intl.
1. Gettext — le grand-père du multilinguisme
\n\nGettext en PHP est la norme de facto pour de nombreux CMS (WordPress, Drupal). Il utilise des fichiers .po et .mo pour stocker les traductions. Avantages : simplicité, prise en charge des formes plurielles, intégration avec Poedit.
2. ICU MessageFormat — pour la logique complexe
\n\nL'extension PHP intl (Internationalization) fournit les classes MessageFormatter et NumberFormatter. C'est le choix pour les projets nécessitant des modèles complexes avec sélection de cas, genre et nombre.
3. Bibliothèques d'encapsulation
\n- \n
- symfony/translation — composant Symfony, fonctionne aussi bien avec YAML/XLIFF qu'avec gettext. \n
- laravel-localization — pour Laravel (package mcamara/laravel-localization). \n
- zend-i18n — pour Laminas (anciennement Zend Framework). \n
Pratique : configurer gettext en PHP à partir de zéro
\n\nSupposons que nous ayons un script simple index.php qui affiche un message de bienvenue. Rendons-le multilingue.
Étape 1. Préparation du code
\n\nEncapsulez toutes les chaînes dans la fonction _() (alias pour gettext()) :
<?php\n// index.php\necho _("Bienvenue sur notre site !");\n\n$items = 5;\n// Pour les formes plurielles, utilisez ngettext\necho ngettext("%d article", "%d articles", $items);\n?>\n\nÉtape 2. Génération du fichier .pot
\n\nInstallez gettext sur le serveur ou utilisez xgettext :
xgettext -o locales/messages.pot index.php --from-code=UTF-8\n\nÉtape 3. Création de la traduction
\n\nCopiez messages.pot dans locales/fr_FR/LC_MESSAGES/messages.po et modifiez-le :
msgid "Bienvenue sur notre site !"\nmsgstr "Welcome to our site!"\n\nmsgid "%d article"\nmsgid_plural "%d articles"\nmsgstr[0] "%d item"\nmsgstr[1] "%d items"\n\n