js实现简体繁体转换插件(全业态)并真实应用于项目

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

})();

转载于:https://my.oschina.net/u/1246814/blog/263068

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值