實(shí)現(xiàn)ASP.NET全球化
一、 ASP.NET全球化信息
在我的網(wǎng)站中,在創(chuàng)建資源文件并加入一些本地化數(shù)據(jù)后,我首先開始使用顯式本地化來(lái)設(shè)置控件(例如,在我的網(wǎng)站中的標(biāo)簽)的文本,以便它們可以從資源文件中得到它們的值。既然存在四種語(yǔ)言;所以,除一個(gè)完全可依賴的資源文件之外(沒有本地化命名),我創(chuàng)建了四個(gè)資源文件。
注意,這些資源文件都以本地化標(biāo)記作為它們的中間名稱,因此,我需要把UICulture設(shè)置為與該本地化相同的名字以便ASP.NET存取這些資源文件。
但是,問(wèn)題是:我該怎樣在PostBack事件中動(dòng)態(tài)地改變文化呢?幸好,ASP.NET在Page類中提供了一種可重載的方法: InitializeCulture()。這個(gè)方法在頁(yè)面生命周期(在生成任何控件之前)中執(zhí)行得很早,并且在此,我們能夠設(shè)置當(dāng)前線程的UICulture和Culture。
由于這個(gè)方法位于Page類中,并且我不想針對(duì)每一個(gè)web頁(yè)面都重復(fù)相同的代碼,所以我創(chuàng)建了一個(gè)BasePage類,我的應(yīng)用程序中的所有的aspx頁(yè)面都派生自這個(gè)BasePage類。但是現(xiàn)在,我又面臨另一個(gè)問(wèn)題。
回到UI設(shè)計(jì):我使用了一個(gè)MasterPage和一個(gè)Header用戶控件(在一個(gè)ContentPlaceHolder內(nèi))。我把一個(gè)缺省的頁(yè)面與該MasterPage相關(guān)聯(lián)。整個(gè)站點(diǎn)必須動(dòng)態(tài)地實(shí)現(xiàn)本地化。因此,在頂部,有一個(gè)下拉框,用戶可以從中選擇一種語(yǔ)言/文化。在BasePage的 InitilializeCulture方法中,我必須取得用戶從下拉框選擇的項(xiàng)的值;但是,因?yàn)樗€沒有被初始化,所以,我還不能存取任何控件的值。答案是:使用表單集合(從響應(yīng)對(duì)象內(nèi))。
一旦我們從web應(yīng)用程序中提取了所有的內(nèi)容并且基于用戶選擇和使用Resources.TestWebSite.XXXPropertyName設(shè)置好了Culture和UICulture,那么,我們就已經(jīng)為我們的全球化框架作好了準(zhǔn)備?,F(xiàn)在,剩下的唯一事情是把資源特定的數(shù)據(jù)添加到相應(yīng)的資源文件中。針對(duì)每一種文件類型,我們需要有一個(gè)單獨(dú)的(和適當(dāng)命名的)資源文件。這個(gè)過(guò)程稱為本地化。在我的web.config文件中,我使用了下列屬性:
- <globalization responseEncoding"=utf-8" requestEncoding="utf-8" fileEncoding="utf-8" />
二、設(shè)置語(yǔ)言方向相應(yīng)的dir屬性
許多時(shí)候,我們還需要設(shè)置本地化文本的方向(這是使用<html> 或<body>標(biāo)簽的dir屬性設(shè)置的)。這是必需的,因?yàn)橛行┱Z(yǔ)言從右到左(RTL)讀取,例如Arabic,不同于象Hindi和 English這樣語(yǔ)言的標(biāo)準(zhǔn)的從左到右(LTR)的讀取方式。這可以通過(guò)把.resx文件中的dir屬性設(shè)置為適當(dāng)?shù)闹祦?lái)實(shí)現(xiàn)。
首先,你可以在所有資源文件中創(chuàng)建一個(gè)Direction(你可以使用任何名)域,并基于單個(gè)資源文件把它的屬性設(shè)置為RTL或LTR。對(duì)于Arabic,這個(gè)域的值是RTL,而對(duì)于Hindi則是LTR。然后,把<body>標(biāo)簽的dir屬性設(shè)置為如下:
- <body runat="server" dir="<%$ Resources: TestSiteResources, Direction %>">
三、使用數(shù)據(jù)庫(kù)實(shí)現(xiàn)本地化
我們已經(jīng)看到了如何本地化控件的文本和UI描述。但是,存儲(chǔ)在數(shù)據(jù)庫(kù)中的內(nèi)容會(huì)怎么呢?其實(shí),這一部分內(nèi)容也需要本地化,但是由于它存儲(chǔ)在一個(gè)DB中,所以我們不能使用資源文件來(lái)實(shí)現(xiàn)相同目的。為此,我們需要?jiǎng)?chuàng)建新的表格。
假定我有一個(gè)存儲(chǔ)用戶評(píng)價(jià)的表格。該表格結(jié)構(gòu)如下所示:
現(xiàn)在,我們想實(shí)現(xiàn)以本地化的文本來(lái)顯示Comments和Name字段,但是,我們不可能把所有這些域的不同語(yǔ)言版本都存儲(chǔ)在同一個(gè)表格中(既然存在不需要被本地化但卻重復(fù)的其它域)。因此,我們需要重新組織該表格結(jié)構(gòu)并且創(chuàng)建另一個(gè)表格來(lái)存儲(chǔ)這兩個(gè)域的本地化版本。首先,我們需要從這個(gè)表格中刪除這兩個(gè)域并創(chuàng)建一個(gè)如下所示的新表格:
ASP.NET全球化與本地化之全球化
在此,我們添加了一個(gè)新域:CultureID,它等價(jià)于LCID(或Locale標(biāo)識(shí)符)。我們能夠按如下所示添加文化特定的本地化數(shù)據(jù):
現(xiàn)在,我們可以使用以CultureID(LCID)作為參數(shù)的SQL查詢來(lái)取得本地化內(nèi)容。我們還能夠提供一個(gè)用戶接口來(lái)把本地化數(shù)據(jù)輸入到這樣的表格以便能夠以一種交互方式創(chuàng)建相應(yīng)的內(nèi)容。
四、總結(jié)
在本文中,我們討論了有關(guān)實(shí)現(xiàn)ASP.NET全球化的一些重要方面,并且看到,這是非常容易實(shí)現(xiàn)的事情.
【編輯推薦】