Qt translation documentation指出您可以将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()
的第二个版本有效。有人知道为什么第一个版本不起作用吗?
答案 0 :(得分:1)
也许您不知道如何将问题减少到最小的可复制示例。这很重要,因为这样做可能会导致您自己在代码中发现错误,或者使其他人可以轻松地对其进行诊断。
例如,您没有提供MyClass
的完整定义。作为tr()
的成员,我想QObject
直接或间接继承自MyClass
,但是您可能在此过程中忘记了某些东西。另一种可能性是您使用了QObject
和Q_DECLARE_TR_FUNCTIONS(MyClass)
,因此它不必是MyClass
的子类吗?
无论如何,我已经测试了这两个选项,并且对我来说没有任何错误。这是我的最小示例。您需要运行QObject
以创建应复制到输出目录的“ i18n_es.qm”。
test.pro
lrelease
main.cpp
QT -= gui
CONFIG += c++11 console
SOURCES += main.cpp
TRANSLATIONS += i18n_es.ts
i18n_es.ts
#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();
}
输出
<?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>
答案 1 :(得分:0)
关于两个宏的documentation says:
它们只是标记要由lupdate工具提取的文本。宏将扩展为仅文本(没有上下文)。
因此,宏不会直接干扰tr()或QApplication :: translate()。宏用于标记字符串,以便lupdate在创建源.ts文件时将其提取,lrelease将使用它们来创建.qm转换文件。