Internationalisierung von C++-Anwendungen: Software auf Weltklasse-Niveau entwickeln

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

Warum Ihr C++-Code in allen Sprachen der Welt sprechen sollte?

\n\n

Stellen Sie sich vor: Sie haben einen perfekten Parser oder einen Hochleistungsserver in C++ geschrieben. Er fliegt, frisst ein Minimum an Speicher, gibt aber Meldungen nur auf Russisch aus. Und morgen kauft Ihr Produkt ein japanischer Konzern. Was tun? Die gesamte Ausgabe umschreiben? Hunderte von if (lang == "jp") einfügen? Das ist der Weg in die Hölle.

\n\n

Lernen Sie die Internationalisierung von C++ (oder einfach i18n C++ — vom Wort "internationalization", wo zwischen i und n 18 Buchstaben stehen) kennen. Das ist nicht nur "Übersetzung von Knöpfen", sondern eine ganze Design-Philosophie, die es Ihrer Anwendung ermöglicht, korrekt mit jeder Sprache, Kultur und Zeichenkodierung zu arbeiten. Ohne Internationalisierung ist ein C++-Projekt auf eine lokale Nische beschränkt. Mit ihr treten Sie in den globalen Markt ein.

\n\n

In diesem Artikel werden wir untersuchen, wie man die Lokalisierung von C++ mit Standardmitteln und leistungsstarken Bibliotheken zähmt. Kein Blabla – nur funktionierender Code und reale Anwendungsfälle.

\n\n

Die drei Säulen der Internationalisierung: Locale, Encoding und Messages

\n\n

Bevor wir Code schreiben, lassen Sie uns verstehen, woraus die Internationalisierung von C++ in der Praxis besteht. Sie müssen drei Aufgaben lösen:

\n\n
    \n
  • Locale (Gebietsschema): Wie Daten, Zahlen und Währungen formatiert werden. In den USA schreibt man 03/15/2024, in Deutschland 15.03.2024.
  • \n
  • Encoding (Zeichenkodierung): Wie man mit Unicode arbeitet. Kyrillisch, Hieroglyphen, arabische Schrift – all dies muss ohne Zeichensalat gespeichert und ausgegeben werden.
  • \n
  • Messages (Nachrichten): Wie übersetzte Zeichenketten gespeichert und eingesetzt werden. "File not found" auf Deutsch – "Datei nicht gefunden".
  • \n
\n\n

Das Ignorieren auch nur eines Punktes verwandelt Ihre Anwendung in einen Kürbis. Los geht's der Reihe nach.

\n\n

Grundstufe: Standard-Locale und std::locale

\n\n

Die C++-Standardbibliothek stellt die Klasse std::locale bereit. Dies ist Ihr erstes Werkzeug für die Internationalisierung von C++. Sie kann Dezimaltrennzeichen und das Datumsausgabeformat ändern.

\n\n

Beispiel: Formatierung von Zahlen und Daten

\n\n
#include <iostream>\n#include <locale>\n#include <ctime>\n#include <iomanip>\n\nvoid print_date(double value) {\n    std::cout.imbue(std::locale("en_US.UTF-8"));\n    std::cout << "EN: " << value << std::endl;\n\n    std::cout.imbue(std::locale("de_DE.UTF-8"));\n    std::cout << "DE: " << value << std::endl;\n\n    std::cout.imbue(std::locale("ru_RU.UTF-8"));\n    std::cout << "RU: " << value << std::endl;\n}\n\nint main() {\n    double pi = 3.14159;\n    print_date(pi);\n\n    // Arbeit mit Daten\n    std::time_t t = std::time(nullptr);\n    std::tm* tm = std::localtime(&t);\n\n    std::cout.imbue(std::locale("en_US.UTF-8"));\n    std::cout << "EN date: " << std::put_time(tm, "%x") << std::endl;\n\n    std::cout.imbue(std::locale("ru_RU.UTF-8"));\n    std::cout << "RU date: " << std::put_time(tm, "%x") << std::endl;\n\n    return 0;\n}
\n\n

Wichtig: Die Namen der Locales (z. B. "ru_RU.UTF-8") hängen vom Betriebssystem ab. Unter Windows können sie "Russian_Russia.1251" heißen. Das ist der erste Schmerz. Die Standard-Lokalisierung von C++ über std::locale ist gut für einfache Aufgaben, aber für ernsthafte Projekte ist es besser, spezialisierte Bibliotheken zu verwenden.

\n\n

Fortgeschrittene Stufe: Boost.Locale – der beste Freund des Internationalisierers

\n\n

Wenn Sie in C++ schreiben und Internationalisierung von C++ richtig machen wollen – installieren Sie Boost.Locale. Diese Bibliothek löst alle drei Probleme: Sie kann mit Unicode arbeiten, alles formatieren und übersetzte Zeichenketten aus .po- und .mo-Dateien (GNU gettext-Format) extrahieren.

\n\n

Installation und Einbindung

\n

Boost.Locale ist Teil von Boost. Binden Sie es in Ihre CMakeLi

Blogs

Buchempfehlungen