Qt国际化和CMake:如何更新*.ts文件而不丢失它们。

9

我有一个 CMakeLists.txt 文件,位于翻译文件 (*.ts) 的目录中:

SET(TRANSLATIONS
    lang_de.ts
    lang_en.ts
)

FIND_PACKAGE(Qt5LinguistTools)
QT5_ADD_TRANSLATION(QM_FILES ${TRANSLATIONS})
SET(QM_FILES ${QM_FILES} PARENT_SCOPE)
ADD_CUSTOM_TARGET (translations ALL DEPENDS ${QM_FILES})

它从指定的*.ts文件中构建*.qm文件。

但我想改进它,并获取两个自定义目标,这些目标不会自动构建。 其中一个用于将源中的新字符串附加到ts文件中,另一个用于刷新ts。最后一个将从源更新ts并从ts中删除过时的字符串。

我尝试在上面的行之后添加此内容:

ADD_CUSTOM_TARGET (
    ts_append
    COMMAND QT5_CREATE_TRANSLATION(QM_FILES ${CMAKE_SOURCE_DIR}/src/app ${TRANSLATIONS} OPTIONS -I ${CMAKE_SOURCE_DIR}/src)
)

ADD_CUSTOM_TARGET (
    ts_refresh
    COMMAND QT5_CREATE_TRANSLATION(QM_FILES ${CMAKE_SOURCE_DIR}/src/app ${TRANSLATIONS} OPTIONS -no-obsolete -I ${CMAKE_SOURCE_DIR}/src)
)

但是似乎我不能在自定义目标中使用QT5_CREATE_TRANSLATION宏,是吗?

也许我走错了路,你会如何解决这个问题:轻松更新ts并在make clean后不丢失它们?

1个回答

2
为了解决“make clean”问题,需要添加一个子目录(ADD_SUBDIRECTORY(translations))并在包含的CMakeLists.txt中添加SET_DIRECTORY_PROPERTIES(PROPERTIES CLEAN_NO_CUSTOM 1)。有关示例,请参见此处
对于您问题的第二部分,有两种可能的方法。一种是使用FILE(WRITE <filename> "QT5_CREATE_TRANSLATION(QM_FILES ${SOURCE_DIR}/src/app ${TRANSLATIONS} OPTIONS -I ${SOURCE_DIR}/src)"),然后在add_custom_target中使用COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_SOURCE_DIR} -DTRANSLATIONS=${TRANSLATIONS} <filename>。不过我怀疑是否有好的方法来检索QM_FILES的内容。 第二个选项是创建两个额外的子目录,每个子目录都有一个QT5_CREATE_TRANSLATIONS和ADD_CUSTOM_TARGET调用。

SET_DIRECTORY_PROPERTIES(PROPERTIES CLEAN_NO_CUSTOM TRUE) 带有子目录对我不起作用(使用CMake 3.2.1):您发布的链接不可用,因此也许您可以详细说明如何使其工作。虽然如果我在顶层文件中指定 SET_DIRECTORY_PROPERTIES(PROPERTIES CLEAN_NO_CUSTOM TRUE),它是有效的。但我确实希望删除所有其他生成的文件,所以这对我来说是一种解决方法。 - Florian Wolters
文件已经被移动了,我将其放在gist中并更新了链接。 - Jan
谢谢您的回答,@Jan!我不得不推迟这个项目的工作,现在也没有配置好的开发环境来检查您的建议。我会尽快尝试并接受您的答案。 - Storm
1
此解决方案仅适用于Makefile生成器,根据https://cmake.org/cmake/help/latest/prop_dir/CLEAN_NO_CUSTOM.html文档。 - B3ret

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接