我想为每种语言支持几种资源文件,如下所示:
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 config全球化定义部分:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="ru-RU" uiCulture="ru-RU" />
当我的应用程序启动时,我按预期使用俄语,但当我尝试将SetLanguage
操作的语言更改为英语时,我的视图中没有语言更改。 NavigationMenu.SomeProperty
仍然是俄罗斯人。我错过了什么?
答案 0 :(得分:4)
您正在更新当前线程的文化。
大多数网站都支持本地化,将其作为其网址的一部分(在所有网页中)。使用MVC,您可以通过使用动作过滤器处理文化来实现此方法。 This answer有一个很好的解决方案。
除此之外,你需要通过将文化持久化到会话或cookie,然后在每个请求上更新线程的文化,再次通过实现动作过滤器,或在包含请求上下文,例如AquireRequestState。
答案 1 :(得分:3)
将您的语言保留在SetLanguage()
中的Cookie中,然后在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
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);