La commutation de la langue sur ASP.NET application à l'aide de la page maître
Je suis à l'aide de Visual Studio 2008 et ASP.NET pour construire une application web. La plupart de mes pages web sont basés sur une seule page maître. Ce master page contient trois boutons liens qui agissent en tant que langue; commutateurs de la Click
gestionnaires d'événements ressembler à ceci:
protected void lbuLangEN_Click(object sender, EventArgs e)
{
this.SwitchLanguage(string.Empty);
}
protected void lbuLangES_Click(object sender, EventArgs e)
{
this.SwitchLanguage("es");
}
Ensuite, j'ai ma méthode privée SwitchLanguage
:
private void SwitchLanguage(string culture)
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(culture);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
}
Comme je le comprends, cela devrait être suffisant pour faire les pages basées sur ma page principale d'exposition localisée comportement, à savoir obtenir des ressources locales appropriées resx
fichier en fonction de la culture. Cependant, il n'est pas de travail. Ils apparaissent toujours en espagnol, ce qui est mon navigateur par défaut de la langue. J'ai quelques messages de trace à l'entrée et à la sortie de SwitchLanguage
, et apparemment, le thread courant est de ne pas changer sa culture info: chaque fois SwitchLanguage
est appelée, la culture du thread en cours est "es-ES", indépendamment de ce que mon code est juste ensemble.
Est-il un problème avec mon code ou avec l'approche que je prends? Merci.
Je vois. Donc j'aurais besoin de stocker les paramètres de langue et d'une certaine façon de la définir pour chaque demande, à droite? Est-il une technique couramment utilisée pour cela?
vous pourriez faire le tour par la définition d'un cookie, le transfert de la demande vers le même chemin que la requête a été, construire un httpmodule et de lire le cookie de là et mettre le uiculture sur le fil
OriginalL'auteur CesarGon | 2011-06-02
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
OnAcquireRequestState
dansGlobal.asax
à un changement de la culture. Il est appelé juste après la session est chargé, mais avant tout maître de la page de l'événement.Donc dans le gestionnaire d'événements de bouton vous permet de définir une variable de session pour le cours souhaité la culture. Puis vous redirige vers la page en cours. Le
Global.asax
événement peut alors chercher la nouvelle langue, juste avant la masterpage charges:Littéralement dans le fichier appelé
Global.asax
. Il devrait déjà être là, sinon vous pouvez le copier à partir d'un nouvellement créé ASP.NET application web.Il n'était pas là (je suis avec VS 2008), mais je l'ai ajouté, en plus d'une ligne dans Application_Start comme ceci:
this.AcquireRequestState += Application_OnAcquireRequestState;
Sonne bien?BTW, j'obtiens une exception parce que, apparemment, l'état de session n'est pas disponible à l'intérieur de
OnAcquireRequestState
, au moins sur l'un des premiers appels lorsque l'application est en cours de démarrage. Des idées comment aller autour de cela?La droite, qui semble familier, il y a toujours des demandes pour lesquelles il n'y a pas de session. Pour éviter de l'exception, l'utilisation
HttpContext.Current.Session
au lieu deRequest.Session
(édité en réponse)OriginalL'auteur Andomar
Pour tout le corps à l'aide de @Andomar solution, la méthode doit être nommé Application_AcquireRequestState positionné Mondiale.ascx code (par exemple, en dessous de la Application_Start), et non des gestionnaires d'événements sont nécessaire pour être fixé. (Si vous n'avez rien d'autre que ce que vous pouvez rencontrer NullReferenceException même avec pas de code dans le corps de la méthode! ou que votre méthode ne fonctionnera pas du tout)
Donc le code sera quelque chose comme ceci:
OriginalL'auteur Mostafa Aghajani
remplacer la InitializeCulture méthode sur la page pour définir la UICulture
MasterPage
ne dispose pas d'unInitializeCulture
méthode.c'est pourquoi je l'ai dit, le faire au niveau de la page, tant pis juste de me donner un -1, jésus 🙂 🙂
Eh bien, je ne voudrais pas avoir le même code répété dans chaque page. Je suis sûr qu'il ya une solution qui évite que.
pense un peu plus difficile sur la façon dont vous pouvez éviter cela et que vous avez votre solution 🙂 btw attention à la définition de la CurrentCulture aussi, si vous avez seulement besoin de traductions!
Je suis avec Tim; héritez de votre propre "Page" au lieu de Système.Web.Page.
OriginalL'auteur Tim Mahy