2011-01-14 17 views
14

He creado un conjunto y luego lo he cambiado de nombre.No se han encontrado recursos apropiados para la cultura especificada o la cultura neutral

Entonces empecé a recibir los errores de ejecución cuando se llama:

toolsMenuName = resourceManager.GetString(resourceName); 

La variable resourceName es "enTools" en tiempo de ejecución.

No se pudo encontrar ningún recurso apropiados para la cultura especificada o la cultura neutral. Asegúrese de que los "Jfc.TFSAddIn.CommandBar.resources" se ha incrustado o vinculado correctamente en asamblea "Jfc.TFSAddIn" en tiempo de compilación tiempo, o que todos los satélites montajes requeridos son cargables y totalmente firmados.

El código:

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 

puedo ver el archivo CommandBar.resx incluido en el proyecto, puedo abrirlo y puedo ver la cadena "enTools" allí. Parece que los recursos no están incluidos en el ensamblado o el recurso están incluidos, pero .NET no puede resolver el nombre.

Respuesta

28

Creo que la solución más simple sería crear un archivo de recursos separado para cada idioma.

Por lo que este caso es cheque en cuestión si el conjunto que contiene recursos tiene el espacio de nombres predeterminado establecido en el mismo texto (Proyecto-> Propiedades-> espacio de nombres por defecto, en VS)

Compruebe también si el resx tiene una propiedad BuildAction establecida en "Recurso incrustado"

+7

"compruebe si el ensamblado que contiene recursos tiene el espacio de nombres predeterminado configurado para el mismo texto (Proyecto-> Propiedades-> Espacio de nombres predeterminado; en VS)" - ¿el mismo texto de qué? –

+6

+1 para 'Compruebe también si el archivo resx tiene una propiedad BuildAction establecida en "Recurso incrustado"' = Facepalm – Andiih

+0

Te amo hombre :) – Bergkamp

12

Suena similar a un problema que tuvimos. El espacio de nombres era incorrecto en el diseñador del archivo de recursos. Lo arreglé volviendo a ejecutar manualmente la herramienta personalizada en el archivo resx.

Haga clic con el botón derecho en your.resx y haga clic en Ejecutar herramienta personalizada.

+0

Este fue mi problema. Parece que ReSharper cambió el nombre del espacio de nombres durante un refactor ... –

8

Estoy seguro que ya tienes la respuesta, pero por si acaso:

  1. Puede ver su ManifestResourceName llamando

    System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames() 
    

    Comprobar que el nombre Manifiesto y su nombre en Las llamadas GetString() son idénticas.

  2. También, asegúrese de que tiene espacio de nombres correcta en el archivo designer.resx:

    namespace Jfc.TFSAddIn { 
    ... 
    global::System.Resources.ResourceManager temp = 
          new global::System.Resources.ResourceManager(
          "Jfc.TFSAddIn.CommandBar", typeof(CommandBar).Assembly); 
    ... 
    } 
    
  3. propiedades resx abiertas: "Acción de generación" debe ser "Recurso incrustado"

+0

GetManifestResourceNames() es muy útil. Muchas gracias. –

0

Este answer ¡me solucionó el problema! GetGlobalResourceObject

0

Corregí el espacio de nombres en el archivo del diseñador (Resources.Designer.cs) en la propiedad estática de ResourceManager & funcionó para mí.

Ver el código de abajo:

[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 
    internal static global::System.Resources.ResourceManager ResourceManager { 
     get { 
      if (object.ReferenceEquals(resourceMan, null)) { 
       global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("XYZAssembly.Properties.Resources", typeof(Resources).Assembly); 
       resourceMan = temp; 
      } 
      return resourceMan; 
     } 
    } 
+0

Pude resolver este problema simplemente agregando una entrada adicional a los recursos. Eso obligó al código de diseñador a reconstruirse y corregir el problema del espacio de nombres. –

1

Para mí, el origen del problema estaba nombrando los archivos rex que comienzan con un número:

20160216_tranlation.resx

I tuvo que agregar un guión bajo _ antes del nombre del archivo resx al llamar al GetGlobalResourceObject:

public static string getResource(string key) 
{ 
    return HttpContext.GetGlobalResourceObject("_20160216_tranlation", key).ToString(); 
} 
0

Agregué una clase temporal dentro de mi Form.cs mientras (probando || depuración) que provocó que se lanzara esta excepción. El archivo Form.resx (Name || Resource ID) se modificó al nombre de la clase temporal en lugar del nombre de la clase Form. Esto causó el problema para mí. Yo (corregido || aliviado) esto creando un archivo separado para mi clase temporal en el proyecto.

0

Una solución es cambiar la propiedad de resx del contenido en Recurso incrustado y Construir it.Sure este tiempo u obtener vil

0

me he encontrado con este problema en Xamarin.Forms, cuando traté de cambiar el nombre de la proyecto, los recursos no pudieron cargarse más con el mismo texto de error indicado.

Para solucionar el problema tuve que modificar el .csproj por un editor de texto y cambiar el nombre lógico del recurso incrustado.

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

También tenga cuidado con la clase autogenerada cuando la reconstruye, el espacio de nombres indicado allí podría cambiar.

Espero que ayude a alguien que entró en la misma situación.

Cuestiones relacionadas