這個文章是轉載的:P
-------------------------------------------------------------------------------------------------------------------------------------------
<序> 這幾天在做www.eGameTimes.COM的新版,其實還處於準備工作期間,這兩天著手解決的問題是多語言支援。沒想到遇到了大麻煩。
<章一 廟算> 其實多語言支援已經有一些定式了,像ASP.NET就基本是用resource檔案來做。但是我似乎有時候不太守規矩,那陣子看到了Javascript的XML讀取,便想像了一個使用Javascript + XML進行多語言支援的結構。
1) 用Javascript讀取包括各語言的XML檔案;2) 對頁面內的特定標記的標籤進行內容替換,將對應的語言內容載入進去。
簡單的步驟,簡單的想法,計議停當,便開始做了。順便提一句,這樣做的原因是考慮到減少伺服器的負載,而且一旦下載完成,本地的運算速度可是很快的--何況,XML檔案也不大吧?
<章二 首戰告捷> 昨天中午的時候很興奮,因為完成了多語言支援的技術實現! 把其他的雖然但是的去掉,還是先來說說這個多語言實現的幾個核心點吧:
- 使用Javascript讀取XML。
其實這個還是比較簡單的,重要的代碼在這裡: var xmlDoc;
xmlDoc = new ActiveXObject("MSXML2.DOMDocument");
xmlDoc.async = false;
xmlDoc.load(xmlFile);
需要注意的是:這裡第一行的聲明和第二行的賦值要分開寫! 因為我在調試的時候便遇到了這樣的問題--雖然MSDN上聲明和賦值連著寫都沒有問題,雖然以前我試的時候也沒有問題。這個問題實在還有些困擾我,到現在還沒有查出答案,有人告訴我嗎?
- XML檔案中定義結點(node)像這樣:
<TagName zh-cn="中文" en-us="英文" otherLangCode="其他什麼語言">
那麼要擷取某個特定語言的文本的時候,可以用:
document.all(TagName).innerHTML
= xmlDoc.documentElement.selectSingleNode(TagName).getAttribute(langCode);
這裡你需要明白些什麼呢?
zh-cn、cn-us這樣的東西,叫語言代碼(language code,直接在MSDN裡面可以搜尋這個詞)。
document.all 的使用方法也去MSDN查吧,呵呵。其實My Code中不是這麼寫的,因為這個TagName應該使用一個方法自動得到,對吧?看看document.all的用法吧,提示一下,在HTML裡面,每個標籤可以有id和name兩個屬性,並且可以不一樣。
至於documentElement、selectSingleNode、getAttribute這些東西,在MSDN上查一下DOMDocument項。
其實核心的東西就這麼些,看看是不是很簡單?但是在實際操作的時候卻往往會遇到意外的麻煩。嗯,餓了,先去飽肚子。書接上回,我們說到這多語言支援“完成”了。調試的時候試了一下,感覺相當不錯指令碼和XML檔案都載入到本地然後進行處理,解放了伺服器,並且因為是在本地運行,語言間切換相當流暢--甚至不用重新整理頁面。當時看著是很有成就感啊! 另外要補充說明的一點,網站的多語言支援是指網站的介面多語言化,至於內容......就看各網站自己的了。就好比Bloglines,介面可以是N種語言,但是你要blog,他總不能也給你多語言化了吧?所以,我這裡討論的只是介面的多語言支援而已。嗯,明白人們跳過這段好了,忽略之。
<章三 急轉直下> 成功了! 美美地吃了個午飯之後,下午繼續修改各個細節。但是問題卻在這個時候出現了:當從其他機器訪問我的網站的時候,出現了錯誤提示! 並且無法載入多語言支援的內容! 仔細檢查了一遍之後,確定問題就出在xmlDoc.load()一句中--無法載入遠端XML檔案。還真應了丫頭那句“該不會只能在你機器上運行吧”。 Google了半個下午,幾乎沒有找到任何相關的說明。這事情便只能這樣了?一天多的辛苦就白費了? 情勢真是急轉直下啊。
<章四 新的希望> 現在想起來,真是夠愣的,也沒有參考一下其他什麼,直接性地考慮到“既然不能載入遠程XML檔案,那麼找個可以載入的辦法”。 先看了Javascript的FSO,似乎在這種網頁上行不通。然後漫天搜尋下,居然找到了這個可以Reading a File的東西。於是,異想天開地,要用這個ReadURL類來獲得fileContent,然後用xmlDoc.loadXML()方法載入XML內容。 結果竟然成了! 如果沒有那幾個缺點的話..... 第一,這個是通過Applet來讀取檔案,需要使用者有jre支援;第二,XML檔案是UTF-8編碼儲存,這個ReadURL類是以純文字方式讀入檔案,之後......你不是真的打算自己轉換著玩吧?第三,不穩定,時靈時不靈...-__-b 這個版本我也完成了,看著這奇怪的東西,莫名地想到一個詞:DIY。似乎這是我的長項,用自己會用的、找得到的東西,組合起來完成一些奇怪的事情......
<終章 解鈴還需系鈴人> 在兩個失敗的版本之後,終於需要靜下心來想想了--那麼便從頭開始吧。 最早是為什麼想到Javascript + XML的多語言支援呢?其實是當時分析MSDN網站的樹狀圖時,從各個角落裡搜出來的幾個代碼片斷--包括一個htc檔案,幾個css檔案以及幾個XML檔案。其中最有用的當然是封裝了指令碼的htc檔案,讀取XML檔案的代碼當初也是在這裡看到過。之後,便在網上搜尋出來一些相關的文章,結合MSDN,實驗成功之後便開始了。這次到了這個瓶頸,又想起來在htc檔案中似乎指令碼也載入了遠端XML檔案,便回頭來仔細看這個htc檔案。 然後問題就這樣解決了。 關鍵的關鍵就在這對象上:
var xmlDoc;
xmlDoc = new ActiveXObject("MSXML2.DOMDocument"); 而那個htc檔案中使用的對象是:
var xmlDoc;
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");這個MSXML2.DOMDocument和Microsoft.XMLDOM對象在使用上幾乎相同,但是為什麼在範圍限制上有這樣的區別,到現在我也還沒有找到一個能詳細說明的檔案。有高人指教嗎? <尾聲> 至此,這個網站的多語言支援方安就算是解決了。因為是懶人,又有對細節的完美要求,就不貼更多的代碼了--因為不整理不好看,哈哈。 基本上,按這幾篇提供的資訊,應該是把我的大體思路都說出來了。還有問題,可以等過一陣www.eGameTimes.COM新版完成之後直接去看看吧! =D
[Updating 2006-04-13]
新版eGameTimes決定取消這樣的多語言實現方式,這篇研究便放在這裡權當一個玩具吧。