分类: C/C++
2012-11-05 18:16:08
1.程序中要国际化的静态字符串用tr()<源代码是latin1字符串时>及trUtf8()<源代码不是latin1字符时>
2.动态string用qstring的arg()方法,如tr("host %1 found").arg(hostname),所谓动态是指需要参数生成字符串
3.在用tr转换变量之前,变量用QT_TR_NOOP,此方法用在静态字符串数组上
如: static const char *greeting_strings[] =
{
QT_TR_NOOP("Hello"),
QT_TR_NOOP("Goodbye")
};
tr(greeting_strings[0]);
4.宏QT_NO_CAST_FROM_ASCII强制tr检查
5.
QTextCodec及QTextStream提供不同的字符编码支持。app可能偶尔需要输入输出不同于locale编码的字符编码。
app运行时,系统的locale决定了8-bit 数据的8-bit 编码方式。
当app在Cyrillic KOI8-R locale (the de-facto standard locale in
Russia)需要输出Cyrillic in the ISO 8859-5 encoding,可用如下参考代码:
QString string = ...; // some Unicode text
QTextCodec *codec = QTextCodec::codecForName("ISO
8859-5");
QByteArray encodedString =
codec->fromUnicode(string);
从Unicode转化到local 8-bit
编码,一个简便方法是用QString::toLocal8Bit(),另一个是用 QString::toUtf8()
烦方向的转换有 QString::fromUtf8() and
QString::fromLocal8Bit(),或更通用的从ISO 8859-5
Cyrillic到Unicode的转换:
QByteArray
encodedString = ...; // some ISO 8859-5 encoded text
QTextCodec *codec = QTextCodec::codecForName("ISO
8859-5");
QString string =
codec->toUnicode(encodedString);
QTextCodec::codecForLocale()返回的编码方式是最可能需要支持的编码方式,因为用户最可能使用它与其他人分享交流文档。
如果tr中不是latin1,在.qro中增加codecfortr = utf-8指明字符编码,在main中也应QTextCodec::setCodecfortr
6.QApplication::setLayoutDirection可以设置书写方向
7.可以把qm文件放在exe中,可以用qt的资源系统
8.
在app中用QTranslator::load()及QCoreApplication::installTranslator()根据用户语言加载语言文件.
qt可以安装多个QTranslator
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTranslator qtTranslator;
qtTranslator.load("qt_" + QLocale::system().name(),
QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&qtTranslator);
QTranslator myappTranslator;
myappTranslator.load("myapp_" + QLocale::system().name());
app.installTranslator(&myappTranslator);
...
return app.exec();
}
9.qlocale可以指定数字和日期时间。其他locale信息可用C++标准函数setlocale或localeconv
10.icon的国际化,可在qre文件中用lang属性:
如
11. 1)在.qro中增加欲支持的语言,
TRANSLATIONS=app-cn.ts \
app-fr.ts \
app-ca.ts
2)lupdate提取所有的tr中的字符形成qm文件
3)用qt linguist转换不同语言
4)用lrelease把.ts文件转换成二进制的.qm文件