2012-01-20 37 views
6

Chúng tôi có một vài nghìn chuỗi được bản địa hóa trong ứng dụng của chúng tôi. Tôi muốn tạo một bài kiểm tra đơn vị để lặp qua tất cả các khóa và tất cả các ngôn ngữ được hỗ trợ của chúng tôi để đảm bảo rằng mọi ngôn ngữ đều có mặt chính trong tệp resx (tiếng Anh) mặc định.Thử nghiệm đơn vị các chuỗi được bản địa hóa

Ý tưởng của tôi là sử dụng Reflection để lấy tất cả các khóa từ lớp Strings, sau đó sử dụng ResourceManager để so sánh giá trị được truy xuất cho mỗi khóa trong mọi ngôn ngữ và so sánh nó để đảm bảo nó không khớp với phiên bản tiếng Anh, nhưng tất nhiên, một số từ giống nhau trên nhiều ngôn ngữ.

Có cách nào để kiểm tra xem ResourceManager có được giá trị của nó từ lắp ráp vệ tinh so với tệp tài nguyên mặc định không?

Ví dụ gọi:

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

//compare here 

Trả lời

8

Gọi phương pháp ResourceManager.GetResourceSet để có được tất cả các nguồn lực cho các nền văn hóa trung tính và cục bộ, và sau đó so sánh hai bộ sưu tập:

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

này là hoàn hảo, Michael! Cảm ơn bạn! –