gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:49 26 4
gpt4 key购买 nike

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

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

最佳答案

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

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

关于c++ - 如何记录 QObject::tr 的原始字符串并仍然向 GUI 显示翻译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46810108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com