Avoir les QMessageBox traduits
De WikiDeveloppez.
(Différences entre les versions)
												
			
			| Version actuelle (13 février 2015 à 10:20) (voir la source) | |||
| - | |||
| - | [mise à jour  | + | [mise à jour: 13/2/2015] | 
| - | + | == 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".   | 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!! | 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. | 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 (Python 3), 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: | ||
| - | <tt> | + |  <tt>from PyQt4 import QtCore, QtGui | 
| - | from PyQt4 import QtCore, QtGui | + |  # ... | 
| - | # ... | + |  # ...ici la classe Fenetre | 
| - | # ...ici la classe Fenetre | + |  # ... | 
| - | # ... | + |  if __name__ == "__main__": | 
| - | 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("qt_" + locale,    | ||
| + |            QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)) | ||
| + |      app.installTranslator(translator) | ||
| + |      #  | ||
| + |      # lancement de la fenetre | ||
| + |      fen = Fenetre() | ||
| + |      fen.show() | ||
| + |      sys.exit(app.exec_()) | ||
| + |  </tt> | ||
| - | + | == 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! | ||
| La solution est dès lors évidente: | La solution est dès lors évidente: | ||
| - | + | 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": | |
| Pour le setup.py de cx_freeze (en plus des éventuelles 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"): | ||
| - | <tt> | + |  <tt>if sys.platform == "win32": | 
| - | if sys.platform == "win32": | + |      repexe = os.path.dirname(sys.executable)  # repertoire de python.exe | 
| - | + |      reppyqt4 = os.path.join(repexe, r"Lib\site-packages\PyQt4")  # repertoire de PyQt4 | |
| - | + |      includefiles += [(os.path.join(reppyqt4, "translations"), "translations")]  # recopie du repertoire pour les traductions | |
| - | + |  elif sys.platform == "linux2": | |
| - | elif sys.platform == "linux2": | + |      includefiles += [(r"/usr/share/qt4/translations", "translations")]  # repertoire pour les traductions | 
| - | + |  else: | |
| - | else: | + |      pass  # cas du Mac OSX non traité ici | 
| - | + |  </tt> | |
| - | </tt> | + | |
| - | + | 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: | |
| Fichier qt.conf, à placer simplement au même niveau que l'exécutable (exe sous Windows): | Fichier qt.conf, à placer simplement au même niveau que l'exécutable (exe sous Windows): | ||
| - | <tt> | + |  <tt>[Paths]   | 
| - | [Paths]   | + |  Translations = translations | 
| - | Translations = translations | + |  </tt> | 
| - | </tt> | + | |
| Et là, ça marche dans tous les cas.   | Et là, ça marche dans tous les cas.   | ||

