Ubuntu国际化与本土化

因为最近在译言网翻译了点东西,就想着为Ubuntu的汉化做点贡献,就到irc(frenode上的#ubuntu-cn-translators)上寻求相关帮助,haapyaron说想做贡献的话最好到上游,翻译上游项目,于是就想为gnome做点什么。

上面的话纯属闲扯,不过它是写这篇文章的原因。

说到翻译就要说到国际化(i18n)与本地化(l10)的概念:

  • i18n:国际化,是 internationalization 的缩写,来源于该词的首字母 i 与末字母 n 之间有18个其他字母。国际化主要指的是软件是否能支持多国语言和在多国语言下的表现。比如说某些软件存在不能翻译的字符串或者原文错误、在特定的语言下存在与该语言相关的功能障碍等均属于 i18n 即国际化问题。
  • l10n:本地化,是 localization 的缩写,类似 i18n,l10n 来源于首字母 l 与末字母 n 之间有10个其他字母。本地化多指软件在某一语言上的表现。比如软件的界面和文档翻译就是 l10n 的主要内如,因而存在翻译错误、翻译质量问题或者是翻译程度不佳,都应算作 l10n 即本地化问题。
  • m17n:多语言化,是 multilingualization 的缩写。因为其内容基本被 i18n 和 l10n 覆盖,所以现在已经很少使用,在 ibus-m17n 等软件包名称中可以见到。

以上解释来自ubuntu中方wiki

locale与国际化、本地化密切相关,通过设定locale,你可以自定义你的系统的语言环境。
locale这个单词中文翻译成地区或者地域,其实这个单词包含的意义要宽泛很多。Locale是根据计 算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。

在终端输入locale,就会看到相关的设置:

[bash]
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
[/bash]

这是什么意思呢?
locale把按照所涉及到的文化传统的各个方面分成12个大类,这12个大类分别是:

1、语言符号及其分类(LC_CTYPE)
2、数字(LC_NUMERIC)
3、比较和排序习惯(LC_COLLATE)
4、时间显示格式(LC_TIME)
5、货币单位(LC_MONETARY)
6、信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES)
7、姓名书写方式(LC_NAME)
8、地址书写方式(LC_ADDRESS)
9、电话号码书写方式(LC_TELEPHONE)
10、度量衡表达方式 (LC_MEASUREMENT)
11、默认纸张尺寸大小(LC_PAPER)
12、对locale自身包含信息的概述(LC_IDENTIFICATION)。

ubuntu 官方文档给出的解释是这样的:

Variable

What it’s for

LANG

The basic language setting used by applications on the system, unless overridden by one of the other locale environment variables

LC_CTYPE

The character set used to display and input text

LC_NUMERIC

How non-monetary numeric values are formatted on screen

LC_TIME

How date and time values are formatted

LC_COLLATE

How to sort various information items (e.g. defines the order of the alphabet so items can be ordered alphabetically by the sort command)

LC_MONETARY

How monetary numeric values are formatted

LC_MESSAGES

Which language is to display messages to the end user

LC_PAPER

Definitions of paper formats and standards

LC_NAME

How names are formatted

LC_ADDRESS

How to display address information

LC_TELEPHONE

How telephone numbers are structured

LC_MEASUREMENT

What units of measurement are used

LC_IDENTIFICATION

LC_ALL

This variable serves as a powerful override over all the other locale environment variables. When its value is set, applications use that value to determine which locale settings to use regardless of the values of the other variables

一个地区的locale就是根据这几大类的习惯定义的,这些locale定 义文件放在/usr/share/i18n/locales目录下面。
完全的locale表达方式是 [语言[_地域][.字符集] [@修正值]

  1. zh_CN.GB2312=中文_中华人民共和国+国标2312字符集。
  2. zh_CN.GB18030=中文_中华人民共和国+国标18030字符集。
  3. en_GB.ISO-8859-1=英文_大不列颠.ISO-8859-1字符集
  4. de_DE.UTF-8@euro=德语_德国.UTF-8字符集@按照欧洲习惯加以修正,注意不是de_DE@euro.UTF-8

其中,与中文输入关系最密切的就是 LC_CTYPE,LC_CTYPE规定了系统内有效的字符以及这些字符的分类,诸如什么是大写字母,小写字母,大小写转换,标点符号、可 打印字符和其他的字符属性等方面。而locale定 义zh_CN中最最重要的一项就是定义了汉字(Class“hanzi”)这一个大类,当然也是用Unicode描述的,这就让中文字符在Linux系统 中成为合法的有效字符,而且不论它们是用什么字符集编码的。

怎样设定locale呢?

设定locale就是设定12大类的locale分类属性,即12个LC_*。除了这12个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG。它们之间有一个优先级的关系:LC_ALL > LC_* >LANG。可以这么说,LC_ALL是最上级设定或者 强制设定,而LANG是默认设定值。

1、如果你设定了LC_ALL=zh_CN.UTF-8,那么不管LC_*和LANG设定成什么值,它们都会被强制服从LC_ALL的设定,成为 zh_CN.UTF-8。

2、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_*=en_US.UTF-8,并且没有设定LC_ALL的话,那么系统的locale 设定以LC_*=en_US.UTF-8。

3、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_*,和LC_ALL均未设定的话,系统会将LC_*设定成默认值,也就是LANG的值 zh_CN.UTF-8。

4、假如你设定了LANG=zh_CN.UTF-8,而其他的LC_CTYPE=en_US.UTF-8,其他的LC_*,和LC_ALL均未设定的话, 那么系统的locale设定将是:LC_CTYPE=en_US.UTF-8,其余的 LC_COLLATE,LC_MESSAGES等等均会采用默认值,也就是 LANG的值,也就是LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=zh_CN.UTF-8。

所以,locale是这样设定的:

1、如果你需要一个纯中文的系统的话,设定LC_ALL= zh_CN.XXXX,或者LANG=zh_CN.XXXX都可以,当然你可以两个都设定,但正如上面所讲,LC_ALL的值将覆盖所有其 他的locale设定,不要作无用功。

2、如果你只想要一个可以输入中文的环境,而保持菜单、标题,系统信息等等为英文界面,那 么只需要设定 LC_CTYPE=zh_CN.XXXX,LANG=en_US.XXXX就可以了。这样 LC_CTYPE=zh_CN.XXXX,而LC_COLLATE=LC_MESSAGES=……= LC_PAPER=LANG=en_US.XXXX。

3、假如你高兴的话,可以把12个LC_*一一设定成你需要的值,打造一个古灵精怪的系统: LC_CTYPE=zh_CN.GBK/GBK(使用中文编码内码GBK字符集); LC_NUMERIC=en_GB.ISO-8859-1(使用大不列颠的数字系统) LC_MEASUREMEN=de_DE@euro.ISO-8859-15(德国的度量衡使用ISO-8859-15字符集) 罗马的地址书写方式,美国的纸张设定……。估计没人这么干吧。

4、假如你什么也不做的话,也就是LC_ALL,LANG和LC_*均不指定特定值的话,系统将采用 POSIX作为lcoale,也就是C locale。

另外LANG和LANGUAGE有什么区别呢?

LANG – Specifies the default locale for all unset locale variables
LANGUAGE – Most programs use this for the language of its interface
LANGUAGE是设置应用程序的界面语言。而LANG是优先级很低的一个变量,它指定所有与locale有关的变量的默认值。
LANGUAGE一般设置为zh_CN:zh或者en_US:en

如果你像我一样用的是英文环境,突然想看一下某个程序的中文界面怎么办呢,很简单,在shell下

[bash]
export LANGUAGE="zh_CN:zh" LANG="zh_CN.UTF-8"
[/bash]

参考:
locale的设定及其LANG、LC_ALL、LANGUAGE环境变量的区别
Environment Variables – Community Ubuntu Documentation
LANG,LC_ALL,local详解
关于locale的设定,为什么要设定locale

4 thoughts on “Ubuntu国际化与本土化

  1. Pingback: 字符编码 | GNU/Linux | 山羊博客

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>