應用開源項目StringResourceTool2 實現.NET多國語言方案

來源:互聯網
上載者:User

我們在應用.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,方便您的維護和複用.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.