I'm trying to construct the flexible URL routing.
So the url like
en-US/ctrl/act/1/2
should do the same as
ctrl/act/1/2
and set the culture to en-US.
Now I have achieved that by defining two routes as following:
routes.MapRoute(
    "Ctrl",
    "ctrl/{action}/{group}/{page}",
    new { controller = "Home", action = "Index", group = 1, page = 1 },
    new { group = @"\d+", page = @"\d+" }
    );
routes.MapRoute("CtrlWithCulture",
    "{culture}/ctrl/{action}/{group}/{page}",
    new { culture = "", controller = "Home", action = "Index", group = 1, page = 1 },
    new { culture = "[a-z]{2}-(?:[a-zA-Z]{2,4}-)*(?:[a-zA-Z]{2,4})", group = @"\d+", page = @"\d+" }
    );
I have a base controller that is setting the culture based on the input parameter. But I want to have this functionality by default for all the routes, so I tried something like this.
Global.asax.cs:
routes.MapRoute("RootWithCulture",
    "{culture}/{*rest}",
    new { controller = "Home", action = "Index", culture = "" },
    new { culture = "[a-z]{2}-(?:[a-zA-Z]{2,4}-)*(?:[a-zA-Z]{2,4})" }
    );
MyController.cs 
public class MyController : Controller
{
...
    protected override void OnActionExecuting(ActionExecutingContext context)
    {
     if (!String.IsNullOrEmpty(context.RouteData.Values["culture"].ToStringOrNull()))
     {
      this.SetCulture(String.IsNullOrEmpty(context.RouteData.Values["culture"])
      context.RouteData.Values.Remove("culture");
      // I'm stuck here!
      // I want to try other routes and find and execute the right one...
I'm not sure what would be the right approach to this...