我正在开发Qt UI应用程序并本地化UI字符串。在我的应用程序中,我使用QLabel并动态设置文本。我尝试了两种设置本地化文本的方法。在执行应用程序时,我可以看到,在我的第一个方法中字符串已经被本地化,但在第二种方法中它们不是。
//Approach 1:
//ui.cpp
//Directly hardcoding the values
labelBox1->setText(QApplication::translate("context","test string"));
//Approach 2:
//UI_Consts.h
static const QString str = QT_TRANSLATE_NOOP("Context","Test String");
//variable 'str' is in global scope
//ui.cpp
#include "UI_Consts.h"
...
labelBox1->setText(str);
当我调试为什么第二种方法不起作用时,我发现全局变量在执行main函数之前被初始化。我们通常在main()中编写用于翻译的代码,因此这些全局变量不会被翻译。 我更喜欢第二种方法,因为我们可以在单个文件中列出所有UI字符串并轻松维护它们。我想知道有没有办法本地化在全局范围内声明的字符串(就像我的第二种方法中使用的那样)?
答案 0 :(得分:2)
嗯,这不是Qt翻译系统的用途......
但是如果你想这样做,你可以编写一个函数(或实现一个包含所有字符串的类/结构),在加载{{1}中的翻译后初始化所有字符串变量 - 当然这会导致甚至更多代码:D
答案 1 :(得分:1)
我认为你误解了QT_TRANSLATE_NOOP
的含义。在Qt Linguist Manual: Programmers中,您可以阅读以下部分:使用QT_TR_NOOP()和QT_TRANSLATE_NOOP()
如果您需要在函数外部完全翻译文本,可以使用两个宏来帮助:QT_TR_NOOP()和QT_TRANSLATE_NOOP()。 这些宏仅标记lupdate提取的文本。宏扩展到文本(没有上下文)。
所以,问题不在于全局变量str
。