【问题标题】:Translate standardButton in QDialogButtonBox翻译 QDialogBu​​ttonBox 中的标准按钮
【发布时间】:2010-02-28 12:36:28
【问题描述】:

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

这是我 main() 中代码的 sn-p:

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)

我在 QDialog 中使用 QDialogBu​​ttonBoxQtGui.QDialogBu​​ttonBox.CancelQtGui.QDialogBu​​ttonBox.Ok em>

并且这些按钮中的字符串不会被翻译。因为 pylupdate4 确实为他们选择了任何字符串。

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

【问题讨论】:

    标签: internationalization pyqt translation


    【解决方案1】:

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

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

    然后更新 .ts 文件,用语言学家打开它,你会找到字符串。

    【讨论】:

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

    【讨论】:

      【解决方案3】:

      为了以可移植的方式从 QT 加载原生翻译,您可以使用以下函数调用:

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

      如前所述,两个(或更多)翻译器是标准方法,如果您想避免变通方法。

      【讨论】:

        【解决方案4】:

        我终于找到了该怎么做: 来自http://qt.nokia.com/developer/faqs/faq.2008-05-06.6265952148http://qt.nokia.com/developer/faqs/705

        所以我只需将我在 QTDIR/translations(此处为 /usr/share/qt/translations)中找到的 qt_fr.qm(例如法语)复制到我的应用程序目录并添加

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

        甚至从 QTDIR/translations 复制所有 qt_*.qm 文件,以真正支持最大的语言环境。

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

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

        【讨论】:

        • 所以我手动将部分 qt_fr.ts 文件合并到我的 ts 文件中。叹息……这怎么可能?没人用这个还是什么?至少在 Qt 中。
        • 在为此bugreports.qt.nokia.com/browse/QTBUG-8798 填写错误报告后,我终于让它按应有的方式工作:“QTranslator 是一个 TS 文件的表示。您需要在 QApplication 中安装多个翻译器对象。FAQ 条目是错误的,将被修复。"
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          是的。在我给出的 sn-p 下方,我创建了我的主对话框。

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

          这里是pyuic4生成的另一个sn-p代码

          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 ??

          我无法评论斯旺森的回答!

          【讨论】:

          • 啊,看来您可以通过添加自己的取消和确定按钮来解决问题,而不是使用setStandardButtons()
          • 是的。我拒绝使用这种解决方法。因为当平台发生变化时,这些按钮会交换位置。但似乎这是我唯一的选择。
          猜你喜欢
          • 2015-09-26
          • 2015-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多