Qt国际化和CMake:如何更新*.ts并且不会丢失它们

Sto*_*orm 9 qt cmake qt5

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})
Run Code Online (Sandbox Code Playgroud)

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

但是我希望改进这个并获得两个自动生成的自定义目标.一个用于将新字符串从源添加到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)
)
Run Code Online (Sandbox Code Playgroud)

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

也许我的方向错了,你怎么解决这个问题:容易更新ts并且不会丢失它们make clean

Jan*_*Jan 2

要解决该make clean问题,请添加子目录 ( ADD_SUBDIRECTORY(translations)) 并添加SET_DIRECTORY_PROPERTIES(PROPERTIES CLEAN_NO_CUSTOM 1)到包含的 CMakeLists.txt 中。请参阅此处的示例。

对于问题的第二部分,有两种可能的方法。要么使用FILE(WRITE <filename> "QT5_CREATE_TRANSLATION(QM_FILES ${SOURCE_DIR}/src/app ${TRANSLATIONS} OPTIONS -I ${SOURCE_DIR}/src)"),然后COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_SOURCE_DIR} -DTRANSLATIONS=${TRANSLATIONS} <filename>在 add_custom_target 中使用。我怀疑是否有一种检索 QM_FILES 内容的好方法。第二个选项是创建两个额外的子目录,每个子目录都有一个 QT5_CREATE_TRANSLATIONS 和一个 ADD_CUSTOM_TARGET 调用。