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