這個(gè)功能其實(shí)大家早就知道了,現(xiàn)在由于有一個(gè)項(xiàng)目要用到這個(gè)技術(shù),所以又去全面一些的查找了一下。自己紀(jì)錄一下,方便于以后查找使用吧。
創(chuàng)建可有多種語言版本的 Web 應(yīng)用程序在 ASP.NET 2.0 版以前是一項(xiàng)復(fù)雜的任務(wù)。如果您使用資源文件 (RESX) 及 ResourceManager,則需要手動分離出可本地化的元素,并執(zhí)行自己的資源加載過程,這需要花費(fèi)您很多的精力并需要編寫大量的代碼。ASP.NET 2.0 版大大簡化了此過程,并且增加了很多功能,如:
- 對客戶端瀏覽器發(fā)送的接受語言 (Accept-Language) HTTP 請求標(biāo)頭字段進(jìn)行自動檢測
- 使用聲明性資源表達(dá)式將控件或其屬性連接到資源
- 通過程序訪問資源及強(qiáng)類型資源
- 自動編譯 RESX 或 RESOURCE 文件并將其鏈接到運(yùn)行庫附屬程序集
- 對資源的創(chuàng)建提供進(jìn)一步的設(shè)計(jì)時(shí)支持
- 提供具有完全的擴(kuò)展性的模型,以使 RESX 模型能夠交換出來
首先要在頁面級別(<%@ Page UICulture="auto" Culture="auto" %>)或整個(gè)Portal級別(在Web.config中<globalization uiCulture="auto" culture="auto"/>)定義特定 UICulture
和 Culture
屬性。這兩個(gè)屬性的值均為 auto。這將指示 ASP.NET 基于客戶端瀏覽器的首選區(qū)域性為頁的執(zhí)行檢測并設(shè)置當(dāng)前線程區(qū)域性和 UI 區(qū)域性。如果不為auto則可以為其指定具體的語言。
如果需要從數(shù)據(jù)庫中讀取的信息作為選擇語言的標(biāo)準(zhǔn),需要對Thread.CurrentThread.CurrentCulture 和 Thread.CurrentThread.CurrentUICulture 進(jìn)行更改,并且需要在 InitializeCulture()
方法中進(jìn)行,因?yàn)閷κ走x瀏覽器語言的自動檢測是在頁生存期的早期發(fā)生的。
可以通過后臺代碼或直接在頁面上調(diào)用資源文件中的內(nèi)容。
有兩種形式的資源表達(dá)式:顯式和隱式。
資源表達(dá)式形式 |
說明 |
顯式 |
<%$ Resources:[filename prefix,]resource-key %>
顯式表達(dá)式用于以聲明性語法定義控件屬性的值,resource-key(必需)用于映射到資源中的值。filename prefix 參數(shù)是可選的,filename 指定全局資源文件夾中的資源文件的名稱。 |
隱式 |
<asp:Label ID="Label1" runat="server" meta:resourcekey="resource-key-prefix" />
隱式表達(dá)式以聲明性語法用作控件或?qū)ο蟮膶傩?,并且定義 resource-key-prefix,用于為控件執(zhí)行許多屬性分配。資源文件包含許多具有常規(guī)形式 resource-key-prefix.Property 的潛在資源鍵,例如 Label1KeyPrefix.Text 和 Label1KeyPrefix.Font-name。所有資源都只能從本地資源獲取??梢詫⒈磉_(dá)式看作一個(gè)短格式表示法,用于在未顯式在頁中定義屬性的情況下映射一個(gè)到多個(gè)控件屬性。 |
以編程的方法檢索資源值:
可以使用聲明性語法將 ASP.NET 服務(wù)器控件屬性值設(shè)置為資源值,也可以以編程方式檢索資源值。如果在設(shè)計(jì)時(shí)資源值未知或者需要根據(jù)運(yùn)行時(shí)條件設(shè)置資源值,可能會這樣做。
可以從本地資源文件和全局資源文件中獲取資源值,這些文件使用的方法返回一個(gè)可強(qiáng)制轉(zhuǎn)換為適當(dāng)類型的對象。由于 ASP.NET 使用強(qiáng)類型編譯全局資源,因此也可以使用強(qiáng)類型成員獲取全局資源。
調(diào)用 GetLocalResourceObject 或 GetGlobalResourceObject 方法以分別從全局資源文件或本地資源文件中讀取特定的資源。在 HttpContext 和 TemplateControl 類中提供了這些重載方法。
GetGlobalResourceObject 方法采用資源類名和資源 ID。該類名基于的是 .resx 文件名。例如,文件 WebResources.resx 和所有相關(guān)聯(lián)的本地化文件都由類名 WebResources 引用。
GetLocalResourceObject 方法采用表示 ResourceKey 屬性的資源名。
下面的代碼示例演示如何從本地資源文件和全局資源文件獲取資源值。這些方法返回一個(gè)對象;因此,必須將該資源強(qiáng)制轉(zhuǎn)換為適當(dāng)?shù)念愋汀?/p>
存儲在 App_LocalResources 特殊文件夾中的默認(rèn)本地資源文件根據(jù) ASP.NET 頁命名。例如,如果在 Default.aspx 頁中使用了下面的代碼,則必須將該資源文件命名為 Default.aspx.resx。在此示例中,向此文件添加了一個(gè)名為 Button1.Text 的字符串資源,并且該資源帶有 "Found Resources" 值。
此外,在此示例中,存儲在 App_GlobalResources 特殊文件夾中的默認(rèn)全局資源文件命名為 WebResourcesGlobal.resx。向此文件添加了一個(gè)名為 LogoUrl 的字符串資源,而且該資源帶有http://go.microsoft.com/fwlink/?LinkId=49295 值或其他圖像的 URL
<%@ Page Language="C#" %>

<script runat="server">
protected void Button1_Click(object sender, EventArgs e)

{
Button1.Text =
GetLocalResourceObject("Button1.Text").ToString();
Image1.ImageUrl =
(String)GetGlobalResourceObject(
"WebResourcesGlobal", "LogoUrl");
Image1.Visible = true;
}
</script>

<html >
<head id="Head1" runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server"
OnClick="Button1_Click"
Text="Get Resources" />
<asp:Image ID="Image1" runat="server"
Visible="false" />
</div>
</form>
</body>
</html>
使用強(qiáng)類型檢索全局資源