Qt6 CMake 中引入 Qt Linguist 翻译功能

如果不想使用Qt自带的翻译功能

只需要简单集成翻译,可参考 自定义翻译

创建Qt CMake 程序

大体流程

配置项目 CMake 及 代码

  1. 在CMake 中添加如下代码, 导入相关的翻译库
bash 复制代码
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. 继续进行必要步骤
bash 复制代码
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 里面查看
bash 复制代码
#jimbo tr
set(PROJECT_SOURCES
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
        ${TS_FILES}
)
  1. 在CMake的最后添加如下代码, 作用是找出lupdate 和 lrelease 的 可执行文件的路径,并在执行CMake的时候,会自动执行lupdate 和 lrelease 的功能。
bash 复制代码
#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 目录
bash 复制代码
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 文件导入代码如下
bash 复制代码
#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
  1. 在 mainwindow.cpp 中随便加几个tr(。。。) 包裹的文字
bash 复制代码
    auto testStr = tr("not good");
    qDebug() << "not good > " << testStr << QCoreApplication::applicationDirPath();
  1. 重新执行下 CMake 文件。 这时qtTrans_zh_CN.ts 会将 代码里面所有待翻译的 字符串导入到当前文件
  1. qtTrans_zh_CN.ts 文件用 Qt Linguist 编辑
  1. 翻译字符串填好好,标记为 完成
  1. 再次编译 CMake 文件,这时候lrelease 会将 qtTrans_zh_CN.ts 转换成 qtTrans_zh_CN.qm,并存储在 当前代码的文件夹里面

  2. 编译运行程序。这时会将代码目录的 qtTrans_zh_CN.qm 拷贝到 exe 所在目录

  3. 运行程序,QTranslator 会 加载 exe 目录的 qtTrans_zh_CN.qm翻译。

  4. 实际显示文本为翻译后的文本

最终CMake 如下

bash 复制代码
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

https://blog.csdn.net/goldWave01/article/details/143469347?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogOpenSearchComplete%7ERate-5-143469347-blog-157644125.235%5Ev43%5Epc_blog_bottom_relevance_base2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogOpenSearchComplete%7ERate-5-143469347-blog-157644125.235%5Ev43%5Epc_blog_bottom_relevance_base2&utm_relevant_index=6

相关推荐
梁山好汉(Ls_man)9 分钟前
鸿蒙_ArkTS解决Duplicate function implementation错误
开发语言·华为·typescript·harmonyos·鸿蒙
xiaoshuaishuai812 分钟前
Git二分法定位Bug
开发语言·python
so2F32hj219 分钟前
一款Go语言Gin框架DDD脚手架,适合快速搭建项目
开发语言·golang·gin
LJianK144 分钟前
Java中的类、普通类,抽象类,接口的区别
java·开发语言
Dev7z1 小时前
基于MATLAB的5G物理层文本传输系统仿真与性能分析
开发语言·5g·matlab
小智社群1 小时前
贝壳获取小区的名称
开发语言·前端·javascript
lsx2024061 小时前
Python3 OS模块详解
开发语言
LiLiYuan.1 小时前
【Java线程 vs 虚拟机线程】
java·开发语言
FlDmr4i281 小时前
.NET 10 & C# 14 New Features 新增功能介绍-扩展成员Extension Members
开发语言·c#·.net
原来是猿1 小时前
Linux进程信号详解(三):信号保存
开发语言·c++·算法