我正在尝试为用户提供更改我的asp.net mvc网站的UI语言的选项。我打算为用户提供2种语言,即:英语和荷兰语
为此我编辑了我的web.config文件并添加了:
<globalization enableClientBasedCulture="true" culture="auto" uiCulture="auto"/>
现在我添加了2个文件Resources.resx
(默认文件)和Resources.nl-NL.resx
(荷兰语的资源文件)。
我在我的视图中将资源文件称为<title>@WebApplication9.App_GlobalResources.Resources.RequestTitle</title>
。
当语言改变时,我正在改变文化:
Thread.CurrentThread.CurrentCulture = new CultureInfo("nl-NL");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("nl-NL");
但即使语言更改为荷兰语并将文化值更改为上面指定的值后,Resources.resx
的英语值始终显示而不是从Resources.nl-NL.resx
获取值。
你能帮助我找出我在这里缺少的东西吗?
答案 0 :(得分:0)
这可能会有所帮助;
你的POST方法:
public ActionResult SetCultureToNL()
{
SetCulture("nl-BE");
return View("index");
}
private void SetCulture(String culture)
{
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(culture);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
if (httpContext.Request.Cookies["_Culture"] != null)
{
HttpCookie cultureCookie = new HttpCookie("_Culture", culture);
httpContext.Response.SetCookie(cultureCookie);
}
else
{
HttpCookie cookie = new HttpCookie("_Culture");
cookie.Value = culture;
httpContext.Response.Cookies.Add(cookie);
}
}
和GET方法:
public ActionResult Index()
{
string cultureName = GetCultureCookieValue(this.ControllerContext.HttpContext.ApplicationInstance.Context);
// Modify current thread's cultures
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
// ...
}
public static String GetCultureCookieValue(HttpContext httpContext)
{
HttpCookie cultureCookie = httpContext.Request.Cookies["_Culture"];
if (cultureCookie != null)
{
return CultureHelper.GetImplementedCulture(cultureCookie.Value);
}
else
{
return CultureHelper.GetImplementedCulture(httpContext.Request.UserLanguages[0]); // obtain it from HTTP header AcceptLanguages
}
}
答案 1 :(得分:0)
我已经通过在调用控制器操作方法时每次设置当前文化来解决该问题。 这个问题是由于我改变文化时引起的,它仅针对当前线程设置。当用户请求另一个视图时,该线程可能不同。所以我需要为每个新请求/新线程设置Culture。
我给用户只有2种语言,即英语(en-US)和荷兰语(nl-NL)。所以我为英语创建了2个名为Resources.resx
的resx文件,为荷兰语创建了Resources.nl.resx
。当用户更改当前语言时,我将语言保留在Session中并存储在数据库中,以便在进一步登录时记住它。
if(selectedLang == Dutch)
{
Session["Language"] = "nl-NL";
}
else
{
Session["Language"] = "en-US";
}
现在Session["Language"]
拥有用户的首选语言。现在在每个控制器动作方法中:
[HttpGet]
public ActionResult ActionMethodName(DataClass dataObj)
{
Sessions.ChangeLanguage(Session["Language"].ToString());
}
Sessions.ChangeLanguage(string language)
是类Sessions
中的静态方法,如下所示:
public static void ChangeLanguage(string lang)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo(lang);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
}