2010-02-28 69 views
3

我正在使用pyqt设计师。我已经在我的self.tr()+ pylupdate4应用程序翻译所有的字符串和lrelease,即可在QDialogBu​​ttonBox中翻译standardButton

这里的代码片断在我的main():

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) 

我使用QDialogBu​​ttonBox了QDialogQtGui.QDialogBu​​ttonBox.CancelQtGui.QDialogBu​​ttonBox.Ok

并在这些按钮的字符串没有翻译。因为pylupdate4确实为他们挑选了任何字符串。

我错过了我的应用程序中的配置步骤,以便它们被翻译? 我不明白如何为标准按钮的QDialogBu​​ttonBox字符串应该被翻译,并找不到相关的文档。

回答

8

使用下面的方法来设置按钮的文字:

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

然后lupdate的.ts文件,用语言学家打开它,你会发现琴弦。

+1

+1这个小小的讨厌的解决方法。谢谢。 – fmuecke 2011-01-02 17:26:14

+0

非常好。谢谢 – solsTiCe 2011-10-13 11:03:58

0

docs开始,您必须在应用程序小部件之前创建翻译器对象。我不能确定这是你的问题,因为你在创建你的小部件的地方省略了代码,但要确保你不会在翻译器之前创建它们。

-1

是的。就在我给出的片段下面,我创建了我的主对话框。

问题是Qtranslator无法翻译那些QDialogBu​​ttonBox按钮,因为没有要翻译的字符串。所以它必须是内部完成这项工作的qt。或者我不知道的一些机制。

这里被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) 

生成的代码片段另一个时如何有代码中没有串QtGui.QDialogBu​​ttonBox.Cancel字符串可以转化???

是因为我没有创建一个主窗口,只使用QDialog?

我不能评论swanson答案!

+0

啊,它看起来像你可以通过添加你自己的取消和确定按钮来解决问题,而不是使用'setStandardButtons()' – swanson 2010-03-01 17:24:22

+0

是的。我拒绝使用该解决方法。因为这些按钮在平台更改时是交换位置的。但它似乎是我唯一的选择。 – solsTiCe 2010-03-01 21:03:22

2

我终于找到了做什么: 从http://qt.nokia.com/developer/faqs/faq.2008-05-06.6265952148http://qt.nokia.com/developer/faqs/705

,所以我只需要拷贝,例如法国人,qt_fr.qm我QTDIR /译(这里的/ usr /股发现/ QT /译)到我的应用程序的目录,并添加

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

甚至复制所有的QT _ *。QM文件从QTDIR /译真正支持最大的语言环境。

没有这个工作。只有两个文件中的一个正在加载。所以我不能有我的字符串翻译或QDailogBu​​ttonBox。

该死的。这件事情让我很紧张。

+0

所以我手动合并部分qt_fr.ts文件到我的ts文件中。叹息... 这是怎么可能的?没有人使用这个或什么?至少在Qt中。 – solsTiCe 2010-03-06 17:56:48

+2

填补这个http://bugreports.qt.nokia.com/browse/QTBUG-8798的错误报告后,我终于得到它应该的方式: “一个QTranslator只是一个TS文件的表示。你需要在QApplication对象中安装多个翻译器,常见问题解答条目是错误的,并且会被修复。“ – solsTiCe 2010-03-08 20:52:32

2

你应该安装2个不同译者:

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_()) 

其中的i18n/i18n_ru_Ru.qm是通向你的i18n文件,qt_ru.qm从USR /股/ QT4 /译复制(在我的情况) 。

3

为了加载从QT的本地转译在便携式的方式,你可以使用下面的函数调用:

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

两个(或更多)的翻译如前所述,是如果你的标准方法想避免解决方法。