/*** *@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;
})();