Qt翻译文件结合VS实现语言切换(多语言国际化)

时间:2022-03-17 15:54:07

  Qt多语言国际化主要体现在界面的语言切换,语言切换的主体,即界面中需要翻译的元素,要放在“QApplication::translate()”函数内,或更方便一些的“QObject::tr()”、“QObject::trUtf8()”函数;确定了翻译的主体后,就要对这些待翻译元素进行翻译,完成翻译后会生成qm文件;当界面要切换语言时,只需要加载qm文件即可。

  翻译的过程主要分三步:

1.  lupdate:提取待翻译元素,生成ts中间文件

2.  写翻译内容:将ts文件中所有提取出来的待翻译元素进行翻译

3.  lrelease:将翻译好的文件生成qm文件

 

  简要说明QApplication::translate()参数:

QString QApplication::translate ( const char * context, const char * sourceText, const char * comment = 0, Encoding encoding = DefaultCodec ) const

作用:通过查询qm文件,返回sourceText的翻译文本(当安装了多个qm文件时,查询顺序类似于栈的先进后出存储模式:即先搜索最近安装的qm文件,再搜索之前安装的qm文件)

参数说明:

(1)  context通常是一个类名(例如,“MyDialog”;

(2)  sourceText待翻译文本内容;

(3)  comment是消除歧义的注释,当相同的sourceText在同样的上下文情况下被用在不同的规则中默认情况下是零;

(4)  encoding表明字符串编码方式。

返回值:如果qm文件中没有包含contextsourceText的翻译,这个函数返回一个和sourceText相等的QStringsourceText的编码方式由encoding指定,它默认为DefaultCodec

应用:

QApplication::translate("Widget", "\346\227\213\350\275\254\346\270\270\346\210\217", 0, QApplication::UnicodeUTF8)


接下来看一个例子(VS+Qt):

  VS中新建一个QtGUI工程,通过Qt Designer选择摆放控件,修改text显示内容,编译工程,可以在ui_xxxx.h(根据ui文件自动生成)中看到放在QApplication::translate()中的待翻译元素:

pushButton_1->setText(QApplication::translate("TestClass", "Chinese", Q_NULLPTR));
pushButton_2->setText(QApplication::translate("TestClass", "English", Q_NULLPTR));

接下来生成ts文件:

  工程右键->“Create new Translation File”->选择你想生成的语言,比如demo中原始控件text为英文,要翻译成中文,那么Language就选择“中文(简体,中国)”

Qt翻译文件结合VS实现语言切换(多语言国际化)

  此时工程目录下会多一项Translation Files,里面有*.ts文件,当代码中又增加了新的待翻译元素时,右键这个ts文件->lupdate,即可将新增加的待翻译元素更新到ts文件中

  接下来用Qt Linguist打开ts文件,将待翻译元素依次翻译后保存即可,或者可以直接使用文本编辑器打开ts文件,每一个<message>标签内为一个待翻译元素,将翻译写到<translation>标签中保存,Qt Linguist和文本编辑器都可以完成翻译的操作,在已经翻译完成的ts文件上右键->Irelease,即可生成*.qm文件

  生成了qm文件后,就可以在程序中需要实现翻译的位置加载该qm文件进行语言切换了:

QTranslator* translator = NULL;
//qm文件的加载:
translator = new QTranslator;
if (translator->load("test_zh.qm"))
{
qApp->installTranslator(translator);
}
ui.retranslateUi(this);
//qm文件的删除:
if (translator != NULL)
{
qApp->removeTranslator(translator);
delete translator;
translator = NULL;
}
ui.retranslateUi(this);


效果如下:

Qt翻译文件结合VS实现语言切换(多语言国际化)

Qt翻译文件结合VS实现语言切换(多语言国际化)

  上图中的demo可以在VS2015+Qt5.8.0环境下直接编译运行,如果开发平台版本不同,改一下项目属性和Qt配置选项即可demo下载传送点)。


  注:Qt只能翻译字符串,不能翻译变量,即不存在tr(str),至于原因,就是你都不确定你要翻译的是什么(变量),Qt linguist也就自然不知道为你提取出什么来。。