好极了!我们要开始实现一项很重要的功能,即注册语言包。通常情况下,使用者会希望以一个 JSON 的形式,批量将语言文本集合以 Key-Value 对的形式扔进来,Key 即用来作为索引的标识,而 Value 则为对应语言的文本内容。所支持的不同语言各需要一个对应的 JSON 数据,理论上里面应当包含相同的内容。当然,由于我们计划支持类似于继承的模型,以及事后更改的能力,所以关于所有 JSON 字段是否相同,并不需要严格遵循。那么,接下来,我们需要继续在 Local 类里面,去实现 regStrings 方法,代码如下。
Local.prototype.regStrings = function (lang, value) {
if (!lang) return;
var key = lang.toString().toLowerCase();
if (!value) {
delete this._strings[key];
return;
}
if (typeof value === "number"
|| typeof value === "string"
|| typeof value === "boolean"
|| typeof value === "function"
|| value instanceof Array) return;
this._strings[key] = value;
}
不过,本人感觉似乎不是很满意。有的时候,我们可能会调用该方法多次,哪怕是针对同一语言。这的确有可能发生,因为有的模块可能希望对该语言包进行批量扩充。因此,我们打算提供一套更好的方式,来满足这种需求。对此,我们还提供了一个额外的参数,来标明是否需要覆盖原先的设定,默认情况下为否,即只是扩充。
/**
* 注册一个语言包。
* @param lang 语言编号。
* @param value 语言包对象。
* @param override 可选。如果需要覆盖,则为 true;否则,为 false,此为默认值。
*/
Local.prototype.regStrings = function (lang, value, override) {
if (!lang) return;
var key = lang.toString().toLowerCase();
if (!value) {
delete this._strings[key];
return;
}
if (typeof value === "number"
|| typeof value === "string"
|| typeof value === "boolean"
|| typeof value === "function"
|| value instanceof Array) return;
if (override || !this._strings[key]) {
this._strings[key] = value;
} else {
var obj = this._strings[key];
for (var prop in value) {
obj[prop] = value[prop];
}
}
}
嗯,让我们来做一个测试吧。
// Create a Local instance.
var local = new Local();
// Set up an English language pack.
var lp_en = {
greetings: "Hello!",
goodbye: "Bye!"
};
local.regStrings("en", lp_en);
// Set up an Simplified Chinese language pack.
var lp_hans = {
greetings: "你好!",
goodbye: "再见!"
};
local.regStrings("zh-Hans", lp_hans);
local.regStrings("zh-CN", lp_hans);
local.regStrings("zh-SG", lp_hans);
现在,我们可以为一个组件注册多国语言包啦!
【未完待续】
文章类型及复杂度:Web 前端开发进阶。
节选翻译自 MSDN 博文 Localization in web page,内容有所调整。
http://blogs.msdn.com/b/kingcean/archive/2016/03/30/web-localization.aspx