ASP.NET Web 網頁資源概觀

更新:2007 年 11 月

如果您要建立可供全世界的人都能閱讀的網頁,則必須提供一個方法好讓閱讀者可以選擇以自己的母語檢視網頁。一個處理方法是以每種語言重新建立網頁,不過,這個方法相當耗費人力、容易出錯,而且在原始網頁變更時也難以維護。

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 會使用資源後援。一開始它會先搜尋特定文化特性的資源。如果找不到這些文化特性的話,就會針對中性文化特性搜尋其資源。如果還是找不到,ASP.NET 就會載入預設的資源檔。在這個範例中,預設資源檔為 WebResource.resx。

建立 ASP.NET 網站的資源檔

在 ASP.NET 中,您可以建立具有不同範圍的資源檔。您可以建立全域資源檔,也就是可以從網站中的任何網頁或程式碼讀取資源檔。您也可以建立本機資源檔,用來儲存單一 ASP.NET 網頁 (.aspx 檔) 的資源。

全域資源檔

將檔案放到位於應用程式根目錄之保留的 App_GlobalResources 資料夾中,便可以建立全域資源檔。任何在 App_GlobalResources 資料夾中的 .resx 檔都能用於全域範圍。此外,ASP.NET 會產生強型別 (Strongly Typed) 物件,讓您以程式設計方式輕鬆存取全域資源。

本機資源檔

本機資源檔是只套用至一個 ASP.NET 頁面或使用者控制項 (使用 .aspx、.ascx 或 .master 等副檔名的 ASP.NET 檔案) 的檔案。您可以將本機資源檔放在具有保留的 App_LocalResources 名稱之資料夾中。與根 App_GlobalResources 資料夾不同的是,App_LocalResources 資料夾可以位於應用程式的任何資料夾中。您可以使用資源檔的名稱,將一組資源檔關聯至特定 Web 網頁。

例如,如果 App_LocalResources 資料夾中有一個名為 Default.aspx 的網頁,您可以建立下列檔案:

  • Default.aspx.resx。如果找不到符合的語言時,就會使用這個預設的本機資源檔 (後援資源檔)。

  • Default.aspx.es.resx。這是不含文化特性資訊的西班牙文資源檔。

  • Default.aspx.es-mx.resx。這是西班牙文 (墨西哥) 專用的資源檔。

  • Default.aspx.fr.resx。這是不含文化特性資訊的法文資源檔。

檔案的主檔名 (Base Name) 符合網頁檔名,後面接著語言和文化特性名稱,並以副檔名 .resx 做為結尾。如需文化特性名稱的清單,請參閱 CultureInfo

當地語系化用戶端指令碼資源

以 ASP.NET 2.0 模型為基礎,對 ASP.NET AJAX 用戶端指令碼組建提供當地語系化支援。在此模型中,您可將指令碼檔案與當地語系化的指令碼資源內嵌在組件 (附屬組件) 的放射狀 (hub-and-spoke) 組織中。接著,您可以選擇性地使用這些特定語言與區域的內嵌用戶端指令碼與資源。這個模型會啟用單一程式碼基底 (Code Base) 來支援多重文化特性。它同樣支援磁碟上以 .js 檔案格式提供的當地語系化指令碼檔案。ASP.NET 可以自動為特定語言和區域處理當地語系化用戶端指令碼和資源。

如需詳細資訊,請參閱下列主題:

在全域和本機資源檔之間選擇

您可以在 Web 應用程式中使用全域和本機資源檔的任何組合。一般來說,當您想要在網頁間共用資源時,可以將資源加入至全域資源檔。當您想要以程式設計方式存取檔案時,全域資源檔中的資源也是強型別資源。

不過,如果您將所有當地語系化資源儲存於其中,全域資源檔可能會變得很龐大。如果有超過一位開發人員在單一資源檔中處理不同網頁,全域資源檔也可能較難管理。

本機資源檔可讓您更容易管理單一 ASP.NET 網頁的資源,不過您無法在網頁間共用資源。此外,如果您有許多必須當地語系化為不同語言的網頁,您可能會建立許多本機資源檔。如果網站包含大量資料夾和語言,使用本機資源會快速擴增應用程式定義域中的組件數目。

當您變更預設本機或全域資源檔時,ASP.NET 會重新編譯資源並重新啟動 ASP.NET 應用程式,這可能會影響網站的整體效能。加入附屬資源檔並不會導致重新編譯資源,不過 ASP.NET 應用程式會重新啟動。

注意事項:

只有全域資源檔支援連結資源。

使用 Web 頁面中的資源

在您建立資源檔後,可以在 ASP.NET 網頁中使用這些檔案。您通常是使用資源來填入網頁上控制項的屬性值,例如,您可以使用資源來設定 Button 控制項的 Text 屬性,而不用將屬性硬式編碼為特定字串。

若要使用資源來設定控制項屬性值,可以使用隱含當地語系化或明確當地語系化,如以下所示:

  • 隱含當地語系化會使用本機資源,並讓您將控制項屬性自動設定為符合的資源。

  • 明確當地語系化可讓您使用資源運算式,將控制項屬性設定為本機或全域資源檔中的特定資源。

使用本機資源進行隱含當地語系化

如果您已建立特定網頁的本機資源檔,便可使用隱含當地語系化從資源檔填入控制項的屬性值。進行隱含當地語系化時,ASP.NET 會讀取資源檔並將資源與屬性值相符。

若要使用隱含當地語系化,本機資源檔中的資源必須採用命名規範,其模式如下:

鍵值.Property

例如,如果您要建立名為 Button1 之 Button 控制項的資源,可以在本機資源檔中建立下列索引鍵/值組:

Button1.Text
Button1.BackColor
Label1.Text

您可以使用任何名稱來做為 Key,但 Property 必須符合要當地語系化之控制項的屬性名稱。

在網頁中,可以在控制項的標記內使用特殊 meta 屬性來指定隱含當地語系化。您不必明確指定要當地語系化的屬性。設定為使用隱含當地語系化的 Button 控制項看起來如下:

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

resourcekey 索引鍵會符合對應資源檔中的索引鍵。在執行階段,ASP.NET 會使用控制項標籤做為 resourcekey,將資源與控制項屬性相符。如果屬性值已在資源檔中定義,則 ASP.NET 會以資源值替代屬性。

明確當地語系化

您也可以使用資源運算式進行明確當地語系化,其與隱含當地語系化的不同之處,在於您必須針對每個要設定的屬性使用資源運算式。

設定為從全域資源檔設定 Text 屬性的 Button 控制項看起來如下:

<asp:Button ID="Button1"  
    Text="<%$ Resources:WebResources, Button1Caption %>" />

資源運算式使用下列格式,其中 Class 為選擇項 (除非資源為全域資源),而 ResourceID 為必要項:

<%$資源:類別,ResourceID%>

Class 值會識別當使用全域資源時所要使用的資源檔。在編譯 .resx 檔時,不含副檔名的主檔名會明確地用來做為產生之組件的類別名稱。如果想要使用來自本機資源檔的資源 (與目前網頁名稱相符的資源),則您不需要包含類別名稱。這是因為 ASP.NET 會將頁面類別對應至資源類別。

ResourceID 值是要讀取的資源之識別項。在先前的範例中,按鈕的 Text 屬性是從全域資源檔 WebResources.resx (或適當的當地語系化版本) 所讀取。在該檔案中,ASP.NET 會將該值用於具有 Button1Caption 識別項的資源,以及網頁本身。若要設定網頁屬性,可以使用 @ Page 指示詞中的資源運算式。

您可以為控制項指定明確資源運算式或隱含資源運算式,但不可同時指定兩者。下列在 Button 控制項上的宣告式語法將導致剖析器 (Parser) 錯誤:

<asp:Button ID="Button1" 
             
            meta:resourcekey="Button1Resource1"
            Text="<%$ Resources:WebResources, Button1Caption %>" />

在這個範例中,不但指定了隱含本機資源檔 (與目前網頁名稱相符的檔案),還指定了名為 WebResources 的明確資源檔。若要防止這個控制項發生剖析器錯誤,請移除其中一個資源運算式。

當地語系化靜態文字

如果網頁包含靜態文字,您可以使用 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 
    ID="NameCaption"
    Text="Name: " meta:resourcekey="LiteralResource2" />
<asp:TextBox  ID="TextBox1" 
    meta:resourcekey="TextBox1Resource1" />
安全性注意事項:

這個範例有一個可接受使用者輸入的文字方塊,這可能會造成安全性威脅。根據預設,ASP.NET 網頁會驗證該使用者的輸入內容中沒有包含指令碼或 HTML 項目。如需詳細資訊,請參閱指令碼攻擊概觀

樣板中的隱含當地語系化

在樣板化的控制項 (例如 DataListGridViewWizard 控制項) 中,您可以透過父控制項的隱含資源運算式來存取屬性,藉以當地語系化樣板樣式屬性,但無法在樣板本身中使用隱含資源運算式。

若要當地語系化樣板屬性 (Property) 的值,請使用樣板所屬控制項的 meta 屬性 (Attribute) 與資源索引鍵。然後在資源檔中使用 Property.Subproperty 語法或 Property-Subproperty 語法。例如,下列是對 Wizard 控制項有效的宣告式語法︰

<asp:Wizard ID="Wizard1" 
     
    meta:resourcekey="Wizard1Resource1">
  <NavigationStyle 
    BorderWidth="<%$ resources:navBorderWidth %>"/>
  <WizardSteps>
    <asp:WizardStep ID="WizardStep1" 
       
      Title="Step 1" 
      meta:resourcekey="WizardStep1Resource1">
    </asp:WizardStep>
  </WizardSteps>
</asp:Wizard>

下列本機資源檔中的索引鍵/值組可以用於前述範例:

Wizard1Resource1.NavigationStyle.BackColor, Red
navborderWidth, 5

或者,可以使用下列索引鍵/值組:

Wizard1Resource1.NavigationStyle-BackColor, Red
navborderWidth, 5

您可以在前述範例中針對 Wizard 控制項的 NavigationStyle 屬性使用明確資源運算式。明確資源運算式會省略 Class 名稱,因此可以使用本機資源檔中的資源。

如需使用樣板的伺服器控制項的詳細資訊,請參閱 ASP.NET Web 伺服器控制項樣板

選取不同語言的資源檔

在執行網頁時,ASP.NET 會選取與網頁目前 UICulture 設定最相近的資源檔版本。如果找不到符合的版本,ASP.NET 會使用資源後援來取得資源。例如,如果您正在執行 Default.aspx 網頁,且目前的 UICulture 屬性設定為 es (西班牙文),則 ASP.NET 會使用編譯過的 Default.aspx.es.resx 本機資源檔版本。

ASP.NET 可以將網頁的 UICultureCulture 屬性,設定為由瀏覽器所傳遞的語言和文化特性值。或者,您也能以宣告方式或在程式碼中,明確設定 UICultureCulture 屬性。您也可以在 Web.config 檔中以宣告方式設定值。如需詳細資訊,請參閱 HOW TO:設定 ASP.NET Web 網頁全球化的文化特性和 UI 文化特性

注意事項:

您不應該只依據瀏覽器設定來設定語言和文化特定資訊,因為使用者可能會在別人的電腦上使用瀏覽器。而且,瀏覽器通常只傳達語言資訊,且不包含特定文化特性設定。在此情況下,伺服器必須推算特定的文化特性,以進行資料格式化。一個有效策略是讓使用者明確選取語言。

以程式設計方式使用資源

除了使用資源運算式在標記中設定資源值外,您也能以程式設計方式擷取資源值。使用的時機是當資源值在設計階段還未知時,或您想要將資源值設為在執行階段取得的值時。如需詳細資訊,請參閱 HOW TO:以程式設計方式擷取資源值

請參閱

其他資源

ASP.NET 全球化和當地語系化