IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Avoir les QMessageBox traduits

De WikiDeveloppez.

(Différences entre les versions)
Version actuelle (13 février 2015 à 10:20) (voir la source)
 
(2 révisions intermédiaires masquées)
Ligne 1 : Ligne 1 :
-
'''' Avoir les QMessageBox traduits (Yes/No => Oui/Non ), même avec cx_freeze ''''
 
-
[mise à jour le 13/2/2015]
+
[mise à jour: 13/2/2015]
-
===== Problématique =====
+
== 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".  
Ligne 9 : Ligne 8 :
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" =====
+
== 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.
Ligne 37 : Ligne 36 :
  </tt>
  </tt>
-
===== Solution pour un exécutable "cx_freeze" =====
+
== 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!

Version actuelle

[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".

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 (Python 3), 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("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"

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: ils n'ont pas été recopiés, et même s'ils l'ont été, leurs adresses ont changé.

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"):

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":
    includefiles += [(r"/usr/share/qt4/translations", "translations")]  # repertoire pour les traductions
else:
    pass  # cas du Mac OSX non traité ici

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):

[Paths] 
Translations = translations

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

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 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, ...).

Contacter le responsable de la rubrique Accueil