qt国际化翻译功能用法

发布于:2025-05-07 ⋅ 阅读:(14) ⋅ 点赞:(0)


更多精彩内容
👉内容导航 👈
👉Qt开发经验 👈

1 概述

在 Qt 中,ts 文件和 qm 文件是用于国际化和本地化的关键文件。以下是它们的详细说明:

ts 文件

  • 用途: ts 文件是 Qt 的翻译源文件,存储了应用程序中需要翻译的字符串及其翻译内容。
  • 格式: 它是基于 XML 的文本文件,便于编辑和版本控制。
  • 内容:
    • 包含原始字符串(source)和翻译后的字符串(translation)。
    • 还可能包含上下文(context)信息,用于区分不同模块中的相同字符串。
  • 生成方式:
    • 使用 Qt 提供的工具 lupdate 从源代码中提取需要翻译的字符串,生成 .ts 文件。
    • 示例命令:lupdate myproject.pro -ts translations/myproject_zh_CN.ts
  • 编辑方式:
    • 可以使用 Qt 提供的翻译工具 Qt Linguist 进行翻译。
    • 也可以手动编辑,因为它是 XML 格式。

qm文件

  • 用途: qm 文件是 Qt 的翻译二进制文件,供应用程序运行时加载使用。
  • 格式: 它是 .ts 文件的编译版本,体积更小,加载速度更快。
  • 生成方式:
    • 使用 Qt 提供的工具 lrelease.ts 文件编译为 .qm 文件。
    • 示例命令:lrelease translations/myproject_zh_CN.ts

文件对比

特性 TS文件 QM文件
可编辑性 可人工编辑 不可编辑
文件格式 XML文本 二进制
生成阶段 开发阶段 构建/发布阶段
文件大小 较大(含元数据) 较小(优化存储)
运行时依赖 不需要 必需
环境 说明
系统 windows11
Qt 5.14.2、6.8
IDE qtcreator14

2 设置待翻译文本

  1. 创建一个Qt工程;

    在这里插入图片描述

  2. 在UI文件中添加的文本都可以被翻译;

    在这里插入图片描述

  3. 如果在QObject类的子类中,需要使用tr()包含文本才可以被翻译;

    在这里插入图片描述

  4. 如果在普通函数、或者不是QObject子类的类中,就不能直接使用tr()函数包含待翻译的文本了,可以使用下面几种方式;

    在这里插入图片描述

3 生成ts翻译源文件

方法1:

  • 鼠标右键【添加新文件】;

    在这里插入图片描述

  • 选择【Qt】【Qt Translation File】;

    在这里插入图片描述

  • 选择语言,例如下图中选择English就可以将Qt中文本翻译位英文。

    在这里插入图片描述

方法2:

  • 打开.pro文件,添加如下所示代码,建议文件名包含语言和地区的代码(zh_CNen_US等),会更加名称中缩写推理出适用于什么语言翻译。

    TRANSLATIONS += \
        untitled9_en_US.ts\
        a_zh_CN.ts\
        b_zh_CN.ts
    
  • 然后鼠标选择【工具】【外部】【Linguist】【lupdate】;

    在这里插入图片描述

  • 就可以在工程路径下生成对应的ts文件了;

    在这里插入图片描述

4 编辑ts翻译源文件

  1. 鼠标选择ts文件,右键【Qt语言家】打开ts文件;

    在这里插入图片描述

  2. 如下图所示,Qt UI界面中的文本或者使用tr() QCoreApplication::translate()包含的文件就可以在语言家中呈现。

    在这里插入图片描述

  3. 然后如下图所示,将中文文本翻译为英文文本,填入对应位置;

    在这里插入图片描述

  4. 填写完翻译后,点击工具栏中的,就可以将选中的文本标记为已完成。

    在这里插入图片描述

5 生成qm翻译二进制文件

  1. 编写完成ts文件后,鼠标点击【工具】【外部工具】【Linguist】【lrelease】,就可以将ts文件生成为qm文件。

    在这里插入图片描述

  2. 生成的qm文件如下所示;

    在这里插入图片描述

6 加载qm翻译文件进行翻译

  • 如下所示,使用QTranslator加载qm翻译文件;

    #include "widget.h"
    
    #include <QApplication>
    #include <QDebug>
    #include <QTranslator>
    
    int main(int argc, char* argv[])
    {
        QApplication a(argc, argv);
        QTranslator translator;
        if (translator.load("E:/test/untitled9/untitled9_en_US.qm"))
        {
            qDebug() << "加载成功";
            QCoreApplication::installTranslator(&translator);
        }
        else
        {
            qDebug() << "加载失败";
        }
        qDebug() << "main函数1";
        qDebug() << QObject::tr("main函数2");
        qDebug() << QCoreApplication::tr("main函数3", "描述信息");
        qDebug() << QCoreApplication::translate("main", "main函数4");
        qDebug() << QCoreApplication::translate("main", "main函数5", "描述信息");
    
        Widget w;
        w.show();
        return a.exec();
    }
    
    
  • 注意:

    • 必须先调用installTranslator()再创建UI对象;
    • 多个翻译器会叠加生效,后加载的优先;
  • 也可以使用QString locale = QLocale::system().name(); // 获取系统语言,例如 "zh_CN"获取操作系统语言来选中使用的qm文件;

  • 加载qm翻译文件成功后如下所示,在ts文件中填写了翻译信息的就会被翻译。

    在这里插入图片描述

  • 如果在程序运行时动态切换语言,需要调用 retranslateUi() 方法刷新界面。例如:

    ui->retranslateUi(this);
    



网站公告

今日签到

点亮在社区的每一天
去签到