经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » 浏览器 » 查看文章
2018-08-29 浏览器插件实现GitHub代码翻译原型演示
来源:cnblogs  作者:吴烜  时间:2019/3/11 8:44:06  对本文有异议

此原型源自此想法: 中文化源码. 考虑到IDE插件工作量较大, 且与IDE绑定. 在代码转换工具的各种实现中, 综合考虑实用+易用+长远改进潜力, 浏览器插件似乎较有优势. 于是用最快捷的方式实现这一想法.

注: 此演示仅用Chrome在一个命名比较简单的代码页https://github.com/swaroopch/byte-of-python/blob/master/programs/ds_using_list.py 运行过, 限于取代码块的简单方式(取页面中的table元素)以及內建词典, 其他浏览器/github代码页的效果不保证.

原型项目源码在: program-in-chinese/webextension_github_code_translator

在Chrome下加载此插件后, 点击工具栏中的按钮(竟然默认图标是个'G', 也许是"Github代码翻译原型"的首字母). 弹窗中就会显示翻译后的代码段. 就这样:
2018-08-29_github代码翻译插件演示

项目源码节选

对代码段的文本进行简单替换:

  1. function 翻译() {
  2. var 原代码拷贝 = document.getElementsByTagName('table')[0];
  3. var span字段列表 = 原代码拷贝.getElementsByTagName('span');
  4. 翻译字段列表(span字段列表);
  5. var 文本字段列表 = 取子文本节点(document);
  6. 翻译字段列表(文本字段列表);
  7. }
  8. function 取子文本节点(el) {
  9. var n, a = [], walk = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null, false);
  10. while (n = walk.nextNode()) a.push(n);
  11. return a;
  12. }
  13. // 假设每个字段除了词, 其他都是非英文字符.
  14. function 取字段中所有词(字段) {
  15. var 单词 = 字段.match(/[a-zA-Z]+/g);
  16. if (单词) {
  17. return 单词;
  18. }
  19. return [字段];
  20. }
  21. function 取字段中最长句(字段) {
  22. var = 字段.match(/[a-zA-Z\s]+/g);
  23. if (句 && 句.length > 0) {
  24. return 句[0].trim();
  25. }
  26. return 字段;
  27. }
  28. function 翻译字段列表(字段列表) {
  29. for (var i = 0; i < 字段列表.length; i++) {
  30. var 字段 = 字段列表[i].textContent;
  31. var 所有单词 = 取字段中所有词(字段);
  32. var 所有单词有翻译 = false;
  33. for (var j = 0; j < 所有单词.length; j++) {
  34. var 单词 = 所有单词[j];
  35. var 对应中文词 = 关键词词典[单词] || API词典[单词] || 命名词典[单词];
  36. if (对应中文词) {
  37. if (j == 所有单词.length - 1) {
  38. 所有单词有翻译 = true;
  39. }
  40. } else {
  41. break;
  42. }
  43. 字段 = 字段.replace(单词, 对应中文词);
  44. }
  45. // 取巧: 仅当字段中所有词有翻译时才替换字段, 避免某些文本中出现个别可识别的单词. 今后需进行语法分析.
  46. if (所有单词有翻译) {
  47. 字段列表[i].textContent = 字段;
  48. } else {
  49. var = 取字段中最长句(字段);
  50. var 对应中文 = 语句翻译[句.toLowerCase()]
  51. if (对应中文) {
  52. 字段列表[i].textContent = 字段.replace(句, 对应中文);
  53. }
  54. }
  55. }
  56. }

內建词典有几部分, 前两个(关键词/API)可扩展, 单词词汇可借助现有的英汉词典(olditem等还需另行拆分处理), 语句翻译可借助在线翻译API(原型中的翻译内容取自有道在线翻译):

  1. var 关键词词典 = {
  2. 'for': '对于',
  3. 'in': '在',
  4. 'if': '如果',
  5. 'del': '删除'
  6. };
  7. var API词典 = {
  8. 'print': '打印',
  9. 'append': '添加',
  10. 'sort': '排序',
  11. 'len': '长度',
  12. 'end': '结尾'
  13. }
  14. var 命名词典 = {
  15. 'shoplist': '购物单',
  16. 'apple': '苹果',
  17. 'mango': '芒果',
  18. 'carrot': '胡萝卜',
  19. 'banana': '香蕉',
  20. 'rice': '米',
  21. 'item': '物品',
  22. 'olditem': '第一项'
  23. }
  24. // 这里使用有道在线翻译结果. TODO: 用翻译API代替
  25. var 语句翻译 = {
  26. 'this is my shopping list': '这是我的购物单',
  27. 'i have': '我有',
  28. 'items to purchase': '要购买的产品',
  29. 'i also have to buy rice': '我还得买大米',
  30. 'my shopping list is now': '我的购物单现在在',
  31. 'i will sort my list now': '我现在就整理我的清单',
  32. 'sorted shopping list is': '排序的购物清单是',
  33. 'the first item i will buy is': '我要买的第一件东西是'
  34. }

参考

Chrome Extension - Get DOM content

https://developer.chrome.com/extensions/tabs#method-executeScript

Find all text nodes in HTML page

中文关键词替换体验页面原型

为Chrome和火狐浏览器编写扩展

原文链接:http://www.cnblogs.com/program-in-chinese/p/10499282.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号