Qt:QTranslator类

1060 篇文章 292 订阅

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

头文件:

#include <QTranslator>

cmake:

find_package(Qt6 COMPONENTS Core REQUIRED)
target_link_libraries(mytarget PRIVATE Qt6::Core)

qmake:

QT += core

继承自:

QObject

详细说明

该类的对象包含一组从源语言到目标语言的翻译。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(), QLatin1String("myapp"), QLatin1String("_"), QLatin1String(":/i18n")))
        QCoreApplication::installTranslator(&translator);

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

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

在这里插入图片描述

注意,必须在应用程序的小部件之前创建translator。

大多数应用程序永远不需要使用这个类做任何其他事情。这个类提供的其他函数对于处理translator文件的应用程序很有用。

查找翻译

可以使用translate()查找翻译(就像tr()和QCoreApplication :: translate()一样)。translate()函数最多有三个形参:

  • context :通常是tr()调用者的类名
  • source text :通常是tr()的参数。
  • disambiguation(消除歧义) :一个可选的字符串,帮助消除同一文本在同一上下文中的不同用法的歧义。

例如,当程序以波兰语运行时,对话框中的“Cancel”可能有“Anuluj”(在本例中,源文本是“Cancel”)。上下文(通常)是对话框的类名;通常没有注释,翻译的文本是“Anuluj”。

但事情并不总是那么简单。带有双面打印和装订设置的西班牙语版打印机对话框可能需要“Activado”和“Activada”作为“Enabled”的翻译。在这种情况下,源文本在这两种情况下都是“启用”的,上下文是对话框的类名,但是这两个项都有消除歧义的功能,例如一个是“双面打印”,另一个是“绑定”。消除歧义使译者能够为西班牙语版本选择合适的性别,并使Qt能够区分译文。

使用多种翻译

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

这种机制使“翻译”的选择或相对于其他翻译的优先级成为可能。只需将翻译器传递到QCoreApplication :: removeTranslator()函数从应用程序中将其卸载,然后使用QCoreApplication :: installTranslator()重新安装它即可。然后它将是第一个要搜索匹配字符串的翻译。

另请参见:QCoreApplication::installTranslator(), QCoreApplication::removeTranslator(), QObject::tr(), QCoreApplication::translate(), I18N Example, Hello tr() Example, Arrow Pad Example, Troll Print Example.

成员函数

QTranslator

QTranslator::QTranslator(QObject *parent = nullptr)

构造一个具有未连接到任何文件的父级的空消息文件对象。

~QTranslator

[virtual]QTranslator::~QTranslator()

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

filePath

[since 5.15]QString QTranslator::filePath() const

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

如果还没有加载翻译,或者加载失败,或者翻译没有从文件中加载,则文件路径为空。

这个函数是在Qt 5.15中引入的。

isEmpty

[virtual]bool QTranslator::isEmpty() const

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

language

[since 5.15]QString QTranslator::language() const

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

Qt5.15中引入了此函数。

load

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

加载**文件名filename+后缀suffix **(如果未指定后缀,则为“.qm”),后缀可以是绝对文件名,也可以是相对于目录的。如果成功加载翻译,则返回true;否则返回false。

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

此转换器对象以前的内容将被丢弃。

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

  • 不带后缀的文件名。
  • 去除了search_delimiters中的字符后带有文本的文件名(如果为空字符串,则search_delimiters为默认值“ _。” )和后缀。
  • 文件名剥离,不加后缀。
  • 文件名进一步剥离,等等。

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

  • / opt / foolib / foo.fr_ca.qm
  • / opt / foolib / foo.fr_ca
  • / opt / foolib / foo.fr.qm
  • / opt / foolib / foo.fr
  • / opt / foolib / foo.qm
  • / opt / foolib / foo

通常,最好改用QTranslator :: load(const QLocale&,const QString&,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())

加载文件名+前缀+用户界面语言名称+后缀(如果未指定后缀,则为“.qm”),后缀可以是绝对文件名,也可以是相对于目录的。如果成功加载翻译,则返回true;否则返回false。

此转换器对象以前的内容将被丢弃。

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

  • 不带后缀的文件名。
  • 带有ui语言部分的文件名,在“ _”字符后加后缀。
  • ui语言部分的文件名被剥去,不附加后缀。
  • ui语言部分的文件名被进一步剥离,等等。

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

  • / opt / foolib / foo.es.qm
  • / opt / foolib / foo.es
  • / opt / foolib / foo.fr_CA.qm
  • / opt / foolib / foo.fr_CA
  • / opt / foolib / foo.fr.qm
  • / opt / foolib / foo.fr
  • / opt / foolib / foo.de.qm
  • / opt / foolib / foo.de
  • / opt / foolib / foo.qm
  • / opt / foolib / foo.
  • / opt / foolib / foo

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

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

这个函数重载load()。

将长度为len的QM文件数据加载到转换器中。

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

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

translate

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

返回键的翻译(上下文、sourceText、消歧)。如果没有找到,也尝试(context, sourceText, “”)。如果仍然失败,返回一个空字符串。

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

如果n不是-1,则使用它来选择适当的转换形式(例如:“%n文件找到”vs.“%n文件找到”文件“% n发现”)。

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

参见负载()。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QTranslatorQt框架中的一个,用于实现国际化和本地化功能。它可以将应用程序中的文本翻译成不同的语言。\[1\]通过使用QTranslator,可以在应用程序中加载和安装翻译文件,从而实现多语言支持。\[2\]在使用QTranslator时,可以使用load()函数加载翻译文件,并使用installTranslator()函数安装翻译器。这样,翻译器将成为应用程序中搜索匹配字符串的第一个翻译。\[2\]下面是一个使用QTranslator的main()函数示例,其中加载了一个翻译文件并将其安装到应用程序中。\[3\]通过使用QCoreApplication::translate()函数,可以将文本翻译为指定的语言。在示例中,QPushButton的文本被翻译为"Hello world!"。\[3\] #### 引用[.reference_title] - *1* [QT---之QTranslator【界面语言翻译】及QT-Linguist的用法](https://blog.csdn.net/weixin_39609623/article/details/82802666)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [QtQTranslator](https://blog.csdn.net/zhizhengguan/article/details/115727646)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值