2012-05-09 14 views
0

言語選択機能を備えたMVC3(かみそり)アプリケーションを開発しようとしています。 _Layout.cshtml 上のパーシャルビューとして次のビューを使用してMVC3(Razor) - プログラムでUIカルチャ言語を変更しない

_SelectCulture

<text> 
    @Html.ActionLink("English", "SetCulture", new { controller = "Culture", culture = "en-GB" }) 
    | 
    @Html.ActionLink("Welsh", "SetCulture", new { controller = "Culture", culture = "cy-GB" }) 
</text> 
<div> 
    @System.Threading.Thread.CurrentThread.CurrentUICulture.ToString() 
</div> 

CultureController

public ActionResult SetCulture(string culture) 
     { 
     System.Globalization.CultureInfo ci = new  System.Globalization.CultureInfo(culture); 

      System.Threading.Thread.CurrentThread.CurrentCulture = ci; 
      System.Threading.Thread.CurrentThread.CurrentUICulture = ci; 

      return RedirectToAction("Index", "Home"); 
     } 

しかし、そのはまだ言語を変更しません。

助けてください。

ありがとうございました

答えて

8

さて、あなたは現在のスレッドの言語を変更しています。現在のスレッドは、現在の要求で終了します。これは、コントローラのアクションが実行されてから少し遅れています。次に、他のコントローラのアクションにリダイレクトします。その後、ASP.NETは明らかにカルチャーセットを持たないこの要求を提供する新しいスレッドを生成します。

だから、この変更をどこかに残す必要があります。

  1. ルート変数
  2. クッキー
  3. セッション

私は好みの順でそれらを入れています:基本的には3つの異なったアプローチがあります。最初のアプローチは、すべてのルートに{culture}トークンを統合することです。 IMHOこれはSEOの面でも最良のアプローチです。したがって、フランス語でサイトを取得する場合は、たとえば/fr/home/indexにリダイレクトします。次に、各アクションの前に実行されるカスタムアクションフィルター属性を使用して、カルチャールートパラメーターを検査し、現在のスレッドカルチャ(現在のアクションの今回)を設定することができます。

また、Cookieとセッションでは、リクエスト間に現在の言語を維持する必要があります。最初の例ではこれはクライアントで行われ、2番目の例ではサーバーで行われます。再度、カスタムアクションフィルターを使用して、各アクションの前に言語の値を読み取り、現在のスレッドカルチャを反映させることができます。

Sessionを使用して現在の言語を保持するfollowing guideをご覧ください。

+0

ありがとう@Darin Dimitrov – Scorpion

+0

同じガイドの著者はルートアプローチについてのガイドを公開http://adamyan.blogspot.com/2010/07/addition-to-aspnet-mvc-localization.html –

関連する問題