语言指包括语言的字符集以及有关的货币符号,日期格式等。为了区分不通的语言,人们设计了一些语言代码相关的标准来。
作为开发,只要涉及多语言,都一定会接触到语言代码。在各种不通的技术、语言框架中,这些代码并没有非常统一,比如简体中文,我见过 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
有些地方称之为 BCP 47,实际包含两份 RFC:
- RFC 4647: Matching of Language Tags
- RFC 5646: Tags for Identifying Languages
-
language
- language-script
- language-region
- language-script-region
ISO 3166 国家代码:
| 国家或地区 | ISO 3166-1 alpha-2 | ISO 3166-1 alpha-3 |
|---|---|---|
| 中国 | CN | CHN |
| 中国香港 | HK | HKG |
| 中国澳门 | MO | MAC |
| 中国台湾 | TW | TWN |
| 日本 | JP | JPN |
| 韩国 | KR | KOR |
| 澳大利亚 | AU | AUS |
| 美国 | US | USA |
| 加拿大 | CA | CAN |
| 英国 | GB | GBR |
| 法国 | FR | FRA |
| 德国 | DE | DEU |
| 意大利 | IT | ITA |
| 俄罗斯 | RU | RUS |
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
# localectl list-locales | grep -E "zh|ch|cn|tw|hk"
zh_CN.UTF-8
zh_HK.UTF-8
zh_SG.UTF-8
zh_TW.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 表示中文,中国,按笔划顺序排序。
总结
就拿一开始举的例子说明:
zhISO 两字母语言代码zh_CNISO 两字母语言代码 + ISO 地区代码zh-HansISO 两字母语言代码 + ISO 书写系统代码chsChinese Simplified,好像没有出现在哪个标准中,可能就来自下面的zh-chszh_chs微软的产品和文档中可以看到,比如:
注意:有些地方区大小写敏感,有些地方小写;有些地方是下划线,有些地方又是中划线。
参考资料与拓展阅读
-
除去 4 个特别代码和 520 个保留代码,23 个 B 类代码,可用编码数量
- 4 个特别代码:
- mis: uncoded languages 未编码语言
- mul: multiple languages 多语种
- und: undetermined language 未确定的语种
- zxx: no linguistic content 没有语言内容
- 520 个保留代码 (私人使用):
qaa-qtz
- 4 个特别代码: