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
相关产品推荐
相关产品推荐

