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