• qt中实现多语言功能


    引言

    在做项目时,有时希望我们的程序可以在不同的国家使用,这样最好的方式是一套程序能适应于多国语言。
    Qt提供了这样的功能,使得一套程序可以呈现出不同的语言界面。本文将介绍QT如何实现多语言。

    示例

    环境

    windows10 + QtCreator4.8.2(Qt 5.12.2)+MSVC2017_32bit
    在这里插入图片描述

    demo

    创建基于应用程序的qt项目
    在这里插入图片描述
    dialog.h

    #define DIALOG_H
    
    #include 
    
    namespace Ui {
    class Dialog;
    }
    
    class Dialog : public QDialog
    {
        Q_OBJECT
    
    public:
        explicit Dialog(QWidget *parent = nullptr);
        ~Dialog();
    
        void testMultiLangguage();//多语言测试
    protected:
    private slots:
    private:
        Ui::Dialog *ui;  
    };
    
    #endif // DIALOG_H
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    dialog.cpp

    #include "dialog.h"
    #include "ui_dialog.h"
    #include 
    
    Dialog::Dialog(QWidget *parent) :
        QDialog(parent),
        ui(new Ui::Dialog)
    {
        ui->setupUi(this);
    
        testMultiLangguage();
    }
    
    Dialog::~Dialog()
    {
        delete ui;
    }
    
    void Dialog::testMultiLangguage()
    {
        QLabel *label = new QLabel(tr("hello Qt!"),this);
        label->move(QPoint(100,30));
        QLabel *label2 = new QLabel(tr("password"),this);
        label2->move(100,80);
        QLabel *label3 = new QLabel(tr("yafei"),this);
        label3->move(280,30);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    main.cpp

    #include "dialog.h"
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        Dialog w;
        w.show();
        
        return a.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    使项目可以多语言

    其本质就是生成ts文件,然后手工翻译,再生成qm文件,最后在主程序的开始加载不同的qm文件,实现多语言。

    步骤一

    编写完代码之后,在pro文件中添加下面的语句:

    TRANSLATIONS += hahh_zh_CN.ts \
                    english_eg.ts
    
    • 1
    • 2

    这样最终可以生成适用于汉语和英语的ts文件。
    == 注意:这里不需要自己手动创建ts文件,只在pro文件中添加要生成的ts文件名就可以。==
    这里生成的中文ts文件名为hahh_zh_CN.ts ,其中文件名中的zh_CN常作为生成的中文ts文件名的后半部分,前面的文件名可以随便起。生成的英文ts文件名为english_eg.ts。
    编写好pro文件后,点击保存。然后点击工具-》外部-》语言家-》更新翻译(lupdate)。即使用lupdate工具,生成pro文件中添加的ts文件。
    会在qt的概要信息中看到下图所示:
    在这里插入图片描述
    此时已经使用lupdate工具生成ts文件。

    步骤二

    生成ts文件之后,点击电脑开始菜单,在出现的应用程序列表栏找到Qt安装文件夹,找到Linguist,选择适合自己的Linguist工具,双击打开。这里选择Linguist需要根据自己的项目的编译器进行选择。由于我采用的是MSVC2017_32bit,所以MSVC2017_32bit的Linguist。
    在这里插入图片描述
    打开Linguist后,点击文件-》打开,在文件选择框中选择项目生成的ts文件,点击打开。
    在这里插入图片描述
    会在Linguist中展示需要翻译的字符串,与类名。字符串下的列表前都有一个问好图标,通过点击菜单栏中的箭头来上移和下移到不同的项。通过点击前、后箭头移动到自己需要翻译的项上,在下方的翻译区进行手动翻译,第二栏是翻译的注释内容,可以不写注释,翻译完一项之后,用Ctrl+Enter会自动跳到下一个待翻译的字符串上,翻译完一个字符串之后,上图字符串列表前面的问号图标会变为一个绿色的对号。上图为已经翻译完成后的界面。
    ** 备注:这里可以设置你想翻译成的语言。点击编辑-》翻译文本设置,会弹出一个对话框。在目标语言中选择需要的语言和国家/地区。**
    在这里插入图片描述

    步骤三

    翻译完成之后,需要保存,可以ctrl+s快捷键来保存,也可以点击菜单栏中文件-》保存,保存之后便是发布,生成qm文件。
    有两张操作方式可以生成qm文件。

    方式一

    在Linguist中点击文件-》发布。

    方式二

    QtCreator中点击工具-》外部-》语言家-》发布翻译(lrealse)。

    步骤四

    生成qm文件之后,在main.cpp文件中添加下面的代码,加载qm文件。一般将代码添加到QApplication a(argc, argv);下一行。
    main.cpp

    #include "dialog.h"
    #include 
    #include 
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QTranslator translator;
    //    translator.load("../QTabWidgetDemo/hahh_zh_CN.qm");
        translator.load("../QTabWidgetDemo/english_eg.qm");
        a.installTranslator(&translator);
        Dialog w;
        w.show();
        return a.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    加载不同的qm文件就会在界面显示不同的语言。

    附加

    [1]当中英文翻译出现双引号时,可以采用将英文的双引号翻译为中文的双引号,再向双引号中插入要被双引号强调的文本。
    类似于下面这样:

    QString strDoubleMark = QObject::tr("\"\"");  
    QString strTechnology = QObject::tr("Technology");
    QString strStenosisMsg +=
                // 在双引号中插入字符串
                strDoubleMark.insert(1, strTechnology);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    其中 m_translate.strDoubleMark对应翻译时的英文双引号。这里只需向双引号的第一个位置插入文本就行,就可以实现显示效果:“技术的”。
    [2]被翻译的文本可以加tr,也可以加QObject::tr。这两者的区别如下:

    QString strTechnology = QObject::tr("Technology");
    QString strTechnology = tr("Technology");
    
    • 1
    • 2

    上述代码中添加tr会在所在的当前类中生成翻译文本,如下图。
    在这里插入图片描述
    而在QObject::tr中的带翻译文本会生成在QObject文件中。如下图:
    在这里插入图片描述

  • 相关阅读:
    一个软件是如何开发出来的呢?
    开发记录【1】
    MongoDB命令
    dubbo-admin安装
    Java笔记 泛型
    浮点数运算以及溢出问题
    【无标题】
    JDK21最终版协程实现之虚拟线程
    【Java基础篇 | 面向对象】--- 聊聊什么是多态(上篇)
    uniapp引入Tensorflow.js所会发生的一些问题( 主要发布平台 微信小程序 )
  • 原文地址:https://blog.csdn.net/blqzj214817/article/details/127396411