首页 > 编程 > JavaScript > 正文

基于JavaScript实现快速转换文本语言(繁体中文和简体中文)

2019-11-20 10:26:21
字体:
来源:转载
供稿:网友

一般商业网站都有一个语言的需求,就是为了照顾使用正体中文的国人,会特地提供一个切换到正体中文的选项(或曰“繁体中文”)。传统做法是在服务端完成的,即通过某些控件或者过滤器转换文本语言。这里笔者介绍一种简单可行的方法,不是在服务端而是利用前端的 JavaScript 就可以切换正体中文。
如下图,我们把切换按钮放在页脚(当然你也可以放置在“导航”或者其他更醒目的位置)。

由于页面假设设定均使用 Unicode 字符集,于是一般不用考虑 GB2312/BIG5 字符集问题,伟大的 Unicode 字符集已经涵盖了繁体字的字符了(UTF-8 编码)。

怎么在页面调用这个功能呢?很简单,首先引入下面 Js(注意还依赖 Function.prototype.delegate(), 下面会提及):

;(function(){  var 简化中文 = '啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸尽劲荆兢觉决诀绝均菌钧军君峻俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座';  var 正体中文 = '啊阿埃挨哎唉哀癌矮艾隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬傲懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙霸爸白柏百佰拜稗斑班搬扳般板版扮拌伴瓣半邦梆榜膀棒磅蚌傍苞胞包褒薄雹保堡抱暴豹爆杯碑悲卑北背倍焙被奔苯本笨崩甭泵蹦迸逼鼻比鄙彼碧蓖蔽毖庇痹敝弊必辟壁臂避陛鞭扁便卞辨遍彪膘表憋彬斌兵冰柄丙秉炳病玻菠播波博勃搏箔伯帛舶脖膊渤泊捕哺埠不布步簿部怖擦猜裁材才睬踩采彩菜蔡餐藏操糙槽曹草策蹭插叉茬茶查碴搽察岔差拆柴豺昌猖常敞唱倡超抄朝嘲潮巢吵炒扯撤掣澈郴臣辰晨忱沈趁城橙成呈乘程澄承逞秤吃持匙池弛侈尺赤翅斥充崇抽酬稠愁仇瞅臭初出躇滁除楚矗搐揣川穿椽船喘串窗幢床吹炊捶垂春椿醇唇淳蠢戳疵茨磁雌慈瓷此刺次匆粗醋簇促篡摧崔催脆瘁粹淬翠村存寸磋撮搓措挫搭答瘩打大呆歹傣戴殆代袋待逮怠耽丹旦氮但淡蛋刀蹈倒到稻悼道德得的蹬登等瞪凳堤低滴迪笛狄翟嫡抵底地蒂第帝弟掂滇碘典靛佃甸店惦奠殿碉叼雕凋刁掉吊跌爹碟蝶叠丁盯叮鼎定冬董懂侗恫洞兜抖陡豆逗痘都督毒堵睹杜肚度渡妒端短段堆墩蹲敦囤盾遁掇哆多垛躲朵跺舵剁惰蛾峨俄娥厄扼遏鄂恩而耳洱二筏伐乏法藩帆番翻樊繁凡反返犯泛坊芳方肪房防妨仿放菲非啡肥匪吠肺沸芬酚吩氛分焚汾粉份忿封蜂峰烽逢奉佛否夫敷孵扶拂幅氟符伏俘服浮涪福袱弗甫俯釜斧脯腑府腐赴副覆傅付阜父腹富附咐噶嘎改概溉甘杆柑竿肝感敢缸肛港杠篙高膏羔糕搞稿告哥歌戈胳疙割革葛格蛤隔各根跟耕更庚羹埂耿梗工攻功恭供躬公弓汞拱共勾苟狗垢辜菇咕箍估沽孤姑鼓古骨谷股故固雇刮瓜寡挂褂乖拐怪棺官冠管罐灌光逛瑰圭矽鬼癸桂跪棍郭果裹哈骸孩海氦亥害酣憨邯含涵寒函喊罕翰撼捍旱憾悍焊汗夯杭航壕嚎豪毫郝好耗浩呵喝荷菏核禾和何合盒貉河涸赫褐嘿黑痕很狠恨哼亨衡恒哄烘虹洪宏弘喉侯猴吼厚候後呼乎忽瑚葫胡蝴狐糊湖弧虎唬互花猾滑化槐徊淮桓患豢宦幻荒慌磺蝗簧皇凰惶煌晃幌恍灰徽恢蛔回悔慧卉惠晦昏婚魂混豁活夥火或惑霍圾基畸稽箕肌迹激姬吉棘籍集及急疾汲即嫉脊己技冀季伎祭悸寄寂既忌妓嘉枷佳家加甲假稼架嫁尖煎兼肩奸柬剪箭件健建僵姜江疆匠降蕉椒礁焦交郊嚼狡角剿教酵叫窖揭接皆街截劫睛晶京精粳井警景境敬靖竟炯窘揪究玖韭久灸九酒救臼舅咎就疚鞠拘狙疽居菊局咀矩沮聚拒巨具距踞俱句炬捐娟倦眷卷撅攫抉掘倔爵桔捷睫竭解姐戒藉芥界借介疥巾筋斤金今津襟靳禁近浸兢均菌君峻俊竣浚郡喀咖卡咯揩楷慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕科咳可渴克刻客肯啃坑吭空恐孔控口扣寇枯哭窟苦酷垮挎跨胯筷快款匡筐狂框眶盔葵奎魁傀愧坤昆捆困括廓垃拉喇辣啦婪琅榔狼廊郎朗浪牢老佬姥酪烙勒雷蕾磊累儡擂肋棱楞冷厘梨犁黎狸漓理李莉荔吏栗利傈例俐痢立粒力璃哩廉梁粱良量晾亮撩聊僚燎寥潦了撂廖料列裂烈劣琳林磷霖淋吝拎玲菱零伶羚陵另令溜琉榴硫留瘤流柳六窿隆漏陋麓碌露路鹿潞戮旅履氯律率卵掠略螺裸落洛麻嘛埋蔓曼慢漫芒茫盲氓忙莽茅毛矛卯茂冒帽貌麽玫枚梅酶煤眉媒每美昧寐妹媚萌蒙檬盟猛孟眯醚靡糜迷米秘泌蜜密棉眠冕免勉娩面苗描瞄藐秒渺妙蔑民抿皿敏明螟名命摸摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌牟某拇牡姆母墓暮幕募慕木目睦牧穆拿哪呐那娜氖乃奶耐奈南男囊淖呢嫩能妮霓倪泥尼你匿逆溺蔫拈年碾念娘尿捏孽涅您凝甯牛扭弄奴努怒女暖虐挪懦糯哦藕偶啪趴爬帕怕琶拍排牌徘湃派攀潘磐盼畔判叛乓旁耪胖抛咆刨炮袍跑泡呸胚培裴陪配佩沛盆砰抨烹澎彭蓬棚硼篷膨朋捧碰坯砒霹批披劈琵毗啤脾疲皮匹痞僻屁譬篇偏片漂瓢票撇瞥拼品聘乒坪萍平瓶屏坡婆破魄迫粕剖仆莆葡菩蒲埔圃普浦曝瀑期欺戚妻七漆柒沏其棋奇歧畦崎旗祈祁起乞企契砌器迄汽泣掐洽千仟乾黔前遣嵌欠歉腔羌橇敲悄瞧巧鞘撬峭俏切茄且怯侵秦琴勤芹擒禽沁青卿清擎晴氰情秋丘邱球求囚酋泅蛆曲屈渠取娶趣去圈醛泉全痊拳犬券缺炔瘸榷雀裙群然燃冉染瓤壤攘嚷惹壬仁人忍任刃妊扔仍日戎茸蓉融熔溶容冗揉柔肉茹蠕儒孺如辱乳汝入褥阮蕊瑞若弱撒腮塞三三散桑嗓搔嫂瑟色森僧莎砂刹沙傻啥煞珊苫杉山煽衫擅膳善汕扇墒商晌上尚裳梢捎稍芍勺韶少哨邵奢蛇舌舍赦射涉社砷申呻伸身深娠神沈甚慎生甥牲升省盛剩失施虱十石拾什食史矢使屎始式示士世柿事拭誓逝是嗜噬仕侍氏市恃室收手首守授售受瘦蔬梳殊抒叔舒淑疏孰熟薯暑曙署蜀黍鼠述束戍墅庶漱恕刷耍摔衰甩栓拴霜爽水睡吮瞬舜朔斯撕嘶思私司死肆寺嗣四伺似巳松送宋搜艘嗽酥俗素速粟僳塑溯宿酸蒜算隋髓碎穗遂隧祟蓑梭唆索所塌他它她塔蹋踏胎苔台泰酞太汰坍檀痰潭坦毯袒碳探炭塘搪堂棠膛唐糖倘躺淌趟掏滔萄桃逃淘陶套特藤疼梯剔踢提蹄啼替嚏惕涕剃天添填田甜恬舔腆挑迢眺跳帖汀廷停亭庭挺艇通桐酮瞳同彤童桶捅筒痛偷投透凸突徒途屠土吐兔湍推腿褪退吞屯臀拖托陀妥拓唾挖哇蛙娃瓦歪外豌玩丸烷完碗挽晚皖惋宛婉腕汪王亡枉往旺望忘妄威巍微危桅唯惟萎委尾未蔚味畏胃魏位渭尉慰瘟蚊文吻紊嗡翁我斡握沃巫屋梧吾毋武五捂午舞伍侮戊晤物勿悟昔熙析西硒矽晰嘻吸稀息希悉膝夕惜熄烯溪汐犀檄席媳喜洗系隙瞎匣霞暇下夏掀先仙舷涎弦嫌腺陷限相香箱襄湘翔祥想享巷橡像向象硝霄削哮消宵淆小孝校肖笑效楔些歇鞋邪斜械卸蟹懈泄屑薪芯欣辛新忻心信星腥猩惺刑型形邢行醒幸杏性姓兄凶胸匈雄熊休修羞朽嗅秀袖墟戌需徐蓄酗旭序畜恤絮婿喧宣旋玄眩靴薛穴雪血熏循旬巡殉汛迅押呀丫芽牙蚜崖衙涯雅焉咽淹研蜒岩延言炎沿奄掩眼衍演堰燕雁唁焰宴殃央秧佯羊洋氧仰漾邀腰妖姚咬舀要耀椰噎耶野冶也掖曳腋夜液一壹揖依伊衣夷移胰疑沂宜姨椅倚已乙矣以抑易邑屹役臆逸肄疫亦裔意毅益溢翼翌茵因殷音姻吟淫寅尹引印英迎盈影硬映臃庸雍蛹泳永恿勇用幽悠尤由油酉有友右佑釉又幼迂淤于盂榆虞愚余俞逾愉渝隅予雨禹宇羽玉域芋郁遇喻峪愈欲育浴寓裕豫冤元垣袁原援猿源苑怨院曰越月耘允孕匝砸栽哉宰再在咱葬遭糟藻早澡蚤躁噪造皂燥怎增憎曾喳渣眨榨咋乍炸摘宅窄寨瞻詹粘沾展蘸占站湛樟章彰漳掌杖丈仗瘴障招昭找沼照罩兆肇召遮折哲者蔗浙珍斟真甄砧臻枕疹震振蒸征怔整拯正政症芝枝支吱蜘知肢脂汁之直植殖值侄址指止趾只旨志至致置峙制智秩稚炙痔治窒中盅忠衷重仲舟周州洲粥肘帚咒宙珠株蛛朱逐竹煮拄主著柱助蛀住注祝抓爪拽撰篆撞椎追准捉拙卓桌琢茁酌啄著灼咨姿滋淄孜紫仔籽滓子自字鬃棕宗走奏揍租足卒族祖阻纂嘴醉最罪尊遵昨左佐柞做作坐座';   /**   * 默认是否正体中文:true为正体;false简体。 HTTP   * 头读取:Request.ServerVariables("http_accept_language")   *   * @return {Boolean}   */  function getClientLanguage() {   var s = navigator.userLanguage || navigator.language;   switch (s.toLowerCase()) {   case 'zh-cn':    return false;   case 'zh-tw':    return true;   default:    return null;   }  }    /**   * 转换对象,使用递归,逐层剥到文本   * @param {HTMLElement} obj 从document.body开始,   */  function translate(el, coverntFn){   el = el.childNodes;   var node;   for (var i = 0, j = el.length; i < j; i++) {    node = el.item(i); // || (node == $$.big5.el)    if (("||BR|HR|TEXTAREA|".indexOf("|" + node.tagName + "|")) > 0)continue;        if(node.title){     node.title = coverntFn(node.title);    }else if(node.alt){     node.alt = coverntFn(node.alt);    }else if(node.tagName == "INPUT" && node.value != "" && node.type != "text" && node.type != "hidden"){     node.value = coverntFn(node.value);    }else if(node.nodeType == 3){     node.data = coverntFn(node.data);    }else{     arguments.callee(node, coverntFn);    }     }  }    function translateText(text, isBig5) {   var str = [], _char, charIndex, result;    for (var i = 0, j = text.length; i < j; i++) {    _char = text.charAt(i);    charIndex = isBig5 ? 简化中文.indexOf(_char) : 正体中文.indexOf(_char);    result = isBig5 ? 正体中文.charAt(charIndex) : 简化中文.charAt(charIndex);     str.push(charIndex != -1 ? result : _char);   }    return str.join('');  }  var traditionalized = translateText.delegate(null, true), simplized = translateText.delegate(null, false);    var cookieName = 'ChineseType';    // 转换为正体中文(繁体中文)  window.toChinese = function(el) {   el.addCls('selected');   document.querySelector(".simpleChinese").removeCls('selected');   translate(document.body, traditionalized)   Cookie.set(cookieName, true);  }  // 转换为简体中文  window.toSimpleChinese = function(el) {   el.addCls('selected');   document.querySelector(".Chinese").removeCls('selected');   translate(document.body, simplized);   Cookie.set(cookieName, false);  }    var Cookie = {   set: function (name, val) {    var exp = new Date();    exp.setDate(exp.getDate() + 600 * 1000);    document.cookie = name + "=" + escape(val) + ";expires=" + exp.toGMTString();   }, del: function (name) {    document.cookie = name + "=;expires=" + (new Date(0)).toGMTString();   }, get: function (name) {    var cookieArray = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)"));    if (cookieArray != null) return unescape(cookieArray[2]);    else return null;   }  };    var value = Cookie.get(cookieName);  if( value == null && getClientLanguage() || value == 'true') {    // 没有检查出 cookie 则为第一次运行。   // cookie保留了用户选择的正体,将原来的简化字转换为默认的正体!   window.toChinese(document.querySelector(".Chinese"));  } else if(value == null && !getClientLanguage() || value == 'false') {   // 虽然第一次运行,但对方正是简体中文,不用转。   // 原来已经是简体,无须转换。  } })(); 

然后绑定按钮事件,我们简单地使用 onclick 绑定来全局函数 window.toChinese(el)、window.toSimpleChinese(el)。el 是按钮元素。

// 转换为正体中文(繁体中文) window.toChinese = function(el) {  el.addCls('selected');  document.querySelector(".simpleChinese").removeCls('selected');  translate(document.body, traditionalized)  Cookie.set(cookieName, true); } // 转换为简体中文 window.toSimpleChinese = function(el) {  el.addCls('selected');  document.querySelector(".Chinese").removeCls('selected');  translate(document.body, simplized);  Cookie.set(cookieName, false); } 

js 代码中比较长的两个字符串变量分别是简体中文和繁体中文,他们切换没有什么神奇之处,只是所有文本经过这些变量一一对应即可。当然这里只是常用的繁简对应,而且是机械的,有些特殊的翻译需要联系上下文的,这种高级转换不在此讨论之列。

首先我们看看变量函数 translate,执行它会通过递归遍历完整个 DOM(可以说比较笨的方法)

/**   * 转换对象,使用递归,逐层剥到文本   * @param {HTMLElement} obj 从document.body开始,   */  function translate(el, coverntFn){   el = el.childNodes;   var node;   for (var i = 0, j = el.length; i < j; i++) {    node = el.item(i); // || (node == $$.big5.el)    if (("||BR|HR|TEXTAREA|".indexOf("|" + node.tagName + "|")) > 0)continue;        if(node.title){     node.title = coverntFn(node.title);    }else if(node.alt){     node.alt = coverntFn(node.alt);    }else if(node.tagName == "INPUT" && node.value != "" && node.type != "text" && node.type != "hidden"){     node.value = coverntFn(node.value);    }else if(node.nodeType == 3){     node.data = coverntFn(node.data);    }else{     arguments.callee(node, coverntFn);    }     }  } 

转换 DOM 内容,我们第一时间想到的可能是 el.innerHTML,但其实大可不必,而且递归的时候不太方便。不妨再想想看,我们其实只需要对文本转换即可,DOM API 能够判断 文本节点(node.nodeType == 3),然后可读可写的 data 属性就是设置文本的(textNode.data),由此我们就是完成到繁体的切换。节点其他属性 title、alt、value 也是同样原理。另外,if (("||BR|HR|TEXTAREA|".indexOf("|" + node.tagName + "|")) > 0)continue; 是排除某些节点的方法,其思路比较特别,可以多借鉴下。

至于 coverntFn 是一函数参数。通过根函数 translateText(text, isBig5) 新生成两个函数 :var traditionalized = translateText.delegate(null, true), simplized = translateText.delegate(null, false);

function translateText(text, isBig5) {  var str = [], _char, charIndex, result;   for (var i = 0, j = text.length; i < j; i++) {   _char = text.charAt(i);   charIndex = isBig5 ? 简化中文.indexOf(_char) : 正体中文.indexOf(_char);   result = isBig5 ? 正体中文.charAt(charIndex) : 简化中文.charAt(charIndex);    str.push(charIndex != -1 ? result : _char);  }   return str.join(''); } var traditionalized = translateText.delegate(null, true), simplized = translateText.delegate(null, false); 

Function.prototype.delegate() 方法如下。

/**  * 函数委托  * @return {Function} */ Function.prototype.delegate = function () {  var self = this, scope = this.scope, args = arguments, aLength = arguments.length, fnToken = 'function';   return function(){   var bLength = arguments.length, Length = (aLength > bLength) ? aLength : bLength;    // mission one:   for (var i = 0; i < Length; i++)    if (arguments[i])args[i] = arguments[i]; // 拷贝参数    args.length = Length; // 在 MS jscript下面,arguments作为数字来使用还是有问题,就是length不能自动更新。修正如左:    // mission two:   for (var i = 0, j = args.length; i < j; i++) {    var _arg = args[i];    if (_arg && typeof _arg == fnToken && _arg.late == true)     args[i] = _arg.apply(scope || this, args);   }    return self.apply(scope || this, args);  }; }; 

繁简的转换基本如此了。值得一提的是,浏览器其实替我们识别语言环境的变量,主要是 navigator.userLanguage || navigator.language。这个变量在服务端也可以获取,头读取:Request.ServerVariables("http_accept_language")。

/**   * 默认是否正体中文:true为正体;false简体。 HTTP   * 头读取:Request.ServerVariables("http_accept_language")   *   * @return {Boolean}   */  function getClientLanguage() {   var s = navigator.userLanguage || navigator.language;   switch (s.toLowerCase()) {   case 'zh-cn':    return false;   case 'zh-tw':    return true;   default:    return null;   }  } 

最后我们还通过 cookie 来保存语言状态。

以上就是本文的全部内容,希望对大家的学习有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表