Qt6 CMake 中引入 Qt Linguist 翻译功能

qt cmake 使用自带翻译工具配置步骤

  • 创建Qt CMake 程序
    • 配置项目 CMake 及 代码
    • 使用流程
    • 最终CMake 如下
    • 最终工程链接为:
    • 参考

创建Qt CMake 程序

配置项目 CMake 及 代码

  1. 在CMake 中添加如下代码, 导入相关的翻译库
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets LinguistTools)  #jimbo tr
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets LinguistTools) #jimbo tr
  1. 继续进行必要步骤
set(TS_FILES ${CMAKE_SOURCE_DIR}/${PROJECT_NAME}_zh_CN.ts) #jimbo tr
qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES}) #jimbo tr
  1. 将添加到 source 里面,方便在Qt creator 里面查看
#jimbo tr
set(PROJECT_SOURCES
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
        ${TS_FILES}
)
  1. 在CMake的最后添加如下代码, 作用是找出lupdate 和 lrelease 的 可执行文件的路径,并在执行CMake的时候,会自动执行lupdate 和 lrelease 的功能。
#jimbo tr
find_program(LUPDATE_EXECUTABLE lupdate)
find_program(LRELEASE_EXECUTABLE lrelease)
message("lupdate:" ${LUPDATE_EXECUTABLE})
message("lrelease: "${LRELEASE_EXECUTABLE})
execute_process(
    COMMAND ${LUPDATE_EXECUTABLE} -recursive ${CMAKE_SOURCE_DIR} -ts ${TS_FILES}
)
execute_process(
    COMMAND ${LRELEASE_EXECUTABLE} ${TS_FILES}
)
  1. 在 app 构建结束后,将代码目录的qtTrans_zh_CN.qm的二进制文件拷贝到 build 的exe 目录
add_custom_command(
    TARGET ${PROJECT_NAME}
    POST_BUILD
    COMMAND  "${CMAKE_COMMAND}" -E copy "${CMAKE_SOURCE_DIR}/${PROJECT_NAME}_zh_CN.qm" ${CMAKE_CURRENT_BINARY_DIR}
)
  1. main.cpp 文件导入代码如下
#include "mainwindow.h"

#include <QApplication>
#include <QLocale>
#include <QTranslator>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTranslator translator;
    // 工作目录为 可执行文件的 exe所在的 目录
    auto isSue =  translator.load("qtTrans_zh_CN.qm", QCoreApplication::applicationDirPath());
    a.installTranslator(&translator);

    MainWindow w;
    w.show();
    return a.exec();
}

使用流程

  1. 在 ui 文件随便添加几个 button 和 label
    在这里插入图片描述
  2. 在 mainwindow.cpp 中随便加几个tr(。。。) 包裹的文字
    auto testStr = tr("not good");
    qDebug() << "not good > " << testStr << QCoreApplication::applicationDirPath();
  1. 重新执行下 CMake 文件。 这时qtTrans_zh_CN.ts 会将 代码里面所有待翻译的 字符串导入到当前文件
    在这里插入图片描述
  2. qtTrans_zh_CN.ts 文件用 Qt Linguist 编辑
    在这里插入图片描述
  3. 翻译字符串填好好,标记为 完成
    在这里插入图片描述
  4. 再次编译 CMake 文件,这时候lrelease 会将 qtTrans_zh_CN.ts 转换成 qtTrans_zh_CN.qm,并存储在 当前代码的文件夹里面
  5. 编译运行程序。这时会将代码目录的 qtTrans_zh_CN.qm 拷贝到 exe 所在目录
  6. 运行程序,QTranslator 会 加载 exe 目录的 qtTrans_zh_CN.qm翻译。
  7. 实际显示文本为翻译后的文本在这里插入图片描述

最终CMake 如下

cmake_minimum_required(VERSION 3.5)

project(qtTrans VERSION 0.1 LANGUAGES CXX)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

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

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets LinguistTools)  #jimbo tr
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets LinguistTools) #jimbo tr

set(TS_FILES ${CMAKE_SOURCE_DIR}/${PROJECT_NAME}_zh_CN.ts) #jimbo tr
qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES}) #jimbo tr

#jimbo tr
set(PROJECT_SOURCES
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
        ${TS_FILES}
)

qt_add_executable(${PROJECT_NAME}
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
)


target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

set_target_properties(${PROJECT_NAME} PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

install(TARGETS ${PROJECT_NAME}
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(${PROJECT_NAME})
endif()

#jimbo tr
find_program(LUPDATE_EXECUTABLE lupdate)
find_program(LRELEASE_EXECUTABLE lrelease)
message("lupdate:" ${LUPDATE_EXECUTABLE})
message("lrelease: "${LRELEASE_EXECUTABLE})
execute_process(
    COMMAND ${LUPDATE_EXECUTABLE} -recursive ${CMAKE_SOURCE_DIR} -ts ${TS_FILES}
)
execute_process(
    COMMAND ${LRELEASE_EXECUTABLE} ${TS_FILES}
)

add_custom_command(
    TARGET ${PROJECT_NAME}
    POST_BUILD
    COMMAND  "${CMAKE_COMMAND}" -E copy "${CMAKE_SOURCE_DIR}/${PROJECT_NAME}_zh_CN.qm" ${CMAKE_CURRENT_BINARY_DIR}
)

最终工程链接为:

https://github.com/goldWave/QT_Demo/tree/main/qtcreator_translate_demo

参考

https://blog.csdn.net/weixin_44488341/article/details/135929421

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/907748.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android IPC机制(一)多进程模式

1. 什么是进程&#xff1f; 进程是操作系统分配资源&#xff08;如 CPU、内存等&#xff09;的基本单位。简单来说&#xff0c;进程是一个正在执行的程序的实例。每个进程都有自己的内存空间、数据栈和其他辅助数据&#xff0c;用于跟踪进程的执行状态。在 Android 中&#xff…

SQL,力扣题目1767,寻找没有被执行的任务对【递归】

一、力扣链接 LeetCode_1767 二、题目描述 表&#xff1a;Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…

《JVM第3课》运行时数据区

无痛快速学习入门JVM&#xff0c;欢迎订阅本免费专栏 运行时数据区结构图如下&#xff1a; 可分为 5 个区域&#xff0c;分别是方法区、堆区、虚拟机栈、本地方法栈、程序计数器。这里大概介绍一下各个模块的作用&#xff0c;会在后面的文章展开讲。 类加载子系统会把类信息…

[ 问题解决篇 ] 解决远程桌面安全登录框的问题

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Vue+element-ui实现网页右侧快捷导航栏 Vue实现全局右侧快捷菜单功能组件

Vue+element-ui实现网页右侧快捷导航栏 Vue实现全局右侧快捷菜单功能组件 可视区域没超过当前屏幕高度时候只显示三个菜单效果 可视区域超过当前屏幕高度时,显示可回到顶部菜单的,当然这个菜单显示条件可以自定义,根据需求设置 然后将这个整体功能创建为一个全局组件 代…

苏州金龙新V系客车创新引领旅游出行未来

10月25日&#xff0c;为期三天的“2024第六届旅游出行大会”在风景秀丽的云南省丽江市落下帷幕。本次大会由中国旅游车船协会主办&#xff0c;全面展示了中国旅游出行行业最新发展动态和发展成就&#xff0c;为旅游行业带来全新发展动力。 在大会期间&#xff0c;备受瞩目的展车…

看门狗电路原理与应用

看门狗的原理与应用 看门狗基本原理 看门狗&#xff0c;英文简称为“Watchdog Timer ”或者“Watchdog”&#xff1b; 本质上就是一个定时器的作用&#xff0c;简单理解就是 MCU发出一个周期性的信号&#xff0c;这个信号是满足看门狗芯片内部计时器的时间限制&#xff0c;则…

Caché/IRIS file2Xml 一个将文件转换成Studio导出的xml格式的工具

file2Xml 一个将文件转换成Studio导出的xml格式的工具 通过此工具可以将本地文件转换成xml格式文件&#xff0c;然后通过Studio导入到服务器中&#xff0c;而不再需要其他工具将文件传至服务器。 下面以为ensemble2016自带的一个示例界面增加背景图为例。 http://localhos…

java项目之教师工作量管理系统源码(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的教师工作量管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 教师工作量管理系统的…

外贸平台开发多语言处理的三种方式

随着全球贸易的不断增长&#xff0c;外贸平台的多语言处理已成为提升用户体验和市场竞争力的重要因素。在开发外贸平台时&#xff0c;有多种方法可以实现多语言支持。本文将探讨三种主要的多语言处理方式&#xff1a;数据库级多语言支持、前端国际化框架以及内容管理系统&#…

《Python网络安全项目实战》项目2 Python基础练习_总复习(1)

《Python网络安全项目实战》项目2 Python基础练习 总复习&#xff08;1&#xff09; 班级&#xff1a; 姓名&#xff1a; 实训成绩&#xff1a; 任务单成绩 &#xff1a; 输入用户名密码并将其输出打印。 userName _____________________ passWord ______________________ #输…

Linux——Ubuntu环境C编程

配置vim编辑器 设置一个tab键为4个空格 打开/etc/vim/vimrc文件&#xff0c;此文件为只读&#xff0c;所以要用sudo访问boot权限&#xff1a; set ts4&#xff08;设置一个tab键为4空格&#xff09; set nu&#xff08;vim编辑器下显示行号&#xff09; gcc编译器 gcc命令…

Java毕业设计-基于微信小程序的校园二手物品交易系统的实现(V2.0)

博主介绍&#xff1a;✌stormjun、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

WPF+MVVM案例实战(十九)- 自定义字体图标按钮的封装与实现(EF类)

文章目录 1、案例效果1、按钮分类2、E类按钮功能实现与封装1.文件创建与代码实现2、样式引用与封装 3、F类按钮功能实现与封装1、文件创建与代码实现2、样式引用与封装 3、按钮案例演示1、页面实现与文件创建2、运行效果如下 4、源代码获取 1、案例效果 1、按钮分类 在WPF开发…

各地级市能源消耗量数据-基于灯光数据的反演(2000-2022年)

今天带来的数据是的全国各省市能源消耗量数据&#xff0c;省级的能源消耗量数据可以在统计年鉴之中查到&#xff0c;但市级的数据却暂无统计。但今天我们基于一篇论文提供的思路&#xff0c;通过夜间灯光与省级能源消耗量对更小尺度的地区能源消耗量进行反算。原文提供1995-200…

告别登录,这款插件直接复制CSDN内容,真棒!

前言 我们在开发过程中&#xff0c;肯定会遇到这样或者那样的问题&#xff0c;这时候&#xff0c;我们想到最多的就是用搜索引擎去搜索各种资料&#xff0c;查看各种博客。以前&#xff0c;查看博客是很方便的&#xff0c;不过后来&#xff0c;像CSDN的&#xff0c;就是必须要…

ssm《数据库系统原理》课程平台的设计与实现+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容…

Altium Designer使用技巧(三)

PCB规则 1、间距规则 间距一般>6mil。 2、线宽规则 线宽规则>6mil,一般10mil&#xff1b; 电源线宽>15mil,般20mil; 3、过孔规则。 一般孔与盘的关系&#xff0c;盘是孔的2倍。 比如孔是12mil,盘是24mil。 如果过孔没按规则的话&#xff0c;点右上角设置或DP&…

[自动化测试:实践02-01]:Selenium整合Autoit:自动调用百度识图

前置准备 https://blog.csdn.net/Abraxs/article/details/142905693 [自动化测试&#xff1a;WebDriver]&#xff1a;AutoIt安装 https://blog.csdn.net/Abraxs/article/details/142931813 [自动化测试&#xff1a;Selenium]&#xff1a;环境部署和Webdriver的使用 一&#x…

服务器数据恢复—RAID5阵列中部分成员盘重组RAID5阵列后如何恢复原raid5阵列数据?

服务器数据恢复环境&#xff1a; 一台服务器挂接一台存储&#xff0c;该存储中有一组由5块硬盘组建的RAID5阵列。 服务器故障&#xff1a; 存储raid5阵列中有一块硬盘掉线。由于RAID5的特性&#xff0c;阵列并没有出现问题。工作一段时间后&#xff0c;服务器出现故障&#xff…