之前做的QT项目都是单一语言,现在需要上大项目了,就要求支持国际化语言,这里写了一个测试程序,记录一下。
说明:
1.qt采用5.5.1。
2.这里的国际化实现了启动前和热机状态两种选择语言的方式;
3.热机状态切换语言,支持多窗口传递,支持全局窗口(初始化一次不释放)和临时窗口(每次显示器需要初始化)。
一、国际化需要的准备
1.在变成过程中所有需要国际化的字符串都必须以tr("string")形式书写,这是qt检测国际化字符串的标识,如:
this->ui->btnClose->setText(tr("close"));,字符串“close”必须包含在tr()中,
2.必须安装有linguist, lupdate, lrelease工具,如果没有安装这些工具,可在终端中输入命令安装:
sudo apt-get install qt4-dev-tools
3.为了方便开启这些工具,我将他们放在了Qt creator里了,如下图,以后打开工具只需要再qtcreator的“工具-》外部-》Linguist“菜单下打开了。
二、创建工程
创建名称为testPro的工程,主界面元素如下:
说明:
1.下拉框是选择语言用的;
2.四个Label是简单显示用;
3.左边的PushButton是弹出全局窗口用的;右边的PushButton是弹出临时窗口用的。
弹出窗口界面如下:
说明:close按钮用于关闭窗口同时显示文字,Label显示文字。
三、具体代码
1.创建国际化文件
1)如前所述,将所有的字符串都改为tr("string")形式;
2)打开testPro.pro文件,在文件最后添加如下语句
TRANSLATIONS += testProLanguage_zh_CN.ts \
testProLanguage_EN.ts
这是指名两个语言文件,后缀名必须为.ts,名字随意(这里为了便于区分,取名如上)。
3)从“工具》外部》Linguist》“菜单下选择lupdate,进行翻译字符串的检测,我这里已经翻译完成,显示检测到15个字符串已经翻译
执行完此步之后会在工程文件夹中生成两个.ts文件,即:testProLanguage_zh_CN.ts 和 testProLanguage_EN.ts
4)如果显示没有翻译完成,则从“工具》外部》Linguist》”菜单下选择“预言家(Linguist)”工具,显示如下图所示:
注:如果没有打开自己需要的文件,可以在工具打开之后点击“打开”按钮选择相应的.st文件
打开文件后,在译文框中写入对应语言的字符串即可。
5)翻译完成需要发布,这里有两种方法:
a.点击4)中窗口(linguist工具)的“文件》发布全部“菜单,进行发布;
b.点击qtcreator中的“工具》外部》Linguist》”菜单下的“发布翻译(lrelease)”,进行发布。
发布完成后会在工程文件夹中生成两个后缀名为.qm的翻译文件,即:testProLanguage_zh_CN.qm 和 testProLanguage_EN.qm文件
至此,国际化文件创建成功!
2.开机选择语言
这部分修改比较简单,只需要在main.c文件的main函数中添加语言的加载语句即可,完整代码如下:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator *trans = new QTranslator(&a);
trans->load("../testPro/testProLanguage_zh_CN.qm");
a.installTranslator(trans);
MainWindow w;
w.show();
return a.exec();
}
说明:需要包含头文件QTranslator。
3.热机状态切换语言
热机状态需要切换整个工程中界面的显示语言,即主视图和子视图。这里子视图分为两种情况,其一是临时子窗口,这种窗口每次显示都需要初始化,用完即delete。另外一种是全局的试图,这种视图往往初始化一次即可,每次显示完成不需要注销。
当修改语言完成后,临时视图初始化即可自动根据当前语言加载,而全局视图则需要以通知的形式,重新刷新一下界面的显示内容。
用于切换语言的combobox响应如下:
void MainWindow::on_comboBoxLanguage_activated(int index)
{
// 输出信息
qDebug() << "activated index:" << index;
// 更新语言
static QTranslator *translator;
if(NULL != translator)
{
qApp->removeTranslator(translator);
delete translator;
translator = NULL;
}
translator = new QTranslator;
switch(index)
{
case 0:
// English
translator->load("../testPro/testProLanguage_EN.qm");
break;
case 1:
// 中文
translator->load("../testPro/testProLanguage_zh_CN.qm");
break;
}
qApp->installTranslator(translator);
this->mainWindow_freshUi();
}
这里的mainWindow_freshUi函数是进行界面元素刷新用的,具体代码如下:
void MainWindow::mainWindow_freshUi()
{
// 初始化Title
this->setWindowTitle(tr("test language"));
// 初始化字符串
this->ui->labelName->setText(tr("Name"));
this->ui->labelNameStr->setText(tr("test name"));
this->ui->labelPasswd->setText(tr("Password"));
this->ui->labelPasswdStr->setText(tr("Hello world!"));
this->ui->btnPopWindow->setText(tr("Pop Window"));
this->ui->btnPopWindow2->setText(tr("Pop tmp Window"));
}
void PopWindow::changeEvent(QEvent *e)
{
//QWidget::changeEvent(e);
switch(e->type())
{
case QEvent::LanguageChange:
qDebug() << "popwindow LanguageChange";
this->popWindow_freshUi();
break;
default:
break;
}
}
void PopWindow::popWindow_freshUi()
{
this->setWindowTitle(tr("new Window"));
this->ui->btnClose->setText(tr("close"));
this->ui->labelState->setText(tr("Pop success!"));
}
1)开机自动显示中文,点击弹框和临时弹框都显示中文。
2)下拉列表选择English,界面切换为英文,点击弹框按钮显示亦为英文,效果如下图
测试程序下载地址:http://download.csdn.net/detail/shengzhadon/9601857