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