如何区分翻译不存在或翻译是否与源相同?

时间:2016-09-23 11:59:50

标签: c++ qt translation qtranslator

我正在使用QCoreApplication::translate()翻译文字。

我试图了解字符串是否有翻译。

Qt文档声明:

  

如果所有翻译文件都不包含sourceText的翻译   在上下文中,此函数返回QString等效的sourceText

我面临的问题是我得到的结果与此类似:

<message>
    <source>Side</source>
    <translation>Side</translation>
</message>

源和翻译是相同的。

在许多语言中,翻译确实与来源相同。但如果translate("Side")返回"Side",我无法判断翻译是否正好"Side"或翻译是否为空。

如何区分这两种情况?

2 个答案:

答案 0 :(得分:3)

AFAIK无法通过<entity-condition> <field-map value=""> </entity-condition> <entity-and> <field-map value=""> </entity-and> 来区分这两种情况。

但是,QTCoreApplication::translate在找不到密钥时返回空QTranslator::translate(Qt 5)。因此,一个选项是通过QString添加QTranslator每个installTranslator()来保持一个容器(因为QCoreApplication没有办法让那些人回来)。然后,遍历该容器,在容器中的每个实例上调用QTranslator::translate()。当你得到一个非空的结果时,你找到了一个翻译;如果没有翻译成功,那么你就知道你所拥有的QTranslator中的密钥并不存在。

伪代码:

bool hasTranslation(const char* key)
{
  QString result;
  if(!translators.size())
    return false;

  for(const auto& translator : translators)
  {
    result = translator->translate("context", key);
    if(!result.isNull())
      break;
  }
  return !result.isNull();
}

答案 1 :(得分:2)

AFAIK,没有办法。 translate函数以下列方式工作:它遍历可用于应用程序的所有翻译器,并尝试使用每个翻译器翻译源文本。如果成功,它会立即突破循环并返回已翻译的文本。如果上述循环已完成,但尚未找到转换,则它以QString的形式返回源文本:

QString QCoreApplication::translate(const char *context, const char *sourceText,
                                    const char *disambiguation, Encoding encoding, int n)
{
    QString result;

    if (!sourceText)
        return result;

    if (self && !self->d_func()->translators.isEmpty()) {
        QList<QTranslator*>::ConstIterator it;
        QTranslator *translationFile;
        for (it = self->d_func()->translators.constBegin(); it != self->d_func()->translators.constEnd(); ++it) {
            translationFile = *it;
            result = translationFile->translate(context, sourceText, disambiguation, n);
            if (!result.isEmpty())
                break;
        }
    }

    if (result.isEmpty()) {
#ifdef QT_NO_TEXTCODEC
        Q_UNUSED(encoding)
#else
        if (encoding == UnicodeUTF8)
            result = QString::fromUtf8(sourceText);
        else if (QTextCodec::codecForTr() != 0)
            result = QTextCodec::codecForTr()->toUnicode(sourceText);
        else
#endif
            result = QString::fromLatin1(sourceText);
    }

    replacePercentN(&result, n);
    return result;
}

如果你真的需要知道是否可以找到翻译,你必须继承QTranslator类并覆盖它的translate()函数(因为translate() QCoreApplication 1}}是非虚拟的。