[英]Spark Globalization with ASP.NET MVC
我正在使用spark viewengine,asp.net mvc和.resx文件。
我想通過我自定義的SessionModel(Session)設置一種語言,它通過Castle.Windsor注冊,並且具有Culture的字符串屬性,可以由用戶設置...
我需要當前語言堅持每一個視圖,而不必經常設置當前的UICulture。
在每個Controller Action中不必每次都執行此操作:
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包含Home的公共條目。
有沒有人知道如何做到這一點,我應該用ActionFilter嗎?
動作過濾器似乎是一個好主意:
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();
}
}
然后使用此屬性裝飾您的基本控制器。
如果您使用Spark View引擎,則可以解決此問題的解決方案(從靈活性的角度來看)已經解決了。
在代碼庫中查看示例解決方案 ,以獲得有關如何使用Spark進行國際化或全球化的出色示例。 絕對沒有必要開始使用ActionFilters做一些奇特的事情 - 這個方法適用於MVC2和MVC3,以便在您未來的計划中輕松遷移。
更新
在回答你關於Spark代碼庫中的示例的其他問題時,我認為有一些方法可以為那只貓設置皮膚。 一種方法是將文化作為會議的一部分,但在過去我們不想要的項目中,我們做了許多網站已經做過的事情 - 我們將文化作為路線數據的參數包括在內,確保它是包含在網址中:
routes.Add(new Route("{culture}/{controller}/{action}/{id}", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(
new { culture="en-us" action="Index", id="" }),
});
結合我上面提到的Spark模塊,這種事情讓您可以自由地專注於.resx文件,而不是花時間手動識別文化和路由。
事實上,你在同一個視圖文件夾中有一個Index.spark
和一個Index.fr.spark
意味着剩下的就會得到照顧。
希望有所幫助!
祝一切順利,
搶
我想我錯過了一些東西。 這就是我試圖避免(Application.cs)在spark樣本中,我已經有了一個自定義會話,它不需要管理另一個,只是為了“文化”:
示例代碼:
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 Index中調用以將當前文化拉出會話:
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或創建基本控制器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.