Qt Quick实现国际化 中英文切换简明图文步骤

前言

在用Qtquick做中英文切换的时候,查资料发现步骤不全或者比较杂乱
现在通过截图将每一步都完善,尽量简单详细
效果展示:
中文:
在这里插入图片描述
英文:
在这里插入图片描述

一.步骤

1、在pro文件中添加需要生成的ts文件:

TRANSLATIONS += \
            zh_CN.ts \
            en_US.ts

2.通过工具-外部-语言家-update 生成zh_CN.ts和en_US.ts

在这里插入图片描述

3.通过语言家打开生成的ts文件进行翻译

在这里插入图片描述
1.打开zh_CN.ts 选择英译中
在这里插入图片描述
2.语言家识别qrTs文本,手动翻译完需要翻译的文本
在这里插入图片描述
3. 保存zh_CN.ts 并发布生成zh_CN.qm

同理,打开en_US.ts,en_US选择中译英;一般有了zh_CN后,实际完成的工作是英译英,因为程序中原文为英文,可能这一步能省略,但没想到办法
在这里插入图片描述

在这里插入图片描述
发布上次en_US.qm

4.将zh_CN.qm和en_US.qm添加到资源文件

在这里插入图片描述

五.新建语言切换类,并暴露给qml

1.qmllanguage.h

#ifndef QMLLANGUGE_H
#define QMLLANGUGE_H

#include <QObject>
#include <QTranslator>
#include <QGuiApplication>
#include <QQmlApplicationEngine>

class QmlLanguage : public QObject
{
    Q_OBJECT
  public:
      QmlLanguage(QGuiApplication& app, QQmlApplicationEngine &engine);
      //设置为当前系统语言
      void setLocalLanguage();
      //获取当前系统语言,必须添加 Q_INVOKABLE 后才能在前端调用该函数
      Q_INVOKABLE int getLocalLanguage();
      //设置为indexOfLanguage指定的语言
      Q_INVOKABLE void setLanguage(int indexOfLanguage);

  private:
      QGuiApplication *m_app;
      QQmlApplicationEngine *m_engine;
};

#endif // QMLLANGUGE_H

2.qmlLanguage.cpp实现

#include "qmllanguge.h"

QmlLanguage::QmlLanguage(QGuiApplication &app, QQmlApplicationEngine& engine)
{
    m_app = &app;
    m_engine = &engine;
}


void QmlLanguage::setLocalLanguage(){
    QTranslator translator;
    QLocale locale;
    if( locale.language() == QLocale::English ) {
        translator.load(":/en_US.qm");
    }
    else if( locale.language() == QLocale::Chinese ) {
        translator.load(":/zh_CN.qm");
    }
    m_app->installTranslator(&translator);
    //重新载入语言包
    m_engine->retranslate();
}


void QmlLanguage::setLanguage(int indexOfLanguage)
{
    QTranslator translator;
    if (indexOfLanguage == 0)
    {
        translator.load(":/en_US.qm");  //注意路径
    }else if (indexOfLanguage == 1) {
        translator.load(":/zh_CN.qm");
    }else{
        translator.load(":/en_US.qm");
    }
    m_app->installTranslator(&translator);
    m_engine->retranslate();
}

int QmlLanguage::getLocalLanguage(){
    QLocale locale;
    if(locale.language() == QLocale::English){
        return 0;
    }else if(locale.language() == QLocale::Chinese){
        return 1;
    }
    return 0;
}

3. 将QmlLanguage传递给qml

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QTranslator>
#include <QDebug>
#include <QQmlContext>
#include "qmllanguage.h"

int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif
   
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;

       //切换为本地语言
       //检测本系统语言自动装载翻译文件
       //使用qt的QLocale这个类,通过这个类来获取系统本地语言环境
       //QTranslator的load方法装载语言包
       //QGuiApplication的实例化对象的installTranslator去实现语言翻译
       QTranslator translator;
       QLocale locale;
       if( locale.language() == QLocale::English ) {
           translator.load(":/en_us.qm");
       }
       else if( locale.language() == QLocale::Chinese ) {
           translator.load(":/zh_CN.qm");
       }
       app.installTranslator(&translator);

       //将QmlLanguage中的所有函数暴露给qml调用
      QmlLanguage qmlLanguage(app, engine);
      engine.rootContext()->setContextProperty("qmlLanguage", &qmlLanguage);


    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

六. QML中调用,切换语言

import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.12

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Hello World")


    Row {
        id:switch_language_row
        anchors.right: parent.right
        Label{
            text:qsTr("language")
            anchors.verticalCenter: switch_language_row.verticalCenter
        }

        ComboBox {
            id: switch_language_combox
            model:['English','简体中文']
            //首先设置ComboBox显示当前系统语言
           currentIndex: qmlLanguage.getLocalLanguage()
           onActivated: {
               //用户使用ComboBox后根据index调用cpp中的方法
               qmlLanguage.setLanguage(index)
               //设置ComboBox的显示语言
                currentIndex = index
            }
        }
    }
}

七、后续更新

后续有更改,直接工具-外部-语言家-update
后 打开语言家程序,单独一个一个打开,翻译后保存并发布;不要一起打开,会比较混乱

参考:https://blog.csdn.net/eichitang/article/details/123117325

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值