Internationalisation (i18n) en C++ : des bases aux techniques avancées
\n\nL'internationalisation (abrégée i18n — de « internationalization », où 18 représente le nombre de lettres entre la première et la dernière) est le processus de conception de logiciels de manière à pouvoir les adapter facilement à différentes langues et régions sans modifier le code source. Pour le langage C++, traditionnellement utilisé dans les applications haute performance et multiplateformes, une implémentation correcte de l'i18n est cruciale. Dans cet article, nous examinerons les principales approches, bibliothèques et exemples pratiques pour la localisation d'applications C++.
\n\nConcepts clés de l'i18n
\n\nAvant de passer aux outils, il est important de comprendre les notions clés :
\n\n- \n
- Localisation (l10n) — adaptation du texte traduit, des formats de date, des nombres et des devises pour une région spécifique. \n
- Locale — ensemble de règles (langue, région, encodage) définissant le formatage des données. \n
- Unicode et UTF-8 — standard d'encodage des caractères, indispensable pour l'internationalisation moderne. \n
- Pluralisation — affichage correct des formes plurielles (par exemple, « 1 fichier », « 2 fichiers », « 10 fichiers »). \n
Bibliothèque GNU gettext pour C++
\n\nGNU gettext est l'outil d'internationalisation le plus populaire dans le monde Unix/Linux, qui fonctionne parfaitement avec C++. Il fournit une API minimaliste et des utilitaires puissants pour l'extraction et la gestion des traductions.
\n\nInstallation et configuration
\n\nPour utiliser gettext dans un projet C++, il est nécessaire d'installer le paquet libintl et d'inclure le fichier d'en-tête :
#include <libintl.h>\n#include <locale.h>\n\n#define _(STRING) gettext(STRING)\n\nExemple d'utilisation de base
\n\n#include <iostream>\n#include <libintl.h>\n#include <locale.h>\n\nint main() {\n setlocale(LC_ALL, "");\n bindtextdomain("myapp", "./locale");\n textdomain("myapp");\n\n std::cout << _("Hello, world!") << std::endl;\n std::cout << _("File not found") << std::endl;\n return 0;\n}\n\nCréation de fichiers de traduction
\n\nLe processus comprend trois étapes :
\n\n- \n
- Extraction des chaînes :
xgettext --keyword=_ main.cpp -o messages.po\n - Édition du fichier .po — ajout des traductions manuellement ou via Poedit. \n
- Compilation en .mo :
msgfmt messages.po -o locale/ru/LC_MESSAGES/myapp.mo\n
Prise en charge de la pluralisation
\n\nGettext prend en charge les formes plurielles via la fonction ngettext :
int count = 5;\nprintf(ngettext("%d file deleted", "%d files deleted", count), count);\n\nBibliothèque ICU (International Components for Unicode)
\n\nICU est une bibliothèque puissante d'IBM, offrant un ensemble complet d'outils pour l'internationalisation : prise en charge d'Unicode, tri sensible à la locale, formatage des nombres, des dates, des devises, gestion des fuseaux horaires et bien plus encore. Pour C++, l'API C++ du paquet icu4c est utilisée.
Installation d'ICU
\n\nSur Ubuntu/Debian : sudo apt install libicu-dev
\nSur macOS : brew install icu4c
Formatage des nombres et des dates
\n\n#include <unicode/numfmt.h>\n#include <unicode/datefmt.h>\n#include <iostream>\n\nint main() {\n // Formatage d'un nombre pour la locale ru_RU\n icu::UnicodeString pattern;\n icu::NumberFormat* fmt = icu::NumberFormat::createInstance(\n icu::Locale("ru", "RU"), status);\n icu::UnicodeString result;\n fmt->format(1234567.89, result);\n \n std::string utf8;\n result.toUTF8String(utf8);\n std::cout << "Nombre : " << utf8 << std::endl; // 1 Aussi dans la bibliothèque
Mise en cache en Rust : la bibliothèque `cached`
Bibliothèques WebSocket Kotlin pour la création d'applications temps réel dans les applications web
Biometric Kotlin : guide complet avec exemples pratiques
Travailler avec les archives ZIP en Swift (iOS/macOS) : guide complet
PM2 pour JavaScript (Node.js) : guide complet avec exemples