TOC

语言代码

语言指包括语言的字符集以及有关的货币符号,日期格式等。为了区分不通的语言,人们设计了一些语言代码相关的标准来。

作为开发,只要涉及多语言,都一定会接触到语言代码。在各种不通的技术、语言框架中,这些代码并没有非常统一,比如简体中文,我见过 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 文件。

打开 国家标准目录 或者 国家标准检索 搜索 4880

语种名称代码:

常见语言代码

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

  1. Locale Name
  2. Locale ID, 又叫做 LCID (Language Code Identifier)。

因为历史原因,支持的格式有点复杂:

  • primaryLanguage[-Script][-SubLanguage[_sortorder]] 参考的是 IETF 的 Language Tag
  • "locale-name"
  • "language[_countryORregion[.CodePage]]"
  • ".CodePage"
  • "C"
  • ""
  • NULL

其中:

  1. primaryLanguage 主语言,对应 ISO 639-1 或 ISO 639-2/T 中的语言代码
  2. Script 书写系统代码,对应 ISO 15924 中的四字母代码(首字母大写)
  3. SubLanguage 子语言,对应 ISO 3166-1 中的地区代码
  4. sortorder 排序代码
  5. CodePage 编码代码,这个概念早于 Unicode 的出现,当时的软件系统为了区分不同编码格式而设计。

比如 zh-CN_stroke 表示中文,中国,按笔划顺序排序。

总结

就拿一开始举的例子说明:

注意:有些地方区大小写敏感,有些地方小写;有些地方是下划线,有些地方又是中划线。

参考资料与拓展阅读


  1. 除去 4 个特别代码和 520 个保留代码,23 个 B 类代码,可用编码数量
    - 4 个特别代码:
    - mis: uncoded languages 未编码语言
    - mul: multiple languages 多语种
    - und: undetermined language 未确定的语种
    - zxx: no linguistic content 没有语言内容
    - 520 个保留代码 (私人使用):qaa-qtz