国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

nodejs簡單實(shí)現(xiàn)中英文翻譯

2024-05-06 16:19:12
字體:
供稿:網(wǎng)友

這篇文章主要介紹了nodejs簡單實(shí)現(xiàn)中英文翻譯的方法和示例,雖然還存在著不小的問題,但是也算是基本能用了,這里推薦給大家。

幫以前同事解決一個(gè)需求,中文項(xiàng)目 翻譯 英文項(xiàng)目~~~

考慮到具體實(shí)現(xiàn)方面的問題,如果智能的話,肯定是要做中文的語法分析,不過感覺這個(gè)有難度。

所以最后的方案是遍歷文件,將中文短語匹配出來,再進(jìn)行人工翻譯,將中文短語替換成翻譯的內(nèi)容。當(dāng)然后期還是需要人工再檢驗(yàn)下,畢竟代碼中的中文,可能會(huì)影響到相關(guān)的程序。

這個(gè)問題,明顯涉及到 多線程,文件讀寫,第一時(shí)間就想到的是 nodejs,雖然nodejs是一個(gè)主線程,但是異步文件讀寫,事件響應(yīng)機(jī)制,肯定也是調(diào)用了線程,在實(shí)際編程的時(shí)候不需要考慮線程的相關(guān)的問題。

代碼不復(fù)雜如下,寫完了之后,適當(dāng)?shù)姆庋b了下

 

 
  1. var fs = require('fs'); 
  2. var http = require('http'); 
  3. var filePath = 'D://WORK_new//'
  4. var logPath = 'D://chinese.log'
  5.  
  6. var map = {}; 
  7. var num = 0; 
  8.  
  9. var dictionary = (function () { 
  10. var map = {}; 
  11. return { 
  12. logPath: 'D://chinese.log'
  13. set: function (key, val) { 
  14. map[key] = val || ''
  15. }, 
  16. get: function (key) { 
  17. return map[key]||''
  18. }, 
  19. save2File: function () { 
  20. fs.writeFile(this.logPath, JSON.stringify(map).replace(/","/g,'",/r/n"'),{encoding:'utf8',flag:'w'}, function (err) { 
  21. if (err) throw err; 
  22. });  
  23. }, 
  24. loadFile: function (callback) { 
  25. fs.readFile(this.logPath, {encoding:'utf8'},function (err, data) { 
  26. map = JSON.parse(data); 
  27. callback(); 
  28. }) 
  29. }, 
  30. translateByGoogle: function (callback) { 
  31. var index = 0; 
  32. for (var key in map) { 
  33. if (map[key] == '') { 
  34. index++; 
  35. (function (key) { 
  36. 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) { 
  37. res.setEncoding('utf8'); 
  38. var body = ""
  39. res.on('data'function (chunk) { 
  40. body+=chunk;  
  41. }).on('end'function (){  
  42. var obj = eval('('+body+')'); 
  43. map[key] = obj[0][0][0]; 
  44. index--; 
  45. if (index == 0) { 
  46. callback(); 
  47. }); 
  48. }).on('error'function(e) { 
  49. console.log('http error'); 
  50. index--; 
  51. if (index == 0) { 
  52. callback(); 
  53. console.log("Got error: " + e.message); 
  54. }); 
  55. })(key); 
  56. })(); 
  57.  
  58. function File () { 
  59. var index = 0; 
  60. var _readFile = function (pathStr, fileBack, doneBack) { 
  61. fs.readFile(pathStr,{encoding:'utf8'}, function (err, data) { 
  62. index--; 
  63. if (err) { 
  64. data = ""
  65. console.log(err,pathStr) 
  66. //throw err; 
  67. fileBack(data,pathStr); 
  68. if (index == 0) { 
  69. doneBack(); 
  70. }); 
  71. }; 
  72. var _walkDir = function (pathStr, fileBack, doneBack) { 
  73. fs.readdir(pathStr, function (err, files) { 
  74. files.forEach(function (file) { 
  75. if(fs.statSync(pathStr + '/' + file).isDirectory()){ 
  76. _walkDir(pathStr + '/' + file, fileBack, doneBack); 
  77. else { 
  78. if (/.js$|.html$|.htm$|.jsp$/.test(file)){ 
  79. index ++; 
  80. _readFile(pathStr + '/' + file, fileBack, doneBack); 
  81. return
  82. }); 
  83. }); 
  84. this.walkDir = function (pathStr, fileBack, doneBack) { 
  85. index = 0; 
  86. _walkDir(pathStr, fileBack, doneBack); 
  87.  
  88. //第一步 獲取中文 
  89. dictionary.logPath = logPath; 
  90.  
  91. new File().walkDir(filePath, function (data) { 
  92. if (!!data) { 
  93. var match = data.match(/[/u4e00-/u9faf]+/g); 
  94. if (!!match) { 
  95. match.forEach(function (mat) { 
  96. dictionary.set(mat); 
  97. }) 
  98. }, function () { 
  99. console.log('獲取中文 OK'); 
  100. dictionary.save2File(); 
  101. }) 
  102.  
  103.  
  104. //第二步 google翻譯 
  105. /* 
  106. dictionary.loadFile(function () { 
  107. dictionary.translateByGoogle(function () { 
  108. dictionary.save2File(); 
  109. }) 
  110. }); 
  111. */ 
  112. //第三步 中文替換 
  113. /* 
  114. dictionary.loadFile(function () { 
  115. new File().walkDir(filePath, function (data,pathStr) { 
  116. fs.writeFile(pathStr, data.replace(/[/u4e00-/u9faf]+/g, function (ch) { 
  117. return dictionary.get(ch); 
  118. }),{encoding:'ascii',flag:'w'}, function (err) { 
  119. if (err) throw err; 
  120. });  
  121. }, function () { 
  122. console.log('中文替換 OK'); 
  123. }) 
  124. }); 
  125. */ 

問題還是有的

1.nodejs編碼問題,在window環(huán)境下對GBK編碼支持不好,主要是utf8文件的處理

2.效率上面可能可以再通過 線程進(jìn)行優(yōu)化,這塊沒做深入的考慮

3.匹配出來,可能有單個(gè)的標(biāo)點(diǎn)符號的短語等情況,需要人工排查

實(shí)際情況中,文件是GBK的,還有些文件是utf8的,后來還是考慮通過 腳本語言 快手實(shí)現(xiàn)的時(shí)候,

1.文件編碼的問題,判斷通過搜索

判斷文件首位3個(gè)字節(jié)是不是 ef bb bf,但是這個(gè)只是針對有BOM的utf8格式

對無BOM的utf8格式,需要進(jìn)行字節(jié)特征碼的判斷(有難度,精力有限,使用了上面的方案,對于無BOM的情況,進(jìn)行人工排查)。

2.因?yàn)榭焓侄嗑€程方便編程很簡單,一直以為多線程肯定比單線程效率要好。實(shí)際情況卻和想的不一樣,單線程的比多線程的快多了??磥碇饕款i還是在讀寫文件IO上面。

以上所述就是本文全部內(nèi)容了,希望大家能夠喜歡。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 海口市| 北宁市| 六盘水市| 江安县| 铁力市| 大新县| 瑞丽市| 策勒县| 博野县| 大足县| 阿尔山市| 吴旗县| 襄垣县| 彭州市| 高邮市| 正安县| 社会| 潞城市| 邳州市| 四川省| 江山市| 翁牛特旗| 保靖县| 东明县| 东山县| 定西市| 灵台县| 双牌县| 合水县| 西和县| 泽普县| 台中市| 香港| 临泉县| 通州区| 丘北县| 莱州市| 扎鲁特旗| 固镇县| 长顺县| 榆树市|