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文件)
translator.load("hellotr_la");
app.installTranslator(&translator);
对于.pro文件的修改,加一下语句:
TRANSLATIONS=hellotr_la.ts
那么我们可能想到这样写代码
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
QApplication app(argc, argv);
QString locale = QLocale::system().name();
QTranslator translator;
translator.load(QString("arrowpad_") + locale);
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=59http://caterpillar.onlyfun.net/Gossip/Qt4Gossip/I18NSelectChange.html