Outils pour utilisateurs

Outils du site


cx_freeze_pyqt4_traductions

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
cx_freeze_pyqt4_traductions [2011/02/25 08:34]
tyrtamos
cx_freeze_pyqt4_traductions [2015/02/13 10:04] (Version actuelle)
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, transportée dans un Windows ou Linux sans PyQt4. 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 par tyrtamos