控制器内的GetLocalResourceObject

时间:2011-10-23 13:32:22

标签: asp.net-mvc asp.net-mvc-2

我有一个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

2 个答案:

答案 0 :(得分:3)

HttpContext用作服务器上下文,默认情况下会返回操作系统的区域设置(CultureInfo.CurrentUICulture)。您需要以某种方式读取用户区域设置 - 通过查询HttpContext.Current.Request.UserLanguages(可能为空)或明确要求用户提供此信息。

作为Scott Hanselman writes in his excellent article on globalization,ASP.Net实际上可以为您设置工作线程文化(Thread.Current.UICultureThread.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