秦灭六国统一中国,推行“书同文,车同轨”,标准化了文字。然而,在做多语言开发的时候,常常会看到这样的字眼:zh cn zh-CN zh-hans

同样是中文,却搞出这么多种表示方法。

非常的不讲道理,也没有一丝人性。

如果做过多语言需求,你肯定想过到底用哪种才显得比较专业?

ISO 639

互联网世界是用各种各样的标准和协议作为粘合剂组成的。

Javascript 脚本之所以能运行在不同的浏览器,是因为各大浏览器都遵循 ECMA 标准。

全球互联网之所以能成为现实,是因为所有计算机底层都遵循 OSI 模型,其中使用到的各种协议你肯定耳熟能详,如著名八股文 TCP 协议。

语言代码也不例外,ISO 639 就是为各语言所制定语言代码标准,它定义了 zh 代表中文。这种定义方法叫做 Alpha-2 Code,顾名思义,两个字母表示的代码,它可以表示世界上主要的语言。

比如:中文的拼音是 zhongwen,那代码就是 zh。美国的英文是 english,那代码就是 en

然而,世界上的语言有数千种,Alpha-2 表示法只能表示 26 x 26 = 676 种,是远远不够的,因此产生了 Alpha-3 Code,顾名思义,三个字母表示的代码,可以表示 17576 种语言。它的一般表示方法你可能已经猜到了,就是取前 3 个字母:zhoeng

ISO 3166

中文可以分为简体中文和繁体中文,ISO 639 明显不够用了。

于是出现了用国家或地区的代码来表示语言的方法,使用的标准是 ISO 3166。

该标准包括了针对国家、地区、和具有特殊科学价值的地点,以及其子行政区名称的国际标准代码。

cn 就来自这个标准,除此之外,hk 表示香港,us 表示美国。

这样就可以用 cn 来表示简体中文偏好,hk 表示繁体中文偏好,以各国家和地区的使用习惯来分。

IETF 语言标签

美国和英国使用的都是英文,怎么样才能既表示国家地区又表示偏好语言呢?

把 ISO 639 的 Alpha-2 和 ISO 3166 用 - 结合起来,IETF 语言标签的最早版本 RFC 1766 应运而生。

zh-CN 表示中国大陆的中文,zh-HK 表示香港地区的中文。

en-US 表示美国的英文,en-GB 表示英国的英文。

RFC 4646 是 RFC 1766 的升级版,它规范了主体,使用 zh-Hans 表示简体中文,zh-Hant 表示繁体中文。

如果想精确到地区,则可以 zh-Hant-HK 表示香港地区的繁体中文,zh-Hant-TW 表示台湾地区的繁体中文。

总结

不同需求用不同的标准。

如果只要求中英文版本的话,zh + en 足够。

如果要求支持英繁简,则可以 en + zh-Hans + zh-Hant ,也可以 en + zh-CN + zh-HK

只要满足需求,在系统内部统一。

就行。