找不到适合指定文化或中性文化的资源

时间:2011-01-14 11:48:56

标签: c# .net exception-handling localization resources

我创建了一个程序集,后来重命名了它。

然后我在调用时开始收到运行时错误:

toolsMenuName = resourceManager.GetString(resourceName);

resourceName变量在运行时“enTools”

  

无法找到任何资源   适合指定的文化   或中性文化。确保   “Jfc.TFSAddIn.CommandBar.resources”   被正确嵌入或链接到   编译时汇编“Jfc.TFSAddIn”   时间,还是所有的卫星   所需的组件是可加载的   完全签署。

代码:

string resourceName;
ResourceManager resourceManager = new ResourceManager("Jfc.TFSAddIn.CommandBar", Assembly.GetExecutingAssembly());

CultureInfo cultureInfo = new CultureInfo(_applicationObject.LocaleID);

if(cultureInfo.TwoLetterISOLanguageName == "zh")
{
     CultureInfo parentCultureInfo = cultureInfo.Parent;
     resourceName = String.Concat(parentCultureInfo.Name, "Tools");
}
else
{
     resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools");
}

toolsMenuName = resourceManager.GetString(resourceName); // EXCEPTION IS HERE

我可以看到项目中包含的CommandBar.resx文件,我可以打开它并在那里看到“enTools”字符串。似乎任何资源都没有包含在程序集或资源中,但.NET无法解析名称。

9 个答案:

答案 0 :(得分:29)

我认为更简单的解决方案是为每种语言创建单独的资源文件。

就此情况而言,检查包含资源的程序集是否将默认名称空间设置为相同的文本(Project-> Properties-> Default namespace;在VS中)

检查resx文件是否将属性BuildAction设置为“Embedded resource”

答案 1 :(得分:10)

我相信你已经得到了答案,但以防万一:

  1. 您可以通过调用

    来查看ManifestResourceName
    System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames() 
    

    检查GetString()调用中的清单名称和名称是否相同。

  2. 另外,请确保在designer.resx文件中有正确的命名空间:

    namespace Jfc.TFSAddIn {
    ...
    global::System.Resources.ResourceManager temp = 
                 new global::System.Resources.ResourceManager(
                 "Jfc.TFSAddIn.CommandBar", typeof(CommandBar).Assembly);
    ... 
    }
    
  3. 打开resx文件属性:“Build Action”应为“Embedded Resource”

答案 2 :(得分:1)

对我来说,问题的根源是命名以数字开头的rex文件:

  

20160216_tranlation.resx

调用StringBuilder sb = new StringBuilder(); // fill StringBuilder using (StreamWriter sw = new StreamWriter(@"c:\file.txt")) { for (int i = 0; i < sb.Length; i++) { sw.Write(sb[i]); } } 时,我必须在resx文件名前添加下划线_

GetGlobalResourceObject

答案 3 :(得分:0)

我更正了ResourceManager静态属性&amp;中设计器文件(Resources.Designer.cs)中的命名空间。它对我有用。

请参阅以下代码:

array_walk($array, function(&$arr) {usort($arr, function($a,$b){return ($a["time"] < $b["time"]) ? -1 : ($a["time"] > $b["time"] ? 1 : 0);});});

答案 4 :(得分:0)

我在Form.cs中添加了一个临时类,同时(测试||调试)导致抛出此异常。 Form.resx文件(名称||资源ID)已修改为临时类名而不是Form类名。这给我带来了问题。通过在项目中为我的临时类创建一个单独的文件,我(更正了||缓解了这个)。

答案 5 :(得分:0)

一个解决方案是将resx文件的属性从内容更改为嵌入式资源并构建它。这次你可以获取

答案 6 :(得分:0)

我在Xamarin.Forms中遇到过这个问题,当我尝试重命名项目时,无法再使用相同的错误文本加载资源。

要解决此问题,我必须通过文本编辑器修改.csproj,并更改嵌入资源的逻辑名称。

<EmbeddedResource Include="Localization\TextResources.resx">
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>TextResources.Designer.cs</LastGenOutput>
      <LogicalName>YourNewNamespaceName.TextResources.resources</LogicalName>
      <SubType>Designer</SubType>
</EmbeddedResource>

在重建时,请注意自动生成的类,其中所述的命名空间可能会发生变化。

希望它可以帮助那些陷入同样情况的人。

答案 7 :(得分:0)

当我在Windows窗体应用程序中的局部窗体类上方添加一个类时,遇到了此错误。

当我将班级移至部分形式课以下时,它消失了。

答案 8 :(得分:-1)

answer解决了我的问题! GetGlobalResourceObject