手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >nodejs怎么简单实现中英文翻译
nodejs怎么简单实现中英文翻译
摘要:帮以前同事解决一个需求,中文项目翻译英文项目~~~考虑到具体实现方面的问题,如果智能的话,肯定是要做中文的语法分析,不过感觉这个有难度。所以...

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

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

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

这个问题,明显涉及到 多线程,文件读写,第一时间就想到的是 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,'",rn"'),{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("/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怎么简单实现中英文翻译】相关文章:

jQuery仿gmail实现fixed布局的方法

javascript原型模式用法实例详解

JQuery中上下文选择器实现方法

Nodejs实现批量下载妹纸图

jQuery实现不断闪烁文字的方法

Jquery注册事件实现方法

利用js实现禁止复制文本信息

js实现div层缓慢收缩与展开的方法

探索angularjs+requirejs全面实现按需加载的套路

js控制div弹出层实现方法

精品推荐
分类导航