CMake构建QT项目后未生成TS文件,如何创建翻译文件?
Qt翻译文件生成失败的问题分析与解决
现有CMake配置的错误点
- 变量名拼写错误:定义的目录变量是
TranslationDir,但引用时写成了TranslationsDir(多了一个s),导致TS文件路径无效。 qt5_create_translation语法错误:该命令的正确格式是qt5_create_translation(QM_FILES <源文件/目录> <TS文件列表>),原代码将源目录与TS文件错误拼接成一个参数,同时使用了未定义的TS_FILES变量(仅定义了TS_FILE)。- 冗余代码:重复定义了
TranslationDir和TS_FILE变量,无实际作用。
修正后的主CMakeLists.txt翻译配置部分
替换原文件末尾的翻译相关代码为以下内容:
# 翻译文件配置 set(TRANSLATION_DIR "${CMAKE_CURRENT_SOURCE_DIR}/langs") file(MAKE_DIRECTORY ${TRANSLATION_DIR}) # 定义要生成的TS文件列表 set(TS_FILES ${TRANSLATION_DIR}/en_EN.ts # 可添加其他语言,比如zh_CN.ts ) # 从项目根目录收集所有需要翻译的源文件(包含子目录) qt5_create_translation(QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${TS_FILES} ) # 将生成的QM文件添加到安装目标(可选,根据需求调整) install(FILES ${QM_FILES} DESTINATION ${TRANSLATION_DIR})
子目录(gui、model)的翻译处理
针对包含独立CMakeLists.txt的子目录,有两种处理方式:
方式1:主目录统一收集所有源文件
上述修正后的代码会自动扫描${CMAKE_CURRENT_SOURCE_DIR}下的所有子目录(包括gui、model),只要子目录中的源文件使用了Qt翻译宏(如tr()、QT_TR_NOOP()等),翻译文本就会被提取到TS文件中,无需修改子目录的CMake配置。
方式2:子目录单独处理翻译(适合模块化项目)
在gui和model的CMakeLists.txt中分别添加翻译配置,再将生成的文件传递到主目录:
- 在
gui/CMakeLists.txt中添加:
set(GUI_TS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../langs/en_EN_gui.ts) qt5_create_translation(GUI_QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${GUI_TS_FILES}) # 将TS/QM文件暴露给主目录 set(GUI_TS_FILES ${GUI_TS_FILES} PARENT_SCOPE) set(GUI_QM_FILES ${GUI_QM_FILES} PARENT_SCOPE)
- 在
model/CMakeLists.txt中添加类似配置,然后在主目录的翻译配置中合并所有TS文件:
set(TS_FILES ${TRANSLATION_DIR}/en_EN.ts ${GUI_TS_FILES} ${MODEL_TS_FILES} )
注意:此方式需确保add_subdirectory(gui)、add_subdirectory(model)在主目录翻译配置之前执行(原代码已满足该顺序)。
内容的提问来源于stack exchange,提问作者pablodepas87
相关产品推荐
相关产品推荐

