我們在應用.net技術開發應用程式時,經常會涉及到使用字串資源。比如針對不同的國家的使用者提供不同的語言的資源,使我們的應用程式更加友好。您完全可以用.net內建的resx檔案解決這個問題,但是,StringResourceTool2可以協助您更優雅的解決這個問題,而且可以充分利用智能感知技術,大大降低出錯的機率.
什麼是StringResourceTool2
StringResourceTool2是codeplex.com上的一個項目,致力於解決.net 開發中與語言地區有關的資源問題。它的地址是http://stringresourcetool.codeplex.com.
這個項目引入了字串檔案(string file),字串檔案格式早期由微軟的企業庫引入,方便您在應用程式中使用資源。
從項目的名字中,我們可以看出,它主要是用來解決與語言有關的字串資源(string resource)的問題。根據字串資源檔(string file),產生.resx檔案,並且產生訪問類以方便使用類來訪問資源。
更值得稱道的是,它還支援類型化參數(typed parameters), 例如: inserts {0}, {1},這簡直能讓我們的方案趨於完美。
我們知道,.net 標準的資源檔格式是resx檔案。預設的產生產生工具是ResXFileCodeGenerator.
如果您的項目中需要用到與特定語種相關的字串資源,您不妨試一下這個工具,它可以替代Visual Studio 2005中ResXFileCodeGenerator的工具。 另外,它充分運用.net的智能感知功能,大大降低了您在尋找字串時的出錯機率。
但是,也許您已經注意到了,它也有局限性。如果您需要針對不同國家的使用者提供不同的圖片資源,StringResourceTool2不能解決您的需求,從它的名字中就應該看到,它致力於解決字串資源。
開發中遇到的困惑
在我們日常的開發中,經常需要用到字串資源。比如,當系統出錯時,我們需要提示使用者出錯了。如果目前使用者是英語語種的國家,我們的程式需要提供英語的提示,如果使用者習慣的語種是中文簡體,我們則需要提供相應的簡體中文的報錯提示,這樣才可以算得上是方便使用的應用程式。
另外,即使您開發的應用不需要涉及多種語種的使用者,您也可以從這個項目中獲益。把您的與字串有關的資源集中放到字串格式檔案中,集中管理,方便維護。比如,以前我經常把字串直接寫到各個類中,或是乾脆在向使用者彈出提示訊息時,寫到用戶端中。這樣,隨著項目的進入後期階段,字串遍及應用程式的各個角落:在資料訪問層中拋出異常時有異常提示的字串資源,在使用者介面層中報出錯提示時的字串資源,甚至於每一個表單的標題,都會增加您後期維護的成本。 如果您在項目開發中是一直對這個問題比較棘手,從項目的一開始,您就很有必要繼續看一下下面的內容,它會使您對這個問題有趨於完美的解決辦法。
如何在開發中應用
首先,為您的項目添加一個文字檔,命名為SR.strings
圖一 添加一個字串檔案
然後,在開啟的檔案中,直接寫入下面的代碼
[strings]
Raw = Raw string
StringArg(string name) = With name argument {0}
您在上面的代碼中看到了,StringResourceTool2支援類型化參數(typed parameters)。
這種格式也是我們開發中經常會用到
右鍵點擊這個檔案,,設定CustomTool屬性為StringResourceTool2 或者 SRT2,然後右鍵點擊Run Custom Tool
圖二 運行產生工具
工具會產生resx檔案以及訪問類SR.
我們可以使用下面的代碼來訪問我們剛才添加的字串資源檔
string s1 = SR.Raw;
string s2 = SR. StringArg (“Microsoft”);
這就是您需要學習的全部內容:添加一個文字格式設定的檔案(字串檔案),寫入您要在項目中使用的字串,產生資源檔,然後就可以在您的項目中應用了。
如果您希望瞭解它是如何工作的,下面的內容會協助您理解它的原理。
它是如何工作的
讓我們來回顧一下,如何在.net中使用resx格式的資源檔。
先給您的項目添加如下的資源檔:
圖三 添加資源檔
然後使用如下的代碼訪問資源
ResourceManager rm = new ResourceManager("SampleApplication.ResourceSample.SR", Assembly.GetExecutingAssembly());
string raw = rm.GetString("Raw");
string stringArg = string.Format("{0} world",rm.GetString("StringArg"));
這就是我們經常使用資源檔的方法
再回到我們的StringResourceTool2項目中來。您看到了,一切都很簡單,您要做的事情就是添加文字格式設定的字串檔案,然後運行工具,產生相應的檔案,
我們看到了,在我們添加的字串格式檔案中,有如下的特徵
圖四 產生的檔案結構
每一個字串檔案下面,會自動產生一個SR的類檔案,和一個resx的資源檔.
SR.srt.resx檔案的內容如下
圖五 自動產生的資源檔
與我們剛才添加的內容一樣。
SR.cs檔案看起來如下
public partial class SR
{
public static string Raw
{
get
{
return Keys_SR.GetString(Keys_SR.Raw);
}
}
public static string StringArg(string name)
{
return Keys_SR.GetString(Keys_SR.StringArg, new object[] {
name});
}
internal class Keys_SR
{
public static System.Resources.ResourceManager resourceManager = new System.Resources.ResourceManager("SampleApplication.MultiStrings.SR.srt", typeof(SampleApplication.MultiStrings.SR).Assembly);
public const string Raw = "Raw";
public const string StringArg = "StringArg";
public static string GetString(string key, object[] args)
{
string msg = resourceManager.GetString(key, Resources.CultureInfo);
msg = string.Format(msg, args);
return msg;
}
}
SR為我們的每個字串資源產生一個欄位,這樣方便您應用.net 的智能感知特性,也大大減少出錯的機率。
欄位內的實現方法都是調用Keys_SR類的GetString的方法。
SR類的內部的嵌入類Keys_SR,定義了一個ResourceManager欄位,其構造方法為傳入當前的資源的路徑SampleApplication.MultiStrings.SR.srt和SR類所在的程式集名稱,Keys_SR的GetString方法從資源檔中取出資源,GetString又直接轉為調用resourceManager的GetString方法,資源的名稱就是我們鍵入資源的名稱,在這裡,它為類的一個常量欄位.
全部的秘密就在這裡了。我們終於明白了它的原理。
在您的項目中應用StringResourceTool2
從網站上下載安裝軟體包,給您的項目添加字串檔案(string file),並且設定CustomTool為StringResourceTool2或SRT2
如果需要指定特定語種的資源檔,您可以這樣設定
SR.strings
SR.strings-zh-cn
SR.strings-zh-tw
不要忘記設定為所有的字串資源檔設定CustomTool=SRT2. 工具會從字串檔案中產生訪問類,對於特定語言的字串檔案,工具將只產生資源檔,不產生訪問類。
如果不熟悉不同國家的語種的名稱,開啟IE屬性,ToolsàInternet Options, 在General標籤頁,點擊Languages按鈕,點擊Add。
圖六 語言和地區選項
,方括弧中顯示的就是所有國家的語種的簡稱。
string檔案技巧
在我們下載回來的例子中,經常看到如下的內容:
# This file is used to generate SR.cs and SR.resx files. The copyright notice
# for those files appears here, in this SR.strings file.
# Options are specified as lines starting with "#!"
# Comments are lines starting with ";" or "#"
# To define the SR class public instead of internal (default):
##! accessor_class_accessibility = public
#! culture_info = Resources.CultureInfo
從上面的內容中,我們可以知道,注釋以;或#開頭 自訂選項以#!開頭。
例如: # Comments 這是表示注釋
#! accessor_class_accessibility = public 這一句把SR類預設的存取修飾詞internal改為public
這個特性(feature)的好處很明顯,我們可以把資源單獨編譯到一個程式集中,不與應用程式混合在一起,如建立立一個UIResx的項目,設定編譯輸出為Library. 並且用這個選項把SR類的存取修飾詞為public. 這樣,方便在其它應用程式中使用資源.
#! culture_info = Resources.CultureInfo 這一句表示設定地區為從當前的Resources的CultureInfo中讀取
如果我們不希望運行時指定語言地區,這個選項可以讓我們在編譯時間就指定當前語言地區。.
//下面的兩行切換當前語種為簡體中文
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-cn");
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("zh-cn");
此外,您可以把所有語種相關的資源放到一個字串檔案中,也可以把不同的語種相關的資源分布在不同的檔案中。
如下的代碼示範了把所有語種的字串資源放到一個檔案中。
[strings]
Raw = Raw string
StringArg(string name) = With name argument {0}
[strings.zh-cn]
Raw = 原始字串
StringArg(string name) = 簡體中文字元 {0}
您也可以按照如下的樣本,把不同語種的字串資源放到不同的檔案中。
圖七 把字串放到到不同的檔案中
當前預設語言的放到SR.strings檔案中,簡體中文的資源放到SR.strings-zh-cn檔案中
總結
在與字串有關的項目中,您可以充分發揮StringResourceTool2的能力,充分利用.net的智能感知技術,方便準確的構建您的應用程式。您可以通過查看代碼詳細瞭解它的用法。
在項目中比較推薦的作法,為您的項目建立一個只包含字串資源的項目,設定輸出為Library,方便您的維護和複用.