Qt tr似乎不适用于静态常量成员?

时间:2009-09-28 11:06:36

标签: c++ qt translation

我正在努力翻译我们的Qt gui。

我有以下代码:

// header file
static const QString Foo;

// cpp file
const QString FooConstants::Foo = "foo"; 

// another cpp file
editMenu->addAction(tr(FooConstants::Foo));

这似乎不起作用。

也就是说,.ts文件中没有上述常量的条目。

如果我这样做,那就有效:

// another cpp file
editMenu->addAction(tr("foo"));

但是,这个常量在很多地方使用,我不想手动更新每个字符串文字。 (如果将来改变的话)

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:9)

将您的文字换成QT_TR_NOOP宏:

// cpp file
const QString FooConstants::Foo = QT_TR_NOOP("foo");

来自guide

  

如果您需要在函数外部提供可翻译文本,可以使用两个宏来帮助:QT_TR_NOOP()和QT_TRANSLATE_NOOP()。它们仅仅标记了lupdate工具提取的文本。宏扩展到文本(没有上下文)。

答案 1 :(得分:2)

正如托马斯所说,你必须使用一个宏。

原因是Qt默认不知道要翻译哪些字符串,它会扫描文件并查找一组模式。其中一个是tr("text"),但如果您想使用常量,则必须在定义时使用QT_TRANSLATE_NOOPQT_TR_NOOP明确标记。

答案 2 :(得分:0)

editMenu->addAction(tr(FooConstants::Foo));

我认为你的问题是tr采用char *参数,而不是QString:

QString QObject::tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 )

您可以在创建菜单操作时更改FooConstants :: Foo的类型,或将其转换为char *,例如:

 const QByteArray byteArray = FooConstants::Foo.toLatin1();
 char *data = byteArray.data();
 editMenu->addAction(tr(data));