Pregunta

¿Es posible poner los archivos de recursos (.resx) dentro de subcarpetas dentro 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, son todos los archivos .resx colocados directamente en el interior App_GlobalResources?

Si es posible utilizar subcarpetas, ¿cómo acceder a los recursos mediante programación dentro de subcarpetas?

¿Fue útil?

Solución

Técnicamente, sí es posible, pero hay algunas trampas. En primer lugar, permítanme mostrarles un ejemplo. Supongamos que mi App_GlobalResources carpeta miradas de esta manera:

/App_GlobalResources
    /Test
        TestSubresource.resx
    TestResource.resx

Cada archivo de recursos tiene una sola entrada llamada "TestString". Añadí cada archivo de recursos utilizando el menú de Visual Studio por lo que creó una clase para mí. Por defecto, todas las clases añadidas a la carpeta App_GlobalResources tendrán el mismo espacio de nombres de Resource. Así, si quiero usar el generador de clases y quiero Test en el espacio de nombres, necesito entrar en el archivo TestSubresource.Designer.cs y cambiar manualmente el espacio de nombres. Una vez que hago esto, puedo hacer lo siguiente:

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

También puede hacer referencia a ellos usando GetGlobalResourceObject:

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

Tenga en cuenta que todavía utilizan el "TestSubresource" como el medio para hacer referencia a los recursos en ese archivo a pesar de que 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 ejecución. Si añado un recurso denominado "TestResource.resx" a / de prueba, arrojará el siguiente error en tiempo de ejecución:

  

El archivo de recursos '/App_GlobalResources/TestResource.resx' no puede ser   utilizado, 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.

Así que, en conclusión, sí es posible, pero que aumentan las probabilidades de conseguir un error de ejecución debido a dos archivos de recursos con nombres idénticos en diferentes partes de la estructura de carpetas App_GlobalResources que está permitido por el sistema de archivos, pero no por .NET .

Otros consejos

Es posible. Al menos, he conseguido hacerlo.

Dentro de un sitio web que añadió la carpeta App_GlobalResources. En su interior se creé otra carpeta "MiCarpeta" y se coloca en el interior de archivos MyResource.resx. resx contenía un par MyKey1 -. MyValue1

Utilizando el método GetResource de la siguiente clase I extraído correctamente "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 funciona en Medio confianza también.

Parece que las carpetas no hacen ninguna diferencia cuando se accede a los recursos de código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top