摘要:随着計算機網絡的發展,一些商業機構也開始向國際市場邁進。是以這些商業的機構的網站 也開始面向全世界的使用者,要求網站具有多語言的選擇,實作本地化。在.NET1.1架構下面,如果你要實作本地化,你可能要借助某些插件,甚至要編寫一連 串的代碼;但是在.NET2.0架構底下,你會發現一切原來是那麼的簡單~~!
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiZpdmL3EjbvNWavwVUR9CXz52bjlGdv1WRvwVbvNmLzd2bsJmbj5yd3d3Lc9CX6MHc0RHaiojIsJye.gif)
主要内容:
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,寫出自己的心得,如有雷同,純屬巧合,謝謝支援!最後,給出自己的模闆,供大家參考一下~~~
為了您的安全,請隻打開來源可靠的網址
打開網站 取消
來自: http://hi.baidu.com/visual200x/blog/item/578dce3769043bd7a2cc2b5f.html
轉載于:https://www.cnblogs.com/leya/archive/2010/07/30/1788686.html