PySide2+QML环境下双端属性支持lupdate识别的动态翻译实现咨询
实现方案
你之前的写法核心问题在于QT_TR_NOOP仅用于编译期标记静态字符串供lupdate提取,不会触发运行期翻译,也无法响应retranslate()事件。要实现需求可以按照以下步骤调整:
1. Python端代码修改
不需要改动属性的返回逻辑,仅需要用QT_TRANSLATE_NOOP标记字符串到指定翻译上下文,方便lupdate识别即可,属性可保持constant配置:
import sys import os import inspect from PySide2.QtGui import QGuiApplication from PySide2.QtQml import QQmlApplicationEngine from PySide2.QtCore import QObject, Property, QStandardItemModel, QTranslator, QT_TRANSLATE_NOOP class example_model(QObject): def __init__(self, parent=None): super().__init__(parent=parent) self._model = QStandardItemModel() @Property(str, constant=True) def python_property(self): # 标记字符串到AppContext翻译上下文,供lupdate提取 return QT_TRANSLATE_NOOP("AppContext", "Example String") def main(): app = QGuiApplication(sys.argv) # 新增翻译加载逻辑 translator = QTranslator() # 替换为你的qm文件路径 if translator.load("zh_CN.qm"): app.installTranslator(translator) engine = QQmlApplicationEngine() context = engine.rootContext() model = example_model(parent=context) context.setContextProperty("exampleModel", model) engine.load(QUrl.fromLocalFile(os.path.join(os.path.dirname(inspect.getfile(lambda: None)), "main.qml"))) # 切换语言时执行以下代码即可动态更新 # app.removeTranslator(translator) # translator.load("en_US.qm") # app.installTranslator(translator) # engine.retranslate() return app.exec_() if __name__ == '__main__': sys.exit(main())
2. QML端代码修改
使用qsTranslate/qsTr包裹需要翻译的内容,属性如果需要全局复用则通过Qt.binding绑定翻译函数,确保翻译切换时自动更新:
import QtQuick 2.12 import QtQuick.Controls 2.12 ApplicationWindow { id: root width: 200 height: 400 visible: true // 用Qt.binding绑定翻译函数,retranslate时自动更新属性值 property string qmlProperty: Qt.binding(() => qsTr("exampleString")) Text{ // 从指定翻译上下文读取Python端返回的源字符串并翻译 text: qsTranslate("AppContext", exampleModel.python_property) } Text{ text: root.qmlProperty } }
3. 提取与编译翻译文件
执行以下命令即可同时扫描Python和QML文件中的翻译标记,生成翻译源文件:
lupdate main.py main.qml -ts zh_CN.ts en_US.ts
用Qt Linguist打开ts文件完成翻译后,执行以下命令生成可加载的qm二进制文件:
lrelease zh_CN.ts en_US.ts
调用engine.retranslate()后,所有绑定了qsTr/qsTranslate的文本和属性会自动全量刷新,不需要额外编写更新逻辑。
内容的提问来源于stack exchange,提问作者thsolyt
相关产品推荐
相关产品推荐

