Qt多语言翻译示例

一个基础的翻译示例和一些注意事项


示例目录

1
2
3
4
5
6
7
8
9
QtTranslation/
├── Languages
│   ├── en.qm
│   ├── en.ts
│   ├── Languages.qrc
│   ├── zh_CN.qm
│   └── zh_CN.ts
├── main.cpp
└── QtTranslation.pro

注意事项

  • 将翻译文件(ts后缀)生成的qm后缀文件用资源文件(Languages.qrc)包括以供程序引用;
  • translator.load(":/zh_CN.qm")需要以”:/“为前缀引用,不能使用”qrc:/“为前缀引用,否则load返回错误;
  • 使用QObject::tr翻译原因是该翻译的上下文为QObject对应ts文件的是<name>QObject</name>的值;
  • 翻译上下文使用不正确,明明是加载成功的语言文件就是翻译不成功,很多是因为这个上下文导致;
  • 可使用QCoreApplication::translate接口指定上下文,如用QCoreApplication::translate("QObject", "start")指定”QObject”上下文标识。

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <QCoreApplication>
#include <QTranslator>

#include <QDebug>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTranslator translator;
if (! translator.load(":/zh_CN.qm")) {
qDebug()<<"Failed to load translation file!";
}
qApp->installTranslator(&translator);

qDebug()<<QObject::tr("start")<<QObject::tr("end");
qDebug()<<QObject::tr("open")<<QObject::tr("close");

qApp->removeTranslator(&translator);
if (! translator.load(":/en.qm")) {
qDebug()<<"Failed to load translation file!";
}

/* Switch language */
qApp->installTranslator(&translator);

qDebug()<<QObject::tr("start")<<QObject::tr("end");
qDebug()<<QObject::tr("open")<<QObject::tr("close");

return 0;
}

QtTranslation.pro 项目文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
QT += core
QT -= gui

CONFIG += c++11

TARGET = QtTranslation
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

RESOURCES += \
Languages/languages.qrc

TRANSLATIONS += \
Languages/en.ts \
Languages/zh_CN.ts

zh_CN.ts 中文翻译文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="zh_CN">
<context>
<name>QObject</name>
<message>
<source>start</source>
<translation>开始</translation>
</message>
<message>
<source>end</source>
<translation>结束</translation>
</message>
<message>
<source>open</source>
<translation>打开</translation>
</message>
<message>
<source>close</source>
<translation>关闭</translation>
</message>
</context>
</TS>

en.ts 英文翻译文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="en">
<context>
<name>QObject</name>
<message>
<source>start</source>
<translation>Start</translation>
</message>
<message>
<source>end</source>
<translation>End</translation>
</message>
<message>
<source>open</source>
<translation>Open</translation>
</message>
<message>
<source>close</source>
<translation>Close</translation>
</message>
</context>
</TS>

Languages.pri 文件

1
2
3
4
5
6
<RCC>
<qresource prefix="/">
<file>en.qm</file>
<file>zh_CN.qm</file>
</qresource>
</RCC>

程序输出

1
2
3
4
"开始" "结束"
"打开" "关闭"
"Start" "End"
"Open" "Close"

示例地址https://github.com/aeagean/QtTranslation.git