Internationalisation PHP : guide i18n pour sites multilingues

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi votre site PHP doit parler plusieurs langues ?

\n\n

Imaginez : vous avez créé un produit parfait — rapide, pratique, qui résout les problèmes. Mais il y a un hic : votre interface ne parle que français. Des clients potentiels d'Allemagne, du Japon ou du Brésil ferment simplement l'onglet, ne comprenant aucun bouton. Ce n'est pas seulement une perte de revenus — c'est la perte de marchés entiers.

\n\n

L'internationalisation (i18n — de « internationalization », 18 lettres entre i et n) et la localisation (l10n) ne sont pas une simple case à cocher pour une startup, mais un outil stratégique. De nombreux développeurs craignent ce mot, pensant devoir réécrire tout le code. En réalité, une organisation intelligente des traductions en PHP est un processus élégant qui rend le code plus propre et l'entreprise plus globale.

\n\n

Dans cet article, nous allons explorer trois approches concrètes pour internationaliser vos applications PHP : des simples tableaux à la puissante extension intl en passant par le classique gettext. Vous apprendrez non seulement à traduire du texte, mais aussi à gérer correctement les dates, les nombres et les formes plurielles — car en arabe, en polonais ou en russe, les règles de déclinaison sont différentes.

\n\n

Les principales approches de l'i18n en PHP

\n\n

Avant d'écrire du code, il faut choisir une architecture. En gros, toutes les méthodes se divisent en trois catégories. Le choix dépend de l'échelle du projet et des exigences de performance.

\n\n

1. Tableaux et fichiers ini (approche DIY)

\n\n

La méthode la plus simple consiste à stocker les traductions dans des tableaux associatifs ou des fichiers .ini. Idéale pour les petits projets ou les MVP.

\n\n
// lang/fr.php\nreturn [\n    'welcome' => 'Bienvenue sur le site !',\n    'logout' => 'Déconnexion',\n    'cart_empty' => 'Le panier est vide'\n];\n\n// lang/en.php\nreturn [\n    'welcome' => 'Welcome to the website!',\n    'logout' => 'Logout',\n    'cart_empty' => 'Cart is empty'\n];
\n\n

L'utilisation est simple : on inclut le fichier approprié en fonction de la session ou du cookie de l'utilisateur.

\n\n
function __($key) {\n    static $lang = null;\n    if ($lang === null) {\n        $locale = $_SESSION['lang'] ?? 'fr';\n        $lang = include "lang/{$locale}.php";\n    }\n    return $lang[$key] ?? $key;\n}\n\necho __('welcome'); // Bienvenue sur le site !
\n\n

Avantages : simplicité, aucune extension requise, facile à mettre en cache (on peut même le stocker dans Redis).
\nInconvénients : pas de support des formes plurielles (il faut réinventer la roue), peu pratique pour les grands projets (des milliers de clés dans un seul fichier).

\n\n

2. Gettext — le classique indémodable

\n\n

Gettext est la norme de facto pour l'internationalisation dans le monde Unix. En PHP, il est accessible via l'extension gettext. C'est un outil puissant utilisé par WordPress, Drupal et Symfony.

\n\n

Commencez par créer des fichiers .po (par exemple, pour le français) :

\n\n
# fr_FR/LC_MESSAGES/messages.po\nmsgid "Hello, %s!"\nmsgstr "Bonjour, %s !"\n\nmsgid "You have %d new message"\nmsgid_plural "You have %d new messages"\nmsgstr[0] "Vous avez %d nouveau message"\nmsgstr[1] "Vous avez %d nouveaux messages"
\n\n

Compilez ensuite en fichier .mo (avec l'outil msgfmt). Dans le code PHP, cela donne :

\n\n
putenv('LC_ALL=fr_FR.UTF-8');\nsetlocale(LC_ALL, 'fr_FR.UTF-8');\nbindtextdomain('messages', './locale');\ntextdomain('messages');\n\necho gettext('Hello, %s!', 'Alex'); // Bonjour, Alex !\n\n// Formes plurielles — la magie :\necho ngettext('%d message', '%d messages', 3); // 3 messages
\n\n

Astuce : pour accélérer le développement, utilisez Poedit — il mettra en évidence les chaînes non traduites.

\n\n

3. L'extension Intl (PHP 5.3+)

\n\n

Si vous avez besoin non seulement de traduire du texte, mais aussi de formater correctement un nombre, une date ou une devise selon les normes du pays, utilisez Intl. C'est une surcouche de la bibliothèque ICU (International Components for Unicode).

\n\n
// Formatage des nombres                

Blogs

Book Recommendations