Qt的网站推荐将本地化字符串就在这样的代码中间:存储可本地化字符串的习惯Qt方式?
fileMenu = menuBar()->addMenu(tr("&File"));
不过,我应该如何存储出现在项目中多次串?把它们放在一个单独的作品,但tr()
呼叫意味着我必须单独对它们进行初始化:
struct MyLocalizableStrings
{
QString mErrorMessageFileNotFound;
QString mErrorMessageNoCanDoThis;
MyLocalizableStrings() :
mErrorMessageFileNotFound(QObject::tr("File not found.")),
mErrorMessageNoCanDoThis(QObject::tr("Operation is not possible at the moment."))
{}
};
很笨拙,容易陷入困境;我宁愿保持声明和初始化。当然可以将一系列const char*
保存在专用的命名空间中,但是在呼叫站点存在遗漏tr()
的风险 - 整个方法严重不标准。
有什么更好的点子?
只要使用tr(“foo”),只要你需要它。尽管它看起来像代码重复,但它是最好的方法。在字符串中存储本地化并不是一个好主意。您的MyLocalizableStrings可防止例如动态语言的变化,除非你添加一个重新翻译功能...而这里又变得越来越复杂。所以,只要使用tr(“foo”)就可以了。拼写错误很容易通过语言学家发现。 – Lorenz
http://doc.qt.io/qt-5/i18n-source-translation.html#using-qt-tr-noop-and-qt-translate-noop-in-c – Evgeny
@洛伦兹它比代码重复更糟糕,这是数据重复。我会在另一个函数中写一个函数“Operation not possible”,在另一个函数中写作“此刻不可能的操作”,并且在一年之内,我将无法记住这里是否存在任何语义差异。更糟糕的是,它可能不是我,而是一个完全不同的人,没有能力/时间来检查代码,将代码翻译成语言这样的语言。最佳实践存在的原因是:不会复制硬编码的用户可读消息。 – sigil