Internationalization 翻译QDialogButtonBox中的标准按钮

Internationalization 翻译QDialogButtonBox中的标准按钮,internationalization,pyqt,translation,Internationalization,Pyqt,Translation,我正在使用pyqt和designer。我已经用self.tr()+pylupdate4和lrelease翻译了我应用程序中的所有字符串 以下是my main()中的代码片段: 我在QDialog中使用QDialogButtonBox,其中包含QtGui.QDialogButtonBox.Cancel和QtGui.QDialogButtonBox.Ok 这些按钮中的字符串不会被翻译。因为pylupdate4会为它们选择任何字符串 我是否错过了我的应用程序中的配置步骤,以便对其进行翻译? 我不明白Q

我正在使用pyqt和designer。我已经用self.tr()+pylupdate4和lrelease翻译了我应用程序中的所有字符串

以下是my main()中的代码片段:

我在QDialog中使用QDialogButtonBox,其中包含QtGui.QDialogButtonBox.Cancel和QtGui.QDialogButtonBox.Ok

这些按钮中的字符串不会被翻译。因为pylupdate4会为它们选择任何字符串

我是否错过了我的应用程序中的配置步骤,以便对其进行翻译?
我不明白QDialogButtonBox标准按钮的字符串应该如何翻译,因此找不到相关文档。

从中,必须在应用程序小部件之前创建translator对象。我不能确定这是您的问题,因为您忽略了创建小部件的代码,但请确保您没有在转换器之前创建它们。

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

问题是Qtranslator无法翻译这些QDialogButtonBox按钮,因为没有要翻译的字符串。所以一定是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.QDialogButtonBox.Cancel字符串

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


我不能评论斯旺森的回答

我终于找到了该做的事情: 从和

因此,我只需要将我在QTDIR/translations中找到的qt_fr.qm(这里是/usr/share/qt/translations)复制到我的应用程序的目录中,然后添加

translator.load("qt_%s" % LOCALENAME)
或者甚至从QTDIR/translations复制所有qt_*.qm文件,以真正支持最大的区域设置

不,这不起作用。2个文件中只有一个正在加载。所以我不能翻译我的字符串或QDailogButtonBox


该死。这件事让我心烦意乱。

使用以下方法设置按钮的文本:

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

然后lupdate.ts文件,用语言学家打开它,您将找到字符串。

您应该安装两个不同的转换器:

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/share/qt4/translations(在我的例子中)复制的。

为了以可移植的方式从qt加载本机翻译,可以使用以下函数调用:

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

如前所述,两个(或更多)翻译器是您避免解决问题的标准方法。

Ah看起来您可以通过添加自己的“取消”和“确定”按钮来解决问题,而不是使用
setStandardButtons()
yes。我拒绝使用这种方法。因为当平台发生变化时,这些按钮是交换位置。但这似乎是我唯一的选择。所以我手动将qt_fr.ts文件的一部分合并到我的ts文件中。叹息。。。这怎么可能?没人用这个还是什么?至少在Qt中是这样。在填写了一份错误报告之后,我终于让它按它应该的方式工作了:“一个QTranslator是一个TS文件的表示形式。您需要在QApplication对象中安装多个转换器。FAQ条目只是错误的,将得到修复。”请注意,您可能还需要包括QPushButton标题:
translator.load("qt_" + QLocale::system().name(),QLibraryInfo::location(QLibraryInfo::TranslationsPath));