翻译时qapplication会从后向前遍历app.installTranslator(&translator)安装的QTranslator,然后qtranslator会调用 translate(const char *context, const char *sourceText, const char *disambiguation = Q_NULLPTR, int n = -1) 从自己加载的qm中寻找该context中的源字符返回对应的翻译字符
源码中的调用顺序如下
QString
QMetaObject::tr(const char *s, const char *c, int n) const
{
return
QCoreApplication::translate(objectClassName(this), s, c, n);
}
QString
QCoreApplication::translate(const char *context, const char *sourceText,
const char *disambiguation, 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.isNull())
break;
}
}
if (result.isNull())
result = QString::fromUtf8(sourceText);
replacePercentN(&result, n);
return result;
}
QString
QTranslator::translate(const char *context, const char *sourceText, const char *disambiguation,
int n) const
{
Q_D(const QTranslator);
return
d->do_translate(context, sourceText, disambiguation, n);
}
do_translate里面就是怎么查找的问题了,没必要细看了