Internationalisierung (i18n) in C++: Von den Grundlagen bis zu fortgeschrittenen Techniken
\n\nInternationalisierung (abgekürzt i18n – von „internationalization“, wobei 18 die Anzahl der Buchstaben zwischen dem ersten und letzten ist) ist der Prozess der Softwareentwicklung, bei dem die Software so gestaltet wird, dass sie ohne Änderungen am Quellcode leicht an verschiedene Sprachen und Regionen angepasst werden kann. Für die Sprache C++, die traditionell in leistungsstarken und plattformübergreifenden Anwendungen verwendet wird, ist die korrekte Implementierung von i18n von entscheidender Bedeutung. In diesem Artikel betrachten wir die wichtigsten Ansätze, Bibliotheken und praktischen Beispiele zur Lokalisierung von C++-Anwendungen.
\n\nGrundlegende Konzepte von i18n
\n\nBevor wir zu den Werkzeugen übergehen, ist es wichtig, die Schlüsselbegriffe zu verstehen:
\n\n- \n
- Lokalisierung (l10n) — Anpassung von übersetztem Text, Datums-, Zahlen- und Währungsformaten für eine bestimmte Region. \n
- Locale — Eine Reihe von Regeln (Sprache, Region, Kodierung), die die Formatierung von Daten bestimmen. \n
- Unicode und UTF-8 — Zeichenkodierungsstandard, der für die moderne Internationalisierung obligatorisch ist. \n
- Pluralisierung — Korrekte Darstellung von Pluralformen (z. B. „1 Datei“, „2 Dateien“, „10 Dateien“). \n
Die GNU gettext-Bibliothek für C++
\n\nGNU gettext ist das beliebteste Werkzeug zur Internationalisierung in der Unix/Linux-Welt, das auch hervorragend mit C++ funktioniert. Es bietet eine minimalistische API und leistungsstarke Dienstprogramme zum Extrahieren und Verwalten von Übersetzungen.
\n\nInstallation und Einrichtung
\n\nUm gettext in einem C++-Projekt zu verwenden, muss das Paket libintl installiert und die Header-Datei eingebunden werden:
#include <libintl.h>\n#include <locale.h>\n\n#define _(STRING) gettext(STRING)\n\nBeispiel für die grundlegende Verwendung
\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\nErstellen von Übersetzungsdateien
\n\nDer Prozess umfasst drei Schritte:
\n\n- \n
- Zeichenketten extrahieren:
xgettext --keyword=_ main.cpp -o messages.po\n - .po-Datei bearbeiten — Übersetzungen manuell oder mit Poedit hinzufügen. \n
- In .mo kompilieren:
msgfmt messages.po -o locale/ru/LC_MESSAGES/myapp.mo\n
Unterstützung für Pluralisierung
\n\nGettext unterstützt Pluralformen über die Funktion ngettext:
int count = 5;\nprintf(ngettext("%d file deleted", "%d files deleted", count), count);\n\nDie ICU-Bibliothek (International Components for Unicode)
\n\nICU ist eine leistungsstarke Bibliothek von IBM, die eine vollständige Palette von Werkzeugen zur Internationalisierung bietet: Unicode-Unterstützung, gebietsschemaabhängige Sortierung, Formatierung von Zahlen, Daten, Währungen, Arbeit mit Zeitzonen und vieles mehr. Für C++ wird die C++-API aus dem Paket icu4c verwendet.
Installation von ICU
\n\nAuf Ubuntu/Debian: sudo apt install libicu-dev
\nAuf macOS: brew install icu4c
Formatierung von Zahlen und Daten
\n\n#include <unicode/numfmt.h>\n#include <unicode/datefmt.h>\n#include <iostream>\n\nint main() {\n // Formatierung einer Zahl für das Gebietsschema 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 << "Zahl: " << utf8 << std::endl; // 1 Auch in der Bibliothek
clinic.js — Überwachung von TypeScript-Anwendungen
HTML-Parsing in Node.js: Top-Bibliotheken und Codebeispiele
WebSocket-Bibliotheken für TypeScript: ws und Socket.IO – vollständiger Leitfaden
Cheerio für JavaScript (Node.js): Komplettguide mit Beispielen
ts-jest für TypeScript: Vollständige Anleitung mit Beispielen