主要內容:
1. 簡單例子
2. 進一步認識Localization
3. 語言轉換
4. 解決方案
一. 簡單例子
1、下面通過一個簡單的例子來實現本地化是那么的簡單,首先我們打開Visual Studio 2010,新建一個名叫【中英文轉換】的工程(名字就無關緊要了,隨你喜歡~~),如下所示:
2、然后我們在Index.aspx這張頁面上放一些控件,添加完之后的頁面就好像下面的一樣:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="中英文轉換.Index" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:RadioButtonList ID="RadioBtnList" runat="server" AutoPostBack="true" OnSelectedIndexChanged="RadioBtnList_SelectedIndexChanged"> <asp:ListItem Value="zh-cn" Text="簡體中文" Selected="True"></asp:ListItem> <asp:ListItem Value="en-us" Text="英語"></asp:ListItem> </asp:RadioButtonList> <br /> <asp:Label ID="labCon" runat="server" Text="我是小小鳥。"></asp:Label> <br /><br /> <asp:Button ID="btnCov" runat="server" Text="轉換" /> <br /><br /> <asp:Label ID="labByCon" runat="server" Text="顯示轉換結果"></asp:Label> </div> </form> </body> </html>
3、接下來的一步主要是負責生成本地資源,我們點擊“工具->生成本地資源(R)”。
4、於是我們的項目中多了一個文件夾App_LocalResources,里面包含一個文件Index.aspx.resx,而這個文件就是用來編輯保存我們想要顯示的一些文字資源。
例如我們為我們添加的控件輸入以下信息:
5、頁面的代碼效果和瀏覽器的效果:
在以上的步驟中,我們沒有手工編寫任何代碼,而由.NET4.0自動實現綁定過程。而頁面跟以往的不同就是HTML代碼發生了變化:
除了Page里面增加了 Culture="auto" meta:resourcekey="PageResource1" UICulture="auto"等屬性設置外,我 們添加的控件也相應的多了meta:resourcekey這個屬性,而.NET4.0就是根據這些屬性來進行語言綁定。
6、在上述的簡單項目中,我們只提供了一種語言,還沒達到本地化的要求,於是我們向 App_localresources這個目錄手工增加一個資源文件Index.aspx.en-us.resx文件(其中英文[美國]的語言代碼 是"en-us")(直接復制resx文件),我們向里面添加一些key/value對,如下所示:
然后我們去修改IE的Internet選項的語言,添加“英文(美國)[en-us]”,並且把它移動到最上面:
再運行一次我們的項目,你會發現簡單的本地化已經實現。
至此,通過一個簡單的例子,我們已經初步認識了.NET4.0是如何實現利用Localization來實現本地化的。但是如果我們要構建一個優秀的國際化網站或軟件,我們需要對Localization做進一步的認識。
2. 進一步認識Localization
1、到了這里,你會發現上述的頁面中是每一個頁面對應一些屬於自己的資源文件,如果我們要求多張 頁面或者全部頁面都要用同一個資源文件的時候,該怎么做呢?很簡單,我們可以在項目中添加一個文件夾,名叫App_GlobalResources,這是 系統默認的存放全局資源的目錄。例如我們在全局目錄中添加兩個文件,分別是global.resx和global.en-us.resx。
然后我們分別在里面輸入一些對應的key/value值,至於怎么應用我們的全局資源綁定到頁面中,我們有兩種方法:
第一種:是在HTML代碼里面進行綁定,表達式是 <%$ resources: [applicationkey], resourcekey, [default] %>,例如我們在Index.aspx多放一個按鈕,其HTML代碼為:
<asp:Button ID="Button2" runat="server" Text="<%$ resources: global, StrContent%>
於是我們會得到以下的效果,可以看出資源已綁定到控件上。
第二種:則是在程序代碼進行綁定,由於.NET4.0框架會將全局資源文件編譯成一個類,也就是說我們剛才創建的global.resx文件將被編譯成一個類global,而資源文件里面的所有key將成為類的屬性,以供在程序里進行訪問。例如我們可以在程序里這樣寫:
this.Button2.Text = Resources.global.StrContent;
另外,資源文件除了可以存放一些字符串之外,還可以存放圖片,聲頻,文件等等,
三. 語言設置
大家是否覺得如果每次都要去Internet選項來進行語言的選擇會很麻煩,那么如何在自己 的項目中設置要顯示某一種語言呢?很簡單,通常我們有三種途徑。首先需要講兩個屬性,
一個是Culture,這個決定各種數據類型是如何組織,如數字與日 期;
另一個是UICulture,這個就決定了采用哪一種本地化資源,也就是使用哪種語言。詳細請看MSDN~~~
1. 在具體頁面進行設置
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="中英文轉換.Index" culture="auto" meta:resourcekey="PageResource1" uiculture="auto" %>
如上,由於將UICulture和Culture屬性都設置成auto,.NET4.0會根據你的Internet語言選項來確定加載哪些資源文件,當然你也可以將UICulture和Culture都設置成"en-us",那么這張頁面所加載 的就是英文的資源文件了。不過這樣寫很麻煩,每一張頁面都要寫,太繁瑣了,於是我們可以在web.config里面設置我們所要的語言。
2. 在web.config里面進行設置
<?xml version="1.0" encoding="utf-8"?> <!-- 有關如何配置 ASP.NET 應用程序的詳細消息,請訪問 http://go.microsoft.com/fwlink/?LinkId=169433 --> <configuration> <system.web> <compilation debug="true" targetFramework="4.0" /> <globalization culture="en-us" uiCulture="en-us"/> </system.web> </configuration>
3. 在代碼里面進行設置
using System.Globalization; using System.Threading; // Set the culture to the browser's accept language Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]); // Set the user interface culture to the browser's accept language Thread.CurrentThread.CurrentUICulture = new CultureInfo(Request.UserLanguages[0]);
在程序代碼里面進行設置,重載頁面的InitializeCulture事件,注意在代碼里的語言設置,會覆蓋頁面的HTML屬性或者web.config的設置。上述的Request.UserLanguages[0]是獲取Internet語言選項的第一種語言代碼。
四. 解決方案
經過上述的初步和進一步的認識,相信大家已經理解了Localization的原理以及實現方法,但真要在我們的系統中實現多語言,實現本地化,我們應該怎樣來架構呢?
通常我們為了減少重復代碼,我們一般是建立一個基頁面PageBase類,讓所有的頁面都繼 承基頁面,在基頁面重寫InitializeCulture事件,而用戶所選擇的語言我們可以儲存在 Session,Cookie,QueryString或者.NET4.0提供的profile里面。 下面我們以存儲在Session為例,構建我們的基頁面,為簡單起見,我只是通過一個按鈕來選擇語言:
主頁面:
BasePage.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Threading; using System.Globalization; namespace 中英文轉換 { public class BasePage : System.Web.UI.Page { /// <summary> /// 重寫InitializeCulture()方法實現 本地化資源 /// </summary> protected override void InitializeCulture() { base.InitializeCulture(); // 用Session來存儲語言信息 if (Session["PreferredCulture"] == null) Session["PreferredCulture"] = Request.UserLanguages[0]; string UserCulture = Session["PreferredCulture"].ToString(); if (UserCulture != "") { //根據Session的值重新綁定語言代碼 Thread.CurrentThread.CurrentUICulture = new CultureInfo(UserCulture); Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(UserCulture); } } } }
Index.aspx
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 中英文轉換 { public partial class Index : BasePage { protected void Page_Load(object sender, EventArgs e) { Button2.Text = Resources.global.StrContent; } protected void RadioBtnList_SelectedIndexChanged(object sender, EventArgs e) { btnCov.Text = "轉換成—"+RadioBtnList.SelectedItem.Text; } protected void btnCov_Click(object sender, EventArgs e) { Session["PreferredCulture"] = RadioBtnList.SelectedValue.ToUpper(); if (Session["PreferredCulture"].ToString().ToUpper() == "EN-US") Session["PreferredCulture"] = "en-us"; else if (Session["PreferredCulture"].ToString().ToUpper() == "ZH-CN") Session["PreferredCulture"] = "zh-cn"; //重定向頁面 Response.Redirect(Request.Url.PathAndQuery);
}
}
}
中英文轉換——附件
作者:827969653