2016-04-09 12 views
3

ルータが認識するパターンに従って、異なるRESXファイルから内容が読み込まれるようにアプリケーションをセットアップしました。すべてのページは、URLの最初の部分に応じて特定の言語でアクセスできます。MVCアプリケーションで複数言語を扱うにはどうすればいいですか?

routes.MapRoute(
    name: "Localization", 
    url: "{lang}/{controller}/{action}/{id}", ... 
); 

ノー仕様でテストしていたとき、私は私のLingo.REXSの英語版を取得し、私はSEに入れたとき、私はスウェーデン語版、すなわちLingo.se.RESXに着きます。これまでのところすべてが素晴らしい。

しかし、私はユーザーに言語の設定を制御させる方法がわかりません。私はそれが自動的にすることも、ブラウザの設定、地理データなどに基づいて想定したくありません。私は基本的には、どうやら魔法のように3つのフラグ(imgコントロール)が必要ですは、クリックされたフラグの言語に対応する接頭辞が付されている。

したがって、/ se/Home/Aboutと/ ge/Home/Aboutがあります。ユーザーはドイツの旗をクリックします - どのように後者にそれらをルーティングするのですか?スウェーデンの旗をクリックすると、どうやってスウェーデンの国旗にスクロールしますか?

私はthis blogと確認しましたが、クリックした旗の画像に応じて特定の言語にルーティングする方法に関する実際の問題は解決していません。私はまたthis blogを見つけましたが、私は彼らがどのようにそれをするのか分かりません。私はDBへの呼び出しの束を参照してくださいそれはRESXファイルに基づいていないと思うので(私の理解はそれが行く適切な方法です)、@TestResourceへの参照もあります。

今、私は混乱しており、不確実です。どんな提案や説明がありますか?

答えて

3

MVCのやや非直感的な機能がありますが、これは本当に簡単です。要求からのMVC automatically reuses any route values。したがって、すべてのURLが自動的に文化を継承します。ActionLinkに明示的に指定する必要はありません。

1つの例外は言語選択中です。しかし、同じルーティング動作を利用して、_Layout.cshtmlに共通のヘッダーまたはフッターを作成することができます。現在のページにあるルート値は継承されますが、コントローラ、アクション、およびカルチャを指定するだけです。

@{ 
    var routeValues = this.ViewContext.RouteData.Values; 
    var controller = routeValues["controller"] as string; 
    var action = routeValues["action"] as string; 
} 
<ul> 
    <li>@Html.ActionLink("Swedish", @action, @controller, new { lang = "se" }, new { rel = "alternate", hreflang = "se" })</li> 
    <li>@Html.ActionLink("English", @action, @controller, new { lang = "en" }, new { rel = "alternate", hreflang = "en" })</li> 
</ul> 

前述したように、ページ上の他のすべてのリンクは、自動的に現在のコンテキストからの文化を渡されますので、彼らは自動的に同じ文化の中に留まります。このような場合、明示的に文化を渡す理由はありません。上記のリンクで

@ActionLink("About", "About", "Home") 

現在のURLが/Home/Contactであれば、生成されたリンクは/Home/Aboutになります。現在のURLが/en/Home/Contactの場合、リンクは/en/Home/Aboutとして生成されます。

参考:ASP.NET MVC 5 culture in route and url

+0

うーん...私はあなたが私が実装することによって、あまりにも多くのをやったことを意味かしら(吸引アップが配信されていることを、今)ので、あなたの回答のinsightfulnessを、認識特別なルートとローカライゼーション属性。あなたは、* _Layout.cshtml *のどこかに3つの言語の文化とのリンクを置く必要があると言いますか?そして、一度ユーザーがそれをクリックすると(したがって、文化を選択する)、それは存続するでしょうか?それは**簡単ではありません...できますか? –

+0

はい、正しいです。それは簡単です。しかし、それはあなたの質問に表示されているルート値に一致するルートがあるかどうかに依存します。 「既定の」言語を扱う方法については、リンクされた回答を参照してください。 – NightOwl888

+0

すごく面白いです。バグ(この場合は非常に役に立ちます)のように感じますが、愚かな再ルーティングでは**スラッシュ**の後に接尾辞**を処理します。それは素晴らしいことです!ありがとう。 –

関連する問題