如何区分翻译不存在或翻译与来源相同?
How to differentiate between translation did not exist or the translation is the same as source?
我正在使用 QCoreApplication::translate()
翻译文本。
我想了解一个字符串是否有翻译。
Qt 文档指出:
If none of the translation files contain a translation for sourceText
in context, this function returns a QString
equivalent of sourceText
.
我面临的问题是我得到的结果与此类似:
<message>
<source>Side</source>
<translation>Side</translation>
</message>
来源和翻译相同。
在许多语言中,翻译确实与原文相同。但是如果translate("Side")
returns"Side"
,我就分不清翻译的到底是"Side"
还是空的
如何区分这两种情况?
据我所知,无法通过 QTCoreApplication::translate
调用来区分这两种情况。
但是,QTranslator::translate
returns 一个 null 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();
}
据我所知,没有办法。 translate
函数以下列方式工作:它遍历应用程序可用的所有翻译器,并尝试使用每个翻译器翻译源文本。如果成功,它会立即跳出循环并 returns 翻译后的文本。如果上述循环已经完成,但还没有找到翻译,它 returns 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;
}
如果您真的需要知道是否可以找到翻译,则必须子class QTranslator
class 并覆盖它的 translate()
函数(因为 QCoreApplication
中的 translate()
是非虚拟的)。
我正在使用 QCoreApplication::translate()
翻译文本。
我想了解一个字符串是否有翻译。
Qt 文档指出:
If none of the translation files contain a translation for
sourceText
in context, this function returns aQString
equivalent ofsourceText
.
我面临的问题是我得到的结果与此类似:
<message>
<source>Side</source>
<translation>Side</translation>
</message>
来源和翻译相同。
在许多语言中,翻译确实与原文相同。但是如果translate("Side")
returns"Side"
,我就分不清翻译的到底是"Side"
还是空的
如何区分这两种情况?
据我所知,无法通过 QTCoreApplication::translate
调用来区分这两种情况。
但是,QTranslator::translate
returns 一个 null 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();
}
据我所知,没有办法。 translate
函数以下列方式工作:它遍历应用程序可用的所有翻译器,并尝试使用每个翻译器翻译源文本。如果成功,它会立即跳出循环并 returns 翻译后的文本。如果上述循环已经完成,但还没有找到翻译,它 returns 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;
}
如果您真的需要知道是否可以找到翻译,则必须子class QTranslator
class 并覆盖它的 translate()
函数(因为 QCoreApplication
中的 translate()
是非虚拟的)。