Warum Ihr C++-Code in allen Sprachen der Welt sprechen sollte?
\n\nStellen 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.
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\nIn 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\nDie drei Säulen der Internationalisierung: Locale, Encoding und Messages
\n\nBevor 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
Das Ignorieren auch nur eines Punktes verwandelt Ihre Anwendung in einen Kürbis. Los geht's der Reihe nach.
\n\nGrundstufe: Standard-Locale und std::locale
\n\nDie 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.
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\nWichtig: 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.
Fortgeschrittene Stufe: Boost.Locale – der beste Freund des Internationalisierers
\n\nWenn 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\nInstallation und Einbindung
\nBoost.Locale ist Teil von Boost. Binden Sie es in Ihre CMakeLi