Qt/QML Sprache zur Laufzeit ändern

Software wird heutzutage meist für den internationalen Gebrauch erstellt. Neben Internationalisierung und Lokalisierung, also dem Auslegen der Software für die Unterstützung mehrerer Sprachen, Kulturen, Gebiete, besteht oftmals auch die Anforderung, die Sprache bzw. besser die Lokalisierung der Applikation zur Laufzeit zu ändern. In diesem Artikel erfahren Sie, wie Sie in Qt/QML die Sprache zur Laufzeit ändern können.

Grundlagen

Internationalisierung und Lokalisierung von Qt/QML Applikationen

Hier die Ultra-Kurzfassung über den Internationalisierungs- und Lokalisierungsworkflow mit dem Qt Framework. Einen umfassenden Artikel zur Internationalisierung und Lokalisierung von Qt/QML Applikationen finden Sie hier.

Um Texte in einer Qt/QML Applikation in mehreren Sprachen anzuzeigen, werden diese im Source Code mit einer Methode gewrapped. In den meisten Fällen wird hierzu die Methode qsTr() verwendet, die als Argument den Text in der Basissprache erwartet.

Text {
    text: qsTr("Order");
}

Anhand dieser Funktion erkennt das im Qt Framework vorhandene Tool lupdate zu übersetzenden Stellen und extrahiert diese in eine Übersetzungsdatei. In diese Übersetzungsdatei (*.ts) fügt der Übersetzer die Zielsprachen ein. Anschließend wird die um die Zielsprachen ergänzte *.ts Datei mit dem Tool lrelease in eine *.qm Datei compiliert. Die *.qm Dateien werden auch als Lokalisierungsdatei bezeichnet. Für jede Zielsprache wird eine separate Datei generiert. Zur Laufzeit liefert die qsTr() Methode dann den Text in der eingestellten Zielsprache zurück. Mehr dazu weiter unten im Artikel.

Einbinden von Übersetzungen

Damit qsTr() den zum eingestellten Gebietsschema (engl. Locale) passenden Text anzeigen kann, greift die Methode auf die QTranslator Klasse zu. QTranslator stellt im Wesentlichen Methoden zum Zugriff auf eine Lokalisierungsdatei (*.qm) zur Verfügung.

QTranslator Objekte werden der Applikation (QCoreApplication) über die installTranslator() Methode bekannt gemacht. Generell können einer Applikation über diesen Weg mehrere Translators übergeben werden, wobei Qt in umgekehrter Intsallationsreiehenfolge nach einer passenden Übersetzung sucht.

Bei jeder Änderung an den installierten Translators wird ein LanguageChange Event generiert.

Dynamische Sprachumschaltung in QML

Vor der Version 5.10

Bis zur Qt Version 5.10 war die Änderung der Sprache zur Laufzeit in QML nur mit einem Workaround möglich. Die Ursache dafür ist, dass die qsTr() Methode nicht auf das LanguageChanged Event der QCoreApplication reagiert hat.

Ein gängiger Workaround für diese Problem sieht folgendermaßen aus.

Text {
   text: qsTr("Hi World!") + context.emptyDummyString
}

Jeder zu internationalisierende Text, hier qsTr(“Hi World!”), wird mit einem globalen QML Property (emptyDummyString im obigen Beispiel) verkettet, das einen leeren String zurück liefert. Das Notify Signal dieses Properties wird dann entweder manuell beim Umschalten der Sprache oder in einem Event Handler auf das LanguageChanged Event der QCoreApplication emittiert. Die Implementierung des “Dummy” Properties erfolgt üblicherweise im C++ Raum und wird als Context Property (context im obigen Beispiel) nach QML exportiert. Durch das Emittieren des Notify Signals des emptyDummyString Properties, wird der komplette Ausdruck des Bindings inklusive des qsTr() Teils neu evaluiert und somit auch neu übersetzt.

Ein Beispiel für die prinzipielle Implementierung dieses Workarounds ist hier zu finden.

Ab der Version 5.10

Ab der Version 5.10 stellt das Qt Framework nun eine bessere Lösung für dieses Problem zur Verfügung. Die Methode QQmlEngine::retranslate(). In der aktuellen Version 5.14, evaluiert diese Methode alle QML Bindings erneut. Dies führt dazu, dass auch alle über die qsTr() Funktion übersetzten Strings aktualisiert werden. Es ist geplant, dass in einer späteren Qt Version nur noch die Bindings mit einem Aufruf von qsTr() neu evaluiert werden. QQmlEngine::retranslate() macht den in Version 5.10 nötigen Workaround somit überflüssig. Der Quelltext verkürzt sich somit zu dem einfachen Ausdruck:

Text {
   text: qsTr("Hi World!")
}

Die C++ Funktion zur Umschaltung der Sprache bzw. allgemein der Lokalisierung (engl. Locale) während der Laufzeit sieht folgendermaßen aus (ohne Error Handling).

void Application::switchLocale(const QString &locale)
{
    if (!mTranslator->isEmpty())
        QCoreApplication::removeTranslator(mTranslator);

    mTranslator->load(QStringLiteral(":/translations/") + locale);
    QCoreApplication::installTranslator(mTranslator);

    mQmlEngine->retranslate();
}

Ist bereits ein Translator installiert, wird dieser deinstalliert. Dann lädt der Translator eine neue Lokalisierungsdatei. Danach wird der Translator installiert. Im letzten Schritt wird mQmlEngine->retranslate() aufgerufen, so dass alle Property Bindings mit qsTr() erneut ausgewertet werden. Dieses neue Feature erhöht die Robustheit des Codes und führt zu einfacherem QML Code.

Hier ist das komplette Beispiel auf Github.


Über den Autor

Dominik Prause

Dominik ist passionierter Designer und Ingenieur und sucht ständig nach besseren Lösungen für die Kunden von Inspirent. Er hat langjährige Erfahrung im Design und der Realisierung von erfolgreichen High Tech Geräten für Industrie, Forschung und Entwicklung.

Das Qt 5.14 Release

Das Qt 5.14 Release ist raus

Noch kurz vor Jahresende hat das Team der Qt Company die Version 5.14 des Qt-Frameworks veröffentlicht. In diesem Beitrag stelle ich kurz die aus meiner Sicht interessantesten Neuigkeiten vor. Ich kann Ihnen schon soviel verraten, es tut sich einiges im Hause Qt. Zeitgleich wurde auch noch die Version 4.11 des Qt Creators released. Eine Zusammenfassung hierzu folgt im Laufe der Woche.

Qt 5.14 wird voraussichtlich die vorletzte 5.x-Version vor dem Major Release auf die Version Qt 6 sein. Nächstes Jahr ist noch eine Version 5.15 geplant, die als LTS-Release (Long-Term Support) vorgesehen ist. Mit der Version 5.14 wird vor allem der Wechsel auf die nächste Hauptversion Qt 6 vorbereitet.

Qt Quick

Zu den wohl wichtigsten Neuerungen in Qt 5.14 gehört eine größere Änderung im 3D Graphics Stack. Das Ziel ist, Qt unabhängig von der vom Betriebssystem bereitgestellten 3D-Grafik API zu machen. Bisher wurde hier auf OpenGL als Basis für das Rendering gesetzt. Zukünftig sollen mehrere betriebssystemspezifische APIs wie zum Beispiel Vulkan, Metal und Direct3D unterstützt werden. Qt 5.14 enthält hierzu eine erste Vorschau eines API-unabhängigen Scene-Graph Renderers, der auf einer neuen Abstraktionsebene namens Qt Rendering Hardware Interface (QRhi) aufsetzt. Somit kann eine Qt Anwendung optional anstatt über OpenGL, auf einer der nativen, vom Betriebssystem bereitgestellten, Grafik-APIs ausgeführt werden. Damit verspricht man sich eine bessere Performanz. Ab Qt 6 soll dann das Rendern über das Qt Rendering Hardware Interface das Standardverfahren sein. Im folgenden Video vom Qt World Summit 2019 werden die wesentlichen Eckpunkte näher beleuchtet.

Diese drei Artikel geben eine detailliertere Einführung in die Thematik:

Eine weitere Neuerung, die wir uns, als Animationsliebhaber, noch genauer anschauen werden, ist das Qt Quick Timeline Modul. Dieses Modul erlaubt die Animation mithilfe von Timelines und Keyframes.

Schließlich gibt es noch die neue WheelHandler Komponente, mit der man Zahlenwerte durch das Mausrad, bzw. ein emuliertes Mausrad auf einem Trackpad, ändern kann. Eine von mir persönlich schon lange ersehnte Komponente, die uns vor allem bei der Verbesserung der Usability von wissenschaftlichen bzw. dateneingabeintensiven Applikationen helfen wird.

Qt Quick 3D

Mit dem Qt Quick 3D Modul können 3D-Szenen über QML definiert werden. Zwar ist das Qt Quick 3D Modul (noch) nicht so flexibel wie Qt 3D, für viele Anwendungsfälle sollte der Funktionsumfang jedoch ausreichen. Das schöne daran ist, dass 2D- und 3D-Darstellungen einheitlich mit QML entwickelt werden können. Eine gute Einführung in das Modul gibt der Blog Post: Introducing Qt Quick 3D: A high-level 3D API for Qt Quick. Im aktuellen Qt Release 5.14 ist das Qt Quick 3D Modul als Technology Preview gekennzeichnet. Ein offizielles Release ist für die Version 5.15 geplant.

Qt für Desktop- und Mobil-Applikationen

Auch im Desktop- bzw. Mobilbereich hat sich etwas getan. Zum einen wurde der High-DPI Support auf Dezimalzahlen erweitert. Zum anderen wurde das Auswerten von Farbrauminformationen zur korrekten Farbdarstellung auf kalibrierten Displays hinzugefügt.

Für Android werden nun AAB Packages (Android App Bundle) unterstützt. AAB ist das von Google bevorzugte Format für Android Apps im Play Store.


inspirent-factsheet-qt-development

Qt/QML Dienstleistungen

Hier können Sie sich unser Factsheet zu Qt/QML Services herunterladen.

6 Qt Bücher für Qt Entwickler

Qt ist bekannt für seine ausgezeichnete Entwickler Dokumentation, wie die API Referenz, Beispielprojekte, Tutorials, Whitepapers und Webinare. Sowohl für Entwickler, die das Qt Framework neu erlernen, als auch für erfahrene Qt Entwickler, bieten sich jedoch auch Qt Bücher als gute Informationsquelle an.

Bücher bieten einen anderen Präsentationsstil als formale Dokumentationen. Sie eignen sich oftmals besser zum erlernen eines neuen Fachgebietes, oder als Nachschlagewerk für den täglichen Einsatz.

Weiterhin bieten Bücher die Möglichkeit einmal nicht am Computer sitzen zu müssen. Ob zu Hause auf dem Sofa, im Garten oder im Flugzeug, ein Buch bietet die Gelegenheit, sich zu entspannen und gleichzeitig zu lernen.

Als Qt Experte werden wir von Inspirent oft nach Empfehlungen für gute Qt Bücher gefragt. In diesem Blog liste ich einige meiner Favoriten auf.

Einige Empfehlungen beziehen sich noch auf Qt 4. Meiner Ansicht nach sind diese Qt Bücher jedoch ebenfalls sinnvoll, um zum Beispiel die Grundgkonzepte des Qt Frameworks zu verstehen oder für Entwickler, die mit bestehendem Qt 4 Code arbeiten. Die meisten der aufgelisteten Bücher sind in englisch. Teilweise gibt es auch Ausgaben in deutsch. Ich persönlich bevorzuge immer die Ausgaben in der Originalsprache.

Disclaimer: Das sind meine persönlichen Meinungen und Empfehlungen und sie sind keinesfalls objektiv.

Qt Buch Tipp #1

C++ GUI Programmierung mit Qt 4, von Jasmin Blanchette und Mark Summerfield, ISBN: 978-0132354165

Dies war der offizielle Leitfaden für Qt 4, der vom Dokumentationsmanager von Trolltech und einem unabhängigen Qt Berater verfasst wurde. Auf 24 Kapiteln und rund 800 Seiten werden fast alle Aspekte der Qt-Programmierung behandelt. Das Buch enthält eine CD-ROM mit Softwarebeispielen und eine Kopie von Qt. Es handelt sich um ein Update der früheren Version, C++ GUI-Programmierung mit Qt 3, von denselben Autoren.

Seit der Veröffentlichung von Qt 5 im Jahr 2012 ist das Buch jetzt nicht mehr ganz up to date. Aber es ist immer noch verfügbar und durchaus noch nützlich. Das Buch ist älter als QML und zielt in erster Linie auf die Desktop-Entwicklung ab.

Hier finden Sie Die deutsche Version des Buches: C++ GUI Programmierung mit Qt 4, ISBN: 978-3827327291

Qt Buch Tipp #2

Mastering Qt 5, von Guillaume Lazar, Robin Penea, ISBN: 978-1788995399

Qt Buch #2, Mastering Qt 5

Mastering Qt 5 ist meiner Ansicht nach ein gutes praxisnahes Einsteigerbuch in die Qt Welt. Anhand von einfachen Beispielen werden grundlegende Qt Konzepte, wie zum Beispiel Signals und Slots, das Meta-Object System, der qmake Build Prozess uvm., erklärt. Weiterhin werden praktische Tipps zum Aufbau von Cross-Plattform Projekten mit dem Qt Framework gegeben.

Dieses Qt Buch ist aktuell ausschließlich in englisch verfügbar.

Qt Buch Tipp #3

End to End GUI Development with Qt5 von Nicholas Sherriff, Guillaume Lazar, Robin Penea, ISBN: 978-1789531909

Qt Buch #3, End to End GUI Development with Qt5

Dieses mit 1150 Seiten sehr sehr umfassende Werk liefert einen großen Rundumschlag zu allen wichtigen Themen der Qt Entwicklung. Dieses Buch wendet sich an fortgeschrittene Programmierer, die ein solides C++ Wissen und mindestens Grundlagenwissen im Umgang mit dem Qt Framework mitbringen.

Das Buch ist in drei große Teile aufgeteilt. Teil 1 behandelt Grundlagen wie Projektstruktur, Sotware Architektur, User Interface Programmierung, Styling, Datenzugriff, Unit Testing, persistente Datenspeicherung und Web Requests. In Teil 2 geht es primär um die Themen QMake, Techniken zur Strukturierung größerer Projekte, Desktop und Mobile User Interfaces, Qt für den Raspberry Pi, Animationen, Multithreading, Inter Process Communication, Deployment von Qt Applikationen, uvm. Teil 3 zeigt anhand eines praxisnahen Beispiels fortschrittliche Techniken wie 3D Grafiken, Real Time Sensordaten Handling, Mobile- und Web Dashboards.

Mit einem Preis jenseits von 100 € ist dieses Buch natürlich nicht gerade günstig. Meiner Ansicht nach lohnt sich die Investition jedoch vor allem für professionelle Qt Entwickler, da hier praxisnahes Wissen vermittelt wird, das relativ einfach auf eigene Projekte angewendet werden kann.

Das Buch ist aktuell nur in Englisch verfügbar.

Qt Buch Tipp #4

Rapid GUI Programming with Python and Qt, von Mark Summerfield, ISBN: 978-0134393339

Qt Buch #4, Rapid GUI Programming with Python and Qt

Dieses Buch behandelt das Entwickeln mit Qt in der Progrsammiersprache Python mithilfe von PyQt. Python ist eine, wenn nicht die beliebteste interpretierte Programmiersprache für allgemeine Zwecke. Ich glaube, dass in den nächsten Jahren einige Qt-basierte Anwendungen zunehmend in Python statt in C++ entwickelt werden.

Der Schwerpunkt des Buches liegt auf Qt. Die ersten drei Kapitel behandeln jedoch die Programmiersprache Python, einschließlich der objektorientierten Programmierung mit Klassen und Modulen. Daher eignet sich das Buch für Leser ohne Vorkenntnisse in Python.

Das Buch wurde bereits 2008 geschrieben und behandelt eher Qt 4 als Qt 5. Trotzdem ist es meines Erachtens immer noch das beste Buch, das es zum Thema Programmierung von Qt mit Python gibt. Das meiste Material ist auch gut auf Qt 5 anwendbar.

Das Buch ist ebenfalls nur in Englisch verfügbar.

Qt Buch Tipp #5

An Introduction to Design Patterns in C++ with Qt 4, Alan Ezust und Paul Ezust, ISBN: 978-0131879058

Qt Buch #5, An Introduction to Design Patterns in C++ with Qt 4

Dieses mit 600 Seiten sehr umfangreiche Buch wurde ursprünglich als Universitätslehrbuch geschrieben. Meiner Ansicht nach ist es jedoch auch für professionelle Entwickler und Studenten nützlich.

Obwohl das Buch für Qt 4 geschrieben wurde ist der Inhalt nach wie vor relevant und kann mit Anpassungen an die Neuerungen von C++ übernommen werden. Eine kostenlose PDF Version ist auf der Internetseite des Verlags verfügbar.

Qt Buch Tipp #6

Qt Cadaques, von Jürgen Bocklage-Ryannel und Johan Thelin

Qt Buch #6, Qt Cadaques

Dieses Buch behandelt im Wesentlichen QML bezogene Themen von Qt 5. Dieses Buch gibt es ausschließlich online. Eine Printausgabe ist aktuell nicht verfügbar. Es ist kostenlos auf Github verfügbar und wird unter der Creative Commons Lizenz vertrieben. Der Inhalt steht sowohl als HTML, PDF oder ePub zur Verfügung.

Weiterhin ist dieses Buch momentan noch in Arbeit und es kommen laufend neue Kapitel dazu. Ein Pluspunkt im Vergleich zu den anderen vorgestellten Qt Büchern ist, dass die Inhalte recht aktuell sind. Das Buch ist ebenfalls in Englisch geschrieben. Die aktuelle PDF Version hat über 300 Seiten.

Ich empfehle dieses Buch allen, die mehr zum Thema QtQuick und QML erfahren möchten und relativ aktuelle Informationen suchen.

Zusammenfassung

So, das sind nun also meine persönlichen Empfehlungen für Qt Bücher. Es gibt natürlich jede Menge mehr, diese bilden jedoch aus meiner Sicht eine solide Basis. Ein Nachteil der Bücher ist natürlich, dass die Informationen, insbesondere zu den beschriebenen Tools, mitunter relativ schnell veraltet sind. Die Halbwertszeit der grundlegenden Konzepte ist wesentlich höher und behalten in der Regel über Jahre hinweg Gültigkeit. Ich empfehle die offizielle Qt Dokumentation und das abonnieren von Newslettern und Blogs zum Thema, um stets auf dem aktuellen Stand zu sein.