Internationalisation (i18n) en C++ : guide complet avec gettext et ICU

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 C++ : des bases aux techniques avancées

\n\n

L'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\n

Concepts clés de l'i18n

\n\n

Avant 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
\n\n

Bibliothèque GNU gettext pour C++

\n\n

GNU 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\n

Installation et configuration

\n\n

Pour utiliser gettext dans un projet C++, il est nécessaire d'installer le paquet libintl et d'inclure le fichier d'en-tête :

\n\n
#include <libintl.h>\n#include <locale.h>\n\n#define _(STRING) gettext(STRING)
\n\n

Exemple 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\n

Création de fichiers de traduction

\n\n

Le processus comprend trois étapes :

\n\n
    \n
  1. Extraction des chaînes : xgettext --keyword=_ main.cpp -o messages.po
  2. \n
  3. Édition du fichier .po — ajout des traductions manuellement ou via Poedit.
  4. \n
  5. Compilation en .mo : msgfmt messages.po -o locale/ru/LC_MESSAGES/myapp.mo
  6. \n
\n\n

Prise en charge de la pluralisation

\n\n

Gettext prend en charge les formes plurielles via la fonction ngettext :

\n\n
int count = 5;\nprintf(ngettext("%d file deleted", "%d files deleted", count), count);
\n\n

Bibliothèque ICU (International Components for Unicode)

\n\n

ICU 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.

\n\n

Installation d'ICU

\n\n

Sur Ubuntu/Debian : sudo apt install libicu-dev
\nSur macOS : brew install icu4c

\n\n

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                    

Recommendations