Internationalisation (i18n) en PHP : la bibliothèque gettext et les approches modernes

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 : des bases aux solutions modernes

\n\n

L'internationalisation (i18n) est le processus de conception de logiciels afin qu'ils puissent être facilement adaptés à différentes langues et régions sans modifier le code. En PHP, il existe plusieurs approches pour implémenter l'i18n, des fonctions intégrées aux bibliothèques puissantes. Dans cet article, nous examinerons les principaux outils et les meilleures pratiques.

\n\n

Pourquoi l'internationalisation est-elle nécessaire ?

\n

L'objectif principal de l'i18n est de séparer le texte de l'interface du code. Cela permet de :

\n
    \n
  • Ajouter de nouvelles langues sans modifier la logique de l'application
  • \n
  • Prendre en charge plusieurs locales (formats de dates, nombres, devises)
  • \n
  • Simplifier le processus de traduction pour les traducteurs
  • \n
  • Respecter les normes régionales (par exemple, le format du numéro de téléphone)
  • \n
\n\n

Prise en charge intégrée : gettext

\n

PHP offre un mécanisme puissant gettext pour travailler avec les traductions. C'est une approche classique utilisée dans la plupart des systèmes Linux.

\n\n

Installation et configuration

\n

Assurez-vous que l'extension gettext est installée. Dans la plupart des distributions Linux, elle est disponible par défaut. Pour Windows, il peut être nécessaire d'activer php_gettext.dll dans php.ini.

\n\n

Création des fichiers de traduction

\n

Créez d'abord un répertoire pour les locales. Structure typique :

\n
locale/\n  ru_RU/\n    LC_MESSAGES/\n      messages.po\n      messages.mo\n  en_US/\n    LC_MESSAGES/\n      messages.po\n      messages.mo
\n\n

Les fichiers .po (Portable Object) sont des fichiers texte contenant les traductions. Exemple de contenu de messages.po pour la langue russe :

\n
msgid "Welcome"\nmsgstr "Добро пожаловать"\n\nmsgid "Hello, %s!"\nmsgstr "Здравствуйте, %s!"
\n\n

Compilez le fichier .po en fichier binaire .mo à l'aide de l'utilitaire msgfmt :

\n
msgfmt locale/ru_RU/LC_MESSAGES/messages.po -o locale/ru_RU/LC_MESSAGES/messages.mo
\n\n

Utilisation dans le code

\n

Exemple de script PHP avec gettext :

\n
<?php\n// Définir la locale et le domaine\n$locale = 'ru_RU';\nputenv("LANG=$locale");\nsetlocale(LC_ALL, $locale);\nbindtextdomain('messages', __DIR__ . '/locale');\ntextdomain('messages');\n\n// Traduction des chaînes\necho gettext('Welcome'); // Affiche "Добро пожаловать"\necho _('Hello, %s!', 'Иван'); // Affiche "Здравствуйте, Иван!"\n?>
\n\n

La fonction _() est un raccourci pour gettext(). Pour la traduction avec des espaces réservés, utilisez sprintf() :

\n
echo sprintf(_('Hello, %s!'), $username);
\n\n

Approche moderne : symfony/translation

\n

Pour les grands projets, il est plus pratique d'utiliser la bibliothèque symfony/translation. Elle offre une interface plus flexible, la prise en charge de différents formats (YAML, XLIFF, JSON) et s'intègre facilement avec les frameworks.

\n\n

Installation via Composer

\n
composer require symfony/translation
\n\n

Exemple d'utilisation

\n
<?php\nrequire_once __DIR__ . '/vendor/autoload.php';\n\nuse Symfony\\Component\\Translation\\Translator;\nuse Symfony\\Component\\Translation\\Loader\\ArrayLoader;\n\n$translator = new Translator('ru_RU');\n$translator->addLoader('array', new ArrayLoader());\n\n// Ajouter les traductions directement (pour la démonstration)\n$translator->addResource('array', [\n    'Welcome' => 'Добро пожаловать',\n    'Hello %name%' => 'Здравствуйте, %name%',\n], 'ru_RU');\n\n// Passage à l'anglais\n$translator->setLocale('en_US');\n$translator->addResource('array', [\n    'Welcome' => 'Welcome',\n    'Hello %name%' => 'Hello, %name%',\n], 'en_US');\n\n// Utilisation\necho $translator->trans('Welcome'); // "Welcome"\necho $translator->trans('Hello %name%', ['%name%' => 'John']); // "Hello, John"\n?>
\n\n

Travailler avec des fichiers YAML

\n

Créez un fichier messages.ru.yaml :

Recommendations