nodejs簡(jiǎn)單實(shí)現(xiàn)中英文翻譯
幫以前同事解決一個(gè)需求,中文項(xiàng)目 翻譯 英文項(xiàng)目~~~
考慮到具體實(shí)現(xiàn)方面的問(wèn)題,如果智能的話,肯定是要做中文的語(yǔ)法分析,不過(guò)感覺(jué)這個(gè)有難度。
所以最后的方案是遍歷文件,將中文短語(yǔ)匹配出來(lái),再進(jìn)行人工翻譯,將中文短語(yǔ)替換成翻譯的內(nèi)容。當(dāng)然后期還是需要人工再檢驗(yàn)下,畢竟代碼中的中文,可能會(huì)影響到相關(guān)的程序。
這個(gè)問(wèn)題,明顯涉及到 多線程,文件讀寫(xiě),第一時(shí)間就想到的是 nodejs,雖然nodejs是一個(gè)主線程,但是異步文件讀寫(xiě),事件響應(yīng)機(jī)制,肯定也是調(diào)用了線程,在實(shí)際編程的時(shí)候不需要考慮線程的相關(guān)的問(wèn)題。
代碼不復(fù)雜如下,寫(xiě)完了之后,適當(dāng)?shù)姆庋b了下
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');
})
});
*/
問(wèn)題還是有的
1.nodejs編碼問(wèn)題,在window環(huán)境下對(duì)GBK編碼支持不好,主要是utf8文件的處理
2.效率上面可能可以再通過(guò) 線程進(jìn)行優(yōu)化,這塊沒(méi)做深入的考慮
3.匹配出來(lái),可能有單個(gè)的標(biāo)點(diǎn)符號(hào)的短語(yǔ)等情況,需要人工排查
實(shí)際情況中,文件是GBK的,還有些文件是utf8的,后來(lái)還是考慮通過(guò) 腳本語(yǔ)言 快手實(shí)現(xiàn)的時(shí)候,
1.文件編碼的問(wèn)題,判斷通過(guò)搜索
判斷文件首位3個(gè)字節(jié)是不是 ef bb bf,但是這個(gè)只是針對(duì)有BOM的utf8格式
對(duì)無(wú)BOM的utf8格式,需要進(jìn)行字節(jié)特征碼的判斷(有難度,精力有限,使用了上面的方案,對(duì)于無(wú)BOM的情況,進(jìn)行人工排查)。
2.因?yàn)榭焓侄嗑€程方便編程很簡(jiǎn)單,一直以為多線程肯定比單線程效率要好。實(shí)際情況卻和想的不一樣,單線程的比多線程的快多了??磥?lái)主要瓶頸還是在讀寫(xiě)文件IO上面。
以上所述就是本文全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
Windows中徹底刪除Node.js環(huán)境(以及npm)的方法
本文詳細(xì)介紹了如何在Windows電腦中徹底刪除Node.js環(huán)境,包括查找安裝路徑、使用控制面板卸載以及手動(dòng)刪除殘留文件夾2025-01-01
使用iojs的jsdom庫(kù)實(shí)現(xiàn)同步系統(tǒng)時(shí)間
本文給大家分享的是使用iojs的jsdom庫(kù)實(shí)現(xiàn)與http://open.baidu.com/special/time/ 同步系統(tǒng)時(shí)間。思路非常的清晰,這里推薦給大家,有需要的小伙伴可以參考下。2015-04-04
NodeJS多種創(chuàng)建WebSocket監(jiān)聽(tīng)的方式(三種)
這篇文章主要介紹了NodeJS多種創(chuàng)建WebSocket監(jiān)聽(tīng)的方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
nodejs利用http模塊實(shí)現(xiàn)銀行卡所屬銀行查詢和騷擾電話驗(yàn)證示例
本篇文章主要介紹了nodejs利用http模塊實(shí)現(xiàn)銀行卡所屬銀行查詢和騷擾電話驗(yàn)證示例,有興趣的可以了解一下。2016-12-12
通過(guò)NodeJS輕松使用GRPC和協(xié)議緩沖區(qū)的方法
本文介紹了GRPC和協(xié)議緩沖區(qū)的基本概念,并展示了如何在NodeJS應(yīng)用程序中使用它們,GRPC是一個(gè)高性能RPC框架,協(xié)議緩沖區(qū)則用于定義服務(wù)和序列化消息,本文給大家介紹如何在NodeJS應(yīng)用程序中使用GRPC和協(xié)議緩沖區(qū),感興趣的朋友一起看看吧2024-10-10
在Linux上用forever實(shí)現(xiàn)Node.js項(xiàng)目自啟動(dòng)
在一臺(tái)計(jì)算機(jī)上手動(dòng)跑Node項(xiàng)目簡(jiǎn)單,node xx.js就搞定了,想讓Node項(xiàng)目后臺(tái)運(yùn)行,雖然不能直接用node命令搞定,但是在安裝了forever這個(gè)包以后,還是很輕松的。不過(guò)要是在遠(yuǎn)程服務(wù)器上構(gòu)建Node項(xiàng)目,如果沒(méi)法自啟動(dòng),一旦服務(wù)器重啟,那就麻煩了。2014-07-07
Nodejs實(shí)現(xiàn)獲取實(shí)時(shí)數(shù)據(jù)的三種主流方式詳解
這篇文章主要為大家詳細(xì)介紹了Nodejs前端獲取實(shí)時(shí)數(shù)據(jù)的三種主流方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02

