首页 > 语言 > JavaScript > 正文

nodejs简单实现中英文翻译

2024-05-06 16:19:12
字体:大 中 小
来源:转载
供稿:网友

这篇文章主要介绍了nodejs简单实现中英文翻译的方法和示例,虽然还存在着不小的问题,但是也算是基本能用了,这里推荐给大家。

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

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

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

这个问题,明显涉及到 多线程,文件读写,第一时间就想到的是 nodejs,虽然nodejs是一个主线程,但是异步文件读写,事件响应机制,肯定也是调用了线程,在实际编程的时候不需要考虑线程的相关的问题。

代码不复杂如下,写完了之后,适当的封装了下

 

 
  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. }); 
  49. }).on('error', function(e) { 
  50. console.log('http error'); 
  51. index--; 
  52. if (index == 0) { 
  53. callback(); 
  54. } 
  55. console.log("Got error: " + e.message); 
  56. }); 
  57. })(key); 
  58. } 
  59. } 
  60. } 
  61. } 
  62. })(); 
  63.  
  64. function File () { 
  65. var index = 0; 
  66. var _readFile = function (pathStr, fileBack, doneBack) { 
  67. fs.readFile(pathStr,{encoding:'utf8'}, function (err, data) { 
  68. index--; 
  69. if (err) { 
  70. data = ""; 
  71. console.log(err,pathStr) 
  72. //throw err; 
  73. } 
  74. fileBack(data,pathStr); 
  75. if (index == 0) { 
  76. doneBack(); 
  77. } 
  78. }); 
  79. }; 
  80. var _walkDir = function (pathStr, fileBack, doneBack) { 
  81. fs.readdir(pathStr, function (err, files) { 
  82. files.forEach(function (file) { 
  83. if(fs.statSync(pathStr + '/' + file).isDirectory()){ 
  84. _walkDir(pathStr + '/' + file, fileBack, doneBack); 
  85. } else { 
  86. if (/.js$|.html$|.htm$|.jsp$/.test(file)){ 
  87. index ++; 
  88. _readFile(pathStr + '/' + file, fileBack, doneBack); 
  89. } 
  90. return; 
  91. } 
  92. }); 
  93. }); 
  94. } 
  95. this.walkDir = function (pathStr, fileBack, doneBack) { 
  96. index = 0; 
  97. _walkDir(pathStr, fileBack, doneBack); 
  98. } 
  99. } 
  100.  
  101. //第一步 获取中文 
  102. dictionary.logPath = logPath; 
  103.  
  104. new File().walkDir(filePath, function (data) { 
  105. if (!!data) { 
  106. var match = data.match(/[/u4e00-/u9faf]+/g); 
  107. if (!!match) { 
  108. match.forEach(function (mat) { 
  109. dictionary.set(mat); 
  110. }) 
  111. } 
  112. } 
  113. }, function () { 
  114. console.log('获取中文 OK'); 
  115. dictionary.save2File(); 
  116. }) 
  117.  
  118.  
  119. //第二步 google翻译 
  120. /* 
  121. dictionary.loadFile(function () { 
  122. dictionary.translateByGoogle(function () { 
  123. dictionary.save2File(); 
  124. }) 
  125. }); 
  126. */ 
  127. //第三步 中文替换 
  128. /* 
  129. dictionary.loadFile(function () { 
  130. new File().walkDir(filePath, function (data,pathStr) { 
  131. fs.writeFile(pathStr, data.replace(/[/u4e00-/u9faf]+/g, function (ch) { 
  132. return dictionary.get(ch); 
  133. }),{encoding:'ascii',flag:'w'}, function (err) { 
  134. if (err) throw err; 
  135. });  
  136. }, function () { 
  137. console.log('中文替换 OK'); 
  138. }) 
  139. }); 
  140. */ 

问题还是有的

1.nodejs编码问题,在window环境下对GBK编码支持不好,主要是utf8文件的处理

2.效率上面可能可以再通过 线程进行优化,这块没做深入的考虑

3.匹配出来,可能有单个的标点符号的短语等情况,需要人工排查

实际情况中,文件是GBK的,还有些文件是utf8的,后来还是考虑通过 脚本语言 快手实现的时候,

1.文件编码的问题,判断通过搜索

判断文件首位3个字节是不是 ef bb bf,但是这个只是针对有BOM的utf8格式

对无BOM的utf8格式,需要进行字节特征码的判断(有难度,精力有限,使用了上面的方案,对于无BOM的情况,进行人工排查)。

2.因为快手多线程方便编程很简单,一直以为多线程肯定比单线程效率要好。实际情况却和想的不一样,单线程的比多线程的快多了。看来主要瓶颈还是在读写文件IO上面。

以上所述就是本文全部内容了,希望大家能够喜欢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选