注意:使用国际化推荐使用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")
}
}
}
以上就是全部内容