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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 19:57:03