淘先锋技术网

首页 1 2 3 4 5 6 7

http://www.netadmin.com.cn/kt_article_show.php?article_id=13205&categ_code=10071001

在 UNIX 的世界中,形成了「程序国际化」与「数据本土化」的标准,程序代码只要写过一遍,就可以适用于所有的语文与编码系统,只要系统有支持该语文与编码系统所需的「本土数据」即可。即采取的概念就是「程序」与「数据」分离并分开维护的方式。

「程序国际化」简称 I18N,其意为 InternationalizatioN 一字中头尾字母 "I" 与"N" 中间夹 18 个英文字母,故名。它是在系统底层的函式库 (即 libc 函式库) 中实作一组标准的函式接口,可以让程序存取该地区语系的种种信息。有了这些信息,程序本身不仅可以不需要修改,就足以处理各国的语文,同时程序本身甚至连各地区语文的各项细节 (如编码方式 .... 等) 都不需要知道,因为这些全部都是由系统函式库提供的。

「资料本土化」简称 L10N,其意为 LocalizatioN 一字中头尾字母 "L" 与 "N" 中间夹 10 个英文字母,故名。它是将地区语文的各项细节数据分门别类,安装在系统底层的数据库中,以便让系统函式库存取,以提供给上头的应用程序使用。这些用来描述各地区语文的数据,我们称之为「地区环境数据库 (locale)」,或简称「地区环境」它们包括以下的类别 (categories):

1. LC_COLLATE: 该地区文字排序规则,以及正规化表示式 (regular expression)的比对依据。

2. LC_CTYPE: 该地区所使用的编码系统、字集、与文字分类、转换等信息。

3. LC_MESSAGES: 各应用程序区域化的讯息显示。

4. LC_MONETARY: 该地区所通行的货币格式。

5. LC_NUMERIC: 该地区所通行的数字表示格式。

6. LC_TIME: 该地区所通行的时间、日期表示格式。

· 对于同一个地区语文而言,除了 LC_MESSAGES 之外,其它所有的类别都是固定的,故这些类别的数据就只需准备一份即可,它们是由系统底层函式库直接提供,可以让所有的应用程序分享。至于 LC_MESSAGES 讯息显示的部分,由于各应用程序的讯息都不同,故这部分的数据是由应用程序自身提供,而不像其它类别一样由系统函式库提供。

·在这些类别中,决定一个程序是否在该地区已「本土」化的最重要因素,一是 LC_CTYPE,二是 LC_MESSAGES。前者赋与程序处理该地区文字的能力,后者赋与程序用该地区的语文来显示的能力。

· 在实际中,将程序所有的讯息集中放在一个文件档中,而该文件文件的讯息开始时只会用程序原作者惯用的语言来表示。如果希望该程序也能显示其它语文的讯息时,我们只需要去做翻译的工作即可,而不必真的去修改程序代码本身。因此,讯息翻译与程序维护可以分头进行,翻译的工作不需要由程序原作者、或有经验的程式设计师来做,只需他熟悉该语文,并对该程序有一定的熟悉度即可。故基本上,任何人都可以参与翻译的工作。当程序编译安装完成后,已翻译成各国语文的讯息文件也会一并安装入系统的区域化数据库中。当程序启动,需要做讯息显示时,它会呼叫系统提供的函式介面,依目前的语系设定来正确抓取该语文的讯息并显示出来。万一目前的语系设定找不到相对应的讯息翻译文件时,则程序会自动以其原始的语系来显示。

地区环境数据库名称和语系设定

各地区所属的地区环境数据库名称格式如下:

_[.]

其中 [.] 有时候会省略。以我们台湾地区所使用的为例:

zh_CN.UTF-8其意即为「中文语系」(zh)「中国」(CN)「使用UTF-8编码系统」。如果将后头的 [.] 省略掉,就是这个样子

zh_CN

·如果我们不特别做语系的设定,则程序在启动时,会以系统预设的语系来运作,一般而言其地区环境数据库名就是 "C" 或 "POSIX",也就是原始 C 语言所采用的编码系统 (ASCII) 与英文讯息等等。如果希望改变程序运作的语系,则我们必须在程序启动前先做好环境语系的设定,也就是设好各类别的环境变量。例如:

LC_CTYPE=zh_CN.UTF-8; export LC_CTYPE

LC_MESSAGES=zh_CN.UTF-8; export LC_MESSAGES

·假如希望程序可以处理 EUC-TW 的文字,但仍以 Big5 中文显示讯息时,就这样设定:

LC_CTYPE=zh_TW.euctw; export LC_CTYPE

LC_MESSAGES=zh_TW.Big5; export LC_MESSAGES

· 在多数情况下,通常会希望一口气将所有的类别设定成相同的语系,也就是让我们的整体环境全部处于同一个语系下。当然我们可以用上述的方式一个个类别分别设定,但除此之外系统还提供了另外两个环境变量,以方便我们的作业。一是 LANG,另一个是 LC_ALL。例如我们这样设:

LC_ALL=zh_CN.UTF-8; export LC_ALL

其效果就完全等价于将所有的类别全部设定了。而 LANG 的用法也是一样,所达到的效果也类似,但意义稍有不同,这里要留意优先级的差别。一般系统对这些环境变数的优先级是:LC_ALL > LC_* > LANG·也就是说,任何一个 LC_ 类的变量设定后,会使 LANG 的设定的相对应类别失效。如果我们完全不设任何的 LC_ 类的环境变量,只单单这么设

LANG=zh_CN.UTF-8; export LANG

则所有的类别都会以 LANG 的设定来运作,除非我们特别去设了某个 LC_ 的环境变数,如此这个类别就会以新的设定来运作 (但其它的类别不变)。相似的道理,如果我们设了 LC_ALL 的环境变量,则所有的类别设定,包括 LANG 的设定全部会失效,而改以 LC_ALL 的设定来运作。