Le but de cet article est de tester l'internationalisation des applications QML.
On s'appuie sur la documentation de Qt, « QML Internationalization ».
La traduction d'interfaces QML
Version imprimable
Le but de cet article est de tester l'internationalisation des applications QML.
On s'appuie sur la documentation de Qt, « QML Internationalization ».
La traduction d'interfaces QML
Article très intéressant mais il manque quelque chose de très important. Comment prendre en compte les fichiers de traduction lorsqu'on n'utilise pas QML Viewer ? En pratique on ne lance pas son programme avec QML Viewer et la méthode traditionnelle de Qt semble ne pas marcher.
La méthode exposée dans l'article est fonctionnelle hors du QML Viewer. Une remarque cependant : cet article ne parle pas de traduction dynamique de l'application, seulement d'une unique traduction au lancement.
Dans QML, quand une propriété change de valeur, elle émet un signal NOTIFY qui informe les propriétés en dépendant qu'elles doivent également actualiser leur valeur.
Pour effectuer une traduction dynamique, il est nécessaire d'avoir une propriété qui puisse notifier les propriétés textuelles d'un changement de langue. C'est-à-dire que si on se situe dans un élément Text avec une propriété text: qsTr("Bonjour"). Si la langue change durant l'exécution, aucune propriété dans l'expression ne peut notifier de ce changement.Code:
1
2
3
4
5
6
7
8
9
10
11 Rectangle { // Cette propriété s'actualise après chaque émission du // signal NOTIFY de la propriété pressed de la mouseArea : color: mouseArea.pressed ? "blue" : "black" anchors.fill: parent MouseArea { id: mouseArea anchors.fill: parent } }
La classe LanguageNotifier dans laquelle se situe une propriété QString qui est toujours définie à "" mais qui émet un signal de notification à chaque demande de changement de valeur.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 class LanguageNotifier : public QObject { Q_OBJECT Q_PROPERTY(QString language READ getLanguage WRITE setLanguage NOTIFY languageChanged) public: LanguageNotifier(QObject *parent = 0) : QObject(parent), _language(QString()) { } QString getLanguage() const { return _language; } void setLanguage(const QString&) { emit languageChanged(); } Q_SIGNALS: void languageChanged(); private: QString _language; };
Définition de la propriété contextuelle par exemple dans le main.cpp :
Code:
1
2 LanguageNotifier notifier; viewer.engine()->rootContext()->setContextProperty("notifier", ¬ifier);
Et dans le QML :
Lors d'un changement de langue (donc actualisation du Translator avec le nouveau fichier de langue), le C++ devra effectuer un notifier.setProperty("language", "La valeur est inutile."). Cela entraînera une actualisation automatique des propriétés dépendant de notifier.language, ce qui rappellera qsTr() et qui retraduira donc les éléments concernés.Code:
1
2
3
4 Text { text: qsTr("Bonjour") + notifier.language // ... }
Bonne continuation,
Amnell.