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 的 c++ module 链接到 OpenSSL
Aug 03 NodeJs
Nodejs极简入门教程(三):进程
Oct 27 NodeJs
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
Nov 20 NodeJs
NodeJs中的VM模块详解
May 06 NodeJs
Nodejs中的this详解
Mar 26 NodeJs
NodeJs的fs读写删除移动监听
Apr 28 NodeJs
nodejs mysql 实现分页的方法
Jun 06 NodeJs
详解nodejs的express如何自动生成项目框架
Jul 12 NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 NodeJs
nodejs实现聊天机器人功能
Sep 19 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 NodeJs
如何利用nodejs实现命令行游戏
Nov 24 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之预定义接口详解
2015/07/29 PHP
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
JavaScript中的闭包介绍
2015/03/15 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
javascript构造函数以及原型对象的理解
2017/01/13 Javascript
详解本地Node.js服务器作为api服务器的解决办法
2017/02/28 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
node中间层实现文件上传功能
2018/06/11 Javascript
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
node 解析图片二维码的内容代码实例
2019/09/11 Javascript
vue中v-model对select的绑定操作
2020/08/31 Javascript
原生js实现表格循环滚动
2020/11/24 Javascript
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
flask入门之文件上传与邮件发送示例
2018/07/18 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
mac安装python3后使用pip和pip3的区别说明
2020/09/01 Python
python实现简单的tcp 文件下载
2020/09/16 Python
matplotlib绘制多子图共享鼠标光标的方法示例
2021/01/08 Python
python将YUV420P文件转PNG图片格式的两种方法
2021/01/22 Python
css3 按钮 利用css3实现超酷下载按钮
2013/03/18 HTML / CSS
HTML5 Canvas中绘制矩形实例
2015/01/01 HTML / CSS
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
杭州龙健科技笔试题.net部分笔试题
2016/01/24 面试题
初中生学习的自我评价
2013/11/14 职场文书
播音主持女孩的自我评价分享
2013/11/20 职场文书
办公室主任主任岗位责任制
2014/02/11 职场文书
党员剖析材料范文
2014/12/18 职场文书
运动会通讯稿600字
2015/07/20 职场文书