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

