ASP.NET 網頁資源概述

如果您創建的網頁將由使用不同語言的用戶閱讀,則必須爲這些讀者提供用他們自己的語言查看網頁的方法。一種方法是分別用各語言重新創建頁面,但這種方法可能需要大量工作量、容易出錯並且在更改原始頁時很難維護。

ASP.NET 爲您提供了一種方法,使用這種方法創建的頁可以根據瀏覽器的首選語言設置或用戶顯式選擇的語言獲取內容和其他數據。內容和其他數據指的就是資源,此類數據可以存儲在資源文件或其他源中。

在 ASP.NET 網頁中,可以將控件配置爲從資源獲取其屬性值。在運行時,資源表達式將被相應資源文件中的資源替換。

資源文件

資源文件是 XML 文件,其中包含要轉換爲不同語言或圖像路徑的字符串。資源文件包含鍵/值對,每一對都是一個單獨的資源。鍵名不區分大小寫。例如,資源文件可能包含帶有 Button1 鍵和 Submit 值的資源。

您需要爲每種語言(如英語和法語)或每種語言和區域性(如英語 [英國]、英語 [美國])分別創建一個資源文件。每個本地化資源文件都有相同的鍵/值對;本地化資源文件與默認資源文件的唯一區別就是前者所包含的資源可能少於後者。然後,語言回退處理非特定資源或默認資源的加載。

ASP.NET 中的資源文件具有 .resx 擴展名。在運行時,.resx 文件將編譯進一個程序集內,該程序集有時稱爲附屬程序集。由於 .resx 文件是用與 ASP.NET 網頁相同的方式動態編譯的,因此不必創建資源程序集。編譯過程將多個語言類似的資源文件壓縮在同一程序集內。

在創建資源文件時,首先開始創建基文件 .resx。對於要支持的每種語言,分別創建一個新文件,該文件具有同一基本文件名但包含語言或語言及區域性(區域性名稱)。有關區域性名稱的列表,請參見 CultureInfo。例如,您可以創建下列文件:

  • WebResources.resx

    基資源文件。該文件是默認或後備資源文件。

  • WebResources.es.resx

    西班牙語的資源文件。

  • WebResources.es-mx.resx

    專用於西班牙語(墨西哥)的資源文件。

  • WebResources.de.resx

    德語的資源文件。

在運行時,ASP.NET 使用與 CurrentUICulture 屬性的設置最爲匹配的資源文件。線程的 UI 區域性根據頁的 UI 區域性進行設置。例如,如果當前的 UI 區域性是西班牙語,則 ASP.NET 使用 WebResources.es.resx 文件的已編譯版本。如果當前的 UI 區域性沒有匹配項,則 ASP.NET 會使用資源後備;首先用特定區域性的資源,接着用非特定區域性,最後用默認資源文件。在本例中,默認資源文件是 WebResource.resx。

爲 ASP.NET 網站創建資源文件

在 ASP.NET 中,可以創建具有不同範圍的資源文件。可以創建全局資源文件,這意味着可以從位於網站中的任意頁或代碼讀取這些資源文件。也可以創建本地資源文件,這些文件存儲單個 ASP.NET 網頁(.aspx 文件)的資源。

全局資源文件

將資源文件放入應用程序根目錄的保留文件夾 App_GlobalResources 中,即可創建全局資源文件。App_GlobalResources 文件夾中的任何 .resx 文件都具有全局範圍。此外,ASP.NET 還生成了一個強類型對象,這爲開發人員提供了一種以編程方式訪問全局資源的簡單方法。

本地資源文件

本地資源文件是隻應用於一個 ASP.NET 頁的文件(帶有 .aspx、.ascx、.master 等擴展名的 ASP.NET 頁)。本地資源文件所放入的文件夾具有 App_LocalResources 保留名稱。App_LocalResources 文件夾可以存在於應用程序的任何文件夾中,這與 App_GlobalResources 根文件夾不同。通過資源文件名將一組資源文件與特定的網頁相關聯。

例如,如果在 App_LocalResources 文件夾中有一個名爲 Default.aspx 的頁,則可以創建下列文件:

  • Default.aspx.resx

    默認的本地資源文件,如果找不到語言匹配項,則該文件爲後備資源文件。

  • Default.aspx.es.resx

    西班牙語的資源文件,不包含區域性信息。

  • Default.aspx.es-mx.resx

    專用於西班牙語(墨西哥)的資源文件。

  • Default.aspx.de.resx

    法語的資源文件,不包含區域性信息。

文件的基名稱與頁文件名相同,後跟語言和區域性名稱,最後以擴展名 .resx 結尾。有關區域性名稱的列表,請參見 CultureInfo

在全局和本地資源文件之間選擇

在 Web 應用程序中,可以任意組合使用全局和本地資源文件。通常情況下,當您希望在各頁之間共享資源時,應向全局資源文件添加這些資源。全局資源文件中的資源還是強類型的,用於以編程方式訪問。

但如果將所有本地化資源都存儲在全局資源文件中,則這些文件會變得很大。此外,如果多個開發人員要處理不同的頁但在同一個資源文件中工作時,全局資源文件也會更難於管理。

本地資源文件使得單個 ASP.NET 網頁的資源比較容易管理,但您不能在各頁之間共享資源。此外,如果有許多頁必須本地化爲多種語言,則可能會創建大量本地資源文件。如果站點是具有許多文件夾和使用多種語言的大型站點,則使用本地資源可能快速地在應用程序域中擴展程序集的數量。

在對默認資源文件進行更改時,無論它是本地資源文件還是全局資源文件,ASP.NET 都重新編譯資源並重新啓動 ASP.NET 應用程序,這可能會影響站點的整體性能。添加附屬資源文件將不會導致重新編譯資源,但 ASP.NET 應用程序仍將重新啓動。

Note注意

只有全局資源文件支持鏈接資源。

在網頁中使用資源

創建資源文件後,即可在 ASP.NET 網頁中使用這些文件。通常使用資源來填充頁上各控件的屬性值。例如,可以使用資源設置 Button 控件的 Text 屬性,而不必將該屬性硬編碼爲特定的字符串。

若要使用資源設置控件屬性值,可以使用隱式本地化或顯式本地化,如下所示:

  • 隱式本地化使用的是本地資源,並允許您將控件屬性自動設置爲匹配的資源。

  • 顯式本地化使您可以使用資源表達式將控件屬性設置爲本地或全局資源文件中的特定資源。

使用本地資源的隱式本地化

如果您已爲特定頁創建了本地資源文件,則可以使用隱式本地化從該資源文件中爲控件填充屬性值。使用隱式本地化時,ASP.NET 讀取資源文件並將資源與屬性值相匹配。

若要使用隱式本地化,必須對本地資源文件中的資源使用命名約定,命名約定採用以下模式:

Key . Property

例如,若要爲名爲 Button1Button 控件創建資源,可以在本地資源文件中創建以下鍵/值對:

Button1.Text
Button1.BackColor
Label1.Text

可以對 Key 使用任意名稱,但 Property 必須與要本地化的控件的屬性相匹配。

在頁上,對該控件的標記使用特殊的 meta 屬性可指定隱式本地化。不必顯式指定要本地化的屬性。配置爲使用隱式本地化的 Button 控件看起來可能類似於下面的形式:

<asp:Button ID="Button1" runat="server" Text="DefaultText"  meta:resourcekey="Button1" />

resourcekey 值與相應資源文件中的鍵相匹配。在運行時,ASP.NET 通過將控件標籤用作 resourcekey 將資源與控件屬性相匹配。如果在資源文件中定義了某個屬性值,則 ASP.NET 會用資源值替換該屬性。

顯式本地化

此外,也可以使用顯式本地化,此時將使用資源表達式。與隱式本地化不同,必須爲要設置的每個屬性分別使用一個資源表達式。

配置爲從全局資源文件設置 Text 屬性的 Button 控件看起來可能類似於下面這樣:

<asp:Button ID="Button1" runat="server" Text="<%___FCKpd___2nbsp;Resources:WebResources, Button1Caption %>" />

該資源表達式採用以下形式,其中 Class 是可選的(除非資源是全局資源),而 ResourceID 是必需的:

<%$ Resources: Class , ResourceID %>

Class 值標識要在使用全局資源時使用的資源文件。在編譯 .resx 文件時,將不帶擴展名的基文件名顯式用作所得程序集的類名。若要使用本地資源文件(與當前頁名匹配的文件)中的資源,則不必提供類名,因爲 ASP.NET 將該頁類與資源類相匹配。

ResourceID 值是要讀取的資源的標識符。在前面的示例中,從全局資源文件 WebResources.resx(或相應的本地化版本)讀取按鈕的 Text 屬性。在該文件中,ASP.NET 將該值用於帶有標識符 Button1Caption 的資源及頁本身。若要設置頁屬性,可以在 @ Page 指令中使用資源表達式。

本地化靜態文本

如果頁面包含靜態文本,則可以使用 ASP.NET 本地化,方法是將該本地化包含在 Localize 控件中,然後使用顯式本地化設置該靜態文本。Localize 控件不呈現標記;它的唯一功能就是充當本地化文本的佔位符。Localize 控件不僅可以在屬性網格中編輯,還可以在“設計”視圖中編輯。在運行時,ASP.NET 將 Localize 控件視爲 Literal 控件。例如,頁面可能包含下面的代碼:

<h1>
    
<asp:Localize runat=server 
      
ID="WelcomeMessage" 
      Text
="Welcome!" meta:resourcekey="LiteralResource1" />
</h1>
<br />
<br />
<asp:Localize runat="server"
    ID
="NameCaption"
    Text
="Name: " meta:resourcekey="LiteralResource2" />
<asp:TextBox runat="server" ID="TextBox1" 
    meta:resourcekey
="TextBox1Resource1" />

爲不同的語言選擇資源文件

當正在運行某頁並且 ASP.NET 正在從資源管理器中檢索值時,ASP.NET 爲該頁選擇與當前 UICulture 設置匹配程度最高的資源文件版本,或者使用資源後備獲取資源。例如,如果正在運行 Default.aspx 頁並且當前的 UICulture 屬性設置爲 es(西班牙語),則 ASP.NET 使用本地資源文件 Default.aspx.es.resx 的已編譯版本。

ASP.NET 可以將該頁的 UICultureCulture 屬性設置爲瀏覽器所傳遞的語言和區域性值。或者,可以以聲明方式或通過使用代碼顯式設置 UICultureCulture 屬性。還可以在 Web.config 文件中以聲明方式設置這些值。有關詳細信息,請參見如何:爲 ASP.NET 網頁全球化設置區域性和 UI 區域性

Note注意

不應唯一依賴瀏覽器設置來設置語言和區域性信息,因爲用戶使用的可能不是自己計算機上的瀏覽器。此外,瀏覽器經常只傳送語言,而不傳送特定的區域性。在這種情況下,服務器必須推導數據格式設置的特定區域性。一個好的策略就是讓用戶顯式選擇語言。

以編程方式使用資源

除了使用資源表達式在標記中設置資源值外,還可以用編程方式檢索資源值。如果在設計時資源值未知或者要根據運行時條件設置資源值,您可能會這樣做。有關詳細信息,請參見如何:以編程方式檢索資源值

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章