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实用示例 缩址还原
Dec 28 NodeJs
nodejs开发环境配置与使用
Nov 17 NodeJs
NodeJS学习笔记之Connect中间件模块(二)
Jan 27 NodeJs
浅谈NodeJS中require路径问题
May 07 NodeJs
使用nodejs中httpProxy代理时候出现404异常的解决方法
Aug 15 NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 NodeJs
搭建简单的nodejs http服务器详解
Mar 09 NodeJs
详解nodejs模板引擎制作
Jun 14 NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 NodeJs
浅谈Node的内存泄露问题
May 06 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完整的日历类(CLASS)
2006/11/27 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
2015/12/25 PHP
PHP yii实现model添加默认值的方法(两种方法)
2016/11/10 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
nodejs获取本机内网和外网ip地址的实现代码
2014/06/01 NodeJs
jquery.cookie.js使用指南
2015/01/05 Javascript
javascript数据结构与算法之检索算法
2015/04/04 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
js Canvas实现圆形时钟教程
2016/09/19 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
2017/08/08 jQuery
koa-router源码学习小结
2018/09/07 Javascript
原生JS实现轮播图效果
2018/10/12 Javascript
vue实现自定义日期组件功能的实例代码
2018/11/06 Javascript
JS 图片压缩原理与实现方法详解
2020/04/29 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
微信小程序实现首页弹出广告
2020/12/03 Javascript
用javascript实现倒计时效果
2021/02/09 Javascript
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
使用url_helper简化Python中Django框架的url配置教程
2015/05/30 Python
详解Python3.6安装psutil模块和功能简介
2018/05/30 Python
Python3.5运算符操作实例详解
2019/04/25 Python
python中while和for的区别总结
2019/06/28 Python
深入了解Python在HDA中的应用
2019/09/05 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
2021/01/05 Python
世界上最大的乐器零售商:Guitar Center
2017/11/07 全球购物
Collection和Collections的区别
2016/05/02 面试题
综合测评自我鉴定
2013/10/08 职场文书
68句权威创业名言
2019/08/26 职场文书
导游词之山东八大关
2019/12/18 职场文书
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android