【问题标题】:Access an alternate resource file directly直接访问备用资源文件
【发布时间】:2014-09-29 16:06:24
【问题描述】:

我的程序中有一个工作语言切换。它为它支持的每种语言使用一个标准资源文件和一个额外的副本。对于控件和代码中的字符串,它都可以正常工作。

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

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

我的资源文件被调用

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

我试过了:

DrawCtl_strings.en.mnRed;

但它没有编译..

有没有一种(简单的)方法可以做到这一点无需实际切换语言?

我看过this 的帖子,但我想知道是否有更简单、更直接的方法..?

【问题讨论】:

    标签: c# resources


    【解决方案1】:

    看了很多遍后,我怀疑我是否可以使用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&lt;string, string&gt; ColorDict):

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

    我仍然依赖命名约定,但至少它是我可以控制的.. (当然,由我来保证值的唯一性。)

    唉,我希望能把它弄好节省几行代码..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多