如何在 ASP .NET MVC 中使用 Resources 和 CultureInfo 更改站点语言?

Dmy*_*tro 3 c# asp.net-mvc

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

NavigationMenu.en-US.resx
NavigationMenu.ru-RU.resx
NavigationMenu.uk-UA.resx
Run Code Online (Sandbox Code Playgroud)

文件位于MySolution/Resources/NavigationMenu文件夹中。

我有如下设置CurrentCultureCurrentUICulture喜欢的动作

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

lang参数值是uk-UAru-RU或者en-US取决于我的视图中的哪个链接被点击。我也有 web 配置全球化定义部分:

<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="ru-RU" uiCulture="ru-RU" />
Run Code Online (Sandbox Code Playgroud)

当我的应用程序启动时,我按预期使用俄语,但是当我尝试通过SetLanguage操作将语言更改为英语时,我的视图中没有语言更改。NavigationMenu.SomeProperty仍然是俄罗斯人。我错过了什么?

Jer*_*ose 5

您仅更新当前线程的区域性。

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

除此之外,您需要通过将文化持久化到会话或 cookie 来实现这一点,然后在每个请求上更新线程的文化,再次通过实现操作过滤器,或在包含请求上下文的应用程序事件期间,例如 AquireRequestState。