首页 > 语言 > 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. }).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环境下对GBK编码支持不好,主要是utf8文件的处理

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

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

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

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

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

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

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

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

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

图片精选