簡體   English   中英

使用ASP.NET MVC實現Spark全球化

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM