Qt Quick应用中qsTr()字符串无法翻译的问题求助
Qt Quick多语言切换失效问题排查与解决
问题描述
按照官方步骤创建极简多语言Qt Quick应用,构建运行正常,但点击切换语言按钮后,qsTr()包裹的字符串无翻译效果。构建时的Vulkan相关警告、QtQml私有头文件警告不影响运行,但翻译切换完全失效。
系统环境
- 操作系统:Windows 11
- Qt版本:6.8.1 MinGW 64-bit
- 构建命令:
cmake.exe --build C:/Users/<MyName>/Desktop/QT_Projects/multilingual_demo/build/Desktop_Qt_6_8_1_MinGW_64_bit-Debug --target all multilingual_demo_lrelease multilingual_demo_lupdate
核心代码文件
Main.qml
import QtQuick import QtQuick.Controls Window { width: 640 height: 480 visible: true title: "Basic Multilingual App" // We choose the app title to be language indifferent Component.onCompleted: Qt.uiLanguage = "en" // Set the UI language to English (so that we all start in the same place) Column { anchors.centerIn: parent spacing: 10 Text { id: stringToTranslate //: Example string to translate text: qsTr("This string must be translated on button click") } Button { id: translateText //: Clicking this button translates the text fields text: qsTr("Translate text") onClicked: { Qt.uiLanguage = Qt.uiLanguage === "en" ? "de" : "en" // If UI is English translate to German. Else translate to English console.log(Qt.uiLanguage) // Print the UI language to console so we can monitor its changes } } } }
main.cpp
#include <QGuiApplication> #include <QQmlApplicationEngine> int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; QObject::connect( &engine, &QQmlApplicationEngine::objectCreationFailed, &app, []() { QCoreApplication::exit(-1); }, Qt::QueuedConnection); engine.loadFromModule("BasicMultilingualApp", "Main"); return app.exec(); }
CMakeLists.txt
cmake_minimum_required(VERSION 3.16) project(BasicMultilingualApp VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt6 REQUIRED COMPONENTS Quick LinguistTools) qt_standard_project_setup(REQUIRES 6.5 I18N_TRANSLATED_LANGUAGES de_DE) qt_add_executable(appBasicMultilingualApp main.cpp ) qt_add_qml_module(appBasicMultilingualApp URI BasicMultilingualApp VERSION 1.0 QML_FILES Main.qml ) qt_add_translations(appBasicMultilingualApp TS_FILE_BASE qml TS_FILE_DIR i18n RESOURCE_PREFIX qt/qml/BasicMultilingualApp/i18n LRELEASE_OPTIONS -idbased ) # Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1. # If you are developing for iOS or macOS you should consider setting an # explicit, fixed bundle identifier manually though. set_target_properties(appBasicMultilingualApp PROPERTIES # MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appBasicMultilingualApp MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} MACOSX_BUNDLE TRUE WIN32_EXECUTABLE TRUE ) target_link_libraries(appBasicMultilingualApp PRIVATE Qt6::Quick ) include(GNUInstallDirs) install(TARGETS appBasicMultilingualApp BUNDLE DESTINATION . LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} )
qml_de_DE.ts(i18n文件夹下)
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.1" language="de_DE"> <context> <name>Main</name> <message> <location filename="../Main.qml" line="19"/> <source>This string must be translated on button click</source> <extracomment>Example string to translate</extracomment> <translation>Diese Zeichenfolge muss beim Klicken auf die Schaltfläche übersetzt werden</translation> </message> <message> <location filename="../Main.qml" line="25"/> <source>Translate text</source> <extracomment>Clicking this button translates the text fields</extracomment> <translation>Text übersetzen</translation> </message> </context> </TS>
解决方法
1. 修正翻译文件资源路径配置
当前qt_add_translations中的RESOURCE_PREFIX设置可能导致Qt无法正确识别翻译文件路径,移除该参数或调整为简化路径:
qt_add_translations(appBasicMultilingualApp TS_FILE_BASE qml TS_FILE_DIR i18n # 移除RESOURCE_PREFIX,让Qt默认处理路径 LRELEASE_OPTIONS -idbased )
2. 手动触发QML组件翻译更新
修改Qt.uiLanguage后,已加载的QML组件不会自动重新翻译,需绑定uiLanguageChanged信号触发组件更新:
修改Main.qml,添加Connections组件:
Window { // ... 原有代码 ... Component.onCompleted: Qt.uiLanguage = "en" Connections { target: Qt function onUiLanguageChanged() { stringToTranslate.retranslate() translateText.retranslate() } } // ... 原有代码 ... }
3. 确保翻译文件正确编译
检查构建目录的i18n文件夹下是否生成了qml_de_DE.qm文件,若未生成,重新执行multilingual_demo_lrelease目标,确保.ts文件被编译为.qm并嵌入资源。
4. 完善CMake语言配置
在qt_standard_project_setup中添加英文作为基础语言,确保默认语言翻译被正确处理:
qt_standard_project_setup(REQUIRES 6.5 I18N_TRANSLATED_LANGUAGES en de_DE)
内容的提问来源于stack exchange,提问作者DvanHuyssteen
相关产品推荐
相关产品推荐

