在 Qt 中加载 .qm 翻译文件

在 Qt 中加载 .qm 翻译文件

Qt 使用 .qm 文件(由 .ts 文件编译生成)来实现应用程序的国际化(i18n)。以下是加载 .qm 文件到 Qt 程序的几种方法:

  1. 基本加载方法
cpp 复制代码
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();
}
  1. 从文件系统加载
cpp 复制代码
cpp
// 从应用程序目录加载
translator.load("translations/myapp_zh_CN.qm");

// 或者使用绝对路径
translator.load("/path/to/translations/myapp_zh_CN.qm");
  1. 从资源文件加载(推荐)
    首先将 .qm 文件添加到 .qrc 资源文件中:
cpp 复制代码
xml
<RCC>
    <qresource prefix="/translations">
        <file>myapp_zh_CN.qm</file>
    </qresource>
</RCC>
然后在代码中加载:

cpp
translator.load(":/translations/myapp_zh_CN.qm");
  1. 动态切换语言
cpp 复制代码
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;
    }
}
  1. 自动检测系统语言
cpp 复制代码
cpp
// 获取系统语言
QString locale = QLocale::system().name(); // 如 "zh_CN"

QTranslator translator;
if (translator.load(":/translations/myapp_" + locale + ".qm")) {
    app.installTranslator(&translator);
}
cpp 复制代码
注意事项
文件生成:确保 .qm 文件已通过 lrelease 工具从 .ts 文件生成:

text
lrelease myapp_zh_CN.ts
翻译对象生命周期:QTranslator 对象必须在整个应用程序生命周期内保持存在

字符串标记:源代码中所有需要翻译的字符串必须用 tr() 包裹:

cpp
QString text = tr("Hello World");
UI 文件翻译:.ui 文件中的字符串会自动被 uic 工具处理,无需手动标记

多翻译文件:可以同时加载多个翻译文件(如主程序翻译和库翻译)

资源更新:如果修改了翻译文件,需要重新编译并运行程序才能看到效果

完整示例

cpp 复制代码
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();
}
相关推荐
唐叔在学习8 分钟前
Python移动端应用消息提醒开发实践
开发语言·python
暴力求解9 分钟前
C++ ---string类(三)
开发语言·c++
Pocker_Spades_A15 分钟前
Python快速入门专业版(五十七)——POST请求与模拟登录:从表单分析到实战(以测试网站为例)
开发语言·python
道清茗29 分钟前
【RH294知识点汇总】第 3 章 《 管理变量和事实 》1
开发语言·python
星空椰29 分钟前
JavaScript基础:运算符和流程控制
开发语言·javascript·ecmascript
Halo_tjn31 分钟前
Java 接口的定义重构学生管理系统
java·开发语言·算法
阿Y加油吧38 分钟前
栈的经典应用:从「有效括号」到「寻找两个正序数组的中位数」深度解析
开发语言·python·算法
xiaotao13144 分钟前
阶段零:Python 安装与虚拟环境(venv / Conda)
开发语言·人工智能·python·conda
dr_yingli1 小时前
fMRI(4-1)统计分析报告生成器说明
开发语言·matlab
m0_716765231 小时前
数据结构--顺序表的插入、删除、查找详解
c语言·开发语言·数据结构·c++·学习·算法·visual studio