ASP.NET2.0_多语言本地化应用程序
1.設置當前文化
?????頁面類有兩個影響本地化的重要屬性均在< % Page % >指令設置:1).UICulture
?????此屬性用于指定載入到頁面的資源文件,資源文件可以包含頁面文本內容的特定語言的翻譯版本.其屬性值可為中立文化也可為特定文化(下面有介紹)2).Culture
?????此屬性決定了諸如日期、數值、貨幣單位等的格式與排序。此屬性值只能為特定文化.?????以上UICulture和Culture屬性都接受標準的文化名稱作為它們的值。(可在http://www.IETF.org查看標準文化名稱)
注:UICulture屬性決定了為頁面載入哪個資源文件,而Culture是決定了日期,數字,貨幣數量如何格式化
常用的文化名稱如下:
zh-CN=Chinese(China)
en-US=English(United States)
en-GB=English(United Kingdom)
注:每個文化名稱有兩個部分組成。第一部分代表語言代碼,第二部分代表國家/區域代碼
即文化名稱=語言代碼-代表國家/區域代碼
若只有語言代碼,而無國家/區域代碼的文化名稱則為中立文化(neutral culture)
若即有語言代碼,又有國家/區域代碼的文化名稱則為特定文化(specific culture)
1.1手動設置文化
實例手動在Page指令中設置:
Code<%@?Page?Language="C#"?UICulture="id-ID"?Culture="id-ID"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
????void?Page_Load()
????{
????????this.lblToday.Text?=?DateTime.Now.ToString("D");
????????this.lblPrice.Text?=?(512.3m).ToString("c");?
????}
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title>印度尼西亞文化</title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????今天的日期是:
????????<asp:Label?ID="lblToday"?runat="server"?/>
????????<hr?/>
????????商品的價格是:
????????<asp:Label?ID="lblPrice"?runat="server"?/>
????</div>
????</form>
</body>
</html>
?
實例以編程方式設置這些屬性:
SelectCulture.aspx<%@?Page?Language="C#"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
????void?Page_Load()
????{
????????
????}
????void?Page_PreRender()
????{
????????this.lblToday.Text?=?DateTime.Now.ToString("D");
????????
????????this.lblPrice.Text?=?(512.3m).ToString("c");?
????}
????protected?void?btnSelect_Click(object?sender,?EventArgs?e)
????{
????????Page.Culture?=?ddlCulture.SelectedValue;
????}
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title>手動設置文化</title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<asp:Label?ID="lblCulture"?Text="文化"?AssociatedControlID="ddlCulture"?runat="server"?/>
????????<asp:DropDownList?ID="ddlCulture"?runat="server"
?????????DataTextField="DisplayName"?DataValueField="Name"?DataSourceID="srcCulture"?/>
????????<asp:Button?ID="btnSelect"?Text="選擇"?runat="server"?OnClick="btnSelect_Click"?/>
????????<hr?/>
????????今天的日期是:
????????<asp:Label?ID="lblToday"?runat="server"?/>
????????<hr?/>
????????商品的價格是:
????????<asp:Label?ID="lblPrice"?runat="server"?/>
????????
????????<asp:ObjectDataSource?ID="srcCulture"?runat="server"
?????????TypeName="System.Globalization.CultureInfo"?SelectMethod="GetCultures">
????????????<SelectParameters>
????????????????<asp:Parameter?Name="types"?DefaultValue="SpecificCultures"?/>
????????????</SelectParameters>
?????????</asp:ObjectDataSource>
????????
????</div>
????</form>
</body>
</html>
實例用Profile記錄用戶的文化以便用戶以后訪問網站時自動進入記錄的文化不必再設置(注意:有重寫了InitializeCulture()此方法是為頁的當前線程設置 Culture 和 UICulture):
<%@?Page?Language="C#"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
????//為頁的當前線程設置?Culture?和?UICulture。?
????protected?override?void?InitializeCulture()
????{
????????Page.Culture?=?Profile.UserCulture;
????????Page.UICulture?=?Profile.UserUICulture;
????}
????
????void?Page_Load()
????{
????????//Page.Culture?=?Profile.UserCulture;
????????//Page.UICulture?=?Profile.UserUICulture;
????}
????void?Page_PreRender()
????{
????????this.lblToday.Text?=?DateTime.Now.ToString("D");
????????this.lblPrice.Text?=?(512.3m).ToString("c");?
????}
????protected?void?btnSelect_Click(object?sender,?EventArgs?e)
????{
????????Profile.UserCulture?=?ddlCulture.SelectedValue;
????????Profile.UserUICulture?=?ddlCulture.SelectedValue;
????????Page.Culture?=?ddlCulture.SelectedValue;
????}
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title>手動設置文化</title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<asp:Label?ID="lblCulture"?Text="文化"?AssociatedControlID="ddlCulture"?runat="server"?/>
????????<asp:DropDownList?ID="ddlCulture"?runat="server"
?????????DataTextField="DisplayName"?DataValueField="Name"?DataSourceID="srcCulture"?/>
????????<asp:Button?ID="btnSelect"?Text="選擇"?runat="server"?OnClick="btnSelect_Click"?/>
????????<hr?/>
????????今天的日期是:
????????<asp:Label?ID="lblToday"?runat="server"?/>
????????<hr?/>
????????商品的價格是:
????????<asp:Label?ID="lblPrice"?runat="server"?/>
????????
????????<asp:ObjectDataSource?ID="srcCulture"?runat="server"
?????????TypeName="System.Globalization.CultureInfo"?SelectMethod="GetCultures">
????????????<SelectParameters>
????????????????<asp:Parameter?Name="types"?DefaultValue="SpecificCultures"?/>
????????????</SelectParameters>
?????????</asp:ObjectDataSource>
????????
????</div>
????</form>
</body>
</html>
?
1.2自動檢測文化
即利用瀏覽器請求一個頁面時,它會發送一個Accept-Language首部,其包含了用戶習慣的語言列表. 可用Request.UserLanguages屬性返回Accept-Language首部的值.實例顯示Accept-Language:
ShowAcceptLanguage.aspx<%@?Page?Language="C#"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
????void?Page_Load()
????{
????????bltAcceptLanguage.DataSource?=?Request.UserLanguages;
????????bltAcceptLanguage.DataBind();?
????}
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title>顯示Accept-Language</title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<asp:BulletedList?ID="bltAcceptLanguage"?runat="server"?/>
????</div>
????</form>
</body>
</html>
?
1.3在Web配置文件中設置文化
< system.web > < globalization culture="en-US" uiCulture="en-US" / > < / system.web >
1.4文化和ASP.NET控件
Culture屬性的值會自動地影響諸如Calendar這樣的ASP.NET控件的呈現行為。實例:
ShowCalendar.aspx<%@?Page?Language="C#"?Culture="zh-CN"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title>文化和ASP.NET控件</title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<asp:Calendar?ID="Calendar1"?runat="server"></asp:Calendar>
????</div>
????</form>
</body>
</html>
?
2.使用CultureInfo類
?????CultureInfo類包含了大約超過150個不同的文化的信息??梢栽谖覀兊拇a中使用該類的方法返回特定的 區域。使用這些信息來格式化諸如日期、數字和貨幣數量的值。2.1使用CultureInfo類格式化字符串值
即在ToString()方法中使用第二個參數。
實例:
3.創建本地資源
?????使用資源文件可根據用戶的語言修改頁面的文本或其他內容。每一個資源文件可以包含頁面文本的特定語言的翻譯版本.ASP.NET Framework支持兩種類型的資源文件:本地資源和全局資源.
ASP.NET Framewormk自動把本地資源編譯成程序集,而全局資源就編譯成一個類,這樣全局資源就可以用強類型表達式在代碼中處理全局資源!
當創建一個資源時,一個新類會自動添加到Resource命名空間.該類以屬性的形式暴露了所有資源文件中的項目.
在開始本地化一個頁面之前,一定要創建一個默認本地化文件.即如test.aspx.resx
3.1顯式本地化表達式(即用顯式的< %$ Resources:[**ResourceFileName,] **ResourceKeyName % >為控件屬性設置一個特定的資源項目的值)
pageName.[cultureName].resx
即例如:為頁面test.aspx頁面關聯資源文件那么資源文件的命名將如下:
test.aspx.resx(默認,若沒有其他資源文件符合用戶的語言設置,則用此資源文件來應用)
test.aspx.zh.resx(中立文化,若沒有符合用戶特定文化語言設置,而有中立文化符合,則用此資源文件)
test.aspx.zh-CN.resx(特定文化,若符合用戶特定文化語言設置,就應用此資源文件)
MSDN版資源表達式說明:
該資源表達式采用以下形式,其中 Class 是可選的(除非資源是全局資源),而 ResourceID 是必需的:
< %$ Resources: Class , ResourceID % >
Class 值標識要在使用全局資源時使用的資源文件。在編譯 .resx 文件時,將不帶擴展名的基文件名顯式用作所得程序集的類名。若要使用本地資源文件(與當前頁名匹配的文件)中的資源,則不必提供類名,因為 ASP.NET 將該頁類與資源類相匹配。
ResourceID 值是要讀取的資源的標識符。在前面的示例中,從全局資源文件 WebResources.resx(或相應的本地化版本)讀取按鈕的 Text 屬性。在該文件中,ASP.NET 將該值用于帶有標識符 Button1Caption 的資源及頁本身。若要設置頁屬性,可以在 @ Page 指令中使用資源表達式。
實例之正常無本地資源版(即頁面內容不會隨著用戶的語言文化而改變):
SimplePage.aspx<%@?Page?Language="C#"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
????protected?void?btnSubmit_Click(object?sender,?EventArgs?e)
????{
????????this.lblMsg.Visible?=?true;
????}
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title>簡單頁面</title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<asp:Button?ID="btnSubmit"?runat="server"?OnClick="btnSubmit_Click"?Text="Click?Here!"?/><br?/>
????????<br?/>
????????<asp:Label?ID="lblMsg"?runat="server"?Text="Thank?you!"?Visible="False"></asp:Label>
????</div>
????</form>
</body>
</html>
?
實例之顯式本地資源版(即頁面內容會隨著用戶的語言文化而改變)
(相應的資源文件在此略了,也就先建立App_LocalResources文件夾,再在其中添加相應的資源文件及資源鍵/值等):
LocalizablePage.aspx<%@?Page?Language="C#"?UICulture="auto"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
????protected?void?btnSubmit_Click(object?sender,?EventArgs?e)
????{
????????this.lblMsg.Visible?=?true;
????}
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title>本地化頁面</title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<asp:Button?ID="btnSubmit"?runat="server"?OnClick="btnSubmit_Click"?Text="<%$?Resources:ClickHere?%>"?/><br?/>
????????<br?/>
????????<asp:Label?ID="lblMsg"?runat="server"?Text="<%$?Resources:ThankYou?%>"?Visible="False"/>
????</div>
????</form>
</body>
</html>
?
3.2隱式本地化表達式
(即用一個資源鍵meta:resourceKey="ControlID"本地化控件的多個屬性(這些屬性在相應的資源文件中以Key(ControlID) . Property格式定義好了))
注:被隱式本地化的控件屬性其被定義在資源文件中,則此控件屬性在頁面中可聲明也可不用聲明或只給出默認值
使用本地資源的隱式本地化
如果您已為特定頁創建了本地資源文件,則可以使用隱式本地化從該資源文件中為控件填充屬性值。使用隱式本地化時,ASP.NET 讀取資源文件并將資源與屬性值相匹配。
若要使用隱式本地化,必須對本地資源文件中的資源使用命名約定,命名約定采用以下模式:
Key . Property
例如,若要為名為 Button1 的 Button 控件創建資源,可以在本地資源文件中創建以下鍵/值對:
Button1.Text
Button1.BackColor
Label1.Text
可以對 Key 使用任意名稱,但 Property 必須與要本地化的控件的屬性相匹配。
在頁上,對該控件的標記使用特殊的 meta 屬性可指定隱式本地化。不必顯式指定要本地化的屬性。配置為使用隱式本地化的 Button 控件看起來可能類似于下面的形式:
resourcekey 值與相應資源文件中的鍵相匹配。在運行時,ASP.NET 通過將控件標簽用作 resourcekey 將資源與控件屬性相匹配。如果在資源文件中定義了某個屬性值,則 ASP.NET 會用資源值替換該屬性。
實例:
LocalizablePageImplicit.aspx<%@?Page?Language="C#"?UICulture="auto"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
????protected?void?btnSubmit_Click(object?sender,?EventArgs?e)
????{
????????this.lblMsg.Visible?=?true;
????}
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title>本地化頁面</title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<asp:Button?ID="btnSubmit"?runat="server"?OnClick="btnSubmit_Click"?meta:resourceKey="btnSubmit"?ToolTip="default?value"?/><br?/>
????????<br?/>
????????<asp:Label?ID="lblMsg"?runat="server"?meta:resourceKey="lblMsg"?Text="default?value"?Visible="False"/>
????</div>
????</form>
</body>
</html>
?
使用隱式的本地化表達式比顯式資源表達式有兩個好處.
3.3對頁面屬性使用本地化資源
可以使用資源表達設置諸如頁面標題這樣的的頁面屬性。
實例(顯式本地化頁面方式):
?
PageExplicit.aspx<%@?Page?Language="C#"?UICulture="auto"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title><asp:Literal?ID="ltlTitle"?Text="<%$?Resources:TitleText?%>"?runat="server"?/></title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<h1>顯式本地化頁面</h1>
????</div>
????</form>
</body>
</html>
實例(隱式本地化頁面方式):
PageImplicit.aspx<%@?Page?Language="C#"?UICulture="auto"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title><asp:Literal?ID="ltlTitle"?Text="SB?SB?SB"?meta:resourceKey="ltlTitle"?runat="server"?/></title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<h1>隱式本地化頁面</h1>
????</div>
????</form>
</body>
</html>
?
3.3以編程方式獲取本地化資源
在代碼中訪問本地資源,可以使用GetLocalResourceObject()由方法得到其值.實例: ProgramLocalResource.aspx
<%@?Page?Language="C#"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
????void?Page_Load()
????{
????????string?welcomeMsg?=?(string)GetLocalResourceObject("welcomeMsg");
????????lblMsg.Text?=?string.Format(welcomeMsg,?"ithqm");?
????}
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title>以編程方式獲取本地資源</title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<asp:Label?ID="lblMsg"?runat="server"?/>
????</div>
????</form>
</body>
</html>
4.創建全局資源
?????本地資源用于特定的頁面.而全局資源就用于應用程序的任意頁面.任意需要被多個頁面共享的本地化內容應該被放在一個全局資源文件中
?????可通過在根目錄下添加特殊文件夾App_GlobalResources來實現全局資源文件夾,再創建相應的全局資源文件.
實例:
ShowGlobalPage.aspx
<%@?Page?Language="C#"?UICulture="auto"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title><asp:Literal?ID="ltlTitle"?Text="<%$?Resources:Site,Title?%>"?runat="server"?/></title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<br?/>頁面內容
????????<br?/>頁面內容
????????<br?/>頁面內容
????????<br?/>頁面內容<hr?/>
????????<asp:Literal?ID="ltlCopyright"?Text="<%$?Resources:Site,Copyright?%>"?runat="server"?/>
????</div>
????</form>
</body>
</html>
4.1以編程方式獲取全局資源
利用GetGlobalResourceObject()
實例:
ProgramGlobalResource.aspx<%@?Page?Language="C#"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
????void?Page_Load()
????{
????????string?welcomeMsg?=?(string)GetGlobalResourceObject("Site","Title");
????????lblMsg.Text?=?welcomeMsg;
????}
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title>以編程方式獲取全局資源</title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<asp:Label?ID="lblMsg"?runat="server"?/>
????</div>
????</form>
</body>
</html>
?
4.2使用強類型本地化表達式
?????ASP.NET Framewormk自動把本地資源編譯成程序集,而全局資源就編譯成一個類,這樣全局資源就可以用強類型表達式在代碼中處理全局資源!?
?????當創建一個資源時,一個新類會自動添加到Resources命名空間.該類以屬性的形式暴露了所有資源文件中的項目.
實例:
ProgramGlobalTyped.aspx
<%@?Page?Language="C#"?UICulture="auto"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
????void?Page_Load()
????{
????????//讀取全局資源文件的屬性.
????????lblMsg.Text?=?Resources.Site.Title;?
????}
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title>強類型訪問全局資源</title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<asp:Label?ID="lblMsg"?runat="server"?/>
????</div>
????</form>
</body>
</html>
5使用Localize控件
Localize控件與控件Literal控件非常相似(它繼承自Literal控件),也就Localize控件可直接在源碼視圖狀態下直接編寫
實例:
ShowLocalizeControl.aspx<%@?Page?Language="C#"?%>
<!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script?runat="server">
</script>
<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????<title>顯示?Localize?控件</title>
</head>
<body>
????<form?id="form1"?runat="server">
????<div>
????????<asp:Localize?ID="locBodyText"?meta:resourceKey="locBodyText"?runat="server">
????????????這里是些頁面內容.
????????</asp:Localize>
????????<br?/><br?/>
????????<asp:Literal?ID="ltlBodyText"?runat="server">這里是些literal文本!</asp:Literal>
????</div>
????</form>
</body>
</html>
轉載于:https://www.cnblogs.com/ArisHuang/archive/2008/10/05/1304374.html
總結
以上是生活随笔為你收集整理的ASP.NET2.0_多语言本地化应用程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Keil5 显示汉字时字体不生效,设置国
- 下一篇: voip是利用计算机网络,计算机三级网络