我正在尝试应用程序中的多语言功能。我创建了资源文件GlobalTexts.en-EN.resx GlobalTexts.fr-FR.resx以及一个设置文化并返回文本的类(我不会详细介绍所有细节,只显示结构):
public class Multilanguage
{
...
_res_man_global = new ResourceManager("GlobalResources.Resources.GlobalTexts", System.Reflection.Assembly.GetExecutingAssembly());
...
public virtual string GetText(string _key)
{
return = _res_man_global.GetString(_key, _culture);
}
}
...
Multilanguage _translations = new Multilanguage();
...
someText = _translations.GetText(_someKey);
...
这很好用。 现在,我想在另一个解决方案中使用这个应用程序,它基本上扩展了它(更多的窗口等),它还有资源文件ExtendedTexts.en-En.resx ExtendedTexts.fr-FR.resx和一个新类,如:
public class ExtendedMultilanguage : Multilanguage
{
...
_res_man_local = new ResourceManager("ExtendedResources.Resources.ExtendedTexts", System.Reflection.Assembly.GetExecutingAssembly());
...
public override string GetText(string _key)
{
string _result;
try
{
_result = _res_man_local.GetString(_key, _culture);
}
catch (Exception ex)
{
_result = base.GetText(_key);
}
}
...
ExtendedMultilanguage _translations = new Multilanguage();
...
someText = _translations.GetText(_someKey);
...
这个想法是,如果在ExtendedTexts中找不到密钥,该方法将调用正在查看GlobalTexts的基类。我这样做是为了在代码中的任何地方使用调用GetText(wantedKey),而不必关心资源的位置(我不想在GlobalTexts文件中包含扩展的翻译);它突出了与项目不同的使用过的类。
我面临的问题是,当异常提升时,try / catch 非常慢 - 我等待一个窗口填充的秒数。我通过直接调用测试并且工作得更快,但是我需要关注资源所在的所有时间......
问题是:是否有另一种方法可以做到这一点(将资源分散到各种文件中,并且只有一种方法可以提供所需的资源而不会产生错误)?
答案 0 :(得分:0)
最后,我采用了一种解决方案,并在字典中加载了资源文件的所有内容。这样我可以使用ContainsKey并查看密钥是否存在。