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