最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求——国际化&本地化。熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已。趁着这个机会好好学习整理一下,为后面的技术选型做准备。
本篇将阐述国际化和本地化的概念,以及其中一个很重要的概念——Language tag(也叫Language code 或 Culture)。
国际化我认为就是应用支持多语言和文化习俗(数字、货币、日期和字符比较算法等),而本地化则是应用能识别用户所属文化习俗自动适配至相应的语言文化版本。
过去常常以为国际化就是字符串的替换——如"你好!"替换为"What's up, man!",其实具体是分为以下5方面:
"你好!"
替换为"What's up, man!"
. 数字表示方式1200.01
,英语表示方式为1,200.01
,而法语则为1 200,01
,德语则为1.200,01
. 货币表示方式¥1,200.01
,美元表示方式为$1,200.01
,而英语的欧元则为?1,200.01
,德语的欧元则为1.200,01 ?
.2016年9月15日
,英语表示方式为9/15/2016
, 而法语为15/9/2016
, 德语为15.9.2016
. 字符比较算法
如ä
和z
比较时,英语、德语中均是ä
排在z
前面,而在瑞典语中则是z
排在ä
前面.
既然要自动适配至用户所属的语言文化版本,那么总得有个根据才能识别吧?我想大家应该对zh-CN
和en
等不陌生吧,而它们正是我们所需的根据了!在我们使用已有i18n库实现国际化/本地化时,必定会写下以下文档
{ "en": { "name": "Enter Name" }, "zh-CN": { "name": "输入姓名" }}
但除了en
和zh-CN
还有其他键吗?它们的组成规则又是如何的呢?下面我们来稍微深入的了解这些Language Tag吧!
注意以下采用ABNF语言描述(ABNF的语法请参考语法规范:BNF与ABNF)
Language-Tag = langtag / privateuse / grandfatheredlangtag = language ["-" script] ["-" region] *("-" variant) *("-" extension) ["-" privateuse]
可以看到Language-Tag
分为langtag
,privateuse
和 grandfatherd
三个子类,下面我们先了解一般情况用不上的两个吧!
新闻热点
疑难解答
图片精选