QTranslator Class

QTranslator 类为文本输出提供国际化支持。更多

头文件: #include <QTranslator>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
继承: QObject

公共函数

QTranslator(QObject *parent = nullptr)
virtual ~QTranslator()
QString filePath() const
virtual bool isEmpty() const
QString language() const
bool load(const QString &filename, const QString &directory = QString(), const QString &search_delimiters = QString(), const QString &suffix = QString())
bool load(const QLocale &locale, const QString &filename, const QString &prefix = QString(), const QString &directory = QString(), const QString &suffix = QString())
bool load(const uchar *data, int len, const QString &directory = QString())
virtual QString translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1) const

详细说明

该类的一个对象包含一组从源语言到目标语言的翻译。QTranslator 提供了在翻译文件中查找翻译的函数。翻译文件使用 Qt Linguist.

QTranslator 最常见的用途是:加载翻译文件,并使用QCoreApplication::installTranslator() 安装。

下面是一个使用 QTranslator 的main() 函数示例:

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QTranslator translator;
    // look up e.g. :/i18n/myapp_de.qm
    if (translator.load(QLocale(), "myapp"_L1, "_"_L1, ":/i18n"_L1))
        QCoreApplication::installTranslator(&translator);

    QPushButton hello(QCoreApplication::translate("main", "Hello world!"));
    hello.resize(100, 30);

    hello.show();
    return app.exec();
}

请注意,翻译器必须应用程序的部件之前创建。

大多数应用程序都不需要使用该类做其他任何事情。该类提供的其他函数对处理翻译文件的应用程序非常有用。

查找翻译

可以使用translate() 查询译文(与tr() 和QCoreApplication::translate() 一样)。translate() 函数最多需要三个参数:

  • 上下文--通常是tr() 调用者的类名。
  • 源文本--通常是tr() 的参数。
  • 消歧义--一个可选字符串,用于帮助消歧同一上下文中同一文本的不同用法。

例如,当程序以波兰语运行时,对话框中的 "取消 "可能是 "Anuluj"(在这种情况下,源文本应为 "取消")。上下文(通常)是对话框的类名;通常没有注释,翻译后的文本是 "Anuluj"。

但事情并不总是这么简单。一个打印机对话框的西班牙语版本包含双面打印和装订设置,可能需要用 "Activado "和 "Activada "来翻译 "启用"。在这种情况下,源文本在两种情况下都是 "已启用",上下文是对话框的类名,但这两个项目会有歧义,如一个是 "双面打印",另一个是 "装订"。这种消歧义功能使翻译人员能够为西班牙语版本选择适当的性别,并使 Qt 能够区分不同的翻译。

使用多个翻译

一个应用程序中可以安装多个翻译文件。翻译文件的搜索顺序与安装顺序相反,因此首先搜索最近安装的翻译文件,最后搜索最早安装的翻译文件。一旦找到包含匹配字符串的翻译,搜索就会停止。

通过这种机制,可以 "选择 "某个特定的翻译,或赋予其优先于其他翻译的地位;只需将翻译传递给QCoreApplication::removeTranslator() 函数,将其从应用程序中卸载,然后使用QCoreApplication::installTranslator() 重新安装即可。这样,它就会成为搜索匹配字符串的第一个翻译。

另请参阅 QCoreApplication::installTranslator()、QCoreApplication::removeTranslator()、QObject::tr()、QCoreApplication::translate()、I18N 示例Hello tr() 示例Arrow Pad 示例Troll Print 示例

成员函数文档

[explicit] QTranslator::QTranslator(QObject *parent = nullptr)

构造一个空的消息文件对象,其父parent 未连接到任何文件。

[virtual noexcept] QTranslator::~QTranslator()

销毁对象并释放已分配的资源。

QString QTranslator::filePath() const

返回已加载翻译文件的路径。

如果尚未加载翻译文件、加载失败或未从文件加载翻译文件,则文件路径为空。

[virtual] bool QTranslator::isEmpty() const

如果该翻译文件为空,则返回true ,否则返回false 。此函数适用于已剥离和未剥离的翻译文件。

QString QTranslator::language() const

返回翻译文件中存储的目标语言。

bool QTranslator::load(const QString &filename, const QString &directory = QString(), const QString &search_delimiters = QString(), const QString &suffix = QString())

加载filename +suffix (如果未指定suffix ,则加载".qm"),它可以是一个绝对文件名,也可以是directory 的相对文件名。如果翻译成功加载,则返回true ;否则返回false

如果未指定directory ,则使用当前目录(即currentPath() )。

该翻译对象之前的内容将被丢弃。

如果文件名不存在,将按以下顺序尝试其他文件名:

  1. 未附加suffix 的文件名。
  2. 文件名中search_delimiters 字符后的文本已剥除(如果search_delimiters 为空字符串,则默认为"_."),suffix
  3. 文件名已剥离,但未附加suffix
  4. 进一步剥离的文件名,等等。

例如,在 fr_CA locale(加拿大法语区)运行的应用程序可能会调用 load("foo.fr_ca","/opt/foolib")。然后,load() 会尝试打开该列表中第一个现有的可读文件:

  1. /opt/foolib/foo.fr_ca.qm
  2. /opt/foolib/foo.fr_ca
  3. /opt/foolib/foo.fr.qm
  4. /opt/foolib/foo.fr
  5. /opt/foolib/foo.qm
  6. /opt/foolib/foo

通常,最好使用 QTranslator::load(constQLocale &, constQString &, constQString &, constQString &, constQString &) 函数,因为它使用的是QLocale::uiLanguages() 而非简单的本地名称,后者指的是日期和数字的格式,而不一定是用户界面语言。

bool QTranslator::load(const QLocale &locale, const QString &filename, const QString &prefix = QString(), const QString &directory = QString(), const QString &suffix = QString())

加载filename +prefix +ui language name +suffix (如果未指定suffix ,则为".qm"),它可以是一个绝对文件名,也可以是directory 的相对文件名。如果翻译成功加载,则返回true ;否则返回false

该翻译对象之前的内容将被丢弃。

如果文件名不存在,将按以下顺序尝试其他文件名:

  1. 未附加suffix 的文件名。
  2. 文件名中"_"字符后的 ui 语言部分被去掉,suffix
  3. 文件名的 ui 语言部分被去掉,但未附加suffix
  4. 文件名的 ui 语言部分被进一步剥离,等等。

例如,在locale 中运行的应用程序如果使用以下ui languages - "es"、"fr-CA"、"de",可能会调用 load(QLocale(), "foo",".","/opt/foolib",".qm")。load() 会用ui 语言中的"_"(下划线)替换"-"(破折号),然后尝试打开列表中第一个现有的可读文件:

  1. /opt/foolib/foo.es.qm
  2. /opt/foolib/foo.es
  3. /opt/foolib/foo.fr_CA.qm
  4. /opt/foolib/foo.fr_CA
  5. /opt/foolib/foo.fr.qm
  6. /opt/foolib/foo.fr
  7. /opt/foolib/foo.de.qm
  8. /opt/foolib/foo.de
  9. /opt/foolib/foo.qm
  10. /opt/foolib/foo.
  11. /opt/foolib/foo

在文件系统区分大小写的操作系统上,QTranslator 也会尝试加载小写版本的 locale 名称。

bool QTranslator::load(const uchar *data, int len, const QString &directory = QString())

此函数重载 load()。

将长度为len 的 QM 文件数据data 加载到翻译器中。

数据不会被复制。调用者必须能够保证data 不会被删除或修改。

directory 仅用于在加载 QM 文件的依赖项时指定基本目录。如果文件没有依赖关系,则忽略该参数。

[virtual] QString QTranslator::translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1) const

返回密钥 (context,sourceText,disambiguation) 的翻译。如果找不到,也会尝试 (context,sourceText, "" )。如果仍然失败,则返回空字符串。

注意: 不完整的翻译可能会导致意想不到的行为:如果没有提供 (context,sourceText, "") 的翻译,在这种情况下,该方法实际上可能会返回不同disambiguation 的翻译。

如果n 不是-1,它将用于选择适当的翻译形式(例如 "找到 %n 文件 "与 "找到 %n 文件")。

如果需要以编程方式将翻译插入QTranslator ,可以重新实现该函数。

另请参阅 load()。

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.