更多精彩内容 |
---|
👉内容导航 👈 |
👉Qt开发经验 👈 |
1 概述
在 Qt 中,
ts
文件和qm
文件是用于国际化和本地化的关键文件。以下是它们的详细说明:ts 文件
- 用途:
ts
文件是 Qt 的翻译源文件,存储了应用程序中需要翻译的字符串及其翻译内容。- 格式: 它是基于 XML 的文本文件,便于编辑和版本控制。
- 内容:
- 包含原始字符串(
source
)和翻译后的字符串(translation
)。- 还可能包含上下文(
context
)信息,用于区分不同模块中的相同字符串。- 生成方式:
- 使用 Qt 提供的工具
lupdate
从源代码中提取需要翻译的字符串,生成.ts
文件。- 示例命令:
lupdate myproject.pro -ts translations/myproject_zh_CN.ts
- 编辑方式:
- 可以使用 Qt 提供的翻译工具 Qt Linguist 进行翻译。
- 也可以手动编辑,因为它是 XML 格式。
qm文件
- 用途:
qm
文件是 Qt 的翻译二进制文件,供应用程序运行时加载使用。- 格式: 它是
.ts
文件的编译版本,体积更小,加载速度更快。- 生成方式:
- 使用 Qt 提供的工具
lrelease
将.ts
文件编译为.qm
文件。- 示例命令:
lrelease translations/myproject_zh_CN.ts
文件对比
特性 TS文件 QM文件 可编辑性 可人工编辑 不可编辑 文件格式 XML文本 二进制 生成阶段 开发阶段 构建/发布阶段 文件大小 较大(含元数据) 较小(优化存储) 运行时依赖 不需要 必需
环境 | 说明 |
---|---|
系统 | windows11 |
Qt | 5.14.2、6.8 |
IDE | qtcreator14 |
2 设置待翻译文本
创建一个Qt工程;
在UI文件中添加的文本都可以被翻译;
如果在
QObject
类的子类中,需要使用tr()
包含文本才可以被翻译;如果在普通函数、或者不是QObject子类的类中,就不能直接使用
tr()
函数包含待翻译的文本了,可以使用下面几种方式;
3 生成ts翻译源文件
方法1:
鼠标右键【添加新文件】;
选择【Qt】【Qt Translation File】;
选择语言,例如下图中选择
English
就可以将Qt中文本翻译位英文。
方法2:
打开
.pro
文件,添加如下所示代码,建议文件名包含语言和地区的代码(zh_CN
、en_US
等),会更加名称中缩写推理出适用于什么语言翻译。TRANSLATIONS += \ untitled9_en_US.ts\ a_zh_CN.ts\ b_zh_CN.ts
然后鼠标选择【工具】【外部】【Linguist】【lupdate】;
就可以在工程路径下生成对应的
ts
文件了;
4 编辑ts翻译源文件
鼠标选择ts文件,右键【Qt语言家】打开ts文件;
如下图所示,Qt UI界面中的文本或者使用
tr()
、QCoreApplication::translate()
包含的文件就可以在语言家中呈现。然后如下图所示,将中文文本翻译为英文文本,填入对应位置;
填写完翻译后,点击工具栏中的勾,就可以将选中的文本标记为已完成。
5 生成qm翻译二进制文件
编写完成ts文件后,鼠标点击【工具】【外部工具】【Linguist】【lrelease】,就可以将
ts
文件生成为qm
文件。生成的qm文件如下所示;
6 加载qm翻译文件进行翻译
如下所示,使用
QTranslator
加载qm翻译文件;#include "widget.h" #include <QApplication> #include <QDebug> #include <QTranslator> int main(int argc, char* argv[]) { QApplication a(argc, argv); QTranslator translator; if (translator.load("E:/test/untitled9/untitled9_en_US.qm")) { qDebug() << "加载成功"; QCoreApplication::installTranslator(&translator); } else { qDebug() << "加载失败"; } qDebug() << "main函数1"; qDebug() << QObject::tr("main函数2"); qDebug() << QCoreApplication::tr("main函数3", "描述信息"); qDebug() << QCoreApplication::translate("main", "main函数4"); qDebug() << QCoreApplication::translate("main", "main函数5", "描述信息"); Widget w; w.show(); return a.exec(); }
注意:
- 必须先调用
installTranslator()
再创建UI对象; - 多个翻译器会叠加生效,后加载的优先;
- 必须先调用
也可以使用
QString locale = QLocale::system().name(); // 获取系统语言,例如 "zh_CN"
获取操作系统语言来选中使用的qm文件;加载qm翻译文件成功后如下所示,在ts文件中填写了翻译信息的就会被翻译。
如果在程序运行时动态切换语言,需要调用
retranslateUi()
方法刷新界面。例如:ui->retranslateUi(this);