在 Qt 中加载 .qm 翻译文件

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

  1. 基本加载方法
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
// 从应用程序目录加载
translator.load("translations/myapp_zh_CN.qm");

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

cpp
translator.load(":/translations/myapp_zh_CN.qm");
  1. 动态切换语言
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
// 获取系统语言
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();
}
<think>我们讨论的是如何将Qt.ts翻译文件转换为.qm文件。根据用户的问题,他们想知道如何通过命令行工具`lupdate`将`test.ts`生成`test.qm`,但实际上,`lupdate`负责从源代码中提取字符串并更新`.ts`文件,而将`.ts`编译为`.qm`文件通常使用`lrelease`命令。因此,正确的步骤是:1.使用`lupdate`更新或生成.ts文件(但用户已经有一个test.ts文件)2.使用`lrelease`将.ts文件编译为.qm文件。用户提供的引用[1]中已经给出了使用lrelease命令的示例:setlrelease=C:/Qt/Qt5.15.2/5.15.2/msvc2015_64/bin/lrelease.exe%lrelease%test_zh_CN.ts-qmtest_zh_CN.qm所以,我们只需使用lrelease命令即可完成转换。具体步骤如下:步骤1:确保已经安装了Qt,并且知道Qt的安装路径(以便找到lrelease.exe)。步骤2:打开命令行(cmd)并切换到包含test.ts文件的目录。步骤3:运行以下命令(请根据实际安装路径调整lrelease的路径):"C:\Qt\Qt5.15.2\5.15.2\msvc2015_64\bin\lrelease.exe"test.ts-qmtest.qm说明:-这里假设Qt安装在C盘,具体版本和编译器路径请根据实际情况修改。-`test.ts`是输入的翻译文件。-`-qmtest.qm`表示输出文件为test.qm。或者,如果已经将Qt的bin目录加入到环境变量PATH中(如引用[2]所述),则可以直接运行:lreleasetest.ts-qmtest.qm步骤4:检查当前目录下是否生成了test.qm文件。注意:如果用户有多个.ts文件,可以依次运行命令,或者像引用[1]那样写一个批处理脚本。另外,引用[3]提到可以更新指定的ts文件,但这里我们不需要更新ts文件(已经存在),只需要编译。因此,答案总结为:使用lrelease命令,指定输入.ts文件和输出.qm文件。下面按照格式要求给出回答:</think> 要在 Qt 中使用命令行将 `.ts` 翻译文件转换为 `.qm` 文件,需使用 `lrelease` 工具(非 `lupdate`)。以下是具体步骤: ### 📜 转换步骤 (Windows 示例) 1. **定位工具路径** Qt 安装目录下的 `bin` 文件夹中包含 `lrelease.exe`,例如: `C:\Qt\5.15.2\msvc2019_64\bin\lrelease.exe` 2. **执行转换命令** 在命令行中运行(替换实际路径和文件名): ```bash # 单个文件转换 "C:\Qt\5.15.2\msvc2019_64\bin\lrelease.exe" test.ts -qm test.qm # 批量转换多个文件 "C:\Qt\5.15.2\msvc2019_64\bin\lrelease.exe" test_zh_CN.ts test_en.ts -qm zh_CN.qm en.qm ``` * `-qm` 参数指定输出文件名[^1] 3. **验证结果** 成功执行后,会在当前目录生成二进制 `.qm` 文件 ### ⚙️ 环境配置优化 若频繁使用,可简化操作: 1. **添加 Qt 到系统 PATH** ```bash set PATH=%PATH%;C:\Qt\5.15.2\msvc2019_64\bin ``` 配置后直接运行: ```bash lrelease test.ts -qm test.qm # 无需完整路径[^2] ``` 2. **脚本自动化** (批处理示例) ```batch @echo off set LRELEASE="C:\Qt\5.15.2\msvc2019_64\bin\lrelease.exe" %LRELEASE% test_zh_CN.ts -qm app_zh.qm %LRELEASE% test_en.ts -qm app_en.qm pause ``` ### 🚨 注意事项 1. `lupdate` 与 `lrelease` 的区别: - `lupdate`: 从源码提取字符串➜更新 `.ts` 文件[^3] - `lrelease`: 将 `.ts` 编译为二进制的 `.qm` 文件[^1] 2. 若遇 CPU 占用过高问题: 检查 `.ts` 文件编码是否正确(推荐 UTF-8),避免文件路径含特殊字符[^5] 3. `.qm` 文件使用时需通过 `QTranslator` 加载: ```cpp QTranslator translator; translator.load(":/i18n/test.qm"); // 资源路径或文件路径 qApp->installTranslator(&translator); ``` 💡 **完整工作流** 1. 用 `lupdate` 生成/更新 `.ts` 2. 用 *Qt Linguist* 翻译字符串[^4] 3. 用 `lrelease` 编译 `.ts` ➜ `.qm` 4. 程序中动态加载 `.qm` 实现多语言
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值