语言指包括语言的字符集以及有关的货币符号,日期格式等。为了区分不通的语言,人们设计了一些语言代码相关的标准来。
作为开发,只要涉及多语言,都一定会接触到语言代码。在各种不通的技术、语言框架中,这些代码并没有非常统一,比如简体中文,我见过 zh
, zh_CN
, zh-Hans
, chs
, zh_chs
几种不同的表示。
- HTTP Accept-Language 头(不区分大小写)。
- PHP
setlocale()
- Django i18n 语言设置,与 Accept-Language 一致。
- Linux locale 设置。
IETF
https://zh.wikipedia.org/wiki/IETF语言标签
- RFC 1766 对应 ISO 639-1 两字母语言代码
- RFC 3166 对应 ISO 3166 两字母地区代码(允许登记的标签携带 variant 或书写文字子标签)
- RFC 3066 对应 ISO 639-2 三字母语言代码
- RFC 4646: Tags for Identifying Languages
- ISO 15924 4 字母书写文字代码与
- UN M.49 的 3 数字地理分区码
- RFC 4647 语言代码匹配规则
-
RFC 5646 对应 ISO 639-3,ISO 639-5
-
language
- language-script
- language-region
- language-script-region
ISO 639
https://zh.wikipedia.org/wiki/ISO_639
https://zh.wikipedia.org/wiki/ISO_639-1
https://zh.wikipedia.org/wiki/ISO_639-2
https://zh.wikipedia.org/wiki/ISO_639-3
标准 | 副标题 | 代码数 |
---|---|---|
ISO 639-1 | Part 1: Alpha-2 code 2 字母代码 |
184 |
ISO 639-2 | Part 2: Alpha-3 code 3 字母代码 |
>450 |
ISO 639-3 | Part 3: Alpha-3 code for comprehensive coverage of languages 所有语言的 3 字母代码 |
>7700 |
ISO 639-4 | Part 4: Implementation guidelines and general principles for language coding 语言编码的实施指南和一般原则 |
|
ISO 639-5 | Part 5: Alpha-3 code for language families and groups 语系和语族的 3 字母代码 |
114 |
ISO 639-6 | Part 6: Alpha-4 representation for comprehensive coverage of language variants 所有语言变体的 4 字母代码 (废弃) |
>21,000 |
ISO 639-1 两字母方案最多只能有 26×26 = 676 个组合,还要考虑到和真实的语言名称对应关系,比如 zh 来自汉语拼音 zhongwen,实际上可用组合不多(居然也设计出了 184 种代码,真实令人惊讶)。这就是为什么后来又制定了 ISO 639-2 的原因。
ISO 639-2 三字母方案可以支持 26x26x26 = 17576 种语言1。又分成两种:
- ISO 639-2/B ,书籍目录使用 (bibliographic use)
- ISO 639-2/T ,技术专门使用 (terminological use)
部分语言在这两种标准中代码是不同的,比如中文在 639-2/B 中是 chi
, 在 639-2/T 中则是 zho
。其实好理解,639-2/B 是给美国图书馆用的,当然都按英语单词来定比较好。
ISO 639-3 继承的是 639-2/T,将语言拆分得更细,参考的是基督教背景的 SIL 国际 划分的民族语,比如中文,被分成了十几种语言。在我们的认知中官话、湘语、赣语、吴语、闽语、粤语、客家话都是汉语的方言,但是 SIL 认为他们不能相互沟通,是不同的语言,这就又很大的争议,无论是学术上,还是政治上。
标准的第 1 部分(ISO 639-1,两字母语言代码)是 1967 年制定,之后的部分(三字母语言代码)都是 2000 年前后才制定,太晚了。可能是这个原因,我好像都没有见过。也可能是我所面对的 I18N 场景还是太简单。
GB/T 4880
ISO 的官方文件都是要收费的,如果遇到不确定的地方,我们可以浏览与 ISO 639 对应的国家标准。令我惊讶的是,国标也没有提供在线阅读,原因是由于涉及 ISO 版权,可能是直接引用的 ISO 文件。
语种名称代码:
- 第 1 部分:2 字母代码 GB/T 4880.1-2005 (对应 ISO 639-1)
- 第 2 部分:3 字母代码 GB/T 4880.2-2000 (对应 ISO 639-2)
- 第 3 部分:所有语种的 3 字母代码 GB/T 4880.3-2009(对应 ISO 639-3)
常见语言代码
https://zh.wikipedia.org/wiki/ISO_639-1代码表
Lang | 639-1 | 639-2 | 639-3 |
---|---|---|---|
中文 Chinese | zh | zho (T) / chi (B) | zho+14 |
英语 English | en | eng | |
日语 Japanese | ja | jpn | |
韩语 Korean | ko | kor | |
法语 Franch | fr | fra (T) / fre (B) | fra |
德语 German | de | deu (T) / ger (B) | deu |
俄语 Russian | ru | rus | |
西班牙语 Spanish | es | spa | |
葡萄牙语 Portuguese | pt | por | |
阿拉伯语 Arabic | ar | ara | ara+30 |
世界语 Esperanto | eu | epo |
操作系统本地化设置
本地化设置又叫区域设置(locale)。
所以 Linux 和 Windows 的地区设置都只参考了 ISO 639-1。
Linux
Linux 上的本地化设置,可以使用 localectl list-locales
查看。
格式是:语言代码_地区代码.编码
, 比如:zh_CN.UTF-8
Windows
- Locale Name
- Locale ID, 又叫做 LCID (Language Code Identifier)。
因为历史原因,支持的格式有点复杂:
primaryLanguage[-Script][-SubLanguage[_sortorder]]
参考的是 IETF 的 Language Tag"locale-name"
"language[_countryORregion[.CodePage]]"
".CodePage"
"C"
""
NULL
其中:
- primaryLanguage 主语言,对应 ISO 639-1 或 ISO 639-2/T 中的语言代码
- Script 书写系统代码,对应 ISO 15924 中的四字母代码(首字母大写)
- SubLanguage 子语言,对应 ISO 3166-1 中的地区代码
- sortorder 排序代码
- CodePage 编码代码,这个概念早于 Unicode 的出现,当时的软件系统为了区分不同编码格式而设计。
比如 zh-CN_stroke
表示中文,中国,按笔划顺序排序。
总结
就拿一开始举的例子说明:
zh
ISO 的两字母语言代码zh_CN
语言代码 + 地区代码zh-Hans
语言代码 + 书写系统代码chs
Chinese Simplified,好像没有出现在哪个标准中,可能就来自下面的zh-chs
zh_chs
微软的产品和文档中可以看到,比如:
注意:有些地方区大小写敏感,有些地方小写;有些地方是下划线,有些地方又是中划线。
参考资料与拓展阅读
-
除去 4 个特别代码和 520 个保留代码,23 个 B 类代码,可用编码数量
- 4 个特别代码:
- mis: uncoded languages 未编码语言
- mul: multiple languages 多语种
- und: undetermined language 未确定的语种
- zxx: no linguistic content 没有语言内容
- 520 个保留代码 (私人使用):
qaa-qtz
- 4 个特别代码: