我有两个文件:Resources.resx和Resources.de.resx。
Resources.de.resx只包含一个翻译的值。我使用以下方法加载所有资源键/值:
ResourceSet resourceSet = Resources.ResourceManager.GetResourceSet(Thread.CurrentThread.CurrentCulture, true, true);
当我第一次加载资源集时,我的Thread.CurrentThread.CurrentCulture.Name是空字符串,Thread.CurrentThread.CurrentCulture.NativeName =" Invariant Language(Invariant Country)",Thread.CurrentThread。 CurrentCulture.LCID = 127。
因此,资源集有200个键,其值从Resources.resx按预期加载。然后我使用以下代码切换当前文化,该代码通过单击按钮触发:
Thread.CurrentThread.CurrentCulture = new CultureInfo("de");
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
当我现在加载资源集时,我在集合中只有一个键。它是Resources.de.resx的翻译密钥。但是我仍然期望有200个键,只有一个项目被翻译成德语(de)语言。
当前德语(de)文化的父文化与我第一次调用该方法获取资源集时的语言文化是一样的。基本上,由于某些原因看起来后备不起作用。你能告诉我我做错了什么吗?
答案 0 :(得分:3)
您必须从不变文化中获取所有密钥,然后您才能查找所有翻译。所以后备工作。
查找的资源可以存储在字典中。
var keys = Resources.ResourceManager
.GetResourceSet(CultureInfo.InvariantCulture, true, true)
.Cast<DictionaryEntry>()
.Select(entry => entry.Key)
.Cast<string>();
var enUsResources = keys.ToDictionary(
key => key,
key => Resources.ResourceManager.GetString(key, CultureInfo.GetCultureInfo("de")));
答案 1 :(得分:0)
您调用Resources的方式实际上是阻止了回退,因为您首先获取了本地化(de)资源集,然后尝试访问Resources.de.resx文件中的特定值。这就是方法 Resources.ResourceManager.GetResourceSet(Thread.CurrentThread.CurrentCulture,true,true)将返回的资源集。
如果资源集根本不存在,则只应用GetResourceSet的fallback参数。一旦创建了Resources.de.resx文件,就会开始返回该资源集。
为了利用资源的隐式回退规则,您应该使用&#39; Resources.ResourceManager.GetString(token)&#39;因为它将通过资源集层次结构并返回到最接近的令牌实现。
答案 2 :(得分:0)
您的德语资源集仍然只有您为其定义的键。我认为您要解决的最终问题是:“如果在本地化资源集中找不到某个特定键的本地化值,为什么不回退到英文条目呢?”如果是这样,您可能正在做这样的事情……
var resourceSet = resourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true);
var localizedValue = resourceSet.GetString(key);
实际上,您应该只是这样做...
var localizedValue = resourceManager.GetString(key, CultureInfo.CurrentCulture);
换句话说,让资源管理器执行查找,而不是资源集。