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

相关推荐
海兰5 小时前
【 Python 量化交易】第3章:金融基础概念
开发语言·python·金融
一木 之林5 小时前
三.C++ 内存管理(进阶)(二)
开发语言·arm开发·c++
吴声子夜歌5 小时前
Java——类、对象及方法(一)
java·开发语言
阿里嘎多学长5 小时前
2026-08-29 GitHub 热点项目精选
开发语言·程序员·github·代码托管
এ慕ོ冬℘゜5 小时前
JavaScript学习心得:从只会语法,到真正会写业务逻辑
开发语言·javascript·ecmascript
2601_966949656 小时前
五档盘口数据对量化交易有什么价值?从信号判断到策略风险的完整分析
开发语言·人工智能·python·数据分析·量化·股票数据·quantdash
小吴学不废Java6 小时前
Python 基础语法
开发语言·python
小镇敲码人6 小时前
【深入浅出】之Qt 事件系统实战:鼠标、键盘、滚轮、窗口与定时器事件
数据库·qt·网络协议·mysql·http
布莱克6056 小时前
队列详解:定义、分类、应用场景及与栈的区别(C/C++ 代码讲解)
c语言·开发语言·c++·队列
CPETW6 小时前
USB TO I2C_(Excel)_Scan ---- 1000KHz总线速率测试_A
c语言·开发语言·网络·科技·单片机