需求目标

html页面中实现国际化

思路

1.确定需要改变内容的dom节点
2.定义国际化json文件
3.通过innerText赋值改变节点内容

部分html

<body>
    <div i18n="a">姓名</div>
    <div>
        <span i18n="b">班级</span>
    </div>
    <div i18n="c">成绩</div>

    <select name="" id="select">
        <option value="en">en</option>
        <option value="cn">cn</option>
    </select>
</body>

实现方法

1.先给dom中需要动态切换的文本设置自定义属性i18n="属性值"(这里的属性值对应json文件中的键值)
2.获取json文件(这里采用的是原生ajax的方式获取)
  var i18n = 'cn';
  var lang = {};
  var xhr = new XMLHttpRequest();
  xhr.onreadystatechange = function() {
        if (xhr.readyState === 4 && xhr.status == 200) {
            let response = xhr.responseText;
            lang = JSON.parse(response);
            //遍历获取dom设置值
            getI18nDom(document.body);
        }
    };
    xhr.open('get', './index.json');
    xhr.send();
3.遍历dom找出需要设置国际化的dom节点,设置值
function getI18n(key) {
        return lang[i18n][key] || '';
    }
function getI18nDom(el) {
        if (el.childElementCount == 0) {
            if (el.getAttribute('i18n')) {
                el.innerText = getI18n(el.getAttribute('i18n'));
            }
        } else {
            [].forEach.call(el.children, (item) => {
                getI18nDom(item);
            });
        }
    }
4.通过监听select的change事件改变
 document.getElementById('select').onchange = function(val) {
        i18n = val.target.value;
        getI18nDom(body);
    };
    

JSON文件

{
"en": { "a": "name", "b": "class", "c": "score", "en": "English", "cn": "Chinese" },
"cn": { "a": "姓名", "b": "班级", "c": "成绩", "en": "英语", "cn": "中文" }
}

white
1 声望0 粉丝