如何在asp.net MVC中使用资源和文化信息更改站点语言

本文关键字:信息 文化 语言 站点 资源 asp net MVC | 更新日期: 2023-09-27 18:16:20

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

NavigationMenu.en-US.resx
NavigationMenu.ru-RU.resx
NavigationMenu.uk-UA.resx

文件位于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");
    }
}

lang参数值是uk-UA, ru-RUen-US,这取决于在我的视图中点击了什么链接。我也有web配置全球化定义部分:

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

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

如何在asp.net MVC中使用资源和文化信息更改站点语言

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

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

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

SetLanguage()中坚持您的语言,然后在BaseControllerActionFilter(推荐)中从cookie中获取值并相应地更新线程。
如果这没有任何意义,看看下面的好文章;
CodeProject: http://www.codeproject.com/Articles/526827/MVC-Basic-Site-Step-1-Multilingual-Site-Skeleton
和这个:http://afana.me/post/aspnet-mvc-internationalization。aspx
例如,

// 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);