ASP實現多語言支持
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
綱要: 讓我們設想你使用activeserverpages設計了一個成功的站點,而你的客戶紛紛要求將此站點國際化以提供多種語言版本。這時候你該怎么辦?請看本文。 正文: 一、介紹 讓我們設想你使用activeserverpages設計了一個成功的站點,而你的客戶紛紛要求將此站點國際化以提供多種語言版本。該問題的關鍵在于,你必須使用某種方法實現快速的頁面內容轉換。可以將此問題看成是從數據庫提取適當數據并用asp動態顯示。在本文中我們將討論如何使用activeserverpages的字典對象以及一個后臺數據庫實現國際化支持。 具體實現過程分以下三個步驟: ◇設計數據庫并存儲文本和文件路徑。 ◇從數據庫讀取數據到字典對象。 ◇在asp頁面引用文本和文件路徑。 二、步驟1-設計數據庫并存儲文本和文件路徑 我們需要在數據庫設計上花些時間。使用此數據庫,我們希望能夠把所有要用到的文本和圖片適當編目,并且這些文本和圖片不能重復;如果要在應用中把“是”改成“確定”,希望只在一個地方作改動;web維護者在更改內容時應能夠快速找到目標文本。基于以上要求,讓我們開始設計數據庫。 首先創建兩個表來放置文本。其中一個表為commonstrings,用于存放在整個站點重復使用的單詞和短語。另外一個表為specializedstrings,用于存放只在特定頁面使用的單詞和短語。把公用和限于特定頁面使用的文本分別存放有利于簡化站點維護。 兩個表都使用stringkey字段來標記紀錄,使用stringlanguage來說明所用語言,聯合stringkey和stringlanguage創建一個主鍵。字段stringholder用來保存單詞、短語或語句。這個字段必須創建唯一索引以保證不會輸入重復的單詞、短語或語句。 對于specializedstrings表,還需要一個額外的字段asppage來標記文本所在的asp頁面。 對于圖片文件,我們可以使用相同的步驟創建表來存儲指向這些文件的路徑。只需要在commonimage表和specializedimage表中用filename字段替換對應的stringholder就可以了。 在新創建的表中裝入數據時,stringkey的內容應該給站點維護者盡可能多的提示以表明頁面上將顯示的文本。例如,對于一個在線銷售站點來說有關拒絕承諾的聲明語句使用orderdisclaimer是一個不錯的選擇,站點維護者由此可以非常清楚地了解使用該記錄將在web頁面上顯示的內容。 把那些公用的單詞和短語放在commonstrings表。這樣,維護者就知道如果他們修改commonstrings表中的一個記錄,將影響到站點內的許多頁面。 對于大的站點,可以設計一個易于使用的界面來輸入和修改數據庫中的文本。準備這些資料是一項冗長乏味的任務,越簡單就越少出錯。 三、步驟2-從數據庫讀取數據到字典對象 字典對象(dictionaryobject)是一個多用途的服務器端對象,它相當于二維數組,保存了鍵以及與鍵相關聯的數據。提取數據的唯一途徑在于取得鍵值或索引。可以把字典對象的作用范圍配置為整個應用范圍或對話范圍,而不必擔心損失性能。賦予應用層作用范圍意味著對象只被實例化一次,且所有會話均使用同一個字典對象。以下代碼創建兩個字典對象實例,分別和兩個文本表關聯。記住,我們希望對象只被初始化一次,所以把這些代碼放在application_onstart事件中: <scriptrunat=serverlanguage=vbscript> subapplication_onstart() dimdictcommonstrings dimdictspecializedstrings dimconn dimrscommonstrings dimrsspecializedstrings setdictcommonstrings=server.createobject("scripting.dictionary") setdictspecializedstrings=server.createobject("scripting.dictionary") 接下來的任務是把數據裝入字典對象。我們將遍歷表,連接stringkey和stringlanguage,并把連接后的值作為字典的鍵值,把stringholder放在對應的字典數據區。由此我們獲得了使用數據庫存儲數據的彈性,并避免了持久的數據庫連接而導致的性能影響。事實上,數據庫只在應用啟動時被訪問一次,其后asp頁面將從速度更快的字典對象讀取所需數據。 '建立數據庫連接 setconn=server.createobject("adodb.connection")<br/> conn.connectionstring="someconnectionstring"<br/> conn.open '打開commonstrings表,遍歷所有記錄并裝入數據 setrscommonstrings=conn.execute("selectstringkey,stringholderfromcommonstrings") dountilrscommonstrings.eof dictcommonstrings.addrscommonstrings("stringlanguage")&rscommonstrings("stringkey")_ ,rscommonstrings("stringholder") rscommonstrings.movenext loop '打開specializedstrings表,遍歷所有記錄并裝入數據 setrsspecializedstrings=conn.execute("selectstringkey,stringholderfromspecializedstrings") dountilrsspecializedstrings.eof dictspecializedstrings.addrsspecializedstrings("stringlanguage")&_ rsspecializedstrings("stringkey"),rsspecializedstrings("stringholder") rsspecializedstrings.movenext loop rsspecializedstrings.close rscommonstrings.close conn.close setrsspecializedstrings=nothing setrscommonstrings=nothing setconn=nothing endsub 四、步驟3-在asp頁面引用文本和文件路徑 接下來的工作是在asp頁面引用已經實例化的字典對象中的文本(以及文件路徑)。首先我們需要知道當前用戶所使用的語言,其中一個辦法是從request.server.variables取得該值。請把下列代碼放入session_onstart事件處理過程: <scriptlanguage=vbscript> subsession_onstart() session("lang")=request.server.variables("http_accept_language") endsub 通過鍵值可以從字典對象取得對應的文本(或圖片文件路徑),鍵值由語言前綴加名字組成。以下為示例代碼: <palign=center> <h1> <%=dictspecializedstrings.item(session("lang")&"confirmation")%> </h1> <p></p><br/> <palign=center> <h5> <%=dictspecializedstrings.item(session("lang")&"orderdisclaimer")%> </h5> <p></p> 對于中文瀏覽器,該頁面的提示類如: 感謝您的購買。請進入下一頁付款。 而對于一個缺省語言為英文的的瀏覽器,則提示為: thankyouforyourorder.continuetothenextpagetomakeyourpayment. 根據我的經驗,從字典對象引用文本(以及圖片路徑)和直接在asp代碼中輸入數據相比,沒有性能上的不利影響。這是由于文本(和圖片路徑)字典被放在內存中,因而可以快速地提取。 五、討論 當然,實現多語言支持還有其它的因素需要考慮。使站點內容的變化和應用開發者隔離是本文試圖說明的實質內容。本方案不僅對于實現站點內容國際化非常有用,而且對于站點內容頻繁改變而布局基本不變的情形,本方案同樣能起作用。后臺數據庫、集合對象(字典對象)以及asp技術提供了一個極好的方案來實現站點內容從源語言到其它語言的擴展。 </palign=center> </palign=center> </scriptlanguage=vbscript> </scriptrunat=serverlanguage=vbscript> 該文章在 2025/8/21 12:04:50 編輯過 |
關鍵字查詢
相關文章
正在查詢... |