『第
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 |
|
|