• 23570阅读
  • 41回复

[提问]关于Qt4程序支持中文方法的总结 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2011-06-14
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
关键词: 中文布署
看到这个帖子的朋友请回复一下,只是为了帖子的回复量能上去,这样更容易引起网友的注意,在相关页面上排名也能上去,这样知道的人也就越多,也就不用老问同类的问题了。请务必注意,只适用于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那样的布署包了,那时,我们就不用像现在这样老碰到布署难题了吧。

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




二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线ppdayz

只看该作者 1楼 发表于: 2011-06-14
给力~!
离线coding_ali

只看该作者 2楼 发表于: 2011-06-14
离线zzjin

只看该作者 3楼 发表于: 2011-06-14
支持老大的教程啊= =~给力啊给力~~~
离线oscarboycn

只看该作者 4楼 发表于: 2011-06-14
http://www.21ic.com
http://bbs.eetop.cn
http://www.eetop.cn/
http://www.eet-china.com/
http://www.netyi.net/
http://www.pcbbbs.com/
http://www.pcbtech.net/
离线redheli
只看该作者 5楼 发表于: 2011-06-14
好好好
离线jdwx

只看该作者 6楼 发表于: 2011-06-14
:能解决很多人的问题!
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线alexltr

只看该作者 7楼 发表于: 2011-06-14
Thanks a lot, XChinux .  
我不从事IT,只是喜欢Qt。
我不是程序员,只是与程序有缘。
我写程序,只是为了让工作变得简单有序!

                      ----  一个一直在入门的编程学习者
离线zhangyueyi87
只看该作者 8楼 发表于: 2011-06-15
顶啊
离线morriszy

只看该作者 9楼 发表于: 2011-06-15
强烈支持版主
VS2010+Qt4.7.0
离线jay8830095
只看该作者 10楼 发表于: 2011-06-15
支持,确实见过不少这类帖子
在不断的变化
离线machou

只看该作者 11楼 发表于: 2011-06-23
离线听雨

只看该作者 12楼 发表于: 2011-06-23
对于这个问题似乎每本关于QT的书都有说明。。。
离线yiyangzhi111
只看该作者 13楼 发表于: 2011-06-25
顶之,很好
离线翩翩布衣

只看该作者 14楼 发表于: 2011-06-27
太有用了
离线feixiangxtu

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

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

不知道大家的意见如何?
离线XChinux

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

个人认为还是使用现有的解决方案比较合适吧?Qt中的.qm或者gnu中的.po方案。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线abeldeng
只看该作者 17楼 发表于: 2011-06-28
同意15楼的观点。
比如需要做28国语言,就需要28个相应的文件,可能需要几个不同的翻译公司去做。用比较通用的格式的文件有利于交流。
离线dbzhang800

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


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

只看该作者 19楼 发表于: 2011-06-29
离线cookinful
只看该作者 20楼 发表于: 2011-06-30
离线feixiangxtu

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

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

只看该作者 22楼 发表于: 2011-07-30
顶起
离线e98123
只看该作者 23楼 发表于: 2011-07-31
留名
离线liulihuogyh

只看该作者 24楼 发表于: 2012-11-08
刘明 mark
离线zhi478

只看该作者 25楼 发表于: 2012-11-08
太好了
离线zaq2010

只看该作者 26楼 发表于: 2013-01-27
回 楼主(XChinux) 的帖子
老大 我现在遇到的是部分文字不能显示怎么办。。
只是有几个字不能显示  其他的都正常。。
用的是utf-8编码
离线revive139
只看该作者 27楼 发表于: 2013-01-28
mark mark~~
离线向西流
只看该作者 28楼 发表于: 2013-04-22
顶顶顶
离线XChinux

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

给他装个linguist,就方便地翻译了,比Excel好用.
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线danielgong

只看该作者 30楼 发表于: 2013-04-23
好帖。

只看该作者 31楼 发表于: 2013-07-08
学习了
离线dflangsky

只看该作者 32楼 发表于: 2013-07-17
顶一下
离线attica

只看该作者 33楼 发表于: 2013-07-19
支持老大的教程,但强烈建议使用标准的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

只看该作者 34楼 发表于: 2014-01-20
版主你好:

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

只看该作者 35楼 发表于: 2014-01-21
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务

只看该作者 36楼 发表于: 2014-03-15
离线laoly

只看该作者 37楼 发表于: 2014-04-09
学习了
离线qxiaoyu718

只看该作者 38楼 发表于: 2014-05-05
老大帖子 给力
离线smshandsome

只看该作者 39楼 发表于: 2014-05-16
给力
快速回复
限100 字节
 
上一个 下一个