Avoir les QMessageBox traduits
De WikiDeveloppez.
Version actuelle (13 février 2015 à 10:20) (voir la source) |
|||
| Ligne 1 : | Ligne 1 : | ||
| - | |||
[mise à jour: 13/2/2015] | [mise à jour: 13/2/2015] | ||
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, ...).
