ASP.NET 2.0 fornece funções de conversão multilíngue e de tema multiestilo. As duas formas de implementação são relativamente semelhantes, portanto serão explicadas juntas.
1. Seletor de idioma Troca de vários idiomas No Tutorial de início rápido é apresentado como armazenar e aplicar o idioma selecionado pelo usuário. Geralmente, um DropDownList é usado para exibir os idiomas suportados para o usuário escolher. Geralmente é colocado na página mestre e o idioma selecionado pelo usuário é usado aqui. ele também pode ser armazenado em uma sessão de cookie ou string de consulta. Substitua o método InitializeCulture na página para usar o idioma previamente selecionado pelo usuário. Como a operação de configuração do idioma (aqui está o evento SelectedIndexChanged) ocorre após o tempo de InitializeCulture, para tornar a página atual efetiva imediatamente após a conclusão da operação de configuração, é necessário um redirecionamento para recarregar esta página e acionar o evento InitializeCulture. Abaixo está parte do código do início rápido, preste atenção na parte vermelha. Como pode haver uma string de consulta por trás de alguns endereços de página, pessoalmente acho que a parte vermelha do código é melhor substituída por Response.Redirect(Request.Url.PathAndQuery);.
protegido void DropDownLanguage_SelectedIndexChanged(objeto remetente, EventArgs e)
{
string SelectedLanguage = DropDownLanguage.SelectedValue.ToString();
//Salva o idioma do usuário selecionado no perfil
Profile.SetPropertyValue("PreferredCulture", SelectedLanguage);
//Força a reinicialização da página para disparar InitializeCulture();
Response.Redirect(Request.Url.LocalPath);
}
substituição protegida void InitializeCulture()
{
// sobrescreve o método virtual InitializeCulture() para verificar se o perfil contém uma configuração de idioma do usuário
string UserCulture = Profile.GetPropertyValue("PreferredCulture").ToString();
if (UserCultura! = "")
{
// há uma configuração de idioma do usuário no perfil: mude para ela
Thread.CurrentThread.CurrentUICulture = new CultureInfo(UserCulture);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(UserCulture);
}
}
Para reduzir a duplicação de código, uma classe de página base do cliente geralmente é customizada, fazendo com que ela herde a classe Page e, em seguida, reinicialize o método InitializeCulture na classe base da página customizada. Por fim, herde cada uma de suas páginas de sua classe base de página personalizada. Dessa forma, você não precisa substituir o método InitializeCulture em todas as páginas.
Mas o método acima ainda não é muito satisfatório, porque toda vez que você adiciona uma página, é necessário modificar o código postal para herdar a classe base da página personalizada.
Percebemos que no método InitializeCulture, apenas Culture e UICulture do thread atual são realmente modificados. Então esses dois atributos podem ser modificados em um evento global, como um evento de Aplicativo? Eu tentei isso há muito tempo, implementando os detalhes do InitializeCulture quando o evento BeginRequest do Application é acionado, semelhante ao código a seguir:
void Application_BeginRequest(objeto remetente, EventArgs e)
{
string lang = string.Empty; //padrão para a cultura invariável
lang = Profile.PreferredCulture;
if (string.IsNullOrEmpty(lang))
{
lang = string.Empty;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
Observe que a parte vermelha deve ser substituída por outros métodos, pois o objeto de perfil ainda não foi criado pelo asp.net durante a fase de acionamento do BeginRequest. Pode ser substituído por cookies.
Lembro que depois de fazer isso não funcionou depois de definir o idioma. Naquele momento, pensei que seria tratado em um evento global e poderia ser sobrescrito posteriormente, então pode não funcionar. Portanto, o método InitializeCulture ainda era usado naquela época. Hoje vi alguém no fórum asp.net fazendo isso.
void Application_BeginRequest(Remetente do objeto, EventArgs e){
string lang = string.Empty; //padrão para a cultura invariável
HttpCookie cookie = Request.Cookies["DropDownName"]
if (cookie != null && cookie.Value != null)
lang = Request.Form[cookie.Value];
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
Então pensei que algo poderia não estar configurado corretamente naquele momento, então tentei novamente. Acabou sendo o motivo do comando do cabeçalho da página <%@ Page UICulture="auto" Culture="auto" %>. A cultura é definida na página. Eles substituirão as configurações globais. Após removê-lo, as configurações globais entraram em vigor. Parece que as configurações de cultura na página substituirão as configurações globais e as configurações do método InitializeCulture na página (para ser mais preciso, todos os controles que suportam esse método) substituirão as configurações da página. Na verdade, a implementação padrão do método InitializeCulture na classe Page está vazia, portanto, após remover a instrução do cabeçalho da página UICulture="auto" Culture="auto", as configurações em Global entrarão em vigor.
Além disso, se você realmente deseja usar o Profile (como eu) para armazenar as escolhas do usuário, você não pode lidar com isso no estágio beginrequest. Eu cuido disso quando o evento PreRequestHandlerExecute é acionado:
void Application_PreRequestHandlerExecute(remetente do objeto, EventArgs e)
{
string lang = string.Empty; //padrão para a cultura invariável
lang = Profile.PreferredCulture;
if (string.IsNullOrEmpty(lang))
{
lang = string.Empty;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
Neste momento o Perfil foi criado, para que possa ser usado.
2. Troca de tema em vários estilos Alternador de tema
Este artigo fala sobre a troca de tema, e acho que o formulário é muito semelhante à troca de idioma. Ele usa HttpModule, acho que pode ser colocado diretamente no processamento e distribuição de eventos correspondente no arquivo Global.asax. Ele usa cookies para armazenamento. Ainda acho melhor usar o Profile. Como é fornecido, o Profile deve ser armazenado em cache, portanto, o desempenho não deve ser um problema.
Fonte: Acumulação espessa e BLOG florescente