Qt国际化(3)——一些提示
常遇到Qt翻译问题,一些经验总结:
发现某个字符串翻译有问题,可以去查该串有没有被lupdate提取到.ts文件中,如果没有的话应该检查运行lupdate时所指定的.pro文件。如果.ts文件中能找到该串的话,则进一步检查.ts文件中的context设置与调用tr()函数时的context是否一致,以及经过linguist处理后的.ts文件中,该串是否已经被真正的翻译。另外还可能有问题的地方是QTranslator是否读取到了正确的.qm文件。
一些易犯的错误:
常犯的错误是拿到字符串对应的ID之后,便随意使用,比如将这些ID存放到一个txt文件中,这样的结果很可能是这些串根本就没被lupdate所提取出来,因为lupdate在扫描的时候只会注意tr()等一些关键字,这样在.qm文件中当然也没有对应的翻译串,最后的结果就是这些串不能被正确的显示翻译出来。
另一个问题是将翻译串放入数组中。简单的将ID放入数组中并不能引起lupdate的注意,这样的结果同上。这时候我们可以使用Qt提供的宏QT_TR_NOOP()或者QT_TRANSLATE_NOOP()以便于lupdate识别。比如:
注意QT_TRANSLATE_NOOP宏的第一个参数是const char * context,即上下文,这个概念的引入大概是为了改善同一个串在不同的上下文中可能需要不同的翻译的情况,但也带来了不少问题。我们可以看一看qmetaobject.cpp中QMetaObject::tr()的实现:
这里context的值被设置为d.stringdata,Qt元对象系统中d.stringdata实际上就是类的名字。但是如果你将某个串放在别的类中,比如说串TXT_1在Class A中被加入某个数组中,并用QT_TR_NOOP宏包起来,但我们在Class B中才真正用tr()函数去使用它,那么lupdate扫描后得到的context值为A,而在Class B中用tr()调用时context值为B,这种不一致也会导致最后翻译的不成功。如果不了解整个过程,又凑巧这么使用了的话,找出这种错误是非常费劲的。
发现某个字符串翻译有问题,可以去查该串有没有被lupdate提取到.ts文件中,如果没有的话应该检查运行lupdate时所指定的.pro文件。如果.ts文件中能找到该串的话,则进一步检查.ts文件中的context设置与调用tr()函数时的context是否一致,以及经过linguist处理后的.ts文件中,该串是否已经被真正的翻译。另外还可能有问题的地方是QTranslator是否读取到了正确的.qm文件。
一些易犯的错误:
常犯的错误是拿到字符串对应的ID之后,便随意使用,比如将这些ID存放到一个txt文件中,这样的结果很可能是这些串根本就没被lupdate所提取出来,因为lupdate在扫描的时候只会注意tr()等一些关键字,这样在.qm文件中当然也没有对应的翻译串,最后的结果就是这些串不能被正确的显示翻译出来。
另一个问题是将翻译串放入数组中。简单的将ID放入数组中并不能引起lupdate的注意,这样的结果同上。这时候我们可以使用Qt提供的宏QT_TR_NOOP()或者QT_TRANSLATE_NOOP()以便于lupdate识别。比如:
| static const char *greeting_strings[] = { QT_TR_NOOP("Hello"), QT_TR_NOOP("Goodbye") }; // 或者 static const char *greeting_strings[] = { QT_TRANSLATE_NOOP("FriendlyConversation", "Hello"), QT_TRANSLATE_NOOP("FriendlyConversation", "Goodbye") }; |
| QString QMetaObject::tr(const char *s, const char *c) const { return QCoreApplication::translate(d.stringdata, s, c, QCoreApplication::CodecForTr); } |


