编者按:Linux 在中国如何发展?往何处发展?这是广大中国Linux爱好者所热切关注的。本站将连载中文Linux的开创者之一于明俭老师最近撰写的长文《Linux 国际化本地化和中文化》。欢迎讨论!
--------------------------------------------------------------------------
一 国际化、本地化和中文化
1. 国际化、本地化和多语言化的概念
2. 中文化
3. X11 国际化的历史和级别
4. 国际化标准组织
5. 国际化的意义
二 Locale
1. Locale 的概念
2. 在X中使用Locale
3. 文化习俗的差别
三 X 窗口系统的国际化
1. 显示的国际化
1. 字符集和编码
2. 多字节字符(Multibyte)和宽字符(WideChar)的使用
3. Unicode
4. 字体(Font)和字体集(FontSet)
5. 信息的国际化
2. 输入的国际化
3. 打印的国际化
4. 客户程序间通讯的国际化
四 开发符合国际化标准的软件
1. 开发国际化软件
2. 使非国际化软件国际化
五 目前中文化中存在的问题
1. 编码动态切换的问题
2. 中文编码自动识别问题
3. Linux上的中文平台到国际化的过渡
五 附录
1. 宽字符处理函数函数与普通函数对照表
2. X 窗口系统下支持中文的函数库
3. 支持多语言的典型软件
4. 支持Unicode的软件
--------------------------------------------------------------------------
一 国际化、本地化和中文化
1. 国际化、本地化和多语言化的概念
一般来说,"国际化"是指把原来为英文设计的计算机系统或应用软件改写为同时支持多种语言和文化习俗的过程. 在软件创作的初期,一般的编程语言,编译,开发都是尽支持英文的,为了适应更广的语言和文化习俗,软件有必要在设计结构和机制上支持多语言的扩展特性,这一过程称为国际化. 国际化仅仅是在软件设计上提供了使用多语言的可能.
"本地化"是指把计算机系统或者应用软件转变为使用并兼容某种 特定语言的过程. 比如,把原来为英文设计软件制作为支持中文的软 件就是本地化的一种. 它主要包括翻译文本信息,界面信息,重新设计图标等等.
语言和文化习俗因地域不同而差别很大. 对某一特定的地域的 语言环境称为 "locale". 它不仅包括语言和货币单位,而且还包括数字标示格式,日期和时间格式. 国际化了的软件含有一个"locale" 的"参量",使用该"locale"参量便可以设置某一区域所用的语言环境.
在国际化部分中只处理语言的部分叫"多语言化". 比如,一个 "多语言化"的软件可以同时管理诸如英语,法语,中日韩文,阿拉伯语等.
在英文中,国际化(Internationalization)被缩写为I18N,即只取首尾两个字母,中间字母为18个. 同样地,本地化(Localization) 缩写为L10N,多语言化 (Multilingualization) 缩写为M17N.
在今天,Internet把世界各地的计算机联接了起来,共享信息和技术是必然的趋势和需要. 因此各地的计算机系统可以互相交流变得 越来越重要. 在Linux系统向桌面普及的过程中,Linux软件也需要国际化和本地化.
2. 中文化
"中文化"是一个很模糊的概念. 在Linux上的"中文化"它既包含使 软件或系统国际化,又包含使软件本地化. 也就是说,"中文化"不仅仅 是只把软件本地化这么简单的事情,更重要的是因为Linux直接支持中文的软件太少,做"中文化"必须先做"国际化".
由于历史的原因,现阶段使用的中文又有简体中文和繁体中文之分. 所使用的编码也不同. 支持中文的软件应该同时支持简体中文和繁体中文,这对软件的国际化提出了更高的要求.
1999年是中国Linux发展和普及过程中最重要的一年,其中涌现了许多制作中文 Linux发布版本的公司. 中文Linux的技术都是采取了中文化的捷径----中文平台. 尽管都是中文平台,但是具体实现的技术特点各不相同. 充分展示了中文平台在Linux中文化过程中的魅力. 中文平台 在短期内发挥了巨大的作用,加速 Linux的中文化过程并推动Linux在中国的普及.
中文平台的主要技术特点是不用修改西文应用软件,便可以显示和输入中文(有的情况下会失效). 具体地说,就是利用自己的规范去修改X系统的底层函数. 从修改的层次上分为(1)修改函数库libX11.so,这种方式是动态修改,又称外挂方式. 外挂方式的实现可以是直接修改X11库 或使用LD_PRELOAD载入动态库修改. (2)修改X Server部分,又称内嵌方式,它的实现也分为两种,直接修改X Server 部分和建立虚拟Display(X传输协议的部分代理).
3. X11 国际化的历史和级别
早期的X11R4版本中,仅仅含有支持单字节和双字节字体的函数,所以它不能算是国际化的函数库. 此后,一个叫做"mltalk"的X协会成立并着手研究X窗口系统的国际化问题. 众多的X窗口系统供应商也 参与了该组织. 因为对国际化的研究刚刚开始,所以mltalk提出的了 一个基本问题: 什么是X窗口系统的国际化? 对它的解释也各不相同. 实际上,即使是现在,人们对国际化的定义仍然存在分歧,分歧的焦点 主要集中于对软件或系统怎样程度的国际化才算是真正的国际化.
按国际化的级别来分,下列几种情况都属于国际化:
1. 语言可以切换. 在系统启动时可以设置某种语言
2. 使用不同语言的软件可以同时使用,在应用软件启动时可以设置某种语言
3. 使用不同语言的软件可以同时使用,而且应用软件的语言可以动态切换
4. 使用不同语言的软件可以同时使用,而且在应用软件中可以同时使用不同语言
显然,第(4)种国际化方式是最完善的方式,其次是第(3)种,第(2)种 和第(1)种. mltalk 最终决定使用第(3)种,原因是需要支持第(4)种的 X窗口系统供应商是少数的. 从目前Linux上的国际化情况看,支持第(2),(3)种的国际化软件是最常见的,但是第(4)种软件比较少见,而且应用的 意义不是很大.
基于上述观点,X11R5 的目的是,创建支持不用重新编译源代码就可以适应于语言环境的应用软件开发平台. 确切地说,就是国际化 的结构是基于标准C函数 setlocale的. X11R5 确立了以下规范:
1. 切换语言的机制
2. 与语言无关的输出接口
3. 与语言无关的输入接口
4. 资源文件的国际化
5. X工具(Xt)的国际化
此后,以X11R5 为基础,OSF/Motif 完成了国际化改造,并且成为被用户广泛接受的高层图形软件库,直到今天,一些大型的软件仍然使用 Motif 作为基础库使用,如Java,Netscape等. X11R5的规范在制定的同时,为了检测规范的实用性,开发了两套样本应用,即 Xsi 和 Ximp. 两套应用在输入协议上和对locale的支持上都不同,从而为开发商带来了不便.
X11R6 解决了X11R5中存在的问题,主要的变化有,
1. 定义了标准的输入协议
2. Locale数据格式定义
3. 只采用了一种国际化工具的样本应用模块
在输出上,X11R6增加了从由到左的的书写方式,以支持阿拉伯语和希伯来语等,增加了从上到下的书写方式,以支持中文和日文等的书写方向.
4. 国际化标准组织
这里所说的国际化标准是国际化标准组织或一些相关组织制定的一些标准,而且这些标准也会随时间不同而经常更新. 国际化标准涉及到字符集,编码,字体处理,打印,文本绘制,用户界面,语言输入方法,数据交换,文化习俗,等方方面面.
下面列出一些制定国际化标准的组织:
o Li18nux(Linux I18n)
o ANSI(American National Standards Institute)
o POSIX(Portable Operating System Interface for Computer
Environments)
o ISO(International Standards Organization)
o IEEE(Institute of Electrical and Electronics Engineers)
o Unicode Consortium
o Open Group(X Consortium and OSF)
o X/Open and XPG
其中,ANSI/ISO 制定了使用C编程语言编写国际化软件的通用接口. ISO 制定了字符集标准和其它影响locale名字的标准. IEEE提供了一些国际化的通用库函数和设置管理不同locale的用户命令. Open Group是Unix和X窗口系统的国际化标准设立组织. Li18nux 是一个专门从事Linux上的软件国际化 规范制定的组织.
5. 国际化的意义
国际化,特别是国际化中制定的标准,是当今开发国际化软件所必须的. 它也是软件开发的必然趋势. 遵循国际化标准,可以更高效地开发和调试软件和移植软件,降低软件的开发费用,使用户更方便地使用软件. 从国际环境来看,新开发的基本的库函数都会支持国际化标准,基于这些函数库所开发的应用软件理所当然地支持国际化标准,同时有大批的Linux 爱好者把以前不符合国际化标准的软件进行了改造,使它们在一定程度上符合国际化标准. 使用国际化标准的软件,淘汰非国际化标准的软件成为一种趋势.
从国际化的发展历史看,其中许多标准都有日本的商业机构参与,支持日文的软件变得越来越多,而从日语软件移植为中文软件相对于直接移植西文软件相当容易,有时甚至不用改动,这样就节省了许多不必要的劳动. 反过来,符合国际化标准的中文软件又影响日语和韩语软件,成滚雪球之势向前发展. 其次,软件商的开发比较看好亚洲市场中的日本市场,在 Unix/Linux上的日语软件或操作系统一般是符合国际化标准的,所以兼容这一标准是十分必要的. 当然,目前的国际化标准也存在不足之处,特别是对中文这一特殊语言(因为含有GB和Big5两种不能共存的编码)的处理上,应该由中国人在原来的基础上作相应的扩展.
对中文Linux来说,遵循国际化也是必然的趋势. 在以中文平台为基础的中文 Linux上,软件移植已成为必须解决的问题,这个问题的最终解决方法就是遵循同一标准,就目前来说遵循国际化标准是唯一的方法. 鉴于目前中文Linux上的中文平台的混乱状态,国际化标准是从无序到有序过渡的必然途径.
软件的国际标准化也为最终用户带来极大的好处,如同时支持简体中文和繁体中文,中文操作为双字节操作,中文输入能够在更大的程度上使用标准输入接口带来的好处,如输入服务器的定位等交互式操作.
国际化的另一个特点是工作在应用软件级别,所以国际化不会给X窗口系统带来不稳定性.
(第一章完)
Linux 国际化本地化和中文化(二)
蓝森林 http://www.lslnet.com 2000年4月29日 21:34
作 者: 于明俭
(justiny@turbolinux.com.cn)
--------------------------------------------------------------------------
国际化、本地化和中文化
国际化、本地化和多语言化的概念
中文化
X11 国际化的历史和级别
国际化标准组织
国际化的意义
Locale
Locale 的概念
在X中使用Locale
文化习俗的差别
X 窗口系统的国际化
显示的国际化
字符集和编码
多字节字符(Multibyte)和宽字符(WideChar)的使用
Unicode
字体(Font)和字体集(FontSet)
信息的国际化
输入的国际化
打印的国际化
客户程序间通讯的国际化
开发符合国际化标准的软件
开发国际化软件
使非国际化软件国际化
目前中文化中存在的问题
编码动态切换的问题
中文编码自动识别问题
Linux上的中文平台到国际化的过渡
附录
宽字符处理函数函数与普通函数对照表
X 窗口系统下支持中文的函数库
支持多语言的典型软件
支持Unicode的软件
--------------------------------------------------------------------------
二 Locale
Locale 的概念
Locale 是ANSI C语言中最基本的支持国际化的标志, 对中文Linux来说, 如果它支持国际化, 那么支持中文Locale是最基本的要求.
Locale 是软件在运行时的语言环境, 它包括语言(Language), 地域 (Territory)和字符集(Codeset). 其格式为: 语言[_地域[.字符集]]. 如对中文GBK字符集, locale的格式是:zh_CN.GBK. 目前Linux上的中文 Locale还不完善, glibc2.1.x中的许多涉及Locale的C函数还不正确. 如果 用户需要安装中文GBK Locale, 可以直接使用TLC6.0中的:
glibc-2.1.2(含有GBK模块)
localedata-zh-0.07
/usr/X11R6/lib/X11/locale/zh_CN.GBK/XLC_LOCALE(X 下的 GBK Locale)
Locale 包含了以下分类:
LC_COLLATE, 用于比较和排序. 排序对中文来说也比较重要, 但是现在的 glibc中的locale对中文支持有些问题. 汉字排序的 的方式有许多种, 按照 发音(汉语拼音)或者汉字笔画来排序 是比较容易被接受的.
LC_CTYPE, 用于字符分类
LC_MONETORY, 用于货币单位
LC_NUMERIC, 用于数字显示格式. 下面是不同国家的在货币符号 和数字格 式上的不同:
中国大陆: 1,234.56RMB
美国: $1,234.56
德国: 1.234,56DM
LC_TIME, 用于时间和日期. 时间可以用12小时或者24小时的 格式来计算. 在小时和分钟之间可以用逗点或者冒号隔开. 下面 是一些Locale设置的时 间和日期的格式:
中国: 14点20分 2000年三月十四号
英国: 02:20pm 14/03/2000
美国: 02:20pm 03/14/2000
芬兰: 14.20 14.03.2000
LC_MESSAGES, 用于国际化信息, 主要是提示信息,错误信息, 状态信息, 标 题, 标签, 按钮和菜单等.
Locale 通过ANSI C 函数setlocale(分类, locale)来初始化locale 数据. 当locale设置为空时, locale的值便从系统的环境变量中取得. 为了 方便应用 软件, 设置所有的分类, 可以采用下述方式:
setlocale(LC_ALL, "");
如果不成功, 该函数返回NULL. 函数应该回落到setlocale(LC_ALL,"C").
在X中使用Locale
在X的客户程序中使用Locale的机制和在标准C函数中使用Locale的方式一样, 除 此之外, 在X库中还定义了另外两个函数来判断X的locale支持和设置locale 的修 饰(XModifier), 在X中使用Locale和libX11的基本步骤如下:
setlocale(): 设置当前的locale
XSupportLocale(): 用来判断X是否支持目前设置的locale.
XSetLocaleModifier(): 它用来指定一系列的locale修正值. 它的参量的格 式是@分类=赋值. 目前唯一可用的是输入 服务器的名称"im". 如果参量为 空, 则根据系统的环境 变量XMODIFIERS查找. 比如在系统上设置了环境变 量:
% setenv XMODIFIERS @im=Chinput (csh) 或
% export XMODIFIERS=im=Chinput (bash)
则客户程序将查找到输入服务器Chinput, "Chinput"是 输入服务器所设置 的名称.
文化习俗的差别
下面是在国际化和本地化过程中常常遇到的并且应当注意的地方, 对国际化软件 的开发, 应该充分注意到各个地域的文化和习惯, 开发出通用的软件, 对于本地 化过程, 则应选择与本地域相符的习惯.
姓名,地址等特殊信息
姓名中的"姓"和"名"的先后次序, 地址书写的先后次序 电话号码的长度等 等
图标的通用性
图标是易于接受的用户界面, 设计时应考虑到地域习惯, 而且图标上不能有 图形文字, 否则需要重新设计本地图标, 并翻译图标上的文字.
声音使用
不适当的声音或提示可能会引起人的反感. 另外, 声音 的性别对某些国家 是敏感的.
颜色使用
颜色和色调与民俗有关, 比如红色在美国表示危险, 在中国 表示喜庆.
纸张尺寸
打印纸的尺寸因地域而不同, 在选择缺省尺寸时应注意.
键盘差别
在键盘上的键可能因国家而异, 键的个数也可能不一样. 影射关系也不同.
政治因素
在产品设计上, 尽量不要有政治敏感性部分.
(第二章完)
三 X 窗口系统的国际化
在 X 窗口系统上的国际化, 特别是中文化, 主要体现在显示,输入和打印三个方面.
1. 显示的国际化
1. 字符集和编码
在Linux上经常使用的字符集是ISO 8859系列的字符集. 它包含了10个 多语
言的单字节编码字符集. 它们分别是,
字符集 涵盖语言
拉丁一字符集, 包含绝大多数的欧洲语言,
例如French(fr), Spanish (es), Catalan
(ca), Basque (eu), Portuguese (pt),
Italian (it), Albanian (sq),
Rhaeto-Romanic (rm), Dutch (nl),
ISO 8859-1(Latin1) German (de), Danish (da), Swedish
(sv), Norwegian (no), Finnish (fi),
Faroese (fo), Icelandic (is), Irish
(ga), Scottish (gd), English (en),
Afrikaans (af) 和 Swahili (sw). 影响了
美洲, 澳洲和非洲.
拉丁二字符集, 包含了中欧和东欧的语
ISO 8859-2(Latin2) 言:Czech (cs), Hungarian (hu), Polish
(pl), Romanian (ro), Croatian (hr),
Slovak (sk), Slovenian (sl), Sorbian.
ISO 8859-3(Latin3) 拉丁三字符集, 包括: Esperanto (eo) and
Maltese (mt)
拉丁四字符集, 包括: Estonian (et), 巴
ISO 8859-4(Latin4) 尔地克 Latvian (lv) 和 Lithuanian
(lt), Greenlandic (kl) , Lappish.
Bulgarian (bg), Byelorussian (be),
ISO 8859-5(西里尔语) Macedonian (mk), Russian (ru), Serbian
(sr)
ISO 8859-6(阿拉伯语) 阿拉伯语(ar)
ISO 8859-7(希腊语) 希腊语(el)
ISO 8859-8(希伯来语) Hebrew (iw) 和Yiddish (ji)
ISO 8859-9(Latin5) 重排了Latin1, 用土耳其语的几个字母做了
替换
ISO 8859-9(Latin6) 重排了Latin4, 去掉了某些符号, 增加了
Inuit等
ISO 8859-11(泰国语) 泰国语(th)
ISO 8859-12 Celtic
ISO 8859-13(Latin7) Baltic Rim 和 Lativian(lv)
ISO 8859-14(Latin8) Gaelic 和 Welsh (cy)
ISO 8859-15(Latin9) Latin1的变种, 修改了某些字母
双字节字符集主要包含中文,日文和韩文. 它由前导字节(Lead Byte) 和尾
部字节(Trail Byte)构成, 由于一个字符采用了两个字节, 在软件的 国际
化方面又增加了一些麻烦, 比如在显示上, 光标的位置不能位于汉字 之间,
删除和移动时必须是整字操作等, 在输入上, 一般需要预编辑服务器 才能
输入汉字. 下表列出了中日韩语言编码的有关信息:
语 前导字节范
言 字符集 代码页 围 尾部字节范围
简 GB2312-1980 CP936 0xA1-0xF7 0xA1-0xFE
体
中
文 GBK 无 0x81-0xFE 0x40-0x7E, 0x80-0xFE
中
文
繁 BIG-5 CP950 0x81-0xFE 0x40-0x7E, 0xA1-0xFE
体
日 0x81-0x9F,
文 Shift-JIS CP932 0xE0-0xFC 0x40-0xFC(0x7F除外)
KSC-5601-1987 CP949 0x81-0xFE 0x41-0x5A,0x61-0x7A,0x81-0xFE
0x84-0xD3
韩 0xD8 0x41-0x7E
文 KSC-5601-1992 CP1361 0xD90-0xDE 0x81-0xFE
0xE0-0xF9 0x31-0x7E
0x41,0xFE
最近, 信息产业部和国家质量技术监督局联合发布了两项新的中文信息 处
理基础性国家标准,为解决偏、生汉字的输入提供了方案。其中GB18030-
2000《信息技术和信息交换用汉字编码字符集、基本集的扩充》,为强制性
国家标准. 它收录了2.7万多个汉字,总编码空间超过150万个码位,为彻底
解决邮政、户政、金融、 地理信息系统等迫切需要的人名、地名用字问题
提供了解决方案,也为汉字研究、古籍整理等领域提供了统一的信息平台基
础。 这项标准还同时收录了藏文、蒙文、维吾尔文等主要的少数民族文字.
字符 集编码范围是:
字节数 编码空间 码位数目
单字节 0x00-0x80 129
双字节 第一字节:0x81-0xFE 23940
第二字节:0x40-0x7E,0x80-0xFE
四字节 四字节范围分别是: 1587600
0x80-0xFE,0x30-0x39,0x81-0xFE,0x30-0x39
香港特别行政区也对Big5编码提出了"香港增补字符集", 其目的,是 收纳
香港特区政府及市民在中文电子通讯中有需要使用的字符,来补充目前 大
五码和ISO10646编码标准内并未包含的字符,以作为一个通用的中文界面,
方便大家能准确地以中文进行电子通讯。香港增补字符集有两套编码方案,
一套适用於大五码系统,另一套适用於ISO10646平台。香港增补字符集的大
五码版本,实际上是政府通用字库的增订版。ISO10646国际编码标准目前并
未包含香港增补字符集内的所有字符。目前尚未收纳在ISO10646内的香港增
补字符集字符,均已提交国际标准化组织管辖下的表意文字小组,以考虑是
否纳入ISO10646日后的新增版本内.
上述标准和草案应该是以后的中文Linux所应该遵循的.
2. 多字节字符(Multibyte)和宽字符(WideChar)的使用
我们平时见到的以文本方式存在的字符都是多字节字符, 它主要用于 文件
存储和网络上的以流(Stream)的方式传输. 一个GB编码的汉字需要两个 字
节. 多字节字符的缺点是在中文处理上不方便, 比如汉字的删除和光标的
移动都会有半汉字问题. 为了文本处理的方便, 在内部操作上通常是把汉字
与英文的混和字符串先转换成等宽度的字符串, 即宽字符, 为软件的内部处
理 提供方便.
glibc2.1.x中多字节字符串和宽字符串的转换有时有问题. 在X下还可以 使
用另外一种方式完成转换, 即使用XmbTextListToTextProperty()和
XwcTextPropertyToTextList() 联合完成转换.
3. Unicode
目前所使用的Unicode 是一种16位字宽的字符编码, 它由非赢利的计算机
组织Unicode研讨会维护和改进. 它起源于Xerox和Apple之间的合作研究.
几 个公司组成了一个非正式的论坛, 接着IBM, Microsoft等公司迅速加入.
Unicode研讨会在1990年发表了Unicode标准版本1, 同时国际标准化组织完
成 了一种类似的编码----ISO 10646. 因为没有必要存在两套标准, 所以
Unicode 研讨会和国际标准化组织在1991到1992合二为一. 1994年, 中国和
日本开始对 基于ISO10646上的国家标准进行工作. 现在, Unicode 开始用
在许多产品中.
Unicode包含了当今计算机领域中广泛使用的所由字符, 如世界上大部分 的
书面语言, 印刷字符, 数字和技术符号, 地理图形和标点符号. 由于
Unicode 的一致性, 它在大多数情况下都可能简化软件的国际化过程. 它取
消了处理 多种代码页的必要, 并且由于是16位编码, 因此由双字节字符集
所引起的额外 处理也不必要了.
但是, Unicode作为一种编码也有它的缺陷, 比如编码的位置与排序无关,
所以使软件支持Unicode仅仅是国际化的第一步, 实际情况中还需要与语言
相关 的信息和规则. 所以Unicode一般作为程序的内部处理编码, 必须提供
与其它 编码的双向转换表.
最后需要说明的是, 虽然使用Unicode会使普通的英文文本大两倍, 但是 使
用Unicode的整个系统却不会增加太大, 因为系统存放的文件大部分是二进
制 文件格式, 同时, 使用针对Unicode的压缩方式, 可以把文件压缩成和使
用对应 的8位正文一样大小.
4. 字体(Font)和字体集(FontSet)
在X窗口系统下使用的字体都必须在X服务器中注册X逻辑字体描述(X
Logical Font Description)名. 它包括了字体的许多信息, 例如以下为西
文字体和中文 字体的两个例子.
1. -adobe-times-medium-r-normal--14-140-75-75-p-74-iso8859-1
2. -tlc-song-medium-r-normal--24-240-75-75-c-240-gbk-0
为了方便使用, 用户还可以给每一个字体加一个或多个别名, 别名文件
fonts.alias 放在字体目录下, 可以手工编辑. 当字体目录变更或别名变更
后, 必须使用命令 "xset fp rehash"或重新启动X才起作用.
X 字体也可以通过字体服务器(Font Server)加载. 这对于本地不放字体 的
系统或X终端特别有用. 加载的协议可以是TCP或DECNET.
X 窗口系统的字体在X Server中之存在一份, 当所由软件都不使用它时, 字
体的内存自动施放.
字体中包含了制造商名, 字体类型, 权重, 字体大小, 字符集等信息. 它们
也 可以缩写, 省去的部分用星号代替, 比如对上面的中文字体, 可以缩写
为:
-*-song-*-24-*-gbk-0
在实际应用中, 字符串往往是中文和英文的混和字符串, 所以必须使用两种
字体来绘出该字符串, 这种指定两种或两种以上的字体的描述就是字体集.
字体 集一般的格式是把多种字体用逗号隔开, 比如, 指定下列字体集:
"-adobe-helvetica-medium-r-normal--14-*-*-*-*-*-iso8859-*,\
-tlc-song-medium-r-normal--14-*-*-*-*-*-gbk-0"
令人遗憾的是, 中文的GB编码和Big5编码有重叠区域, 不能区分开来, 所以
字体集并不能同时指定GB和Big5的字体.
字体集的具体载入受到Locale的影响.
在许多已经国际化的软件和图形库中, 一般通过资源文件让用户指定字体
集, 比如gtk的简体中文资源文件为/etc/gtk/gtkrc.zh_CN, qt-1.44(国际
化的)的 资源文件是 ~/.qti18nrc 等等.
2. 信息的国际化
信息(Message)国际化是软件国际化中比较重要的一环, 如果使软件可以 支持多
种语言, 在设计时就应当考虑到信息的国际化问题. 现在的绝大多数 软件使用
GNU的gettext作为基本工具. 信息国际化的基本步骤是:
o 在软件初始化时设置使用setlocale()设置Locale
o 使用gettext宏定义, 使程序看上去比较方便:
o 指定信息的位置:
o 指定翻译信息: _("Some Strings");
o 在软件完成后,使用 xgettext 提取信息并翻译
o 使用msgfmt把信息文件转换为.mo文件, 安装到locale目录下
/* file this_app.c */
#include
#include
#define _(String) gettext(String)
#define N_(String) gettext(String)
#define __(String) (String)
int main(){
//由环境变量决定locale
setlocale(LC_ALL, "");
//设置message的位置和文件名
bindtextdomain("this_app", "/usr/share/locale");
textdomain("this_app");
printf(_("Some String"));
}
至此, 本程序的国际化过程已完成. 编译并联接成可执行文件this_app.
gcc -o this_app this_app.c
下面是本地化的过程.
o 提取要翻译的信息: xgettext -a -o this_app.po this_app.c
o 翻译信息
在文件this_app.po 中含有"Some String":
msgid "Some String"
msgstr ""
翻译成:
msgid "Some String"
msgstr "一些字符串"
o 格式化信息文件: msgfmt -o this_app.mo this_app.po
o 拷贝信息文件到locale的目录下, 比如对于中文zh_CN, cp this_app.mo
/usr/share/locale/zh_CN/LC_MESSAGES
o 执行文件: LC_ALL=zh_CN ./this_app
007 于 2005-07-24 00:03:02发表:
读读也不错呀