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

Qt/QML国际化(i18n)翻译加载失败问题求助

Qt 6.7中qsTrId国际化翻译无法加载问题排查求助

问题描述

在示例项目中使用qsTrId实现国际化(i18n)时,翻译无法正常加载——QML对话框元素仅显示qsTrId值(如press-me、hello-world),而非预期的翻译文本,请求排查问题。

环境与已执行操作

  • 开发环境:Visual Studio 2022社区版、Qt 6.7
  • 已完成操作:
    • 配置项目、编辑翻译文件
    • 执行以下CMake命令更新与生成翻译:
      cmake --build ..\build-QtExampleApp-Desktop_Qt_6_7_0_MSVC2019_64bit-Debug\ --target update_translations
      
      cmake --build ..\build-QtExampleApp-Desktop_Qt_6_7_0_MSVC2019_64bit-Debug\ --target release_translations
      

相关代码与配置

主函数翻译加载代码

最初尝试硬编码加载_en翻译(原注释循环会匹配系统默认的en-US,但未准备该翻译,疑问:Qt是否会自动映射_en到en-US?):

int main(int argc, char *argv[])
{
    set_qt_environment();

    QGuiApplication app(argc, argv);

    QTranslator translator;
    if ( translator.load(":/i18n/QtExampleApp_en") ) {
        QCoreApplication::installTranslator(&translator);
    }
    /*const QStringList uiLanguages = QLocale::system().uiLanguages();
    for (const QString &locale : uiLanguages) {
        const QString baseName = "QtExampleApp_" + QLocale(locale).name();
        if (translator.load(":/i18n/" + baseName)) {
            app.installTranslator(&translator);
            break;
        }
    }*/


    QQmlApplicationEngine engine;
    const QUrl url(u"qrc:/qt/qml/Main/main.qml"_qs);
    QObject::connect(
        &engine,
        &QQmlApplicationEngine::objectCreated,
        &app,
        [url](QObject *obj, const QUrl &objUrl) {
            if (!obj && url == objUrl)
                QCoreApplication::exit(-1);
        },
        Qt::QueuedConnection);

    engine.addImportPath(QCoreApplication::applicationDirPath() + "/qml");
    engine.addImportPath(":/");



    engine.load(url);

    if (engine.rootObjects().isEmpty()) {
        return -1;
    }

    return app.exec();
}

CMakeLists.txt翻译配置

qt_add_translations(TARGETS QtExampleApp
    TS_FILE_DIR i18n
)

2024-04-20调试更新

使用注释段的循环代码调试:

QTranslator translator;

const QStringList uiLanguages = QLocale::system().uiLanguages();

for (const QString &locale : uiLanguages) {
    const QString baseName = "QtExampleApp_" + QLocale(locale).name();
    if (translator.load(":/i18n/" + baseName)) {
        app.installTranslator(&translator);
        break;
    }
}

系统首选语言为en-US,调试发现:

  • Qt尝试在路径C:/appdev/Qt/6.7.0/msvc2019_64/translations加载翻译
  • 调用QTranslator::load时locale的country和language为null,最终尝试加载C:/appdev/Qt/6.7.0/msvc2019_64/translations/qt_en.qm
  • 将QtExampleApp.qm放到该路径也无效

若指定en-US locale调用translator.load(locale, ":/i18n/" + baseName),则会尝试查找资源:/i18n/QtExampleApp_en_US/en-US.qm,传入函数的变量为:

  • filename = "en-US"
  • directory = ":/i18n/QtExampleApp_en_US"
  • search_delimiters = ""
  • suffix = ""

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 03:34:54