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
Aussi dans la bibliothèque
Apprentissage automatique en C# (.NET) : aperçu des bibliothèques et outils
Travailler avec Kafka en C# (.NET) : la bibliothèque Confluent.Kafka
Client OAuth pour Go (Golang) : guide complet de la bibliothèque
Bibliothèque WebSocket Kotlin : ktor-client-websockets pour le temps réel