nodejs簡單實現(xiàn)中英文翻譯
幫以前同事解決一個需求,中文項目 翻譯 英文項目~~~
考慮到具體實現(xiàn)方面的問題,如果智能的話,肯定是要做中文的語法分析,不過感覺這個有難度。
所以最后的方案是遍歷文件,將中文短語匹配出來,再進行人工翻譯,將中文短語替換成翻譯的內(nèi)容。當然后期還是需要人工再檢驗下,畢竟代碼中的中文,可能會影響到相關(guān)的程序。
這個問題,明顯涉及到 多線程,文件讀寫,第一時間就想到的是 nodejs,雖然nodejs是一個主線程,但是異步文件讀寫,事件響應(yīng)機制,肯定也是調(diào)用了線程,在實際編程的時候不需要考慮線程的相關(guān)的問題。
代碼不復(fù)雜如下,寫完了之后,適當?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'); }) }); */
問題還是有的
1.nodejs編碼問題,在window環(huán)境下對GBK編碼支持不好,主要是utf8文件的處理
2.效率上面可能可以再通過 線程進行優(yōu)化,這塊沒做深入的考慮
3.匹配出來,可能有單個的標點符號的短語等情況,需要人工排查
實際情況中,文件是GBK的,還有些文件是utf8的,后來還是考慮通過 腳本語言 快手實現(xiàn)的時候,
1.文件編碼的問題,判斷通過搜索
判斷文件首位3個字節(jié)是不是 ef bb bf,但是這個只是針對有BOM的utf8格式
對無BOM的utf8格式,需要進行字節(jié)特征碼的判斷(有難度,精力有限,使用了上面的方案,對于無BOM的情況,進行人工排查)。
2.因為快手多線程方便編程很簡單,一直以為多線程肯定比單線程效率要好。實際情況卻和想的不一樣,單線程的比多線程的快多了??磥碇饕款i還是在讀寫文件IO上面。
以上所述就是本文全部內(nèi)容了,希望大家能夠喜歡。
相關(guān)文章
Nodejs環(huán)境實現(xiàn)socket通信過程解析
這篇文章主要介紹了Nodejs環(huán)境實現(xiàn)socket通信過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07詳解Node.js?應(yīng)用高?CPU?占用率分析方法
這篇文章主要為大家介紹了Node.js?應(yīng)用高?CPU?占用率分析方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10