Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Неудобство 1: хранение переводовпроистекает от плохой архитектуры. Если команды представлять самостоятельными объектами, а не неявным набором глобальных хендлеров и отображений, то у вас будет красиво реализованный вывод документации на текущем языке.
Неудобство 2: динамический перевод при изменении языкареально присутствует. Лечится только ручным прописыванием того, что надо обновлять, в каком-нибудь обработчике changeEvent() — или в каждом виджете отдельно, или собирая эту информацию в глобальном мониторе вроде вашего DynamicTranslator.
#include <iostream>
class Base
{
public:
virtual int method() { return 1; }
};
class Inherited : public Base
{
public:
int method() { return 2; }
};
int main(int, char **)
{
Inherited *px = new Inherited;
Base *py = px;
std::cout << py->method(); //2
//но
Inherited x;
Base y = x;
std::cout << y.method(); //1
return 0;
}
class QLanguageDependentString : public QString
{
//...
};
widget->setWindowTitle(QLanguageDependentString("Cool widget")); //Это не сработает по упомянутой выше причине
setWindowTitle(нашКласс.дайCюдаПереведеннуюСтроку())
Гораздо проще при смене языка перестроить все, что от этого языка зависело.
class Translation
{
//Тут то что уже было в статье
private:
QStringList arguments;
public:
void setArguments(const QStringList &list) { arguments = list; }
QString toString() const
{
QString s = QCoreApplication::translate(context.toUtf8().constData(), sourceText.toUtf8().constData(),
disambiguation.toUtf8().constData(), n);
foreach (const QString &a, arguments)
s = s.arg(a);
return s;
}
};
//Где-то в коде:
for (int i = 0; i < 10; ++i) {
QWidget *w = new QWidget;
Translation t = Translation::translate("context", "Widget number #%1");
t.setArguments(QStringList() << QString::number(i + 1));
w->setWindowTitle(t);
new DynamicTranslator(w, "windowTitle", t);
}
Благодаря тому, что виджет w является родителем нашего DynamicTranslator, нет необходимости беспокоиться о его удалении — DynamicTranslator будет удалён вместе с QWidget.
Неудобства при работе с переводами в Qt и способы борьбы с ними