1. Page d'accueil

Python Bindings Tools For QtV4

Internationalisation des Applications PyQt

PyQt et Qt incluent un kit d’outil pour la traduction d’application vers différentes langues. Pour une description complète, voir le manuel Qt Linguist dans la documentation Qt.

Le processus d’internationalisation d’une application comprend les étapes suivantes :

  • Le programmeur utilise pylupdate4 pour créer ou mettre à jour un fichier de traduction .ts pour chaque langue dans laquelle l’application doit être traduite. Un fichier .ts est un fichier XML qui contient les chaînes de caractère à traduire ainsi que les traductions correspondantes déjà effectuées. pylupdate4 peut être lancé aussi souvent que souhaité durant le développement pour mettre à jour les fichiers .ts avec les dernières chaînes de caractère à traduire.
  • Le traducteur utilise Qt Linguiste pour mettre à jour les fichiers .ts avec les chaînes de caractère traduites.
  • Le chef de projet utilise alors l’utilitaire lrelease de Qt pour convertir les fichiers .ts en fichiers .qm qui sont des équivalents binaires compactes utilisés par l’application. Si une application ne peut trouver un fichier .qm approprié ou une chaîne de caractère particulière non traduite, alors la chaîne de caractère utilisée dans le code source original est alors utilisé à la place.
  • Le chef de projet peut optionnellement utiliser pyrcc4 pour inclure les fichiers .qm, avec d’autre ressource de l’application tel que les icônes, dans un module python. Ceci permet de rendre l’empaquetage et la distribution de l’application plus facile.

pylupdate4

pylupdate4 est l’équivalent PyQt de l’utilitaire lupdate de Qt et s’utilise de même manière. Un fichier projet Qt .pro est lu spécifiant les fichiers source Python et les fichiers d’interface de Qt Designer d’où les textes qui ont besoin d’être traduit sont extrait. Le fichier .pro spécifie aussi les fichiers de traduction .ts que pylupdate4 met à jour (ou créé si nécessaire) et est par la suite utilisé par Qt Linguist.

pylupdate4 ne sera inclus que si votre copie de Qt inclus le module XML.

Différences Entre PyQt et Qt

Qt implémente le support de l’internationalisation à travers la classe QTranslator, ets méthodes QCoreApplication::translate(), QObject::tr() and QObject::trUtf8(). Habituellement la méthode tr() est utilisée pour obtenir la traduction correcte du message. Le processus de traduction utilise un contexte de message pour permettre au même message d’être traduit différemment. tr() est actuellement généré par moc et utilise le nom de la classe en dur en tant que context. D’autre part, QApplication::translate() permet au contexte d’être explicitement énoncé.

Hélas, à cause de la manière dont Qt a implémenté tr() (et trUtf8()) il n’est pas possible pour pyQt de reproduire exactement son comportement. L’implémentation PyQt de tr() (et trUtf8()) utilise le nom de la classe de l’instance en tant que context. La différence clef, et la source potentiel de problème, est que le contexte est déterminé dynamiquement dans PyQt, mais il est codé en dur dans Qt. En d’autre termes, le contexte de la traduction peut changer selon la hiérarchie d’instance de la classe. Par exemple! :

class A(QtCore.QObject):
   def hello(self):
       return self.tr("Hello")

class B(A):
   pass

a ! A()
a.hello()

b ! B()
b.hello()

Ci-dessus, le message est traduit par a.hello() en utilisant le contexte de A, et par b.hello utilisant un contexte de B. Dans une version équivalente C++ le contexte serait celui de A dans les deux cas.

Le comportement de PyQt n’est pas satisfaisant et peut changé dans le future. Il est recommandé d’utiliser de préférence QCoreApplication.translate() plutot que tr() (et trUtf8()). Cet méthode est garantie fonctionnel avec les versions courantes et futures de PyQt et permet de rendre plus simple le partage de fichiers de message entre Python et le code C++. Voyez ci-dessous une implémentation alternative de A utilisant la fonction QCoreApplication.translate():

class A(QtCore.QObject):
   def hello(self):
      return QtCore.QCoreApplication.translate("A", "Hello")

Les commentaires sont fermé pour cet élément.