zoukankan      html  css  js  c++  java
  • 非单页的静态文件如何实现多语言切换

    .github实现地址:https://github.com/13476075014/04.node-vue-project/tree/master/03.singlewebpack/02.ejsHtml

    一:项目描述:

    是嵌套在app里面和web项目的一些静态公用页面,相互之前没有什么关联,通过地址栏来language来切换页面的语言

    二:实现原理:

    1.如何区分需要展示什么语言?

    通过地址栏的language参数的值来展示不同语言。

    2.通过单独的语言配置文件js来配置不同的语言,然后把多个文件的值都作为webpack设置的全局变量,在js中可以根据需要来展示不同的语言配置。

    3.通过 document.createDocumentFragment( ) 创建文档片段,来替换需要翻译的dom,然后都替换后,统一放入dom里面一起展示。

    4.在需要翻译的页面的元素上加上属性  data-lg='lg_downline_leaderboard',来指定需要翻译的值,例如前面那个属性需要翻译的是 _lg.downline.leaderboard

    三:具体代码实现:

    3.1.根目录下创建lang文件夹,里面新建 en.js 和 yd.js来配置英语和印地语对外暴露变量

    // en.js
    
    exports._lg = {
        name:"english", //语言名称
        common:{ //公用部分
            success:"Success",
            fail:"Fail",
        },
        index:{ //首页翻译配置
            title:"Home",
            。。。。。
        }
    }

    3.2.在webpack中配置翻译的全局变量

     。。。
    const en = require('./public/lang/en.js')
    const yd = require('./public/lang/yd.js')
    。。。
    
    plugins.push(new webpack.DefinePlugin({
            myconfig: JSON.stringify(myconfig.myconfig),
            _lg_en:JSON.stringify(en._lg), //英语
            _lg_yd:JSON.stringify(yd._lg) //印地语
        }))
    
    。。。

    3.3.在需要翻译的元素上面加上属性配置

    <p data-lg='lg_downline_myInvite'>My invite:<span class="parent_name"></span></p>

    3.4.在公用js中处理需要翻译的部分的公用方法

    function get_lg(){
        var query_lg =  _common.getQuery("language") || 'hindin';
        var _lgs= query_lg == "english" ? _lg_en : _lg_yd;
        return _lgs
    };
    
    
    
    
    
    export var _common = {
        _lg:{},
        initLang:function(node){ //在需要翻译的页面调用这个方法,传父元素,翻译里面的所有内容
            var query_lg =  _common.getQuery("language") || 'hindin'
            var _lg = _common._lg;
            if(query_lg == "english"){
                return false
            }
            var fragments = document.createDocumentFragment();
            var childs = ''
            while(childs=node.firstChild){
                fragments.appendChild(childs)
            }
            [].slice.call(fragments.childNodes).forEach(function(item){
                var nodeAttrs = item.attributes;
                if(item.nodeType == 1 && nodeAttrs && nodeAttrs['data-lg'] && nodeAttrs['data-lg'].value){ //只有dom元素类型且有data-lg属性的需要翻译
                    var attr = nodeAttrs['data-lg'].value
                    var attr_value = attr.split('_');
                    item.innerHTML = _lg[attr_value[1]][attr_value[2]]
                };
                if (item.childNodes && item.childNodes.length) {
                    _common.initLang(item);
                }
            });
            node.appendChild(fragments); //在真是元素里面插入文档片段,完成节点的替换翻译
        },
        getQuery(querystr){
            var search = _common.toTrim(location.search.substr(1))
            search = search.split('&')
            var hasIndex = search.findIndex((item,index) =>{
                return item.indexOf(querystr + '=') > -1
            })
            if(hasIndex > -1){
                return search[hasIndex].split('=')[1]
            }else{
                return ''
            }
        
        },
    .....
    }
    _common['_lg'] = get_lg(); //初始化翻译的语言的配置需要展示哪种
    
    // 在需要的页面调用方法
    // index.js
    $(function () {
        _common.initLang(document.querySelector("body"));
    ...
    })
  • 相关阅读:
    @@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的辨析
    Blue Jeans[poj3080]题解
    绿色通道题解
    后缀数组
    Power Strings[poj2406]题解
    KMP算法
    Life Forms[poj3294]题解
    STM32固件库文件编程结构思想的理解
    GPIO设置
    HTML_v2
  • 原文地址:https://www.cnblogs.com/chun321/p/12736976.html
Copyright © 2011-2022 走看看