ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

cmake之Qt国际化

2022-04-21 22:31:06  阅读:216  来源: 互联网

标签:bin 国际化 cmake Qt ts TS set dir NAME


概述

  • 实验通过版本, Qt5, cmake-3.23
  • 参考
  • cmake中不会涉及到linguist的操作
  • 当生成ts文件后, 手动使用linguist工具翻译好即可

核心代码

  • 已经做好宏。 直接copy就能用
macro(_create_qm_file_ target_name qt_bin_dir  TS_FILES bin_qrc_dir update_src_dir)
        
        set(update_all_ts_files ${target_name}_update_all_ts_files)
        set(create_all_qm_files ${target_name}_create_all_qm_files)

        add_custom_target(${update_all_ts_files} ALL)
        add_custom_target(${create_all_qm_files} ALL)



        IF (CMAKE_SYSTEM_NAME MATCHES "Linux")
                find_file(LUPDATE_PATH lupdate ${qt_bin_dir})
                find_file(LRELEASE_PATH lrelease ${qt_bin_dir})
        ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Windows")
                find_file(LUPDATE_PATH lupdate.exe ${qt_bin_dir})
                find_file(LRELEASE_PATH lrelease.exe ${qt_bin_dir})
        endif()


        foreach(TS_FILE ${TS_FILES})

                # 把zh_CN.ts中的zh_CN提取出来
                get_filename_component(LOCAL_LANGUAGE_NAME ${TS_FILE} NAME_WE)

                set(TS_TARGET_NAME "${target_name}_update_ts_file_${LOCAL_LANGUAGE_NAME}")

                add_custom_target(${TS_TARGET_NAME}
                        COMMAND ${LUPDATE_PATH} ${update_src_dir} -ts ${TS_FILE}
                        VERBATIM)

                # 将update_ts_file_<NAME>添加为update_all_ts_files的依赖,下同
                add_dependencies(${update_all_ts_files} ${TS_TARGET_NAME})

                set(QM_TARGET_NAME "${target_name}_create_qm_file_${LOCAL_LANGUAGE_NAME}")
                set(QM_FILE "${bin_qrc_dir}/${LOCAL_LANGUAGE_NAME}.qm")

                add_custom_target(${QM_TARGET_NAME}
                        COMMAND ${LRELEASE_PATH} ${TS_FILE} -qm ${QM_FILE}
                        VERBATIM)

                # 因为得先有ts文件才能生成qm文件,所以把构建ts文件的目标作为自己的依赖
                add_dependencies(${QM_TARGET_NAME} ${TS_TARGET_NAME})
                add_dependencies(${create_all_qm_files} ${QM_TARGET_NAME})


                MESSAGE("aaa=${create_all_qm_files}")
                IF (NOT EXISTS ${QM_FILE})
                        message("a=${TS_FILE}")
                        # message("b=${}")
                endif()

        endforeach()
endmacro( )

宏解释

  • target_name - 哪个项目
  • qt_bin_dir - qt的安装目录,用于寻找 lupdate 和 lrease, 以windows为例,我这里传递qt_bin_dir, 指向本机Qt的安装路径
set(CMAKE_PREFIX_PATH "C:/major/development/tools/qt/5.14/install/5.14.2/msvc2015_64")
set(qt_bin_dir
  ${CMAKE_PREFIX_PATH}/bin
)
  • TS_FILES - 项目的TS文件列表
  • bin_qrc_dir - 编译目录下的qrc文件的路径, 参考中将qrc拷贝到了 build 目录下
  • update_src_dir - 指向当需要更新ts文件的目录

使用范例

_create_qm_file_(${PROJECT_NAME} ${qt_bin_dir} ${TS_FILES} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src )
  • 根据生成的项目, 就能增量更新ts文件了,下面以VS项目为例,执行后的项目如下

一个完整的cmakelists.txt

cmake_minimum_required(VERSION 3.18)

project(cmake_demo01 LANGUAGES CXX)

set(CMAKE_PREFIX_PATH "C:/major/development/tools/qt/5.14/install/5.14.2/msvc2015_64")

set(qt_bin_dir
  ${CMAKE_PREFIX_PATH}/bin
)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(QT_VERSION 5)
set(REQUIRED_LIBS Core Gui Widgets)
set(REQUIRED_LIBS_QUALIFIED Qt5::Core Qt5::Gui Qt5::Widgets)

find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED)


# =========================================================
# 语言家文件
# =========================================================
set(TS_FILES ${CMAKE_SOURCE_DIR}/lang/zh_CN.ts)


macro(_create_qm_file_ target_name qt_bin_dir  TS_FILES bin_qrc_dir update_src_dir)
        set(update_all_ts_files ${target_name}_update_all_ts_files)
        set(create_all_qm_files ${target_name}_create_all_qm_files)

        add_custom_target(${update_all_ts_files} ALL)
        add_custom_target(${create_all_qm_files} ALL)

        IF (CMAKE_SYSTEM_NAME MATCHES "Linux")
                find_file(LUPDATE_PATH lupdate ${qt_bin_dir})
                find_file(LRELEASE_PATH lrelease ${qt_bin_dir})
        ELSEIF (CMAKE_SYSTEM_NAME MATCHES "Windows")
                find_file(LUPDATE_PATH lupdate.exe ${qt_bin_dir})
                find_file(LRELEASE_PATH lrelease.exe ${qt_bin_dir})
        endif()

        foreach(TS_FILE ${TS_FILES})
                # 把zh_CN.ts中的zh_CN提取出来
                get_filename_component(LOCAL_LANGUAGE_NAME ${TS_FILE} NAME_WE)
                set(TS_TARGET_NAME "${target_name}_update_ts_file_${LOCAL_LANGUAGE_NAME}")
                add_custom_target(${TS_TARGET_NAME}    COMMAND ${LUPDATE_PATH} ${update_src_dir} -ts ${TS_FILE} VERBATIM)

                # 将update_ts_file_<NAME>添加为update_all_ts_files的依赖,下同
                add_dependencies(${update_all_ts_files} ${TS_TARGET_NAME})

                set(QM_TARGET_NAME "${target_name}_create_qm_file_${LOCAL_LANGUAGE_NAME}")
                set(QM_FILE "${bin_qrc_dir}/${LOCAL_LANGUAGE_NAME}.qm")

                add_custom_target(${QM_TARGET_NAME}  COMMAND ${LRELEASE_PATH} ${TS_FILE} -qm ${QM_FILE}    VERBATIM)

                # 因为得先有ts文件才能生成qm文件,所以把构建ts文件的目标作为自己的依赖
                add_dependencies(${QM_TARGET_NAME} ${TS_TARGET_NAME})
                add_dependencies(${create_all_qm_files} ${QM_TARGET_NAME})
        endforeach()
endmacro( )
# =========================================================

set(bin_trans_qrc trans.qrc)
configure_file(${bin_trans_qrc} ${CMAKE_CURRENT_BINARY_DIR})

file(GLOB_RECURSE src_file ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB_RECURSE inc_file ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)

add_executable(${PROJECT_NAME} ${src_file}  ${inc_file}  ${CMAKE_CURRENT_BINARY_DIR}/trans.qrc)

target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(cmake_demo01 PRIVATE Qt5::Widgets Qt5::Core Qt5::Gui)

_create_qm_file_(${PROJECT_NAME} ${qt_bin_dir} ${TS_FILES} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/src )

标签:bin,国际化,cmake,Qt,ts,TS,set,dir,NAME
来源: https://www.cnblogs.com/pandamohist/p/16176782.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有