in English in deutsch Incorporer des traductions dans un programme Qt

Introduction

Plusieurs techniques permettent l'internationalization d'un programme conçu avec le framework Qt.

screen shot

La procédure que j'explique sur cette page sert à incorporer des traductions dans un fichier exécutable et de les utiliser tout de suite, sans avoir à imposer l'endroit où, sur le système d'un utilisateur, les fichiers*.qm seront stockés.

Ma manière de faire n'est pas vraiment spéciale, parce que je n'utilise que ce que l'environnement de développement Qt met à disposition. Quand même, je ne suis plus les recommandations que vous trouvez dans le Web ou les textes d'aide, qui accompagnent les outils de traduction, d'abord, parce que je ne les comprends pas !

Vous devraient probablement comparer mes explications ici à ceux que vous trouvez ailleurs, puis faire ce que vous considérez nécessaire …

La version de Qt que j'utilise au moment que j'écris cette page, est 6.4

Travaux préliminaires

Ce sont des étapes que je vais seulement lister. Pour plus de détails, consultez le manuel du logiciel QtLinguist.

  1. Le développeur qui utilise un objet de la classe QTranslator doit passer des chaînes de caractères à la méthode tr() pour qu'elles peuvent être traduites.
  2. Le même développeur doit assurer que le deuxième paramètre de la méthode QTranslator::load() est précisement ":i18n", le resource-prefix par défaut. Par exemple;
    [[maybe_unused]] bool isso = translator.load(QString("project_") + locale, ":i18n");
  3. Avec l'exécution de l'utilitaire lupdate, tous les fragments de texte traduisibles seront extraits du code source et écrits dans des fichiers XML avec l'extension *.ts (je n'ai pas d'expérience avec un outil plus récent lupdate-pro qui sert à la même tache).
  4. Les fichiers *.ts sont donnés à un traducteur qui va ajouter une traduction pour chacun des chaines de caractères listées. Ou le traducteur peut se servir de l'utilitaire Qt-Linguist au même but, mais en prenant en considération le contexte de chaque fragment dans le programme.

Ce qui reste encore à faire pour que les traductions deviennent accessibles à l'application, c'est la compilation de chaque fichier *.ts dans un fichier en format Qt message (*.qm).

Préparation du fichier de projet *.pro

Dans le fichier de projet, vous indiquez les fichiers de traduction:

       TRANSLATIONS += project_name_fr_FR.ts \
                       project_name_de_DE.ts 

La compilation des traductions dans des fichiers *.qm sera accompli par l'utilitaire lrelease. Pour ça et pour imposer l'encastrement des traductions dans le fichier exécutable, deux valeurs supplémentaires sont ajoutées dans la variable CONFIG, dans le même fichier de projet :

       CONFIG += lrelease embed_translations
       TRANSLATIONS += project_name_fr_FR.ts \
                       project_name_de_DE.ts 

Preparer la compilation

Si un Makefile existe déjà, exécutez d'abord
:~/[project]$ make distclean
pour effacer des éventuels restes des compilations précédentes

Maintenant recréez le Makefile en exécutant qmake :
:~/[project]$ qmake.

Les modifications effectuées dans le fichier de projet auront pour conséquence la création de fichiers supplémentaires. Le premier est le fichier de ressources par défault qmake_qmake_qm_files.qrc que vous voyez après l'exécution de qmake. Il contient le future emplacement des fichiers *.qm:

      <!DOCTYPE RCC><RCC version="1.0">
       <qresource prefix="i18n">
         <file alias="project_fr_FR.qm">/project/.qm/project_fr_FR.qm</file>
         <file alias="project_de_DE.qm">/project/.qm/project_de_DE.qm</file>
       </qresource>
      </RCC> 

Le répertoire .qm sera crée pendant l'exécution de make, comme les fichiers *.qm correspondants aux traductions. Le resource prefix "i18n" est le même qui sert comme deuxième paramètre à la méthode QTranslator::load() (voir plus haut).

Exécuter make

Maintenant que le Makefile et le fichier de ressources existent, vous pouvez compiler le projet en exécutant
:~/[project]$ make.

Ceci va d'abord trouver l'utilitaire lrelease, compiler les fichiers *.qm et les déposer dans le répertoire caché .qm, puis générer un nouveau fichier *.cpp et un fichier d'en-tête *.h par traduction. Enfin, les traductions seront compilées avec le reste du code source et intégrées dans le fichier exécutable du logiciel.

Si vous l'aimez compliqué

La plupart des actions décrites ci-dessus base sur les défauts, prévus par le framework Qt. Si vous le préférez, vous pouvez modifier quelques paramètres afin de

Je ne vais – par contre – pas vous assister avec ça.

Ω

01 Avril 2023