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
Auch in der Bibliothek
Überwachung von Go-Anwendungen: Bibliotheken und Tools
Arbeit mit S3 und Cloud-Speichern in JavaScript (Node.js) — die Bibliothek @aws-sdk/client-s3
Beste Logging-Bibliotheken für Go (Golang): Überblick und Vergleich
ent für Go: Vollständiges Tutorial mit Codebeispielen