QT国际化---小结

来源:互联网 发布:网页游戏编程高手 编辑:程序博客网 时间:2024/05/08 12:42

    相信大家对软件的国际化问题,应该很清楚了,这里我主要谈论的是QT应用程序的国际化的问题,仅供大家参考。


    QT应用程序的国际化问题,应该总的来说还是比较容易的,下面我讲的例子是在源码中直接使用中文,然后把中文翻译成另一种语言文字而言的(其它的语言也一样,换下字符集就可以了),大致分这么几个步骤(这里是针对Windows平台的,我使用的是Qt4.5.3版本):

前期准备,首先在main.cpp中指明你的编码格式:
我在main.cpp指明的字符串的编码格式都是GBK(windows下基本都用这个)的,代码如下:
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));

下面是翻译资源的步骤:

1。在你工程的.pro文件中加上:
TRANSLATIONS = xxx.ts(xxx你工程的名字,或其它名字,以下类似)
如果是中文系统的话还要加上
CODECFORTR = GBK(指明你源代码里tr里使用的编码格式)
CODECFORSRC = GBK(指明你源代码文件使用的编码格式,不过在
linguist仍旧是显示乱码,这个问题网上有个解决办法,参见下面)
在QT的assistant帮助文档里特别指明了,如果使用Visual Studio开发工具的话,必须加上CODECFORSRC = 编码格式。

注意:

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

  • 文件%QTDIR%/tools/linguist/linguist/sourcecodeview.cpp

找到: 

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

改为:

QString::fromLocal8Bit

重新编译一下lingiust即可,大家不妨可以试一下。


2。运行cmd命令,然后进入到你源代码目录下,使用lupdate xxx.pro命令提取你源代码里tr里的资源;

3。使用linguist.exe打开,第2步骤中生成的xxx.ts文件进行翻译。
这里需要注意的是,当你在linguist翻译的时候,当翻译完一个字符的时候,别忘了点工具栏按钮上那个带有对勾并有一个向右箭头的按钮,表示你完成了翻译,如果在linguist的右下角的警告出窗口中有提示的话,那表示你翻译的资源字符要与原资源字符的结尾标点是一样的,翻译好之后,然后保存(当你进行翻译的时候可能源码的位置把汉字显示成了乱码,这个不必关心,只要提取的tr中的字符时正确的就可以了);

4。使用lrelease xxx.ts就可以生成xxx.qm文件,这就是我们想要的,放到你xxx.exe所在目录下就可以了。
如果直接在linguist的File菜单下release的话,通过本人的实践证明,直接在linguist的File菜单下release与直接在命令行里面生成的.qm文件是不一样的,命令行里的是正确的,能被.exe加载并且翻译也是正确的,而linguist的File下release生成的.qm文件就不行,原因是linguist里使用了自己预定义好的编码集,即使你在linguist刚打开时选择了chinese-china也不行 ,这个应该算是linguist的bug吧,呵呵。

注意:
据我网上搜集到的资料来看,有时候还可能与整个程序加载的字体有关,这个需要你在main.cpp中加载正确的字体。

5。然后在main.cpp中使用:
QTranslator translator;
translator.load(QObject::tr("xxx.qm"));
app.installTranslator(&translator);
这样就可以了,这里说明一点,你的源码.h,.cpp文件的编码格式需要是"ANSI"的格式,这个可以先用记事本打开,然后在另存为里保存成ANSI格式就可以了。

    最后一点就是,如果你的Qt程序是编译成了动态链接库(.dll)的形式,里面涉及到ui等文字信息的话,那么先用以上的方法生成.qm文件,然后在调用该.dll程序的main.cpp里同样使用QTranslator加载.qm文件(可以使用QTranslator加载多个.qm文件的),这样就能正确翻译了。

补充说明:

  后来我将Qt升级到了Qt4.7,结果上面的办法失效了,我将"GBK"改成了"system"(包括.pro文件中的CODECFORTR,CODECFORSRC),这个问题就解决了,所以中文windows操作系统下使用Qt时最好直接指定"system"

  还有关于lrelease的问题,根据我网上搜到的结果,.ts文件中虽然已经包含 defaultcodec 信息,但是lrelease存在bug,lrelease需要使用Qt的插件(比如qcncodecs4.dll)才能正确显示编码,但是lrelease偏偏没有加载plugin,这样一来,QString 中存放的unicode字符串将强制转成latin1,导致信息的丢失,从而无法正确翻译。

    注意:如果你系统使用的utf-8编码,就不存在这个问题(utf-8不需要插件)。