前面两篇文章介绍了语言的设置和获取,以及语言包的加载与扩展。接下来,也是一个比较核心的东西,那就是如何去读取和设置某一具体的文本。
获取本地的某一文本,首先当然是要获取该语言包。因此,我们需要一些辅助方法,来先行做到这一点。(如果需要隐藏这些私有方法,大家可以自行解决,因为这不是本文的重点,故在此不再描述,本文主要是介绍其实现原理。)
Local.prototype._getStrings = function (lang) {
if (lang == null) lang = Local.lang();
if (!lang) {
return undefined;
}
return this._strings[lang.toString().toLowerCase()];
}
为了防止意外,在这个方法里,我们还需要提供一项功能,即,如果该语言包并不存在,我们需要返回一个空的 JSON 对象,而不是空或未定义。因此我们又将该方法修改成了如下所示。
Local.prototype._getStrings = function (lang, init) {
if (lang == null) lang = Local.lang();
if (!lang) return {};
lang = lang.toString().toLowerCase();
if (!this._strings[lang]) {
if (init == true) {
this._strings[lang] = {};
return this._strings[lang];
}
return {};
}
return this._strings[lang];
}
然后,我们可以实现 Local.specificString 成员方法,以来支持获取或设置某一特定语言的文本了。
/**
* 获取或设置某一特定语言的某一文本。
* @param lang 语言编号。
* @param key 文本对应的 Key。
* @param value 可选。设置文本值。
*/
Local.prototype.specificString = function (lang, key, value) {
if (arguments.length > 2) {
var strings = this._getStrings(lang, true);
strings[key] = value;
}
return this._getStrings(lang)[key];
}
另外,也可以提供一个直接获取本地语言的某一文本的方法。
/**
* 获取或设置某一本地文本。
* @param key 文本对应的 Key。
* @param value 可选。设置文本值。
*/
Local.prototype.localString = function (key, value) {
return arguments.length > 1 ? this.specificString(Local.lang(), key, value) : this.specificString(Local.lang(), key);
}
我们接着上一篇文章的测试示例,继续来看看现在的实现。
// Append to the previous test code.
// var local = new Local();
// ...
// Suppose current environment is in "en".
// "你好"
console.debug(local.localString("greetings"));
// "好不好呀?"
console.debug(local.localString("greetings", "好不好呀?"));
// "好不好呀?"
console.debug(local.localString("greetings"));
// undefined
console.debug(local.localString("what"));
// "什么?"
console.debug(local.localString("what", "什么?"));
// "什么?"
console.debug(local.localString("what"));
// "Hello!"
console.debug(local.specificString("greetings", "en"));
// "Hi!"
console.debug(local.specificString("greetings", "zh-Hans", "Hi!"));
不过,考虑到你当前的浏览器语言是 zh-Hans-cn 而不是 zh-Hans 或 zh-cn,那么,你或许会发现这并不能获得到你想要的文本,因为并没有类似于继承的功能在这其中实现。这可怎么办?敬请期待下一篇文章。
【未完待续】
文章类型及复杂度:Web 前端开发进阶。
节选翻译自 MSDN 博文 Localization in web page,内容有所调整。
http://blogs.msdn.com/b/kingcean/archive/2016/03/30/web-localization.aspx