ASP.NET 2.0 proporciona funciones de conversión de temas de múltiples idiomas y de múltiples estilos. Las dos formas de implementación son relativamente similares, por lo que se explicarán juntas.
1. Conmutador de idioma Cambio de varios idiomas En el Tutorial de inicio rápido, se presenta cómo almacenar y aplicar el idioma seleccionado por el usuario. Generalmente, se usa una DropDownList para mostrar los idiomas admitidos para que el usuario elija. Generalmente se coloca en la página maestra y el idioma seleccionado por el usuario se usa aquí. también se puede almacenar en una sesión de cookies o en una cadena de consulta. Anule el método InitializeCulture en la página para usar el idioma seleccionado previamente por el usuario. Debido a que la operación de configuración del idioma (aquí está el evento SelectedIndexChanged) ocurre después del tiempo de InitializeCulture, para que la página actual entre en vigencia inmediatamente después de que se complete la operación de configuración, se requiere una redirección para recargar esta página y activar el evento InitializeCulture. A continuación se muestra parte del código del inicio rápido, preste atención a la parte roja. Debido a que puede haber una cadena de consulta detrás de algunas direcciones de página, personalmente creo que es mejor reemplazar la parte del código rojo por Response.Redirect(Request.Url.PathAndQuery);.
void protegido DropDownLanguage_SelectedIndexChanged (remitente del objeto, EventArgs e)
{
cadena SelectedLanguage = DropDownLanguage.SelectedValue.ToString();
//Guardar el idioma de usuario seleccionado en el perfil
Profile.SetPropertyValue("PreferredCulture", SelectedLanguage);
//Forzar la reinicialización de la página para activar InitializeCulture()
Respuesta.Redirect(Solicitud.Url.LocalPath);
}
anulación protegida nula InitializeCulture()
{
// anula el método virtual InitializeCulture() para comprobar si el perfil contiene una configuración de idioma del usuario
string UserCulture = Profile.GetPropertyValue("PreferredCulture").ToString();
si (CulturaUsuario! = "")
{
// hay una configuración de idioma de usuario en el perfil: cámbiala
Thread.CurrentThread.CurrentUICulture = new CultureInfo(UserCulture);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(UserCulture);
}
}
Para reducir la duplicación de código, una clase de página base de cliente generalmente se personaliza, haciéndola heredar la clase Página y luego reiniciando el método InitializeCulture en la clase base de página personalizada. Finalmente, herede cada una de sus páginas de su clase base de página personalizada. De esta manera, no es necesario anular el método InitializeCulture en cada página.
Pero el método anterior todavía no es muy satisfactorio, porque cada vez que agrega una página, debe modificar el código postal para heredar la clase base de la página personalizada.
Notamos que en el método InitializeCulture, en realidad solo se modifican la Cultura y la UICulture del hilo actual. Entonces, ¿se pueden modificar estos dos atributos en un evento global, como un evento de Aplicación? Intenté esto hace mucho tiempo, implementando los detalles de InitializeCulture cuando se activa el evento BeginRequest de la Aplicación, similar al siguiente código:
void Application_BeginRequest (remitente del objeto, EventArgs e)
{
string lang = string.Empty;//predeterminado a la cultura invariante
lang = Perfil.CulturaPreferida;
si (cadena.IsNullOrEmpty(lang))
{
lang = cadena.Vacío;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
Tenga en cuenta que la parte roja debe reemplazarse por otros métodos, porque asp.net aún no ha creado el objeto de perfil durante la fase de activación de la solicitud de inicio. Se puede sustituir por cookies.
Recuerdo que después de hacer esto, no funcionó después de configurar el idioma. En ese momento, pensé que se manejaría en un evento global y podría sobrescribirse más tarde, por lo que podría no funcionar. Entonces el método InitializeCulture todavía se usaba en ese momento. Hoy vi a alguien en el foro de asp.net haciendo esto.
void Application_BeginRequest (remitente del objeto, EventArgs e) {
string lang = string.Empty;//predeterminado a la cultura invariante
Cookie HttpCookie = Request.Cookies["DropDownName"]
si (cookie! = nulo && cookie.Value! = nulo)
lang = Request.Form[cookie.Value];
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
Entonces pensé que algo podría no estar configurado correctamente en ese momento, así que lo intenté de nuevo. Resultó ser el motivo del comando de encabezado de página <%@ Page UICulture="auto" Culture="auto" %>. La cultura se establece en la página y anulará la configuración global. Después de eliminarlo, la configuración global entró en vigor. Parece que la configuración cultural en la página anulará la configuración global, y la configuración del método InitializeCulture en la página (para ser precisos, todos los controles que admiten este método) anulará la configuración de la página. De hecho, la implementación predeterminada del método InitializeCulture en la clase Página está vacía, por lo que después de eliminar la instrucción del encabezado de la página UICulture="auto" Culture="auto", la configuración en Global entrará en vigor.
Además, si realmente desea utilizar Profile (como yo) para almacenar las opciones del usuario, no puede manejarlo en la etapa de solicitud inicial. Yo lo manejo cuando se activa el evento PreRequestHandlerExecute:
void Application_PreRequestHandlerExecute (remitente del objeto, EventArgs e)
{
string lang = string.Empty;//predeterminado a la cultura invariante
lang = Perfil.CulturaPreferida;
si (cadena.IsNullOrEmpty(lang))
{
lang = cadena.Vacío;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
En este momento se ha creado el perfil, por lo que se puede utilizar.
2. Cambio de tema de varios estilos Conmutador de tema
Este artículo habla sobre el cambio de tema y creo que la forma es muy similar al cambio de idioma. Utiliza HttpModule. Creo que se puede colocar directamente debajo del procesamiento y distribución de eventos correspondiente en el archivo Global.asax. Utiliza cookies para el almacenamiento. Sigo pensando que es mejor usar Profile. Dado que se proporciona, debe usarse en caché, por lo que el rendimiento no debería ser un problema.
Fuente: BLOG de acumulación espesa y floreciente.