pyqt5 应用程序中对话和主要 window 的国际化(翻译)
Internationalization (translation) of dialog and the main window in a pyqt5 application
我正在尝试将我用 pyside2/pyqt5 编写的小应用程序翻译成多种语言,例如中文。谷歌搜索后,我设法从菜单 -> 语言 -> 中文中将 window 后的 select 更改为中文。但是,菜单 -> 选项中的弹出对话框仍然是英文版本。翻译信息似乎没有传输到对话框中。我该如何解决?
基本上,我在设计器中创建了两个 ui 文件并转换为两个 python files:One mainui.py 和一个 dialogui.py .然后,我使用
将两个 python 文件转换为一个 *.ts 文件
pylupdate5 -verbose mainui.py dialogui.py -ts zh_CN.ts
之后,在linguist中输入翻译词。我可以看到对话框中的项目,这意味着此信息没有丢失。然后我将文件作为 zh_CN.qm 文件发布。我使用 google 驱动器在下面附加了所有这些支持文件。
Supporting files for the question
主文件如
import os
import sys
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)
self.retranslateUi(self)
class MainWindow(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.actionConfigure.triggered.connect(self.showdialog)
self.actionChinese.triggered.connect(self.change_lang)
def showdialog(self):
dlg = OptionsDialog(self)
dlg.exec_()
def change_lang(self):
trans = QtCore.QTranslator()
trans.load('zh_CN')
QtCore.QCoreApplication.instance().installTranslator(trans)
self.retranslateUi(self)
if __name__=='__main__':
app = QtWidgets.QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
ret = app.exec_()
sys.exit(ret)
我认为这应该是一个典型的任务,因为几乎没有应用程序只会有一个 mainwindow.
你必须覆盖 changeEvent()
方法并在事件类型为 QEvent::LanguageChange
时调用 retranslateUi()
,另一方面 QTranslator
对象必须是成员class 的,但调用 changeEvent()
方法时,它将被删除并且不存在。
最后假设语言菜单仅用于创建翻译,一个可能的选择是将 .qm 的名称设置为 QAction
s 的数据并使用 QMenu
如下所示:
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)
我正在尝试将我用 pyside2/pyqt5 编写的小应用程序翻译成多种语言,例如中文。谷歌搜索后,我设法从菜单 -> 语言 -> 中文中将 window 后的 select 更改为中文。但是,菜单 -> 选项中的弹出对话框仍然是英文版本。翻译信息似乎没有传输到对话框中。我该如何解决?
基本上,我在设计器中创建了两个 ui 文件并转换为两个 python files:One mainui.py 和一个 dialogui.py .然后,我使用
将两个 python 文件转换为一个 *.ts 文件pylupdate5 -verbose mainui.py dialogui.py -ts zh_CN.ts
之后,在linguist中输入翻译词。我可以看到对话框中的项目,这意味着此信息没有丢失。然后我将文件作为 zh_CN.qm 文件发布。我使用 google 驱动器在下面附加了所有这些支持文件。
Supporting files for the question
主文件如
import os
import sys
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)
self.retranslateUi(self)
class MainWindow(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.actionConfigure.triggered.connect(self.showdialog)
self.actionChinese.triggered.connect(self.change_lang)
def showdialog(self):
dlg = OptionsDialog(self)
dlg.exec_()
def change_lang(self):
trans = QtCore.QTranslator()
trans.load('zh_CN')
QtCore.QCoreApplication.instance().installTranslator(trans)
self.retranslateUi(self)
if __name__=='__main__':
app = QtWidgets.QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
ret = app.exec_()
sys.exit(ret)
我认为这应该是一个典型的任务,因为几乎没有应用程序只会有一个 mainwindow.
你必须覆盖 changeEvent()
方法并在事件类型为 QEvent::LanguageChange
时调用 retranslateUi()
,另一方面 QTranslator
对象必须是成员class 的,但调用 changeEvent()
方法时,它将被删除并且不存在。
最后假设语言菜单仅用于创建翻译,一个可能的选择是将 .qm 的名称设置为 QAction
s 的数据并使用 QMenu
如下所示:
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)