Outils pour utilisateurs

Outils du site


cx_freeze_pyqt4_traductions

Ceci est une ancienne révision du document !


Avoir les QMessageBox traduits (Yes/No => Oui/Non ), même avec cx_freeze

Problématique

Vous avez fait un joli programme en PyQt4 qui utilise un QMessageBox du genre: “voulez-vous vraiment quitter?” avec les boutons Oui/Non. Mais ces boutons persistent à vous dire “Yes/No”.

Même si tout le monde comprend, c'est irritant, et ça donne une impression “pas fini” à votre application!!

Solution pour l'interpréteur "normal"

La solution est: il faut dire à PyQt4 qu'il doit traduire, mais il faut aussi lui dire où il doit trouver les fichiers de traduction selon la locale du PC.

Voilà le code à insérer, ce qui donnera pour le code de démarrage standard:

from PyQt4 import QtCore, QtGui
# ...
# ...ici la classe Fenetre
# ...
if __name__ == "__main__":
 
    # lancement de l'application 
    app = QtGui.QApplication(sys.argv)
 
    #========================================================================
    # pour assurer la traduction automatique du conversationnel à la locale
    locale = QtCore.QLocale.system().name()
    translator = QtCore.QTranslator ()
    translator.load(QtCore.QString("qt_") + locale,   
                  QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath))
    app.installTranslator(translator)
 
    #========================================================================
    # lancement de la fenetre
    fen = Fenetre()
    fen.show()
    sys.exit(app.exec_())

Solution pour un exécutable "cx_freeze" (ou équivalent)

Vous avez fait ce qui précède, et vous essayez de faire une version autonome de votre programme grâce à cx_freeze, transportée dans un Windows ou Linux sans PyQt4. Et là, ça ne marche plus!

Pourquoi? Parce que l'exécutable ne trouve plus les fichiers de traduction de la locale. Et s'il ne les trouve pas, c'est qu'il les cherche au mauvais endroit.

L'exécutable après cx_freeze cherche les fichiers de traduction:

  • sous Windows, ici: C:\Qt\4.7.1\translations (bizarre, parce qu'avec l'interpréteur, c'est: C:\Python27\Lib\Site-packages\PyQt4\translations)
  • sous Linux (Ubuntu 10.10), ici: /usr/share/qt4/translations.

La solution est dès lors évidente:

  • 1- pendant le traitement par cx_freeze, il faut copier le contenu du répertoire cherché dans un sous-répertoire “translations”. Cela peut se faire automatiquement en utilisant l'option “include_files”.
  • 2- il faut tester si on est avec l'interpréteur normal ou avec un exécutable fabriqué avec cx_freeze. On peut faire ça en testant si le programme qu'on vient de lancer a une extension '.py' ou '.pyw'.
  • 3- il ne reste plus qu'à donner le bon chemin des fichiers de traduction à “translator.load”

Voilà le code que ça donne:


Pour le setup.py de cx_freeze (tenir compte des éventuels autres copies à faire par l'option “include_files”):

if sys.platform == "linux2":
    options["include_files"] = [("/usr/share/qt4/translations","translations")]
elif sys.platform == "win32":
    options["include_files"] = [(r"C:\Python27\Lib\site-packages\PyQt4\translations","translations")]
else:
    # mettre ici la solution pour les autres OS
    pass 


Et pour le code de démarrage de l'application:

from PyQt4 import QtCore, QtGui
# ...
# ...ici la classe Fenetre
# ...
if __name__ == "__main__":
 
    # lancement de l'application 
    app = QtGui.QApplication(sys.argv)
 
    #========================================================================
    # pour assurer la traduction automatique du conversationnel à la locale
    locale = QtCore.QLocale.system().name()
    translator = QtCore.QTranslator ()
    if os.path.splitext(sys.argv[0])[1] in ['.py', '.pyw']:
        # exécution par l'interpréteur normal
        reptrad = unicode(QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath))
    else:
        # exécution de la version exécutable après cx_freeze (ou équivalent): 
        #les fichiers de traduction doivent se trouver dans "translations"
        reptrad = unicode("translations")
    translator.load(QtCore.QString("qt_") + locale, reptrad)
    app.installTranslator(translator)
 
    #========================================================================
    # lancement de la fenetre
    fen = Fenetre()
    fen.show()
    sys.exit(app.exec_())


Et là, ça marche dans tous les cas.

Pour la version Windows traités par cx_freeze, ça continue à fonctionner avec le programme d'installation “innosetup” (qui va vraiment très bien avec cx_freeze!).

A noter que je ne me suis pas contenté de la traduction en français: c'est la “locale” du PC qui sera utilisée!


Amusez-vous bien!

cx_freeze_pyqt4_traductions.1298619277.txt.gz · Dernière modification: 2011/02/25 08:34 de tyrtamos

Outils de la page