12

MVC における文化の変化に関連する好奇心を持っています。私は2つの方法で試しましたが、どうやら私はどこか間違っていました。

私の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());
    }

2番目の方法

    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());
    }

どこが間違っていますか?ありがとうございました。

4

2 に答える 2

8

ではなく、 culturefor myをオーバーライドする必要があるようです。だから私の最終的な方法はこれです:resource stringsthread

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

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

お役に立てれば。

アップデート :

上記のコードは、ユーザーが使用しているブラウザーに関係なく、すべてのユーザーに同じカルチャを設定するため、アプリケーションが複数のユーザーによって使用されている場合には適していません。

これを行う良い方法はcookie、ブラウザで a を設定するメソッドを作成することです:

    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 から継承する必要があります。オーバーライドする必要があるため、注意が必要です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);
    }
于 2013-02-27T10:20:17.740 に答える
4

web.config の次の行を削除します。

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

これらを auto に設定すると、ブラウザで設定されたユーザーの言語がデフォルトの言語になります。これはスレッド設定を上書きしています。

于 2013-02-27T09:41:57.397 に答える