多语言开发需要了解的国家语种代码标准

4,407 阅读5分钟

介绍

在我们开发过程中; 或者在浏览网页过程中; 如果涉及到多语言; 我们会经常发现 cn

zh

zh-Hans

zh-cnzh-CN

各种方式五花八门简直令人目瞪狗呆; 他们之间到底有什么区别? 又有什么关系? 这一切的一切; 到底是人性的扭曲? 还是道德的沦丧? 作为开发者我们应该如何选择? 带着这些疑问我们走进今天的文章;

ISO 639

说到语种有几类标准; 首先说 ISO 639 系列; ISO 639 是国际标准组织为各语言定制的语言代码; 这个标准用两个字母表示一个语种; 比如说 zh 表示中文、 en 表示英语; zh 是 zhongwen 这个拼音的缩写; en 则是 english 这个单词的缩写; 但是我们知道字母也就 26 个; 平方一下两个字母最多也就能表示 676 个语种; 面对世界上几千个语种明显是不够用的; 于是两个字母的 ISO 639 的标准作为 ISO 639-1; 接着就又扩展一个三个字母的版本 ISO 639-2; 根据上面的经验我们可以直接蒙对中英文的语种代码 zhoeng; 这套标准对于大多数国家已经够用了; 然鹅制定这套标准的歪果仁明显是不了解中华文化的博大精深; 作为柴那人民我们知道中文可是分为简体中文和繁体中文的; 如果语种还有子类; 当我们需要具体到子类语种的时候; 这个标准明显是又不够我们用了; 我们就不再过多的去研究 ISO 639 的后续版本了;

ISO 639 代码列表

ISO 3166

上面的 ISO 639 规范的是语种代码; 但是我们知道英国和美国都是使用的英语; 如果我想具体表达某个国家地区呢? ISO 3166 规范就是定义国家和地区代码的; CN 是 China 的简称; TW 是 Taiwan, Province of China 的简称; US 是 United States of America 的简称; ISO 3166 标准还被广泛的应用于域名后缀; 中国的国家顶级域名就是 .cn ;

ISO 3166 代码列表

RFC 1766

有了 ISO 639 语种代码和 ISO 3166 国家地区代码; 我们组合起来就可以同时满足语种和国家的需求了; RFC 1766 标准就是一个组合方案; 它把 ISO 639ISO 3166 用 - 拼接来表示不同的国家和地区使用的语种; 比如说 zh-CN 表示中国大陆的中文; 那 zh-TW 则表示台湾地区使用的中文; 而 zh-HK 则表示香港地区使用的中文; 在 RFC 1766 标准下; 我们一般使用 zh-CN 表示简体中文; 而用 zh-TW 表示繁体中文; RFC 1766 还被广泛的用于 HTML 的 lang

<html lang="zh-CN" dir="ltr" class="no-js">
<html lang="zh-TW" dir="ltr" class="no-js">

RFC 1766 代码列表

RFC4646

上面 RFC 1766 方案已经可以让我们具体到语种和地区了; 但是又有很多时候我们并不是很关系地区; 而是比较关心子语种; 比如说我们可能只需要细化到中文简体和中文繁体就行了; 而并不打算具体到是香港地区使用的繁体还是台湾地区使用的繁体; 虽然 RFC 1766 中人们一般用 zh-TW 表示繁体; 已经满足区分简体中文和繁体中文的需求; 但是面向香港客户给一个 zh-TW 而不是 zh-HK 总还是让人略有不爽; 这时候我们需要一个能用来代表繁体中文又没有歧义的代码; 这就是接下来要讲的 RFC4646; 这里依然以中文为示例; 在 RFC4646 中代码第一部分同样是 ISO 639-1 的两位字母缩写 zh; 后面跟的是 Hans 和 Hant ; Han 汉语的意思; s 是 Simplified 简体; t 是 Traditional 繁体; zh-Hans 表示简体中文; zh-Hant 表示繁体中文; 如果想具体到地区; RFC4646 标准还可以再加第三部分 ISO 3166 国家代码; 比如说 zh-Hans-CN 表示大陆地区使用的简体中文; 比如说 zh-Hant-TW 表示台湾地区使用的繁体中文; 不过一般不用第三部分;

RFC4646 代码列表

总结

标准 简体中文 繁体中文
ISO 639-1 zh zh
ISO 3166 cn cn
RFC 1766 zh-CN zh-TW
RFC4646 zh-Hans zh-Hant

在开发过程中; 如果是想按国家划分可以使用 ISO 3166 标准; 如果是想按语种划分可以使用 ISO 639-1 标准; 如果是想具体到简体和繁体; RFC 1766RFC4646 两个标准都可以; 但是如果只是想表示语种而不想纠结地区; 那么显然 RFC4646 会更加合适;

转载 白俊瑶博客

本篇文章由一文多发平台ArtiPub自动发布