ASP.NET支持多語言

ASP.NET 2.0中實現:
1.使用工具自動生成本地化資源(LocalResources)

首先建立一個WEB工程,如圖所示:

雙擊Default.aspx,切換到[設計]視圖,從工具箱裏拖一個Button進來。點擊菜單中的[工具]->[生成本地資源],如圖所示:
這時發現在解決方案方案視圖裏自動增加了一份本地資源,如下圖所示:

切換到屬性視圖,可以看到Text和ToolTip都被加上了一個紅色符號,提示“屬性是用表達形式隱式綁定的”,如下圖所示:
爲了增加對多語言的支持,我們現在右鍵Default.aspx.resx,點擊複製,再選中App_LocalResources目錄,點擊粘貼,將“副本Default.aspx.resx”重命名爲Default.aspx.en-us.resx,如圖所示:

分別編輯Default.aspx.resx和Default.aspx.en-us.resx 的內容,如下圖示:
Default.aspx.resx

Default.aspx.en-s.resx

運行網站,效果如下圖所示:

點擊IE菜單的[工具]->[Internet 選項],在彈出的對話框中點[常規]選項卡的[語言]按鈕,彈出[語言首選項]對話框,如下圖所示:
點擊[添加]按鈕,選擇英語(美國),並上移到第一位,如下圖所示:

一路[確定]點下來,刷新頁面,可以看到Button的標題變成“Hello World”,如下圖所示:

綜上所述,使用工具自動生成本地化資源,並隱式的綁定到控件上,來實現頁面的本地化是非常簡單的,但存在以下幾項問題:

    1)必須爲每個頁生成多份資源文件;
    2)只有控件屬性中被標識爲Localizable(true)纔可能被工具掃描到;
    3)由於是對頁面包含的控件進行掃描,所以最好是在頁面佈局基本確定後再使用該工具,並且在編輯完    資源文件後不要再使用該工具

,如果不幸你這樣做了。。。會發現默認的資源文件被清空了


2.手工添加本地化資源
第一點中提到過生成本地資源工具只能掃描到頁面已經包含的控件,那麼如果後面由於開發需要又增加了一個新的控件要怎麼辦呢?雖然大部

人都能自己想到,但還是寫一下吧。

從工具箱再拖一個Label控件到頁面上,切換到源視圖,修改代碼如下:

<asp:Label ID="Label1" runat="server" meta:resourcekey="Label1Resource1" Text="Label"></asp:Label>

再修改兩份本地資源文件,爲Label1添加Label1Resource1鍵值的相關資源,如下圖所示:
Default.aspx.resx

Default.aspx.en-s.resx

再運行程序,切換語言設置,可以看到Label1的效果和Button1是一樣的,如圖所示:
中文(中國)

英語(美國)

3.顯示使用本地化資源
前面提到的都是隱式使用本地化資源,那麼如何顯示的使用本地化資源呢?相對於隱式來講,顯示更加靈活,功能也更強大。

只需要將剛纔的Label1的代碼,

<asp:Label ID="Label1" runat="server" meta:resourcekey="Label1Resource1" Text="Label"></asp:Label>

修改爲,即可。

<asp:Label ID="Label1" runat="server"
    Text
="<%$ Resources:Label1Resource1.Text %>"
    ToolTip
="<%$ Resources:Label1Resource1.ToolTip %>" >
</asp:Label>

這時切換到[設計]視圖,選中Label1控件,查看屬性視圖,會發現Text和ToolTip被加上的是藍色的符號,提示“屬性綁定了表達式”。跟上面

提到的紅色符號比較,少了“隱式”二字,這也就是所謂的顯式和隱定的來源吧,如下圖所示:

5.全局資源的使用(GlobalResources)

前面提到過,本地資源需要爲每個頁面分別生成多個資源文件,雖然這樣看起來分門別類的挺清楚,但在實際應用過程中,我們有許多資源是

可以共享的,總不能不停的重複寫來寫去吧。其實這種情況我們可以用全局資源(GlobalResources)來解決。

在資源方案視圖中選中網站,右鍵,點擊[添加ASP.NET 文件夾]->[App_GlobalResources],如圖所示:

再選中App_GlobalResources文件夾,右鍵,點擊[添加新項],在彈出的對話框中選中“資源文件”,命名爲“LocalizedText.resx”,點擊[

添加],如圖所示:


雙擊LocalizedText.resx進行編輯,添加一條新的字符串資源,如圖所示:
複製LocalizedText.resx,粘貼到App_GlobalResources目錄,重命名爲LocalizedText.en-us.resx,雙擊進行編輯,添加一條新的字符串資源

,如圖所示:

打開Default.aspx,切換到[設計]視圖,從工具箱拖一個TextBox控件到頁面上。切換到[源]視圖,修改代碼:

<asp:TextBox ID="TextBox1" runat="server" Text="<%$ Resources:LocalizedText, Msg1 %>"></asp:TextBox>

運行程序,切換語言設置,可以看到全局資源的使用效果了,如圖所示:
中文(中國)

英語(美國)

注意:全局資源不能使用隱式聲明。

5.如何在後臺編程時使用這兩種資源

前面提到的都是在網頁中使用這兩種資源,那麼如何在後臺使用這兩種資源呢?

打開Default.aspx,切換到[設計]視圖,從工具箱拖一個Localize控件(Literal 控件與 Label 控件類似,但 Literal 控件不允許對所顯示

的文本應用樣式。可以通過設置 Text 屬性,以編程方式控制在控件中顯示的文本。)到頁面上。雙擊Button1,添加以下實現

    protected void Button1_Click(object sender, EventArgs e)
   
{
        Localize1.Text
= (String)GetLocalResourceObject("Label1Resource1.Text") + " " +
            (String)GetGlobalResourceObject(
"LocalizedText", "Msg1");
    }

記得添上這個引用

using System.Globalization;

運行程序,切換語言設置,可以看到和前面使用表達式調用資源的效果是一樣的,如圖所示:
中文(中國)

英語(美國)

6.動態切換語言設置

以上的介紹都是通過IE瀏覽器獲取語言設置,其實我們可以自己設置使用哪種語言。

1)通過在每個頁面裏的Page節指定

<%@ Page Culture="en-us" UICulture="en-us" %>

如上所設,該頁將使用en-us的語言設置。

注意:這只是個概要式寫法,實際的頁面中的Page一般都包含更多的屬性。

2)通過在Web.Config裏的globalization節指定

<system.web>
   
<globalization Culture="en-us" UICulture="en-us" />
</system.web>

3)當然還有一種就是通過編程動態切換語言設置啦,這也是實際項目中經常用到的方式

打開Default.aspx,切換到[源]視圖,添加如下代碼

        <a href="?currentculture=zh-cn">中文(中國)</a>
       
&nbsp;
       
<a href="?currentculture=en-us">English(USA)</a>

打開Default.aspx.cs,添加如下代碼

    String s;

   
protected override void InitializeCulture()
   
{
        s
= Request.QueryString["currentculture"];
       
if (!String.IsNullOrEmpty(s))
       
{
           
//UICulture - 決定了採用哪一種本地化資源,也就是使用哪種語言
           
//Culture - 決定各種數據類型是如何組織,如數字與日期
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(s);
            Thread.CurrentThread.CurrentCulture
= CultureInfo.CreateSpecificCulture(s);
        }

    }

記得添上這個引用

using System.Threading;

運行程序,分別點擊新增加的兩個鏈接,效果如圖所示:
中文(中國)

Enlish(USA)

7.使用圖片資源

分別編輯LocalizedText.resx和LocalizedText.en-su.resx,添加圖片資源,如圖所示:
LocalizedText.resx

LocalizedText.en-su.resx

注意:當圖形文件添加到圖形資源裏時,系統會自動去除擴展名並把“-”替換成“_”,如上圖,我的文件名爲“en-us-flag.png”添加到資 源裏變成了“en_us_flag”。

打開Default.aspx,切換到[設計]視圖,從工具箱拖一個Image控件到頁面上。打開Default.aspx.cs,添加如下代碼

    protected void Page_Load(object sender, EventArgs e)
   
{
        Image1.ImageUrl
= "~/Image.aspx?currentculture=" + s;
    }

選中網站右鍵,創建一個新的WEB窗體,命名爲Image.aspx,編輯該頁面,在Page節增加如下代碼

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Image.aspx.cs" Inherits="Image" Culture="auto" UICulture="auto"%>

注意:默認創建的WEB窗體的Page節,不包括Culture和UICulture這兩個屬性,一定要手工添上,切記!

打開Image.aspx.cs,添加如下代碼

    protected override void InitializeCulture()
   
{
        String s
= Request.QueryString["currentculture"];
       
if (!String.IsNullOrEmpty(s))
       
{
           
//UICulture - 決定了採用哪一種本地化資源,也就是使用哪種語言
           
//Culture - 決定各種數據類型是如何組織,如數字與日期
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(s);
            Thread.CurrentThread.CurrentCulture
= CultureInfo.CreateSpecificCulture(s);
        }

    }


   
protected void Page_Load(object sender, EventArgs e)
   
{
        System.Drawing.Bitmap img
= (System.Drawing.Bitmap)GetGlobalResourceObject(
           
"LocalizedText",
            CultureInfo.CurrentCulture.Name.ToLower().Replace(
"-", "_") + "_flag");

        System.IO.MemoryStream ms
= new System.IO.MemoryStream();
        img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

        Response.ClearContent();
        Response.ContentType
= "image/jpeg";
        Response.BinaryWrite(ms.ToArray());

        img.Dispose();
        ms.Dispose();
        ms.Flush();
    }

當然,別忘了添上這兩個引用

using System.Threading;
using System.Globalization;

運行程序,分別點擊兩個鏈接,效果如圖所示:
中文(中國)

English(USA)

以上文字摘至網上,有做修改.
以下是本人在ASP.NET 1.1裏面實現多語言.

1:添加"程序集資源文件",它是一個XML文件來的,我們取文件名爲string.ZH-CN.resx,這是一箇中文的資源文件,如下圖:

然後複製多兩份,分別命名爲:string.EN.resx(英文),string.ZH-HK.resx(繁體)。如下圖:

資源文件裏面的內容大致如下圖:

2、然後你編譯項目,你會發現bin目錄下面多了幾個文件夾,如圖:

3、現在我們就在程序裏面怎麼去重這些文件裏面讀取資源:
首先我們引用下面幾個命名空間:

using System.Threading;
using System.Globalization;
using System.Resources;

然後定義以下兩個全局受保護的幾個變量:

protected CultureInfo ci=null;
protected ResourceManager resmanager=null;

CultureInfo包含特定區域性的信息,提供信息區域性的特定對象訪問,ResourceManager:提供運行是方便的訪問區域性特定資源的途徑。

  private void Page_Load(object sender, System.EventArgs e)
 
{
  
if(!this.IsPostBack)
  
{
   Thread.CurrentThread.CurrentCulture
=CultureInfo.CreateSpecificCulture(LGType);//改變當前線程的區域性
    annualreport ar=new annualreport();
    resmanager
=new ResourceManager("Ir.string",ar.GetType().Assembly);
    ci
=Thread.CurrentThread.CurrentCulture;
    BindData();
   }

  }

我們通過傳遞一個參數來改變語言:

  /**//// <summary>
 
/// 文本類型(不包括數據),CN爲中文,EN爲英文,HK爲中文繁體
 
/// </summary>

  private string _lgtype;
 
private string LGType
 
{
  
get
  
{
   
if(Request.QueryString["lgtype"]!=null)
   
{
    
this._lgtype=Request.QueryString["lgtype"].ToString().ToUpper();
    
if(_lgtype=="TC")
    
{
     
this._lgtype="ZH-HK";     }

    
else if(_lgtype=="EN")
    
{
     
this._lgtype="EN";
     }

    
else
    
{
     
this._lgtype="ZH-CN";
     }


    }

   
if(_lgtype==null||_lgtype==string.Empty||_lgtype=="")
   
{
    
this._lgtype="ZH-CN";
    }

   
return _lgtype;
   }

  
set
  
{
   
this._lgtype=value;
   }

  }

現在我們在後臺來獲取的某個字段,可以用下面的語句獲取:resmanager.GetString("name名稱",ci);
因爲是公共變量,所以你可以在前臺通過這樣形式綁定:<%=resmanager.GetString("name名稱",ci)%>

這裏提醒一下,當你想用Microsoft.VisualBasic.Strings.StrConv方法把轉換中文的簡,繁的話,可能會是亂碼,這可能是改變了線程區域性所造成的。

 

 

轉載自:http://www.cnblogs.com/sonce/archive/2008/08/14/1094612.html

發佈了62 篇原創文章 · 獲贊 2 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章