当前位置: 首页 > 科技观察

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

时间:2023-03-12 19:29:55 科技观察

前言最近加入了一个新的项目组,负责前端技术预研和选型,涉及到一个熟悉又陌生的需求——国际化&本地化变更。熟悉的是以前的项目玩过,奇怪的是以前的实现只是在“现有”阶段。趁着这个机会好好研究和组织,为后面的技术选型做??准备。本文将解释国际化和本地化的概念,以及其中一个非常重要的概念——语言标签(也称为语言代码或文化)。什么是国际化?我认为国际化是指应用程序支持多种语言和文化习俗(数字、货币、日期和字符比较算法等),而本地化是指应用程序可以识别用户的文化习俗并自动适配相应的语言和文化版。我以前认为国际化就是字符串的替换——比如“Hello!”取而代之的是“怎么了,伙计!”其实分为以下五个方面:1.字符串替换比如"Hello!"替换为“怎么了,伙计!”。2.数字表示法如1200.01,英文表示为1,200.01,法文为1200,01,德文为1.200,01.3。货币表示如人民币¥1,200.01,美元表示为$1,200.01,而英国欧元为1,200.01,德国欧元为1.200,01。注意:这里不包括汇率。1.日期的表达方式比如September15,2016,英文的表达方式是9/15/2016,法语是15/9/2016,德语是15.9.2016.2。字符比较算法在比较?和z时,在英语和德语中,?排在z之前,而在瑞典语中是z排在?之前。本地化的关键——既然LanguageTag需要自动适配用户的语言和文化版本,就一定要有识别依据吗?zh-CN和en等我想大家应该都不陌生,而它们正是我们所需要的!当我们使用已有的i18n库实现国际化/本地化时,我们必须编写如下文件{"en":{"name":"EnterName"},"zh-CN":{"name":"Entername"}但是除了en和zh-CN之外还有其他键吗?它们的组成规则是什么?让我们更深入地了解这些语言标签!语法注意以下使用ABNF语言描述(ABNF的语法请参考语法规范:BNF和ABNF)Language-Tag=langtag/privateuse/grandfatheredlangtag=language["-"script]["-"region]*("-"变体)*("-"extension)["-"privateuse]可以看到Language-Tag分为三个子类:langtag、privateuse和grandfundd。先来了解一下一般情况下用不到的两个吧!privateuse标签的含义不是由子标签注册表定义的,而是格式由使用中的团队自定义、维护和私下使用:privateuse="x"1*("-"(1*8alphanum))示例:x-zh-CN为privateuse,其含义不一定与语言zh-CN一致。注意:只能在小范围内使用,不得大面积使用。祖父是为了向后兼容。由于RFC4646之前的标签无法完全匹配当前注册表中标签的语法和含义,因此使用grandfathered来提供向后兼容性。定义:grandfathered=irregular/regularregular="en-GB-oed";不规则标签不匹配/"i-ami";the'longtag'productionand/"i-bnn";wouldnototherwisebe/"i-default";considered'well-formed';/"i-enochian";Thesetagsareallvalid,/"i-hak";butmostaredprecated/"i-klingon";infavorofmoremodern/"i-lux";subtagsorsubtag/"i-mingo"/"i-navajo"/"i-pwn"/"i-tao"/"i-tay"/"i-tsu"/"sgn-BE-FR"/"sgn-BE-NL"/"sgn-CH-DE"regular="art-lojban";thesetagsmatchthe'langtag'/"cel-gaulish";production,buttheirsubtags/"no-bok";arenotextendedlanguage/"no-nyn";orvariantsubtags:theirmeaning/"zh-guoyu";isdefinedbytheirregistration/"zh-hakka";andthesearedeprecated/;;"zh-min";infavorofmoremodern/"zh-min-nan";subtagsequenceofsubtags/"zh-xiang&qu哦;注意:几乎所有grandfarthered标签都可以被currentregistry标签及其组合替换(比如i-tao可以被tao替换),所以如果不出意外,请使用current标签。现在是我们的重头戏,langtag,首先我们来看langtag下的第一个子标签——language。Primarylanguagesubtag像en是Primarylanguage子标签,用来标识资源对应的语言。语法:language=2*3ALPAH["-"extlang]/4ALPHA/5*8ALPHAextlang=3ALPHA*2("-"3ALPHA)语言一共有三种形式,比较让我好奇的是第一个2*3ALPHA[“-”extlang]。这种形式的前面的2*3ALPHA称为macrolanguage,用来表示资源对应一种语言的摘要,具体的语言/方言由extlang指定。包含extlang部分的语言也称为包含语言。例如zh-cmn和zh-yue是包含语言,其中zh是宏语言,cmn和yue是extlang。这里有个很有意思的地方就是,我们认为普通话和粤语是中文的方言,但是西方人认为普通话和广东话根本就不是一种语言,所以像zh-cmn和zh-yue在规范中被设置为多余,建议直接用cmn和yue。但是由于历史原因,我们还是用zh-CN来表示cmn-CN。另外,可以作为宏语言的标签只有7个(ar、kok、ms、sw、uz、zh和sgn)和几个类似cmn的子标签如下:cmn普通话(普通话、普通话)wuuWu(江苏话、上海话))czh回族语(徽州话、兖州话、吴语-回族语片)hak客家粤语(广东话)nan福建话(福建话、台语)cpx莆仙话(莆田话、兴化话)cdo闽东语mnp闽北语zco闽中语ganGan语(江西话)hsn湘语(湖南话)cjy晋语(山西话、陕北话)注:一般都是小写Script子标签用于指定书写或书写系统的语言以及资源所属的方言等。语法:script=4ALPHA注意:一般首字母大写,后面的字母全部小写。Region子标签指定国家和地区对应的语言/方言文化。语法:region=2ALPHA/3DIGIT注意:一般情况下,全大写的Variant子标签用于指定其他子标签无法提供的附加信息语法:variant=5*8alphanum/(DIGIT3alphanum)例子:de-CH-1996其中1996是variantsubtag,整体意思是1996年开始在瑞士使用的德语的修改版。extensionsubtag为我们提供了一种机制来扩展langtag语法:extension=singleton1*("-"(2*8alphanum))singleton=DIGIT/%x41-57/%x59-5A/%x61-77/%x79-7A目前仅支持u作为sigleton的值。示例:de-DE-u-co-phonebk表示通过查看电话本进行内容排序等操作。关于language-tags的更多信息可以参考BCP47HowtochooseaLanguageTag硬着头皮看了那么多规范的内容,还是不知道怎么组合一个合适的language-tag:(其实,选择组合的原则只是保持language-tag足够短,以区别于当前语境中的其他language-tag。例1:下面普通话和粤语并存。嗯?”老人回答:“你在说什么,我听不懂。"

例2:下面是大陆人说英语,香港人说普通话,美国人说英语小陈说:"你好,你是哪里人?"李先生说:"你的英文和我的普通话一样普通,哈哈!"Simonsaid:"Hey,what'sup!"

现在引出另一个问题,即我们如何知道哪些值为每个子标签专门定义?详细信息在IANA语言子标签注册表中定义。如果你觉得搜索不方便,那就用LanguageSubtagLookup工具吧!另外,如果你不知道国家和地区使用的语言或方言,可以通过Ethnologue查看,直接点击地图上的区域可以获取对应的子标签信息。总结现在我们对国际化和本地化有了更全面的了解,对Languagetag也有了更深入的了解,是不是迫不及待地撸起袖子开始码字了?下篇敬请期待《JS魔法堂:不完全国际化&本地化手册 之 实战篇》尊重原创,转载请注明出处: http://www.cnblogs.com/fsjohn..^_^胖约翰