文章目录
QTranslator 详解
前言
在国际化(i18n)开发中,为了让应用程序支持多语言,动态加载和切换翻译文件是一个常见需求。Qt 提供的 QTranslator
类专门用于加载翻译文件(通常是 .qm
格式)并将翻译内容应用到应用程序中。
QTranslator
是 Qt 国际化机制的重要组成部分,与 Qt 提供的 tr()
和 trUtf8()
函数以及 lupdate
和 linguist
工具链配合使用,可以实现高效的多语言支持。
什么是 QTranslator?
QTranslator
是 Qt 的一个类,用于加载和应用翻译文件,支持动态切换应用程序的语言环境。它的主要功能包括:
- 加载翻译文件:从指定路径加载
.qm
文件。 - 应用翻译内容:为应用程序中的字符串提供翻译。
- 支持动态语言切换:在运行时改变翻译内容。
典型应用场景包括:
- 多语言支持的桌面或移动应用。
- 动态切换用户界面语言。
- 使用 Qt Linguist 工具生成和应用翻译文件。
QTranslator 的构造函数和常用成员函数
构造函数
1. 默认构造函数
-
函数原型:
QTranslator(QObject *parent = nullptr);
-
作用:
创建一个空的QTranslator
对象,可以通过后续方法加载翻译文件。 -
参数:
parent
:可选参数,指定父对象,默认为空。
-
示例代码:
QTranslator translator;
常用成员函数
1. 加载翻译文件
load
-
函数原型:
bool load(const QString &filename, const QString &directory = QString(), const QString &searchDelimiters = QString(), const QString &suffix = QString());
-
作用:
从指定路径加载翻译文件。 -
参数:
filename
:翻译文件的基本名称(不包括路径)。directory
:翻译文件所在的目录。searchDelimiters
:可选的查找分隔符,用于扩展搜索范围。suffix
:文件后缀名,默认为空(通常为.qm
)。
-
返回值:
如果加载成功,返回true
;否则返回false
。 -
示例代码:
QTranslator translator; if (translator.load("app_zh_CN", ":/translations")) { qDebug() << "Translation loaded successfully."; } else { qDebug() << "Failed to load translation."; }
2. 安装翻译器到应用程序
QCoreApplication::installTranslator
-
函数原型:
static void QCoreApplication::installTranslator(QTranslator *translator);
-
作用:
将翻译器安装到应用程序中,应用其翻译内容。 -
参数:
translator
:需要安装的翻译器对象。
-
示例代码:
QTranslator translator; translator.load("app_zh_CN", ":/translations"); QCoreApplication::installTranslator(&translator);
3. 卸载翻译器
QCoreApplication::removeTranslator
-
函数原型:
static void QCoreApplication::removeTranslator(QTranslator *translator);
-
作用:
从应用程序中移除指定的翻译器,停止其翻译。 -
参数:
translator
:需要移除的翻译器对象。
-
示例代码:
QCoreApplication::removeTranslator(&translator);
4. 翻译字符串
translate
-
函数原型:
QString translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1) const;
-
作用:
根据上下文和源字符串返回翻译后的文本。 -
参数:
context
:上下文,通常是类名或模块名。sourceText
:源字符串。disambiguation
:可选的消歧义字符串,用于区分相同的源字符串。n
:用于复数形式的翻译。
-
返回值:
翻译后的字符串。如果没有找到对应的翻译,返回源字符串。 -
示例代码:
QString translated = translator.translate("MainWindow", "File"); qDebug() << "Translated Text:" << translated;
完整示例代码
以下示例展示了如何使用 QTranslator
动态加载和切换语言:
#include <QCoreApplication>
#include <QTranslator>
#include <QDebug>
#include <QLocale>
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
// 创建翻译器对象
QTranslator translator;
// 动态加载翻译文件
if (translator.load("app_zh_CN", ":/translations")) {
qDebug() << "Translation loaded successfully.";
QCoreApplication::installTranslator(&translator);
} else {
qDebug() << "Failed to load translation.";
}
// 翻译字符串
QString translated = QCoreApplication::translate("MainWindow", "File");
qDebug() << "Translated Text:" << translated;
return app.exec();
}
使用流程示例
1. 使用 Qt Linguist 工具链创建翻译文件
- 编写代码并标记需要翻译的字符串,例如:
QString text = tr("File");
在.pro里面添加:
TRANSLATIONS += translations/csdnex_zh_CN.ts \
translations/csdnex_en_US.ts
你要哪个语音的翻译就写哪些语音,后缀ts
-
使用
lupdate
工具生成.ts
翻译文件。lupdate your_project.pro
你需要打开vs的命令行
cd打开对应的路径,如/qttr
,输入上面的命令
-
使用 Qt Linguist 编辑
.ts
文件并生成.qm
文件。
编辑完之后进行保存,然后在打开vs的命令行
打开translate文件夹
输入:
lrelease csdnex_zh_CN.ts
lrelease csdnex_en_US.ts
然后现在就可以正式使用了
2. 加载和应用翻译文件
- 在应用程序启动时,根据用户选择的语言加载对应的
.qm
文件。 - 动态切换语言时,卸载当前翻译器并安装新的翻译器。
总结
QTranslator
是 Qt 国际化工具链中的关键组件,能够动态加载翻译文件并应用到程序中。通过与 tr()
和 Qt Linguist 工具的配合,开发者可以轻松实现多语言支持,提升应用程序的全球适配能力。
熟练掌握 QTranslator
的功能可以帮助开发者构建更灵活的国际化应用程序,同时增强用户体验,使程序更适合多语言环境。