Internationalisation (i18n) en PHP : des bases aux solutions modernes
\n\nL'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\nPourquoi l'internationalisation est-elle nécessaire ?
\nL'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
Prise en charge intégrée : gettext
\nPHP 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\nInstallation et configuration
\nAssurez-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.
Création des fichiers de traduction
\nCréez d'abord un répertoire pour les locales. Structure typique :
\nlocale/\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\nLes fichiers .po (Portable Object) sont des fichiers texte contenant les traductions. Exemple de contenu de messages.po pour la langue russe :
msgid "Welcome"\nmsgstr "Добро пожаловать"\n\nmsgid "Hello, %s!"\nmsgstr "Здравствуйте, %s!"\n\nCompilez le fichier .po en fichier binaire .mo à l'aide de l'utilitaire msgfmt :
msgfmt locale/ru_RU/LC_MESSAGES/messages.po -o locale/ru_RU/LC_MESSAGES/messages.mo\n\nUtilisation dans le code
\nExemple 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\nLa fonction _() est un raccourci pour gettext(). Pour la traduction avec des espaces réservés, utilisez sprintf() :
echo sprintf(_('Hello, %s!'), $username);\n\nApproche moderne : symfony/translation
\nPour 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\nInstallation via Composer
\ncomposer require symfony/translation\n\nExemple 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\nTravailler avec des fichiers YAML
\nCréez un fichier messages.ru.yaml :
Aussi dans la bibliothèque
Jetons JWT en Rust : bibliothèque jsonwebtoken et gestion de l'authentification
Mikro-ORM TypeScript : guide complet avec exemples
Parsing HTML en C# (.NET) : bibliothèques HtmlAgilityPack et AngleSharp
Recommendations
Travailler avec les ZIP/archives en Rust : bibliothèque zip et guide complet
Meilleures bibliothèques de logging pour Go (Golang) : aperçu et comparaison
Internationalisation (i18n) en PHP : Guide complet avec exemples
GraphQL en C# (.NET) : bibliothèques Hot Chocolate et GraphQL.NET pour créer des API