我有一个ajax调用,它返回基于httpcontext的本地化成功消息,
public ActionResult ReportViolation(string DiscussID) {
Enumeration.Lang rLang = (Request.Cookies["MAKANI.Localization.CurrentUICulture"].Value.Equals("ar-EG")) ?
Enumeration.Lang.Arabic : Enumeration.Lang.English;
if (Session["sId"] == null) return Json(false,
HttpContext.GetLocalResourceObject("~/Views/Home/Index.cshtml", "msgDiscussViolationRegister").ToString(),
0,
null);
else {
long userId = AuthenticationModule.GetUserId(Convert.ToInt32(Session["sId"]));
bool rReport = Discuss_BL.ReportViolation(Convert.ToInt32(DiscussID), userId);
string rError = rReport
? HttpContext.GetLocalResourceObject("~/Views/Home/Index.cshtml", "msgDiscussViolationSuccess").ToString()
: HttpContext.GetLocalResourceObject("~/Views/Home/Index.cshtml", "msgDiscussViolationExist").ToString();
return Json(rReport, rError, 0, null);
}
}
但是,资源总是发回英文版,这是从控制器使用HttpContext的正确方法吗?
- 问候。
Yehia A.Salam
答案 0 :(得分:3)
HttpContext
用作服务器上下文,默认情况下会返回操作系统的区域设置(CultureInfo.CurrentUICulture
)。您需要以某种方式读取用户区域设置 - 通过查询HttpContext.Current.Request.UserLanguages
(可能为空)或明确要求用户提供此信息。
作为Scott Hanselman writes in his excellent article on globalization,ASP.Net实际上可以为您设置工作线程文化(Thread.Current.UICulture
和Thread.Current.Culture
),解析Accept-Languages
HTTP标头。只需将此代码段添加到<globalization>
的web.config
:
<system.web>
<globalization enableclientbasedculture="true" uiculture="auto" culture="auto">
...snip...</globalization></system.web>
请注意,用户可能没有正确设置浏览器,因此他应该始终可以选择覆盖语言设置。
答案 1 :(得分:0)
默认情况下,ASP.NET不会修改Thread.Current.UICulture和Thread.Current.Culture值,因此会引用服务器上下文 - 因此,GetLocalResourceObject
之类的调用不会对用户做出反应浏览器设置。
但是,ASP.NET可以解析Accept-Languages HTTP标头,并适当地设置Culture和UICulture值。
<system.web>
<globalization enableclientbasedculture="true" culture="auto" uiCulture="auto" />
</system.web>
这篇文章很好地阅读:Globalization, Internationalization and Localization in ASP.NET MVC 3