Internationalisation (i18n) en PHP : Guide complet avec exemples

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

Internationalisation (i18n) en PHP : comment rendre un site multilingue



L'internationalisation (i18n) est le processus de conception de logiciels de manière à ce qu'ils puissent être facilement adaptés à différentes langues et régions sans modification du code. En PHP, il existe plusieurs outils puissants qui permettent de séparer le code et le texte, puis de charger dynamiquement la langue souhaitée.



Dans cet article, nous examinerons les principales approches et bibliothèques pour implémenter l'i18n en PHP, y compris les fonctions intégrées gettext, l'extension intl et les bibliothèques populaires telles que Symfony Translation.



1. Concepts clés de l'i18n



Avant de passer aux outils, il est important de comprendre les termes clés :



  • Locale — une combinaison de langue et de région (par exemple, ru_RU, en_US, de_DE).
  • Traduction — remplacement d'une chaîne source par son équivalent dans une autre langue.
  • Pluralisation — déclinaison correcte des mots en fonction du nombre (par exemple, "1 fichier", "2 fichiers", "10 fichiers").
  • Formatage — adaptation des dates, nombres, devises à la locale.


2. Bibliothèque intégrée gettext



gettext est un outil classique pour l'i18n, intégré à PHP. Il utilise les fichiers .po (Portable Object) et .mo (Machine Object) pour stocker les traductions.



Installation et configuration



Assurez-vous que l'extension gettext est activée dans php.ini :



extension=gettext


Exemple de configuration de base :



<?php// Définir la localesetlocale(LC_ALL, 'ru_RU.UTF-8');// Spécifier le domaine (nom du fichier .mo)bindtextdomain('messages', './locale');// Encodagebind_textdomain_codeset('messages', 'UTF-8');// Choisir le domainetextdomain('messages');

// Utiliser la traductionecho gettext("Hello, World!"); // affichera "Здравствуй, Мир!"// ou en version abrégéeecho _("Hello, World!");?>


Structure des fichiers



Vos fichiers de traduction doivent se trouver dans le dossier locale :



locale/├── ru_RU/│   └── LC_MESSAGES/│       └── messages.po│       └── messages.mo└── en_US/    └── LC_MESSAGES/        └── messages.po        └── messages.mo


Exemple de fichier messages.po :



msgid "Hello, World!"msgstr "Здравствуй, Мир!"

msgid "Files: %d"msgstr "Файлы: %d"


Pour compiler le fichier .po en .mo, utilisez l'utilitaire msgfmt :



msgfmt messages.po -o messages.mo


3. Extension intl (Fonctions d'internationalisation)



L'extension intl offre des fonctionnalités plus modernes pour travailler avec les locales, notamment le formatage des nombres, des dates et des messages.



Installation



sudo apt-get install php-intl  # pour Ubuntu/Debian


Formatage des messages avec MessageFormatter



<?php$locale = 'ru_RU';$message = '{0} приветствует {1}!';$fmt = new MessageFormatter($locale, $message);echo $fmt->format(['PHP', 'Мир']);// Affichera : PHP приветствует Мир!?>


Pluralisation



<?php$locale = 'ru_RU';$pattern = '{0, plural, one {# файл} few {# файла} other {# файлов}}';$fmt = new MessageFormatter($locale, $pattern);echo $fmt->format([1]); // 1 файлecho $fmt->format([2]); // 2 файлаecho $fmt->format([10]); // 10 файлов?>


Formatage des dates et des nombres



<?php$locale = 'ru_RU';$fmt = new NumberFormatter($locale, NumberFormatter::DECIMAL);echo $fmt->format(1234567.89); // 1 234 567,89

$dateFmt = new IntlDateFormatter($locale, IntlDateFormatter::LONG, IntlDateFormatter::NONE);echo $dateFmt->f

Recommendations