Beispiel für eine lokalisierte Uhr

Das Beispiel zeigt Best Practices für die Verwendung der Übersetzungs- und Lokalisierungsfunktionen von Qt in CMake und Qt Quick, einschließlich der Behandlung von Pluralformen in verschiedenen Sprachen und lokalisierten Zeit- und Datumsformaten.

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 dem Gebietsschema und der Sprache Ihres Systems an. Die Texte in der Benutzeroberfläche sind außerdem für die folgenden Sprachen lokalisiert: Englisch, Deutsch, Französisch, Spanisch, Italienisch, Japanisch, Koreanisch, Portugiesisch, Arabisch und Chinesisch. Wenn Ihr Desktop in einer anderen Sprache ist, wird er auf Englisch zurückgesetzt.

Um verschiedene Sprachen und Gebietsschemata zu testen, ohne Ihr System zu verändern, akzeptiert das Beispiel auch ein Gebietsschema als Kommandozeilenargument. Wenn Sie localizedClock zum Beispiel von der Kommandozeile aus mit der Option --locale de starten, wird die Uhr in Deutsch angezeigt, mit einem Datums- und Zeitformat, wie es in Deutschland üblich ist.

Der Screenshot zeigt die Version en_US:

Internationalisierung

In der Anwendung wird die Übersetzung verwendet, um den Titel des Hauptfensters und einige Texte der Benutzeroberfläche zu setzen, darunter solche mit Platzhaltern und Pluralformen. Die Anwendung zählt die Sekunden mit aktivierten Pluralformen (siehe Handhabung von Pluralformen). Abhängig von der Anzahl der Sekunden gibt die Übersetzungsfunktion eine andere Übersetzung mit der korrekten grammatikalischen Zahl für die Zielsprache zurück. Im Englischen beispielsweise wird die Pluralform verwendet, wenn die Anzahl größer als eins ist, andernfalls wird die Singularform verwendet. Unter Übersetzungsregeln für Pluralformen finden Sie die Pluralregeln für verschiedene Sprachen.

Das Gebietsschema wirkt sich auch auf die Anzeige von Daten und Zeiten aus. Diese werden entsprechend den Länderkonventionen des aktuellen Gebietsschemas formatiert. In einem deutschen Gebietsschema werden beispielsweise 24 Stunden angezeigt und der Tag vor dem Monat geschrieben, während in einem US-amerikanischen Gebietsschema eine 12-Stunden-Uhr verwendet und der Monat vor dem Tag geschrieben wird.

Dieser Screenshot zeigt die Version en_GB. Beachten Sie, dass sich das Datenformat von der obigen en_US-Version unterscheidet, während in beiden Fällen die gleiche englische Pluralübersetzung geladen wird.

Hier ist der Screenshot der de_DE-Version, die ähnlich wie GB ein anderes Datumsformat als US hat. Beachten Sie, dass die deutsche Übersetzung für reguläre und Pluralformen entsprechend geladen wird.

Implementierung

Die Implementierung besteht aus drei Teilen:

CMakeLists.txt

Die CMake-Datei der Anwendung aktiviert die Übersetzungs- und Lokalisierungsunterstützung von Qt. Hier sind die relevanten Teile:

find_package(Qt6 REQUIRED COMPONENTS Core Linguist Qml Quick): Findet und verlinkt die erforderlichen Qt 6 Module, einschließlich Linguist, die für die Internationalisierung unerlässlich sind.

qt_standard_project_setup(...): Richtet das Internationalisierungssystem mit Unterstützung für die aufgelisteten Sprachumgebungen ein. I18N_SOURCE_LANGUAGE wird auf seinem Standardwert (Englisch) belassen, da der Quellcode englische Texte enthält.

qt_standard_project_setup(REQUIRES 6.8
    I18N_TRANSLATED_LANGUAGES de ar ko zh ja fr it es pt)

qt_add_translations(...): Bündelt die Funktionalität von lupdate und lrelease, indem es die Übersetzungsquelldateien (TS-Dateien) im "i18n"-Verzeichnis unter Verwendung von clock als Basisnamen erzeugt und sie zu binären .qm -Dateien kompiliert, wenn sie Übersetzungen enthalten. Die folgenden TS-Dateien werden erzeugt:

  • "clock_{de, ar, ko, zh, ja, fr, it, es, pt}.ts": Eine TS-Datei pro Sprache, die in I18N_TRANSLATED_LANGUAGES von qt_standard_project_setup aufgelistet ist und die Übersetzungen für diese Sprache enthält.
  • "clock_en.ts": Enthält englische Pluralformen, da der Quellcode eine Pluralformübersetzung ("%n second(s)") hat. Die Funktion qt_add_translations schreibt hier nur die Pluralformen, da wir die Sprache der Texte im Quellcode als Englisch angegeben haben, indem wir I18N_SOURCE_LANGUAGE mit dem Standardwert belassen haben. Die regulären Texte müssen also nicht übersetzt werden.
qt_add_translations(localizedClock
    TS_FILE_BASE i18n/clock
    RESOURCE_PREFIX i18n
)

qt_add_qml_module(...): Fügt ein QML-Modul unter der URI qtexamples.localizedclock hinzu, einschließlich der Datei Main.qml.

qt_add_qml_module(localizedClock
    URI qtexamples.localizedclock
    VERSION 1.0
    QML_FILES
        Main.qml
)
main.cpp

Der Startpunkt der Anwendung. Dieser Teil ist für die Einstellung des Gebietsschemas, die Installation der erforderlichen Übersetzungen und das Laden der Benutzeroberfläche verantwortlich. Nachfolgend finden Sie eine Erläuterung der relevanten Codeteile:

Definieren Sie das Gebietsschema-Argument, z. B. --locale en_US oder --locale de_DE:

    QCommandLineParser parser;
    QCommandLineOption localeOption("locale"_L1, "Locale to be used in the user interface"_L1,
                                    "locale"_L1);
    parser.addOption(localeOption);
    parser.addHelpOption();
    parser.process(app);

Analysieren Sie die Argumente, holen Sie das angegebene Gebietsschema und setzen Sie das eingegebene Gebietsschema als Standardgebietsschema der Anwendung:

        QLocale locale(parser.value(localeOption));        qInfo() << "Setting locale to" << locale.name();
        QLocale::setDefault(Gebietsschema);

Installiert die englische Übersetzung unabhängig vom Gebietsschema, um unvollständige Übersetzungen für andere Sprachen zu ermöglichen. QTranslator fragt Übersetzungen für Texte in der umgekehrten Reihenfolge ab, in der die Übersetzungen installiert werden:

    QTranslator enPlurals; const auto enPluralsPath = ":/i18n/clock_en.qm"_L1; if (!enPlurals.load(enPluralsPath))        qFatal("Could not load %s!", qUtf8Printable(enPluralsPath));
    app.installTranslator(&enPlurals);

Installieren Sie eine Übersetzung für das angegebene Gebietsschema. Da die englische Übersetzung bereits im vorherigen Schritt installiert wurde, kann es sein, dass wir hier zwei installierte Übersetzungen haben. Qt verwendet die zuletzt installierte Übersetzung für alle sich überschneidenden Schlüssel. Daher hat die lokal-spezifische Übersetzung Vorrang vor der englischen, und im Falle von fehlenden Übersetzungen greift QTranslator auf die englische zurück.

    QTranslator translation; if (QLocale().language() != QLocale::Englisch) { if (translation.load(QLocale(), "Uhr"_L1, "_"_L1, ":/i18n/"_L1)) {            qInfo("Loading translation %s",
                  qUtf8Printable(QDir::toNativeSeparators(translation.filePath()))); if (!app.installTranslator(&translation))                qWarning("Could not install %s!",
                         qUtf8Printable(QDir::toNativeSeparators(translation.filePath()))); } else {            qInfo("Could not load translation to %s. Using English.",
                  qUtf8Printable(QLocale().name())); } }
Main.qml

Diese QML-Datei definiert das Haupt-UI-Fenster der Anwendung, in dem Uhrzeit, Datum, das verwendete Gebietsschema und ein Sekundenzähler angezeigt werden. Nachfolgend finden Sie eine Erläuterung der relevanten Codeteile:

Setzen Sie den Titel des Fensters mit qsTr() für die Übersetzung. Um die Übersetzung für diesen Text zu finden, fragt QTranslator in der TS-Datei der aktuellen Sprache den Text "Digital Clock" im Kontext "Main" (dem Dateinamen) ab:

title: qsTr("Digital Clock")

Zeigen Sie die Anzahl der Sekunden mit qsTr() mit Unterstützung der Pluralform (Ziffern) an. Die Pluralform wird durch die Verwendung der speziellen Notation "%n" aktiviert (siehe Umgang mit Pluralformen). Je nach dem Wert von n gibt die Übersetzungsfunktion eine andere Übersetzung mit der korrekten grammatikalischen Zahl für die Zielsprache zurück. Im Englischen beispielsweise wird die Pluralform verwendet, wenn der Wert von root.seconds größer als eins ist, ansonsten wird die Singularform verwendet. Unter Übersetzungsregeln für Pluralformen finden Sie die Pluralregeln für verschiedene Sprachen.

text: qsTr("%n second(s)", "seconds", root.seconds)

Zeigen Sie das aktuelle Gebietsschema an und verwenden Sie qsTr(), um den Quelltext "Gebietsschema: %1" zu übersetzen. Auch die Übersetzung muss die Argument-Notation "%1" enthalten. Dadurch kann das Argument des Textes (d. h. Qt.locale().name) korrekt zur Formatierung des Textes verwendet werden:

text: qsTr("Locale: %1").arg(Qt.locale().name)

Formatieren Sie die Uhrzeit und das Datum entsprechend den Gebietsschema-Konventionen. Verschiedene Länder haben möglicherweise spezifische Präferenzen, wie Zeit und Datum dargestellt werden sollen. Das deutsche Gebietsschema verwendet z. B. eine 24-Stunden-Uhr und schreibt den Tag vor den Monat, während das US-amerikanische Gebietsschema eine 12-Stunden-Uhr verwendet und den Monat vor den Tag stellt. Die Methode Date.toLocaleTimeString berücksichtigt diese Überlegungen und formatiert die Uhrzeit und das Datum auf der Grundlage des angegebenen Gebietsschemas korrekt:

            const now = new Date();
            const locale = Qt.locale();
            root.time = now.toLocaleTimeString(locale, Locale.ShortFormat);
            root.date = now.toLocaleDateString(locale);

Beispielprojekt @ code.qt.io

© 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.