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

时间:2017-10-18 12:23:11

标签: c++ qt qtranslator

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

如何在不复制/粘贴的情况下管理原始版 日志?< 我对任何建议持开放态度,包括设计约束。

1 个答案:

答案 0 :(得分:6)

我通过引入一个包含原始字符串和翻译字符串的特殊助手类,在我自己的一个项目中解决了这个问题。这是它的外观粗略草图:

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方法。