前言
为了支持国际化最关键的地方是制作多国语言包,然后再实现动态切换。QT里面既可以采用命令行也可以采用Qt Creator的界面操作来生成,这里我们利用Qt Creator来生成多国语言包。
基本流程是
- 生成ts文件;
- 生成qm文件;
- 最后通过QTranslator类来加载qm文件,实现多语言包的切换。
注意:为了更全面地实现多语言包,在程序中所有涉及到界面中的按钮或者菜单中的文字显示,都必须使用 QObject::tr("…") 的方式将显示的内容包裹起来,这样做的原因是:只有添加了QObject::tr()的标记,生成ts文件的时候程序才会认为被QObject::tr()包裹的地方是需要制作多语言的,从而在ts中预留出位置。
1. 生成ts文件
1.1 在pro文件中添加
TRANSLATIONS = languages/lang_English.ts \
languages/lang_Chinese.ts
在pro文件中,加入说明,其中“lang_English.ts”与“llang_Chinses.ts”为设置语言文件的名称,这里使用中文与英语两种语言,当你需要其他更多的语言时,添加多个语言文档即可。
注:languages文件夹需事先创建。
1.2 语言文字在程序中说明
为了Qt识别你在程序中需要语言准换的文字,需要将需要转换的文字使用QObject::tr(“…”) 进行标记,否则程序中并不能对其进行识别。例如:
qDebug()<<tr("Output Info: ")<<tr("Language - English");
而在ui窗口直接进行添加一些插件中的语言,一般默认可以识别进行翻译的。如果我们想将其关掉,可以选择插件的属性,将toolTip中“可翻译的”直接取消勾选即可。
1.3 生成ts文件
执行【工具】–>【外部】–>【Qt语言家】–>【更新翻译(lupdate)】,如下图所示,执行完成后languages目录下会自动生成lang_English.ts和lang_Chinese.ts文件。
1.4 修改ts文件
利用Qt中自带的Linguist打开刚刚生成的st文件,根据相应的语言,进行语言转换。
lang_Chinese.ts
lang_English.ts
2 生成qm文件
ts文件翻译结束以后,点击保存,然后在Qt Creator中,使用:工具->外部->Qt预言家->部署翻译(lrelease),就会生成需要的qm文件。
3 加载qm语言包
将生成的qm文件复制到发布版本中相应的位置,然后在程序中加载
void MainWindow::loadLanguage(const QString langflag)
{
if(langflag.isEmpty())
return;
QString langqmfilepath;
if(langflag.compare("en") == 0)
{
langqmfilepath = qApp->applicationDirPath() + QString("/languages/lang_English.qm");
}
else if(langflag.compare("zh") == 0)
{
langqmfilepath = qApp->applicationDirPath() + QString("/languages/lang_Chinese.qm");
}
if(QFile(langqmfilepath).exists())
{
m_translator->load(langqmfilepath);
qApp->installTranslator(m_translator);
}
else
qDebug()<<"[houqd] authclient language file does not exists ...";
//重新刷新界面
ui->retranslateUi(this);
}
其中,m_translator即为QTranslator实例,在类的构造函数中赋值:m_translator = new QTranslator;实现过程很简单,就是取得语言包的绝对路径,然后利用QTranslator来加载它,再利用qApp->installTranslator(m_translator)来安装,最后还应该将显示界面重新显示一次进行更新。
主界面可以直接借助ui->retranslateUi(this)进行重新设置界面显示,但是这个只能更新当前页面,其余浮动页面并不能直接显示出来。需要按照以下格式将每一个需要显示的页面添加相应的程序。
示例
myDialog.h
void changeEvent(QEvent *event);
myDialog.cpp
void myDialog::changeEvent(QEvent *event)
{
QDialog::changeEvent(event);
switch (event->type())
{
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
示例参见:https://gitee.com/null_712_5588/CSDNBlogDemo/tree/master/QtLanguageSwitchTest