摘要: 隨着計算機網絡的發展,一些商業機構也開始向國際市場邁進。因此這些商業的機構的網站也開始面向全世界的用戶,要求網站具有多語言的選擇,實現本地化。在.NET1.1框架下面,如果你要實現本地化,你可能要藉助某些插件,甚至要編寫一連串的代碼;但是在.NET2.0框架底下,你會發現一切原來是那麼的簡單~~!
主要內容:
1. 簡單例子
2. 進一步認識Localization
3. 語言轉換
4. 解決方案
一. 簡單例子
下面通過一個簡單的例子來說明利用Localization來實現本地化是那麼的簡單,首先我們打開Visual Studio 2005,新建一個名叫Localization的工程(名字就無關緊要了,隨你喜歡~~),如下所示:
然後我們在Default.aspx這張頁面上放一些控件,例如我們在頁面上放一個按鈕,一個標籤一個文本框,添加完之後的頁面就好像下面的一樣:
接下來的一步主要是負責生成本地資源,我們點擊“工具->生成本地資源(R)”,
於是我們的項目中多了一個文件夾App_LocalResources,裏面包含一個文件Default.aspx.resx,而這個文件就是用來編輯保存我們想要顯示的一些文字資源,
例如我們爲我們添加的控件輸入以下信息:
在完成以上步驟之後,我們就可以看到效果了。
在以上的步驟中,我們沒有手工編寫任何代碼,而由.NET2.0自動實現綁定過程。而頁面跟以往的不同就是HTML代碼發生了變化:
<! 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:Button ID ="Button1" runat ="server" meta:resourcekey ="Button1Resource1" Text ="Button" />
< asp:TextBox ID ="TextBox1" runat ="server" meta:resourcekey ="TextBox1Resource1" ></ asp:TextBox >
< asp:Label ID ="Label1" runat ="server" meta:resourcekey ="Label1Resource1" Text ="Label" ></ asp:Label ></ div >
</ form >
</ body >
</ html >
除了Page裏面增加了 Culture="auto" meta:resourcekey="PageResource1" UICulture="auto" 等屬性設置外,我們添加的控件也相應的多了meta:resourcekey這個屬性,而.NET2.0就是根據這些屬性來進行語言綁定。
在上述的簡單項目中,我們只提供了一種語言,還沒達到本地化的要求,於是我們向App_localresources這個目錄手工增加一個資源文件Default.aspx.en-us.resx文件(其中英文[美國]的語言代碼是"en-us"),我們向裏面添加一些key/value對,如下所示:
然後我們去修改IE的Internet選項的語言,添加“英文(美國)[en-us]”,並且把它移動到最上面:
再運行一次我們的項目,你會發現簡單的本地化已經實現,
至此,通過一個簡單的例子,我們已經初步認識了.NET2.0是如何實現利用Localization來實現本地化的。但是如果我們要構建一個優秀的國際化網站或軟件,我們需要對Localization做進一步的認識。
二. 進一步認識Localization
到了這裏,你會發現上述的頁面中是每一個頁面對應一些屬於自己的資源文件,如果我們要求多張頁面或者全部頁面都要用同一個資源文件的時候,該怎麼做呢?很簡單,我們可以在項目中添加一個文件夾,名叫App_GlobalResources,這是系統默認的存放全局資源的目錄。例如我們在全局目錄中添加兩個文件,分別是global.resx和global.en-us.resx,
然後我們分別在裏面輸入一些對應的key/value值,至於怎麼應用我們的全局資源綁定到頁面中,我們有兩種方法:
一種是在HTML代碼裏面進行綁定,表達式是 <%$ resources: [applicationkey], resourcekey, [default] %>,例如我們在Default.aspx多放一個按鈕,其HTML代碼爲:
於是我們會得到以下的效果,可以看出資源已綁定到控件上。
另一種方式則是在程序代碼進行綁定,由於.NET2.0框架會將全局資源文件編譯成一個類,也就是說我們剛纔創建的global.resx文件將被編譯成一個類global,而資源文件裏面的所有key將成爲類的屬性,以供在程序裏進行訪問。例如我們可以在程序裏這樣寫:
大家等會可以下載附件嘗試一下,看看效果是否一樣~~~~
另外,資源文件除了可以存放一些字符串之外,還可以存放圖片,聲頻,文件等等,
例如我們在資源文件中添加一些圖片資源,你可以將圖片設置爲在編譯時鏈接或者嵌入到資源文件,
而在程序代碼裏面,我們得到的將是System.Drawing.Bitmap類型的變量,至於添加其他類型的文件,得到的是什麼,這裏不多說了,大家自己探討一下吧。
三. 語言設置
大家是否覺得如果每次都要去Internet選項來進行語言的選擇會很麻煩,那麼如何在自己的項目中設置要顯示某一種語言呢?很簡單,通常我們有三種途徑。首先需要講兩個屬性,一個是Culture,這個決定各種數據類型是如何組織,如數字與日期;另一個是UICulture,這個就決定了採用哪一種本地化資源,也就是使用哪種語言。詳細請看MSDN~~~
1. 在具體頁面進行設置
如上,由於將UICulture和Culture屬性都設置成auto,.NET2.0會根據你的Internet語言選項來確定加載哪些資源文件,當然你也可以將UICulture和Culture都設置成"en-us",那麼這張頁面所加載的就是英文的資源文件了。不過這樣寫很麻煩,每一張頁面都要寫,太繁瑣了,於是我們可以在web.config裏面設置我們所要的語言。
2. 在web.config裏面進行設置
< system .web >
< globalization culture ="en-us" uiCulture ="en-us" />
</ system.web >
</ configuration >
通過這樣設置,項目中的全部頁面就會自動加載英文資源文件了,但要注意的一點是,如果在頁面中也設置了UICulture和Culture屬性,那麼它將覆蓋web.config裏面的設置。例如某張頁面的這兩個屬性設爲"zh-cn",那麼這張頁面將顯示中文而不是英文。但還是覺得不好,因爲頁面要加載的語言文件都寫死了,不靈活。
3. 在代碼裏面進行設置
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或者.NET2.0提供的profile裏面 。 下面我們以存儲在Session爲例,構建我們的基頁面,爲簡單起見,我只是通過一個按鈕來選擇語言,真正實現的時候可能會用一個下拉框:
主頁面:
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Localization;
/// <summary>
/// 本地化
/// kenneth
/// 2006.07.16
/// </summary>
public partial class _Default : MyPageBase
{
protected void Page_Load( object sender, EventArgs e)
{
this .Button2.Text = Resources.global.String1;
}
protected void Button2_Click( object sender, EventArgs e)
{
if (Session[ " PreferredCulture " ].ToString().ToUpper() == " EN-US " )
Session[ " PreferredCulture " ] = " zh-cn " ;
else if (Session[ " PreferredCulture " ].ToString().ToUpper() == " ZH-CN " )
Session[ " PreferredCulture " ] = " en-us " ;
// 重定向頁面
Response.Redirect(Request.Url.PathAndQuery);
}
}
基頁面MyPageBase:
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Threading;
using System.Globalization;
namespace Localization
{
/// <summary>
/// MyPageBase 基類實現本地化
/// kenneth
/// 2006.07.16
/// </summary>
public class MyPageBase : System.Web.UI.Page
{
protected override void 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);
}
}
}
}
好了,終於寫完了,希望大家頂一下。這幾天攻了一下MSDN,寫出自己的心得,如有雷同,純屬巧合,謝謝支持!最後,給出自己的模板,供大家參考一下~~~