Qt在应用程序的国际化方面做了很多工作,Qt可以实现在运行时动态改变应用程序的界面语言,下面以一个简单的例子一步一步教你如何实现之.
Qt是跨平台的开发环境,这里以MAC上的QTSDK4.6.2为例,您可以在其它平台下按此操作步骤一样没问题.
好的,让我们开始吧:
-
首先我们创建一个Qt4Gui Application
-
去掉那个讨厌的ToolBar,加入如下控件:
QComboBox对应的名字(ID)为 changeCombox
QTextEdit --------------------- infoTxt
QLabel ----------------------- tipTxt双击QComboBox,为changeCombox这个控件加入如下条目(Items)
-
注意我们把transatable去掉,意为我们将不会动态改变combobox里面的语言,如果改combobox里面的内容,则在动态切换语言时造成combobox的changedindex紊乱.因为切换语言的过程中,combobox里面的内容被动态更改.
-
更改构造函数:
MainWindow::MainWindow(QWidget*parent) :
QMainWindow(parent),
ui(newUi::MainWindow)
{
ui->setupUi(this);
ui->infoTxt->setText(tr("Hello,moon.","This is a Text Edit Control."));
this->setWindowTitle(tr("Translatetest", "windowTitle"));
}
-
在此之前,我们先要翻译我们程序运行时所要用的语言,具体如下:
-
-
打开Muti_Language_APP.pro文件,加入:
TRANSLATIONS+= US.ts ZH.ts JAN.ts -
打开终端,转到你的工程目录下,输入lupdateMuti_Language_APP.pro,将会显示如下结果:
Updating'US.ts'...
Found8 source text(s) (8 new and 0 already existing)
Updating'ZH.ts'...
Found8 source text(s) (8 new and 0 already existing)
Updating'JAN.ts'...
Found8 source text(s) (8 new and 0 already existing)
-
这个时候会在工程目录下生成US.ts ZH.tsJAN.ts三个文件,这三个文件为XML格式,其实记录的是需要翻译的文本,可以任意打开一个看看.我们现在打开Linguist工具(QT自带的语言翻译工具),将三个.ts文件拖入,相信你会知道如何进行下一步操作.
-
当你翻译好后,请选择File->SaveAll, File->Release All,这时会在项目目录下生成我们最终所需要的三个qm文件,qm文件为二进制文件,程序换语言时就从这里面查找.
-
-
好了,现在我们加上一个qrc文件,File->New File or Project, 选择qrc文件.首先addprefix,我们就用/好了.再addfiles,将三个qm文件选上,保存.
-
为changeCombox添加slot:
在combobox上右键:Goto slots: 选择:on_changeCombox_currentIndexChanged(int)信号.
-
-
在mainwindow.cpp中加入编写slot事件代码:
-
voidMainWindow::on_changeCombox_currentIndexChanged(int lang) { static QTranslator*translator; QString language; if (translator) { qApp->removeTranslator(translator); delete translator; translator = NULL; }
translator = newQTranslator(); switch(lang) { case 0: language ="US";break; case 1: language ="ZH";break; case 2: language ="JAN";break; }
if (translator->load(":/"+ language + ".qm") == FALSE) { //handle error here }
qApp->installTranslator(translator); } |
利用QTranslator便可实现运行时动态改变语言.
-
效果截图
-
从中,你可以看到,textEdit里面的东西 没有 被翻译,因为这里面的文本没有 在ui->retranslateUi(this);这个函数里面实现.你可以重写这个函数.
这里还有一点要注意的是,因为我们把qm文件打包在qrc文件里,所以当我们生成应用程序时,qm文件被打包到exe/app内部去了.如果我们想通过动态改qm文件而不用重新编译应用程序,我们可以把qm文件放在外面独立目录中.