4

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

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-UAru-RU或者en-US取决于单击了我视图中的链接。我也有网络配置全球化定义部分:

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

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

4

2 回答 2

5

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

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

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

于 2013-06-02T13:25:22.643 回答
3

将您的语言保留在您的例如 cookie 中SetLanguage(),然后在BaseControlleror中ActionFilter(推荐)从 cookie 中获取值并相应地更新线程。
如果这没有任何意义,请查看以下不错的文章;
代码项目: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);
于 2013-06-02T13:45:39.363 回答