QML / widget 动态语言切换 国际化( 本地化 )How to do dynamic translation in QML (QUICK)

1 Qt 5.10 以下的 QT 语言动态变化 https://wiki.qt.io/How_to_do_dynamic_translation_in_QML

2 Qt 5 QWidget 动态语言切换 请看文本最后

3 Qt 5.10 及以上动态语言 QML 

一、创建文件

在 .pro 文件中加入以下字段

TRANSLATIONS += i18n/english.ts \
               i18n/chinese.ts

Tools -->External-->Linguist-->lupdate 

就能生成相关文件(使用 Linguist 具体请检索,保存,发布生成 xxx.qm 文件)


二、加载相关文件

注:个人喜欢把文件都放在 资源文件中(qml.qrc)

//MyMessage.h
class MyMessage : public QObject
{
    Q_OBJECT

public:
    explicit MyMessage(QObject *parent = nullptr){
        engine.rootContext()->setContextProperty("MyMess", this); //加载这个方便在 QML 中修改
        const QUrl url(QStringLiteral("qrc:/main.qml");
        engine.load(url);
    }
    Q_INVOKABLE void switch_language(const int i) {
        if (i == 0) {
            if (!EN_TR.isEmpty()) 
                QCoreApplication::removeTranslator(&EN_TR);
            
            if (EN_TR.load(":/i18n/english.qm")) //注意:这里是地址而不是 URL 本人这里卡一段时间才发现不对,load 加载可以是实际地址,也可以 qrc 中的地址,具体 F1 看说明
            {
                qDebug() << "successed: load";
                QCoreApplication::installTranslator(&EN_TR);
            }
        
        } else { //我就中英文界面默认使用中文,只要卸载就好
           QCoreApplication::removeTranslator(&EN_TR); 
        }

        engine.retranslate(); //QML 会自动全局刷新,简直好用
    }

private:
    QTranslator EN_TR;
    QQmlApplicationEngine engine;
}

//QML
import QtQuick 2.13
Item {
    width: 500
    height: 500
    Button {
        property var i: 0
        anchors.fill: parent
        text: qsTr("OK: %1").arg("I am a great man")
        onClick: {
            MyMess.switch_language(i === 0 ? 1 : 0)
        }
    }

}


QWidget 界面语言动态切换

QTranslator g_translator_en = new QTranslator;

g_translator_en->load(":/i18n/english.qm"); //一样注意是路径而 不是 URL

qApp->installTranslator(&g_translator_en); 

qApp->removeTranslator(&g_translator_en);

这步以上基本相同,下面说两种不同的效果

 

全局自动切换(推荐)

第一种是 ui->retranslateUi(this) 这种是会自动切换控件上的文字,中英文翻译什么,这种方式比较简单,但是有一个问题,就是需要告知切换的界面,一般操作都是在当下 cpp 文件中重新实现 changeEvent() 函数

void MyTr::changeEvent(QEvent *e) //修改语言后会自动发送 QEvent::LanguageChange 事件
{
    if (e->type() == QEvent::LanguageChange) {
        ui->retranslateUi(this);
    } else 
        QWidget::changeEvent(e);
    
}

局部自动切换

第二种是切换指定对象文字 这种针对特定情况比较好用

// 假设 ui->pushButton->setText(tr("好滴");

void MyTr::changeEvent(QEvent *e) {
    if (e->type() == QEvent::LanguageChange) {
        ui->pushButton->setText(tr("好滴");
    } else 
        QWidget::changeEvent(e);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值