设置文件路径(*.ts)
SET( translation_file_list
# # 美语
"${CMAKE_HOME_DIRECTORY}/srcs/translations/${current_dir_name}_en.ts"
# # 汉语
"${CMAKE_HOME_DIRECTORY}/srcs/translations/${current_dir_name}_zh_CN.ts"
)
以上语句把需要“自动创建”的文件路径存储到 translation_file_list 变量当中。
设置输出路径(*.pm)
SET_SOURCE_FILES_PROPERTIES(${translation_file_list}
PROPERTIES OUTPUT_LOCATION "${CMAKE_HOME_DIRECTORY}/builder/${CMAKE_BUILD_TYPE}_${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}_${CMAKE_CXX_COMPILER_ID}/progress/translations")
把 translation_file_list 变量当中的所有文件中的 OUTPUT_LOCATION 设置为 “${CMAKE_HOME_DIRECTORY}/builder/${CMAKE_BUILD_TYPE}_${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}_${CMAKE_CXX_COMPILER_ID}/progress/translations”。"前者"受 qt_add_translations() 影响,将会把 *.pm 输出到 “后者" 目录当中。
生成 *.ts 编译到 *.pm 的编译脚本
ADD_CUSTOM_TARGET(${current_dir_name})
qt_add_translations(
${current_dir_name}
TS_FILES
${translation_file_list}
)
此时的项目并没有生成任何的 *.pm,但可以看到的是,存在对应的 *.ts 文件。
当然的,还能看到关于 *.pm 的生成脚本(从 *.ts 编译到 *.pm 的过程)
ADD_CUSTOM_TARGET()
当 qt_add_translations() 调用时,它需要一个可用的目标实现依赖。此时若没有可实现目标,可以使用 ADD_CUSTOM_TARGET() 来实现一个虚假的目标。
形如 qt_add_executable()、qt_add_plugin()、 qt_add_library()、add_library()、add_executable() 都可以生成一个目标,但 qt_add_executable()、qt_add_plugin()、 qt_add_library() 作为 qt 生成的一部分,标准 cmake 并不包含其中。只有 add_library()、add_executable()、ADD_CUSTOM_TARGET() 可以作为 cmake 的标准生成目标。
调用函数并不受大小写影响,但参数是必须按照大小写限制的。
qt_add_translations()
该函数可以为 TS_FILES 参数编译不同的 *.ts 但它受项目 “引用的源文件” 影响,也就是说,目标依赖的 “源文件” 将会是它默认的翻译目标,如果需要添加其它的 “源文件”,可以使用 SOURCES 参数
SOURCES 参数
FILE(GLOB_RECURSE SRC_LIST
${CMAKE_HOME_DIRECTORY}/srcs/*.cpp
${CMAKE_HOME_DIRECTORY}/srcs/*.cxx
${CMAKE_HOME_DIRECTORY}/srcs/*.c
${CMAKE_HOME_DIRECTORY}/srcs/*.h
${CMAKE_HOME_DIRECTORY}/srcs/*.hpp
${CMAKE_HOME_DIRECTORY}/srcs/*.hxx
)
ADD_CUSTOM_TARGET(${current_dir_name})
SET_SOURCE_FILES_PROPERTIES(${translation_file_list}
PROPERTIES OUTPUT_LOCATION "${CMAKE_HOME_DIRECTORY}/builder/${CMAKE_BUILD_TYPE}_${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}_${CMAKE_CXX_COMPILER_ID}/progress/translations")
qt_add_translations(
${current_dir_name}
TS_FILES ${translation_file_list}
SOURCES ${SRC_LIST}
)
FILE() 函数满足匹配的文件路径都存储到 SRC_LIST 当中。而新的 qt_add_translations() 则把这些 “找到的文件” 都打包到新生成的 *.ts 当中,
LUPDATE_OPTIONS 参数
加入到 lupdate 编译脚本的参数
如下
qt_add_translations(
${current_dir_name}
TS_FILES ${translation_file_list}
SOURCES ${SRC_LIST}
LUPDATE_OPTIONS -no-obsolete
)
该调用则会把 “源” 不存在的翻译给删除(当上次源文件经过生成的 *.ts 位置代码被更改以后,则会出现一些不可编辑的翻译文本,这些文本会一直保留在 *.ts 当中,除非使用了 -no-obsolete 选项)
LRELEASE_OPTIONS 参数
加入到 lrelease 编译脚本的参数
生成 *.pm
以 vs 为例,设当前目标为 QReptileIntroduce
lupdate 后缀为更新 *.ts 文件(源文件更新时需要运行该工具)
lrelease 后缀为更新 *.pm 文件(*.ts更新时需要运行该工具)
不存在后缀,生成时则会自动调用 以上两者。
此时你将会看到 *.pm 被输出到 OUTPUT_LOCATION 设置的对应路径之下。
完整案例
FIND_PACKAGE( Qt6 REQUIRED COMPONENTS
Core
LinguistTools
)
# # 获取当前文件夹名,并且保存到 current_dir_name 变量当中
STRING( REGEX REPLACE ".*/(.*)" "\\1" current_dir_name ${CMAKE_CURRENT_SOURCE_DIR} )
# # 需要生成的 *.ts 文件保存到 translation_file_list 变量当中
SET( translation_file_list
# # 美语
"${CMAKE_HOME_DIRECTORY}/srcs/translations/${current_dir_name}_en.ts"
# # 汉语
"${CMAKE_HOME_DIRECTORY}/srcs/translations/${current_dir_name}_zh_CN.ts"
)
# # 递归查找当前目录下所有源文件(匹配方式,SRC_LIST 变量后的参数表示匹配参数),并且保存到 SRC_LIST 变量当中
FILE(GLOB_RECURSE SRC_LIST
${CMAKE_HOME_DIRECTORY}/srcs/*.cpp
${CMAKE_HOME_DIRECTORY}/srcs/*.cxx
${CMAKE_HOME_DIRECTORY}/srcs/*.c
${CMAKE_HOME_DIRECTORY}/srcs/*.h
${CMAKE_HOME_DIRECTORY}/srcs/*.hpp
${CMAKE_HOME_DIRECTORY}/srcs/*.hxx
${CMAKE_HOME_DIRECTORY}/srcs/*.ui
)
# # 定义一个虚伪目标
ADD_CUSTOM_TARGET(${current_dir_name})
# # 设置 *.pm 的输出位置
SET_SOURCE_FILES_PROPERTIES(${translation_file_list}
PROPERTIES OUTPUT_LOCATION "${CMAKE_HOME_DIRECTORY}/builder/${CMAKE_BUILD_TYPE}_${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}_${CMAKE_CXX_COMPILER_ID}/progress/translations")
# # 生成 *.ts 和 *.pm 的脚本任务
qt_add_translations(
${current_dir_name}
TS_FILES ${translation_file_list}
SOURCES ${SRC_LIST}
LUPDATE_OPTIONS -no-obsolete
)
其他
qt_add_translations() 的 QM_FILES_OUTPUT_VARIABLE 参数
qt_add_translations(
${current_dir_name}
TS_FILES ${translation_file_list}
SOURCES ${SRC_LIST}
LUPDATE_OPTIONS -no-obsolete
QM_FILES_OUTPUT_VARIABLE qm_files
)
把输出的文件输出到 qm_files 当中。
以下作为官方案例解释
qt_add_translations(business_logic
TS_FILES myapp_fi.ts
QM_FILES_OUTPUT_VARIABLE qm_files)
install(FILES ${qm_files} DESTINATION "translations")
该行为生成一个 “安装” 字样的项目发生在项目列表当中,除此以外,“编译” 会与 “安装” 同时诞生不同的 *.pm。 除非使用者把 OUTPUT_LOCATION 与 ”安装“ 目标设置为一致,以覆盖形式控制文件的唯一性。
同样的。还有 RESOURCE_PREFIX 参数会诞生一个 “副本”
qt_add_translations(frogger_game
TS_FILES frogger_game_no.ts
RESOURCE_PREFIX "/translations")