C# 實(shí)現(xiàn)多語言支持的本地化(資源)
當(dāng)前位置:點(diǎn)晴教程→知識管理交流
→『 技術(shù)文檔交流 』
? 資源像圖片或字符串表這樣的資源可以放在資源文件或附屬程序集中。在本地化應(yīng)用程序時(shí),這種 資源非常有用,.NET 對本地化資源的搜索提供了內(nèi)置支持。 在說明如何使用資源本地化應(yīng)用程序之前,先討論如何創(chuàng)建和讀取資源,而無須考慮語言因素。 創(chuàng)建資源文件資源文件包含圖片、字符串表等條目。要?jiǎng)?chuàng)建資源文件,或者使用一般的文本文件,或者使用 那些利用XML 的.resX 文件。下面從一個(gè)簡單的文本文件開始。 內(nèi)嵌字符串表的資源可以使用一般的文本文件來創(chuàng)建。該文本文件只是把字符串賦予鍵。鍵是 可以用來從程序中獲取數(shù)值的名稱。鍵和數(shù)值中都可以包含空格。 這個(gè)例子顯示了Wrox.ProCSharp.Localization.MyResources.txt 文件中的一個(gè)簡單字符串表:
在保存帶Unicode 字符的文本文件時(shí),必須將文本文件和相應(yīng)的編碼一起保存。 為此,可以在Save 對話框中選擇Unicode 編碼。 資源文件生成器可以使用資源文件生成器Resgen.exe(實(shí)用程序)在Wrox.ProCSharp.Localization.MyResources.txt 的外部創(chuàng)建一個(gè)資源文件,輸入如下代碼: resgen Wrox.ProCSharp.Localization.MyResources.txt 會創(chuàng)建Wrox.ProCSharp.Localization.MyResources.resources 文件。最終的資源文件可以作為一個(gè) 外部文件添加到程序集中,或者內(nèi)嵌到DLL 或EXE 中。Resgen 還可以創(chuàng)建基于XML 的.resX 資源 文件。構(gòu)建XML 文件的一種簡單方法是使用Resgen 本身:
這條命令創(chuàng)建了XML 資源文件Wrox.ProCSharp.LocalizationMyResources.resX。 Resgen 支持強(qiáng)類型化的資源。強(qiáng)類型化的資源用一個(gè)訪問資源的類表示。這個(gè)類可以用resgen 實(shí)用程序的/str 選項(xiàng)創(chuàng)建:
在/str 選項(xiàng)中,按照語言、名稱空間、類名和源代碼文件名的順序定義資源。 Resgen 實(shí)用程序不支持添加圖片。在.NET Framework SDK 示例中,有一個(gè)ResXGen 示例。使 用ResXGen 可以在.resX 文件中引用圖片。還可以使用ResourceWriter 類或ResXResourceWriter 類 以編程方式把圖片添加到資源中。 ResourceWriter除了使用Resgen 實(shí)用程序構(gòu)建資源文件外,編寫程序來創(chuàng)建資源也很簡單。ResourceWriter 是 來自System.Resources 名稱空間的一個(gè)類,它可以用于編寫二進(jìn)制資源文件;ResXResourceWriter 類編寫基于XML 的資源文件。這兩個(gè)類也支持圖片和任何其他可串行化的對象。在使用 ResXResourceWriter 類時(shí),必須引用System.Windows.Forms 程序集。 下面的代碼使用構(gòu)造函數(shù)和文件名Demo.resx 創(chuàng)建一個(gè)ResXResourceWriter 對象rw。在創(chuàng)建了 一個(gè)實(shí)例后,使用ResXResourceWriter 類的AddResource()方法可以添加至多2GB 的資源。 AddResource()方法的第一個(gè)參數(shù)指定資源名,第二個(gè)參數(shù)指定數(shù)值。可以使用Image 類的一個(gè)實(shí)例 來添加圖片資源。要使用Image 類,必須引用System.Drawing 程序集,還要添加using 指令,以打 開System.Drawing 名稱空間。 下面打開logo.gif 文件,創(chuàng)建一個(gè)Image 對象。必須把圖片復(fù)制到可執(zhí)行文件的目錄下,或者 在Image.ToFile()方法的參數(shù)中指定圖片的完整路徑。using 語句指定應(yīng)在using 塊的尾部自動釋放圖 像資源。把其他簡單的字符串資源添加到ResXResourceWriter 對象中。ResXResourceWriter 類的 Close()方法會自動調(diào)用ResXResourceWriter.Generate()方法,最后把資源寫入Demo.resx 文件中:
啟動這個(gè)小程序,創(chuàng)建嵌入了圖像logo.gif 的資源文件Demo.resx,這個(gè)文件將用于下面的一個(gè) Windows 應(yīng)用程序。 使用資源文件使用 C#命令行編譯器csc.exe 和/resource 選項(xiàng),或直接使用Visual Studio,可以把資源文件添加 到程序集中。為了說明如何在Visual Studio 中使用資源文件,下面創(chuàng)建一個(gè)控制臺應(yīng)用程序 ResourceDemo。 在 Solution Explorer 窗口的上下文菜單(Add ? Existing Item 命令)中,把前面創(chuàng)建的資源文件 Demo.resx 添加到這個(gè)項(xiàng)目中。默認(rèn)情況下,把這個(gè)資源的Build Action 設(shè)置為Embedded Resource, 這樣,這個(gè)資源就嵌入到輸出的程序集中。 在項(xiàng)目設(shè)置(Application ? Assembly information 命令)中,把應(yīng)用程序的Neutral Language 設(shè)置 為主要語言,如EEnglish(United States),下圖 所示。改變這個(gè)設(shè)置,會在assemblyinfo.cs 文件 中添加[NeutralResourceLanguageAttribute]屬性:
設(shè)置這個(gè)選項(xiàng)會提高ResourceManager 的 性能,因?yàn)樗鼤斓卣业絜n-US 的資源,該 資源還會用作默認(rèn)的回退。使用這個(gè)特性也可 以通過構(gòu)造函數(shù)的第二個(gè)參數(shù)指定默認(rèn)資源的 位置。使用UltimateResourceFallbackLocation 枚舉可以指定默認(rèn)資源要在主程序集或附屬程 序集(MainAssembly 和Satellite 值)中存儲。 要訪問嵌入的資源,可以使用System.Resources 名稱空間中的ResourceManager 類。把以嵌入 的資源為參數(shù)的程序集傳遞給ResourceManager 類的構(gòu)造函數(shù)。在本例中,因?yàn)榘奄Y源嵌入到正在 執(zhí)行的程序集中, 所以應(yīng)把 Assembly.GetExecutingAssembly() 方法 的結(jié)果作為構(gòu)造函數(shù)的第二個(gè)參數(shù)。第 一個(gè)參數(shù)是資源的根名。根名由名稱空 間和資源文件名(不帶資源擴(kuò)展名)組 成。如前所述,使用ildasm 來顯示該名 稱。為此,只需刪除資源的擴(kuò)展名 resources 即可。還可以使用 System.Reflection.Assembly 類的GetManifestResourceNames()方法通過編程方式獲取該名稱。
使用ResourceManager 實(shí)例rm,通過指定GetObject()和GetString()方法的鍵,就可以獲得所有 的資源:
通過強(qiáng)類型化的資源,可以簡化前面編寫的代碼:不需要實(shí)例化ResourceManager,也不需要 使用索引符訪問資源,而只需使用屬性訪問資源名:
要使用托管資源編輯器創(chuàng)建強(qiáng)類型化的資源,可以把Access Modifier 從No Code Generation 重 置為Public 或Internal。使用Public 選項(xiàng),生成的類就使用公共訪問修飾符,并且它可以在其他程序 集中使用。而使用Internal 選項(xiàng),生成的類就使用內(nèi)部訪問修飾符,并且它只能在程序集內(nèi)部訪問。 設(shè)置這個(gè)選項(xiàng)后,就會創(chuàng)建Demo 類(它與資源同名)。這個(gè)類的靜態(tài)屬性為所有的資源提供了 強(qiáng)類型化的資源名。通過實(shí)現(xiàn)靜態(tài)屬性,就可以使用ResourceManager 對象,該對象在第一次訪問 時(shí)實(shí)例化,并緩存: System.Resources名稱空間ResourceManager 類可以用于從程序集或資源文件中獲取當(dāng)前區(qū)域性的資源。使用 ResourceManager 類還可以獲取特定區(qū)域性的ResourceSet 類。 閱讀原文:原文鏈接 該文章在 2025/3/24 13:20:34 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |