Qt6 CMake中如何将QML模块源文件加入qt_add_translations?
问题描述
我在使用CMake搭建Qt6应用的翻译文件时遇到了问题,以下以QML文件为例说明:
- 项目采用子模块组织:根项目
appTestLocalization包含Main.qml,MyModule子模块位于MyModule目录下,包含MyText.qml,两个QML文件都有qsTr()调用。 - 根项目CMakeLists.txt中添加了
qt_add_translations:
qt_add_translations(appTestLocalization TS_FILES i18n/lang_fr_FR.ts)
- 执行
update_translations或appTestLocalization_lupdate后,生成的.ts文件仅包含Main.qml的翻译内容。 - 尝试添加
INCLUDE_DIRECTORIES MyModule、给lupdate加-recursive参数均无效;在子模块中单独添加qt_add_translations会覆盖根项目的翻译内容;手动用SOURCES指定文件维护成本太高,希望找到更便捷的方式将模块文件纳入翻译流程。
解决方案
方法1:子模块传递翻译源到根项目
在MyModule的CMakeLists.txt中收集模块内的源文件,并传递给根项目:
# MyModule/CMakeLists.txt # 递归收集模块内所有需要翻译的文件(可根据实际调整后缀) file(GLOB_RECURSE MY_MODULE_TRANSLATE_FILES *.qml *.cpp *.h) # 将收集到的文件传递到父作用域,供根项目使用 set(TRANSLATION_SOURCES ${TRANSLATION_SOURCES} ${MY_MODULE_TRANSLATE_FILES} PARENT_SCOPE)
根项目CMakeLists.txt中使用这个全局变量:
# 根项目CMakeLists.txt qt_add_translations(appTestLocalization SOURCES ${TRANSLATION_SOURCES} Main.qml TS_FILES i18n/lang_fr_FR.ts )
后续模块新增文件时会自动被收集,无需手动修改根项目配置。
方法2:利用Qt目标属性关联翻译源
在子模块的CMakeLists.txt中,给模块目标设置QT_TRANSLATION_SOURCES属性:
# MyModule/CMakeLists.txt # 假设模块是QML模块 qt_add_qml_module(mymodule URI MyModule VERSION 1.0 QML_FILES MyText.qml ) # 将模块的QML文件添加到翻译源属性中 set_property(TARGET mymodule PROPERTY QT_TRANSLATION_SOURCES MyText.qml)
根项目中只需在qt_add_translations里指定模块目标:
# 根项目CMakeLists.txt qt_add_translations(appTestLocalization TS_FILES i18n/lang_fr_FR.ts TARGETS mymodule )
TARGETS参数会让lupdate自动扫描指定目标关联的所有翻译源文件,包括QML模块内的内容。
方法3:根项目递归收集所有翻译源
如果项目结构清晰,可直接在根项目递归收集所有需要翻译的文件:
# 根项目CMakeLists.txt # 递归收集项目内所有需要翻译的文件,可添加EXCLUDE排除不需要的目录 file(GLOB_RECURSE ALL_TRANSLATE_FILES *.qml *.cpp *.h # EXCLUDE_FROM_ALL third_party/* ) qt_add_translations(appTestLocalization SOURCES ${ALL_TRANSLATE_FILES} TS_FILES i18n/lang_fr_FR.ts )
这种方式最简洁,但要注意排除第三方库或不需要翻译的文件,避免引入冗余内容。
内容的提问来源于stack exchange,提问作者Ben Pyton
相关产品推荐
相关产品推荐

