QT国际化

(1)基本操作步骤:
1、编写源代码
2、在*.pro文件中添加TRANSLATIONS += *.ts ,有多少中语言就添加多少个ts文件。
3、运行lupdate *.pro 生成ts文件。lupdate会根据源代码中的内容提取出待翻译的字段,然后生成ts文件,ts文件是xml格式的。
4、用qt linguist打开ts文件,并翻译相应字段
5、运行lrelease *.pro生成qm文件。lrelease会根据ts文件生成二进制的qm翻译文件。
6、在*.qrc文件中添加qm文件的路径,并编译源代码 (也可以直接使用qm文件)

(2)

对于main.cpp的修改,加入以下语句:

QTranslator translator;
translator.load("hellotr_la");
app.installTranslator(&translator);
对于.pro文件的修改,加一下语句:
TRANSLATIONS=hellotr_la.ts

(3)翻译文本的修改

最常见的是将要翻译的字符串加上tr语句,tr语句的标准语法是

QObject::tr(sourceText,comment);//tr是QObject的静态函数,所有继承自QObject都有。一般源代码使用Latin1时使用

QObject::trUtf8(sourceText);//tr的兄弟,指定了其中内容的编码方式为UTF-8。

注:对于任何变量tr是无效的。 

在写代码的时候,我们可能希望把所有的字符串都放在一个地方,而方便于我们自己集中作改动。真正用到的时候,用一个字符常量指针去访问。
那么我们可能想到这样写代码
const char *appName=“OpenDrawer 2D”;//wrong,这种实现Qt不认识,无法作翻译 
QString translated=tr(appName);
const char *appName=QT_TR_NOOP(“OpenDrawer 2D”);//ok, 需要使用QT_TR_NOOP字串来提醒Qt系统该翻译的字串 
QString translated=tr(appName);

QT_TR_NOOP的语法是QT_TR_NOOP(sourceText),它还有两个变体,语法如下
QT_TRANSLATE_NOOP ( context, sourceText )
QT_TRANSLATE_NOOP3 ( context, sourceText, comment )

还有一种情况是在一个字串中有一部分来源于变量。那我们看看两种正误的写法
statusBar()->showMessage(tr(“Host ” + hostName+“ found”);////wrong 这种写法无法被正确识别 
statusBar()->showMessage(tr(“Host %1 found”).arg(hostName);////ok 利用了QString的arg()函数。在翻译时,需保留%1 

 

(4)QT中的例子:
QApplication app(argc, argv);
QString locale = QLocale::system().name();
QTranslator translator;
translator.load(QString("arrowpad_") + locale);

app.installTranslator(&translator);

参考

http://blog.csdn.net/dbzhang800/article/details/6334852 

http://www.cuteqt.com/blog/?p=59 

 http://caterpillar.onlyfun.net/Gossip/Qt4Gossip/I18NSelectChange.html

 

posted @ 2012-08-25 01:40  kevinzhwl  阅读(419)  评论(0编辑  收藏  举报