PySide:在没有 ui.retranslateUi 的情况下在运行时动态更改语言
PySide: Dynamically change language at runtime without ui.retranslateUi
我有一个简单的程序,我想在运行时切换语言。
由于 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_())
如 here 所述使用 ui.retranslateUi 的解决方案要短得多。是否有类似于不使用 .ui 时的解决方案
GUI 的文件?
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
文件,您将不得不自己创建一个等同于上述 ui 的文件。
我有一个简单的程序,我想在运行时切换语言。 由于 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_())
如 here 所述使用 ui.retranslateUi 的解决方案要短得多。是否有类似于不使用 .ui 时的解决方案 GUI 的文件?
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
文件,您将不得不自己创建一个等同于上述 ui 的文件。