qml的国际化和动态切换语言详细过程

3,421 阅读3分钟

注意:使用国际化推荐使用qt5.10或以上版本,因为实现国际化过程中更多的是动态地去切换语言,而旧版的qt没有很好的api去实现这个过程

1.在qml文件中使用qsTr去标记我们需要国际化的字段,如下图

  Text{
                 id:test
                 width: parent.width
                 height: 89
                 anchors.left: parent.left
                 anchors.leftMargin: 70
                 text:qsTr("蓝牙")
                 color:"#a97a54"

                 fontSizeMode:Text.HorizontalFit
                 verticalAlignment: Text.AlignVCenter
             }

2.进入使用lubpdate命令对项目中需要国际化的qml文件进行编译,编译后会产生ts格式的文件

也可以使用qt creator 的中的qt语言家功能实现,但是不知道为什么我的ide这个功能总是出错,所以我用命令行,其实命令行也很方便

3.使用qt安装路径中的linguist.exe软件打开生成的ts格式文件

注: 然后我们就可以根据译文,进行翻译(没错每一个英文单词都要我们自己去翻译) 记得打勾,打完勾我们才可以在后续使用

4.翻译完全部后就可以点击软件的文件-发布选项。发布完后,会在ts所在地方生成同名但格式是qm的文件,这就是我们需要的语言包

5.然后把语言包加入到我们的项目中,和静态资源加入方式一样

6.最后就是使用了,切换语言的方式一般有两种,一种是开启应用时先检测系统环境的语言来选择语言包,另一种是动态的切换语言

6.1先说第一种,这种就比较简单,我们可以使用qt的QLocale这个类,通过这个类来获取系统本地语言环境 简单的展示以下代码,

QTranslator的load方法装载语言包
QGuiApplication的实例化对象的installTranslator去实现语言

QGuiApplication app(argc, argv);
    //国际化
    QTranslator translator;
    
    Translator *tran=new Translator();
     QLocale locale;
    if( locale.language() == QLocale::English )  //获取系统语言环境
       {
           qDebug() << "English system" ;
           translator.load(":/new/prefix1/en_us.qm");

       }
       else if( locale.language() == QLocale::Chinese )
       {
           qDebug() <<QStringLiteral("中文系统");
           translator.load(":/new/prefix1/zh_cn.qm");
          }
          
    app.installTranslator(&translator); 

6.2另一种就是动态的切换语言的,前面说过我们使用的是qt5.10或以上的版本,因为新版本中新增的api(即retranslate()这个方法)非常完美的让我们实现了点击切换语言后,页面立马刷新,而旧版的很难实现这个功能,有是有但很繁琐

首先我们新建一个关于国际化的类,Translator

translator.h部分代码,涉及c++与qml交互,不懂得先找找教程弄懂。

public:
    explicit Translator(QObject *parent = nullptr);
    ~Translator();
public slots:
    void loadLanguage(QString lang); //qml文件中调用此方法实现切换语言
    void setSomething(QGuiApplication& app, QQmlApplicationEngine &engine);

private:

    QTranslator*  m_translator;
    QGuiApplication *m_app;
    QQmlApplicationEngine *m_engine;

translator.cpp部分代码

void Translator::loadLanguage(QString lang)
{
    qDebug()<<"load"<<lang;
    if(m_translator == nullptr)
    {
        return;
    }

    if(lang.contains("English"))
    {
        if(m_translator->load(":/new/prefix1/en_us.qm"))
        {
            m_app->installTranslator(m_translator);
            m_engine->retranslate(); //新版qt的新api,实现了Qml界面全部动态重新翻译

        }
        else
        {
            qDebug()<<"load en error";
        }
    }
    else
    {
        if(m_translator->load(":/new/prefix1/zh_cn.qm"))
        {
            m_app->installTranslator(m_translator);
            m_engine->retranslate();

        }
        else
        {
            qDebug()<<"load cn error";
        }
    }
}

void Translator::setSomething(QGuiApplication &app, QQmlApplicationEngine &engine)
{
    m_app = &app;
    m_engine = &engine;
}

main.cpp代码

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    //国际化  
    Translator *tran=new Translator();
    QQmlApplicationEngine engine;
    tran->setSomething(app,engine);  //把QGuiApplication和QQmlApplicationEngine实例化对象传入
    engine.rootContext()->setContextProperty("translator", tran);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

qml文件代码

Window {
    id:root
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    Text{
                 id:test
                 width: parent.width
                 height: 89
                 anchors.left: parent.left
                 anchors.leftMargin: 70
                 text:qsTr("蓝牙")
                 color:"#a97a54"

                 fontSizeMode:Text.HorizontalFit
                 verticalAlignment: Text.AlignVCenter
             }

    Button{
      id:btn1
      anchors.centerIn: parent
      text: "切换英文"

      onClicked: {
          translator.loadLanguage("English")

      }

    }
    Button{
       id:btn2
       anchors.horizontalCenter: btn1.horizontalCenter
       text: "切换中文"
       onClicked: {

          translator.loadLanguage("Chinese")
       }

    }




}

以上就是全部内容

参考内容:blog.csdn.net/zhengtianzu…