在Qt Creator 中使用qt国际化,实现多语言支持。

2021年07月15日 106点热度 0人点赞 0条评论

写代码

Qt提供了一个非常方便的多语言国际化方案,开发者使用它可以用非常简单的方式让程序支持多种语言。

这里记录一个qt多语言的最简单的示例,开发工具使用的使qtcreator。

要实现多语言得支持,首先得在代码中完成这几个步骤:

#include<QTranslator>
//实例化一个翻译模块的对象,并载入翻译文件
QTranslator translator;
translator.load("translator.qm");
//使用QApplictioin的对象,为程序安装翻译模块
app.installTranslator(&translator);
//最后使用一个label显示文本,来展示翻译的效果
QLabel *label = new QLabel();
label->setText(QObject::tr("hello word"));
label->show();

这里要注意,需要翻译的文本,一定要使用Qobject::tr()函数包裹,这样才能被正确的适配到。

生成翻译文件

要实现多语言,光是这样肯定是不够的,接下来的步骤才是重点。

在项目的pro文件夹中加入

TRANSLATIONS = translator.ts

这条代码的之作用是为了指定生成翻译文件时的路径。

如果使用较高版本的Qt Creator,可以直接在界面上使用快捷方式生成翻译文件。

当然,如果使用的是低版本的Qt Creator那么只需要在power shell中使用命令也可以实现相同的功能。

lupdate -verbose <AppName>.pro

正常情况下将AppName替换为项目名称就可以生成了。

  1. 如果提示命令不存在,那么可能是没有设置环境变量,只需要在命令前面加上Linguistexe路径即可。或者设置一下QtCreator的环境变量也可以。
  2. 如果提示pro文件不存在,那么在pro文件名称前跟上文件的绝对路径,或者移动到项目路径操作。

按照上述方法生成翻译文件之后,会得到translator.ts,其实这就是一个xml文件,里面统计了代码里所有需要翻译的文本。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
    <name>MainWindow</name>
    <message>
        <location filename="mainwindow.ui" line="13"/>
        <source>MainWindow</source>
        <translation type="unfinished"></translation>
    </message>
</context>
<context>
    <name>QObject</name>
    <message>
        <location filename="main.cpp" line="15"/>
        <source>hello word</source>
        <translation type="unfinished"></translation>
    </message>
</context>
</TS>

比如我这个,因为新建工程的时候新建了mainwindow,所以这里统计的时候把ui文件中的文本也统计到了。

接下来使用Linguist(在安装QtCreator的时候一起安装的)打开这个文件。

打开之后,会弹出这界面让选择翻译目标,从什么语言翻译到什么语言。

选择对应的语言之后就可以开始做翻译工作拉。

翻译完成之后,点击发布,会得到translator.qm文件,将这个文件拷贝到构建目录,就可以运行程序了。

运行结果

~嗯,这样就完成了一个最简单的示例。

完整代码如下:

#include <qtranslator.h>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTranslator translator;
    if(translator.load("./translator.qm"))
    {
        a.installTranslator(&translator);
    
        QLabel *label = new QLabel();
        label->setText(QObject::tr("hello word"));
        label->show();
    }
    return a.exec();
}

如果未弹出窗口程序就结束了,那么说明翻译文件载入失败了,需要检查一下翻译文件的名称和所在目录是否正确。

参考文献:https://doc.qt.io/qt-5/qtlinguist-index.html

大脸猫

半个C++程序员。

文章评论