qt5_create_translation与lupdate工具行为差异问题排查
问题分析与解决:qt5_create_translation无法保留TS文件原有翻译信息
你的问题根源在于qt5_create_translation宏的设计逻辑:它会将指定的TS文件标记为自定义命令的输出文件,CMake在执行该命令前会自动删除已存在的TS文件,导致lupdate无法读取原有文件的翻译注释和已翻译条目,只能从头提取所有字符串,造成全部条目被识别为新内容。
而手动运行lupdate时,TS文件始终存在,工具可以基于已有内容做增量更新,自然能正确识别新增/过时条目。
解决方案
放弃使用qt5_create_translation,改用自定义命令调用lupdate更新TS文件,再配合qt5_add_translation生成QM文件,这样既能保留原有TS文件的翻译信息,又能集成到CMake构建流程中:
# 自定义命令:更新已有TS文件(而非重新生成) add_custom_command( OUTPUT gui/translations/translation.source.ts COMMAND ${Qt5_LUPDATE_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR} -ts gui/translations/translation.source.ts -locations none -no-ui-lines -no-obsolete DEPENDS ${CMAKE_CURRENT_SOURCE_DIR} # 源目录变化时触发更新 COMMENT "Updating translation source file..." ) # 将TS文件编译为QM文件 qt5_add_translation(QM_OUTPUT gui/translations/translation.source.ts) # 将QM文件添加到目标资源(根据你的项目需求调整) add_executable(YourTarget ...) target_sources(YourTarget PRIVATE ${QM_OUTPUT})
补充说明
qt5_create_translation更适合从零开始生成TS文件的场景,而非更新已有翻译文件;- 上述配置中,
${Qt5_LUPDATE_EXECUTABLE}是CMake自动查找的lupdate路径,无需手动指定; - 如果需要扫描多个源目录/文件,可以在
${CMAKE_CURRENT_SOURCE_DIR}后添加更多路径。
内容的提问来源于stack exchange,提问作者Mickaël C. Guimarães
相关产品推荐
相关产品推荐

