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

    有些地方称之为 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 文件。

打开 国家标准目录 或者 国家标准检索 搜索 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

# 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

  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 表示中文,中国,按笔划顺序排序。

总结

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

  • zh ISO 两字母语言代码
  • zh_CN ISO 两字母语言代码 + ISO 地区代码
  • zh-Hans ISO 两字母语言代码 + ISO 书写系统代码
  • chs Chinese Simplified,好像没有出现在哪个标准中,可能就来自下面的 zh-chs
  • zh_chs 微软的产品和文档中可以看到,比如:

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

参考资料与拓展阅读


  1. 除去 4 个特别代码和 520 个保留代码,23 个 B 类代码,可用编码数量

    • 4 个特别代码:
      • mis: uncoded languages 未编码语言
      • mul: multiple languages 多语种
      • und: undetermined language 未确定的语种
      • zxx: no linguistic content 没有语言内容
    • 520 个保留代码 (私人使用):qaa-qtz

如果你有魔法,你可以看到一个评论框~