如何区分翻译不存在或翻译与原文相同?

4
我正在使用QCoreApplication::translate()来翻译文本。我想知道一个字符串是否有翻译。Qt文档说明如下:如果在上下文中没有任何一个翻译文件包含了sourceText的翻译,那么此函数将返回与sourceText相等的QString。我面临的问题是,我得到类似以下结果的情况:
<message>
    <source>Side</source>
    <translation>Side</translation>
</message>

当源语言和翻译语言相同时。

在许多语言中,翻译确实与源语言相同。但是如果translate("Side")返回"Side",我无法确定翻译是否确切地为"Side"或者翻译是空的。

我该如何区分这两种情况?


1
你为什么认为你需要这样做?你试图解决什么问题? - Lightness Races in Orbit
3
@LightnessRacesinOrbit,OP面临的情况很明显。如果没有翻译,图书馆就会返回源文本。在许多语言中,翻译存在,但与源相同。如何知道源落入哪种情况? - Khalil Khalaf
1
@GillBates在QT源代码中的XY。 - user2249683
3
@GillBates,我仍然不确定您是如何意识到LRiO理解了问题的。我认为这是该库的一个缺点。 - Khalil Khalaf
3
@LightnessRacesinOrbit 我认为这是因为 OP 想知道 translate() 是否成功或失败,以便他可以报告(“This is That 的翻译” 或者 “_很抱歉,我们没有 This 的翻译_”)。如果他发送了 Side 并收到了 Side,那么这意味着什么?这是否意味着存在一种翻译,并且它是 Side,还是说没有翻译,库返回了源 Side(他发送的内容)? - Khalil Khalaf
显示剩余4条评论
2个回答

3
据我所知,无法通过调用QTCoreApplication::translate来区分这两种情况。
然而,QTranslator::translate返回空的QString当找不到键时(Qt 5)。因此,一种选择是保留一个容器,其中包含通过installTranslator()添加的每个QTranslator(因为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();
}

if (translators.isEmpty())的测试是不必要的,因为result最初为null,在这种情况下循环将执行0次 - 或者您可以用std::any_of(translators.begin(), translators.end(), [key](QTranslator *t){return !t->translate("context", key).isEmpty();});替换循环(注意:更喜欢使用QString :: isEmpty()而不是QString :: isNull())。 - Toby Speight

2
据我所知,没有办法。 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()函数(因为QCoreApplication中的translate()是非虚函数)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接