当前位置:Linux教程 - Linux - Q&A of I18N and L10N

Q&A of I18N and L10N



         ideal(2001-05-20 09:54)

    Copyright (C) 2001-2003 Marquis Weng <[email protected]>

    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
    这个在多语言的程序中可能有用,不过我从来没有使用过这个玩意。

    发布人:xtone 来自:LinuxAid.com.cn