Internationalisierung (i18n) in C++: Vollständiger Leitfaden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Internationalisierung (i18n) in C++: Von den Grundlagen zu fortgeschrittenen Techniken



Internationalisierung (abgekürzt i18n – vom englischen "internationalization", wobei 18 die Anzahl der Buchstaben zwischen dem ersten 'i' und dem letzten 'n' angibt) ist der Prozess des Entwurfs von Software, sodass sie an verschiedene Sprachen und regionale Besonderheiten angepasst werden kann, ohne den Code zu ändern. In C++ hat diese Aufgabe ihre Besonderheiten: Die Sprache bietet keine eingebauten Mittel für die Arbeit mit Übersetzungen, aber es gibt mehrere leistungsstarke Bibliotheken, die dieses Problem lösen.



Warum ist i18n für C++-Projekte wichtig?



Moderne C++-Anwendungen beschränken sich selten auf eine Sprache. Desktop-Programme, Spiele, Serverlösungen – sie alle benötigen Unterstützung für mehrere Locales. Die Hauptprobleme, die i18n löst:



  • Arbeit mit Kodierungen – der Übergang von ASCII zu UTF-8, UTF-16 und anderen Multibyte-Kodierungen;
  • Formatierung von Zahlen, Daten und Währungen – in verschiedenen Ländern werden unterschiedliche Trennzeichen und Formate verwendet;
  • Wortstellung in Sätzen – die russische Sprache erfordert Deklinationen, die englische Artikel;
  • Pluralbildung – die Regeln für die Pluralbildung unterscheiden sich (im Russischen gibt es 3 Formen, im Englischen 2).


Wichtige Bibliotheken für i18n in C++



1. GNU gettext – der Klassiker



GNU gettext ist die beliebteste Bibliothek für Internationalisierung in C und C++. Sie verwendet separate Übersetzungsdateien (.po/.mo) und ermöglicht es, Zeichenfolgen vom Code zu isolieren.



Basisbeispiel zur Verwendung:



#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;}


Zum Extrahieren von Zeichenfolgen wird das Dienstprogramm xgettext verwendet, das den Quellcode scannt und eine .pot-Datei erstellt. Anschließend arbeiten die Übersetzer mit .po-Dateien.



Vorteile:

  • Einfache Integration;
  • Große Community und viele Werkzeuge (Poedit, Lokalize);
  • Unterstützung für Pluralbildung über ngettext();
  • Funktioniert auf jeder Plattform.


Nachteile:

  • Unterstützt keine kontextbezogenen Übersetzungen ohne zusätzliche Tricks;
  • Erfordert einen separaten Build-Schritt zum Generieren von .mo-Dateien.


2. Boost.Locale – moderner C++-Ansatz



Die Bibliothek Boost.Locale bietet eine modernere und typsichere Schnittstelle. Sie basiert auf ICU (International Components for Unicode) oder systemeigenen Locales.



Beispiel für die Arbeit mit Übersetzungen:



#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); // Übersetzer erstellen translator tr; std::cout << tr("Hello, world!") << std::endl; std::cout << tr("Today is {1}", "Monday") << std::endl; // Pluralbildung std::cout << tr("You have {1} message", "You have {1} messages", 5) << std::endl; return 0;}


Vorteile:

  • Native UTF-8-Unterstützung;
  • Formatierung von Daten, Zahlen und Währungen;
  • Unterstützung für kontextbezogene Übersetzungen;
  • Funktioniert mit std::string und std::wstring.


Nachteile:

  • Abhängigkeit von Boost (schwergewichtige Bibliothek);
  • Weniger Werkzeuge für Übersetzer.


3. ICU – Industriestandard



ICU (Intern

Empfehlungen