Bootstrap

详解Qt QTranslator 翻译类


QTranslator 详解

前言

在国际化(i18n)开发中,为了让应用程序支持多语言,动态加载和切换翻译文件是一个常见需求。Qt 提供的 QTranslator 类专门用于加载翻译文件(通常是 .qm 格式)并将翻译内容应用到应用程序中。

QTranslator 是 Qt 国际化机制的重要组成部分,与 Qt 提供的 tr()trUtf8() 函数以及 lupdatelinguist 工具链配合使用,可以实现高效的多语言支持。


什么是 QTranslator?

QTranslator 是 Qt 的一个类,用于加载和应用翻译文件,支持动态切换应用程序的语言环境。它的主要功能包括:

  1. 加载翻译文件:从指定路径加载 .qm 文件。
  2. 应用翻译内容:为应用程序中的字符串提供翻译。
  3. 支持动态语言切换:在运行时改变翻译内容。

典型应用场景包括:

  • 多语言支持的桌面或移动应用。
  • 动态切换用户界面语言。
  • 使用 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 工具链创建翻译文件

  1. 编写代码并标记需要翻译的字符串,例如:
    QString text = tr("File");
    

在.pro里面添加:

TRANSLATIONS += translations/csdnex_zh_CN.ts \
                translations/csdnex_en_US.ts

你要哪个语音的翻译就写哪些语音,后缀ts

  1. 使用 lupdate 工具生成 .ts 翻译文件。lupdate your_project.pro 你需要打开vs的命令行
    在这里插入图片描述
    cd打开对应的路径,如/qttr,输入上面的命令
    在这里插入图片描述

  2. 使用 Qt Linguist 编辑 .ts 文件并生成 .qm 文件。
    在这里插入图片描述
    编辑完之后进行保存,然后在打开vs的命令行
    打开translate文件夹
    输入:

lrelease csdnex_zh_CN.ts
lrelease csdnex_en_US.ts

在这里插入图片描述
然后现在就可以正式使用了

2. 加载和应用翻译文件

  • 在应用程序启动时,根据用户选择的语言加载对应的 .qm 文件。
  • 动态切换语言时,卸载当前翻译器并安装新的翻译器。

总结

QTranslator 是 Qt 国际化工具链中的关键组件,能够动态加载翻译文件并应用到程序中。通过与 tr() 和 Qt Linguist 工具的配合,开发者可以轻松实现多语言支持,提升应用程序的全球适配能力。

熟练掌握 QTranslator 的功能可以帮助开发者构建更灵活的国际化应用程序,同时增强用户体验,使程序更适合多语言环境。

;