2012-01-20 75 views
6

我们的应用程序中有几千个本地化字符串。我希望创建一个单元测试来遍历所有键和所有支持的语言,以确保每种语言都具有默认(英语)resx文件中的每个键。单元测试本地化字符串

我的想法是使用Reflection从Strings类中获取所有密钥,然后使用ResourceManager比较每种语言中每个键的检索值并进行比较以确保其与英文版不匹配,但是当然,在多种语言中有些词汇是相同的。

有没有办法检查ResourceManager是否从卫星组件获得了它的值与默认的资源文件?

调用示例:

string en = resourceManager.GetString("MyString", new CultureInfo("en")); 
string es = resourceManager.GetString("MyString", new CultureInfo("es")); 

//compare here 

回答

8

调用ResourceManager.GetResourceSet方法得到的中性和本地化的文化的所有资源,然后比较这两个集合:

ResourceManager resourceManager = new ResourceManager(typeof(Strings)); 
IEnumerable<string> neutralResourceNames = resourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, false) 
    .Cast<DictionaryEntry>().Select(entry => (string)entry.Key); 
IEnumerable<string> localizedResourceNames = resourceManager.GetResourceSet(new CultureInfo("es"), true, false) 
    .Cast<DictionaryEntry>().Select(entry => (string)entry.Key); 

Console.WriteLine("Missing localized resources:"); 
foreach (string name in neutralResourceNames.Except(localizedResourceNames)) 
{ 
    Console.WriteLine(name); 
} 

Console.WriteLine("Extra localized resources:"); 
foreach (string name in localizedResourceNames.Except(neutralResourceNames)) 
{ 
    Console.WriteLine(name); 
} 
+0

这是完美的,迈克尔!谢谢! –