直接访问备用资源文件

本文关键字:资源 源文件 备用 访问 | 更新日期: 2023-09-27 18:24:57

我的程序中有一个工作语言开关。它使用一个标准资源文件,并为它支持的每种语言提供一个额外的副本。它对控件和代码中的字符串都很好。

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

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

我的资源文件称为

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

我试过了:

DrawCtl_strings.en.mnRed;

但它不编译。。

有没有一种(简单)的方法可以在不切换语言的情况下实现

我看过这篇文章,但我想知道是否有更简单、更直接的方法。。?

直接访问备用资源文件

环顾四周后,我怀疑我是否可以使用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]);

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

唉,我本来希望能做对保存几行代码。。