Qt 实现多国语言功能 — 01

Qt实现多国语言的过程需要有以下几点:

  • 代码中需要翻译的内容需要用 QObject::tr() 函数来包住。
  • UI上的字串只要让可翻译的选项被选中即可。
  • 翻译时需要创建 .ts 文件,该文件实际上为xml文本,可以直接打开。
  • Qt Linguist来打开以上的.ts文件并对需要的字串进行翻译。
  • 翻译完成后需要发布成.qm文件,该文件实际上为.ts文件的二进制样式,所占空间会小很多。
  • 然后在代码里通过 QTranslator的对象来加载以上生成的.qm文件,即可显示当前语言的内容。

1. 设置需要显示的字串内容。

将需要翻译的字串内容设置在UI上或者通过tr()来在代码中设置

  1. UI上需要设置具体的字串内容并保持可翻译的被选中。
  2. 代码中的需要翻译的内容需要用QObject::tr()来设置
ui.btn02->setText(tr("Test button 02"));
// 需要带参数进行格式化的字符串,可以使用如下的 arg()来进行操作
ui.lb02->setText(tr("My Label02, val=%1, name=%2").arg(106).arg("City"));

2. 生成 .ts文件

如果直接点击 Create New Translation File 可能会生成对应语言的 .ts文件,但是该文件却无法打开,且项目目录里面也没有该.ts文件。

需要在项目属性中的 Qt Transtation > Run Translation Tool During Build 处选择 lupdate 选项,表示在编译的时候会更新对应的.ts文件。保存该设置后,重新编译该项目,既可以在目录下生成对应的.ts文件。

3. 通过 Qt Linguist 来翻译 .ts文件中的字串为对应的内容

  1. 通过如下方式来启动 Qt Linguist

  2. Qt Linguist中打开需要进行翻译的所有.ts文件


  3. 对打开的文件进行翻译成对应的语言,带有参数的字串需要保持 %1等占位符不变。翻译过的字串点击工具栏中的绿色对勾,表示已经翻译完,对应的字串前会显示绿色的对勾。



  4. 翻译完所有的字串后点击 发布 即可生成对应的.qm文件,该文件即为需要被加载的对应语言的字串包。一般将生成的所有 .qm文件放到对应的程序执行目录下,便于加载。

4. 在代码中加载需要显示的语言所对应的.qm文件

.h 文件如下:

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_QtApp03_SimpleChangeLang.h"

/// <summary>
/// 枚举需要显示的语言
/// </summary>
enum Language
{
    zh_cn,
    en_us,
    undefined
};

class QtApp03_SimpleChangeLang : public QMainWindow
{
    Q_OBJECT

public:
    QtApp03_SimpleChangeLang(QWidget *parent = Q_NULLPTR);

    /// <summary>
    /// 根据当前要显示的语言,来加载对应的 qm 文件。
    /// 该函数在构造函数中执行,所以只是在程序启动时设置一次,不可以进行动态切换语言。
    /// </summary>
    void LoadSetLanguage();

    /// <summary>
    /// 设置控件的字符串内容,用tr包住
    /// </summary>
    void SetDynamicText();


private:
    Ui::QtApp03_SimpleChangeLangClass ui;
};

.cpp 文件如下 :

#include "QtApp03_SimpleChangeLang.h"
#include <qtranslator.h>  //QTranslator 的头文件

QtApp03_SimpleChangeLang::QtApp03_SimpleChangeLang(QWidget *parent)
    : QMainWindow(parent)
{
    // 需要先加载对应的语言包,后面再设置对应的字串内容时会进行替换,否则无法生效。
    LoadSetLanguage();

    ui.setupUi(this);
    
    SetDynamicText();
}

void QtApp03_SimpleChangeLang::SetDynamicText()
{
    ui.btn02->setText(tr("Test button 02"));
    ui.lb02->setText(tr("My Label02, val=%1, name=%2").arg(106).arg("City"));

}

void QtApp03_SimpleChangeLang::LoadSetLanguage()
{
    // 设置当前要显示的语言
    Language curLan = Language::zh_cn;
    bool ret = false;

    // 创建QTranslator的对象
    QTranslator* trans = new QTranslator();

    // 根据语言的来加载对应的语言包
    if (curLan == Language::en_us)
    {
        ret = trans->load("qtapp03_simplechangelang_en.qm");
    }
    else if (curLan == Language::zh_cn)
    {
        ret = trans->load("qtapp03_simplechangelang_zh.qm");
    }

    // 加载成功后执行 installTranslator
    if (ret)
    {
        qApp->installTranslator(trans);
    }
}

【注意】

  • LoadSetLanguage() :函数应该在设置字串之前被加载,因为 tr()函数相当于在当前加载的语言包中进行搜索替代,如果找到有对应的翻译就会用翻译的内容进行替代显示。如果没有找到就以代码中的字串进行显示。
  • 该方法只是在构造函数运行时,设置一次语言包,因此不能进行动态热切换字串。
posted @ 2023-11-27 00:00  Jeffxue  阅读(277)  评论(0编辑  收藏  举报