ASP.NET 2.0 fournit des fonctions de conversion multilingue et de conversion de thème multistyle. Les deux formes d'implémentation sont relativement similaires, elles seront donc expliquées ensemble.
1. Sélecteur de langue Commutation multilingue Dans le didacticiel de démarrage rapide, il est présenté comment stocker et appliquer la langue sélectionnée par l'utilisateur. Généralement, une DropDownList est utilisée pour afficher les langues prises en charge que l'utilisateur peut choisir. Elle est généralement placée dans la page maître et la langue sélectionnée par l'utilisateur est stockée ici. il peut également être stocké dans une session de cookie ou une chaîne de requête. Remplacez la méthode InitializeCulture dans la page pour utiliser la langue précédemment sélectionnée par l'utilisateur. Étant donné que l'opération de définition de la langue (ici l'événement SelectedIndexChanged) se produit après l'heure InitializeCulture, afin de rendre la page actuelle effective immédiatement après la fin de l'opération de définition, une redirection est nécessaire pour recharger cette page et déclencher l'événement InitializeCulture. Ci-dessous se trouve une partie du code en démarrage rapide, faites attention à la partie rouge. Parce qu'il peut y avoir une chaîne de requête derrière certaines adresses de page, je pense personnellement qu'il est préférable de remplacer la partie code rouge par Response.Redirect(Request.Url.PathAndQuery);.
void protégé DropDownLanguage_SelectedIndexChanged (expéditeur d'objet, EventArgs e)
{
chaîne SelectedLanguage = DropDownLanguage.SelectedValue.ToString();
//Enregistrer la langue utilisateur sélectionnée dans le profil
Profile.SetPropertyValue("PreferredCulture", SelectedLanguage);
//Forcer la réinitialisation de la page pour déclencher InitializeCulture()
Réponse.Redirect(Request.Url.LocalPath);
}
remplacement protégé void InitializeCulture()
{
// remplace la méthode virtuelle InitializeCulture() pour vérifier si le profil contient un paramètre de langue utilisateur
chaîne UserCulture = Profile.GetPropertyValue("PreferredCulture").ToString();
si (UserCulture ! = "")
{
// il y a un paramètre de langue utilisateur dans le profil : basculez vers celui-ci
Thread.CurrentThread.CurrentUICulture = new CultureInfo(UserCulture);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(UserCulture);
}
}
Afin de réduire la duplication de code, une classe de page de base client est généralement personnalisée, lui faisant hériter de la classe Page, puis réinitialisant la méthode InitializeCulture dans la classe de base de page personnalisée. Enfin, héritez de chacune de vos pages de votre classe de base de page personnalisée. De cette façon, vous n'avez pas besoin de remplacer la méthode InitializeCulture sur chaque page.
Mais la méthode ci-dessus n'est toujours pas très satisfaisante, car à chaque fois que vous ajoutez une page, vous devez modifier le code postal pour hériter de la classe de base de la page personnalisée.
Nous avons remarqué que dans la méthode InitializeCulture, seules la Culture et l'UICulture du thread courant sont réellement modifiées. Alors ces deux attributs peuvent-ils être modifiés lors d'un événement global, comme un événement d'Application ? J'ai essayé cela il y a longtemps, en implémentant les détails d'InitializeCulture lorsque l'événement BeginRequest de Application est déclenché, similaire au code suivant :
void Application_BeginRequest (expéditeur d'objet, EventArgs e)
{
string lang = string.Empty;//par défaut à la culture invariante
lang = Profil.PreferredCulture ;
si (string.IsNullOrEmpty(lang))
{
lang = string.Empty;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
Notez que la partie rouge doit être remplacée par d'autres méthodes, car l'objet profil n'a pas encore été créé par asp.net lors de la phase de déclenchement de BeginRequest. Peut être remplacé par des cookies.
Je me souviens qu'après avoir fait cela, cela n'a pas fonctionné après avoir défini la langue, à ce moment-là, je pensais que cela serait géré dans un événement global et pourrait être écrasé plus tard, donc cela pourrait ne pas fonctionner. La méthode InitializeCulture était donc encore utilisée à cette époque. Aujourd'hui, j'ai vu quelqu'un sur le forum asp.net faire cela.
void Application_BeginRequest (expéditeur d'objet, EventArgs e){
string lang = string.Empty;//par défaut à la culture invariante
Cookie HttpCookie = 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);
}
J'ai donc pensé que quelque chose n'était peut-être pas défini correctement à ce moment-là, alors j'ai réessayé. Cela s'est avéré être la raison de la commande d'en-tête de page <%@ Page UICulture="auto" Culture="auto" %> If UICulture et. La culture est définie dans la page, elle remplacera les paramètres globaux. Après l'avoir supprimé, les paramètres globaux ont pris effet. Il semble que les paramètres de culture de la page remplaceront les paramètres globaux et que les paramètres de la méthode InitializeCulture dans la page (pour être précis, tous les contrôles prenant en charge cette méthode) remplaceront les paramètres de la page. En fait, l'implémentation par défaut de la méthode InitializeCulture dans la classe Page est vide, donc après avoir supprimé l'instruction d'en-tête de page UICulture="auto" Culture="auto", les paramètres dans Global prendront effet.
De plus, si vous souhaitez vraiment utiliser Profile (comme moi) pour stocker les choix de l'utilisateur, vous ne pouvez pas le gérer lors de l'étape beginrequest. Je le gère lorsque l'événement PreRequestHandlerExecute est déclenché :
void Application_PreRequestHandlerExecute (expéditeur d'objet, EventArgs e)
{
string lang = string.Empty;//par défaut à la culture invariante
lang = Profil.PreferredCulture ;
si (string.IsNullOrEmpty(lang))
{
lang = string.Empty;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
À l'heure actuelle, le profil a été créé et peut donc être utilisé.
2. Changement de thème multi-style Sélecteur de thème
Cet article parle du changement de thème et je pense que le formulaire est très similaire au changement de langue. Il utilise HttpModule. Je pense qu'il peut être placé directement sous le traitement et la distribution des événements correspondants dans le fichier Global.asax. Au final, c'est pareil. Il utilise des cookies pour le stockage. Je pense toujours qu'il est préférable d'utiliser le profil. Puisqu'il est fourni, le profil doit être mis en cache, les performances ne devraient donc pas poser de problème.
Source : Accumulation épaisse et BLOG florissant