ymo*_*eau 2 c++ qt qtranslator
在我的项目中,我们希望翻译用户界面,但保留技术日志的英文.我同意这两种消息应该保持分离,但有时我们会有一些错误消息,我们想要同时显示和记录.
使用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;
}
Run Code Online (Sandbox Code Playgroud)
那么使用这个类的代码就是这样的:
// 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());
Run Code Online (Sandbox Code Playgroud)
方法的主要部分是使用QT_TR_NOOP宏.它的作用是将包含在其中的字符串文字标记为需要在qmake步骤中进行进一步翻译的字符串文字.与QObject::tr此不同,此宏不会将未翻译的文本转换为已翻译的文本.如果要访问已翻译的文本,则需要tr稍后手动调用- 就像我在上面的示例中所做的那样LocalizedString.
注意,它QT_TR_NOOP被设计为在类中使用,即,用于转换的上下文将是宏存在的某个方法内的类的名称.如果您有自由站立功能或者您想自己指定上下文,请使用QT_TRANSLATE_NOOP宏 - 它的第二个参数是转换上下文.
更新:还有一个提示:在我的实际实现中,LocalizedString它operator<<打印了原始的非本地化字符串.这很方便,因为这样你只需将LocalizedString类的对象传递QDebug给它而不调用它的originalString方法.
| 归档时间: |
|
| 查看次数: |
224 次 |
| 最近记录: |