pyqt5应用程序中对话框和主窗口的国际化(翻译)

Posted

技术标签:

【中文标题】pyqt5应用程序中对话框和主窗口的国际化(翻译)【英文标题】:Internationalization (translation) of dialog and the main window in a pyqt5 application 【发布时间】:2018-11-16 07:06:04 【问题描述】:

我正在尝试将我用 pyside2/pyqt5 编写的小型应用程序翻译成多种语言,例如中文。谷歌搜索后,从菜单->语言->中文选择后,我设法将主窗口更改为中文。但是,菜单 -> 选项的弹出对话框仍然是英文版本。似乎翻译信息没有传输到对话框。我该如何解决?

基本上,我在设计器中构建了两个ui文件并转换为两个python文件:一个mainui.py和一个dialogui.py。然后我将这两个 python 文件转换为一个 *.ts 文件使用

pylupdate5 -verbose mainui.py dialogui.py -ts zh_CN.ts

之后,在语言学家中输入翻译词。我可以看到对话框中的项目,这意味着该信息没有丢失。然后我将文件发布为 zh_CN.qm 文件。我使用谷歌驱动器在下面附加的所有这些支持文件。

Supporting files for the question

主文件为

import os
import sys

from PySide2 import QtCore, QtGui, QtWidgets
from mainui import Ui_MainWindow

from dialogui import Ui_Dialog

class OptionsDialog(QtWidgets.QDialog,Ui_Dialog):
    def __init__(self,parent):
        super().__init__(parent)
        self.setupUi(self)
        self.retranslateUi(self)


class MainWindow(QtWidgets.QMainWindow,Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.actionConfigure.triggered.connect(self.showdialog)
        self.actionChinese.triggered.connect(self.change_lang)

    def showdialog(self):
        dlg = OptionsDialog(self)
        dlg.exec_()

    def change_lang(self):
        trans = QtCore.QTranslator()
        trans.load('zh_CN')
        QtCore.QCoreApplication.instance().installTranslator(trans)
    self.retranslateUi(self)



if __name__=='__main__':
    app = QtWidgets.QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    ret = app.exec_()
    sys.exit(ret)

我认为这应该是一个典型的任务,因为几乎没有应用程序只有一个主窗口。

【问题讨论】:

是的,@eyllanesc。您的解决方案效果很好,我只是将您的答案标记为已接受的解决方案。我没有立即这样做只是因为我想真正坐下来彻底分析您的代码并询问您我无法理解的部分。无论如何,我可以稍后再问你。 【参考方案1】:

当事件类型为QEvent::LanguageChange 时,您必须覆盖changeEvent() 方法并调用retranslateUi(),另一方面,QTranslator 对象必须是该类的成员,但它将被删除并且它调用changeEvent() 方法时将不存在。

最后假设语言菜单仅用于建立翻译,一个可能的选择是将.qm的名称建立为QActions的数据并使用QMenu的触发方法,如我所示下面:

from PySide2 import QtCore, QtGui, QtWidgets
from mainui import Ui_MainWindow

from dialogui import Ui_Dialog

class OptionsDialog(QtWidgets.QDialog,Ui_Dialog):
    def __init__(self,parent):
        super().__init__(parent)
        self.setupUi(self)

    def changeEvent(self, event):
        if event.type() == QtCore.QEvent.LanguageChange:
            self.retranslateUi(self)
        super(OptionsDialog, self).changeEvent(event)

class MainWindow(QtWidgets.QMainWindow,Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.m_translator = QtCore.QTranslator(self)
        self.actionConfigure.triggered.connect(self.showdialog)
        self.menuLanguage.triggered.connect(self.change_lang)
        # set translation for each submenu
        self.actionChinese.setData('zh_CN')

    @QtCore.Slot()
    def showdialog(self):
        dlg = OptionsDialog(self)
        dlg.exec_()

    @QtCore.Slot(QtWidgets.QAction)
    def change_lang(self, action):
        QtCore.QCoreApplication.instance().removeTranslator(self.m_translator)
        if self.m_translator.load(action.data()):
            QtCore.QCoreApplication.instance().installTranslator(self.m_translator)

    def changeEvent(self, event):
        if event.type() == QtCore.QEvent.LanguageChange:
            self.retranslateUi(self)
        super(MainWindow, self).changeEvent(event)

if __name__=='__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    ret = app.exec_()
    sys.exit(ret)

【讨论】:

以上是关于pyqt5应用程序中对话框和主窗口的国际化(翻译)的主要内容,如果未能解决你的问题,请参考以下文章

能够在 PyQt5 中一次打开多个对话框的单窗口模式?

PyQt5学习--基本窗口控件--QMainWindow

如何在pyqt5中的两个窗口之间传递参数?

pyqt5-基本窗口控件

pyqt5 继承python类可以传递信号函数吗

PyQt5快速入门PyQt5基本窗口组件