Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Quick Discussion :

La traduction d'interfaces QML


Sujet :

Qt Quick

  1. #1
    Membre averti
    La traduction d'interfaces QML
    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

  2. #2
    Membre expert
    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.
    "Ils ne savaient pas que c'était impossible alors ils l'ont fait." Mark Twain

    Mon client Twitter Qt cross-platform Windows et Linux. (en cours de développement).

  3. #3
    Rédacteur

    Citation Envoyé par air-dex Voir le message
    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.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    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
        }
    }


    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.

    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 C++ :Sélectionner tout -Visualiser dans une fenêtre à part
    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 C++ :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    LanguageNotifier notifier;
    viewer.engine()->rootContext()->setContextProperty("notifier", &notifier);


    Et dans le QML :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Text {
        text: qsTr("Bonjour") + notifier.language
        // ...
    }


    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.

    Bonne continuation,
    Amnell.
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  4. #4
    Membre expert
    Citation Envoyé par Amnell Voir le message
    La méthode exposée dans l'article est fonctionnelle hors du QML Viewer.
    Exact. Autant pour moi.
    "Ils ne savaient pas que c'était impossible alors ils l'ont fait." Mark Twain

    Mon client Twitter Qt cross-platform Windows et Linux. (en cours de développement).