如何在PyQt5上动态更改语言(翻译)?

时间:2018-11-17 08:42:09

标签: python pyqt pyqt4 pyqt5 qt-linguist

我想知道是否可以在不使用qt设计器制作UI的情况下动态更改语言(翻译)?这意味着我不想使用功能retranslateUi()来更新程序接口。

这是我的代码,但是我被卡在标记为#1#2#3的行上。不知道我应该用什么来更新界面。

{{1}}

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

简短回答:不必使用Qt Designer

长回答:

您不必使用Qt Designer,而应使用相同的技术,即创建一种可以称为retranslateUi()的方法,并在其中使用translate()而不是{{1 }}(有关更多详细信息,请阅读the docs)。更改语言时调用该方法必须使用tr()事件。例如,在您的情况下,代码如下:

changeEvent()

然后生成.ts:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class Demo(QtWidgets.QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.button = QtWidgets.QPushButton()
        self.label = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)

        self.combo = QtWidgets.QComboBox(self)
        self.combo.currentIndexChanged.connect(self.change_func)

        self.trans = QtCore.QTranslator(self)

        self.v_layout = QtWidgets.QVBoxLayout(self)
        self.v_layout.addWidget(self.combo)
        self.v_layout.addWidget(self.button)
        self.v_layout.addWidget(self.label)

        options = ([('English', ''), ('français', 'eng-fr' ), ('中文', 'eng-chs'), ])

        for i, (text, lang) in enumerate(options):
            self.combo.addItem(text)
            self.combo.setItemData(i, lang)
        self.retranslateUi()

    @QtCore.pyqtSlot(int)
    def change_func(self, index):
        data = self.combo.itemData(index)
        if data:
            self.trans.load(data)
            QtWidgets.QApplication.instance().installTranslator(self.trans)
        else:
            QtWidgets.QApplication.instance().removeTranslator(self.trans)

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

    def retranslateUi(self):
        self.button.setText(QtWidgets.QApplication.translate('Demo', 'Start'))
        self.label.setText(QtWidgets.QApplication.translate('Demo', 'Hello, World'))

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

然后使用Qt语言学家进行翻译。

最后是.qm:

pylupdate5 main.py  -ts eng-chs.ts
pylupdate5 main.py  -ts eng-fr.ts

enter image description here

enter image description here

enter image description here

您找到的完整项目here

答案 1 :(得分:0)

没有,您将不必使用Qt Designer与retranslateUi一样的技术,因为Qt小部件系统无法自行重做转换(否则QT Designer将使用该方法)。

构建这样一个系统将需要对小部件进行根本性的更改,因为您需要知道每个字符串属性都包含一个可翻译的字符串(而不是数据值),并且知道用于查找新翻译的原始字符串将是最好(逆向翻译可能不明确)。