Qt使用变量进行本地化

时间:2013-08-19 18:18:35

标签: qt

我想在我的代码中翻译天气状况,但我遇到了一些麻烦。

示例:

英语 - 多云

法语 - Nuageux

weatherString = hash["weather"];
weatherBytes = weatherString.toLocal8Bit();
weatherCharArray = weatherBytes.data();

qDebug() << "Current Weather: " << QObject::tr(weatherCharArray);

天气来自网络服务,所以它总是不同的。我知道上面的代码不会在我的.ts文件中自动创建条目,因为它们仅在运行时已知,所以我尝试手动输入它们。

<message>
<source>Cloudy</source>
<translation>Nuageux</translation>
</message>

但每次我编译它都会输入:

type="obsolete"

在我的翻译标签中,我该怎么办?

1 个答案:

答案 0 :(得分:1)

以下是我实施此问题解决方案的方法之一。

// setup (in my constructor before any use of mytr function
this->availableTranslations();

在我的cpp文件中......

QMap <QString, QString> SettingsWidget::trMap;

void SettingsWidget::availableTranslations()
{
     if(trMap.size() != 0)
          return;
     trMap["true"] = tr("True","settings option");
     trMap["false"] = tr("False","settings option");
     trMap["Auto"] = tr("Auto","settings option");
     trMap["None"] = tr("None","settings option");
     trMap["smallest"] = tr("Smallest","settings option");
     trMap["very small"] = tr("Very Small","settings option");
     trMap["small"] = tr("Small","settings option");
     trMap["medium"] = tr("Medium","settings option");
     trMap["large"] = tr("Large","settings option");
     trMap["very large"] = tr("Very Large","settings option");
     trMap["Advanced"] = tr("Advanced","settings option");
     trMap["Basic"] = tr("Basic","settings option");
}

QString SettingsWidget::mytr(QString s)
{
     if(trMap.contains(s))
          return trMap[s];//qApp->translate("SettingsWidget",qPrintable(s));
     else
          return s;
}

然后,当我在飞行中使用上述内容时,它看起来像这样:

// in use
mytr(list.at(currIndex));

您会注意到,通过此设置,它可以根据变量而不是仅char *查找转换,并且无需太多额外的工作或维护即可将其正确放入转换文件中。

希望有所帮助。