Loacle 的一些笔记

locale lang

Posted by gomyck on November 15, 2022

不同地区对一些计算机词汇、日期显示等方面都有各自的习惯,比如中国大陆通常使用“文件系统”,而台湾或者香港地区则会用“檔案系統”,这显然不是简单的从简体到繁体的转换而已,所以可以想像,有一套系统在为各个地区的本地化服务。

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

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)。

而这些信息的配置通常放在/usr/share/i18n/locales目录下,让我们打开一下zh_CN和en_US,看看里面都定义了一些什么东西和有一些什么区别,对比一个比较简单的,LC_TIME有这样的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
zh_CN:

    day    "<U661F><U671F><U65E5>";/

    mon    "<U4E00><U6708>";"<U4E8C><U6708>";"<U4E09><U6708>";/

en_US:

    day    "<U0053><U0075><U006E><U0064><U0061><U0079>";/


    mon    "<U004A><U0061><U006E><U0075><U0061><U0072><U0079>";/

尖括号里的是 Unicode, day mon 其实就是日期的字典, zh_CN 就是 星期日, 星期一, 而 en_US 是: Sunday, Monday

如何设置locale

1
$ export LC_CTYPE=en_US.utf-8

LC_ALL、LANG和LC_*的关系

LC_ALL是全局设置, 优先级最高

LC_* 是对分类单独设置, 优先级中等

LANG 是默认设置, 优先级最低

-bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory

解决办法:

1
2
3
4
5
$ vi /etc/environment
LANG=en_US.utf-8
LC_ALL=en_US.utf-8

$ localedef -i en_US -f UTF-8 en_US.UTF-8