使用在全局范围中声明的Qt本地化字符串

时间:2014-04-29 15:39:51

标签: c++ qt localization translation

我正在开发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字符串并轻松维护它们。我想知道有没有办法本地化在全局范围内声明的字符串(就像我的第二种方法中使用的那样)?

2 个答案:

答案 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