Qt国际化(3)——一些提示

 http://www.top-e.org/jiaoshi/html/?158.html

 

常遇到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识别。比如:

    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")

};

 

注意QT_TRANSLATE_NOOP宏的第一个参数是const char * context,即上下文,这个概念的引入大概是为了改善同一个串在不同的上下文中可能需要不同的翻译的情况,但也带来了不少问题。我们可以看一看qmetaobject.cppQMetaObject::tr()的实现:

QString QMetaObject::tr(const char *s, const char *c) const

{

return QCoreApplication::translate(d.stringdata, s,

c, QCoreApplication::CodecForTr);

}

 

这里 context 的值被设置为 d.stringdata ,Qt元对象系统中 d.stringdata 实际上就是类的名字。但是如果你将某个串放在别的类中,比如说串 TXT_1 Class A 中被加入某个数组中,并用 QT_TR_NOOP 宏包起来,但我们在 Class B 中才真正用 tr() 函数去使用它,那么 lupdate 扫描后得到的 context 值为 A ,而在 Class B 中用 tr() 调用时 context 值为 B ,这种不一致也会导致最后翻译的不成功。如果不了解整个过程,又凑巧这么使用了的话,找出这种错误是非常费劲的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值