如何在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
文件夹。
我有动作设置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-UA
, ru-RU
或en-US
,这取决于在我的视图中点击了什么链接。我也有web配置全球化定义部分:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="ru-RU" uiCulture="ru-RU" />
当我的应用程序启动时,我的俄语如预期的那样,但是当我试图用SetLanguage
动作将我的语言更改为英语时,我的视图中没有语言变化。NavigationMenu.SomeProperty
仍然是俄罗斯的。我错过了什么?
您正在更新当前线程的区域性。
大多数站点通过将其作为URL的一部分(在所有页面中)来支持本地化。使用MVC,您可以通过使用操作过滤器处理区域性来实现这种方法。这个答案有一个很好的解决方案。
除此之外,您还需要通过将区域性持久化到会话或cookie中,然后在每个请求时更新线程的区域性,同样通过实现操作过滤器,或者在包含请求上下文的应用程序事件期间(例如AquireRequestState)实现此功能。
在SetLanguage()
中坚持您的语言,然后在BaseController
或ActionFilter
(推荐)中从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);