gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 21:34:27 24 4
gpt4 key购买 nike

我想知道是否可以在不使用 qt 设计器制作 UI 的情况下动态更改语言(翻译)?这意味着我不想使用函数 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)
# 1

elif self.combo.currentText() == 'français':
self.trans.load('eng-fr')
_app = QApplication.instance()
_app.installTranslator(self.trans)
# 2

else:
_app = QApplication.instance()
_app.removeTranslator(self.trans)
# 3


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

任何帮助,将不胜感激。

最佳答案

TL;博士; 不需要使用 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
enter image description here
enter image description here
enter image description here
您找到的完整项目 here .

关于python - 如何在 PyQt5 上动态更改语言(翻译)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53349623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com