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的模块写法入门(实例代码)
Mar 07 NodeJs
轻松创建nodejs服务器(10):处理上传图片
Dec 18 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
NodeJs下的测试框架Mocha的简单介绍
Feb 22 NodeJs
nodejs结合Socket.IO实现的即时通讯功能详解
Jan 12 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
nodejs基础之多进程实例详解
Dec 27 NodeJs
nodejs检测因特网是否断开的解决方案
Apr 17 NodeJs
NodeJs 模仿SIP话机注册的方法
Jun 21 NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 NodeJs
nodejs中使用worker_threads来创建新的线程的方法
Jan 22 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
雄兵连三大错觉:凯莎没了,凉冰阵亡了,华烨觉得自己又行了
2020/04/09 国漫
php中神奇的fastcgi_finish_request
2011/05/02 PHP
深入掌握include_once与require_once的区别
2013/06/17 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
10款非常有用的 Ajax 插件分享
2012/03/14 Javascript
图片Slider 带左右按钮的js示例
2013/08/30 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
javascript实现淘宝幻灯片广告展示效果
2015/04/27 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
AngularJS入门教程之路由与多视图详解
2016/08/19 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
2016/12/19 Javascript
js 作用域和变量详解
2017/02/16 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
AngularJS 打开新的标签页实现代码
2017/09/07 Javascript
详解vue-loader在项目中是如何配置的
2018/06/04 Javascript
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
2019/01/23 Javascript
微信小程序websocket聊天室的实现示例代码
2019/02/12 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
package.json各个属性说明详解
2020/03/11 Javascript
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
Python常用内置模块之xml模块(详解)
2017/05/23 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
tensorflow 实现从checkpoint中获取graph信息
2020/02/10 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
《哪吒闹海》教学反思
2014/02/28 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python
ORM模型框架操作mysql数据库的方法
2021/07/25 MySQL