在 Qt 中加载 .qm 翻译文件
Qt 使用 .qm 文件(由 .ts 文件编译生成)来实现应用程序的国际化(i18n)。以下是加载 .qm 文件到 Qt 程序的几种方法:
- 基本加载方法
cpp
#include <QApplication>
#include <QTranslator>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建翻译器对象
QTranslator translator;
// 加载翻译文件
if (translator.load(":/translations/myapp_zh_CN.qm")) {
app.installTranslator(&translator);
} else {
qWarning() << "Failed to load translation file";
}
// 你的应用程序代码...
return app.exec();
}
- 从文件系统加载
cpp
// 从应用程序目录加载
translator.load("translations/myapp_zh_CN.qm");
// 或者使用绝对路径
translator.load("/path/to/translations/myapp_zh_CN.qm");
- 从资源文件加载(推荐)
首先将 .qm 文件添加到 .qrc 资源文件中:
xml
<RCC>
<qresource prefix="/translations">
<file>myapp_zh_CN.qm</file>
</qresource>
</RCC>
然后在代码中加载:
cpp
translator.load(":/translations/myapp_zh_CN.qm");
- 动态切换语言
cpp
// 切换翻译的函数
void switchLanguage(const QString &language)
{
QTranslator *translator = new QTranslator(qApp);
if (translator->load(":/translations/myapp_" + language + ".qm")) {
qApp->removeTranslator(currentTranslator); // 移除旧的
qApp->installTranslator(translator); // 安装新的
currentTranslator = translator;
} else {
delete translator;
}
}
- 自动检测系统语言
cpp
// 获取系统语言
QString locale = QLocale::system().name(); // 如 "zh_CN"
QTranslator translator;
if (translator.load(":/translations/myapp_" + locale + ".qm")) {
app.installTranslator(&translator);
}
注意事项
文件生成:确保 .qm 文件已通过 lrelease 工具从 .ts 文件生成:
text
lrelease myapp_zh_CN.ts
翻译对象生命周期:QTranslator 对象必须在整个应用程序生命周期内保持存在
字符串标记:源代码中所有需要翻译的字符串必须用 tr() 包裹:
cpp
QString text = tr("Hello World");
UI 文件翻译:.ui 文件中的字符串会自动被 uic 工具处理,无需手动标记
多翻译文件:可以同时加载多个翻译文件(如主程序翻译和库翻译)
资源更新:如果修改了翻译文件,需要重新编译并运行程序才能看到效果
完整示例
cpp
#include <QApplication>
#include <QTranslator>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 加载翻译
QTranslator translator;
if (translator.load(":/translations/myapp_zh_CN.qm")) {
app.installTranslator(&translator);
}
// 创建带翻译文本的UI
QWidget window;
QVBoxLayout *layout = new QVBoxLayout(&window);
QLabel *label = new QLabel(tr("Hello World!"));
QPushButton *button = new QPushButton(tr("Click Me"));
layout->addWidget(label);
layout->addWidget(button);
window.show();
return app.exec();
}