使用静态成员和名称空间进行Qt tr()转换

时间:2015-01-16 09:27:56

标签: qt static namespaces translation tr

我正在翻译我们的Qt GUI项目。

*。ts文件生成成功。

我使用Qt Linguist填充* .ts文件并翻译。

但是在运行时,使用命名空间和静态成员进行转换不起作用。

其他翻译(当在类中调用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()宏无济于事。

1 个答案:

答案 0 :(得分:1)

问题是你理解它是如何工作的。使用静态成员变量,它们会在main函数启动之前初始化 这意味着两件事:

  • 在创建QApplication对象之前和yuo加载翻译文件之前初始化它们! (我很惊讶这不会导致崩溃)
  • 值只计算一次(如果翻译发生变化,则不会更新)!

你应该怎么做?只需将静态变量更改为函数:

// 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 []返回翻译是没有意义的,我也纠正了(我不知道你为什么这么做)。