【问题标题】:Qt tr() translation with static members and namespaces带有静态成员和命名空间的 Qt tr() 翻译
【发布时间】:2015-03-14 20:53:36
【问题描述】:

我正在翻译我们的 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() 宏没有帮助。

【问题讨论】:

    标签: qt static namespaces translation tr


    【解决方案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[] 毫无意义,我也更正了(我不知道你为什么这样做)。

    【讨论】:

      猜你喜欢
      • 2012-05-27
      • 2013-03-10
      • 2012-06-16
      • 2018-04-16
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多