• QT多语言


    1. 步骤描述

    1. 将代码中的字符串使用tr()进行包裹,以便Qt提取字符串用于生成翻译资源文件
    2. 在项目文件中指定需要导出的翻译文件(.ts文件)TRANSLATIONS = english.ts chinese.ts,使用lupdate工具
    3. 使用Linguist程序打开.ts文件,将字符串翻译为目标语言
    4. 使用lrelease工具将翻译好的翻译文件,发布为.qm文件,可以直接在Linguist工具中点击发布
    5. 在程序中通过QTranslator加载不同的.qm文件,实现不同语言的切换

    2. tr() 函数使用

    用tr()包装过的字符串,可以被Qt自动提取到翻译文件中。

    2.1 tr()函数调用

    1. 在使用了Q_OBJECT宏定义的类或QObject的子类中,都可以直接使用,否则需要使用QObject::tr()调用
    2. 或在类定义中用 Q_DECLARE_TR_FUNCTIONS宏把tr()函数添加到类中,之后就可以直接调用了

    2.2 tr()函数的注意事项

    • 尽量使用常量字符串,不要使用字符串变量,否则将不能被正确提取
      char* errorStr = "不能删除记录";
      QString str2 = tr(errorStr);
      
      • 1
      • 2
    • 若要在tr()函数中使用字符串变量,需要在定义字符串的地方用Qt_TR_NOOP()宏进行标记,这在使用字符串数组时比较有用
    • tr()不能使用拼接的动态的字符串,正确用法如下:
      tr("第%1行").arg(current.row());
      
      • 1
    • 为了避免在程序中遗漏对某个字符串进行tr()包装,可以在配置文件中添加DEFINES+=Qt_NO_CAST_FROM_ASCII,来避免这种错误,
      这样编译时会禁止const char隐式转换为QString,强制每个字符串必须使用tr()或QLatin1String
      QLatin1String是一个关于const char
      的封装类

    3. 示例

    界面如下:
    在这里插入图片描述
    项目文件如下:

    QT       += core gui
    
    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
    
    CONFIG += c++17
    
    # You can make your code fail to compile if it uses deprecated APIs.
    # In order to do so, uncomment the following line.
    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
    
    SOURCES += \
        main.cpp \
        widget.cpp
    
    HEADERS += \
        widget.h
    
    FORMS += \
        widget.ui
    
    # important !!!
    TRANSLATIONS = english.ts chinese.ts
    
    # Default rules for deployment.
    qnx: target.path = /tmp/$${TARGET}/bin
    else: unix:!android: target.path = /opt/$${TARGET}/bin
    !isEmpty(target.path): INSTALLS += target
    
    RESOURCES += \
        language.qrc
    
    
    • 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
    • 28
    • 29
    • 30
    • 31

    生成翻译文件:工具->外部->Linguist->Update Translations,此时在项目目录下会生成english.tschinese.ts两个文件

    翻译翻译文件:打开Linguist工具,选择chinese.ts文件,界面如下
    在这里插入图片描述
    翻译对应的字符串,如下所示:

    在这里插入图片描述
    发布翻译好的内容:文件->发布,在Linguist工具中操作

    将生成的.qm文件添加的项目的资源文件中
    编写加载代码:

    #include "widget.h"
    #include "ui_widget.h"
    extern QApplication* pApp;
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::Widget)
    {
        ui->setupUi(this);
    
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    
    void Widget::on_comboBox_textActivated(const QString &arg1)
    {
        Q_UNUSED(arg1);
        if(ui->comboBox->currentIndex()==0){
            translator.load(":/english");
    
        }else if(ui->comboBox->currentIndex()==1){
            translator.load(":/chinese");
        }else{
            translator.load(":/english");
        }
        qApp->installTranslator(&translator);
    
    }
    
    // 调用installTranslator后,系统会给窗体发送信号将产生了changeEvent槽产生event
    void Widget::changeEvent(QEvent* e)
    {
        QWidget::changeEvent(e);
        switch (e->type()) {
            case QEvent::LanguageChange:
                ui->retranslateUi(this);
                break;
            default:
                break;
        }
        return;
    }
    
    • 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
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    ui->retranslateUi(this)的作用就是刷新界面显示新的语言。

    注意:
    若窗口是由代码实现的,则需要专门设计一个retranslateUi()函数,这样做会麻烦,特别是当窗口过多时。所以大部分软件在切换完语言后需要重启生效,因为窗口创建时会自动调用retranslateUi()函数。

    4. 参考

    Qt 5.9 C++ 开发指南 16.1 多语言界面

  • 相关阅读:
    由 BigDecimal 舍入算法引发的血案:ROUND_HALF_UP 与 ROUND_UP
    数字 IC 设计职位经典笔/面试题(四)
    Linux 文件权限详细教程
    Ubuntu----Linux命令-----防火墙(查看、关闭、启动)
    14:00面试,14:06就出来了,问的问题有点变态。。。
    【7.21-26】代码源 - 【平方计数】【字典序最小】【“Z”型矩阵】
    Python服务器监测测试策略与工具:确保应用的高可用性!
    CAS核心思想、底层实现
    Splunk UBA 备份和恢复
    Word控件Spire.Doc 【段落处理】教程(十二):如何在 C# 中管理 word 文档的分页
  • 原文地址:https://blog.csdn.net/weixin_41111116/article/details/126479102