asp.net 從資源文件中獲取資源內容、獲取資源列表

爲了能讓來自不同文化習慣或使用不同語言作爲母語的訪客能夠閱讀我們的網站,則必須爲這些讀者提供用他們自己的語言查看網頁的方法。一種方法是分別用各語言重新創建頁面,但這種方法可能需要大量工作量、容易出錯並且在更改原始頁時很難維護。利用 ASP.NET,可以使創建的頁面基於瀏覽器的首選語言設置或用戶顯式選擇的語言獲取內容和其他數據。內容和其他數據指的就是資源,此類數據可以存儲在資源文件或其他源中。
在 ASP.NET 網頁中,可以將控件配置爲從資源獲取其屬性值。在運行時,資源表達式將被相應資源文件中的資源替換。

關於 asp.net 網站的資源文件,詳細地介紹見 MSDN 文檔:http://msdn.microsoft.com/zh-cn/teamsystem/ms227427.aspx

需要注意的是,資源文件是 XML 文件,其中包含要轉換爲不同語言或圖像路徑的字符串。資源文件包含鍵/值對,每一對都是一個單獨的資源。鍵名不區分大小寫。


可以在 asp.net 網站 或者 web 項目中添加 asp.net 特殊文件夾App_GlobalResources用來放置所有資源文件。資源文件可以有很多語言的版本,一般說來,需要先製作一個通用(Common)版本,然後其他語言以這個通用版本中存在的鍵名、值和註釋作爲樣板來製作。一組資源應該具有同樣的資源類名,並且通用版本直接以資源類名爲名稱,外加一個 .resx 的後綴作爲整個文件的名稱。比如,MyResources.resx;其他語言的則以 資源類名.文化名.resx爲名稱,如中文簡體的資源文件可以命名爲 MyResources.zh-cn.resx。


下面我要講的是兩個問題:
一、如何正確地從資源文件中獲取需要的資源的值;
二、快速地獲取資源文件中資源的清單。



對於第一個問題:

使用 <% $ %>標記引用

在 asp.net 網站開發過程中,相信大家都比較熟悉 <% =  %>  和   <%# %>  兩個服務器標記,它們分別用於在前臺頁面中顯示後臺變量的值和綁定數據。在 asp.net,還有另一個標記,平時可能用得不是很多,那就是 "<%$  %>"  標記。它專門用於綁定資源文件中指定資源的值。

 

如,你需要在前臺爲用一個 Submit 來觸發更新用戶個人信息的動作,那麼我們需要它 的 value 賦予的意義爲“更新個人資料”,英文爲"Update the Profile"。
這時,你可以在資源文件中建立名稱爲 "Update_Profile" 的資源,並在中文版本的文件(如 MyResources.zh-cn.resx)中設置其意義爲“更新個人資料”,而在英文版本的文件(如 MyResources.en-us.resx)中設置其意義爲“Update the Profile”,然後在頁面中做如下引用:

<input type="submit" value="<%$Resources: MyResources,Update_Profile%>" on_click="javascript:UpdateMethod" />

使用 Resources 命名空間引用

網站生成後,系統將會把資源文件編譯爲程序集 (assembly) 並作爲元數據引用,並具有根命名空間:Resources;系統將爲我們的資源類名創建類,上述例子中,類的名字是 MyResources
在編譯後,在後臺代碼(CodeBehind)中,我們可以使用 Resources 命名空間引用我們的資源文件。
上面的例子,直接使用 Resource.MyResources.Update_Profile 引用該資源的值。
當然,由於能使用 Resources 命名空間引用,那麼就可以在前臺使用<%= %>標記,並使用這種命名空間引用的方式引用資源的值了。下面的語句是可以達到目的的:

<input type="submit" value="<%=Resources.MyResources.Update_Profile%>" on_click="javascript:UpdateMethod" />

對於第二個問題

假設我現在有一個語言版本的資源文件,如我已經寫好了簡體中文版本的資源文件(MyResources.zh-cn.resx),該如何來書寫其他語言的資源文件呢?
是的,一個一個創建並按照之前一樣的格式填寫它們的值就可以了。
但是,必須明白的一個問題是,當需要的資源條目很多時,這會是一個很大的問題。

獲取資源文件中所有資源的清單:
System.Resources 提供了相關操作工具,但它們僅能處理格式爲 Resources 的標準資源文件,這種標準資源文件可以放置普通的文本資源或者諸如圖片等二進制數據,但我們 asp.net 中的資源文件卻是 xml 格式的(可以使用 Visual Studio 內置的 xml 編輯工具打開),不能由它們來處理。
要讓 System.Resources 能處理 asp.net 的 resx 格式資源文件,可以使用 resgen 工具(點擊查看相關介紹及使用方法),將 resx 文件轉換爲 .resources 文件,並使用 System.Resources 中的 ResourceReader 對象讀取資源的內容。參考以下代碼,向以下函數傳遞一個正確地 .resources 格式的資源文件的路徑,它可以返回一個已排序的資源名稱與其值的鍵對的列表:

    private List<KeyValuePair<string, string>> GetAllResources(string fileName)
    {
        List<KeyValuePair<string, string>> ListForReturn = new List<KeyValuePair<string, string>>();
        IResourceReader reader = new System.Resources.ResourceReader(fileName);  //ResourceReader
        IDictionaryEnumerator en = reader.GetEnumerator();
        while (en.MoveNext())
        {
            KeyValuePair<string, string> KeyvalueItem =
                new KeyValuePair<string, string>(en.Key.ToString(), en.Value.ToString());
            ListForReturn.Add(KeyvalueItem);
        }
        reader.Close();
        ListForReturn.Sort(delegate(KeyValuePair<string, string> StrA, KeyValuePair<string, string> StrB)
        {
            return StrA.Key.CompareTo(StrB.Key);
        });
        return ListForReturn;
    }


可以使用以下代碼將其輸出到 Web 頁上:

Response.Write("KeyName/tKeyValue");
foreach (KeyValuePair<string,string> ValueItem in AllResourcesList)
{
Response.Write(string.Format("{0}/t{1}<br />",ValueItem.key,ValueItem.value));
}

這樣我們便可以很方便地獲取得資源文件中所有資源的清單了。


歡迎訪問本文在 blog.ciznx.com 上的原地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章