于明俭 [中国Linux论坛] [北京TurboLinux公司]
一 国际化、本地化和中文化
国际化、本地化和多语言化的概念
一般来说, "国际化"是指把原来为英文设计的计算机系统或应用 软件改写为同时支持多种语言和文化习俗的过程. 在软件创作的初期, 一般的编程语言,编译,开发都是尽支持英文的, 为了适应更广的语言 和文化习俗, 软件有必要在设计结构和机制上支持多语言的扩展特性, 这一过程称为国际化. 国际化仅仅是在软件设计上提供了使用多语 言的可能.
"本地化"是指把计算机系统或者应用软件转变为使用并兼容某种 特定语言的过程. 比如, 把原来为英文设计软件制作为支持中文的软 件就是本地化的一种. 它主要包括翻译文本信息,界面信息,重新设计 图标等等.
语言和文化习俗因地域不同而差别很大. 对某一特定的地域的 语言环境称为"locale". 它不仅包括语言和货币单位, 而且还包括 数字标示格式, 日期和时间格式. 国际化了的软件含有一个"locale" 的"参量", 使用该"locale"参量便可以设置某一区域所用的语言环境.
在国际化部分中只处理语言的部分叫"多语言化". 比如, 一个 "多语言化"的软件可以同时管理诸如英语,法语,中日韩文, 阿拉伯语等.
在英文中, 国际化(Internationalization)被缩写为I18N, 即只 取首尾两个字母, 中间字母为18个. 同样地, 本地化(Localization) 缩写为L10N, 多语言化(Multilingualization) 缩写为M17N.
在今天, Internet把世界各地的计算机联接了起来, 共享信息和 技术是必然的趋势和需要. 因此各地的计算机系统可以互相交流变得 越来越重要. 在Linux系统向桌面普及的过程中, Linux软件也需要国 际化和本地化.
中文化
"中文化"是一个很模糊的概念. 在Linux上的"中文化"它既包含使 软件或系统国际化,又包含使软件本地化. 也就是说, "中文化"不仅仅 是只把软件本地化这么简单的事情, 更重要的是因为Linux直接支持中 文的软件太少, 做"中文化"必须先做"国际化".
由于历史的原因, 现阶段使用的中文又有简体中文和繁体中文之 分. 所使用的编码也不同. 支持中文的软件应该同时支持简体中文和 繁体中文, 这对软件的国际化提出了更高的要求.
1999年是中国Linux发展和普及过程中最重要的一年, 其中涌现了 许多制作中文Linux发布版本的公司. 中文Linux的技术都是采取了中文 化的捷径----中文平台. 尽管都是中文平台, 但是具体实现的技术特点 各不相同. 充分展示了中文平台在Linux中文化过程中的魅力. 中文平台 在短期内发挥了巨大的作用, 加速Linux的中文化过程并推动Linux在中 国的普及.
中文平台的主要技术特点是不用修改西文应用软件, 便可以显示和 输入中文(有的情况下会失效). 具体地说, 就是利用自己的规范去修改 X系统的底层函数. 从修改的层次上分为(1)修改函数库libX11.so, 这种 方式是动态修改, 又称外挂方式. 外挂方式的实现可以是直接修改X11库 或使用LD_PRELOAD载入动态库修改. (2)修改X Server部分, 又称内嵌方式, 它的实现也分为两种, 直接修改X Server部分和建立虚拟Display(X传输 协议的部分代理).
X11 国际化的历史和级别
早期的X11R4版本中, 仅仅含有支持单字节和双字节字体的函数, 所以它不能算是国际化的函数库. 此后, 一个叫做"mltalk"的X协会 成立并着手研究X窗口系统的国际化问题. 众多的X窗口系统供应商也 参与了该组织. 因为对国际化的研究刚刚开始, 所以mltalk提出的了 一个基本问题: 什么是X窗口系统的国际化? 对它的解释也各不相同. 实际上, 即使是现在, 人们对国际化的定义仍然存在分歧, 分歧的焦点 主要集中于对软件或系统怎样程度的国际化才算是真正的国际化.
按国际化的级别来分, 下列几种情况都属于国际化:
语言可以切换. 在系统启动时可以设置某种语言
使用不同语言的软件可以同时使用, 在应用软件启动时可以 设置某种语言
使用不同语言的软件可以同时使用, 而且应用软件的语言可 以动态切换
使用不同语言的软件可以同时使用, 而且在应用软件中可以 同时使用不同语言
显然, 第(4)种国际化方式是最完善的方式, 其次是第(3)种,第(2)种 和第(1)种. mltalk 最终决定使用第(3)种, 原因是需要支持第(4)种的 X窗口系统供应商是少数的. 从目前Linux上的国际化情况看, 支持第(2), (3)种的国际化软件是最常见的, 但是第(4)种软件比较少见, 而且应用的 意义不是很大.
基于上述观点, X11R5 的目的是, 创建支持不用重新编译源代码 就可以适应于语言环境的应用软件开发平台. 确切地说, 就是国际化 的结构是基于标准C函数setlocale的. X11R5 确立了以下规范:
切换语言的机制
与语言无关的输出接口
与语言无关的输入接口
资源文件的国际化
X工具(Xt)的国际化
此后, 以X11R5 为基础, OSF/Motif 完成了国际化改造, 并且成为 被用户广泛接受的高层图形软件库, 直到今天, 一些大型的软件仍然使用 Motif 作为基础库使用, 如Java, Netscape等. X11R5的规范在制定的同时, 为了检测规范的实用性, 开发了两套样本应用, 即 Xsi 和 Ximp. 两套应用 在输入协议上和对locale的支持上都不同, 从而为开发商带来了不便.
X11R6 解决了X11R5中存在的问题, 主要的变化有,
定义了标准的输入协议
Locale数据格式定义
只采用了一种国际化工具的样本应用模块
在输出上, X11R6增加了从由到左的的书写方式, 以支持阿拉伯语和 希伯来语等, 增加了从上到下的书写方式, 以支持中文和日文等的书写.
国际化标准组织
这里所说的国际化标准是国际化标准组织或一些相关组织制定的一些标准, 而且这些标准也会随时间不同而经常更新. 国际化标准涉及到字符集,编码, 字体处理,打印,文本绘制, 用户界面, 语言输入方法, 数据交换, 文化习俗, 等方方面面.
下面列出一些制定国际化标准的组织:
Li18nux(Linux I18n)
ANSI(American National Standards Institute)
POSIX(Portable Operating System Interface for Computer Environments)
ISO(International Standards Organization)
IEEE(Institute of Electrical and Electronics Engineers)
Unicode Consortium
Open Group(X Consortium and OSF)
X/Open and XPG
其中, ANSI/ISO 制定了使用C编程语言编写国际化软件的通用接口. ISO 制定了字符集标准和其它影响locale名字的标准. IEEE提供了一些国际化的 通用库函数和设置管理不同locale的用户命令. Open Group是Unix和X窗口 系统的国际化标准设立组织. Li18nux 是一个专门从事Linux上的软件国际化 规范制定的组织.
国际化的意义
国际化, 特别是国际化中制定的标准, 是当今开发国际化软件所必须 的. 它也是软件开发的必然趋势. 遵循国际化标准, 可以更高效地开发和 调试软件和移植软件, 降低软件的开发费用, 使用户更方便地使用软件. 从国际环境来看, 新开发的基本的库函数都会支持国际化标准, 基于这些 函数库所开发的应用软件理所当然地支持国际化标准, 同时有大批的Linux 爱好者把以前不符合国际化标准的软件进行了改造, 使它们在一定程度上 符合国际化标准. 使用国际化标准的软件, 淘汰非国际化标准的软件成为 一种趋势.
从国际化的发展历史看, 其中许多标准都有日本的商业机构参与, 支持 日文的软件变得越来越多, 而从日语软件移植为中文软件相对于直接移植 西文软件相当容易, 有时甚至不用改动, 这样就节省了许多不必要的劳动. 反过来, 符合国际化标准的中文软件又影响日语和韩语软件, 成滚雪球之 势向前发展. 其次, 软件商的开发比较看好亚洲市场中的日本市场, 在 Unix/Linux上的日语软件或操作系统一般是符合国际化标准的, 所以兼容 这一标准是十分必要的. 当然, 目前的国际化标准也存在不足之处, 特别是 对中文这一特殊语言(因为含有GB和Big5两种不能共存的编码)的处理上, 应该由中国人在原来的基础上作相应的扩展.
对中文Linux来说, 遵循国际化也是必然的趋势. 在以中文平台为基础 的中文Linux上, 软件移植已成为必须解决的问题, 这个问题的最终解决 方法就是遵循同一标准, 就目前来说遵循国际化标准是唯一的方法. 鉴于 目前中文Linux上的中文平台的混乱状态, 国际化标准是从无序到有序过渡 的必然途径.
软件的国际标准化也为最终用户带来极大的好处, 如同时支持简体中文 和繁体中文, 中文操作为双字节操作, 中文输入能够在更大的程度上使用 标准输入接口带来的好处, 如输入服务器的定位等交互式操作.
国际化的另一个特点是工作在应用软件级别, 所以国际化不会给X窗口 系统带来不稳定性.
参考资料:
Linux I18N: http://www.li18nux.org/
二 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"是 输入服务器所设置的名称.
文化习俗的差别
下面是在国际化和本地化过程中常常遇到的并且应当注意的地方, 对国际化 软件的开发, 应该充分注意到各个地域的文化和习惯, 开发出通用的软件, 对于本地化过程, 则应选择与本地域相符的习惯.
姓名,地址等特殊信息
姓名中的"姓"和"名"的先后次序, 地址书写的先后次序 电话号码的长度等等
图标的通用性
图标是易于接受的用户界面, 设计时应考虑到地域习惯, 而且图标上不能有图形文字, 否则需要重新设计本地图标, 并翻译图标上的文字.
声音使用
不适当的声音或提示可能会引起人的反感. 另外, 声音 的性别对某些国家是敏感的.
颜色使用
颜色和色调与民俗有关, 比如红色在美国表示危险, 在中国 表示喜庆.
纸张尺寸
打印纸的尺寸因地域而不同, 在选择缺省尺寸时应注意.
键盘差别
在键盘上的键可能因国家而异, 键的个数也可能不一样.
政治因素
在产品设计上, 尽量不要有政治敏感性部分.
参考资料:
Linux 上的Locale
http://www.ping.be/linux/locales/index.shtml
GBK Locale
ftp://ftp.turbolinux.com.cn/pub/turbolinux/TurboLinuxC-6.0/SRPMS/SRPMS/localedata-zh-0.07-1.src.rpm