netcore net istringlocalizer asp and asp.net localization resources internationalization globalization

istringlocalizer - Subcarpetas en App_GlobalResources(ASP.NET)



netcore set culture (2)

¿Es posible poner archivos de recursos (.resx) dentro de subcarpetas dentro de App_GlobalResources?

Por ejemplo:

/App_GlobalResources/someresources/myfile.resx

/App_GlobalResources/someresources/myfile.fr-fr.resx

/App_GlobalResources/othereresources/otherfile.resx

/App_GlobalResources/othereresources/otherfile.fr-fr.resx

O bien, ¿todos los archivos .resx se colocan directamente dentro de App_GlobalResources?

Si es posible usar subcarpetas, ¿cómo accedes a los recursos de forma programática dentro de las subcarpetas?


Es posible. Al menos, logré hacerlo.

Dentro de un sitio web, agregué la carpeta App_GlobalResources. En su interior, creé otra carpeta, "MyFolder", y coloqué el archivo MyResource.resx dentro. El archivo Resx contenía un par de MyKey1 - MyValue1.

Usando el método GetResource de la siguiente clase, extraje con éxito "MyValue1" para name = "MyKey1"

static class Class1 { static Assembly FindGlobalResAssembly() { foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) { if(asm.FullName.StartsWith("App_GlobalResources.")) return asm; } return null; } public static object GetResource(string name) { Assembly asm = FindGlobalResAssembly(); if(asm == null) return null; return new ResourceManager("Resources.MyResource", asm).GetObject(name); } }

Este enfoque también funciona en Medium trust.

Parece que las carpetas no hacen ninguna diferencia al acceder a los recursos del código.


Técnicamente, sí, es posible, pero hay algunas trampas. Primero, déjame mostrarte un ejemplo. Supongamos que mi carpeta App_GlobalResources tiene el App_GlobalResources aspecto:

/App_GlobalResources /Test TestSubresource.resx TestResource.resx

Cada archivo de recursos tiene una sola entrada llamada "TestString". Agregué cada archivo de recursos usando el menú de Visual Studio, así que creó una clase para mí. De manera predeterminada, todas las clases agregadas a la carpeta App_GlobalResources tendrán el mismo espacio de nombre de Resource . Entonces, si quiero usar el generador de clases y quiero Test en el espacio de nombres, necesito ingresar al archivo TestSubresource.Designer.cs y cambiar manualmente el espacio de nombres. Una vez que hago eso, puedo hacer lo siguiente:

var rootResource = Resources.TestResource.TestString; var subResource = Resources.Test.TestSubResource.TestString;

También puedo hacer referencia a ellos usando GetGlobalResourceObject :

var rootResource = GetGlobalResourceObject( "TestResource", "TestString" ); var subResource1 = GetGlobalResourceObject( "TestSubresource", "TestString" );

Tenga en cuenta que todavía utilizo el "TestSubresource" como medio para hacer referencia a los recursos en ese archivo aunque esté en una subcarpeta. Ahora, una de las capturas es que todos los archivos deben ser únicos en todas las carpetas en App_GlobalResources o su proyecto arrojará un error de tiempo de ejecución. Si agrego un recurso llamado "TestResource.resx" a / Test, arrojará el siguiente error de tiempo de ejecución:

El archivo de recursos ''/App_GlobalResources/TestResource.resx'' no se puede usar, ya que entra en conflicto con otro archivo con el mismo nombre).

Esto es cierto incluso si cambio el espacio de nombres en el nuevo recurso.

Entonces, en conclusión, sí es posible, pero aumenta las probabilidades de obtener un error de tiempo de ejecución debido a dos archivos de recursos con nombres idénticos en diferentes partes de la estructura de la carpeta App_GlobalResources permitidos por el sistema de archivos pero no por .NET.