• 2579阅读
  • 2回复

关于QT 的国际化翻译机制的问题 [复制链接]

上一主题 下一主题
离线vbuser
 

只看楼主 倒序阅读 楼主  发表于: 2017-03-09
QT可实现国际化.qm ,问题是他的原理是什么? 是怎样找到Context后对应翻译的?
离线rotung

只看该作者 1楼 发表于: 2017-03-09
Qt的国际化,或者所谓的“动态翻译”,其实就是以文件的形式提供了两种语言的unicode码的映射关系。
qm文件实际上是二进制格式的,是从ts文件来的,而ts文件如果你用记事本打开,实际上就是一个XML文件,结构很清晰的。
既然是映射关系,所以它也就不会在你加载了新的翻译文件(.qm)后主动变换你显示的内容,只有在你调用相关的函数设置你的控件的文本的时候才会选择去从你的翻译文件中查找对应的翻译过的字符串。
如果是使用设计器设计界面,代码中实现逻辑功能,那么这个动态翻译工作还是比较简单的。因为ui生成的文件自动就有一个retranslateUi函数,我们在加载完新的翻译文件之后,再次调用该函数,就能够实现界面语言的切换了。如果是那些没有在设计器中设计的控件(你自己new出来的控件),那就需要另外再去调用它的设置文本函数了。
离线dosmlp

只看该作者 2楼 发表于: 2017-03-10
翻译时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里面就是怎么查找的问题了,没必要细看了



快速回复
限100 字节
 
上一个 下一个