2010-02-28 10 views
3

J'utilise pyqt et concepteur. J'ai traduit toutes les chaînes dans mon application avec self.tr() + pylupdate4 et lreleaseTraduire standardButton dans QDialogButtonBox

ici est l'extrait de code dans mon principal():

app = QtGui.QApplication(sys.argv) 
app.setApplicationName('Mental Calculation') 

# initialize locale and load translation files if available 
locale = QtCore.QLocale() 
LOCALENAME = str(locale.system().name()) 
translator = QtCore.QTranslator() 
translator.load("mentalcalculation_%s" % LOCALENAME) 
app.installTranslator(translator) 

J'utilise un QDialogButtonBox dans un QDialog avec un QtGui.QDialogButtonBox.Cancel et un QtGui.QDialogButtonBox.Ok

et les chaînes dans ces boutons ne sont pas traduits. parce que pylupdate4 ne sélectionne aucune chaîne pour eux.

Ai-je manqué une étape de configuration dans mon application afin qu'elle soit traduite? Je ne comprends pas comment la chaîne pour les boutons standard de QDialogButtonBox sont censés être traduits et ne peut pas trouver doc à ce sujet.

Répondre

8

Utilisez la méthode ci-dessous pour définir le texte des boutons:

buttonBox->button(QDialogButtonBox::Ok)->setText(tr("Ok")); 
buttonBox->button(QDialogButtonBox::Cancel)->setText(tr("Cancel")); 

lupdate puis .ts fichier, ouvrez-le avec linguiste et vous trouverez les chaînes.

+1

+1 pour cette petite solution de contournement. Merci. – fmuecke

+0

très bien. Merci – solsTiCe

0

Depuis le docs, vous devez créer l'objet traducteur avant les widgets de l'application. Je ne peux pas être certain que c'est votre problème puisque vous avez omis le code où vos widgets sont créés, mais assurez-vous de vous assurer que vous ne les créez pas avant le traducteur.

-1

oui. juste en dessous de l'extrait que j'ai donné, je crée mon dialogue principal.

Le problème est que Qtranslator n'a pas pu traduire ces boutons QDialogButtonBox car il n'y a pas de chaîne à traduire. donc ce doit être qt qui fait ce travail en interne. ou avec un mécanisme que je ne connais pas.

Voici un autre extrait de code généré par pyuic4

self.buttonBox = QtGui.QDialogButtonBox(Dialog) 
self.buttonBox.setOrientation(QtCore.Qt.Horizontal) 
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) 
self.buttonBox.setObjectName("buttonBox") 
self.gridLayout.addWidget(self.buttonBox, 8, 0, 1, 1) 

Comment chaîne QtGui.QDialogButtonBox.Cancel pourrait se traduire quand il n'y a pas de chaîne dans le code ???

Est-ce parce que je ne crée pas de mainwindow et n'utilise que QDialog ??

Je ne peux pas commenter sur swanson réponse!

+0

Ah il semble que vous pourriez éventuellement résoudre le problème en ajoutant vos propres boutons Annuler et Ok au lieu d'utiliser 'setStandardButtons()' – swanson

+0

oui. Je résiste à utiliser cette solution de contournement. parce que ces boutons sont permutés lorsque la plate-forme change. mais il semble que c'est ma seule option. – solsTiCe

2

J'ai finalement trouvé ce qu'il faut faire: de http://qt.nokia.com/developer/faqs/faq.2008-05-06.6265952148 et http://qt.nokia.com/developer/faqs/705

donc j'ai juste besoin de copier, par exemple français, le qt_fr.qm j'ai trouvé dans QTDIR/traductions (ici/usr/share/qt/traductions) dans le répertoire de mon application et ajoutez

translator.load("qt_%s" % LOCALENAME) 

ou même copier tous les pintes _ *. fichier qm de QTDIR/traductions pour soutenir vraiment le maximum de lieux.

NO CECI NE FONCTIONNE PAS. Un seul des deux fichiers est en cours de chargement. donc je ne peux pas avoir ma chaîne traduite ou le QDailogButtonBox.

damn. cette chose devient dans mes nerfs.

+0

donc je fusionne manuellement une partie du fichier qt_fr.ts dans mon fichier ts. soupir ... comment c'est possible? personne ne l'utilise ou quoi? au moins en Qt. – solsTiCe

+2

après avoir rempli un rapport de bogue pour ce http://bugreports.qt.nokia.com/browse/QTBUG-8798, j'ai finalement réussi à le faire comme il se doit: "un QTranslator est une représentation d'un seul fichier TS. besoin d'installer plusieurs traducteurs dans l'objet QApplication, l'entrée FAQ est juste fausse et sera corrigée. " – solsTiCe

2

vous devez installer 2 différents traducteurs:

app = QtGui.QApplication(sys.argv) 

translator_my = QtCore.QTranslator() 
translator_my.load('i18n/i18n_' + QtCore.QLocale.system().name() + '.qm') 
#translator_my.load('i18n/i18n_ru_Ru.qm') 
app.installTranslator(translator_my) 

translator_qt = QtCore.QTranslator() 
translator_qt.load('i18n/qt_' + QtCore.QLocale.system().name()[:2] + '.qm') 
#translator_qt.load('i18n/qt_ru.qm') 
app.installTranslator(translator_qt) 

myApp = MyMainWindow() 
myApp.show() 
sys.exit(app.exec_()) 

où i18n/i18n_ru_Ru.qm est le chemin de votre fichier i18n et qt_ru.qm a été copié à partir usr/share/Qt4/traductions (dans mon cas) .

3

Pour charger les traductions natives de QT de manière portable, vous pouvez utiliser l'appel de fonction suivante:

translator.load("qt_" + QLocale::system().name(),QLibraryInfo::location(QLibraryInfo::TranslationsPath)); 

Les deux traducteurs (ou plus) comme expliqué précédemment, est la façon standard si vous voudrais éviter la solution de contournement.