Auf dieser Seite

Beispiel für eine lokalisierte Uhr

Das Beispiel veranschaulicht bewährte Vorgehensweisen für die Nutzung der Übersetzungs- und Lokalisierungsfunktionen von Qt in CMake und „ Qt Quick “, einschließlich der Behandlung von Pluralformen in verschiedenen Sprachen sowie lokalisierter Zeit- und Datumsformate.

Weitere Informationen zur Übersetzung von Qt-Anwendungen finden Sie im Handbuch zu „Qt Linguist “.

Benutzeroberfläche

Das Beispiel zeigt die aktuelle Uhrzeit und das aktuelle Datum in der Ländereinstellung und Sprache Ihres Systems an. Die Texte in der Benutzeroberfläche sind darüber hinaus 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 eingestellt ist, wird auf Englisch zurückgegriffen.

Um verschiedene Sprachen und Ländereinstellungen zu testen, ohne Ihr System zu verändern, akzeptiert das Beispiel auch eine Ländereinstellung als Befehlszeilenargument. Wenn Sie beispielsweise „localizedClock“ über die Befehlszeile mit der Option „ --locale de “ starten, wird die Uhr auf Deutsch angezeigt, wobei das Datums- und Zeitformat dem in Deutschland üblichen entspricht.

Der Screenshot zeigt die en_US-Version:

Screenshot einer Digitaluhr auf Englisch (US)

Internationalisierung

In der Anwendung wird die Übersetzung verwendet, um den Titel des Hauptfensters und einige UI-Texte festzulegen, darunter auch solche mit Platzhaltern und Pluralformen. Die Anwendung zählt die Sekunden bei aktivierten Pluralformen (siehe „Umgang mit Pluralformen“). Daher gibt die Übersetzungsfunktion je nach Anzahl der Sekunden eine unterschiedliche Übersetzung zurück, wobei die grammatikalisch korrekte Zahl für die Zielsprache verwendet wird. Im Englischen wird beispielsweise die Pluralform verwendet, wenn die Anzahl größer als eins ist, andernfalls die Singularform. Unter „Übersetzungsregeln für Pluralformen“ finden Sie die Pluralregeln für verschiedene Sprachen.

Die Ländereinstellung beeinflusst auch die Darstellung von Datums- und Zeitangaben. Diese werden gemäß den länderspezifischen Konventionen der aktuellen Ländereinstellung formatiert. Bei einer deutschen Ländereinstellung wird beispielsweise die 24-Stunden-Zeitangabe verwendet und der Tag vor dem Monat geschrieben, während bei einer US-amerikanischen Ländereinstellung die 12-Stunden-Zeitangabe verwendet wird und der Monat vor dem Tag steht.

Dieser Screenshot zeigt die en_GB-Version. Beachten Sie, dass sich das Datumsformat von der oben gezeigten en_US-Version unterscheidet, obwohl in beiden Fällen dieselbe englische Pluralübersetzung geladen ist.

Screenshot einer Digitaluhr auf Englisch (Großbritannien)

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

Screenshot einer digitalen Uhr auf Deutsch

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 Abschnitte:

find_package(Qt6 REQUIRED COMPONENTS Core Linguist Qml Quick): Sucht und verknüpft die erforderlichen Qt-6-Module, darunter „ Linguist “, die für die Internationalisierung unerlässlich sind.

qt_standard_project_setup(...): Richtet das Internationalisierungssystem mit Unterstützung für die aufgeführten 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 die Übersetzungsquelldateien (TS-Dateien) im Verzeichnis „i18n“ unter Verwendung von clock als Basisnamen generiert und, sofern sie Übersetzungen enthalten, zu Binär .qm -Dateien kompiliert werden. Die folgenden TS-Dateien werden generiert:

  • „clock_{de, ar, ko, zh, ja, fr, it, es, pt}.ts“: Je eine TS-Datei pro Sprache, die unter I18N_TRANSLATED_LANGUAGES auf qt_standard_project_setup aufgeführt ist und die Übersetzungen in diese Sprache enthält.
  • „clock_en.ts“: Enthält englische Pluralformen, da der Quellcode eine Übersetzung der Pluralform enthält („%n second(s)“). Die Funktion qt_add_translations schreibt hier nur die Pluralformen, da wir die Sprache der Texte im Quellcode als Englisch festgelegt haben, indem wir I18N_SOURCE_LANGUAGE auf dem Standardwert belassen haben. Daher benötigen die regulären Texte keine Übersetzungen.
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 Einstiegspunkt der Anwendung. Dieser Teil ist für die Einstellung der Ländereinstellung, die Installation der erforderlichen Übersetzungen und das Laden der Benutzeroberfläche zuständig. Nachfolgend finden Sie eine Erläuterung der relevanten Codeabschnitte:

Definieren Sie das Argument „locale“, 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);

Die Argumente analysieren, die angegebene Locale abrufen und die Eingabe-Locale als Standard-Locale der Anwendung festlegen:

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

Installieren Sie die englische Übersetzung unabhängig von der Ländereinstellung, um unvollständige Übersetzungen für andere Sprachen zu ermöglichen. QTranslator fragt Übersetzungen für Texte in umgekehrter Reihenfolge ab, in der die Übersetzungen installiert sind:

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

Installiert eine Übersetzung entsprechend der angegebenen Locale. Da im vorherigen Schritt bereits eine englische Übersetzung installiert wurde, könnten hier möglicherweise zwei Übersetzungen installiert sein. Qt verwendet bei sich überschneidenden Schlüsseln die zuletzt installierte Übersetzung. Daher hat die localespezifische Übersetzung Vorrang vor der englischen, und falls Übersetzungen fehlen, greift „ QTranslator “ auf die englische Version zurück.

    QTranslator translation;
    if (QLocale().language() != QLocale::English) {
        if (translation.load(QLocale(),  „clock“_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 Hauptfenster der Benutzeroberfläche der Anwendung, in dem Uhrzeit, Datum, die verwendete Ländereinstellung und ein Sekundenzähler angezeigt werden. Im Folgenden werden die relevanten Codeabschnitte erläutert:

Der Titel des Fensters wird mithilfe von `qsTr()` für die Übersetzung festgelegt. Um die Übersetzung für diesen Text zu finden, fragt ` QTranslator ` in der TS-Datei der aktuellen Sprache nach dem Text „Digital Clock“ im Kontext „Main“ (dem Dateinamen):

title: qsTr("Digital Clock")

Zeige die Anzahl der Sekunden mithilfe von `qsTr()` mit Unterstützung für Pluralformen (Zahlen) an. Die Pluralform wird durch die spezielle Notation „%n“ aktiviert (siehe „Umgang mit Pluralformen“). Je nach Wert von n gibt die Übersetzungsfunktion eine unterschiedliche Übersetzung zurück, mit der grammatikalisch korrekten Zahl für die Zielsprache. Im Englischen wird beispielsweise die Pluralform verwendet, wenn der Wert von ` root.seconds ` größer als eins ist; andernfalls 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 die aktuelle Locale an und verwenden Sie qsTr(), um den Quelltext „Locale: %1“ zu übersetzen. Auch die Übersetzung muss die Argumentnotation „%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 Uhrzeit und Datum gemäß den Konventionen der Locale. Verschiedene Länder können spezifische Vorlieben hinsichtlich der Darstellung von Uhrzeit und Datum haben. Beispielsweise verwendet die deutsche Locale das 24-Stunden-Format und schreibt den Tag vor dem Monat, während die US-amerikanische Locale das 12-Stunden-Format verwendet und den Monat vor dem Tag platziert. Die Methode `Date.toLocaleTimeString` berücksichtigt diese Aspekte und formatiert Uhrzeit und Datum entsprechend der angegebenen Locale 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

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