4

我目前正在翻译我们的 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"));

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

任何人都可以帮忙吗?

4

3 回答 3

10

将您的文字包装在QT_TR_NOOP宏中:

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

指南

如果您需要将可翻译文本完全放在函数之外,有两个宏可以提供帮助:QT_TR_NOOP() 和 QT_TRANSLATE_NOOP()。它们只是标记文本以供 lupdate 工具提取。宏扩展为仅文本(没有上下文)。

于 2009-09-28T11:20:14.350 回答
2

正如托马斯所提到的,您必须使用宏。

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

于 2009-09-28T12:11:01.610 回答
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));
于 2009-09-28T11:44:38.963 回答