方案描述
本方案採用一種語言一個資源檔的方法,能夠有效提高資源檔的可維護性。而VS.NET提供的一個WebForm一個資源檔的方案,無法滿足統一維護的需要。
實現步驟
1. 準備資源檔
資源檔通常有.resx和.resources兩種,前者是xml檔案,後者是二進位檔案。本方案中採用.resources作為資源檔,因此需要一個第三方提供的資源編輯器對資源檔進行編輯,我使用的是Resourcer,反正只要能編輯資源檔並且儲存為.resources檔案的軟體都可以。在資源檔中添加一些string資源,通常情況下,只會用到string資源,有些項目可能需要全球化的圖片資源,原理裡一樣的,本文就不涉及了。
資源檔的命名是有規定,該方案中,我把所有的資源檔名設為business.[culture].resources,其中business這個名字可以改,可以改成任何一個你喜歡的名字,[culture]部分必須使用.net允許的文化縮寫,如zh-cn、ja-jp、en-us等。
2. 把資源檔放入項目
為了方便管理,我把所有的資源檔放在網站的一級目錄Resources中。由於讀取資源檔時要用到資源檔的物理位置,建議把Resources目錄直接放在wwwroot下,否則會因為路徑問題而變得很麻煩。
3. 增加預設語言設定
在web.config中加入<add key="cultureName" value="zh-cn" />,表明預設情況下使用zh-cn作為預設語言文化。
4. 通過Session設定當前語言
我們用一個Session變數——Session["cultureName"]來告訴每一個頁面應該使用哪種語言進行初始化。當Session["cultureName"]==null時,表明該變數未設定過,就直接用預設語言文化,即web.config中的設定值。
如果使用者想改變當前的介面語言,只需要設定Session["cultureName"]為指定的文化縮寫即可。
全球化資源輔助管理類
通過這個類你不需要瞭解ResourceManager的使用方法,就可以完成全球化的初始化和資源讀取工作。該類初始化時需要傳入一個Page對象,該對象將用於獲得Session變數值。一般情況下,大家只需要用該類的GetString()方法就可以了。
/**//// <summary>
/// 全球化資源輔助管理類
/// </summary>
public class ResourceHelper
{
private ResourceManager _rm=null;
private Page _page=null;
public ResourceHelper(Page page)
{
_page=page;
PrepareResource();
}
/**//// <summary>
/// 獲得當前文化,從Session["cultureName"]取
/// </summary>
protected CultureInfo GetCurrentCulture
{
get
{
if(_page.Session["cultureName"]!=null)
return CultureInfo.CreateSpecificCulture(_page.Session["cultureName"].ToString());
else //如果Session未設定,則直接從web.config中讀取預設設定
return CultureInfo.CreateSpecificCulture(System.Configuration.ConfigurationSettings.AppSettings["cultureName"]);
}
}
/**//// <summary>
/// 初始化資源管理
/// </summary>
public void PrepareResource()
{
_rm = ResourceManager.CreateFileBasedResourceManager("business",_page.Server.MapPath("resources")+System.IO.Path.DirectorySeparatorChar,null);
}
/**//// <summary>
/// 獲得資源指標
/// </summary>
protected ResourceManager resource
{
get
{
if(_rm==null)
PrepareResource();
return _rm;
}
}
/**//// <summary>
/// 獲得資源字串
/// </summary>
/// <param name="ResourceID">資源ID</param>
/// <returns></returns>
public string GetString(string ResourceID)
{
return this.resource.GetString(ResourceID,this.GetCurrentCulture);
}
}
為了方便大家學習,做了個Demo給大家參考
關於Demo的一些說明:
1. 本示範在WindowsXP Professional+VS.NET2003環境下調試通過
2. 示範中提供了三種語言的資源檔:business.zh-cn.resources, business.en-us.resources,business.ja-jp.resources
它們都放在Resources目錄下,每個資源檔中有001_01、001_02、001_03三個string資源,分別表示使用者名稱、密碼、生日。
3. 通過選擇下拉式列表中的語言,然後按“確定”按鈕,可以完成語言切換