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 相关文章推荐
抛弃Nginx使用nodejs做反向代理服务器
Jul 17 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
解析NodeJS异步I/O的实现
Apr 13 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
深入解析nodejs HTTP服务
Jul 25 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
NVM安装nodejs的方法实用步骤
Jan 16 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
NodeJs crypto加密制作token的实现代码
Nov 15 NodeJs
nodejs nedb 封装库与使用方法示例
Feb 06 NodeJs
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
Feb 06 NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 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开发者的10个技巧
2011/02/25 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
zend framework重定向方法小结
2016/05/28 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
JavaScript中:表达式和语句的区别[译]
2012/09/17 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
Javascript数组操作函数总结
2015/02/05 Javascript
PHP守护进程实例
2015/03/06 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
javascript的正则匹配方法学习
2016/02/24 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
浅谈Vue的基本应用
2016/12/27 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
PyQt5实现简易电子词典
2019/06/25 Python
Python Websocket服务端通信的使用示例
2020/02/25 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
Python定时任务框架APScheduler原理及常用代码
2020/10/05 Python
戴尔英国官网:Dell英国
2017/05/27 全球购物
斯德哥尔摩通票:Stockholm Pass
2018/01/09 全球购物
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
《梅兰芳学艺》教学反思
2014/02/24 职场文书
餐饮总经理岗位职责
2014/03/07 职场文书
2014年学习厉行节约反对浪费思想汇报
2014/09/10 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
党支部承诺书
2015/01/20 职场文书
公司表扬信格式
2015/05/04 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python
JavaScript 定时器详情
2021/11/11 Javascript
Python保存并浏览用户的历史记录
2022/04/29 Python