QObject派生类中使用tr()翻译无效的问题

  • Post author:
  • Post category:其他



可能的原因:

派生类定义中没有添加Q_OBJECT宏!

Qt的多语言翻译中有个概念叫上下文(context),看一下下面这个已经翻译过的ts文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="en_US">
<context>
    <name>TranslateTest</name>
    <message>
        <source>再翻译这个文本</source>
        <translation type="obsolete">Translate this text again.</translation>
    </message>
    <message>
        <source>明天天气qwqw</source>
        <translation type="unfinished"></translation>
    </message>
</context>
<context>
    <name>TranslateTestClass</name>
    <message>
        <source>TranslateTest</source>
        <translation type="unfinished"></translation>
    </message>
    <message>
        <source>翻译这个文本</source>
        <translation type="obsolete">Translate this text.</translation>
    </message>
    <message>
        <source>今天天气</source>
        <translation type="unfinished"></translation>
    </message>
</context>
</TS>ext>

ts是一个XML格式的文件,包含了很多context节点,<name>是context的名字,<message>则代表某个翻译项。也就是一个context下包含了多个翻译条目。

tr()在执行过程中会根据上下文查找已安装的翻译文件,找到对应的context下的翻译条目进行文本翻译。

从上面两个截图可以看出来,context其实就是在从元对象里面获取类名。

查找类名的过程,就是从自身的元对象开始获取类名,如果查找失败,就找父类元对象中的类名,依次往上找,知道找到一个类名为止。

所以,翻译不成功,有可能是这个context查找有问题。

其中一个典型的导致context查找失败或者说匹配失败的问题就是在派生类中忘了添加Q_OBJECT宏

。 因为没有这个宏,便不会为派生类生成元对象,那么tr()在查找context时,就可能找到父类的类名,而这个类名和ts里面的context-name是不一致的,最后翻译也就不能正确转换。

解决这种问题一种方法就是给派生类加上Q_OBJECT宏,另外一种是显示调用基类的tr()方法,后者是通过改变ts文件中的context/name达到翻译时context匹配成功的目的。



版权声明:本文为wangw8507原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。