Q&A of I18N and L10N
ideal(2001-05-20 09:54)
〖返回〗〖转发〗
Copyright (C) 2001-2003 Marquis Weng <marquis_weng@bbs.ustc.edu.cn> This file is part of "Q&A of I18N and L10N" documentation. This documentation is free documentation; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This documentation is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. */ Q. 什么是i18n和l10n? A. i18n是internationalization(国际化)的缩写,首位的i和末尾的n之间有 18个字母,所以就简写为i18n了;同样的道理l10n是localization(区域化) 的缩写。 Q. OK,我知道i18n和l10n是什么了,不过它们到底有什么用呢?我的目的只不 过是想让我的系统支持中文,没有必要跟我扯这么大的话题吧? A. 这要从如何支持中文的方法谈起了。现在让程序支持中文一般有三种方法: 1. 使用外挂式中文系统。这种方法基本上只有输入和显示中文的功能,比 如Dos下的UCDOS;windows下的chinesestar;linux下的gce和cce等( Turbolinux弄的那个UNICON是通过修改内核来支持中文的,因为我没有用 过这个东西,不知道是不是该把它归类到外挂式);X下面外挂式是通过 LD_PRELOAD来实现的,比如Turbo的ZhWinPro,通过设置LD_PRELOAD环境 变量,把X中原来不支持中文显示的函数替换成可以显示中文的函数,从 而得以显示中文。这种方法比较简单,但是功能有限,只能显示中文,而 不能正确处理中文,仍然是把一个汉字当成两个单字节来处理,导致的一 个最明显的结果是在编辑的时候常常会出现半个汉字的情况。而且由于 LD_PRELOAD的限制,不能处理和库做静态连接的程序,还常常导致系统不 稳定,因此这种方法慢慢的已经被抛弃。 2. 直接在程序中加入中文支持。一般是通过修改已有的程序源代码得到的。 比如,现在还比较常用的CXTERM就是通过修改XTERM的代码得到的;再如 中国科学院开发的支持中文的TEX预处理软件CCT(个人感觉,在中文排版 方面,CCT比CJK-Tex要强)。这种方法当然是非常好用的,而且编写出来 的程序,在效果方面甚至可以超过原来的程序。不过,遗憾的是这种方法 效率实在太低了,而且别人的程序每升级一次,旧的跟着修改一次程序。 所以除了极少数程序可以这么搞之外,大部分程序等另外想办法来中文化。 3. 第三种就是这个FAQ的主角i18n+l10n了。I18N为程序编写提供一个架构, 让同样的程序可以适用在各种语言习惯跟编码系统上面,程式设计人员只 要利用这个架构的机制跟准则编写应用程式,就可以在不需重新编译程序 的情况下,自然的支持各式各样的语言。目前I18N的设计的基本原则是, 把程序中处理和语言编码相关的部分资料独立出来。这些资料包括编码系 统的定义(比如大陆的简体中文GB2312;台湾的Big5编码);数字;日期; 货币的格式等。当然,还包括对用户来说可能是最重要的程序的输出信息。 这些和语言环境悉悉相关的资料,被称为locale database。把这部分独 立出来之后,就可以定义和语言环境细节无关的界面,从而使得程序员在 编写程序的时候,可以不被某种特定的语言环境所限制。而在程序执行的 时候,才通过使用者选择的语言环境,联系该语言环境所使用的locale database 来获得该语言的支持。有了i18n的架构之后,对某种语言的支 持就只需要有该语言的locale database。实现对该语言的支持就叫做 L10N。对中文用户来说,中文化只不过是L10N的一种而已。 Q. 好象很不错的样子,不过我还是有点不太明白到底该怎样中文化。 A. 中文化和其它的语言的区域化没有多少不同。最重要的是需要建立locale database。对于普通用户来说,系统部分的locale database基本上不用自己 操心,现在已经有了中文的locale database了,而且最近推出的几个linux distribution都带了中文locale database,你只要安装一下就行了。然后就 只要告诉程序你所使用的语言环境就行了。告诉程序你所使用的语言环境可 以通过设置环境变量LC_ALL来实现。对于中文用户可以设LC_ALL为 zh_CN.GB2312或者zh_CN.GBK。这样操作之后,你就获得简体中文的支持了。 当然,前提是你已经安装了相应的locale database。 Q. zh_CN.GB2312,zh_CN.GBK?很怪的名字,能告诉我是什么意思吗? A. locale database(简称locale)的名字包含下面几个部分,其中[]里面的是 可选的: language[_territory[.encoding]][@modifier] 对照来说:zh_CN.GB2312中,zh表示中文的意思,CN表示中国大陆,GB2312 表示所使用的编码方式是GB2312;同样zh_TW.Big5表示台湾的Big5编码的中 文locale。语言(language)通常是两个小写字母,它使用的是ISO 639规定 的语言缩写;地区是两个大写字母表示的,遵循ISO 3166标准(iso639和 iso3166 这两个标准可以从ftp://dkuug.dk/i18n/下面找到)。另外,需要 注意的是,在glibc-2.2中,编码(encoding)部分都采用小写的,即 zh_CN.GB2312按照标准应该写成zh_CN.gb2312,不过由于历史原因,目前这 两者还是通用的。 Q. 我怎么判断是否安装了某个locale? A. 运行一下locale -a看看你的系统目前安装的所有locale。如果有你想要的 locale的名字,就表示已经安装了该locale。 Q. 我的系统没有安装中文locale,怎么办? A. 因为不同的系统,有不同的安装方法,我只能说一下我使用过的系统的安装。 因为locale在glibc-2.1以下的系统并没有被实现,所以glibc-2.1以下的系 统应该把升级系统的计划列在你的日程表中了。glibc-2.1本身不带有中文 locale,不过幸好各个linux distribution大多都带了中文locale,比如 Turbo就带了一个locale-zh-0.97-1.rpm的包,安装一下就可以了。对于别的 使用glibc-2.1,但又没有中文locale的linux distribution,比如 slackware-7.0,要安装中文locale办法还是有的,从别的系统里面偷来中文 locale的source,编译安装一下就可以了。Debian的potato里面有一个 zh-locale,就是中文locale包,用dselect或者apt-get来安装一下也就行了。 glibc-2.2已经把中文locale包含在里面,所以不需要特定安装中文locale包。 但是有些系统本身不生成这些locale,需要用户自己来生成。比如Debian的 woody,你就需要修改/etc/locale.gen文件,去掉中文的locale对应行的注 释,然后运行一下locale.gen就能产生中文locale。 Q. 我用的系统是基于glibc-2.1的,已经安装了zh_CN.GB2312的locale,为什么 还不能正常使用这个locale? A. 一个可能的原因是,你用的distribution没有告诉glibc该如何处理GB2312编 码,解决的方案是在/usr/lib/gconv-modules搜索GB2312的字样,如果没有 找到的话,就在该文档里面寻找"modules EUC-CN"字样,然后在这一行之前 加上如下一行 alias GB2312// EUC-CN// 保存之。这样你的系统差不多就应该支持zh_CN.GB2312这个locale了。 Q. 现在我能够确定我的系统已经安装并支持了中文locale了,但是如何判断我 是否已经设置好了locale环境? A. 运行一下locale命令,就可以看到现在的locale环境是什么。 Q. oh,运行了一下locale命令,出现一堆输出, LANG=C LC_CTYPE="zh_CN.GB2312" LC_NUMERIC="zh_CN.GB2312" LC_TIME="zh_CN.GB2312" LC_COLLATE="zh_CN.GB2312" LC_MONETARY="zh_CN.GB2312" LC_MESSAGES="zh_CN.GB2312" LC_ALL=zh_CN.GB2312 它们都是什么意思? A. 这些环境变量就是和你使用的语言环境相关的信息。LANG是语言环境,不过 这个变量的等级最低,改变别的环境变量可以使之失效。LC_CTYPE是表明字 符分类应该使用哪个locale的资料,正是一个locale最基本的要素,通常和 该locale使用的编码有关,要使用中文locale的话,一定要设置这个变量。 LC_NUMERIC,LC_TIME,LC_COLLATE,LC_MONETARY分别表示数字,时间,排 序和货币单位使用哪个locale的资料,LC_MESSAGE表示应该使用哪个locale 的信息作为输出,对于中文用户,如果你想看中文界面的话,最好还是设成 中文的。LC_ALL是表示上面所有的资料,只要设置了LC_ALL为某个特定的变 量,其它的会自动跟着变过来,如果没有什么很充分的理由,通常是设置 LC_ALL就够了,不用每个变量一一去设置。glib-2.2中还添加了几个变量, 比如LC_PAPER,LC_ADDRESS等,大体从名字可以猜出意思。 除了这几个环境变量之外,还有一个LANGUAGE的环境变量,设置它之后, LC_MESSAGES就失效了,LANGUAGE比LC_MESSAGES酷的是,你可以通过设置 LANGUAGE来使用多个locale,比如 export LANGUAGE=de:fr:en 这个在多语言的程序中可能有用,不过我从来没有使用过这个玩意。 |