Internationalisation (i18n) en C++ : guide complet

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



L'internationalisation (abrégée i18n — de l'anglais "internationalization", où 18 représente le nombre de lettres entre le premier 'i' et le dernier 'n') est le processus de conception de logiciels afin qu'ils puissent être adaptés à différentes langues et particularités régionales sans modification du code. En C++, cette tâche a ses spécificités : le langage ne fournit pas d'outils intégrés pour la gestion des traductions, mais il existe plusieurs bibliothèques puissantes qui résolvent ce problème.



Pourquoi l'i18n est-elle importante pour les projets C++ ?



Les applications C++ modernes se limitent rarement à une seule langue. Programmes de bureau, jeux, solutions serveur — tous nécessitent la prise en charge de plusieurs locales. Les principaux problèmes résolus par l'i18n :



  • Gestion des encodages — passage de l'ASCII à l'UTF-8, UTF-16 et autres encodages multi-octets ;
  • Formatage des nombres, dates et devises — différents pays utilisent des séparateurs et formats différents ;
  • Ordre des mots dans les phrases — le russe nécessite des déclinaisons, l'anglais des articles ;
  • Pluralisation — les règles de formation du pluriel diffèrent (en russe il y a 3 formes, en anglais 2).


Principales bibliothèques pour l'i18n en C++



1. GNU gettext — le classique



GNU gettext est la bibliothèque la plus populaire pour l'internationalisation en C et C++. Elle utilise des fichiers de traduction séparés (.po/.mo) et permet d'isoler les chaînes du code.



Exemple d'utilisation de base :



#include <iostream>#include <libintl.h>#include <locale.h>

#define _(str) gettext(str)

int main() { setlocale(LC_ALL, ""); bindtextdomain("myapp", "./locale"); textdomain("myapp");

std::cout << _("Hello, world!") << std::endl; std::cout << _("File not found") << std::endl; return 0;}


Pour extraire les chaînes, on utilise l'utilitaire xgettext, qui scanne le code source et crée un fichier .pot. Ensuite, les traducteurs travaillent avec les fichiers .po.



Avantages :

  • Simplicité d'intégration ;
  • Grande communauté et nombreux outils (Poedit, Lokalize) ;
  • Prise en charge de la pluralisation via ngettext() ;
  • Fonctionne sur n'importe quelle plateforme.


Inconvénients :

  • Ne prend pas en charge les traductions contextuelles sans astuces supplémentaires ;
  • Nécessite une étape de compilation séparée pour générer les fichiers .mo.


2. Boost.Locale — approche C++ moderne



La bibliothèque Boost.Locale fournit une interface plus moderne et type-safe. Elle est construite au-dessus d'ICU (International Components for Unicode) ou des locales système.



Exemple de travail avec les traductions :



#include <boost/locale.hpp>#include <iostream>

int main() { using namespace boost::locale; generator gen; std::locale loc = gen("ru_RU.UTF-8"); std::locale::global(loc); // Création du traducteur translator tr; std::cout << tr("Hello, world!") << std::endl; std::cout << tr("Today is {1}", "Monday") << std::endl; // Pluralisation std::cout << tr("You have {1} message", "You have {1} messages", 5) << std::endl; return 0;}


Avantages :

  • Prise en charge native de l'UTF-8 ;
  • Formatage des dates, nombres et devises ;
  • Prise en charge des traductions contextuelles ;
  • Fonctionne avec std::string et std::wstring.


Inconvénients :

  • Dépendance à Boost (bibliothèque lourde) ;
  • Moins d'outils pour les traducteurs.


3. ICU — standard industriel



ICU (Intern

Recommendations