2013-02-27 6 views
10

私はMVCの文化の変化に関係する好奇心があります。私は2つの方法で試しましたが、明らかにどこかで間違っていました。リンクに基づいて文化を変えるMVC4

私が持っている私のWeb.configファイルで

<globalization uiCulture="auto" culture="auto" /> 

これは私がスレッドの文化を変更しようとした方法である:

<li>@Html.ActionLink("Eng", "ChangeCulture", "Home", new { lang="en-US"}, new { @class = "languageSelectorEnglish" })</li> 

まず方法

私は、次のコントローラを持っています:

public void ChangeCulture(string lang) 
    { 
     Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(lang); 
     Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang); 

     Response.Cookies.Remove("Language"); 
     var langCookie = new HttpCookie("Language"); 
     langCookie["Language"] = lang; 
     langCookie.Value = lang; 
     langCookie.Expires = System.DateTime.Now.AddDays(21); 
     Response.Cookies.Add(langCookie); 

     Response.Redirect(Request.UrlReferrer.ToString()); 
    } 
私は間違っ

第二の方法

public ActionResult ChangeCulture(string lang) 
    { 
     Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(lang); 
     Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang); 

     // Split the url to url + query string 
     var fullUrl= Request.UrlReferrer.ToString(); 
     var questionMarkIndex = fullUrl.IndexOf('?'); 
     string queryString = null; 
     string url = fullUrl; 
     if (questionMarkIndex != -1) // There is a QueryString 
     { 
      url = fullUrl.Substring(0, questionMarkIndex); 
      queryString = fullUrl.Substring(questionMarkIndex + 1); 
     } 

     // Arranges 
     var request = new HttpRequest(null, url, queryString); 
     var response = new HttpResponse(new StringWriter()); 
     var httpContext = new HttpContext(request, response); 

     var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext)); 

     // Extract the data  
     var values = routeData.Values; 
     var controllerName = values["controller"]; 
     var actionName = values["action"]; 
     var areaName = values["area"]; 

     return RedirectToAction(actionName.ToString()); 
    } 

?ありがとうございました。

+0

あなたが直面している問題は何ですか? – ssilas777

+0

スレッドの現在の文化を変更しても文化は変わりたくありませんでした。私はクッキーを設定せずにそれを行う方法を見つけるので、私はすぐに私の答えを投稿します。 – Kosmog

答えて

6

cultureresource stringsに変更し、threadを無効にする必要があるようです。だから私の最終的な方法は次のとおりです。

public void ChangeCulture(string lang) 
    { 
     Resources.Resources.Culture = new CultureInfo(lang); 

     Response.Redirect(Request.UrlReferrer.ToString()); 
    } 

希望します。

UPDATE:アプリケーションが複数のユーザーによって使用されている場合、それは関係なく、彼らが使用しているブラウザは、すべてのユーザーに対して同じ文化を設定していないので、

上記のコードは、良いではありません。この後

public void ChangeCulture(string lang) 
    { 
     Response.Cookies.Remove("Language"); 

     HttpCookie languageCookie = System.Web.HttpContext.Current.Request.Cookies["Language"]; 

     if (languageCookie == null) languageCookie = new HttpCookie("Language"); 

     languageCookie.Value = lang; 

     languageCookie.Expires = DateTime.Now.AddDays(10); 

     Response.SetCookie(languageCookie); 

     Response.Redirect(Request.UrlReferrer.ToString()); 
    } 

(トリッキーな方法)あなたは1 BaseControllerから継承するすべてのコントローラを行う必要があります。

それを行うための良い方法は、お使いのブラウザでcookieを設定する方法を作ることです。 Initializeを上書きする必要があるため、扱いにくいです。

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 


     HttpCookie languageCookie = System.Web.HttpContext.Current.Request.Cookies["Language"]; 
     if (languageCookie != null) 
     { 
      Thread.CurrentThread.CurrentCulture = new CultureInfo(languageCookie.Value); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(languageCookie.Value); 
     } 
     else 
     { 
     //other code here 
     } 


     base.Initialize(requestContext); 
    } 
3

はあなたのweb.configファイル内の行を削除します。autoにこれらを設定する

<globalization uiCulture="auto" culture="auto" /> 

はブラウザに設定され、ユーザーの言語に言語をデフォルトとします。これはあなたのスレッドの設定をオーバーライドしています。

+0

こんにちは。それは動作しませんでしたが、私はそれを行う方法を見つけました。できるだけ早く回答を投稿します。どうもありがとうございました 。 – Kosmog

関連する問題