Qt国际化(源码含中文时)的点滴分析

4175阅读 0评论2012-08-31 baifengxian
分类:C/C++

       Qt国际化(源码含中文时)的点滴分析

注意:本文不介绍如何使用Qt的国际化、本地化支持。本文针对的是偏底层的、Manual和其他资料中很少涉及的东西。所以,继续之前,请先确保:你已经对如何使用Qt的国际化比较熟悉了。

本文针对的是  tr("我是中文") 这种情况, 是Qt中translate、tr 与中文问题 一文提到的 2b 问题的深入。

例子

首先,个人比较抵制源码中使用中文(当然也包括用tr扩住中文了)。但是如果非要用,也不是不可以。在  Qt中translate、tr 与中文问题 一文中,我提到了这个问题。

废话少说,看个例子:

#include #include #include #include int main(int argc, char *argv[]) { QApplication app(argc, argv); #ifndef LOVE_GBK QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8")); #else QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312")); #endif QTranslator translator; translator.load("hellotr_en"); app.installTranslator(&translator); QPushButton hello(QPushButton::tr("你好!", "版权所有:Dbzhang800")); hello.show(); return app.exec(); }

大家应该都知道如何做了:

三步走下来,结果正常,界面能显示翻译出来的问题。但是,翻译过程中有一点会很不爽:

为了解决这个问题,我们不妨从源头lupdate开始看看。

lupdate

作用:从源码文件中提取待翻译的字符串

目前支持的源码文件的后缀:

java,jui,ui,c,c++,cc,cpp,cxx,ch,h,h++,hh,hpp,hxx,js,qs,qml

我们这儿只关心与C++有关的源码文件(QtJambi、QtScript、!Qt Quick相关的源码文件可能会有不同,我不能确定),能力和精力有限哈。

生成.ts文件

要使用lupdate,细分一下,有两种方式:

TRANSLATIONS = hello_zh_CN.ts hello_zh_TW.ts lupdate hello.pro -ts hello_zh_CN.ts hello_zh_TW.ts 乱码?

我们在  QString 与中文问题 一文中,已经充分见识了源码中包含非latin1字符时的编码问题。  lupdate 要从源码文件中提取中文字符串,但它无从知道那我们使用的utf-8,还是gbk,又或者是big5等等编码。所以,需要我们告诉它!

前面提到lupdate的两种用法,那么我们要分别通过两种方法告诉它我们的文件是何种编码:

CODECFORTR = utf-8 #or gbk #DEFAULTCODEC = utf-8 #CODEC = utf-8

注意,如果 CODECFORTR 没有定义,将找 DEFAULTCODEC,如果还没有定义,将找 CODEC。3个都没有定义的话,就采用latin1

lupdate hello.pro -codecfortr utf-8 -ts hello_zh_CN.ts hello_zh_TW.ts

恩,编码设置挺顺利的,这样一来,lupdate根据指定的编码能识别我们的汉字,然后生成的.ts文件不再是乱码了,同时,它在.ts文件中记录下源码中窄字符串的编码

GB2312 lrelease

lrelease 是 Linguist 工具链的一部分,可作为独立程序使用。它将 .ts 文件转换成压缩的 .qm 文件,供 QTranslator 使用。

对应于前面 lupdate 的用法,lrelease也有两种用法

lrelease project.pro lrelease ts-files [-qm qm-file] 注意bug!

我们刚才提到 .ts 到 .qm 的过程,存在一个编码的过程。具体到我们前面提到的GB2312,意味着lrelease需要使用Qt的插件(比如qcncodecs4.dll)。

但很不幸,当前版本(Qt4.7)的lrelease存在bug。

注意:如果你使用的utf-8编码,则不存在这个问题。因为utf-8不需要插件。

如何避免?

尝试阅读lrelease的源码,因为功底太差,最终放弃。所以我也无法提供补丁,只告诉大家一个折中的方法:

如果你在简体中文的windows系统中使用gb2312,那么在指定编码是,直接指定SYSTEM而不要指定GB2312 ,这样一来,可以避免使用codecs插件。

这样的话,.ts中的字符串将会在不借助codecs插件的情况下被lrelease成功地被转码成gb2312。我们的程序此时又可以成功加载翻译了。鼓掌!呵呵

lingiust 原因?

个人认为这应当是lingiust的一个bug。

怎么办?我想应该这样来做(其实lupdate也应该这样来做的,如果这样做了,就不用对MSVC的情况单独设置一个source编码了)。

折中之道

如果你只是想让lingiust能正确显示编码,那么你只需要找到:

找到:

void SourceCodeView::showSourceCode(const QString &absFileName, const int lineNum) { ... fileText = QString::fromLatin1(file.readAll()); ... }

改为

QString::fromLocal8Bit

重新编译一下lingiust即可。

至此,我们的任务完成!

小结

总结一下:

原文地址:http://blog.csdn.net/dbzhang800/archive/2011/04/19/6334852.aspx

 

上一篇:VS2010工程中的*.vcxproj.filters文件
下一篇:Qt中translate、tr关系与中文问题