2016-11-17 20 views
2

私はasp.net mvcのウェブサイトのUI言語を変更するオプションをユーザーに提供しようとしています。私は私のweb.configファイルを編集して、コメントを追加しているため、英語とオランダ語asp.net mvcのウェブサイトで複数の言語を使用する

::私は、ユーザーすなわちに2言語を提供することを計画しています

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

今私は2つのファイルResources.resx(デフォルトのファイル)を追加し、 Resources.nl-NL.resx(オランダのリソースファイル)。

私は参考文献ファイルを<title>@WebApplication9.App_GlobalResources.Resources.RequestTitle</title>としています。言語を変更すると

、私はこのような文化を変えています:

Thread.CurrentThread.CurrentCulture = new CultureInfo("nl-NL"); 
Thread.CurrentThread.CurrentUICulture = new CultureInfo("nl-NL"); 

しかし、たとえオランダ語、上記の指定されたものに文化値を変更する言語の変更後、Resources.resxから英語の値がありますResources.nl-NL.resxから値を取得する代わりに、常に表示します。

私がここで紛失しているものを見つけるのを手伝ってもらえますか?

+0

だけ勘... Resources.nl.resx 'へのリソースファイルの名前を変更してみてください' –

+0

@GeorgPatscheider:私は最初にそれを試しましたが、うまくいきませんでした。 – ViVi

+0

初期レベルのトラブルシューティングでは、ブラウザで言語を変更したときにUI言語が変更されていることが証明されました。だから問題は明らかに 'Thread.CurrentThread.CurrentCulture = new CultureInfo(" nl-NL ");'および/または 'Thread.CurrentThread.CurrentUICulture = new CultureInfo(" nl-NL ");'と私は思っています – ViVi

答えて

0

私は、コントローラのアクションメソッドが呼び出されている間、現在のたびに、文化を設定することで、問題を解決してきました。 問題は、カルチャを変更すると、現在のスレッドのみに設定されているために発生します。ユーザーが別のビューを要求すると、スレッドが異なる可能性があります。ですから、新しいリクエスト/新しいスレッドごとにCultureを設定する必要があります。

私はユーザーに英語(en-US)とオランダ語(nl-NL)の2つの言語しか持たないようにします。だから私は英語のためにResources.resxとオランダ語のためのResources.nl.resxという名前の2つのresxファイルを作った。ユーザーが現在の言語を変更すると、セッションに言語を保存し、さらにログインする際にその言語を記憶するためにデータベースに保存します。

if(selectedLang == Dutch) 
{ 
    Session["Language"] = "nl-NL"; 
} 
else 
{ 
    Session["Language"] = "en-US"; 
} 

Session["Language"]は、ユーザーの優先言語を保持しています。今、各コントローラのアクションメソッドで:

[HttpGet] 
public ActionResult ActionMethodName(DataClass dataObj) 
{ 
    Sessions.ChangeLanguage(Session["Language"].ToString()); 
} 

Sessions.ChangeLanguage(string language)次のようにクラスSessionsで静的メソッドである:

public static void ChangeLanguage(string lang) 
{ 
    Thread.CurrentThread.CurrentCulture = new CultureInfo(lang); 
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang); 
} 
0

これは役に立ちます。

あなたのPOSTメソッド:

public ActionResult SetCultureToNL() 
    { 
     SetCulture("nl-BE"); 

     return View("index"); 
    } 

private void SetCulture(String culture) 
    { 
     Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(culture); 
     Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 

     if (httpContext.Request.Cookies["_Culture"] != null) 
     { 
      HttpCookie cultureCookie = new HttpCookie("_Culture", culture); 

      httpContext.Response.SetCookie(cultureCookie); 
     } 
     else 
     { 
      HttpCookie cookie = new HttpCookie("_Culture"); 
      cookie.Value = culture; 

      httpContext.Response.Cookies.Add(cookie); 
     } 
    } 

そして、GETメソッド:

public ActionResult Index() 
    { 
     string cultureName = GetCultureCookieValue(this.ControllerContext.HttpContext.ApplicationInstance.Context); 

      // Modify current thread's cultures    
      Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName); 
      Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 
     // ... 
    } 

public static String GetCultureCookieValue(HttpContext httpContext) 
    { 
     HttpCookie cultureCookie = httpContext.Request.Cookies["_Culture"]; 

     if (cultureCookie != null) 
     { 
      return CultureHelper.GetImplementedCulture(cultureCookie.Value); 
     } 
     else 
     { 
      return CultureHelper.GetImplementedCulture(httpContext.Request.UserLanguages[0]); // obtain it from HTTP header AcceptLanguages 
     } 
    } 
+0

いつですか?私たちは 'POST'と呼ぶはずですか? – ViVi

+0

文化を設定するとき – Yan

関連する問題