查看完整版本: [-- 关于Qt4程序支持中文方法的总结 --]

QTCN开发网 -> Qt中文处理 -> 关于Qt4程序支持中文方法的总结 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

XChinux 2011-06-14 16:29

关于Qt4程序支持中文方法的总结

看到这个帖子的朋友请回复一下,只是为了帖子的回复量能上去,这样更容易引起网友的注意,在相关页面上排名也能上去,这样知道的人也就越多,也就不用老问同类的问题了。请务必注意,只适用于Qt4

在论坛里看到很多网友对Qt程序支持中文方面不停地发问,经年累月,我记的这个问题好多年前就已经在论坛有帖子给出过答案了,或者有网友已经在自己的博客中给出了标准答案,直到现在仍然有人不停地问,这里我总结一下(只涉及到windows、x11/linux、meego、symbian平台)。

1、如果程序要支持多国语言,那程序最好全部使用latin1编码(只是最好,并没说只能),在代码中使用Qt的tr()机制,最后做统一的翻译工作,用lupdate工具生成.ts翻译文件,用linguist或任意文本编辑器进行翻译,最后用lrelease工具生成.qm文件,在程序中用QTranslator进行加载。

2、如果想要程序中的一些标准对话框、标准右键菜单等也显示中文,那么需要加载qt_zh_CN.qm文件,它是Qt官方对Qt库中一些文字的中文翻译,最明显的比如QMessageBox上的"OK"、"Cancel"按钮,QLineEdit编辑框上点击右键弹出的"Copy"、"Paste"、"Select All"等菜单项,想让它们变成中文,只要在程序中用QTranslator加载qt_zh_CN.qm文件即可(qt_zh_CN.qm在Qt安装目录下的translations目录下,如果没有,请用lrelease工具从qt_zh_CN.ts文件生成),对于其它语言的Qt库文字翻译,同理,都在Qt安装目录下的translations目录下。如果用到了一些其它Qt组件,也需要翻译的话,比如QtDesignerClient、QtAssistantClient,它们的翻译文件也在translations目录下(Qt SDK中集成的好像没有,可以找Qt源代码包下载来找)。

3、如果在程序中,需要对GBK编码(包括GB2312、GBK、GB18030,也叫cp936)字符串进行转换(成unicdoe、UTF-8等),那么就需要加载插件qcncodecs(在Windows下在Qt安装目录下的plugins/codecs/qcncodecs4.dll,Linux下在/usr/lib/qt4/plugins/codecs/qcncodecs.so.4,Symbian环境安装qt-installer.sis,meego环境已自带,其它环境未测试过)。不过,如果做中文平台下的程序,似乎避免不了的,所以总是将这个插件带上吧。至于插件如何加载,后面再说。

4、如果想在源程序文件中直接使用中文,那么需要如下几步:
              a、确保qcncodecs插件在运行时能正确加载,因为要靠它来转换中文字符串。
              b、C++源代码使用GBK编码来编写。编程中常用的编码无外乎两种,即GBK、UTF-8,这里推荐使用GBK,是由于要兼容编译器的原因,因为UTF-8文件有BOM头的问题,不同的编译器(msvc、gcc)对其默认处理不同,而使用GBK编码,则编译行为就一致了。考虑到有些编译器比这还麻烦,只支持latin1,那只有使用1中所介绍的方法了。
              c、在main()函数Q(Core)Application对象创建之后,加入下面的代码:

QTextCodec::setCodecForCStrings(QTextCoec::codecForName("GBK"));

          其实无论如何,这些字符串最后都转换成了unicode的了,Qt内部使用的编码。注意,这里不推荐将GBK换成System,因为System,在Windows下,它会返回cp936,在日文windows系统下,那根本就不对路。在大多数Linux下,使用的是UTF-8,也不对路。所以,为稳妥起见,请使用“GBK“。


5、程序发布时,可能会产生中文乱码问题,归根到底是因为无法进行中文编码转换的原因,也就是无法找到qcncodecs插件的原因,那只要正确的将它找到就行了。那如何发布?它分为两种情况:
      a、系统中已经有了Qt4环境,无论是系统自带的,还是有专有的Qt4安装包的,那发布时就不用考虑Qt库及插件的问题了,它会自动根据系统环境变量找到的。这适用于Linux(许多Linux都自带了Qt4库)、MeeGo(已经自带了Qt4库)、Symbian(Symbian^3内置了Qt库,S60v3、v5等,则需要安装qt-intaller.sis,同样也不需要自己的程序做专门的布署)。
              b、系统中没有Qt4环境,也没有专有的Qt4安装包,那就自己程序打包时自带Qt库和插件吧。在Windows下,将所依赖的dll库直接放在.exe文件所在目录下,在linux下,将它们放在一个lib目录下,通过写启动脚本设置LD_LIBRARY_PATH来让可执行程序来找到它。关于插件,我推荐使用qt.conf的方式,写一个qt.conf文件,将它放在资源文件中的:/qt/etc/qt.conf路径上,或者直接放在可执行文件所在目录下,其内容如下:

[Paths]
Prefix=.
Libraries=../lib
Binaries=../bin
Plugins=../plugins

上面的那个../plugins即是指向你的插件所在目录(所有的插件放在哪个目录下,是相对于可执行文件所在目录),
有了这个还不够,还要在main()函数中加入下面的设置当前路径的代码,因为qt.conf中的那个Prefix=.要指定到当前目录的:

QDir::setCurrent(QApplication::applicatoinDirPath());


     在Windows下,如果不想写qt.conf文件,那可以直接将%QTDIR%/plugins目录下的对应插件拷贝到可执行文件所在目录下,假设可执行文件所在目录为bin,则插件qcncodecs4.dll的路径为bin\codecs\qcncodecs4.dll


6、对于Qt Quick中的.qml文件和Qt Script使用的.js文件,最好还是使用UTF-8编码。


经过以上内容的介绍,大家应该对Qt软件发布有所了解了吧?或许若干年后,Qt库都内置到了各个平台下或有了像qt-installer.sis那样的布署包了,那时,我们就不用像现在这样老碰到布署难题了吧。

看到这个帖子的朋友请回复一下,只是为了帖子的回复量能上去,这样更容易引起网友的注意,在相关页面上排名也能上去,这样知道的人也就越多,也就不用老问同类的问题了。





ppdayz 2011-06-14 17:07
给力~!

coding_ali 2011-06-14 17:43

zzjin 2011-06-14 18:59
支持老大的教程啊= =~给力啊给力~~~

oscarboycn 2011-06-14 19:39

redheli 2011-06-14 21:25
好好好

jdwx 2011-06-14 21:35
:能解决很多人的问题!

alexltr 2011-06-14 21:52
Thanks a lot, XChinux .  

zhangyueyi87 2011-06-15 09:53
顶啊

morriszy 2011-06-15 10:31
强烈支持版主

jay8830095 2011-06-15 11:16
支持,确实见过不少这类帖子

machou 2011-06-23 14:19

听雨 2011-06-23 21:39
对于这个问题似乎每本关于QT的书都有说明。。。

yiyangzhi111 2011-06-25 06:56
顶之,很好

翩翩布衣 2011-06-27 15:29
太有用了

feixiangxtu 2011-06-27 16:08
关于程序多语言(国际化)的另一种方法:
1.把程序中所有用的需要国际化的字符串提取出来,做成xls格式的文件(或者xml文件)。
2.程序中根据region加载不同语言的xls文件(或者xml文件)来实现国际化。

优点:由于地区文化的差异,可能会出现翻译方面的不准确,造成不必要的误解。所有,我们可以提供给本地的开发团队xls格式的文件(或者xml文件),让本地的开发团队根据xls说明来翻译。而且可以实时修改。

不知道大家的意见如何?

XChinux 2011-06-27 17:06
引用第15楼feixiangxtu于2011-06-27 16:08发表的  :
关于程序多语言(国际化)的另一种方法:
1.把程序中所有用的需要国际化的字符串提取出来,做成xls格式的文件(或者xml文件)。
2.程序中根据region加载不同语言的xls文件(或者xml文件)来实现国际化。
优点:由于地区文化的差异,可能会出现翻译方面的不准确,造成不必要的误解。所有,我们可以提供给本地的开发团队xls格式的文件(或者xml文件),让本地的开发团队根据xls说明来翻译。而且可以实时修改。
.......

个人认为还是使用现有的解决方案比较合适吧?Qt中的.qm或者gnu中的.po方案。

abeldeng 2011-06-28 16:23
同意15楼的观点。
比如需要做28国语言,就需要28个相应的文件,可能需要几个不同的翻译公司去做。用比较通用的格式的文件有利于交流。

dbzhang800 2011-06-28 16:39
引用第17楼abeldeng于2011-06-28 16:23发表的  :
同意15楼的观点。
比如需要做28国语言,就需要28个相应的文件,可能需要几个不同的翻译公司去做。用比较通用的格式的文件有利于交流。


呵呵,Qt 提供的ts文件 本身就是 xml 格式的,有什么不通用的。

hjh2008 2011-06-29 22:34

cookinful 2011-06-30 10:37

feixiangxtu 2011-06-30 11:16
引用第18楼dbzhang800于2011-06-28 16:39发表的  :
呵呵,Qt 提供的ts文件 本身就是 xml 格式的,有什么不通用的。

    从用户角度出发,直接将字符串做成xls的表格可能更好点。如果本地的用户觉得翻译不正确或者不准确,可以直接修改xls表格即可。而不需要再重新通过QT的工具去修改,再编译。
个人观点。

yinrenjieone 2011-07-30 22:14
顶起

e98123 2011-07-31 15:32
留名

liulihuogyh 2012-11-08 08:30
刘明 mark

zhi478 2012-11-08 22:04
太好了

zaq2010 2013-01-27 14:28
老大 我现在遇到的是部分文字不能显示怎么办。。
只是有几个字不能显示  其他的都正常。。
用的是utf-8编码

revive139 2013-01-28 06:17
mark mark~~

向西流 2013-04-22 20:50
顶顶顶

XChinux 2013-04-22 23:09
引用第21楼feixiangxtu于2011-06-30 11:16发表的  :
    从用户角度出发,直接将字符串做成xls的表格可能更好点。如果本地的用户觉得翻译不正确或者不准确,可以直接修改xls表格即可。而不需要再重新通过QT的工具去修改,再编译。
个人观点。

给他装个linguist,就方便地翻译了,比Excel好用.

danielgong 2013-04-23 10:30
好帖。

荆棘上的露珠 2013-07-08 23:50
学习了

dflangsky 2013-07-17 17:13
顶一下

attica 2013-07-19 12:24
支持老大的教程,但强烈建议使用标准的Latin1写源代码,加tr,然后加翻译文件

最新的Qt支持自动增加动态语言切换的框架
void XVIEW_XXX::changeEvent(QEvent *e)
{
    QWidget::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

weianjiang 2014-01-20 14:08
版主你好:

我用Qt4.7.3+msvc2008 访问Oracle(GB2312)库,不能正确显示库中汉字,当程序自身汉字可显示,另外同一个程序在Linux(g++)下连英文字符也不能显示了,为什么?

XChinux 2014-01-21 17:43
http://hi.baidu.com/xchinux/item/5dd91dd578684938e3108f9b
看这个

逝水流年wp 2014-03-15 12:56

laoly 2014-04-09 11:25
学习了

qxiaoyu718 2014-05-05 08:49
老大帖子 给力

smshandsome 2014-05-16 20:57
给力

机械狂魔 2014-12-03 14:49
顶一个

donglaile 2014-12-04 15:57

顶顶


查看完整版本: [-- 关于Qt4程序支持中文方法的总结 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled