2

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

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

4

1 回答 1

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宏 - 它的第二个参数是翻译上下文。

Upd.:还有一个提示:在我的实际实现中,LocalizedStringoperator<<打印了原始的、非本地化的字符串。这很方便,因为这样你就可以将LocalizedString类的对象传递给QDebug而不调用它的originalString方法。

于 2017-10-18T12:40:32.907 回答