中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创]一键解决各种鸟语,查阅资料不再困难!
作者:
标题: [原创]一键解决各种鸟语,查阅资料不再困难! 上一主题 | 下一主题
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『楼 主』:  [原创]一键解决各种鸟语,查阅资料不再困难!

提供这个东西的目的是为了解决大家看不懂各种鸟语的问题,相信这是个非常实用的小工具,只需要添加到IE右键菜单,上网的时候什么网站都能比较顺利的看了,同时因为是IE的右键菜单,除了网页之外好像就 CHM 文档中有。

首先说明这个东西不是用批处理,而是脚本做的,并且我把所有注释都去掉了,如果对脚本感兴趣可以找我要包含详细注释的原文件。考虑到运用正则表达式比较多,我采用的是 Javascript ,它写起来没VBscript那么麻烦。

使用方法:
1. 先打开本页面,并允许脚本和ActiveX控件,选择要翻译的语种,并设置这个功能在 IE 右键菜单中的名称,可以设置一个快捷键,如果勾选了记录翻译历史的话还需要填写日志文件的全路径,如下图。你可以添加很多个。


2.重新启动 IE 后,在网页上选中要翻译的文字,然后右键选择相应的菜单就行了。


3.效果图:
(考虑到加载速度只给出链接)
有字典和无字典的情况
http://upload.cn-dos.net/img/1647.jpg
日语
http://upload.cn-dos.net/img/1649.jpg
鳄鱼
http://upload.cn-dos.net/img/1650.jpg
在CHM文件中使用
http://upload.cn-dos.net/img/1652.gif
日志文件
http://upload.cn-dos.net/img/1651.jpg

(注释在 9 楼)

[ Last edited by qinchun36 on 2009-8-10 at 23:22 ]

附件 1: Translate.htm.zip (2009-8-10 03:46, 5.02 K,下载次数: 31)
2009-8-10 03:46
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 2 楼』:  

-_-这里是作为一个技术社区,,,分享的不应该是一个软件、脚本能做什么,而分享如何做的技术。我们更关心是你如何实现这些功能的。
比如查询的结果是来自某个网站的内容,还是显示字典里的内容。




有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2009-8-10 04:17
查看资料  发短消息 网志   编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by yishanju at 2009-8-10 04:17 AM:
-_-这里是作为一个技术社区,,,分享的不应该是一个软件、脚本能做什么,而分享如何做的技术。我们更关心是你如何实现这些功能的。
比如查询的结果是来自某个网站的内容,还是显示字典里的内容。

......

好像真是没说清楚。翻译是连接到 google 的服务器进行的。

对于如何实现的问题比较复杂,我认为脚本很长并且是 javascript ,里面用了很多正则表达式来解析参数,分析数据,验证等,可能很多人不好弄懂因此没贴出来。

如果需要的话说一声我就会贴出包含注释的代码来。

   此帖被 -1 点积分    点击查看详情   
评分人:【 zz100001 分数: -1  时间:2010-4-9 09:50


2009-8-10 04:42
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 4 楼』:  

需要,请贴出源代码。



2009-8-10 08:25
查看资料  发短消息 网志   编辑帖子  回复  引用回复
metoo
初级用户





积分 195
发帖 93
注册 2006-10-28
状态 离线
『第 5 楼』:  

"\u7a0b\u5e8f\u81ea\u6821\u9a8c\u5931\u8d25\u5e76\u505c\u6b62\u5de5\u4f5c\uff01\u53ef\u80fd\u662f\u56e0\u4e3a\u672c\u6587\u4ef6\u5df2\u7ecf\u88ab\u975e\u6cd5\u4fee\u6539\uff01"
这样的东西是写的?怎么感觉像是加密过的?

2009-8-10 08:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zouzhxi
中级用户

蝴蝶之吻


积分 430
发帖 177
注册 2006-9-20
来自 广东深圳
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by metoo at 2009-8-10 08:40:
"\u7a0b\u5e8f\u81ea\u6821\u9a8c\u5931\u8d25\u5e76\u505c\u6b62\u5de5\u4f5c\uff01\u53ef\u80fd\u662f\u56e0\u4e3a\u672c\u6587\u4ef6\u5df2\u7ecf\u88ab\u975e\u6cd5\u4fee\u6539\uff01"
这样的 ...

这个是unicode编码吧。不是加密码的吧。囧



Butterfly Kiss Blog
计算机DIY联盟论坛
2009-8-10 11:15
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (234693993)  编辑帖子  回复  引用回复
zouzhxi
中级用户

蝴蝶之吻


积分 430
发帖 177
注册 2006-9-20
来自 广东深圳
状态 离线
『第 7 楼』:  

本人使用IE8,右键没有此选项,还有就是REGEDIT里边根本找不到任何信息。囧



Butterfly Kiss Blog
计算机DIY联盟论坛
2009-8-10 11:22
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (234693993)  编辑帖子  回复  引用回复
metoo
初级用户





积分 195
发帖 93
注册 2006-10-28
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by zouzhxi at 2009-8-10 11:15 AM:


这个是unicode编码吧。不是加密码的吧。囧

见过毒网分析的加密代码和这有点像。。话说我vbs、js这类是完全不懂

2009-8-10 11:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
qinchun36
高级用户

据说是李先生


积分 609
发帖 400
注册 2008-4-23
状态 离线
『第 9 楼』:  

这里只贴出head里面脚本部分的代码,页面 body 中有三个生成下拉菜单的地方引用了这里面的函数。

关于正则表达式无法解释,不懂只能去看资料。

说明一下这个工作的重点不是如何添加到右键菜单,我只在自己机器IE7上试了有,CHM文档中也有,如果其他版本或者浏览器可以修改添加注册表的那段代码就行。当然还需要修改创建XMLHTTP对象那段,我没用其他浏览器,因此也没写他们的部分。

还有就是这段代码针对的标题信息和页面下方的"(C)2009***"和我发的附件不同,注释里面有解释。
<!-- 下面这个SCRIPT 段是全局变量和公共函数 -->
<script type="text/javascript" language="javascript">
var oriLang;              //  原始语言代码
var tarLang;              //  翻译后的语言代码
var enableLog;            //  是否启用记录历史。 true 为记录, false 不记录
var logFile;              //  历史记录文件地址
var httpReq;              //  XMLHTTP对象
var rt;                   //  临时存放错误信息或者服务器返回信息
var imURL;                //  本页URL
var relURL;               //  本页面在注册表信息中的引用地址(含参数)

//  临时变量(这个是全局的,很多地方都会修改它,另外网页中有个DIV元素我也定义成这个名字,是为了迷惑)
var tmpStr = "程序自校验失败并停止工作!可能是因为本文件已经被非法修改!";

//  Google 翻译引擎(这个只是模型,实际用时会替换其中的参数)
var actionURL = "http://translate.google.com/translate_a/t?client=t&text=[utf8_url_encoded_text]&sl=[original_language]&tl=[target_language]&swap=1";

//  如果是右键引用就得到父页面的 document 对象
try {var pDoc=external.menuArguments.document;}catch(e){}

//  支持的语言列表
var langCode = [["sq","阿尔巴尼亚文"],["ar","阿拉伯文"],["et","爱沙尼亚语"],["bg","保加利亚文"],["pl","波兰语"],["ko","朝鲜语"],["da","丹麦语"],["de","德语"],["ru","俄语"],["fr","法语"],["tl","菲律宾文"],["fi","芬兰语"],["nl","荷兰语"],["gl","加利西亚语"],["ca","加泰罗尼亚语"],["cs","捷克语"],["hr","克罗地亚文"],["lv","拉脱维亚语"],["lt","立陶宛语"],["ro","罗马尼亚语"],["mt","马耳他文"],["no","挪威语"],["pt","葡萄牙语"],["ja","日语"],["sv","瑞典语"],["sr","塞尔维亚文"],["sk","斯洛伐克文"],["sl","斯洛文尼亚文"],["th","泰文"],["tr","土耳其文"],["uk","乌克兰文"],["es","西班牙语"],["iw","希伯来语"],["el","希腊语"],["hu","匈牙利语"],["it","意大利语"],["hi","印度文"],["id","印尼文"],["en","英语"],["vi","越南文"],["zh-CN","中文(简体)"],["zh-TW","中文(繁体)"]];

//--- 检查引用我的网址是否正确并获取参数
function checkMe() {
  imURL = window.location.toString();
  // 检查引用我的网址是否形如  【我的全路径】.htm?from=原始语言代码&to=目标语言代码&log=是否记录日志&logfile=日志文件全路径
  if(/^.*\?from=(.+)&to=(.+)&log=(.+)&logfile=(.+)$/.test(imURL)) {
    //如果是就取得参数
    oriLang = RegExp.$1;
    tarLang = RegExp.$2;
    enableLog = RegExp.$3;
    logFile = decodeURI(RegExp.$4);
    //呵呵,这段是出于保护版权,验证网页标题是(或者非常接近)
    // “(P)&(C)2009『据说是李先生』caofackri@gmail.com” 才返回 true
    // 当然你可以直接返回 true
    return /^.*\d{4}().{8}\1(c)(.).+\3\2..+(\w)\W..\3\4.*\D$/.test(document.title.toString());
  } else {
    return false;
  }
}

//--- 记录翻译的历史到本地文件(采用UNICODE格式)
function recordHis(translateResult) {
  var f;
  // 当前时间
  var thisTime = new Date();
  // 当前网址
  var thisURL = decodeURI(pDoc.URL.toString());
  var headStr = "Translate Log File created by 『据说是李先生』 automaticly.\r\r\r";
  var textRecord = "\r\r=========================== "+thisTime.toLocaleString()+" ==============================\r┍━━━━━━┑\r│『当前网址』│\r┷━━━━━━┷━━━━━━━━\r"+thisURL+"\r\r"+translateResult;
  try {
    var fso=new ActiveXObject("Scripting.FileSystemObject");
    // 如果日志文件不存在先创建
    if(!fso.FileExists(logFile)) {
      f = fso.CreateTextFile(logFile,true,true);
      f.Write(headStr);
      f.Close();
    }
    // 写入此次翻译结果
    f = fso.OpenTextFile(logFile, 8, false, true);
    f.Write(textRecord);
    f.Close();
  } catch(e) {
    // 如果记录过程发生错误给出提示
    window.alert("翻译结果记录失败!\r\r请确认这个文件夹存在并且你有往其中写入文件的权限:\r\r "+logFile.replace(/^(.*)[\\\/].+$/,"$1")+"\r\r\r错误信息:\r"+e.message);
  }
}
</script>


<!-- 下面这个SCRIPT 段是与翻译相关的函数 -->
<script type="text/javascript" language="javascript">

//--- 连接服务器 (仅使用于 IE 浏览器)
function getReply(encodedURL) {
  rt = "";
  // 创建 XMLHTTP 对象,针对不同的浏览器和版本名称可能不同,这里只针对IE
  try {
    httpReq = new ActiveXObject("Microsoft.XMLHTTP");
  } catch(e) {
    try {
      httpReq = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
        rt += "创建XMLHTTP对象失败,可能你使用的不是IE浏览器。\r\r错误信息:\r" + e.message + "\r\r";
        return rt;
    }
  }
  try {
    // 回调函数,就是指明当连接服务器状态改变时调用函数 getTranslateServer()
    httpReq.onreadystatechange = getTranslateServer;
    // 采用同步方式
    httpReq.open("GET", encodedURL, false);
    httpReq.send(null);
  } catch(e) {
    rt = "连接服务器失败!\r\r错误信息:\r" + e.message+ "\r\r";
  }
  return rt;
}

//--- 获取返回信息
function getTranslateServer() {
  if(httpReq.readyState == 4) {
    if(httpReq.status == 200) {
      // 获取服务器返回的字符串
      rt = httpReq.responseText;
    } else {
      rt = "翻译失败!\r\r";
    }
  }
}

//--- 根据语言编码获取语言的文字描述
function getLangDesc(code) {
  for(var i=0; i<langCode.length; i++) {
    if (langCode[i][0]==code) {
      return langCode[i][1];
    }
  }
}

//--- 处理服务器返回的信息使其便于阅读
function formatText(TranslateServerReturnedText) {
  var ts1=TranslateServerReturnedText;
  // 包装头部,样式为 “选定文字” ***“语种”***“选中的文字”***“翻译结果”
  var ft =   "┍━━━━━━┑\r│『选定文字』│ " + getLangDesc(oriLang) + "\r┷━━━━━━┷━━━━━━━━\r" + pDoc.selection.createRange().text.toString() + "\r\r┍━━━━━━┑\r│『翻译结果』│ " + getLangDesc(tarLang) + "\r┷━━━━━━┷━━━━━━━━\r";
  // 如果返回的形如“[***]”表示有多个解释,一般为单词
  if (/^\[.*\]$/.test(ts1)) {
    // 将它分割成 [$1,$2] , 其中 $1 是解释,$2是词典数组
    /^\[(\".+\"),(\[.*\])\]$/.test(ts1);
    // 将 $2 真正的变成数组 ts2
    var ts2 = eval(RegExp.$2);
    ft += (RegExp.$1).replace(/\"/g,"") + "\r\r┍━━━━┑\r│『词典』├─→  " + pDoc.selection.createRange().text.toString() + "\r┕━━━━┙\r";
    // 将全部解释附加到后面
    for(var i=0; i<ts2.length; i++) {
      ft += "  [" + ((ts2[i][0]=="")?"常用":ts2[i][0]) +"]\r";
      for(var j=1; j<ts2[i].length; j++) {        
        ft += "      " + j + (j>9?".  ":".   ") + ts2[i][j] + "\r";
      }
      ft += "\r";
    }
  } else if (/^\"(.*)\"$/.test(ts1)) {
      // 返回的是 "***" 样式的表示只有一个结果
      var ts2 = eval(ts1);
      ft += ts2 + "\r\r";
  } else {
      // 返回的是错误信息就不处理
      return ft +"\r"+ ts1 + "\r\r";
  }
  return ft;
}


//---统筹函数:按顺序完成翻译过程
function translate() {
  //  获取选定文本
  tmpStr = pDoc.selection.createRange().text.toString();
  //  转换成 UTF-8 格式的 URL 编码
  tmpStr = encodeURI(tmpStr);
  //  将要翻译的文本、原始语言、目标语言补充进 actionURL 形成完成地址
  tmpStr = actionURL.replace(/^(.*)\[utf8_url_encoded_text\](.*)\[original_language\](.*)\[target_language\](.*)$/, "$1"+tmpStr+"$2"+oriLang+"$3"+tarLang+"$4");
  //  获取返回结果
  tmpStr = getReply(tmpStr);
  //  处理这个结果形成最后显示的样子
  tmpStr = formatText(tmpStr);
  //  屏幕显示翻译结果
  window.alert(tmpStr);
  //  记录历史
  if(enableLog=="true") try{recordHis(tmpStr);} catch(e){}
}
</script>


<!-- 下面这个SCRIPT 段是与本页面和添加右键菜单相关的函数 -->
<script type="text/javascript" language="javascript">

//--- 获取一个元素
function getE(e1) {
  return document.getElementById(e1);
}

//--- 预加载
function preLoad() {
    getE("mainDiv").style.display = "";
    getE("infoDiv").style.display = "none";
}

//--- 根据选择内容改变“显示名称”
function giveName() {
   getE("extName").value = langCode[getE("oriLang").selectedIndex][1] + ">>" + langCode[getE("tarLang").selectedIndex][1] ;
}

//--- 控制历史记录是否可用
function changeLog() {
  getE("logFile").disabled = (getE("enableLog").checked)?"":"disabled";
}

//  根据数组动态生成 SELECT 元素
function makeSelectByArray(elementName, onChangeDo, valueArrayN2) {
  var n = valueArrayN2.length;
  document.write("<select id=\""+elementName+"\" name=\""+elementName+"\" onChange=\""+onChangeDo+"\" >");
  for(var i=0; i<n; i++) {
    document.write("<option value=\""+valueArrayN2[i][0]+"\">"+valueArrayN2[i][1]+"</option>");
  }
  document.write("</select>");
}

//  根据一个值范围动态生成 SELECT 元素
function makeSelectByRange(elementName, onChangeDo, descFormat, intLow, intHigh) {
    document.write("<select id=\""+elementName+"\" name=\""+elementName+"\" onChange=\""+onChangeDo+"\" ><option value=' '> </option>");
    for(var i=intLow; i<=intHigh; i++) {
        document.write("<option value='"+String.fromCharCode(i)+"'>"+descFormat.replace(/\[VALUE\]/g, String.fromCharCode(i))+"</option>");
    }
    document.write("</select>");
}

//--- 判断信息是否准备好
function isOK() {
  // 是否勾选“记录历史”
  enableLog = getE("enableLog").checked;
  // 历史记录文件
  logFile = getE("logFile").value;
  if(getE("extName").value=="") {
    tmpStr = "你还没填写这个翻译选项在IE右键中显示名称!";
    return false;
  }
  // 如果勾选了记录历史,检验填写的日志文件路径是否合法
  if(enableLog) {
    // 如果符合格式 “【单个字母】:【/或者\】【至少一个字符】”
    if(/^[a-zA-Z]\:[\\\/].*[\\\/]?.{1,}$/.test(logFile)) {
      // 如果除盘符后的字符串中出现非法字符
      if(/^.{2}.*[\:\*\?\"\<\>\|]+.*$/.test(logFile)) {
        tmpStr = "文件路径中不能包含 * ? \" < > | 等字符,且 : 只能跟在盘符后!";
        return false;
      }
    } else {
      tmpStr = "你填写的历史记录文件路径格式不对!\r\r  示例:\r\rD:\\transLog.log";
      return false;
    }
  } else {
    logFile = "noLogFile";
  }
  // 这个也是出于保护,当页面最下面那个文字是“C2009『据说是李先生』caofackri@gmail.com”才返回true
  // 可以直接改成 true
  return /^.\d{4}().{8}\1(c)(.).+\3\2..+(\w)\W..\3\4.*\D$/.test(getE("tmpStr").innerText);
}

//--- 将信息添加到注册表
function addReg() {
  // 检验所需的信息不符合规定则弹出警告信息并推出
  if(!isOK()) {
    window.alert(tmpStr);
    return false;
  }
  // 构建引用我的网址
  relURL = decodeURI(imURL)+"?from="+getE("oriLang").value+"&to="+getE("tarLang").value+"&log="+enableLog.toString()+"&logfile="+encodeURI(logFile);
  try{
    var ching = new ActiveXObject("WScript.Shell");
    // 写入注册表
    try {
      ching.regwrite("HKEY_CURRENT_USER\\Software\\Microsoft\\Internet Explorer\\MenuExt\\"+getE("extName").value+(getE("hk").value==" "?"":("(&"+getE("hk").value+")"))+"\\", relURL, "REG_SZ");
      window.alert("添加成功, 重新启动 IE 即可在右键菜单中看到此选项。");
    }catch(e){
       window.alert("添加失败!不能写入注册表,请检查你的权限!\r\r错误信息:\r" + e.message);
       return false;
    }
  }catch(e){
    window.alert("添加失败,可能是由于安全设置中对脚本的限制,或者你刚才点“否”造成的!\r请更改设置后重启IE再试。\r\r错误信息:\r" + e.message);
    return false;
  }
}
</script>


<!-- 下面这个 SCRIPT 段是主控流程 -->
<script>
  // 检验引用我的网址符合翻译的样式
  if(checkMe()) {
      translate();
  } else if(/^.+htm$/.test(imURL)) {
      // 不然的话,如果是直接打开本页面
      preLoad();
  } else {
      // 如果是引用参数错误,这个情况应该只出现在手动添加注册表或者直接在地址栏输信息的情况
      if(!/^.*\?from=(.+)&to=(.+)&log=(.+)&logfile=(.+)$/.test(imURL)) {
          tmpStr = "引用本页面的URL地址参数错误,请修正后再试!\n\n正确格式为:\n"+decodeURI(imURL.replace(/\?.*$/gi,""))+"?from=原始语言代码&to=目标语言代码&log=是否记录日志&logfile=日志文件全路径\n\n强烈建议进入以下页面进行设置:\r"+decodeURI(imURL.replace(/\?.*$/gi,""));
      }
      // 如果标题信息被改变
      window.alert(tmpStr);
  }
</script>
[ Last edited by qinchun36 on 2009-8-10 at 23:29 ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 metoo 分数: +2  时间:2009-8-11 08:19


2009-8-10 23:21
查看资料  发送邮件  发短消息 网志  OICQ (182484135)  编辑帖子  回复  引用回复
defanive
初级用户





积分 111
发帖 62
注册 2007-12-31
状态 离线
『第 10 楼』:  

如果是我的话,我会用vbs,后台开一个internetexplorer.application控件,进入google翻译后直接取得内容,返回就是了。。。

2009-8-11 00:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: