Linux系统 QT5.5.1国际化

之前做的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“菜单下打开了。

Linux系统 QT5.5.1国际化_第1张图片

Linux系统 QT5.5.1国际化_第2张图片



二、创建工程

    创建名称为testPro的工程,主界面元素如下:

说明:

    1.下拉框是选择语言用的;

    2.四个Label是简单显示用;

    3.左边的PushButton是弹出全局窗口用的;右边的PushButton是弹出临时窗口用的。

Linux系统 QT5.5.1国际化_第3张图片

弹出窗口界面如下:

说明:close按钮用于关闭窗口同时显示文字,Label显示文字。

Linux系统 QT5.5.1国际化_第4张图片


三、具体代码

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文件

打开文件后,在译文框中写入对应语言的字符串即可。

Linux系统 QT5.5.1国际化_第5张图片


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();
}

当选择下拉框修改显示语言时,会触发comboBox控件的activated响应(这里不用currentIndexChanged(int)函数,是因为这个函数会在初始化的时候自动调用,而activated只在修改下拉列表选项时触发)。


这里的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"));
}

当调用qApp->installTranslator函数时(qApp是内部指针变量,不需另外初始化),会触发系统内部的事件通知(changeEvent),通知类型为QEvent::LanguageChange,因此只需要在全局视图的实现文件中添加changeEvent(QEvent*)函数,如下:

void PopWindow::changeEvent(QEvent *e)
{
    //QWidget::changeEvent(e);
    switch(e->type())
    {
    case QEvent::LanguageChange:
        qDebug() << "popwindow LanguageChange";
        this->popWindow_freshUi();
        break;
    default:
        break;
    }
}

这里的popWindow_freshUi与前面的mainWindow_freshUi类似,是界面元素的重新加载作用,如下:

void PopWindow::popWindow_freshUi()
{
    this->setWindowTitle(tr("new Window"));
    this->ui->btnClose->setText(tr("close"));
    this->ui->labelState->setText(tr("Pop success!"));
}

至此,完成了代码的书写,下面看一下效果。


1)开机自动显示中文,点击弹框和临时弹框都显示中文。

Linux系统 QT5.5.1国际化_第6张图片


2)下拉列表选择English,界面切换为英文,点击弹框按钮显示亦为英文,效果如下图

Linux系统 QT5.5.1国际化_第7张图片



测试程序下载地址:http://download.csdn.net/detail/shengzhadon/9601857




你可能感兴趣的:(linux,qt,国际化,热机国际化)