Qt国际化QString

Qt国际化QString

[email protected]

2014年11月28日

 

1 目标:使用统一的编码,并能够转换为各种编码的正常显示

2 实现

2.1 原理:使用Unicode统一编码,其它编码与Unicode进行转换

2.2 方法:QT linguist(语言家)

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

2.2.1 步骤

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

2.2.2 示例

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);

3 QString

3.1 内存结构

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

3.2 格式化输出

格式化,不再使用printf样式的格式化,

使用%n,加arg(value)设置。(n从1开始)。

QStringstrSQL=str1.arg(aa);

格式化之后原字符串不变,返回格式化之后的字符串。

不同的格式,使用不同的arg()方法。参见帮助文档。

3.3 格式转换

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)。

3.4 手动显示中文

1)   QString::fromUtf8()

2)   如果设置之后仍然提示,可能与源代码的编译有关,在源码上右击,点击保存时使用utf-8 bom。

3)   如果需要手动翻译几个文字(不推荐这样使用,很容易出现问题,且不易排查,最好使用tr),可以使用将文件转换为unicode的方法加以显示。

示例:

char *pTotal = "总消减率最高";

QString strTotal = m_pCodec->toUnicode(pTotal,strnlen(pTotal,20));

 

你可能感兴趣的:(开发,qt)