nodejs简单实现中英文翻译


Posted in NodeJs onMay 04, 2015

帮以前同事解决一个需求,中文项目 翻译 英文项目~~~

考虑到具体实现方面的问题,如果智能的话,肯定是要做中文的语法分析,不过感觉这个有难度。

所以最后的方案是遍历文件,将中文短语匹配出来,再进行人工翻译,将中文短语替换成翻译的内容。当然后期还是需要人工再检验下,毕竟代码中的中文,可能会影响到相关的程序。

这个问题,明显涉及到 多线程,文件读写,第一时间就想到的是 nodejs,虽然nodejs是一个主线程,但是异步文件读写,事件响应机制,肯定也是调用了线程,在实际编程的时候不需要考虑线程的相关的问题。

代码不复杂如下,写完了之后,适当的封装了下

var fs = require('fs');
var http = require('http');
var filePath = 'D:\\WORK_new\\';
var logPath = 'D:\\chinese.log';

var map = {};
var num = 0;

var dictionary = (function () {
  var map = {};
  return {
    logPath: 'D:\\chinese.log',
    set: function (key, val) {
      map[key] = val || '';
    },
    get: function (key) {
      return map[key]||'';
    },
    save2File: function () {
      fs.writeFile(this.logPath, JSON.stringify(map).replace(/","/g,'",\r\n"'),{encoding:'utf8',flag:'w'}, function (err) {
        if (err) throw err;
      }); 
    },
    loadFile: function (callback) {
      fs.readFile(this.logPath, {encoding:'utf8'},function (err, data) {
        map = JSON.parse(data);
        callback();
      })
    },
    translateByGoogle: function (callback) {
      var index = 0;
      for (var key in map) {
        if (map[key] == '') {
          index++;
          (function (key) {
            http.get("http://translate.google.cn/translate_a/t?client=t&hl=zh-CN&sl=zh-CN&tl=en&ie=UTF-8&oe=UTF-8&oc=2&otf=1&ssel=3&tsel=6&sc=2&q="+key, function(res) {
              res.setEncoding('utf8');
              var body = "";
              res.on('data', function (chunk) {
                body+=chunk;  
              }).on('end', function (){ 
                var obj = eval('('+body+')');
                map[key] = obj[0][0][0];
                index--;
                if (index == 0) {
                  callback();
                }
              });
            }).on('error', function(e) {
              console.log('http error');
              index--;
              if (index == 0) {
                callback();
              }
              console.log("Got error: " + e.message);
            });
          })(key);
        }
      }
    }
  }
})();

function File () {
  var index = 0;
  var _readFile = function (pathStr, fileBack, doneBack) {
    fs.readFile(pathStr,{encoding:'utf8'}, function (err, data) {
      index--;
      if (err) {
        data = "";
        console.log(err,pathStr)
        //throw err;
      }
      fileBack(data,pathStr);
      if (index == 0) {
        doneBack();
      }
    });
  };
  var _walkDir = function (pathStr, fileBack, doneBack) {
    fs.readdir(pathStr, function (err, files) {
      files.forEach(function (file) {
        if(fs.statSync(pathStr + '/' + file).isDirectory()){
          _walkDir(pathStr + '/' + file, fileBack, doneBack);
        } else {
          if (/.js$|.html$|.htm$|.jsp$/.test(file)){
            index ++;
            _readFile(pathStr + '/' + file, fileBack, doneBack);
          }
          return;
        }
      });
    });
  }
  this.walkDir = function (pathStr, fileBack, doneBack) {
    index = 0;
    _walkDir(pathStr, fileBack, doneBack);
  }
}

//第一步 获取中文
dictionary.logPath = logPath;

new File().walkDir(filePath, function (data) {
  if (!!data) {
    var match = data.match(/[\u4e00-\u9faf]+/g);
    if (!!match) {
      match.forEach(function (mat) {
        dictionary.set(mat);
      })
    }
  }
}, function () {
  console.log('获取中文 OK');
  dictionary.save2File();
})


//第二步 google翻译
/*
dictionary.loadFile(function () {
  dictionary.translateByGoogle(function () {
    dictionary.save2File();
  })
});
*/
//第三步 中文替换
/*
dictionary.loadFile(function () {
  new File().walkDir(filePath, function (data,pathStr) {
    fs.writeFile(pathStr, data.replace(/[\u4e00-\u9faf]+/g, function (ch) {
      return dictionary.get(ch);
    }),{encoding:'ascii',flag:'w'}, function (err) {
      if (err) throw err;
    }); 
  }, function () {
    console.log('中文替换 OK');
  })
});
*/

问题还是有的

1.nodejs编码问题,在window环境下对GBK编码支持不好,主要是utf8文件的处理

2.效率上面可能可以再通过 线程进行优化,这块没做深入的考虑

3.匹配出来,可能有单个的标点符号的短语等情况,需要人工排查

实际情况中,文件是GBK的,还有些文件是utf8的,后来还是考虑通过 脚本语言 快手实现的时候,

1.文件编码的问题,判断通过搜索

判断文件首位3个字节是不是 ef bb bf,但是这个只是针对有BOM的utf8格式

对无BOM的utf8格式,需要进行字节特征码的判断(有难度,精力有限,使用了上面的方案,对于无BOM的情况,进行人工排查)。

2.因为快手多线程方便编程很简单,一直以为多线程肯定比单线程效率要好。实际情况却和想的不一样,单线程的比多线程的快多了。看来主要瓶颈还是在读写文件IO上面。

以上所述就是本文全部内容了,希望大家能够喜欢。

NodeJs 相关文章推荐
nodejs获取本机内网和外网ip地址的实现代码
Jun 01 NodeJs
nodejs 实现模拟form表单上传文件
Jul 14 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
基于Nodejs利用socket.io实现多人聊天室
Feb 22 NodeJs
async/await与promise(nodejs中的异步操作问题)
Mar 03 NodeJs
配置nodejs环境的方法
May 13 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
nodejs实现OAuth2.0授权服务认证
Dec 27 NodeJs
webpack打包nodejs项目的方法
Sep 26 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 17 NodeJs
nodejs中内置模块fs,path常见的用法说明
Nov 07 NodeJs
nodejs调用cmd命令实现复制目录
May 04 #NodeJs
nodejs通过phantomjs实现下载网页
May 04 #NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 #NodeJs
PHP和NodeJs开发的应用如何共用Session
Apr 16 #NodeJs
Nodejs学习笔记之测试驱动
Apr 16 #NodeJs
Nodejs学习笔记之入门篇
Apr 16 #NodeJs
Windows系统下使用Sublime搭建nodejs环境
Apr 13 #NodeJs
You might like
PHP session有效期问题
2009/04/26 PHP
PHP实现事件机制的方法
2015/07/10 PHP
实例简介PHP的一些高级面向对象编程的特性
2015/11/27 PHP
JQuery 初体验(建议学习jquery)
2009/04/25 Javascript
JavaScript解析json格式数据简单示例
2014/12/09 Javascript
javascript与Python快速排序实例对比
2015/08/10 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
2016/05/10 Javascript
js创建数组的简单方法
2016/07/27 Javascript
利用JQuery直接调用asp.net后台的简单方法
2016/10/27 Javascript
xmlplus组件设计系列之路由(ViewStack)(7)
2017/05/02 Javascript
微信小程序实现页面跳转传值以及获取值的方法分析
2017/12/18 Javascript
js中url对象化管理分析
2017/12/29 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
2018/08/24 Javascript
mpvue写一个CPASS小程序的示例
2018/09/04 Javascript
详解node字体压缩插件font-spider的用法
2018/09/28 Javascript
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
9种python web 程序的部署方式小结
2014/06/30 Python
Python程序中使用SQLAlchemy时出现乱码的解决方案
2015/04/24 Python
bpython 功能强大的Python shell
2016/02/16 Python
python装饰器实例大详解
2017/10/25 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
大学生军训广播稿
2014/01/24 职场文书
小学优秀班集体申报材料
2014/05/25 职场文书
党员剖析材料范文
2014/09/30 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis
Win11 Beta 预览版 22621.575 和 22622.575更新补丁KB5016694发布(附更新内容大全)
2022/08/14 数码科技