QTranslator 类
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) | |
虚拟 | ~QTranslator() |
QString | filePath() const |
虚拟 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()) |
虚拟 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() 函数最多可以接受三个参数
例如,在对话框中的“取消”按钮,当程序在波兰语环境中运行时可能显示为“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())。
该翻译器对象的先前内容将被丢弃。
如果文件名不存在,将按以下顺序尝试其他文件名
- 不带suffix的文件名。
- 去除search_delimiters中字符后的文本(如果search_delimiters为空字符串,则默认为"_")并添加suffix的文件名。
- 不带suffix去除的文件名。
- 进一步去除文件名,等等。
例如,在一个运行在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 &)函数,因为它使用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
。
该翻译器对象的先前内容将被丢弃。
如果文件名不存在,将按以下顺序尝试其他文件名
- 不带suffix的文件名。
- 去除"_ "字符后的ui语言部分并添加suffix的文件名。
- 去除ui语言部分并添加suffix的文件名。
- 进一步去除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 还会尝试加载区域名称的小写版本。
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 公司以及/或全球其他国家的商标。所有其他商标均属于其各自的所有者。