Compartir a través de


ResourceManager y ASP.NET

También se puede tener acceso a ResourceManager desde aplicaciones Web con ASP.NET. Puede encontrar el código de esta pequeña aplicación en el subdirectorio WorldDocs mientras que las rutinas importantes se encuentran en dos archivos: Global.asax y Default.aspx.

La primera solicitud de usuario a la aplicación WorldDocs carga el archivo Global.asax y ejecuta la subrutina Application_Onstart de la aplicación. De nuevo, esta subrutina utiliza el método estático CreateFileBasedResourceManager para crear un administrador de recursos que cargue los recursos de texto de los archivos en lugar de hacerlo desde ensamblados. (Los programas de ejemplo anteriores también demostraban este hecho.) A continuación se asigna ResourceManager a la variable RM de Application. Cada solicitud del usuario también ejecuta la subrutina Application_BeginRequest, cuyo resultado es la asignación de la referencia cultural del usuario (como se especifica en la propiedad Request.UserLanguages) al subproceso que se está ejecutando actualmente en el servidor Web, como se muestra en el código siguiente.

Lista 5. Recursos con nombre con ResourceManager (Global.asax)

void Application_OnStart() {
    Application["RM"] = 
        ResourceManager.CreateFileBasedResourceManager 
       ("mytext", Server.MapPath("resources") 
       + Path.DirectorySeparatorChar, null);
}

void Application_BeginRequest(Object sender, EventArgs args) {
    // For each request initialize the culture values with
    // the user language as specified by the browser.

    try {
        Thread.CurrentThread.CurrentCulture = new 
            CultureInfo(Request.UserLanguages[0]);
    }
    catch(Exception) {
        // provide fallback for not supported languages.
        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    }

    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}

La asignación dinámica de recursos se controla a medida que se carga la página, en este caso en las subrutinas Page_Init y Page_Load de Default.aspx. Page_Init crea un objeto ResourceManager en el ámbito de la página y le asigna la variable RM de la aplicación Application. La subrutina Page_Load cambia dinámicamente la referencia cultural, al devolver de forma automática los datos al servidor cada vez que el usuario cambia la selección de idioma, como se muestra en el código siguiente.

Lista 6. Recursos con nombre con ResourceManager (Default.aspx)

void Page_Init(Object sender, EventArgs args) {
    // Get the ResourceManager from the Application object.
    rm = (ResourceManager) Application["RM"];
    ...
}

void Page_Load(Object sender, EventArgs args) {
    String SelectedCulture = MyUICulture.SelectedItem.Text;
    if(! SelectedCulture.StartsWith("Choose")) {
        // If another culture was selected, use that instead.
        Thread.CurrentThread.CurrentCulture = new  
            CultureInfo(SelectedCulture);
        Thread.CurrentThread.CurrentUICulture = new  
            CultureInfo(SelectedCulture);
    }
}

La parte final de código que se examina es la que devuelve realmente los recursos de imagen y de cadena.

    <img src="Flags/<%=CultureInfo.CurrentCulture%>.jpg">
    <%=rm.GetString("greeting")%>

El recurso de imagen se determina dinámicamente al generar una especificación de archivo basada en el código de la referencia cultural del usuario y el recurso de cadena utiliza ResourceManager para cargar un recurso de cadena del archivo .resources apropiado.