ASP實現多語言支援 (轉)

worldblog發表於2007-12-03
ASP實現多語言支援 (轉)[@more@]

實現多語言支援

綱要 :
  讓我們設想你使用 Active Server Pages 設計了一個成功的站點,而你的客戶紛紛要求將此站點國際化以提供多種語言版本。這時候你該怎麼辦?請看本文。

正文:
  一、介紹

  讓我們設想你使用 Active Server Pages 設計了一個成功的站點,而你的客戶紛紛要求將此站點國際化以提供多種語言版本。該問題的關鍵在於,你必須使用某種方法實現的頁面內容轉換。可以將此問題看成是從提取適當資料並用ASP動態顯示。在本文中我們將討論如何使用 Active Server Pages 的字典以及一個後臺資料庫實現國際化支援。

  具體實現過程分以下三個步驟:
  ◇設計資料庫並文字和路徑。
  ◇從資料庫讀取資料到字典物件。
  ◇在ASP頁面引用文字和檔案路徑。

  二、步驟1-設計資料庫並儲存文字和檔案路徑

  我們需要在資料庫設計上花些時間。使用此資料庫,我們希望能夠把所有要用到的文字和圖片適當編目,並且這些文字和圖片不能重複;如果要在應用中把“是”改成“確定”,希望只在一個地方作改動;維護者在更改內容時應能夠快速找到目標文字。基於以上要求,讓我們開始設計資料庫。

  首先建立兩個表來放置文字。其中一個表為CommonStrings,用於存放在整個站點重複使用的單詞和短語。另外一個表為SpecializedStrings,用於存放只在特定頁面使用的單詞和短語。把公用和限於特定頁面使用的文字分別存放有利於簡化站點維護。

  兩個表都使用StringKey欄位來標記紀錄,使用StringLanguage來說明所用語言,聯合StringKey和StringLanguage建立一個主鍵。欄位StringHolder用來儲存單詞、短語或語句。這個欄位必須建立唯一以保證不會輸入重複的單詞、短語或語句。

  對於SpecializedStrings表,還需要一個額外的欄位ASPPage來標記文字所在的ASP頁面。

  對於圖片檔案,我們可以使用相同的步驟建立表來儲存指向這些檔案的路徑。只需要在CommonImage表和SpecializedImage表中用FileName欄位替換對應的StringHolder就可以了。

  在新建立的表中裝入資料時,StringKey的內容應該給站點維護者儘可能多的提示以表明頁面上將顯示的文字。例如,對於一個線上銷售站點來說有關拒絕承諾的宣告語句使用OrderDisclaimer是一個不錯的選擇,站點維護者由此可以非常清楚地瞭解使用該記錄將在Web頁面上顯示的內容。

  把那些公用的單詞和短語放在CommonStrings表。這樣,維護者就知道如果他們修改CommonStrings表中的一個記錄,將影響到站點內的許多頁面。

  對於大的站點,可以設計一個易於使用的介面來輸入和修改資料庫中的文字。準備這些資料是一項冗長乏味的任務,越簡單就越少出錯。

  三、步驟2-從資料庫讀取資料到字典物件

  字典物件(Dictionary )是一個多用途的端物件,它相當於二維陣列,儲存了鍵以及與鍵相關聯的資料。提取資料的唯一途徑在於取得鍵值或索引。可以把字典物件的作用範圍為整個應用範圍或對話範圍,而不必擔心損失。賦予應用層作用範圍意味著物件只被例項化一次,且所有會話均使用同一個字典物件。以下程式碼建立兩個字典物件例項,分別和兩個文字表關聯。記住,我們希望物件只被初始化一次,所以把這些程式碼放在Application_OnStart事件中:

< Script RUNAT=SERVER Language= >
Sub Application_OnStart()
Dim DictCommonStrings
Dim DictSpecializedStrings

Dim Conn
Dim rmmonStrings
Dim rsSpecializedStrings

Set DictCommonStrings = Server.CreateObject("Scripting.Dictionary")
Set DictSpecializedStrings = Server.CreateObject("Scripting.Dictionary")

  接下來的任務是把資料裝入字典物件。我們將遍歷表,連線StringKey和StringLanguage,並把連線後的值作為字典的鍵值,把StringHolder放在對應的字典資料區。由此我們獲得了使用資料庫儲存資料的彈性,並避免了持久的資料庫連線而導致的效能影響。事實上,資料庫只在應用啟動時被訪問一次,其後ASP頁面將從速度更快的字典物件讀取所需資料。

'建立資料庫連線
Set Conn = Server. CreateObject("ADO.Connection")< BR >
Conn.ConnectionString = "Some Connection String"< BR >
Conn.open

'開啟 CommonStrings 表, 遍歷所有記錄並裝入資料
Set rsCommonStrings = Conn.Execute(" StringKey, StringHolder from CommonStrings")
Do until rsCommonStrings.EOF
DictCommonStrings.Add rsCommonStrings("StringLanguage") & rsCommonStrings("StringKey") _ 
,rsCommonStrings("StringHolder")
rsCommonStrings.MoveNext
L

'開啟SpecializedStrings表, 遍歷所有記錄並裝入資料
Set rsSpecializedStrings = Conn.Execute("Select StringKey, StringHolder from SpecializedStrings")
Do until rsSpecializedStrings.EOF
DictSpecializedStrings.Add rsSpecializedStrings ("StringLanguage") & _
rsSpecializedStrings ("StringKey") , rsSpecializedStrings ("StringHolder")
rsSpecializedStrings.MoveNext
Loop

rsSpecializedStrings.Close
rsCommonStrings.Close
Conn.Close
Set rsSpecializedStrings = Nothing
Set rsCommonStrings = Nothing
Set Conn = Nothing
End Sub

< /Script >

  四、步驟3-在ASP頁面引用文字和檔案路徑

  接下來的工作是在ASP頁面引用已經例項化的字典物件中的文字(以及檔案路徑)。首先我們需要知道當前所使用的語言,其中一個辦法是從Request.Server.Variables取得該值。請把下列程式碼放入Session_Onstart事件處理過程:


< Script Language=VBScript >
Sub Session_OnStart()
Session("Lang") = Request.Server.Variables("HTTP_ACCEPT_LANGUAGE")
End Sub
< /Script >

 透過鍵值可以從字典物件取得對應的文字(或圖片檔案路徑),鍵值由語言字首加名字組成。以下為示例程式碼:
< HTML >
< P Align=center >
< h1 ><  %= DictSpecializedStrings.Item(Session("Lang") & "Confirmation")% >< /h1 >
< /P >< BR >
< P Align=center >
< h5 ><  %= DictSpecializedStrings.Item(Session("Lang") & "OrderDisclaimer")% >< /h5 >
< /P >
< /HTML >

  對於中文,該頁面的提示類如:
  感謝您的購買。請進入下一頁付款。
  而對於一個預設語言為英文的的瀏覽器,則提示為:

Thank you for your order. Continue to the Next Page to make your payment.

  根據我的,從字典物件引用文字(以及圖片路徑)和直接在ASP程式碼中輸入資料相比,沒有效能上的不利影響。這是由於文字(和圖片路徑)字典被放在中,因而可以快速地提取。

  五、討論

  當然,實現多語言支援還有其它的因素需要考慮。使站點內容的變化和應用開發者隔離是本文試圖說明的實質內容。本方案不僅對於實現站點內容國際化非常有用,而且對於站點內容頻繁改變而佈局基本不變的情形,本方案同樣能起作用。後臺資料庫、集合物件(字典物件)以及ASP技術提供了一個極好的方案來實現站點內容從源語言到其它語言的擴充套件。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987624/,如需轉載,請註明出處,否則將追究法律責任。

相關文章