2012-01-11 21 views
14

Estoy tratando de usar el ResourceManager en una clase C#, pero no sé qué sustituir por el nombre base al crear una nueva instancia de la clase ResourceManager.Usando ResourceManager

Tengo un proyecto independiente que contiene los archivos de recursos que se hace referencia mediante mi proyecto arriba mencionado de la siguiente manera: • Resources.resx • Resources.es-ES.resx

Si tengo un fragmento de código de la siguiente manera, ¿qué debería sustituir el nombre base cuando quiero usar la versión en inglés o español de los recursos?

ResourceManager RM = new ResourceManager(basename,Assembly.GetExecutingAssembly()); 

He probado el enfoque sugerido por Tom, pero estoy recibiendo el error infame "No se pudo encontrar ningún recurso apropiado para la cultura especificada o la referencia cultural neutra".

Tengo 2 proyectos donde el proyecto YeagerTech es un proyecto y proyecto de aplicación web. YeagerTechResources es un proyecto (en la misma solución) que contiene todos los recursos. El proyecto YeagerTech tiene una referencia en YeagerTechResources.

que tienen la siguiente sintaxis al crear mi Resource Manager:

ResourceManager RM = new ResourceManager("YeagerTechResources.Resources", Assembly.GetExecutingAssembly()); 

Obviamente, es incorrecta.

Los archivos de recursos en el proyecto YeagerTechResources tienen su BuildAction establecido en Recurso incrustado.

El nombre de mis archivos de recursos es: Resources.resx y Resources.es-ES.resx.

Si alguien simplemente me puede decir el sintaxis exacta a utilizar en función de mis nombres de proyecto y archivo de recursos cuando una instancia del gestor de recursos, que sería de gran aprecio ...

He hecho todo lo que puedo pensar para resolver esto y no se puede ....

este es mi último intento de resolver aquí ...

ResourceManager RM = new ResourceManager("YeagerTechResources.Resources", Assembly.GetExecutingAssembly()); 

estoy recibiendo el siguiente error después de ejecutar el siguiente código:

sb.Append(RM.GetString("RegisterThanks")); 

No se encontraron los recursos adecuados para la cultura especificada o la cultura neutral. Asegúrese de que "YeagerTechResources.Resources.resources" se incrustó correctamente o se vinculó al ensamblado "YeagerTech" en tiempo de compilación, o que todos los ensamblajes satelitales requeridos se puedan cargar y firmar completamente.

Tengo una solución y dos proyectos. Uno es el proyecto web y el otro es el proyecto de recursos. El proyecto de recursos se incluye como referencia en el proyecto web.

Puedo utilizar los recursos en el marcado HTML sin ningún problema, pero al llegar al código C# en el controlador, sigo obteniendo el error anterior.

Cualquier ayuda para la sintaxis exacta que necesito en base a mis proyectos sería muy apreciada.

+6

FYI, en Visual Studio, si agrega un nuevo elemento a su proyecto, seleccione "Archivo de recursos" y asígnele el nombre "Resources.resx", luego Visual Studio generará automáticamente una clase contenedora para la clase ResourceManager en un archivo llamado "Resources.Designer.cs".Puedes mirar ese código para ver cómo funciona. Desafortunadamente, la clase contenedora se genera como interna al proyecto, por lo que no podrá ver esa clase contenedora desde un proyecto diferente, a menos que use el atributo 'InternalsVisibleTo'. –

+0

@ sagesky36 ¿Tiene un archivo resx de idioma neutral (uno sin el código de idioma) y un resx específico del idioma (por ejemplo, Resources.en-US.resx)? Necesita al menos el idioma neutral y especifique en la configuración del proyecto qué idioma es el idioma neutral para su aplicación. –

+0

Relacionados: [Acceder a las cadenas de recursos localizadas sin crear una instancia de 'ResourceManager'?] (Http://stackoverflow.com/q/5246631/1497596) – DavidRR

Respuesta

4

De acuerdo con la documentación de MSDN here, el argumento especifica el nombre base "El nombre raíz del archivo de recursos sin su extensión pero incluyendo cualquier nombre de espacio de nombres completo. Por ejemplo, el nombre de la raíz para el archivo de recursos denominado" MyApplication.MyResource .en-US.resources "es" MyApplication.MyResource "."

El ResourceManager automáticamente intentará recuperar los valores para la cultura de UI actual. Si desea utilizar un idioma específico, deberá establecer la cultura de la interfaz de usuario actual en el idioma que desea utilizar.

+0

Corrección secundaria: el ResourceManager no necesariamente debe crearse después de que se modifique la cultura de la interfaz de usuario actual. –

13

La manera rápida y sucia de comprobar qué cadena lo necesita para ver los archivos .resources generados.

Sus .resources se generan en los recursos proyectos obj/Debug directorio. (si no, haga clic derecho en el archivo .resx en el explorador de soluciones y pulse 'Ejecutar herramienta personalizada' para generar los archivos .resources)

Navegue a este directorio y eche un vistazo a los nombres de los archivos. Debería ver un archivo que termina en XYZ.resources. Copie ese nombre de archivo y elimine los recursos finales. Ese es el archivo que debe cargar.

Por ejemplo en mi obj/directorio Bin tengo el archivo:

MyLocalisation.Properties.Resources.resources

Si los archivos de recursos están en la misma clase Librería/Application yo uso el C# siguiente

ResourceManager RM = new ResourceManager("MyLocalisation.Properties.Resources", Assembly.GetExecutingAssembly()); 

Sin embargo, ya que suena como que está utilizando el archivo de recursos de una biblioteca de clase/Aplicación separada es probable que desee

Assembly localisationAssembly = Assembly.Load("MyLocalisation"); 
ResourceManager RM = new ResourceManager("MyLocalisation.Properties.Resources", localisationAssembly); 
8

This SO answer podría ayudar en este caso.
Si el proyecto principal ya se haga referencia al proyecto de recursos , entonces usted podría trabajar de forma explícita con su clase en los recursos generados en el código, y acceder a su ResourceManager de eso. Por lo tanto, algo a lo largo de las líneas de:

ResourceManager resMan = YeagerTechResources.Resources.ResourceManager; 

// then, you could go on working with that 
ResourceSet resourceSet = resMan.GetResourceSet(CultureInfo.CurrentUICulture, true, true); 
// ... 
31

No hay manera sorprendentemente sencilla de recursos de lectura por cadena:

ResourceNamespace.ResxFileName.ResourceManager.GetString("ResourceKey") 

Es una solución limpia y elegante para la lectura de los recursos por las teclas donde "notación de puntos" no se puede utilizar (por ejemplo, cuando la clave de recursos se conserva en la base de datos).

+2

Aún más simple: agregue "usando RootNamespace.Properties" a su archivo de código (donde rootnamespace está definido en las propiedades de su proyecto) y luego simplemente haga lo siguiente: Resources. . Sin embargo, no estoy seguro de si puedes hacer la localización con esto. – user169771

+0

¿Qué es ResourceNamespace? ¿Puedes proporcionar el código completo? – Muflix

+1

@Muflix Es solo el espacio de nombres del archivo de recursos. – Landeeyo

0

Pasé por un problema similar. Si considera su "YeagerTechResources.Resources", significa que su Resources.resx se encuentra en la carpeta raíz de su proyecto.

Tenga cuidado de incluir la ruta completa, por ejemplo: "project \ subfolder (s) \ file [.resx]" al constructor de ResourceManager.

Cuestiones relacionadas