我正在努力翻译我们的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"));
但是,这个常量在很多地方使用,我不想手动更新每个字符串文字。 (如果将来改变的话)
有人可以帮忙吗?
答案 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_NOOP
或QT_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));