javascript XML 網站 多語言

來源:互聯網
上載者:User

這個文章是轉載的:P

------------------------------------------------------------------------------------------------------------------------------------------- 

<序> 這幾天在做www.eGameTimes.COM的新版,其實還處於準備工作期間,這兩天著手解決的問題是多語言支援。沒想到遇到了大麻煩。   <章一 廟算> 其實多語言支援已經有一些定式了,像ASP.NET就基本是用resource檔案來做。但是我似乎有時候不太守規矩,那陣子看到了Javascript的XML讀取,便想像了一個使用Javascript + XML進行多語言支援的結構。
1) 用Javascript讀取包括各語言的XML檔案;2) 對頁面內的特定標記的標籤進行內容替換,將對應的語言內容載入進去。
簡單的步驟,簡單的想法,計議停當,便開始做了。順便提一句,這樣做的原因是考慮到減少伺服器的負載,而且一旦下載完成,本地的運算速度可是很快的--何況,XML檔案也不大吧?   <章二 首戰告捷> 昨天中午的時候很興奮,因為完成了多語言支援的技術實現! 把其他的雖然但是的去掉,還是先來說說這個多語言實現的幾個核心點吧:
  1. 使用Javascript讀取XML。
    其實這個還是比較簡單的,重要的代碼在這裡:

        var xmlDoc;
        xmlDoc = new ActiveXObject("MSXML2.DOMDocument");
        xmlDoc.async = false;
        xmlDoc.load(xmlFile);

    需要注意的是:這裡第一行的聲明和第二行的賦值要分開寫! 因為我在調試的時候便遇到了這樣的問題--雖然MSDN上聲明和賦值連著寫都沒有問題,雖然以前我試的時候也沒有問題。這個問題實在還有些困擾我,到現在還沒有查出答案,有人告訴我嗎?

  2. 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決定取消這樣的多語言實現方式,這篇研究便放在這裡權當一個玩具吧。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.