【问题标题】:Localizing strings using Qt which are declared in Global Scope使用在 Global Scope 中声明的 Qt 本地化字符串
【发布时间】:2014-04-29 15:39:51
【问题描述】:

我正在开发 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() 中编写翻译代码,因此这些全局变量不会被翻译。 我更喜欢第二种方法,因为我们可以在一个文件中列出所有 UI 字符串并轻松维护它们。我想知道有什么方法可以本地化在 Global Scope 中声明的字符串(就像我在第二种方法中使用的那样)?

【问题讨论】:

    标签: c++ qt localization translation


    【解决方案1】:

    嗯,这不是 Qt 的翻译系统的使用方式......

    但如果你想这样做,你可以编写一个函数(或实现一个包含所有字符串的类/结构)来初始化所有字符串变量加载main()中的翻译之后-当然,这会导致更多代码:D

    【讨论】:

    • 这实际上是一个很好的方法,因为如果您需要即时更改语言,您可以使用相同的函数来“重新本地化”字符串。
    • 非常感谢。这当然有帮助!
    【解决方案2】:

    我认为您误解了QT_TRANSLATE_NOOP 的含义。在Qt Linguist Manual: Programmers 中,您可以阅读以下部分:使用 QT_TR_NOOP() 和 QT_TRANSLATE_NOOP()

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

    所以,问题不在于全局变量str

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 1970-01-01
      • 2015-11-30
      • 2015-11-26
      • 2013-03-17
      • 1970-01-01
      • 2014-03-12
      相关资源
      最近更新 更多