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