2010-12-20 12 views
0

私はasp.netを使用しており、ユーザー自身がウェブサイトで使用するようにカルチャーを設定できるようにしたいと考えています。マスターページでは、私は言語のクッキーを設定するには、次のコードを持っている:私はこのようなクッキーを使用するのGlobal.asaxでasp.netでクッキーを使用してカルチャーを設定しました。更新されていません。

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); 
    } 
} 

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); 
    } 
} 

問題は後に、私は応答でクッキーを設定することです。 SetCookie新しい言語を取得するには、ページをリロードする必要があります。ユーザーが新しい言語を設定したときに、新しい言語でページが直接読み込まれるようにするにはどうすればよいですか?

答えて

1

あなたは

Response.Redirect(Request.PathAndQuery); 

を行うしかし、なぜちょうどクッキーを設定した後、言語を設定することはできませんか? BeginRequestイベントを使用して、特定の入力がポストされているかどうかをチェックし、言語を設定するための代替条件として使用することさえできます。

+0

感謝をAsp.Net MVCを使用している場合は!私はApplication_BeginRequestに移動しましたが、簡単な解決策は考えていませんでした。 – Martin

1

ユーザーが選択した言語で同じ問題が発生しました。それを動作させるためには、あなたはそれがサイトのすべてのページ上で動作するためには

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); 

} 

にそれをしなければならない、私はSystem.Web.UI.Pageから継承したクラスを作成し、そこに

を実装しました
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(); 
    } 
} 

ここから私はmyBasePageからすべてのページを継承しました。

この方法では、サーバー(ポストバック)コントロールを使用して言語を設定し、ページがリロードされ、言語が設定されます。

0

するとは

//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! 

     } 
    } 
} 
関連する問題