如何记录QObject::tr的原始字符串,并仍然向GUI显示翻译

How to log the original string of QObject::tr and still display to the GUI the translation?

本文关键字:翻译 显示 GUI 字符串 何记录 记录 tr QObject 原始      更新时间:2023-10-16

在我的项目中,我们希望翻译用户界面,但保留英文技术日志。我同意这两种消息应该保持分离,但有时我们会有一些错误消息,我们想同时显示和记录
使用QObject::tr可以获得已翻译的字符串,而无法检索源字符串。

如何在不复制/粘贴的情况下管理原始版本的日志+翻译版本显示
我愿意接受任何建议,包括设计限制。

我在自己的一个项目中通过引入一个特殊的helper类来解决这个问题,该类同时包含原始字符串和翻译后的字符串。以下是它的大致外观:

class LocalizedString
{
public:
LocalizedString(const char * str) :
m_originalString(str),
m_localizedString(tr(str))
{}
const char * originalString() const { return m_originalString; }
const QString & localizedString() const { return m_localizedString; }
private:
const char *     m_originalString;
QString          m_localizedString;
}

然后使用这个类的代码如下所示:

// In one place within the code:
LocalizedString errorDescription = QT_TR_NOOP("Some message which should go both to the log and to the user");
qDebug() << errorDescription.originalString();
<...>
// In some other place within the code which gets errorDescription variable from somewhere and needs to show it to the user
showErrorMessage(errorDescription.localizedString());

该方法的主要部分是QT_TR_NOOP宏的使用。它所做的是将包含在其中的字符串文字标记为在qmake步骤中需要提取的文字,以便进一步翻译。与QObject::tr不同,此宏不会将未翻译的文本转换为已翻译的文本。如果您想访问翻译后的文本,您需要稍后手动调用tr——就像我在LocalizedString的构造函数中的上例中所做的那样。

注意,QT_TR_NOOP被设计为在类中使用,即用于翻译的上下文将是存在宏的某个方法中的类的名称。如果您有独立的函数,或者您想自己指定上下文,请改用QT_TRANSLATE_NOOP宏-它的第二个参数是翻译上下文。

更新:还有一个提示:在我的LocalizedString的实际实现中,它有operator<<,它打印原始的非本地化字符串。这很方便,因为这样您只需将LocalizedString类的对象传递给QDebug,而无需调用其originalString方法。