Internationalization (translation) of dialog and the main window in a pyqt5 application

后端 未结 1 994
日久生厌
日久生厌 2021-01-26 20:07

I am trying to translate my small application written in pyside2/pyqt5 to several languages, for example, Chinese. After googling, I managed to change the main window to Chinese

相关标签:
1条回答
  • 2021-01-26 20:42

    You have to overwrite the changeEvent() method and call retranslateUi() when the event is of type QEvent::LanguageChange, on the other hand the QTranslator object must be a member of the class but it will be deleted and it will not exist when the changeEvent() method is called.

    Finally assuming that the Language menu is used to establish only translations, a possible option is to establish the name of the .qm as data of the QActions and to use the triggered method of the QMenu as I show below:

    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)
    
    0 讨论(0)
提交回复
热议问题