Qt使用lupdate
工具导出ts
文件来记录需要翻译的文本信息,经过翻译后,再使用lrelease
工具生成qm
文件,然后在程序中加载qm
文件的方式来实现多语言。
ts文件格式
ts文件是xml格式的文件文件,格式如下所示
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
<name>QLineEdit</name>
<message>
<location filename="../src/gui/widgets/qlineedit.cpp" line="+2680"/>
<source>&Undo</source>
<translation>撤消(&U)</translation>
</message>
<message>
<location line="+4"/>
<source>&Redo</source>
<translation>恢复(&R)</translation>
</message>
<message>
<location line="+7"/>
<source>Cu&t</source>
<translation>剪切(&T)</translation>
</message>
<message>
<location line="+4"/>
<source>&Copy</source>
<translation>复制(&C)</translation>
</message>
<message>
<location line="+4"/>
<source>&Paste</source>
<translation>粘贴(&P)</translation>
</message>
<message>
<location line="+5"/>
<source>Delete</source>
<translation>删除</translation>
</message>
<message>
<location line="+6"/>
<source>Select All</source>
<translation>选择全部</translation>
</message>
</context>
</TS>
解释说明下各标签含义
<context>
<name>类名</name>
<message>
<location 定位到源文件位置,这个标签可以没有/>
<source>源文件中tr("***")中的需要翻译的文本</source>
<translation>翻译后的文本</translation>
</message>
</context>
lupdate、lrelease
在.pro文件中加上如下一行
TRANSLATIONS = app_zh_CN.ts app_zh_CN.qm
即表示将源码中使用到tr
的地方导出到app_zh_CN.ts
,然后编译成app_zh_CN.qm
这个过程需要使用到两个工具,就是lupdate
和lrelease
,在Qt的安装目录下可以找到这两个命令
使用方式如下:
lupdate yourapp.pro
lrelease app_zh_CN.ts
当然如果你使用QtCreator,在菜单项的Tools->External->Qt语言家
中可以直接点击使用
先使用lupdate生成ts
文件,然后使用编辑器或者Qt自带的lingust
工具打开ts
文件,翻译填充上<translation>
标签,然后使用lrelease
命令即可生成序列化后的qm
文件。
QTranslator
在程序初始化代码中,书写如下代码即可加载qm
语言翻译包
// 加载app自定义语言包
QTranslator *translator = new QTranslator(qApp);
translator->load(qm);
qApp->installTranslator(translator);
// 加载qt自带语言包
QTranslator *qt_translator = new QTranslator(qApp);
qt_translator->load(QLocale(), "qt", "_", ":/lang");
//qt_translator->load(":/lang/qt_zh_CN.qm");
qApp->installTranslator(qt_translator);
Bug
这里指出qt自带语言包qt_zh_CN.ts
中的一个bug,改bug导致加载qt_zh_CN.qm
后QMessageBox
和QDialogButtonBox
中的标准按钮仍然无法汉化显示。
解决方法如下:
打开qt_zh_CN.ts
后将QDialogButtonBox
替换成QPlatformTheme
,然后使用lrelease
,重新导出qt_zh_CN.qm
即可。
参考https://bugreports.qt.io/browse/QTBUG-39180
懒得操作的同学可以直接到我的百度网盘下载一份直接用,我已经修复好的qt_zh_CN.ts
和qt_zh_CN.qm
文件
https://pan.baidu.com/s/1f0GgqSskRJjXRh3THWUTrA
替换上新的qt_zh_CN.qm
后可以发现,QDialogButtonBox中的Open和Cancle
按钮已经汉化了,QLineEdit
右键菜单也汉化了