2010-12-20 4 views
0

Ich benutze asp.net und möchte es dem Benutzer ermöglichen, die Kultur auf der Website selbst einzustellen. In Master habe ich den folgenden Code eine Sprache Cookie zu setzen:Set Kultur mit Cookie in asp.net, nicht aktualisiert

protected void Page_Load(object sender, EventArgs e) { 

    if (Request.QueryString["setLanguage"] != null) 
    { 
     HttpCookie languageCookie = new HttpCookie("language"); 
     languageCookie.Value = Request.QueryString["setLanguage"]; 
     languageCookie.Expires = DateTime.Now.AddDays(10); 
     Response.SetCookie(languageCookie); 
    } 
} 

in Global.asax verwende ich das Cookie wie folgt aus:

protected void Application_BeginRequest(object sender, EventArgs e) { 
    HttpCookie languageCookie = System.Web.HttpContext.Current.Request.Cookies["language"]; 
    if (languageCookie.Value != null) 
    { 
     System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(language); 
     System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language); 
    } 
} 

Das Problem ist, dass, nachdem ich das Cookie mit WarteSet. SetCookie Ich muss die Seite neu laden, um die neue Sprache zu bekommen. Wie kann ich meinen Code erstellen? Wenn der Benutzer eine neue Sprache einstellt, wird die Seite direkt mit der neuen Sprache neu geladen?

Antwort

1

Sie können

Response.Redirect(Request.PathAndQuery); 

tun Aber warum setzen nicht nur die Sprache nach der Cookie-Einstellung? Sie können sogar das BeginRequest-Ereignis verwenden, um nach bestimmten eingegebenen Einträgen zu suchen und diese als alternative Bedingung für das Einstellen der Sprache zu verwenden.

+0

Dank! Ich habe es zu Application_BeginRequest verschoben, dachte nicht an diese einfache Lösung. – Martin

1

Ich hatte das gleiche Problem mit der Sprache, die vom Benutzer ausgewählt wurde. Damit es Sie es

protected override void InitializeCulture() 
{ 
    HttpCookie languageCookie = System.Web.HttpContext.Current.Request.Cookies["language"]; 

    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(language); 
    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language); 

} 

Um auf tun müssen, um zu arbeiten, um es auf jeder Seite der Website zu arbeiten, habe ich eine Klasse, die von System.Web.UI.Page geerbt und umgesetzt dort

public class myBasePage : System.Web.UI.Page 
{ 
    protected override void InitializeCulture() 
    { 
    HttpCookie languageCookie = System.Web.HttpContext.Current.Request.Cookies["language"]; 

    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(language); 
    System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language); 

    base.InitializeCulture(); 
    } 
} 

von da an hatte ich alle meine Seiten von myBasePage erben.

Auf diese Weise habe ich ein Server (Postback) -Steuerelement verwendet, um die Sprache festzulegen, und die Seite würde neu geladen und die Sprache würde festgelegt.

0

Wenn Sie mit Asp.Net MVC

//A foreigner, has possibly brew a cookie for me 
public class SpeakNativeTongueAttribute : ActionFilterAttribute, IActionFilter 
{ 
    const string cookieName = "culture"; 

    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var cookieKeys = filterContext.RequestContext.HttpContext.Request.Cookies.AllKeys; 

     if (cookieKeys.Contains(cookieName)) 
     { 
      //eat the cookie 
      var theCultureCookie = filterContext.RequestContext.HttpContext.Request.Cookies[cookieName]; 
      var theCulture = theCultureCookie.Value; 

      //say thanks in native tongue 
      System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo(theCulture); 
      System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo(theCulture); 
     } 
     else 
     { 
      //Didn't receive a cookie, don't speak their language, those bastards! 

     } 
    } 
}