Преобразование Qt tr() со статическими членами и пространствами имен

Я работаю над переводом нашего проекта Qt GUI.

Файл *.ts создан успешно.

Я заполнил файл *.ts переводами с помощью Qt Linguist.

Но во время выполнения перевод с пространствами имен и статическими членами не работает.

Другие переводы (при вызове метода tr() в классе, унаследованном от QObject) работают нормально.

У меня есть следующий код (перевод не работает):

Пример с пространствами имен:

// example with namespaces
// declaration in header
namespace Error
{
  namespace RadionetworkInput
  {
    QString alreadyInUse = QT_TR_NOOP("already in use");
    char requestFailed[] = QT_TR_NOOP("request failed");
  }
}

Использование в cpp:

// usage in cpp code0
QString error0 = Error::RadionetworkInput::alreadyInUse;
QString error1 = tr(Error::RadionetworkInput::requestFailed);

Пример со статическими членами:

// example with static members
// declaration in header
namespace Error
{
  class RadionetworkInput
  {
    public:
    static const QString alreadyInUse;
    static const char requestFailed[];
  }
  QString Error::RadionetworkInput::alreadyInUse = QT_TR_NOOP("already in use");
  char Error::RadionetworkInput::requestFailed[] = QT_TR_NOOP("request failed");
}

Использование в коде cpp

// usage in cpp code
QString error0 = Error::RadionetworkInput::alreadyInUse;
QString error1 = tr(Error::RadionetworkInput::requestFailed);

Пример с рабочим переводом:

class ViewNetwork : public QObject
{
  Q_OBJECT
public:
  explicit ViewNetwork(QString name = tr("New Radionetwork"));
};

Использование в коде:

ViewNetwork::ViewNetwork(QString name)
{
  QString dummy = name;
}

Использование макроса QObject::tr() вместо QT_TR_NOOP() не помогает.


person Den Jagger    schedule 16.01.2015    source источник


Ответы (1)


Проблема в том, что вы не понимаете, как это работает. Со статическими переменными-членами они инициализируются до запуска функции main.
Это означает две вещи:

  • они инициализируются перед созданием объекта QApplication и перед загрузкой файлов перевода! (удивлен, что это не привело к сбою)
  • значение вычисляется только один раз (не обновляется при изменении перевода)!

Что ты должен делать? Просто измените статическую переменную на функции:

// example with namespaces
// declaration in header
namespace Error
{
  namespace RadionetworkInput
  {
    QString alreadyInUse() { return QT_TR_NOOP("already in use"); }
    QString requestFailed() { return QT_TR_NOOP("request failed"); }
  }
}

а также

// example with static members
// declaration in header
namespace Error
{
  class RadionetworkInput
  {
    public:
    static QString alreadyInUse();
    static QString requestFailed();
  }

  QString Error::RadionetworkInput::alreadyInUse() { return QT_TR_NOOP("already in use"); }
  QString Error::RadionetworkInput::requestFailed() { return QT_TR_NOOP("request failed"); }
}

Возвращать перевод как char[] бессмысленно, потому что я и это исправил (я не знаю, почему вы это сделали).

person Marek R    schedule 16.01.2015