2011-04-25 50 views
6

我在堆棧溢出時遇到類似於我的問題:Loop through all Resources in ResourceManager - C#。它只解決了我需要做的一部分。當您在特定文化的資源文件中請求條目時,如果沒有一個文件存在,它將默認回到中性文化資源文件。asp.net獲取.resx的所有資源而不指定文化(ResourceManager.GetResourceSet)

我需要遍歷給定資源文件的每個條目,並且GetResourceSet需要一種文化。例如,我有一箇中立的資源文件,其中有3個條目,文件特定的資源文件伴隨有1個條目的中性文件。

我的中性資源示例文件是MyResource.resx,我的文化特定資源示例文件是MyResource.en-gb.resx。以下代碼顯示了我目前如何循環訪問所有資源條目。

Dim cultInfo as New CultureInfo(culture) 
For Each entry As System.Collections.DictionaryEntry In myResourceManager.GetResourceSet(cultInfo, True, True) 

Next 

中立資源文件條目

  • 全名/姓名
  • ******中國/電話號碼
  • 國家/國家

特定文化資源文件條目

  • 州/縣

當我打電話GetResourceSet的特定文化,我只拿回1項。我希望(並希望)能夠重寫所有3個條目,並重寫一個文化特定條目。以下是我想要返回:

  • 全名/姓名
  • ******中國/電話號碼
  • 國家/

反正是有,我可以做到這一點?謝謝。

回答

9

ResourceManager對象的GetString方法正確處理資源文件的遍歷,以根據區域性爲給定的鍵定位正確的值。可以使用CultureInfo.InvariantCulture獲取基本/中性/默認資源文件,該文件爲您提供資源文件的所有可能的密鑰(假設您以這種方式設置資源文件)。

根據Invariant Culture,在ResourceManager的GetResourceSet方法中找到的DictionaryEntry對象上循環,然後使用傳入的特定區域性爲每個Key調用GetString,您將獲得基於文化。

For Each entry As DictionaryEntry In myResourceManager.GetResourceSet(CultureInfo.InvariantCulture, True, True) 
    Dim strKey as String = entry.Key.ToString() 
    Dim strValue as String = myResourceManager.GetString(entry.Key.ToString(), cultInfo) 
Next 

希望這有助於!

+1

我明白這個*解決方法*解決了這個問題,但仍然發現(和我發現的一樣)這個'GetResourceSet'方法的行爲並不能反映[documentation](http://msdn.microsoft.com/zh-cn/)中的內容。 COM/EN-US /庫/ system.resources.resourcemanager.getresourceset(v = VS.100)的.aspx)。 – superjos 2013-08-22 17:41:59

+0

好吧,其實我試過了,在我的情況下它並沒有解決問題。在遍歷resourceSet時,我只獲取特定於語言環境的鍵。該集合根本沒有來自回退資源的密鑰。 :(我仔細檢查了我傳遞了正確的文化,真實,真實。 – superjos 2013-08-22 18:04:51

+0

最後,我這樣管理它:我從'InvariantCulture'創建了一個字典,另一個從'CurrentUICulture'中創建了一個字典,然後我把前者合併後者。 – superjos 2013-08-23 09:25:43