I. Solution pour l'interpréteur "normal"▲
La solution est la suivante : 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 :
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(QtCore.QString("qt_") + locale,
QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath))
app.installTranslator(translator)
#========================================================================
# lancement de la fenetre
fen = Fenetre()
fen.show()
sys.exit(app.exec_())II. Solution pour un exécutable cx_Freeze (ou équivalent)▲
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.
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éteur, c'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 :
- 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” ;
- 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' ;
- 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 éventuelles autres copies à faire par l'option “include_files”) :
if sys.platform == "linux2":
options["include_files"] = [("/usr/share/qt4/translations","translations")]
elif sys.platform == "win32":
options["include_files"] = [(r"C:\Python27\Lib\site-packages\PyQt4\translations","translations")]
else:
# mettre ici la solution pour les autres OS
passEt pour le code de démarrage de l'application :
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 ()
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_())Et là, ça marche dans tous les cas.
Pour la version Windows traitée par cx_Freeze, ça continue à fonctionner avec le programme d'installation InnoSetup (qui va vraiment très bien avec cx_Freeze !).
À noter que je ne me suis pas contenté de la traduction en français : c'est la “locale” du PC qui sera utilisée !
III. Remerciements▲
Merci à dourouc05 et à ClaudeLELOUP pour leur relecture !



