Qt国际化及使用时注意事项

Qt国际化的范例网上有很多,这里不再赘述,可以参考下面的帖子:

Qt学习之路(33):国际化(上)   http://devbean.blog.51cto.com/448512/244689/

Qt学习之路(33):国际化(下)   http://devbean.blog.51cto.com/448512/245063


在Qt的国际化中,QObject::tr()是不可或缺的一个角色。它容易掌握、运用,却也很容易用错。

tr()函数天生就是双面的。它既是lupdate的识别标志,又是一个c++函数。忘记这一点就会导致使用时的错误。下面主要从几点讲注意事项:

1.忘记使用tr()

    用户非常容易忘记将用户可见字符串用tr()函数包起来。lupdate和C++编译器都不能区别原字符串和翻译后字符串。只有在运行时QPainter绘制时才知道,但这时已经太晚。

2.在tr()中使用变量

    tr()的参数必须是字符串,如下工作正常:

QPushButton *ok = new QPushButton( tr("OK"), this );
   但是使用变量后,工作就会不正确:

QCString str = "OK";
QPushButton *ok = new QPushButton( tr(str), this );
    这样写,lupdate会落掉str,也就是"OK"字符串,之后的translator也就看不到这个要翻译的条目。
     

    一个更加复杂的错误事例:

tr( QString("Cannot open %1").arg(fileName) )
tr( "Cannot open " + fileName )
    正确的使用方式:

tr( "Cannot open %1" ).arg( fileName )

3.在使用 QT_TR_NOOP() 的时候没有使用tr()

   QT_TR_NOOP()宏和它的兄弟宏QT_TRANSLATE_NOOP()很少被使用,但当它们被使用时,很容易被用错。不像tr()和translate(),这两个宏并不执行翻译工作,仅仅标记这个字符串需要被翻译。如下面的代码就不会有任何的翻译效果:

const char *strings[2] = {
    QT_TR_NOOP("OK"),
    QT_TR_NOOP("Cancel")
};
for ( int i = 0; i < 2; i++ ) {
    QButton *but = new QPushButton( strings[i], this );
}
   要正确的翻译就要把字符串用tr()包起来。另一种方法就是干脆直接使用tr(),不使用这两宏。

4.在一个对象上调用tr()

    tr()是QObject类的一个静态函数。它通常的使用方式是QObject::tr(),但C++编译器也会让myWidget->tr()通过检查,可是lupdate并没有聪明到识别这种用法。

5.忘记添加宏Q_OBJECT

   Q_OBJECT宏是使用Qt信号、槽、属性及tr()的必备元素。没有它,tr()会使用基类的名字做语境(context),而lupdate依然使用当前类的名字。这就会导致问题。


6.安装QTranslator太晚

   QTranslator必须在程序主窗口创建之前添加。否则它不会工作。

参考网址:http://doc.qt.digia.com/qq/qq03-swedish-chef.html#1763

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值