添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

7 人关注

我想知道是否有可能在不使用qt设计器制作用户界面的情况下动态地改变语言(翻译)?这意味着我不想使用函数retranslateUi()来更新程序界面。

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

import sys
from PyQt5.QtCore import Qt, QTranslator
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabel, 
QComboBox, QVBoxLayout
class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.button = QPushButton(self.tr('Start'), self)
        self.label = QLabel(self.tr('Hello, World'), self)
        self.label.setAlignment(Qt.AlignCenter)
        self.combo = QComboBox(self)
        self.combo.addItem('English')
        self.combo.addItem('中文')
        self.combo.addItem('français')
        self.combo.currentTextChanged.connect(self.change_func)
        self.trans = QTranslator(self)
        self.v_layout = QVBoxLayout()
        self.v_layout.addWidget(self.combo)
        self.v_layout.addWidget(self.button)
        self.v_layout.addWidget(self.label)
        self.setLayout(self.v_layout)
    def change_func(self):
        print(self.combo.currentText())
        if self.combo.currentText() == '中文':
            self.trans.load('eng-chs')
            _app = QApplication.instance()
            _app.installTranslator(self.trans)
        elif self.combo.currentText() == 'français':
            self.trans.load('eng-fr')
            _app = QApplication.instance()
            _app.installTranslator(self.trans)
        else:
            _app = QApplication.instance()
            _app.removeTranslator(self.trans) 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

希望得到任何帮助。

python
pyqt
pyqt4
pyqt5
qt-linguist
just_be_happy
just_be_happy
发布于 2018-11-17
2 个回答
eyllanesc
eyllanesc
发布于 2018-11-17
已采纳
0 人赞同

TL; DR; 没有必要使用Qt Designer

你不一定要使用Qt Designer,但你应该使用同样的技术,也就是说,创建一个可以被称为 retranslateUi() 的方法,并在其中使用 translate() 而不是 tr() 来设置文本(更多细节请阅读 the docs ).当你为它改变语言时,调用该方法必须使用 changeEvent() 事件。例如,在你的案例中,代码如下。

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_())

然后生成.ts。

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

然后用Qt Linguist来做翻译。

最后是.qm。

lrelease eng-fr.ts eng-chs.qm