什么是資源文件
在 .NET 中準(zhǔn)備 World-Ready 程序時(shí)需要三步,,Globalization,Localizability 和 Localization,。在這第三步的 Localization 中就是使用資源文件最常見的地方,。(本文不討論 World-Ready 程序,,或許以后在另一篇文章中)因?yàn)槌绦虻倪壿嫿缑嫘枰c資源界面隔離,,而資源界面就是我們所說的資源文件。顧名思義,,一個(gè)資源文件中當(dāng)然全是資源,,不過,什么是資源,?這里所謂的資源就是程序中可利用的數(shù)據(jù),,譬如:字符串、圖片和任何二進(jìn)制數(shù)據(jù),,包括任何類型的文件,。注意一個(gè)資源文件可以有多種語言版本,舉例,,一個(gè) Strings.resources 文件可以有英語版,、簡(jiǎn)體中文版、繁體中文版等,。 ResourceManager 可以自動(dòng)根據(jù)文件名來確認(rèn)調(diào)用哪個(gè)版本,。不同的版本只要在文件名中添入?yún)^(qū)域語言就可以了。比如,,我們的 Strings.resources 是默認(rèn)版,,英語版的可以是 Strings.en-US.resources(美國英文),簡(jiǎn)體中文的可以是 Strings.zh-CHS.resources(簡(jiǎn)體中文),,而繁體中文的就可以是 Strings.zh-CHT.resources(繁體中文),。所謂的默認(rèn)版就是當(dāng)找不到適當(dāng)?shù)馁Y源版本時(shí)用的資源,一般都是英文,。默認(rèn)文件應(yīng)當(dāng)被嵌入到主 Assembly 中,,這樣就不會(huì)發(fā)生找不到資源的錯(cuò)誤。在 VS.NET 中將一個(gè)文件的屬性設(shè)為 Embedded Resource 可以使資源被嵌入到主 Assembly 中,。 如何準(zhǔn)確的定義資源文件的邏輯位置
我想這是許多人最關(guān)注的一段了,!在這里作者將解說如何正確的填寫 ResouceManager(String, Assembly) 這個(gè) constructor,還有如何正確的填寫 Assembly.GetManifestResourceStream(String),,因?yàn)樗鼈儍蓚€(gè)的原理是相同的,。看過了上面的描述,,到了這里就簡(jiǎn)單多了,。這里主要討論的是怎么填寫那個(gè) String。這個(gè) String 就是資源的完整名,一個(gè)完整名由它的名字空間和文件名前部分(BaseName)組成,。例如,,如果默認(rèn)名字空間(root namespace)是 DefaultNamespace,資源文件的名字是 Strings.en-US.resources,,那么它的完整名就是 DefaultNamespace.Strings,。這個(gè)很簡(jiǎn)單,不過怎樣確定名字空間呢,?這就有些奇怪了,,因?yàn)?C# 的編譯器與 VB.NET 的編譯器有些不同。作者在這里分別給出兩個(gè)編譯器怎樣給嵌入資源自動(dòng)添加命名空間: C# 它自動(dòng)添加 default namespace(與 root namespace 相同),,但也添加子文件夾的名字,。例如,在 Subfolder 子文件夾下放的資源文件 Strings.en-US.resources,,它的完整名是 default namespace + subfolder + base name = DefaultNamespace.Subfolder.Strings VB.NET 在 VB.NET 中就很簡(jiǎn)單了,,它自動(dòng)給嵌入資源添加 root namespace。不管你在哪個(gè)子文件夾中放置資源文件,,資源文件的完整名永遠(yuǎn)是 root namespace + base name,。 根據(jù)上面的描述,如果我們使用 C#,,用 VS.NET 在 NewFolder 這個(gè)子文件夾中添加了一個(gè)叫 Images.resources 的資源文件,,那么我們應(yīng)該用以下代碼獲取這些資源,假設(shè) default namespace 是 MyDefault: ResourceManager res = new ResourceManager("MyDefault.NewFolder.Images", this.GetType().Assembly); |
|