i18n 国际化的语言代码标准
秦灭六国统一中国,推行“书同文,车同轨”,标准化了文字。然而,在做多语言开发的时候,常常会看到这样的字眼: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 个字母:zho
、eng
。
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
。
只要满足需求,在系统内部统一。
就行。