由于頁(yè)面假設(shè)設(shè)定均使用 Unicode 字符集,于是一般不用考慮 GB2312/BIG5 字符集問(wèn)題,偉大的 Unicode 字符集已經(jīng)涵蓋了繁體字的字符了(UTF-8 編碼)。
怎么在頁(yè)面調(diào)用這個(gè)功能呢?很簡(jiǎn)單,首先引入下面 Js(注意還依賴 Function.prototype.delegate(), 下面會(huì)提及):
然后綁定按鈕事件,我們簡(jiǎn)單地使用 onclick 綁定來(lái)全局函數(shù) window.toChinese(el)、window.toSimpleChinese(el)。el 是按鈕元素。
js 代碼中比較長(zhǎng)的兩個(gè)字符串變量分別是簡(jiǎn)體中文和繁體中文,他們切換沒有什么神奇之處,只是所有文本經(jīng)過(guò)這些變量一一對(duì)應(yīng)即可。當(dāng)然這里只是常用的繁簡(jiǎn)對(duì)應(yīng),而且是機(jī)械的,有些特殊的翻譯需要聯(lián)系上下文的,這種高級(jí)轉(zhuǎn)換不在此討論之列。
首先我們看看變量函數(shù) translate,執(zhí)行它會(huì)通過(guò)遞歸遍歷完整個(gè) DOM(可以說(shuō)比較笨的方法)
轉(zhuǎn)換 DOM 內(nèi)容,我們第一時(shí)間想到的可能是 el.innerHTML,但其實(shí)大可不必,而且遞歸的時(shí)候不太方便。不妨再想想看,我們其實(shí)只需要對(duì)文本轉(zhuǎn)換即可,DOM API 能夠判斷 文本節(jié)點(diǎn)(node.nodeType == 3),然后可讀可寫的 data 屬性就是設(shè)置文本的(textNode.data),由此我們就是完成到繁體的切換。節(jié)點(diǎn)其他屬性 title、alt、value 也是同樣原理。另外,if (("||BR|HR|TEXTAREA|".indexOf("|" + node.tagName + "|")) > 0)continue; 是排除某些節(jié)點(diǎn)的方法,其思路比較特別,可以多借鑒下。
至于 coverntFn 是一函數(shù)參數(shù)。通過(guò)根函數(shù) translateText(text, isBig5) 新生成兩個(gè)函數(shù) :var traditionalized = translateText.delegate(null, true), simplized = translateText.delegate(null, false);
Function.prototype.delegate() 方法如下。
繁簡(jiǎn)的轉(zhuǎn)換基本如此了。值得一提的是,瀏覽器其實(shí)替我們識(shí)別語(yǔ)言環(huán)境的變量,主要是 navigator.userLanguage || navigator.language。這個(gè)變量在服務(wù)端也可以獲取,頭讀取:Request.ServerVariables("http_accept_language")。
最后我們還通過(guò) cookie 來(lái)保存語(yǔ)言狀態(tài)。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com