2011-04-25 83 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

相关问题