c# - Usando ResourceManager
resourcemanager c# (6)
Hay una forma sorprendentemente sencilla de leer recursos por una cadena:
ResourceNamespace.ResxFileName.ResourceManager.GetString("ResourceKey")
Es una solución limpia y elegante para leer recursos por claves donde no se puede usar la "notación de puntos" (por ejemplo, cuando la clave de recursos se conserva en la base de datos).
Estoy tratando de usar el ResourceManager en una clase de C #, pero no sé qué sustituir por el nombre base al crear una nueva instancia de la clase ResourceManager.
Tengo un proyecto separado que contiene los archivos de recursos a los que hace referencia mi proyecto mencionado anteriormente como los siguientes:
- Recursos.resx
- Recursos.es-ES.resx
Si tengo un fragmento de código de la siguiente manera, ¿qué debo sustituir por 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());
Probé el enfoque sugerido por Tom, pero recibo el infame error.
No se pudo encontrar ningún recurso apropiado para la cultura especificada o la cultura neutral.
Mi solución tiene dos proyectos donde el proyecto YeagerTech es una aplicación web y el proyecto YeagerTechResources contiene todos los recursos. El proyecto YeagerTech tiene una referencia a YeagerTechResources.
Tengo la siguiente sintaxis al crear mi Administrador de recursos:
ResourceManager RM = new ResourceManager("YeagerTechResources.Resources",
Assembly.GetExecutingAssembly());
Obviamente, es incorrecto.
Los archivos de recursos en el proyecto YeagerTechResources tienen su BuildAction establecido en Recurso incrustado.
El nombre de mis archivos de recursos son: Resources.resx y Resources.es-ES.resx.
Si alguien me puede decir la sintaxis exacta que debo usar en función de los nombres de mis proyectos y archivos de recursos al crear una instancia del administrador de recursos, lo apreciaría enormemente ...
He hecho todo lo que se me ocurre para resolver esto y no puedo ...
Este es mi último intento de resolverlo aquí ...
ResourceManager RM = new ResourceManager("YeagerTechResources.Resources", Assembly.GetExecutingAssembly());
sb.Append(RM.GetString("RegisterThanks"));
Recibo el siguiente error después de ejecutar el código anterior:
No se pudo encontrar ningún recurso apropiado para la cultura especificada o la cultura neutral. Asegúrese de que "YeagerTechResources.Resources.resources" esté correctamente incrustado o enlazado en el ensamblaje "YeagerTech" en el momento de la compilación, o que todos los ensamblajes satelitales requeridos sean cargables y estén firmados.
Puedo usar los recursos en el marcado HTML sin ningún problema, pero al acceder al código C # en el Controlador, continúo obteniendo el error anterior.
Cualquier ayuda para la sintaxis exacta que necesito basada en mis proyectos sería muy apreciada.
La forma rápida y sucia de comprobar qué cadena necesita para ver los archivos .resources generados.
Sus .resources se generan en el directorio de proyectos obj / Debug de recursos. (Si no es así, haga clic derecho en el archivo .resx en el explorador de soluciones y presione ''Ejecutar herramienta personalizada'' para generar los archivos .resources)
Navegue a este directorio y eche un vistazo a los nombres de archivo. Debería ver un archivo que termina en XYZ.resources. Copie ese nombre de archivo y elimine los .resources finales y ese es el archivo que debe cargar.
Por ejemplo, en mi directorio obj / Bin tengo el archivo:
MyLocalisation.Properties.Resources.resources
Si los archivos de recursos están en la misma biblioteca / aplicación de clase, yo usaría el siguiente C #
ResourceManager RM = new ResourceManager("MyLocalisation.Properties.Resources", Assembly.GetExecutingAssembly());
Sin embargo, como suena como si estuviera usando el archivo de recursos de una biblioteca / aplicación de clase separada que probablemente desee
Assembly localisationAssembly = Assembly.Load("MyLocalisation");
ResourceManager RM = new ResourceManager("MyLocalisation.Properties.Resources", localisationAssembly);
Pasé por un problema similar. Si considera su "YeagerTechResources.Resources", significa que su Resources.resx está en la carpeta raíz de su proyecto.
Tenga cuidado de incluir la ruta completa, por ejemplo: "proyecto / subcarpeta (s) / archivo [.resx]" al constructor ResourceManager.
Según la documentación de MSDN here , el argumento de nombre base especifica " El nombre raíz del archivo de recursos sin su extensión, pero incluye cualquier nombre de espacio de nombres completamente calificado. Por ejemplo, el nombre raíz del archivo de recursos llamado" MyApplication.MyResource.en-US. recursos "es" MyApplication.MyResource ". "
El ResourceManager intentará automáticamente recuperar los valores de la cultura UI actual. Si desea utilizar un idioma específico, deberá configurar la cultura de la interfaz de usuario actual al idioma que desea usar.
en principio es la misma idea que @Landeeyos. De todos modos, ampliando esa respuesta: un poco tarde para la fiesta, pero aquí están mis dos centavos:
guión:
Tengo un caso único de agregar algunos (aproximadamente 28 archivos de texto) archivos de plantilla predefinidos con mi aplicación WPF. Entonces, la idea es que cada vez que se instale esta aplicación, esta plantilla y los archivos de texto estarán disponibles para su uso. De todos modos, lo que hice fue crear una biblioteca separada para guardar los archivos agregando un resource.resx. Luego agregué todos esos archivos a este archivo de recursos (si hace doble clic en un archivo .resx, su diseñador se abrirá en Visual Studio). Había establecido el modificador de acceso a público para todos. Además, cada archivo se marcó como un recurso incrustado a través de la Acción de compilación de cada archivo de texto (puede obtenerlo al observar sus propiedades). Llamemos a esto bibliothek1.dll. Hace referencia a esta biblioteca anterior (bibliothek1.dll) en otra biblioteca (llámela bibliothek2.dll) y luego consumí esta segunda biblioteca en la aplicación wff de mf.
diversión real
// embedded resource file name <i>with out extension</i>(this is vital!)
string fileWithoutExt = Path.GetFileNameWithoutExtension(fileName);
// is required in the next step
// without specifying the culture
string wildFile = IamAResourceFile.ResourceManager.GetString(fileWithoutExt);
Console.Write(wildFile);
// with culture
string culturedFile = IamAResourceFile.ResourceManager.GetString(fileWithoutExt, CultureInfo.InvariantCulture);
Console.Write(culturedFile);
muestra: pago ''testingresourcefilesusage'' @ https://github.com/Natsikap/samples.git
Espero que ayude a alguien, algún día, en algún lugar!
Esta respuesta SO podría ayudar en este caso.
Si el proyecto principal ya hace referencia al proyecto de recursos , entonces podría trabajar explícitamente con su clase de recursos generados en su código y acceder a su ResourceManager
desde ahí. 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);
// ...