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中,则可以重新实现此函数。
参见负载()。