/*** *@TITLE <javasrctipt中文简体转换为繁体AND中文转换英文插件> *@TIME 2014/4/27 22:10 *@AUTHOR 任孟洋(RMY) RenMengYangIT@163.com *@封装模式为自调用匿名函数(function(){})(); 这样的好处是开发不污染顶层变量,防止在项目中多人开发时函数重命名 *解释: var i = function(){ alert(xx);} ; i() ;与 (function(){ alert(xxx);})();是相同的 * 转换英文:我准备用goole的APi作 *Cookie的增查 *中文字符库(从百度而来字体因为,我用的经常使用的字库,那么翻译率为80%以上); *使用实例: * <html> *<script type="text/javascript"> * window.onload = function () { * $.init('xxx'); * } *</script> * <a id="xxx" >繁體中文</a> * <html> *配置项:Simplified_lib 中文简体包 *配置项:Traditional_lib繁体简体包 *顺便说一下,代码在oschina的发布,代码有点乱,原本很工整的嘛 **/ (function(){
// 默认配置文件 var Config = { ExpiresDay : 1 , //Cookie的默认过时的时间 DefaultCoding : 0, //默认是否繁体,0:简体,1:繁体,2: 中文转英文(这里不能修改) TranslateDelay : 40, //翻译延时毫秒(定时器多少时间内进行翻译) SelectDemo : '||BR|HR|TEXTAREA|INPUT|' , Simplified_lib : ' ' //简体语言包 Traditional_lib:' ' //繁体语言包 };
// 封装一个经常使用的dom操做--dom操做- var RMY = function(id) { return document.getElementById(id); };
RMY.AllBodyNodes = function () { return document.body.childNodes; }
//封装一个检查当前是繁体||简体的操做 RMY.init = function(id){ Dom_Obj = RMY(id) ; if ( Dom_Obj ) { //self.location.hostname self表示wiondws .location表示url . hostname:主机名字 并域名中的.替换成空 Host_Cn = "RMY"+self.location.hostname.toString().replace(/\./g,""); HostBodyCoding = RMY.GetCookie(Host_Cn); //定义全局变量 if ( HostBodyCoding != "1") HostBodyCoding= Config.DefaultCoding; /* 可扩展处 switch (HostBodyCoding) { case '0' : case '1' : case '2': } */ with(Dom_Obj){ //取得A标签元素
if (window.ActiveXObject){ //IE浏览器 href="#"; //向A中添加属性 nclick= new Function("$.ConvertBody();return false"); //添加一个事件 }else{ //w3c标准 href="javascript:$.ConvertBody()"; //添加属性 } title = RMY.CheckFont("繁体中文浏览",1,1); //添加属性 innerHTML = RMY.CheckFont(innerHTML,1,1); //填充内容
} HostBodyCoding == "1" ? setTimeout("$.ConvertBody()",Config.TranslateDelay) : '';//在隔多少时间进行自动翻译 };
};
//执行翻译递归解析出元素值与文本,再进行转换
RMY.ConvertBody = function (Dom_Html) {
if (typeof(Dom_Html) === "object" ) { var Dom_BodyNodes = Dom_Html.childNodes ; //得到页面中全部的HTMldome元素 这一步是为了递归考虑
} else { //若是未定义对象 var txt = Dom_Obj.innerHTML.toString(); if (txt.indexOf("简")<0) { HostBodyCoding = 1 ; //变成繁体 Dom_Obj.innerHTML=RMY.CheckFont(txt,0,1); //原理的繁体变简体 Dom_Obj.title =RMY.CheckFont(Dom_Obj.title ,0,1); //原理的简体变繁体 } else { HostBodyCoding = 0 ; //变简体 Dom_Obj.innerHTML=RMY.CheckFont(txt,1,1); Dom_Obj.title =RMY.CheckFont(Dom_Obj.title ,1,1); }
RMY.SetCookie(Host_Cn,HostBodyCoding); //获取网页的全部的Dome元素
var Dom_BodyNodes = RMY.AllBodyNodes(); //若是定义了对象 } //取出dom元素下的系类文本 ... for(var i=0;i<Dom_BodyNodes.length;i++) { var Chlid=Dom_BodyNodes.item(i); if(Config.SelectDemo.indexOf("|"+Chlid.tagName+"|") > 0 || Chlid == Dom_Obj) continue; if(Chlid.title!=""&&Chlid.title!=null)Chlid.title=RMY.CheckFont(Chlid.title.replace(/^\s+|\s+$/g,"")); //取出Title if(Chlid.alt!=""&&Chlid.alt!=null)Chlid.alt=RMY.CheckFont(Chlid.alt.replace(/^\s+|\s+$/g,"")); //去alert if(Chlid.tagName=="INPUT"&&Chlid.value!=""&&Chlid.type!="text"&&Chlid.type!="hidden") Chlid.value=RMY.CheckFont(Chlid.value.replace(/^\s+|\s+$/g,"")) ; if(Chlid.nodeType==3){Chlid.data=RMY.CheckFont(Chlid.data.replace(/^\s+|\s+$/g,"")); }else{ RMY.ConvertBody(Chlid); //递归 }; }
}
//检查当前字体 RMY.CheckFont = function(txt,toFT,chgTxt){ if(txt==""||txt==null)return "" toFT=toFT==null?HostBodyCoding:toFT;
if (chgTxt) txt = txt.replace((toFT?"简":"繁"),(toFT?"繁":"简")); if (toFT) {
return RMY.FontChanger(txt,1); } else {
return RMY.FontChanger(txt,0) } }; //字体转换 //Tap 0 简体 1:繁体 2:英文 RMY.FontChanger= function(txt,Tap=1){ var Str='',Str_Simplified =Config.Simplified_lib,Str_Traditional=Config.Traditional_lib; var StrLen =txt.length; //长度 switch (Tap) { case 0 : //繁体转简体 for (var i =0; i<StrLen; i++) { var StrIndex = Str_Traditional.indexOf(txt.charAt(i)); //在简体字库中搜索文本下标 if(txt.charCodeAt(i)>10000&&StrIndex !=-1) { //排除没搜索到的而且Undecde编号要大于10000 Str +=Str_Simplified.charAt(StrIndex); //到繁体字库中去查找索引下标为Strndex 文 字 } else { Str +=txt.charAt(i); //文字中有简体 } } break; case 1 : //简体转繁体 for (var i =0; i<StrLen; i++) { var StrIndex = Str_Simplified.indexOf(txt.charAt(i)); //在简体字库中搜索文本下标 if(txt.charCodeAt(i)>10000&&StrIndex !=-1) { //排除没搜索到的而且Undecde编号要大于10000 Str+=Str_Traditional.charAt(StrIndex); //到繁体字库中去查找索引下标为Strndex 文字 } else { Str+=txt.charAt(i); //文字中有简体 } } break; case 2 : break; }
Str_Simplified = null ; Str_Traditional = null; StrIndex= null; //变量销毁
return Str ; }
//封装一个设置Cookie //arguments获取当前函数的参数的列表, //若是当前参数大于了2个说明设置了多个参数那么第三个参数就是设置的过时时间 //直接把第三个参数的值赋值ExpiresTime,若是没设置那么直接为空, //若是写的比较严谨的话这里还要对第三个参数的进行验证,必须数字类型,目前就先不写了,其实也不太影响 RMY.SetCookie = function(Name,Value) { var ExpiresDay = (arguments.length> 2) ? arguments[2] : Config.ExpiresDay; var LargeExpDate = new Date (); LargeExpDate.setTime(LargeExpDate.getTime() + (ExpiresDay*1000*3600*24)); document.cookie = Name + "="+ escape (Value) + ";expires=" + LargeExpDate.toGMTString(); //写入Cookie }
//封装一个获取Cookie RMY.GetCookie = function(Name) { var Search = Name + "="; if(document.cookie.length > 0) { Offset = document.cookie.indexOf(Search) ; //查找字符的开始位置 if (Offset != -1) //没有当前的Cookie { Offset += Search.length; End = document.cookie.indexOf(";", Offset); if (End == -1) End = document.cookie.length; return unescape(document.cookie.substring(Offset, End)); }else{return '';}
} }
window.$ = RMY;
})();