Qt翻译文档指出,您可以将QT_TRANSLATE_NOOP
宏用于将通过tr()
和QApplication::translate()
翻译的字符串,例如:
static const char* HelloStr = QT_TRANSLATE_NOOP("MyClass", "Hello World");
void MyClass::helloWorld()
{
qDebug() << tr(HelloStr);
qDebug() << QApplication::translate("MyClass", HelloStr);
}
据我了解,我只需要确保提供给QT_TRANSLATE_NOOP
的上下文与调用tr()
函数的类名相同。但是在运行此代码时,我得到以下输出:
Hello World
Hallo Welt
只有第二个版本,使用QApplication::translate()
确实有效。有谁知道为什么第一个版本不起作用?
也许您不知道如何将问题简化为最小的可重现示例。这很重要,因为这样做可能会自己发现代码中的错误,或者有助于其他人轻松诊断它。
例如,您没有提供MyClass
的完整定义。tr()
作为QObject
的成员,我想MyClass
直接或间接地继承了QObject
,但也许你在这个过程中忘记了一些东西。另一种可能性是你使用了Q_DECLARE_TR_FUNCTIONS(MyClass)
和MyClass
所以它不需要是QObject
的子类?
无论如何,我已经测试了这两个选项,它对我有用,没有错误。这是我的最小示例。您需要运行lrelease
来创建应复制到输出目录的"i18n_es.qm"。
test.pro
QT -= gui
CONFIG += c++11 console
SOURCES += main.cpp
TRANSLATIONS += i18n_es.ts
主.cpp
#include <QCoreApplication>
#include <QTranslator>
#include <QDebug>
static const char* HelloStr = QT_TRANSLATE_NOOP("MyClass", "Hello World");
class MyClass
{
Q_DECLARE_TR_FUNCTIONS(MyClass)
public:
void helloWorld() {
qDebug() << tr(HelloStr);
qDebug() << QCoreApplication::translate("MyClass", HelloStr);
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTranslator translator;
qDebug() << "loaded translations ?" << translator.load("i18n_es");
qDebug() << "installed translator ?" << QCoreApplication::installTranslator(&translator);
MyClass test;
test.helloWorld();
return a.exec();
}
i18n_es.ts
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="es_ES">
<context>
<name>MyClass</name>
<message>
<location filename="main.cpp" line="5"/>
<source>Hello World</source>
<translation>Hola mundo</translation>
</message>
</context>
</TS>
输出
loaded translations ? true
installed translator ? true
"Hola mundo"
"Hola mundo"
文档介绍了这两个宏:
它们只是标记文本以供 lupdate 工具提取。宏仅扩展到文本(不带上下文(。
因此,宏不会直接干扰 tr(( 或 QApplication::translate((。这些宏旨在标记 lupdate 的字符串,以便在创建源 .ts 文件时提取它们,lrelease 将使用这些源文件来创建 .qm 翻译文件。