[转].Net实现本地化简易教程
本文轉自:https://www.cnblogs.com/csdbfans/archive/2011/10/17/2214048.html
?
實現多語言版本的支持,就是所謂的國際化,也說是本地化。
今天這里將要介紹的是.Net里面實現本地化的介紹。網上有很多文章介紹怎么實現本地化,但是大多不適合初學者去學習,因為初學者需要更為詳細的介紹以及圖表作為說明。
所以本著互相學習的想法,我也寫一下自己最近學習的心得體會。
首先,這里面需要介紹一些知識。當然,你可以從文中選擇哪些是你需要的內容來進行閱讀。
這里面我們要說明的是全局資源文件,全局資源文件是存放在App_GlobalResources的文件夾里面。在Web Form里面創建這個文件夾很簡單,在“解決方案的資源管理器”中右鍵項目(WebSite或者是Application),選擇Add->Add ASP.NET Folder->App_GlobalResources(如下圖所示)。應用程序中只能有一個這樣的文件夾,且處于應用程序根目錄下,當然里面的資源文件就不是惟一的。
?
?
還有另一種是局部資源文件,它跟全局資源文件類似,不一樣的就是存放的文件夾名字不一樣,局部資源文件夾是App_LocalResources。在應用程序里面,這樣的文件夾數量沒有作限制,而且也不限定它的位置。
第一點:實現Asp.net服務端控件本地化。
實現Asp.net服務端控件的本地化,非常簡單。一旦想給服務端的控件添加本地化信息,那么你就可以按如下的步聚來實現你的本地化操作。進入到設計視窗,然后鼠標點擊其中的一個服務端控件,然后選中菜單上的"Tools->Generate Local Resource”(如下圖)。然后VS2010就會為你創建此頁面的資源文件。然后在應用程序里面,你會發現多了一個文件夾App_LocalResources,并且里面多了一個以剛才編輯頁面命名的資源文件。被編輯的頁面是Login.aspx頁面,這時,你會在Login.aspx里面看到VS2010生成了一個新的目錄App_LocalResources,并且里面多了一個文件Login.aspx.resx。注意,這里的本地化文件的命名是固定的,不能被改變,一個本地化文件對應一個頁面文件。
?
雙擊資源文件Login.aspx.resx,并給其中的Value框輸入你需要的Value值。資源文件里面的Name值是Login.aspx服務端控件里面的屬性。這里需要講一下,資源文件并不只限于文本格式,其實還包括很多種格式的資源文件。下圖中在Login.aspx.resx底下有“Strings”下拉框(向下的三角形),點擊即可選擇需要添加的資源文件,并點擊“Add Resource”下拉框選擇添加。
添加完資源文件的話,服務端控件的本地化就實現完了,這時候你Ctrl+F5運行后,可以看到你登錄頁(Login.aspx)的內容就是你填寫的資源文件的內容。這里面資源文件的內容(上圖剛寫Name對應的Value值)我就不貼Login.aspx.resx圖了,我貼個結果吧。Login.aspx.resx是工具自動生成的文件,所以你不需要的列,你可以對其進行刪除或者是修改操作。
其實這里還有一個圖需要說明的,不知道你有沒有看到每個服務端控件的代碼里面,多了一個屬性。類似meta:resourcekey="RegisterHyperLinkResource1"。
這里面需要說明的是,它只對服務端控件起作用,不是服務端控件的文本,如果也想用資源文件的方式來做的話。下文會使用另一個控件來做(<asp:Localize>)。回過頭來說,我們是實現對多語言的支持,那么資源文件當然是需要多個的,比如再創建一個叫Login.aspx.en.resx的資源文件在App_LocalResources里面。
改變瀏覽器閱讀網站首選項的語言,再刷新瀏覽器里面Login.aspx頁面,你就會發現里面使用的語言變成是英語,而不是剛才的中文。改變瀏覽器閱讀網站語言的設置如下:以IE做說明,IE菜單:工具->Internet選項->語言->添加->選擇英語。這里之后需要注意的是:英文需要排在第一位,不然不會起作用。
?
上面介紹了怎么實現Asp.Net里面服務端控件的本地化,那普通的文本呢?其實普通的文本也可以支持到。但是感覺普通的文件其實跟用個Label的方式來做有什么不同了?
也許就是Label會自動生成更多的Name名(在資源文件里面),省去我們刪除的工作吧。所以人家微軟給你另一種支持了,如果你覺得可以用,那就用吧。拿上文登錄頁Login.aspx頁面的代碼來說吧:
<p>Please enter your username and password. <asp:HyperLink ID="RegisterHyperLink" runat="server" EnableViewState="False"meta:resourcekey="RegisterHyperLinkResource1"> Register</asp:HyperLink> if you don't have an account.</p>這里面我們可以用<asp:Localize>服務端控件,這個控件位于工具箱里的標準類別里面。加入了Localize后代碼如下所示:
<p><asp:Localize ID="Header" runat="server"> Please enter your username and password.</asp:Localize> <asp:HyperLink ID="RegisterHyperLink" runat="server" EnableViewState="False"meta:resourcekey="RegisterHyperLinkResource1">Register</asp:HyperLink> <asp:Localize ID="Footer" runat="server"> if you don't have an account.</asp:Localize></p>其實到了這一步之后,又需要用到我們在上面提到的一個屬性meta:resourcekey="HeaderResource1”,然后在資源文件里面寫需要顯示的內容。
這里面如果你不知道資源文件里面的Name值是什么的話,其實也可以跟開始那樣,在設計視窗里面點擊里面的服務端控件,然后“Tools->Generate Local Resource”。這后之后它就會變成如下的代碼:
然后在資源文件里面,你也能看到相應的變化,不過它只改變默認的一個資源文件,其它不同語言的資源文件它并不會同步改變。?
下圖我還有一個地方想說明一下,那就是底下的Access Modifier下拉框,里面三種訪問修辭符。Public是公共訪問的,Internal是程序里面訪問的,No code generation應該就是這種不需要使用代碼來訪問的。
上面提到的都還只是局部資源文件里面的內容,下面我們要介紹下全局資源文件夾里面的資源文件是怎么使用的。這里介紹的是用代碼的方式來實現本地化。說到全局資源文件,那就是放App_GlobalResources文件里面的資源文件。添加此文件夾的方法,我想大家都知道了,本文開始的部分就有 介紹了,跟局部資源文件夾的方法一樣。接著我們就來新建我們的全局資源文件GlobalResource.resx。
這里面有必要看一下GlobalResource.resx的后置文件----GlobalResource.Designer.cs。
在全局資源文件里面加了Name為Test,Value為測試的內容保存之后,你會發現在它的后置代碼(GlobalResource.Designer.cs)文件里面增加了如下的內容:
internal static string Test {get {return ResourceManager.GetString("Test", resourceCulture);}}這個代碼應該不難懂吧,它就是用Test屬性來取文本值。這里需要注意的是它是internal的訪問修辭符,和一個靜態屬性。所以你在代碼里面加入了這個類的命明空間之后,就可以通過類的屬性方式來獲取資源文件里面文本的內容,當然其它資源類型也是一樣的獲取方式,只不是屬性的返回類型不一樣而已。
(1)在cs代碼里面直接獲取:string content = Resources.GlobalResource.Test (2)Resource表達式: <asp:Localize ID="Head" runat="server"? Text="<%$ Resources:GlobalResource, Test %>"></asp:Localize> 這里面Resources是命明空間,GlobalResource是類名,Test是類里面的屬性,通過它們來取到資源文件的值。 (3)使用GetGlobalResourceObject方法: string content = GetGlobalResourceObject("GlobalResource", "Test").ToString(); 這里GetGlobalResourceObject方法返回的是一個Object。 對比一下,局部的作法: (1)Resource表達式:<asp:Localize ID="Head" runat="server"Text=" <%$ Resources:LoginButtonResource1.Text %> "></asp:Localize> 這是局部資源文件的綁定方法,在局部資源文件里面,沒有對應的后置文件,就是沒有.cs文件,直接用固定的方式來取值。Resources是 默認的命明空間名,這里不像全局可以改變(至少我是沒有發現),冒號后面的就是局部資源文件里面的Name值。 (2)meta:resourceKey,就是服務端控件本地化的實現。 (3)GetLocalResourceObject方法,跟GetGlobalResourceObject類似。 最后,作為收尾的介紹。我們來講講實現動態本地化的方式。 這里面我們還是以登錄頁(Login.aspx)為例來作說明,在頁面中增加語言的選擇下拉框,讓用戶可以選擇想要的語言來實現本地化。 Login.aspx.cs代碼如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Threading; using System.Globalization;namespace ResourceWebForm.Account {public partial class Login : System.Web.UI.Page {protected void Page_Load(object sender, EventArgs e) {} //枚舉語言類型 enum Language{English,Chinese}protected override void InitializeCulture() {//獲取select下拉框里面的值string language = Request.Form["ddlLanguageName"];string languageId = ""; if (!string.IsNullOrEmpty(language)) {try {//把字符串轉為枚舉類型Language enumLanguage=(Language)System.Enum.Parse(typeo(Language),language);switch(enumLanguage) {case Language.Chinese:languageId = "zh-CN";break;default:languageId = "en-US";break;}}catch(Exception ex){languageId = "en-US";}Thread.CurrentThread.CurrentCulture=CultureInfo.CreateSpecificCulture(languageId);Thread.CurrentThread.CurrentUICulture = new CultureInfo(languageId);}base.InitializeCulture();}} }
在Login.aspx頁面里面相比之前的內容只是加了一個下拉框跟一個按鈕來提交語言的改變(在下圖底下的代碼)。這里通過重寫父類的方法InitializeCulture()來達到本地化的效果。此方法用來初始化頁面的Culture和UICulture的信息。在 ASP.NET Web網頁當中,您可以設定這兩個文化特征值,即?Culture?和UICulture?屬性。Culture?值判定與文化特性相關功能的結果 (例如,日期、數字和貨幣格式等)。
UICulture?值判定為網頁載入的資源。如果想了解更多,可以參照此鏈接Page.InitializeCulture方法。關于上面代碼的languageId,你如果不知道還有語言的簡寫的話,可以用上面的方法,在瀏覽器里面:IE菜單:工具->Internet選項->語言->添加,這樣你就知道每種語言的簡寫是什么了。
這里面主要改變的是App_LocalResources局部資源文件夾里面的文件內容(Login.aspx.resx和Login.aspx.zh.resx),全局資源文件的作法也類似局部資源文件的作法
在你們的教導下,我相信自己能學得更好。至少思維的碰撞能讓我們理解得更加透徹吧。如果你覺得本文還揍合過去,想轉載的話,請務必加上此標注。
最后祝大家學得快樂:)
總結
以上是生活随笔為你收集整理的[转].Net实现本地化简易教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取用户精准地理位置信息(百度地图)
- 下一篇: ActiveMQ消息传递的两种方式