1. ホーム
  2. asp.net-mvc

[解決済み] ASP.Net MVCアプリでカルチャを設定する

2023-03-19 09:33:35

質問

ASP.net MVCアプリでCulture/UI Cultureを設定するのに最適な場所はどこでしょうか?

現在、私は以下のようなCultureControllerクラスを持っています。

public class CultureController : Controller
{
    public ActionResult SetSpanishCulture()
    {
        HttpContext.Session["culture"] = "es-ES";
        return RedirectToAction("Index", "Home");
    }

    public ActionResult SetFrenchCulture()
    {
        HttpContext.Session["culture"] = "fr-FR";
        return RedirectToAction("Index", "Home");
    }
}

というようなリンクで、トップページに各言語のハイパーリンクを設置します。

<li><%= Html.ActionLink("French", "SetFrenchCulture", "Culture")%></li>
<li><%= Html.ActionLink("Spanish", "SetSpanishCulture", "Culture")%></li>

というのはうまくいくのですが、もっと適切な方法があるのではないかと思っています。

私は以下のActionFilterを使用してCultureを読み込んでいます。 http://www.iansuttle.com/blog/post/ASPNET-MVC-Action-Filter-for-Localized-Sites.aspx . 私はMVCの初心者なので、これを正しい場所に設定できているか自信がありません。 私はそれをweb.configレベルでやりたくない、それはユーザーの選択に基づいていなければならない。 また、ブラウザの設定からカルチャを得るためにhttp-headersをチェックしたくありません。

編集してください。

はっきりさせておきたいのですが、私はsessionを使うか使わないかを決めようとしているわけではありません。私はその部分に満足しています。 私が解決しようとしているのは、各文化を設定するためのアクションメソッドを持つ文化コントローラでこれを行うのが最善なのか、それともMVCパイプラインの中でこれを行うより良い場所があるのか、ということです。

どのように解決するのでしょうか?

私はこれを使用しています ローカライズ方法 を使い、ユーザーが example.com/xx-xx/ にアクセスするたびにカルチャと言語を設定するルートパラメーターを追加しています。

例を挙げます。

routes.MapRoute("DefaultLocalized",
            "{language}-{culture}/{controller}/{action}/{id}",
            new
            {
                controller = "Home",
                action = "Index",
                id = "",
                language = "nl",
                culture = "NL"
            });

実際の文化/言語設定を行うフィルターがあります。

using System.Globalization;
using System.Threading;
using System.Web.Mvc;

public class InternationalizationAttribute : ActionFilterAttribute {

    public override void OnActionExecuting(ActionExecutingContext filterContext) {

        string language = (string)filterContext.RouteData.Values["language"] ?? "nl";
        string culture = (string)filterContext.RouteData.Values["culture"] ?? "NL";

        Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture));

    }
}

国際化属性を有効にするには、クラスに追加するだけです。

[Internationalization]
public class HomeController : Controller {
...

これで、訪問者が http://example.com/de-DE/Home/Index にアクセスすると、ドイツ語のサイトが表示されます。

この回答が正しい方向性を示してくれることを願っています。

また、小さな MVC 5 のサンプル プロジェクトを作成しましたので、以下を参照してください。 ここで

http://{yourhost}:{port}/en-us/home/index にアクセスするだけで、英語(US)の現在の日付を見ることができます。ドイツ語などは http://{yourhost}:{port}/de/home/index に変更します。