美文网首页
JSP项目国际化解决方案

JSP项目国际化解决方案

作者: starcheng | 来源:发表于2019-10-31 16:54 被阅读0次

    背景介绍

    现有项目已上线运营6年了,在项目搭建初期也没有预留国际化处理的相关插口,现在进行国际化处理,由于JSP和JS 文件太多,于是考虑脚本批量处理。

    处理方案

    1. 解决思路:
      指定文件夹遍历,获取文件,按行读取,把中文截取出来,并替换为对应的key值,生成Excel文件,后续补充Excel文档即可。
    2. 具体代码实现
            //文件遍历方法
            function fileDisplay(filePath){
                //根据文件路径读取文件,返回文件列表
                fs.readdir(filePath,function(err,files){
                    if(err){
                        console.warn(err)
                    }else{
                        //遍历读取到的文件列表
                        files.forEach(function(filename){
                            //获取当前文件的绝对路径
                            var filedir = path.join(filePath,filename);
                            //根据文件路径获取文件信息,返回一个fs.Stats对象
                            fs.stat(filedir,function(eror,stats){
                                if(eror){
                                    console.error('获取文件:'+filename+',状态:'+stats+';失败');
                                }else{
                                    var isFile = stats.isFile();//是文件
                                    var isDir = stats.isDirectory();//是文件夹
                                    if(isFile){
                                        //if(/title_201711/.test(filename)) {
                                            var fRead = fs.createReadStream(filedir);
                                            var fWrite = fs.createWriteStream('./source/' +filename+ '.xlsx');
                                            var fsJSPWriter = fs.createWriteStream(Configer.publicPath+filename);
                                            var objReadline = readline.createInterface({      // 按行读取
                                                input: fRead
                                            });
                                            var rowDatas = [];
                                            rowDatas.push(["key值","中文"]); 
                                            objReadline.on('line', (line)=>{
                                                var chiaArray = createChar(line);
                                                var datas=[];
                                                var keyLine = line;
                                                if(chiaArray&&chiaArray.length > 0) {
                                                    chiaArray.forEach(function(item){
                                                        if(!item) return;
                                                        rowDatas.push([charKey,item]); 
                                                        console.log('中文词:' + charKey + ":" + item);
                                                        var index = line.indexOf(item);
                                                        keyLine = insert_flg(keyLine,charKey,item);
    
    
                                                        charKey += 1;
                                                    })
                                                }
                                                fsJSPWriter.write(keyLine);
                                            });
    
                                            objReadline.on('close', ()=>{
                                                var buffer = xlsx.build([
                                                    {
                                                        name:'sheet1',
                                                        data:rowDatas   
                                                    }
                                                ]);
                                                fWrite.write(buffer);
                                            });
                                        //}
                                    }
                                    if(isDir){
                                        fileDisplay(filedir);//递归,如果是文件夹,就继续遍历该文件夹下面的文件
                                    }
                                }
                            })
                        });
                    }
                });
            }
    
            //截取中文词语
            function createChar(line) {
                if(!line.length || line.length==0) return;
                var reg = /[\u4e00-\u9fa5]/g;
                var charMarry = [];
                var str = "";
                for(var i=0;i<line.length;i++) {
                    var chart = line.charAt(i);
                    var prevChart = line.charAt(i-1);
                    if(prevChart.match(reg)) {
                        if(chart.match(reg)){
                            str += chart;
                        }else{
                            charMarry.push(str);
                            str = "";
                        }
                    }else if(chart.match(reg)) {
                        str += chart;
                    }
                    if(i==line.length-1){
                        charMarry.push(str);
                        str = "";
                    }
                }
                return charMarry;
            }
    
            //生成国际化标记
            function insert_flg(str,key,item){
                var newstr="";
                var index = str.indexOf(item);
                var xmlKey = "<fm key=\"${}\"></fm>";
                var enIndex = index+item.length;
                newstr = str.substring(0,index)+xmlKey.replace('${}',key)+str.substring(enIndex);
                return newstr;
            }
    

    实现效果

    JSP插入国际化标签

                <td><fm key="100000"></fm>:</td>
                <td><fm key="100001"></fm>:</td>
    

    生成Excel文件,补充英文

    key 中文 英文
    100000 用户地址
    100001 机构地址

    总结

    该方案,核心代码是把文件按行读取,并遍历该行有没有中文,有中文就判断下一个字节是否是中文,一直截取到非中文字节的位置。生成excel后可直观方便的补充对应英文,便于进行国际化处理。本来打算直接调用谷歌引文翻译,把中文翻译成英文,生成国际化文件,但考虑到生成的英文太生硬,还是人工补充较好,有兴趣的可以试下。

    相关文章

      网友评论

          本文标题:JSP项目国际化解决方案

          本文链接:https://www.haomeiwen.com/subject/apptbctx.html