Установить культуру с помощью куки в asp.net, не обновляется - PullRequest
0 голосов
/ 20 декабря 2010

Я использую asp.net и хочу, чтобы пользователь мог сам настроить язык для использования на веб-сайте.В MasterPage у меня есть следующий код для установки языкового cookie:

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

В Global.asax я использую cookie следующим образом:

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

Проблема заключается в том, что после установкиcookie с Response.SetCookie Мне нужно перезагрузить страницу, чтобы получить новый язык.Как я могу сделать свой код таким образом, чтобы при установке пользователем нового языка страница перезагружалась с новым языком напрямую?

Ответы [ 3 ]

1 голос
/ 20 декабря 2010

У меня была та же проблема с языком, выбранным пользователем.Чтобы это работало, вы должны сделать это на

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.

Таким образом, я использовал элемент управления Server (Postback), чтобы установить язык, и страница перезагрузилась,и язык будет установлен.

1 голос
/ 20 декабря 2010

Вы можете сделать

Response.Redirect(Request.PathAndQuery);

Но почему бы просто не установить язык после установки Cookie?Вы даже можете использовать событие BeginRequest для проверки публикуемого конкретного ввода и использовать его в качестве альтернативного условия для установки языка.

0 голосов
/ 04 февраля 2015

Если вы используете 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!

        }
    }
}
...