Lokalisierte Uhr mit Laufzeit-Sprachumschaltung
Das Beispiel demonstriert Best Practices für die Verwendung der Übersetzungs- und Lokalisierungsfunktionen von Qt in CMake und Qt Quickzu nutzen, insbesondere um die Sprache einer Anwendung während der Laufzeit zu ändern. Es erweitert das einfachere Localized Clock Example.
Weitere Informationen zum Übersetzen von Qt-Anwendungen finden Sie im Qt Linguist Handbuch.
Benutzeroberfläche
Das Beispiel zeigt die aktuelle Uhrzeit und das Datum in der Sprache und dem Gebietsschema Ihres Systems an. Die UI-Texte sind auch für die folgenden Sprachen lokalisiert: Englisch, Deutsch, Französisch, Spanisch, Italienisch, Japanisch, Koreanisch, Portugiesisch, Arabisch und Chinesisch. Über eine Menütaste können die Benutzer auch verschiedene Sprachen und Gebietsschemata auswählen.
Die englische Version der Anwendung:
Die deutsche Version nach Umstellung der Sprache zur Laufzeit:
Implementierung
Die Anwendung besteht aus vier Teilen:
CMakeLists.txt
Die CMake-Integration ist identisch mit der CMake-Integration des Beispiels Localized Clock. Bitte lesen Sie diese Seite für weitere Details.
main.cpp
Der Startpunkt der Anwendung, verantwortlich für das Laden des QML-Moduls.
int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; QObject::connect( &engine, &QQmlApplicationEngine::objectCreationFailed, &app, [](const QUrl &) { QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.loadFromModule("qtexamples.localizedclockswitchlocale", "Main"); return app.exec(); }
Übersetzer-Manager (translator.h, translator.cpp)
TranslatorManager
ist eine QML-Singleton-Klasse, die die Sprach- und Gebietsschema-Umschaltung zur Laufzeit verwaltet. Die zentrale Methode der Klasse ist TranslatorManager::switchLanguage()
, die einen String akzeptiert, der einen Sprachcode darstellt.
Während die Methode mit Q_INVOKABLE gekennzeichnet ist, ist die TranslatorManager-Klasse mit QML_ELEMENT und QML_SINGLETON deklariert. Dadurch kann die Methode direkt von QML aus aufgerufen werden; siehe auch Main.qml.
void TranslatorManager::switchLanguage(const QString &lang) { QLocale locale(lang); QLocale::setDefault(locale); qApp->removeTranslator(&m_translator); // nicht notwendig ab Qt 6.10 if (m_translator.load(locale, "clock"_L1, "_"_L1, ":/i18n/"_L1) && qApp->installTranslator(&m_translator)) { m_engine.retranslate(); } else { qWarning("Could not load translation to %s!", qPrintable(locale.name())); } }
Aktualisieren von Übersetzungen zur Laufzeit
Beim Sprachwechsel wird die vorherige Übersetzung entfernt (QCoreApplication::removeTranslator()) und eine neue Übersetzung für die ausgewählte Sprache geladen (QTranslator::load()) und installiert (QCoreApplication::installTranslator()). QQmlEngine::retranslate() löst dann die Neuübersetzung der Zeichenketten im QML-Dokument aus.
Aktualisieren von Datums- und Zeitformaten
Eine Änderung der Sprache kann sich auch auf die Anzeige von Datum und Uhrzeit auswirken. Zum Beispiel, wenn QLocale auf Ihrem System das Gebietsschema "en_US" für "en" und "de_DE" für "de" bevorzugt:
- Die Anwendung wird zunächst mit "US" als Ländercode geladen.
- Aufgrund der US-amerikanischen Gebietsschema-Konventionen wird das Datum im Format MM/TT/JJJJ dargestellt, und die Uhrzeit verwendet eine 12-Stunden-Uhr.
- Nachdem die Sprache auf Deutsch umgestellt wurde, ist "de_DE" das erste bevorzugte Gebietsschema für die deutsche Sprache, so dass das Land auf Deutschland umgestellt wird.
- Die deutschen Konventionen bringen das Datum im Format TT.MM.JJJJ und verwenden eine 24-Stunden-Uhr.
Beim Umschalten der Sprache aktualisiert die Anwendung ihre QLocale entsprechend der gewählten Sprache mit QLocale::setDefault(). Bei der Darstellung der Zeit kümmert sich die Funktion Date.toLocaleTimeString() um die Lokalisierung der Uhrzeit und des Datums entsprechend dem Gebietsschema der Anwendung (siehe Main.qml).
Main.qml
Die Haupt-QML-Datei definiert die Benutzeroberfläche der Anwendung. Die Benutzeroberfläche zeigt Zeit, Datum und einen Sekundenzähler an. Für die grundlegende Übersetzung (Fenstertitel) und die Behandlung des Plurals (Anzahl der Sekunden) siehe das Beispiel für die lokalisierte Uhr.
Bei der Auswahl eines Elements auf Menu
wird TranslatorManager.switchLanguage()
mit dem entsprechenden Sprachcode aufgerufen. Dieser Aufruf kümmert sich auch um die Neuübersetzung der übersetzbaren Texte (siehe Translator Manager). Wir müssen jedoch noch updateClock()
aufrufen, um die Zeitdarstellung im neuen Lokalisierungsformat zu aktualisieren, wenn die Sprache geändert wird.
ListModel { id: languageModel ListElement { name: "English"; code: "en" } ListElement { name: "Deutsch"; code: "de" } ListElement { name: "العربية"; code: "ar" } ListElement { name: "한국어"; code: "ko" } ListElement { name: "中文"; code: "zh" } ListElement { name: "日本語"; code: "ja" } ListElement { name: "Français"; code: "fr" } ListElement { name: "Italiano"; code: "it" } ListElement { name: "Español"; code: "es" } ListElement { name: "Português"; code: "pt" } } Menu { id: languageMenu width: languageButton.width Repeater { model: languageModel delegate: MenuItem { required property string name required property string code text: name onTriggered: { TranslatorManager.switchLanguage(code) root.selectedLanguage = name root.updateClock() } } } }
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.