gpt4 book ai didi

c++ - 存储可本地化字符串的惯用 Qt 方式?

转载 作者:行者123 更新时间:2023-11-30 05:13:39 25 4
gpt4 key购买 nike

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() - 这整个方法是严重不标准的.

有什么更好的主意吗?

最佳答案

多次出现的字符串并且应该是相同的需要在一个或多个专用类中 - 所以您几乎是正确的。该类需要其翻译上下文,以便翻译人员更容易理解这些是常见消息。您还应该利用 C++11 中的成员初始化来 DRY:

首先,让我们建立一个基类和必要的助手:

#include <QCoreApplication>

template <typename Derived>
class LocalizableStringBase {
Q_DISABLE_COPY(LocalizableStringBase)
protected:
using S = QString;
static LocalizableStringBase * m_instance;
LocalizableStringBase() {
Q_ASSERT(!m_instance);
m_instance = this;
}
~LocalizableStringBase() {
m_instance = nullptr;
}
public:
static const Derived * instance() {
return static_cast<const Derived*>(m_instance);
}
void reset() {
auto self = static_cast<const Derived*>(this);
self->~Derived();
new (self) Derived();
}
};

#define DEFINE_LOCALIZABLE_STRINGS(Derived) \
template <> \
LocalizableStringBase<Derived> * LocalizableStringBase<Derived>::m_instance = {}; \
const Derived & Derived##$() { return *(Derived::instance()); }

然后,对于每组可本地化的字符串,您需要:

// Interface

class MyLocalizableStrings : public LocalizableStringBase<MyLocalizableStrings> {
Q_DECLARE_TR_FUNCTIONS(MyLocalizableStrings)
public:
S errorMessageFileNotFound = tr("File not found.");
S errorMessageNoCanDoThis = tr("Operation is not possible at the moment.");
};

// Implementation

DEFINE_LOCALIZABLE_STRINGS(MyLocalizableStrings)

用法:

#include <QDebug>

void test() {
qDebug() << MyLocalizableStrings$().errorMessageFileNotFound;
}

int main(int argc, char ** argv)
{
QCoreApplication app{argc, argv};
MyLocalizableStrings str1;
test();
// Change language here
str1.reset();
test();
}

这是相当可读的,并且没有重复的标识符。它还避免了静态初始化顺序的失败。

关于c++ - 存储可本地化字符串的惯用 Qt 方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43855953/

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