2012-06-30 32 views
7

一個非常簡單的事情,我無法讓它工作。我想全球化我的DLL,因此我正在使用資源文件+ ResourceManager。Resourcemanager正在返回相同的資源,雖然指定了CultureInfo

我調用ResourceManager這樣的:

var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly()); 

獲取字符串這樣

System.Diagnostics.Debug.WriteLine(p.GetString("greeting")); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl-NL"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("en"))); 

並返回的字符串相同的4倍。我的文件被稱爲

Default.resx 
Default.en.resx 
Default.nl.resx 
Default.nl-NL.resx 

所有文件設置都是一樣的,但提到 - 只用在默認文件資源。

我在這裏忽略了什麼?

+2

是.resx文件實際上得到編譯成附屬程序集?查看bin \ Debug文件夾並查找名稱爲en,nl和nl-NL的子目錄。 –

+0

嘗試通過'Default.ResourceManager.GetString'獲取翻譯。很有可能你正在創建的資源管理器會得到一些錯誤的參數。 –

回答

10

有幾種使用資源文件的方法,其中之一是使用.resx文件。這些文件會根據Thread.CurrentThread.CurrentUICulture的值自動進行本地化。默認的.resx文件被編譯到它所屬的程序集(例如你的主要可執行文件)中,而本地化資源(Default.nl-NL.resx)被編譯到它們自己的目錄中(基於文化標識符nl-NL)稱爲<AssemblyName>.resources.dll

來自這些資源的尋址值與<ResourceName>.<KeyName>一樣容易,例如Default.Greeting。爲了測試它,你改變文化,使用:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
Console.WriteLine(Default.Greeting); 

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("nl-NL"); 
Console.WriteLine(Default.Greeting); 

將輸出

Hello 
Hallo 

在程序啓動時,UI文化設置爲它上運行的計算機的文化,讓你贏不必自己指定語言以始終呈現本地化資源。所以,.resx文件似乎是要走的路。

當從var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly());使用ResourceManager時,您將必須閱讀.resources文件。如果沒有(在你的情況下)Appname.Default.resources文件,p.GetString將失敗。所以我想你已經創建了一個.resources文件,但還沒有將本地化的.resx文件轉換爲.resources文件。

如果你想使用ResourceManager能夠指定的文化,你可以使用:

Default.ResourceManager.GetString("Greeting", new CultureInfo("en-US")); 
+1

謝謝 - 我不知道爲什麼我不使用Resources.Default。必須是週末! –

+0

@CodeCaster請你看看我的問題。 http://stackoverflow.com/questions/24070892/resources-dont-load-current-culture – Marc

相關問題