Как провести различие между переводом не существует или перевод совпадает с исходным?
Я использую 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
не является виртуальным).