You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt中QTranslator仅在QMainWindow生效,QDialog无翻译效果问题

问题

我正在为PyQt应用实现多语言支持,已准备好各语言对应的*.qm文件,并在QApplication实例上安装了QTranslator。翻译器在主窗口(Main类,继承QMainWindow)中正常工作,但在Settings模态窗口(继承QDialog)中完全没有翻译效果。

相关代码

run.py

if __name__ == "__main__":
    app = QApplication([])

    translator = QTranslator()
    translator.load(resource_path(r'app_en.qm'))
    app.installTranslator(translator)

    if API.configs.language == 'fa':
        translator.load(resource_path('app_fa.qm'))
        app.installTranslator(translator)
    
    main_window = Main()
    main_window.show()
    app.exec()

main.py

class Main(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        ui_path = resource_path('views', 'main.ui')
        loadUi(ui_path, self)
        self.config = ConfigParser()
        self.config.read("MY_CONFIG_PATH")

        self.settings_btn.clicked.connect(self.open_settings_window)

    def open_settings_window(self):
        from forms.settings import Settings

        settings_window = Settings(self.config, parent=self)
        settings_window.exec()

settings.py

class Settings(QDialog):
    def __init__(self, config, parent=None):
        super(Settings, self).__init__(parent)
        ui_file_path = resource_path('views', 'settings.ui')
        loadUi(ui_file_path, self)

界面情况

  • Qt Designer设计的Settings窗口:包含需要翻译的标签、按钮等文本元素
  • 运行时界面:Settings窗口内的文本未被翻译,保持原始状态

我已确认所有需要翻译的文本都已包含在ts文件中,请问问题出在哪里?


解决方案

问题集中在翻译器加载逻辑和UI翻译触发时机上,以下是具体修复方案:

1. 修复翻译器重复加载的覆盖问题

在run.py中,你先加载app_en.qm并安装翻译器,之后如果语言为fa,又用同一个translator对象加载app_fa.qm并再次安装。这种操作会清空原有翻译内容,若app_fa.qm路径错误或加载失败,会导致翻译器无有效内容。

优化后的加载逻辑:

if __name__ == "__main__":
    app = QApplication([])
    translator = QTranslator()
    
    # 先判断目标语言,再加载对应qm文件,避免重复加载覆盖
    if API.configs.language == 'fa':
        translator.load(resource_path('app_fa.qm'))
    else:
        translator.load(resource_path(r'app_en.qm'))
    
    app.installTranslator(translator)
    
    main_window = Main()
    main_window.show()
    app.exec()

2. 确保Settings窗口UI加载时翻译器已生效

由于Settings模块是延迟导入(仅在点击按钮时才导入),可能导致loadUi加载UI时未正确触发翻译。可以通过两种方式修复:

  • 提前导入模块:在main.py顶部添加from forms.settings import Settings,避免延迟导入导致的翻译上下文问题
  • 手动触发翻译更新:在Settings窗口初始化后,主动调用翻译方法:
class Settings(QDialog):
    def __init__(self, config, parent=None):
        super(Settings, self).__init__(parent)
        ui_file_path = resource_path('views', 'settings.ui')
        loadUi(ui_file_path, self)
        # 手动触发翻译更新
        self.retranslateUi(self)

3. 额外检查点

  • 验证resource_path返回的app_fa.qm路径是否正确(可打印路径确认)
  • 检查ts文件的context节点,确认包含Settings窗口所有控件的文本
  • 确保用lrelease工具正确编译ts文件为qm,无编译错误

内容的提问来源于stack exchange,提问作者Yousef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:25:56