C# 如何在ASP.NETMVC中使用资源和文化信息更改站点语言?

C# 如何在ASP.NETMVC中使用资源和文化信息更改站点语言?,c#,asp.net-mvc,C#,Asp.net Mvc,对于我想要支持的每种语言,我都有几个资源文件,如下所示: NavigationMenu.en-US.resx NavigationMenu.ru-RU.resx NavigationMenu.uk-UA.resx 文件位于MySolution/Resources/NavigationMenu文件夹中 我有如下设置CurrentCulture和CurrentUICulture的操作 public ActionResult SetLanguage(string lang) { try

对于我想要支持的每种语言,我都有几个资源文件,如下所示:

NavigationMenu.en-US.resx
NavigationMenu.ru-RU.resx
NavigationMenu.uk-UA.resx
文件位于
MySolution/Resources/NavigationMenu
文件夹中

我有如下设置
CurrentCulture
CurrentUICulture
的操作

public ActionResult SetLanguage(string lang)
{
    try
    {
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
        Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);
        return Redirect(Request.UrlReferrer.AbsoluteUri);
    }
    catch(Exception)
    {
        return RedirectToAction("Index");
    }
}
lang
参数值为
uk UA
ru ru
en US
,具体取决于我视图中单击的链接。我还定义了web配置全球化部分:

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="ru-RU" uiCulture="ru-RU" />


当我的应用程序启动时,我会像预期的那样使用俄语,但当我尝试使用
SetLanguage
action将我的语言更改为英语时,我的视图中不会出现语言更改<代码>导航菜单。SomeProperty仍然是俄语。我缺少什么?

您只更新当前线程的区域性

大多数网站都支持本地化,将其作为URL的一部分(在所有页面中)。使用MVC,您可以通过使用操作过滤器处理区域性来实现这种方法。有一个很好的解决方案


除此之外,您还需要通过将区域性持久化到会话或cookie,然后在每个请求上更新线程的区域性,或者通过实现操作筛选器,或者在包含请求上下文的应用程序事件期间更新线程的区域性来实现此目的,例如AquireRequestState。

将您的语言保存在cookie中,例如在
SetLanguage()
中,然后在
BaseController
ActionFilter
(推荐)中,从cookie中获取值,并相应地更新线程。
如果这没有任何意义,看看下面的好文章
代码项目
还有这个
e、 g


从SEO的角度来看,这不是最佳实践。看见“在不同的URL上保持每种语言的内容。不要使用cookie来显示页面的翻译版本。请考虑将页面的每个语言版本交叉链接。这样,一个登陆JonRea的德语版本的法国用户可以点击一个正确的语言版本。”@“@”同意,但这是一个快速而肮脏的方式。是的,有时候你不需要SEO,比如应用程序的管理区域或本地部署的私有应用程序。在我看来,这是一个更好的答案:
// Save culture in a cookie
        HttpCookie cookie = Request.Cookies["_culture"];
        if (cookie != null)
            cookie.Value = culture;   // update cookie value
        else
        {

            cookie = new HttpCookie("_culture");
            cookie.HttpOnly = false; // Not accessible by JS.
            cookie.Value = culture;
            cookie.Expires = DateTime.Now.AddYears(1);
        }
        Response.Cookies.Add(cookie);