C++ 如何记录QObject::tr的原始字符串并仍然向GUI显示翻译?
在我的项目中,我们希望翻译用户界面,但保留英文的技术日志。我同意这两种消息应该保持分离,但有时我们会出现一些错误消息,希望同时显示和记录。C++ 如何记录QObject::tr的原始字符串并仍然向GUI显示翻译?,c++,qt,qtranslator,C++,Qt,Qtranslator,在我的项目中,我们希望翻译用户界面,但保留英文的技术日志。我同意这两种消息应该保持分离,但有时我们会出现一些错误消息,希望同时显示和记录。 使用获取已翻译的字符串,但无法检索源字符串 如何在不复制/粘贴的情况下管理原始版本日志+翻译版本显示? 我愿意接受任何建议,包括设计约束。我在自己的一个项目中通过引入一个包含原始字符串和翻译字符串的特殊帮助器类解决了这个问题。下面是它的大致外观: class LocalizedString { public: LocalizedString(cons
使用获取已翻译的字符串,但无法检索源字符串 如何在不复制/粘贴的情况下管理原始版本日志+翻译版本显示?
我愿意接受任何建议,包括设计约束。我在自己的一个项目中通过引入一个包含原始字符串和翻译字符串的特殊帮助器类解决了这个问题。下面是它的大致外观:
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());
//在代码中的一个位置:
LocalizedString errorDescription=QT_TR_NOOP(“应该同时发送到日志和用户的一些消息”);
qDebug()为什么不使用tr
字符串调用display函数,使用相同字符串调用logging函数,但不使用tr?@scopchanov,因为这样做很不方便:您只能实现b copy粘贴字符串两次。将字符串放入某个变量中,并将其与tr
-tr
一起使用是行不通的,否则翻译将无法进行。这是由于Qt翻译系统的机制——要翻译的字符串是通过lupdate
实用程序从源代码中提取的,该实用程序查看tr
中的字符串文本,以及一些辅助宏,如Qt\u tru\NOOP
@Dmitry,将字符串放入某个变量中是行不通的m_originalString(str),m_localizedString(tr(str))
。好的,更正:只有将原始字符串包装到一个特殊的宏QT_tr_NOOP
或它的一个亲属中,它才会起作用。这正是我在回答中所描述的。@Dmitry,所以,基本上我们描述了相同的方法。不过你的解释更全面。谢谢!看完这篇文章后,我有一个想法。似乎从QString继承并只添加原始字符串作为成员更为实际。因此,您可以将LocalizedString直接用于所有需要QString的Qt函数。@ymeau,如果您愿意,您可以这样做,但是,如果您将LocalizedString
指定给QString
,则需要注意潜在的切片。