ASP.NET2.0:利用Localization實現本地化

摘要: 隨着計算機網絡的發展,一些商業機構也開始向國際市場邁進。因此這些商業的機構的網站也開始面向全世界的用戶,要求網站具有多語言的選擇,實現本地化。在.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代碼發生了變化:

<% @ Page Language = " C# "  AutoEventWireup = " true "   CodeFile = " Default.aspx.cs "  Inherits = " _Default "  Culture = " auto "  meta:resourcekey = " PageResource1 "  UICulture = " auto "   %>

<! 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代碼爲:

   < asp:Button  ID ="Button2"  runat ="server"  Text ="<%$ resources: global, String1 %>

於是我們會得到以下的效果,可以看出資源已綁定到控件上。



另一種方式則是在程序代碼進行綁定,由於.NET2.0框架會將全局資源文件編譯成一個類,也就是說我們剛纔創建的global.resx文件將被編譯成一個類global,而資源文件裏面的所有key將成爲類的屬性,以供在程序裏進行訪問。例如我們可以在程序裏這樣寫:

this .Button2.Text  =  Resources.global.String1;

大家等會可以下載附件嘗試一下,看看效果是否一樣~~~~

另外,資源文件除了可以存放一些字符串之外,還可以存放圖片,聲頻,文件等等,



例如我們在資源文件中添加一些圖片資源,你可以將圖片設置爲在編譯時鏈接或者嵌入到資源文件,



而在程序代碼裏面,我們得到的將是System.Drawing.Bitmap類型的變量,至於添加其他類型的文件,得到的是什麼,這裏不多說了,大家自己探討一下吧。




三. 語言設置

大家是否覺得如果每次都要去Internet選項來進行語言的選擇會很麻煩,那麼如何在自己的項目中設置要顯示某一種語言呢?很簡單,通常我們有三種途徑。首先需要講兩個屬性,一個是Culture,這個決定各種數據類型是如何組織,如數字與日期;另一個是UICulture,這個就決定了採用哪一種本地化資源,也就是使用哪種語言。詳細請看MSDN~~~

1. 在具體頁面進行設置

<% @ Page Language = " C# "  AutoEventWireup = " true "   CodeFile = " Default.aspx.cs "  Inherits = " _Default "  Culture = " auto "  meta:resourcekey = " PageResource1 "  UICulture = " auto "   %>

如上,由於將UICulture和Culture屬性都設置成auto,.NET2.0會根據你的Internet語言選項來確定加載哪些資源文件,當然你也可以將UICulture和Culture都設置成"en-us",那麼這張頁面所加載的就是英文的資源文件了。不過這樣寫很麻煩,每一張頁面都要寫,太繁瑣了,於是我們可以在web.config裏面設置我們所要的語言。

2. 在web.config裏面進行設置

< configuration >
   
< system .web >
      
< globalization  culture ="en-us"  uiCulture ="en-us" />
   
</ system.web >
</ configuration >

通過這樣設置,項目中的全部頁面就會自動加載英文資源文件了,但要注意的一點是,如果在頁面中也設置了UICulture和Culture屬性,那麼它將覆蓋web.config裏面的設置。例如某張頁面的這兩個屬性設爲"zh-cn",那麼這張頁面將顯示中文而不是英文。但還是覺得不好,因爲頁面要加載的語言文件都寫死了,不靈活。

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或者.NET2.0提供的profile裏面
。 下面我們以存儲在Session爲例,構建我們的基頁面,爲簡單起見,我只是通過一個按鈕來選擇語言,真正實現的時候可能會用一個下拉框:

主頁面:
using  System;
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;
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,寫出自己的心得,如有雷同,純屬巧合,謝謝支持!最後,給出自己的模板,供大家參考一下~~~
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章