2014-09-28 113 views
1

我的程序中有一个工作语言切换。它使用标准的资源文件和它支持的每种语言的一个额外副本。它工作正常,无论是控制和代码中的字符串。直接访问备用资源文件

但是,对于一种特殊情况,我想直接访问英文资源文件,无论当前选择哪种语言。

原因是,尽管我可以将命名的颜色翻译为德语,但对于我的弹出式菜单,我无法使用Color.FromName方法的非英文名称。所以我想显示翻译后的名称,但仍然使用英文名称作为方法调用。

我的资源文件被称为

DrawCtl_strings.resx 
DrawCtl_strings.en.resx 
DrawCtl_strings.de.resx 

我想:

DrawCtl_strings.en.mnRed; 

,但它不会编译..

是否有一个(简单)的方式来做到这一点实际切换语言?

我看过this后,但我不知道是否有更简单,更直接的方法..?

回答

0

环顾很多后,我怀疑我可以绕过使用ResourceManager,毕竟。

所以这对我的作品,创造两本字典,一个始终为英语,其他的CurrentUICulture

ResourceManager rm = new ResourceManager("Knips.DrawCtl_strings", 
          typeof(Knips.DrawCtl_strings).Assembly); 

CultureInfo culture = CultureInfo.CreateSpecificCulture("en"); 
ResourceSet resourceSet = rm.GetResourceSet(culture, true, true); 

var englishResDict = resourceSet.Cast<DictionaryEntry>() 
    .ToDictionary(r => r.Key.ToString(), r => r.Value.ToString()); 

resourceSet = rm.GetResourceSet(Thread.CurrentThread.CurrentUICulture, true, true); 

var currentResDict = resourceSet.Cast<DictionaryEntry>() 
    .ToDictionary(r => r.Key.ToString(), r => r.Value.ToString()); 

我然后将它们结合起来,以创建我的颜色字典(Dictionary<string, string> ColorDict):

foreach (var resEn in englishResDict.Keys) 
    if (resEn.StartsWith("col_")) 
     ColorDict.Add(englishResDict[resEn], currentResDict[resEn]); 

我仍然依靠一个命名约定,但至少它是我可以控制的一个.. (当然,这取决于我保证值的唯一性。)

感慨,我本来希望得到它的正确保存几行代码..