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

Posted

技术标签:

【中文标题】如何在 ASP .NET MVC 中使用 Resources 和 CultureInfo 更改站点语言?【英文标题】:How to change site language using Resources and CultureInfo in ASP .NET MVC? 【发布时间】:2013-06-02 03:54:57 【问题描述】:

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

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,具体取决于单击了我视图中的哪个链接。我也有网络配置全球化定义部分:

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

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

【问题讨论】:

我认为这是一个更好的答案:***.com/questions/1560796/… 【参考方案1】:

您只更新当前线程的文化。

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

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

【讨论】:

【参考方案2】:

将您的语言保留在您的 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 例如;

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

【讨论】:

从 SEO 的角度来看,这不是最佳实践。见support.google.com/webmasters/answer/182192?hl=en。 “将每种语言的内容保存在单独的 URL 上。不要使用 cookie 来显示页面的翻译版本。考虑交叉链接页面的每个语言版本。这样,法国用户登陆你的页面的德语版本只需单击一下即可获得正确的语言版本。” @JonRea 同意,但这是一种快速而肮脏的方式。是的,有时您不需要 SEO,例如应用程序的管理区域或本地部署的私有应用程序。

以上是关于如何在 ASP .NET MVC 中使用 Resources 和 CultureInfo 更改站点语言?的主要内容,如果未能解决你的问题,请参考以下文章

Aspose.word在asp.net mvc中如何使用的个人总结

如何在使用 HttpClient 使用 Asp Net Web Api 的 Asp Net Mvc 中提供实时数据?

如何在 ASP.NET MVC 中使用多个表单元素

如何使用 MVC 的内容协商在 ASP.NET Core MVC 中间件中返回响应?

如何在 ASP.NET MVC 中使用路由修复 404?

如何在 ASP.NET MVC 中使用通用处理程序 (ASHX)?