Qt5 QT_TRANSLATE_NOOP不适用于tr()

时间:2019-09-18 08:28:38

标签: c++ qt qt5

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()的第二个版本有效。有人知道为什么第一个版本不起作用吗?

2 个答案:

答案 0 :(得分:1)

也许您不知道如何将问题减少到最小的可复制示例。这很重要,因为这样做可能会导致您自己在代码中发现错误,或者使其他人可以轻松地对其进行诊断。

例如,您没有提供MyClass的完整定义。作为tr()的成员,我想QObject直接或间接继承自MyClass,但是您可能在此过程中忘记了某些东西。另一种可能性是您使用了QObjectQ_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转换文件。