Qt国际化QString
2014年11月28日
Qt内部使用Unicode。任何编码,只要能够与Unicode进行互转,就能够在Qt中正确显示。所以在Qt中进行转码,必须使用Unicode中间层QString。
在使用与用户交互的UI中,都使用QString,遇到char时,将强制转换为QString。QString具有转换为std::string的功能。应尽量使用QString避免转换。
QObject::tr()将二进制字符标记,然后由QTranslator加载相应的转换文件,将标记字符转换为相应的转换字符完成转换。
在使用designer进行界面设计时,每个界面元素都标记为tr()。
参考:http://hi.baidu.com/dreammerge/item/3db98955d5db4fc09e2667bc
1) 创建tr()标记:在需要进行翻译的地方设置标记。
2) 创建.qm转换文件
a) 在.pro中添加输出标记文件名称
xml格式,用于导出所有的标记项,由lupdate生成,这里需要添加输出文件名称
b) 调用lupdate(命令行)生成标记文件
i. 标记文件:xml格式,每个翻译条目都由一个message节处理。包含源文件定位(location),源字符串(source),翻译注释(translatorcomment),翻译字符串(translate)。
<message>
<locationfilename="mainwindow.cpp" line="356"/>
<source>Translate</source>
<translatorcomment>目标注释</translatorcomment>
<translationtype="unfinished">目标字符串</translation>
</message>
ii. 这里要注意:linguist可以从xml翻译文件中找到源文件,并标明出处。
c) 调用linguist进行手动转换,并将转换后的xml编译为二进制qm(文件->发布)(快一点,并且保密啊)(也可以手动修改或用其它工具修改)。
3) 加载转换文件
使用QTranslator的对象,调用load()加载.qm文件(与exe相对路径或绝对路径)。然后appliation对象调用installTranslator()装载QTranslator对象。
参考:http://devbean.blog.51cto.com/448512/245063
1) 创建tr()条目
//xx.cpp
voidMainWindow::createUIItems()
{
//方案选项
QStringListlstPreceptItem;
lstPreceptItem<<tr("totalReduce")<<tr("unitReduce");
ui->comboBox->addItems(lstPreceptItem);
m_lstPreceptItem=lstPreceptItem;
//作用目标选项
QStringListlstTargetItem;
for(inti=0;i<m_lstTargetItem.size();++i){
lstTargetItem<<(tr(m_lstTargetItem[i].toStdString().c_str()));
}
ui->comboBox_2->addItems(lstTargetItem);
}
2) 创建qm文件
a) 添加ts文件
//xx.pro
TRANSLATIONS+=npp.ts
b) 生成qm文件
调用 lupdate xx.pro 生成npp.ts
linguist 打开npp.ts,添加翻译内容,发布后生成npp.qm
3) 使用qm文件
//translationsetting
QStringstrTranslateFilePath=qApp->applicationDirPath()+"/npp.qm";
QTranslatorqtTranslator;
qtTranslator.load(strTranslateFilePath);
a.installTranslator(&qtTranslator);
QTranslatorqtTranslator2;
qtTranslator2.load(qApp->applicationDirPath()+"/qt_zh_CN.qm");
a.installTranslator(&qtTranslator2);
Qt内部的字符串使用Unicode作为字符单位,每个字符由一个QChar表示,QChar由16bit的Unicode表示。如果要与Ansi进行转换,需要转换为QLatin1Char(由8bit的ansi表示)。可以使用QString::data()获取QChar的字节指针(16bitUnicode)。
在Qt中字符串指针(char *)由QByteArray实现,但是其实现时,为节省内存,使用写时复制技术(如果无变化,则使用同一段物理内存)。QByteArrsy::size()只统计有效字符个数,但其保证为每个字符串后有一个’\0’。
默认情况下,QByteArray使用deep-copy,如果不需要,则可以使用QByteArray::fromRawData()。也因此,只有在具有一个完整的QByteArray对象时才能进行读写操作。
参考:http://blog.sina.com.cn/s/blog_539d078401014eoh.html
格式化,不再使用printf样式的格式化,
使用%n,加arg(value)设置。(n从1开始)。
QStringstrSQL=str1.arg(“aa”);
格式化之后原字符串不变,返回格式化之后的字符串。
不同的格式,使用不同的arg()方法。参见帮助文档。
QString->char *:只能先转换为QByteArray(将16bit转换为8bit)(QString::toLatin1()或toAscii()(由于此函数与toLatin1()过于相似,已经于Qt5中去除)或toLocal8bit()),再进行转换,不可以级连转换。
QString->std::string:QString::toStdString()。
参考:http://www.cppblog.com/Alina-zl/archive/2008/11/19/67323.html
QString::toDouble():注意,默认情况下有效位数为6,在经纬度这种高精度要求下,会有很大的误差,应该改为16(Double的最高有效位数为15~16)。
1) QString::fromUtf8()
2) 如果设置之后仍然提示,可能与源代码的编译有关,在源码上右击,点击保存时使用utf-8 bom。
3) 如果需要手动翻译几个文字(不推荐这样使用,很容易出现问题,且不易排查,最好使用tr),可以使用将文件转换为unicode的方法加以显示。
示例:
char *pTotal = "总消减率最高";
QString strTotal = m_pCodec->toUnicode(pTotal,strnlen(pTotal,20));