JS魔法堂:不完全国际化&本地化手册 之 理论篇

媒介

 近来加入到新项目组担任前端手艺预研和选型,个中涉及到一个熟习又生疏的需求——国际化&当地化。熟习的是之前的项目也玩过,生疏的是之前的完成仅仅停留在”有”的阶段罢了。趁着这个时机好好学习整顿一下,为背面的手艺选型做准备。
 本篇将论述国际化和当地化的观点,以及个中一个很主要的观点——Language tag(也叫Language code 或 Culture)。

作甚国际化?

 国际化我认为就是运用支撑多言语和文明风俗(数字、钱银、日期和字符比较算法等),而当地化则是运用能辨认用户所属文明风俗自动适配至响应的言语文明版本。
 过去经常认为国际化就是字符串的替换——如”你好!”替换为”What’s up, man!”,实在详细是分为以下5方面:

  1. 字符串替换
     如"你好!"替换为"What's up, man!".

  2. 数字示意体式格局
     如1200.01,英语示意体式格局为1,200.01,而法语则为1 200,01,德语则为1.200,01.

  3. 钱银示意体式格局
     如人民币¥1,200.01,美圆示意体式格局为$1,200.01,而英语的欧元则为€1,200.01,德语的欧元则为1.200,01 €.

注重: 这里没有还没算上汇率呢.

  1. 日期示意体式格局
     如2016年9月15日,英语示意体式格局为9/15/2016, 而法语为15/9/2016, 德语为15.9.2016.

  2. 字符比较算法
     如äz比较时,英语、德语中均是ä排在z前面,而在瑞典语中则是z排在ä前面.

当地化的症结 —— Language Tag

 既然要自动适配至用户所属的言语文明版本,那末总得有个依据才辨认吧?我想人人应当对zh-CNen等不生疏吧,而它们恰是我们所需的依据了!在我们运用已有i18n库完成国际化/当地化时,必定会写下以下文档

{
  "en": { "name": "Enter Name" },
  "zh-CN": { "name": "输入姓名" }
}

 但除了enzh-CN另有其他键吗?它们的构成划定规矩又是怎样的呢?下面我们来轻微深切的相识这些Language Tag吧!

语法划定规矩

注重以下采纳ABNF言语形貌(ABNF的语法请参考语法范例:BNF与ABNF)

Language-Tag = langtag
             / privateuse
             / grandfathered

langtag = language
          ["-" script]
          ["-" region]
          *("-" variant)
          *("-" extension)
          ["-" privateuse]

能够看到Language-Tag分为langtagprivateusegrandfatherd三个子类,下面我们先相识平常状况用不上的两个吧!
privateuse
 标签的意义不由subtag registry定义,而是由运用的团队间擅自定义、保护和运用。
 花样:

privateuse = "x" 1*("-" (1*8alphanum))

示例:x-zh-CN是privateuse,其意义不一定与languagezh-CN一致。
注重: 只作为小集团内部用能够,决不能大范围实用。

grandfathered
 用于向后兼容。因为RFC 4646前的标签没法完整婚配当前registry的标签语法和意义,因而经由过程grandfathered来供应向后兼容的特征。
 语法:

grandfathered = irregular
              / regualr
irregular = "en-GB-oed"         ; irregular tags do not match
          / "i-ami"             ; the 'langtag' production and
          / "i-bnn"             ; would not otherwise be
          / "i-default"         ; considered 'well-formed'
          / "i-enochian"        ; These tags are all valid,
          / "i-hak"             ; but most are deprecated
          / "i-klingon"         ; in favor of more modern
          / "i-lux"             ; subtags or subtag
          / "i-mingo"  
          / "i-navajo"
          / "i-pwn"
          / "i-tao"
          / "i-tay"
          / "i-tsu"
          / "sgn-BE-FR"
          / "sgn-BE-NL"
          / "sgn-CH-DE"
regular = "art-lojban"        ; these tags match the 'langtag'
        / "cel-gaulish"       ; production, but their subtags
        / "no-bok"            ; are not extended language
        / "no-nyn"            ; or variant subtags: their meaning
        / "zh-guoyu"          ; is defined by their registration
        / "zh-hakka"          ; and all of these are deprecated
        / "zh-min"            ; in favor of a more modern
        / "zh-min-nan"        ; subtag or sequence of subtags
        / "zh-xiang"

注重: 险些一切grandfarthered标签均可被当前registry的标签及其组协作替换(像i-tao能够被tao替代),因而如无不测请运用现行的标签吧。

下面就到了我们的重头戏langtag了,起首我们看看langtag下的第一个subtag——language.

Primary language subtag

 像en这类就是Primary language subtag,用于标识资本所对应的言语。
 语法:

language = 2*3ALPAH
           ["-" extlang]
         / 4ALPHA
         / 5*8ALPHA
extlang = 3ALPHA
          *2("-" 3ALPHA)

看到language有三种情势,个中让我比较猎奇的是第一种2*3ALPHA ["-" extlang]。这类情势中前面的2*3ALPHA称为macrolanguage,用于标明资本对应一种言语的汇总,而详细的某一种言语/方言则经由过程extlang指定。而包括extlang部份的language也被称为encompassed language.
zh-cmnzh-yue就是encompassed language,个中zh是macrolanguage,而cmnyue则是extlang。
 这里有个很风趣的事变是,我们认为一般话和广东话等都是汉语的方言,但西方却认为一般话、广东话基础就不属于一种言语,因而像zh-cmnzh-yue在范例中被设置为redundant,发起直接运用cmnyue等。不过因为汗青缘由,我们照样运用zh-CN代表cmn-CN
 别的如今能够作为macrolanguage的就只有7个标签(ar,kok,ms,sw,uz,zhsgn)
 别的几个和cmn相似的subtags以下

cmn 一般话(官话、国语)
wuu 吴语(江浙话、上海话)
czh 徽语(徽州话、严州话、吴语-徽严片)
hak 客家语
yue 粤语(广东话)
nan 闽南语(福建话、台语)
cpx 莆仙话(莆田话、兴化语)
cdo 闽东语
mnp 闽北语
zco 闽中语
gan 赣语(江西话)
hsn 湘语(湖南话)
cjy 晋语(山西话、陕北话)

注重: 平常采纳全小写

Script subtag

 用于指定笔迹或笔墨系统资本所属的言语和方言等。
 语法:

script = 4ALPHA

注重: 平常采纳首字母大写,后续字母全小写

Region subtag

 指定与国度、地区对应的言语/方言文明。
 语法:

region = 2ALPHA
       / 3DIGIT

注重: 平常采纳全大写

Variant subtag

 指定其他subtag又没法供应的分外信息
 语法:

variant = 5*8alphanum
        / (DIGIT 3alphanum)

示例:de-CH-1996个中1996是variant subtag,团体意义是在Switzerland运用的自1996改进过的德语。

Extension subtag

 供应一种机制让我们去扩大langtag
 语法:

extension = singleton 1*("-" (2*8alphanum))
singleton = DIGIT
          / %x41-57
          / %x59-5A
          / %x61-77
          / %x79-7A

如今仅支撑u作为sigleton的值。
示例:de-DE-u-co-phonebk示意采纳电话本查对的体式格局对内容举行排序等操纵。

更多关于language-tag的信息请参考BCP 47

怎样挑选Language Tag

 硬着头皮啃下这么多范例的内容,但我还不晓得怎样组合适宜的language-tag呢:(实在挑选和组合的准绳就只有一条
在足以区分当前高低文中其他language-tag的前提下,坚持language-tag充足地短小精干
示例1:下文一般话、粤语并存

<p lang="cmn">
小述说:"老大爷,东方广场怎样走啊?"
老大爷回答道:"<span lang="yue">你讲咩也啊?我听唔明喔。</span>"
</p>

示例2:下文含大陆人讲英语、香港人讲一般话和美国人说英语

<p lang="cmn">
小述说:"<span lang="en-CN">Hi, where are you come from?</span>"
李先生说:"<span lang="cmn-HK">你的英文跟我的一般话一样一般啊,哈哈!</span>"
Simon说:"<span lang="en">Hey, what's up!</span>"
</p>

 那如今引出另一个题目,那就是我们怎样晓得各个subtag详细定义了哪些值呢?
详细都定义在IANA Language Subtag Registry中了。
如果以为查找起来照样不方便,那末就运用Language Subtag Lookup tool吧!
别的若不清晰列国各地区所运用的言语或方言时,可经由过程Ethnologue检察,直接点击地图上的地区即可猎取响应的subtag信息。

总结

 如今我们已对国际化和当地化有了更全面的明白,也对Language tag有了更深切的熟悉,如今是否是如饥似渴想挽起袖子撸代码呢?敬请期待下篇《JS魔法堂:不完整国际化&当地化手册 之 实战篇》
 尊敬原创,转载请说明来自: http://www.cnblogs.com/fsjohn… ^_^肥仔John

谢谢

网页头部的声明应当是用 lang=”zh” 照样 lang=”zh-cn”?
Language Subtag Registry
BCP 47
Language on the Web
Choosing a Language Tag
Language tags in HTML and XML

    原文作者:肥仔John
    原文地址: https://segmentfault.com/a/1190000007006835
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞