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

时间:2013-06-02 03:54:57

标签: c# asp.net-mvc

我想为每种语言支持几种资源文件,如下所示:

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-UAru-RUen-US,具体取决于我点击的视图中的链接。我也有web config全球化定义部分:

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

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

2 个答案:

答案 0 :(得分:4)

您正在更新当前线程的文化。

大多数网站都支持本地化,将其作为其网址的一部分(在所有网页中)。使用MVC,您可以通过使用动作过滤器处理文化来实现此方法。 This answer有一个很好的解决方案。

除此之外,你需要通过将文化持久化到会话或cookie,然后在每个请求上更新线程的文化,再次通过实现动作过滤器,或在包含请求上下文,例如AquireRequestState。

答案 1 :(得分:3)

将您的语言保留在SetLanguage()中的Cookie中,然后在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
e.g;

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