QTranslator 类

QTranslator 类提供对文本输出的国际化支持。 更多信息...

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

公开函数

QTranslator(QObject *parent = nullptr)
虚拟~QTranslator()
QStringfilePath() const
虚拟 boolisEmpty() const
QStringlanguage() const
boolload(const QString &filename, const QString &directory = QString(), const QString &search_delimiters = QString(), const QString &suffix = QString())
boolload(const QLocale &locale, const QString &filename, const QString &prefix = QString(), const QString &directory = QString(), const QString &suffix = QString())
boolload(const uchar *data, int len, const QString &directory = QString())
虚拟 QStringtranslate(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() 示例箭头板示例Troll 打印示例

成员函数文档

[显式] QTranslator::QTranslator(QObject * = nullptr)

构建一个空的带消息文件对象,以其父 parent 为参数,不连接到任何文件。

[虚拟 noexcept] QTranslator::~QTranslator()

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

QString QTranslator::filePath() const

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

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

[虚拟] 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(const QLocale &, const QString &, const QString &, const QString &)函数,因为它使用QLocale::uiLanguages()而不是仅使用区域设置名称,这涉及到日期和数字的格式,而不一定是UI语言。

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

加载filename + prefix + ui语言名称 + suffix (未指定suffix时为".qm"),该文件可能是一个绝对路径,也可能相对于directory。如果翻译成功加载,则返回 true;否则返回 false

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

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

  1. 不带suffix的文件名。
  2. 去除"_ "字符后的ui语言部分并添加suffix的文件名。
  3. 去除ui语言部分并添加suffix的文件名。
  4. 进一步去除ui语言部分,等等。

例如,在一个具有以下ui语言的区域设置中运行的程序 - "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())

此函数重载了 load()。

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

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

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

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

© 2024 Qt 公司有限公司。本文档中的文档贡献的版权属于其各自的所有者。提供的文档是根据由自由软件基金会发布的 GNU 自由文档许可版 1.3 的条款许可的。Qt 以及相应的商标是芬兰的 Qt 公司以及/或全球其他国家的商标。所有其他商标均属于其各自的所有者。