本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh)
本文作者: 苏洋
创建时间: 2014年06月22日
统计字数: 2652字
阅读时间: 6分钟阅读
本文链接: https://soulteary.com/2014/06/22/simple-i18n.html
-----
# [JS]简单的i18N脚本
一个简单的i18N脚本,如果在单页面展示页面中你有切换语言的需求,那么可以尝试使用它。
如果有任何建议或者意见,欢迎反馈。
- GitHub仓库: [https://github.com/soulteary/simple-i18N](https://github.com/soulteary/simple-i18N)
- 在线DEMO: [http://soulteary.github.io/simple-i18N/](http://soulteary.github.io/simple-i18N/)
代码没几行,去掉注释的话...
```js
(function (cfg) {
"use strict";
/**
* @file: i18N.js
* @desc: 一个简单的i18N.js
* @author: [soulteary](soulteary@qq.com)
* @date: 2014.06.21
* @useage:
*
* --default HTML structure:
*
* 中文
* ...
*
*
*
* --default out side config:
*
* {"ver": "2014.06.21", "win": window, "doc": document, "api": "lang"}
*
*
* --default inner config:
*
* var config = {
* "version": cfg.ver, //版本号
* "key": "data-lang-", //DOM节点保存文本的命名空间前缀
* "tag": "data-lang", //保存到父节点上的当前语言标志
* "rule": { //语言规则
* "zh": "zh-CN",
* "en": "en-US"
* },
* "default": "zh" //默认语言
* };
*
*
* --default open api:
*
* window.lang('zh');
* window.lang('en');
*
*/
/**
* 缓存全局对象
*/
var win = cfg.win,
doc = cfg.doc;
/**
* 要进行翻译的对象
* @type {NodeList}
*/
var wrap = doc.getElementsByTagName('body')[0];
var elems = wrap.getElementsByTagName('*');
/**
* 声明全局配置
* @type {{version: string, key: string}}
*/
var config = {
"version": cfg.ver, //版本号
"key": "data-lang-", //DOM节点保存文本的命名空间前缀
"tag": "data-lang", //保存到父节点上的当前语言标志
"rule": { //语言规则
"zh": "zh-CN",
"en": "en-US"
},
"default": "zh" //默认语言
};
/**
* 获取默认的i18N设置
* @param short
* @returns {string}
*/
var getLang = function (short) {
var sets = doc.cookie;
if (sets) {
return short ? (JSON.parse(sets)).lang : config.rule[(JSON.parse(sets)).lang];
} else {
return short ? config.default : config.rule[config.default];
}
};
/**
* 初始化页面的hash
* 优先从cookie中获取,如果获取不到,那么使用默认配置
*/
win.location.hash = "#!/" + getLang();
/**
* 切换页面语言
* @param input
* @returns {boolean}
*/
var switchLang = function (input) {
if (!input) {
return false;
}
try {
for (var lang in config.rule) {
//如果请求切换语言存在于配置中,并且要切换的语言不是当前语言
if (input === lang && getLang() !== config.rule[lang]) {
//切换翻译
translate(lang);
//更新uri hash
win.location.hash = "#!/" + config.rule[lang];
//更新cookie
doc.cookie = '{"lang":"' + lang + '"}';
break;
}
}
return true;
} catch (e) {
return false;
}
};
/**
* 翻译所有元素
* @returns {boolean}
*/
var translate = function (to) {
var toLang = config.key + to,
curLang = config.key + (wrap.hasAttribute(config.tag) ? wrap.getAttribute(config.tag) : config.default);
/**
* 目标语言不相等的时候进行翻译
*/
if (toLang === curLang) {
return false;
}
/**
* 翻译每一个元素
* @param elem
* @returns {boolean}
*/
var trans = function (elem) {
var toText;
try {
if (elem.hasAttribute(toLang)) {
toText = elem.getAttribute(toLang);
elem.setAttribute(curLang, elem.innerHTML);
elem.innerHTML = toText;
}
return true;
} catch (e) {
return false;
}
};
/**
* translate each element.
*/
try {
for (var i = 0, j = elems.length; i < j; i++) {
trans(elems[i]);
}
//更新当前语言到wrap dom
wrap.setAttribute(config.tag, to);
return true;
} catch (e) {
return false;
}
};
/**
* 公开函数到全局
*/
window[cfg.api] = switchLang;
if (getLang() !== config.default) {
translate(getLang(true))
}
})({"ver": "2014.06.21", "win": window, "doc": document, "api": "lang"});
```