2010-11-07 86 views
4

我正在使用spark viewengine,asp.net mvc和.resx文件。使用ASP.NET MVC進行Spark全球化

我想通過我的自定義SessionModel(會話),它是通過Castle.Windsor註冊並具有可以由用戶設置文化的字符串屬性來設置語言...

我所需要的電流語言堅持每一個觀點,而不必不斷地設置當前的UICulture。

不必爲此,每次在每個控制器動作:

public SessionModel SessionModel { get; set; } 

    public ActionResult Index() 
    { 
     Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(SessionModel.Culture); 
     Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 
    } 

用做這種方式的問題是,如果我去到另一頁當前文化將翻轉回默認語言。

在火花視圖我簡單的調用,以獲得當前文化:

${SR.Home} 

SR.resx包含主頁公開條目。

有沒有人有一個好主意,如何做到這一點,我應該這樣做與ActionFilter?

+0

[如何本地化ASP.NET MVC + Spark應用程序?](http://stackoverflow.com/questions/788635/how-to-localize-asp-net-mvc-spark-application) – bzlm 2010-11-07 17:40:21

+0

他談論的樣本究竟是什麼問題,它將信息保存在一個普通的ASP.NET會話中,並且必須在每個額外的控制器上請求它。 – Andrew 2010-11-07 18:08:15

回答

1

行動過濾器似乎是一個好主意:

public class SetCultureActionFilterAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     CultureInfo culture = FetchCultureFromContext(filterContext); 
     Thread.CurrentThread.CurrentCulture = culture; 
     Thread.CurrentThread.CurrentUICulture = culture; 
     base.OnActionExecuting(filterContext); 
    } 

    private CultureInfo FetchCultureFromContext(ActionExecutingContext filterContext) 
    { 
     throw new NotImplementedException(); 
    } 
} 

,然後用這個屬性裝飾你的基本控制器。

+0

我一直在擺弄這樣的事情,問題是我不能注入溫莎會議,我已經進入了IActionFilter。然後提出瞭如何讓我的語言保持最新的問題......現在我唯一能做的就是使用HTTPContext.Currrent.Session,這真的很煩人。然而,也許我看錯了,你對FetchCultureFromContext有什麼想法? – Andrew 2010-11-07 18:05:04

+0

是的,你不能使用DI開箱即用。有[解決方法](http://www.lostechies.com/blogs/jimmy_bogard/archive/2010/05/03/dependency-injection-in-asp-net-mvc-filters.aspx)。這[可能](http://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html)雖然在ASP.NET MVC 3中。 – 2010-11-07 18:07:56

+0

我結束了使用:http:/ /weblogs.asp.net/psteele/archive/2009/11/04/using-windsor-to-inject-dependencies-into-asp-net-mvc-actionfilters.aspx將我的會話注入到一個自定義的ActionFilterAttribute中,並且工作。謝謝你的幫助。 – Andrew 2010-11-09 14:47:45

0

對於這個問題,如果您使用Spark View Engine已經解決了這個問題,有一個更好的和可擴展的(從靈活性的角度來看)解決方案。

看看sample solution here in the code base是一個關於如何使用Spark進行國際化或全球化的極好例子。絕對不需要用ActionFilter開始做一些奇特的事情 - 而且這種方法在MVC2和MVC3中起作用,如果這是您未來的計劃,則可以輕鬆進行遷移。

更新

在回答您的其他問題就在Spark的代碼庫,我認爲有剝皮那貓的一些方法的樣本。一種方法是將文化作爲會話的一部分,但在過去那些我們不想要的項目中,我們做了許多網站已經做的事情 - 我們通過確保文化作爲參數包含在文化數據中包含在URL:

routes.Add(new Route("{culture}/{controller}/{action}/{id}", new MvcRouteHandler()) 
    { 
     Defaults = new RouteValueDictionary(
     new { culture="en-us" action="Index", id="" }), 
    }); 

這種東西結合我上面提到的給你的自由,只是花的時間集中於你的.resx文件,而不是所有的時間搞清楚的文化和路由星火模塊手動。

事實上,您在同一個視圖文件夾中有Index.sparkIndex.fr.spark,這意味着剩下的事情會得到照顧。

希望有幫助!
所有最好的,
羅布

+0

看到,下面的迴應,很適合這個小盒子。 – Andrew 2010-11-09 01:08:14

+0

我已將更新添加到我的答案中。希望我覆蓋它? – RobertTheGrey 2010-11-15 18:22:31

0

我想我失去了一些東西。這是我想要避免的(應用程序。CS)火花塞樣品裏面,我已經有一個自定義會話,它並不需要管理其他,只是爲了「文化」:

示例代碼:

public static string GetSessionCulture(ControllerContext controllerContext) 
    { 
     return Convert.ToString(controllerContext.HttpContext.Session["culture"]); 
    } 

    public static void SetSessionCulture(ControllerContext controllerContext, string culture) 
    { 
     controllerContext.HttpContext.Session["culture"] = culture; 
    } 

而且其完成後,我怎麼加載當前文化的每一頁我有,我會撥打電話的HomeController指數內拉電流文化走出會議:

public object Index() 
    { 
     var user = new UserInfo 
           { 
            Name = "Frankie", 
            Culture = Application.GetSessionCulture(ControllerContext) 
           }; 

     try 
     { 
      Thread.CurrentThread.CurrentCulture = 
       CultureInfo.CreateSpecificCulture(user.Culture); 
     } 
     catch 
     { 
      Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB"); 
     } 
     Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; 

     ViewData["user"] = user; 
     return View(); 
    } 

的唯一途徑,我可以拿出其中現在是通過創建一個自定義ActionFilter或創建一個基本控制器。