Как провести различие между переводом не существует или перевод совпадает с исходным?

Я использую QCoreApplication::translate() переводить текст.

Я пытаюсь понять, есть ли у строки перевод.

Документация Qt гласит:

Если ни один из файлов перевода не содержит перевода для sourceText в контексте эта функция возвращает QString эквивалент sourceText,

Проблема, с которой я сталкиваюсь, состоит в том, что я получаю результаты, подобные этому:

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

Где источник и перевод одинаковы.

На многих языках перевод действительно совпадает с исходным. Но если translate("Side") возвращается "Side"Не могу сказать точно был ли перевод "Side" или был ли перевод пуст.

Как я могу различить два случая?

2 ответа

Решение

AFAIK нет никакого способа провести различие между двумя случаями через QTCoreApplication::translate вызов.

Тем не мение, QTranslator::translate возвращает ноль QString когда ключ не найден (Qt 5). Таким образом, один вариант будет держать контейнер с каждым 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();
}

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 не является виртуальным).

Другие вопросы по тегам