qt 中使用 cmake 构建语言包(*.ts 与 *.pm)

设置文件路径(*.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")

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值