MS-L20N 的目的是,为 avalon mvvm 框架提供一致化的国际化机制,构建最适合 avalon 的国际化能力。基于 l20n 1.0.4 版本。MS-L20N 版本号对应 l20n 的版本号,可以通过 avalon.l20nversion
获取到。
国际化是一个麻烦的问题,需要精心设计。国际化不仅仅是翻译的问题,还需要考虑语言/地区/文化的差异。例如:数字呈现,0、1、大于 1 的数字。大于 1 的数字什么情况是少数?什么情况是多数?这些判断标准都有差异。即很多国际化内容呈现需要根据当前值才能确定
语言 | 0 | 1 | 少数 | 多数 |
---|---|---|---|---|
中文 | 没有 | 1 个 | 很少 | 很多 |
英文 | no objects | one object | 10 objects | 10 objects |
波兰 | brak obiektów | jeden obiekt | obiekty | obiektów |
还需要考虑现在多类别屏幕,电脑屏幕、平板屏幕、手机屏幕等,这些屏幕可呈现区域大小不同,呈现内容如何自动适应?例如手机屏幕很小,呈现内容就不可能像电脑屏幕的呈现。
同时对于开发人员,不可能是一个语言学家,在开发时没法确定这些内容如何才能最好的国际化呈现,而只有UI设计人员和翻译人员才能确定。
mozilla l20n很好解决了这些问题,具有很强大和非常灵活的国际化能力,因此基于 l20n 内核将一流的国际化能力引入到 avalon 生态圈中
使用非常简单,只要定义属性 ms-l20n,值等于国际化 key。例如:
<p ms-l20n="Attribute"></p>
国际化文件定义,首先定义manifest文件。例如 l20n.json:
{ "locales": [ "zh-CN", "en-US", "pl" ], "default_locale": "zh-CN", "resources": [ "./{{locale}}.l20n" ] }
其次定义各语言的国际化文件,具体格式请参见mozilla l20n 格式说明。
国际化中....
以前面数字呈现为例。国际化 key objectsWithCount,有一个外部参数objectsNum,当改变input数字内容将赋值给 objectsNum,此时可以看到随着数字变化,呈现内容也在变化。可以切换不同语言看效果。
国际化中....
ms-l20n 引用的国际化 key,支持avalon 插值表达式和过滤器。当改变input输入框中关联的 vm.l20nI18nId 值,例如从 setObjectsNumber 改为 Attribute(setObjectsNumber 和 Attribute 都是国际化 key,在l20n中有定义),可以看到前面国际化内容也响应切换了。
国际化中....
ms-l20n 也支持叠加节点。叠加节点是指在国际化内容中,可以使用html元素进行占位,例如input等。在国际化时,会用ms-l20n的相同子元素进行替换。这样可以按照各语言特性进行特殊布局。
我们也可以在vm定义以L20nAuto注意区分大小写为结尾的属性,这些属性的值来源于国际化内容,国际化key等于属性名去掉结尾L20nAuto后的值。目前存在一个约束,参见
附录一:MS-L20N 约束
{{AttributeL20nAuto}}
可以在运行期间切换语言。提供了一个函数changeLocale(newLocale, vmid)绑定在avalon上,函数的第二个参数可选。如果未指定vmid,则扫描所有vm。如果指定了vmid,则只在该vm范围内切换国际化。
国际化内容是以vm来确定范围的。如果不需要分区域国际化,可以在HTML元素上绑定一个根vm,也可以在特定vm上进行绑定。
需要注意:如果希望限定在某vm而不是溯源到上面vm,则需要在vm中定义一个名为l20n注意全小写的属性l20n: {}
,并且设定为非监控属性$skipArray: ["l20n"]
,详见例8:定制配置
navigator.language || navigator.browserLanguage
。'locales/l20n.json'
。例如前面的例子,文件是在locales/l20n.json
currentLocale
属性,则会自动赋值当前locale
,并且会自动在切换语言时自动切换l20n: {}
,并且设定为非监控属性$skipArray: ["l20n"]
时,该 VM 范围内的国际化都将绑定到该 VM。l20n属性有两个参数可配,都是可选。l20n: { initLocale: 'pl', //页面初始打开时默认语言,未设置则为浏览器当前语言 manifestResource: "locales/l20n.json", //manifest 文件所在位置 },
modules/locales/l20n.json
avalon.js
中可以自定义插值分隔符,但值并未公开,外部无法获取访问到。avalon.scan()
之后调用avalon.localize()
,也可以只扫描某个vm,需要带上参数vmid。MS-L20N 基于 Apache License 2.0 开源,使用代码只需说明来源,或者引用 LICENSE 即可。