我正在使用QCoreApplication::translate()
翻译文字。
我试图了解字符串是否有翻译。
Qt文档声明:
如果所有翻译文件都不包含
sourceText
的翻译 在上下文中,此函数返回QString
等效的sourceText
。
我面临的问题是我得到的结果与此类似:
<message>
<source>Side</source>
<translation>Side</translation>
</message>
源和翻译是相同的。
在许多语言中,翻译确实与来源相同。但如果translate("Side")
返回"Side"
,我无法判断翻译是否正好"Side"
或翻译是否为空。
如何区分这两种情况?
答案 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}}是非虚拟的。