本页内容

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() 函数示例:

// Required for using the '_L1' string literal.
using namespace Qt::StringLiterals;

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() 的参数。
  • 消歧信息——一个可选字符串,用于帮助区分同一上下文中相同文本的不同用法。

例如,当程序在波兰语环境下运行时,对话框中的“Cancel”可能会显示为“Anuluj”(此时源文本即为“Cancel”)。 上下文(通常)是对话框的类名;通常不会有注释,翻译后的文本为“Anuluj”。

但情况并不总是这么简单。一个包含双面打印和装订设置的打印机对话框的西班牙语版本,可能需要同时使用“Activado”和“Activada”作为“Enabled”的翻译。 在这种情况下,两种情况的源文本都是“Enabled”,上下文也是对话框的类名,但这两个项目会有消除歧义的信息,例如一个是“双面打印”,另一个是“装订”。 这种消除歧义的处理方式既能让译者为西班牙语版本选择合适的性别形式,也能让 Qt 区分不同的翻译。

使用多个翻译

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

这种机制使得可以“选定”特定翻译或使其优先于其他翻译;只需通过将翻译器传递给QCoreApplication::removeTranslator()函数将其从应用程序中卸载,然后使用QCoreApplication::installTranslator()重新安装即可。这样,该翻译文件将成为搜索匹配字符串时首先被检索的翻译。

安全注意事项

请仅安装来自可信来源的翻译文件。

翻译文件是基于文本翻译源文件生成的二进制文件。这些二进制文件的格式由 Qt 严格定义,对二进制文件中的数据进行任何操作都可能导致在加载文件时应用程序崩溃。此外,即使是格式正确的翻译文件,也可能包含误导性或恶意的翻译内容。

另请参阅 QCoreApplication::installTranslator(),QCoreApplication::removeTranslator(),QObject::tr(),QCoreApplication::translate(),“本地化时钟示例”、“箭头键盘示例 ”以及“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 区域设置(法语加拿大)下运行的应用程序可能会调用 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 还会尝试加载该区域设置名称的小写版本。

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

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

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

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

此函数重载了QTranslator::load()。

[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()。

© 2026 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.