PySide:在没有ui.retranslateUi的情况下在运行时动态更改语言

时间:2016-09-16 08:54:45

标签: qt dynamic runtime translation pyside

我有一个简单的程序,我想在运行时切换语言。 由于GUI没有使用QtDesigner,因此我没有.ui文件,因此我无法使用ui.retranslateUi。我目前解决这个问题的方法是每次发生语言更改事件时在每个Widget上手动调用setText:

from PySide.QtCore import *
from PySide.QtGui import *
import sys


class Simple(QPushButton):
    def __init__(self):
        super().__init__('translate-me')
        self.translator = QTranslator()
        self.clicked.connect(self.switchLanguage)
        self.show()

    def changeEvent(self, event):
        if event.type() == QEvent.Type.LanguageChange:
            self.setText(self.tr('translate-me'))

    def switchLanguage(self):
        self.translator.load('translation-file')
        QApplication.installTranslator(self.translator)


app = QApplication(sys.argv)
simple = Simple()
sys.exit(app.exec_())

使用ui.retranslateUi解决方案here所述的解决方案要短得多。是否有类似于不使用.ui时的解决方案 用于GUI的文件?

1 个答案:

答案 0 :(得分:3)

retranslateUi方法仅影响从ui文件创建的对象。因此,为了提供完整的解决方案,必须在ui文件中设置需要重新转换的每个字符串。在其他地方添加的任何字符串都需要完全独立的处理。

以下是retranslateUi方法的示例:

def retranslateUi(self, Window):
    self.fileMenu.setTitle(QtGui.QApplication.translate("Window", "&File", None, QtGui.QApplication.UnicodeUTF8))
    self.helpMenu.setTitle(QtGui.QApplication.translate("Window", "&Help", None, QtGui.QApplication.UnicodeUTF8))
    self.fileQuit.setText(QtGui.QApplication.translate("Window", "&Quit", None, QtGui.QApplication.UnicodeUTF8))
    self.fileQuit.setShortcut(QtGui.QApplication.translate("Window", "Ctrl+Q", None, QtGui.QApplication.UnicodeUTF8))
    self.helpAbout.setText(QtGui.QApplication.translate("Window", "&About", None, QtGui.QApplication.UnicodeUTF8))
    self.helpAboutQt.setText(QtGui.QApplication.translate("Window", "About &Qt", None, QtGui.QApplication.UnicodeUTF8))

正如您所看到的,它所做的只是在它知道的受影响对象上调用setText(或其他)。没有魔法参与。它只是由pyside-uic工具生成的样板代码。

如果您不能使用ui文件,则必须自己创建与上述内容相同的内容。