[linux][qt]linux国际化处理 及QT处理样例

来源:互联网 发布:c 和java的区别 编辑:程序博客网 时间:2024/05/19 17:03

Linux系统 提供了符合Posix标准的 NLS(National Language Support)子系统,主要是
用于i18n对于多国语言的支持. 多国语言支持主要有两个模块,一个是glibc,通过读取系统
当前的 Locale 设定来识别当前的本地化区域,从而使用正确的字符映射表和消息函数.
libc 对多字节编码的支持非常灵活和自由,它通过一种"转换模式"来实现. 目前的Glibc采
用UTF-8作为处理码. 当接收到外部输入的多字节字符时,系统首先根据当前的 Locale 确定
所使用的字符集,然后查找从当前字符集到UTF-8之间的转换模式,根据这种转换模式把输入
的多字节字符转换为相应的UTF-8字符. 相反,当需要输出字符时,系统再查找从UTF-8到当前
字符集之间的转换模式,按照这种模式把要输出的UTF-8字符转换为当前字符集中的多字节字
符. 在Glibc内部,有一个gconv_modules的转换模式列表. 这个列表作为一个文件的形式存
在于/usr/lib/gconv 目录下. 对于每种具体的转换模式,Glibc把它们的转换表和转换函数
编译为一个独立的共享文件(.so),比如支持GB的转换模式的共享文件名为 libGB.so,支持
Big5的共享文件名为 libBIG5.so. 当应用程序调用到Glibc中有关编码转换部分的函数时
,Glibc首先从gconv_modules 这个转换模式列表中查找所应该采用的转换模式,然后把相应
转换模式的共享文件调入内存. 这种动态装载的方式,使得添加或者删除转换模式非常自由
和方便,而且当Glibc 支持越来越多的编码时,libc.so这个文件本身并不会变得异常庞大
一般来说,Locale是由三个文件创建得到的,它们分别 是Charmap Source 文件,Locale
Source文件和Method文件. 其中Charmap Source 文件主要用来定义该Locale所支持的字符
集中的每个字符; Locale Source文件的主要作用是定义Locale的六个域,它们分别是
LC_CTYPE,LC_COLLATE,LC_TIME,LC_NUMERIC,LC_MONETARY,LC_MESSAGES,在新的
Glibc2.2版本中将会支持更多的 Locale域;而所谓Method文件,其实就是针对多字节处理所
提供的一些函数.
Glibc 提供了 localedef 函数来生成具体的 Locale,localedef 的用法如下所示:
localedef -f charmapsourcefile -i localesourcefile -m methodfile localename
其中-f,-i 和 -m 参数分别表示指定 charmap source 文件,locale source 文件和
method 文件,而最后的一个参数表示所要生成的 locale 的名字
像普通的国际化过程一样,Qt 使用了类似GNU gettext一样的函数 QObject::tr(),它用于从
Qt的信息文件 .qm 中取出信息,这些信息是经过 Qt 的工具处理的.  Qt在处理 编码时还使
用了 QTranslator 类,可用于指定整个应用软件的 的信息文件
下面是一段使用了 QObject::tr()的代码,它建立了一个弹出菜单,菜单项是"Quit",它被放
置在菜单条上,在菜单条上显示的是标签"File".
                QPopupMenu* popup;
                popup = new QPopupMenu( this );
                popup->insertItem( tr("&Quit"),qApp,SLOT(quit()) );
                menubar->insertItem( tr("&File"),popup );
对于绝大多数情况,可以用上述方法处理. 不过有时在定义某些变量中使用的字符 串,不能
使用上述方法,但是为了让Qt提取并翻译该字符串,必须用某种方法标志出 来. Qt 定义了
QT_TR_NOOP() 和 QT_TRANSLATE_NOOP() 来标志它们. 前者用于单个字符串,后者用于多个
字符串. 比如,
  static const char* strings[] = {
   QT_TR_NOOP( "Hello" ),
   QT_TR_NOOP( "World" )
  };
有时需要使用printf/sprintf之类的函数动态生成字符串,比如,
                QStings s;
                s.sprintf( "Button %d",i );
                but->setText( s );
对这种使用方式的国际化是使用 arg() 函数.
                QString s = tr( "Button %1" ).arg(i);
                but->setText( s );
提取上述信息的方法是使用 Qt 提供的工具 findtr 命令:
  findtr [filename].cpp > i18n.po
注意这些qt程序尚未测试.

原创粉丝点击