Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
cx_freeze_pyqt4_traductions [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


cx_freeze_pyqt4_traductions

Warning: Undefined array key -1 in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/html.php on line 1458

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
cx_freeze_pyqt4_traductions [2011/02/25 08:31]
tyrtamos
cx_freeze_pyqt4_traductions [2015/02/13 10:04]
tyrtamos
Ligne 1: Ligne 1:
 ====== Avoir les QMessageBox traduits (Yes/No => Oui/Non ), même avec cx_freeze ====== ====== Avoir les QMessageBox traduits (Yes/No => Oui/Non ), même avec cx_freeze ======
  
 +[mise à jour le 13/2/2015]
  
 ===== Problématique ===== ===== Problématique =====
Ligne 12: Ligne 13:
 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. 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:+Voilà le code à insérer (Python 3), ce qui donnera pour le code de démarrage standard:
  
 <code python> <code python>
Ligne 28: Ligne 29:
     locale = QtCore.QLocale.system().name()     locale = QtCore.QLocale.system().name()
     translator = QtCore.QTranslator ()     translator = QtCore.QTranslator ()
-    translator.load(QtCore.QString("qt_"+ locale,    +    translator.load("qt_" + locale,    
-                  QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath))+          QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath))
     app.installTranslator(translator)     app.installTranslator(translator)
  
Ligne 39: Ligne 40:
 </code> </code>
  
-===== Solution pour un exécutable "cx_freeze" (ou équivalent) =====+===== Solution pour un exécutable "cx_freeze" =====
  
-Vous avez fait ce qui précède, et vous essayez de faire une version autonome de votre programme grâce à cx_freeze. Et là, ça ne marche plus!+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. +Pourquoi? Parce que l'exécutable ne trouve plus les fichiers de traduction de la locale: ils n'ont pas été recopiéset même s'ils l'ont étéleurs adresses ont changé.
- +
-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éteurc'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: 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"+  * 1- pendant le traitement par cx_freeze, il faut recopier le contenu du répertoire cherché (répertoire translations de PyQt4 à trouver en fonction de votre OS) 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"):+Pour le setup.py de cx_freeze (en plus des éventuelles autres copies à faire par l'option "include_files"):
  
 <code python> <code python>
-if sys.platform == "linux2": +if sys.platform == "win32": 
-    options["include_files"= [("/usr/share/qt4/translations","translations")] +    repexe = os.path.dirname(sys.executable)  # repertoire de python.exe 
-elif sys.platform == "win32": +    reppyqt4 = os.path.join(repexe, r"Lib\site-packages\PyQt4")  # repertoire de PyQt4 
-    options["include_files"= [(r"C:\Python27\Lib\site-packages\PyQt4\translations","translations")]+    includefiles += [(os.path.join(reppyqt4, "translations"), "translations")]  # recopie du repertoire pour les traductions 
 +elif sys.platform == "linux2": 
 +    includefiles += [(r"/usr/share/qt4/translations", "translations")]  # repertoire pour les traductions
 else: else:
-    # mettre ici la solution pour les autres OS +    pass  cas du Mac OSX non traité ici
-    pass +
 </code> </code>
 +
 +  * 2- il faut donner la possibilité au programme exécutable de trouver les fichiers de traduction: on fait ça facilement avec un simple fichier qt.conf qui donne les bonnes adresses:
  
 \\ \\
-Et pour le code de démarrage de l'application:+Fichier qt.conf, à placer simplement au même niveau que l'exécutable (exe sous Windows):
  
-<code python+<code> 
-from PyQt4 import QtCore, QtGui +[Paths]  
-# ... +Translations translations 
-# ...ici la classe Fenetre +</code>
-# ... +
-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_()) 
-</code>  
- 
-\\ 
 Et là, ça marche dans tous les cas.  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!). +Pour la version Windows traitées 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! 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!
 +
 +A noter aussi que ce qui précède pour le répertoire "translations" (recopie et adresse) vaut aussi pour le répertoire "plugins" qui permettra, entre autres, à votre exécutable de retrouver les pilotes d'accès aux systèmes de gestion de base de données (sqlite3, mysql, ...).
  
 \\ \\
cx_freeze_pyqt4_traductions.txt · Dernière modification: 2015/02/13 10:04 de tyrtamos