【问题标题】:How to change my MVC Website's Current Culture at Runtime如何在运行时更改我的 MVC 网站的当前文化
【发布时间】:2015-10-01 17:17:40
【问题描述】:

我的 MVC 项目有一个问题,我需要用户能够在运行时更改网站的本地化,我的以下代码是我迄今为止尝试过的,当然当前的文化确实发生了变化,但是我的网站没有任何变化。

奇怪的是,在 Web.Config 中设置文化效果很好!

我的代码在下面,有什么想法吗?

[AllowAnonymous]
        [HttpPost]
        public ActionResult SelectLanguage(LoginViewModel model)
        {
            switch (model.SelectedLanguage)
            {
                case "French":
                    CultureInfo.CurrentCulture=new CultureInfo("fr-fr");
                    CultureInfo.CurrentUICulture = new CultureInfo("fr-fr");
                    break;
            }

            return RedirectToAction("Index");

        }

【问题讨论】:

  • 尝试重新加载会话?
  • 考虑到我使用 Viewmodel 作为我的 DTO,这行得通吗?
  • 我不知道,因此是问号... :) 这只是一种预感。我从来不需要动态地改变服务器端文化。
  • 它确实改变了文化,这很奇怪,因为我根本看不到任何翻译,如果我手动更改 Web.config 它会很有魅力,所以我看不出这段代码是怎么做的不工作
  • [这个](stackoverflow.com/questions/15108524/…) 可能会有所帮助

标签: c# asp.net-mvc localization


【解决方案1】:

最好的方法是创建一个在浏览器中设置 cookie 的方法:

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

在此之后(棘手的方法),您需要让每个控制器都从一个 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);
    }

并在您的方法调用ChangeCulture()lang

[AllowAnonymous]
        [HttpPost]
        public ActionResult SelectLanguage(LoginViewModel model)
        {
            switch (model.SelectedLanguage)
            {
                case "French":
                    ChangeCulture("fr-Fr");
                    break;
            }

            return RedirectToAction("Index");

        }

【讨论】:

    【解决方案2】:

    这个问题Change culture based on a link MVC4帮了大忙!

    基本上我需要覆盖资源字符串的文化,而不是实际应用程序的文化!

    我的代码已经改成这个了;

     [AllowAnonymous]
            [HttpPost]
            public ActionResult SelectLanguage(LoginViewModel model)
            {
                switch (model.SelectedLanguage)
                {
                    case "French":
                        LanguageStrings.Culture = new CultureInfo("fr-fr");
                        break;
                }
    
                return RedirectToAction("Index");
    
            }
    

    并且像魅力一样工作! =D

    【讨论】:

    • 所以基本上从下次发布问题之前先做一些搜索.. :)
    猜你喜欢
    • 1970-01-01
    • 2021-06-16
    • 2019-10-31
    • 2021-08-03
    • 1970-01-01
    • 2020-08-07
    • 2017-02-03
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多