Python - 在 PyQt4 应用程序中动态切换翻译

标签 python pyqt4 translation

我想在我的程序中添加一个功能。用户应该能够在运行时切换/更改语言 - 无需重新启动。想象一下 UI 显示为英语,而他想切换为德语。

嗯,我写了一个小例子 - 无法执行,因为你丢失了一些翻译文件和 ui 文件。但我需要你的帮助——为了合乎逻辑。这是我当前的代码。

import sys
from PyQt4.uic import loadUi
from PyQt4.QtCore import Qt, QFile, QMetaObject
from PyQt4 import QtCore
from PyQt4.QtGui import QMainWindow, QApplication

class Test_Window(QMainWindow):
    def __init__(self,
                 app):
        QMainWindow.__init__(self, parent=None)

        UI_PATH = QFile("testlangs.ui")

    # save reference to app for later
        self._app = app

        # Load ui dynamically
        UI_PATH.open(QFile.ReadOnly)
        self.ui = loadUi(UI_PATH, self)
        UI_PATH.close()

        self.init_current_language()
        self.init_connect_menu_item()


    def init_current_language(self):
        self.current_translator = QtCore.QTranslator(self._app)
        self.current_translator.load("langs_en")
        self._app.installTranslator(self.current_translator)


    def init_connect_menu_item(self):
        self.actionDeutsch.triggered.connect(lambda: self.change_language("langs_de"))
        self.actionEnglish.triggered.connect(lambda: self.change_language("langs_en"))


    # Change the language to German
    def change_language(self, language):
        self._app.removeTranslator(self.current_translator)
        self.current_translator = QtCore.QTranslator(self._app)
        self.current_translator.load(language)
        self._app.installTranslator(self.current_translator)
        self.retranslateUi(self.ui)

现在,我遇到一些问题:

首先:我无法调用并执行 retranslateUi() 方法。 “问题”是我在运行时动态加载 ui 文件。这个方法是生成的 ui 文件的一部分。这意味着,ui 文件被转换为 py 文件。在那里你会找到retranslateUi()方法。

我能做什么?

简单又肮脏的方式看起来像:

def retranslateUi(self, MainWindow):
    MainWindow.setWindowTitle(self._app.translate("MainWindow", "MainWindow", None, self._app.UnicodeUTF8))
    self.nameLabel.setText(self._app.translate("MainWindow", "Name", None, self._app.UnicodeUTF8))
    self.ageLabel.setText(self._app.translate("MainWindow", "Age", None, self._app.UnicodeUTF8))
    self.menuMenu.setTitle(self._app.translate("MainWindow", "File", None, self._app.UnicodeUTF8))
    self.menuEdit.setTitle(self._app.translate("MainWindow", "Edit", None, self._app.UnicodeUTF8))
    self.menuLanguage.setTitle(self._app.translate("MainWindow", "Language", None, self._app.UnicodeUTF8))
    self.actionOpen.setText(self._app.translate("MainWindow", "Open", None, self._app.UnicodeUTF8))
    self.actionSave.setText(self._app.translate("MainWindow", "Save", None, self._app.UnicodeUTF8))
    self.actionClear.setText(self._app.translate("MainWindow", "Clear", None, self._app.UnicodeUTF8))
    self.actionEnglish.setText(self._app.translate("MainWindow", "English", None, self._app.UnicodeUTF8))
    self.actionDeutsch.setText(self._app.translate("MainWindow", "Deutsch", None, self._app.UnicodeUTF8))

我通过从生成的用户界面复制此方法来重新实现缺少的方法。这种肮脏的方式工作得很好,但我认为这不是优雅的解决方案。

还有其他优雅的方法来解决这个问题吗?

最佳答案

使用loadUiType加载 ui 文件,该文件将为您提供创建子类所需的基类和 ui 类。与您之前的方法一样,这将导致所有子窗口小部件成为主窗口的属性,并且您还可以调用 self.retranslateUi(self) :

from PyQt4.uic import loadUiType

UiClass, BaseClass = loadUiType('testlangs.ui')

class Test_Window(BaseClass, UiClass):
    def __init__(self, app):
        super(Test_Window, self).__init__(parent=None)

        self.setupUi(self)

        # save reference to app for later
        self._app = app

        self.init_current_language()
        self.init_connect_menu_item()

关于Python - 在 PyQt4 应用程序中动态切换翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39734775/

相关文章:

python - Django中Manytomany字段自定义显示对象

python - Flask-ReSTLess GET 请求抛出 SQLAlchemy 错误

xcode - 通过 xCode 构建阶段自动下载 POEditor 翻译

qt - 如何在 QGraphicsPolygonItem 中添加 QInputDialog.getText 文本?

python - 如何通过 Python 使用 Android 'IP Webcam' 应用程序

Android:无法以编程方式启动 "Google Voice Typing"

symfony - JMS 翻译包@Ignore

python - 在 distutils 中重命名脚本文件

python - 如何在 Python 中创建多个(但单独的)空列表?

python - 输入数据后 QComboxBox 值没有改变