Можно ли локализовать URL / маршрутизацию в ASP.NET MVC?

Я работаю с клиентом, который хочет, чтобы URL-адреса в нашем веб-приложении были на французском языке. Я английский разработчик, у нас также есть англоязычные клиенты. Это интересная проблема, но я не думаю, что ее поддерживает ASP.NET MVC Framework.

Вот сценарий. Маршрут ...

Конкретный ПРИМЕР
Английский URL
m работает с клиентом, который хочет, чтобы URL-адреса в нашем веб-приложении были на французском языке. Я английский разработчик, у нас также есть англоязычные клиенты. Это интересная проблема, но я не думаю, что это ...

Я работаю с клиентом, который хочет, чтобы URL-адреса в нашем веб-приложении были на французском языке. Я английский разработчик, у нас также есть англоязычные клиенты. Это интересная проблема, но я не думаю, что ее поддерживает ASP.NET MVC Framework.

Вот сценарий. Маршрут ...

Конкретный ПРИМЕР
Английский URL
m работает с клиентом, который хочет, чтобы URL-адреса в нашем веб-приложении были на французском языке. Я английский разработчик, у нас также есть англоязычные клиенты. Это интересная проблема, но я не думаю, что это ...

Я работаю с клиентом, который хочет, чтобы URL-адреса в нашем веб-приложении были на французском языке. Я английский разработчик, у нас также есть англоязычные клиенты. Это интересная проблема, но я не думаю, что ее поддерживает ASP.NET MVC Framework.

Вот сценарий. Маршрут ...

Конкретный ПРИМЕР
Английский URL
м английский разработчик, и у нас также есть английские клиенты. Это интересная проблема, но я не думаю, что ее поддерживает ASP.NET MVC Framework.

Вот сценарий. Маршрут ...

Конкретный ПРИМЕР
Английский URL
м английский разработчик, и у нас также есть английские клиенты. Это интересная проблема, но я не думаю, что ее поддерживает ASP.NET MVC Framework.

Вот сценарий. Маршрут ...

Конкретный ПРИМЕР
Английский URL
www.stackoverflow.com/questions/ask inventory также будет поддерживать

французский URL
www.stackoverflow.com/problème/poser

Общий ПРИМЕР
Английский URL
http://clientA.product.com/AreaNameEnglish/ControllerNameEnglish/ActionNameEnglish/params

также должен поддерживать

Французский URL
http://clientB.product.com/AreaNameFrench/ControllerNameFrench/ActionNameFrench/params

Итак, в MVC моя область, контроллер и действия должны иметь как английский, так и французский переводы.

Очевидно, что ремонтопригодность будет ОГРОМНАЯ проблема, если бы я пошел и жестко закодировал все мои контроллеры, представления и имена действий на французский язык. Есть ли способ локализовать маршрут, представленный в браузере, без этого? Помните, что в приложении есть много разных маршрутов. Пара областей, каждая с горсткой контроллеров, каждая со множеством действий?

Спасибо,
Джастин

ИЗМЕНИТЬ
Благодаря @womp вот что я придумал до сих пор ... Хотя в конце концов я использовал подход, который опубликовал в качестве ответа.

public class LocalizedControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext requestContext, string controllerName)
    {
        if (string.IsNullOrEmpty(controllerName))
            throw new ArgumentNullException("controllerName");

        if (CultureInfo.CurrentCulture.TwoLetterISOLanguageName == "fr")
        {
            controllerName = this.ReplaceControllerName(requestContext, controllerName);
            this.ReplaceActionName(requestContext);
            this.ReplaceAreaName(requestContext);
        }

        return base.CreateController(requestContext, controllerName);
    }

    private string ReplaceControllerName(RequestContext requestContext, string controllerName)
    {
        // would use the language above to pick the propery controllerMapper.  For now just have french
        Dictionary controllerMapper = new Dictionary()
        {
            {"frenchControllerA", "englishControllerA"},
            {"frenchControllerB", "englishControllerB"}
        };

        return this.ReplaceRouteValue(requestContext, "controller", controllerMapper);
    }

    private void ReplaceAreaName(RequestContext requestContext)
    {
        // would use the language above to pick the propery areaMapper.  For now just have french
        Dictionary areaMapper = new Dictionary()
        {
            {"frenchAreaX", "englishAreaX"},
            {"frenchAreaY", "englishAreaY"}
        };

        this.ReplaceRouteValue(requestContext, "area", areaMapper);
    }

    private void ReplaceActionName(RequestContext requestContext)
    {
        // would use the language above to pick the propery actionMapper.  For now just have french
        Dictionary actionMapper = new Dictionary()
        {
            {"frenchAction1", "englishAction1"},
            {"frenchAction2", "englishAction2"}
        };

        this.ReplaceRouteValue(requestContext, "action", actionMapper);
    }

    private string ReplaceRouteValue(RequestContext requestContext, string paramName, Dictionary translationLookup)
    {
        if (requestContext.RouteData.Values[paramName] == null)
        {
            return null;
        }

        string srcRouteValue = requestContext.RouteData.Values[paramName] as string;
        if (srcRouteValue != null && translationLookup.ContainsKey(srcRouteValue))
        {
            requestContext.RouteData.Values[paramName] = translationLookup[srcRouteValue];
        }

        return requestContext.RouteData.Values[paramName] as string;
    }
}

Приличное начало. Если я локализую только ControllerName и ActionName в URL-адресе, он найдет и отобразит правильный View. Однако у меня возникают следующие проблемы:

Имя области не может быть переведено
Локализация области означает, что метод Controller.View () не может найти представления. Несмотря на то, что я заменил имя области в контексте запроса, метод ViewEngineCollection.Find (), похоже, не улавливает его. В любом месте моего класса контроллера, который выполняет «return View ()», не удается найти представление по умолчанию для своего действия. Если я не локализую Area, остальные шаги будут работать.

RedirectToAction или Html.ActionLink
Каждый раз, когда приложение вызывает RedirectToAction, или если я использую помощник Html.ActionLink или что-то подобное, создаваемые URL-адреса являются английскими. Похоже, мне придется добавить логику где-нибудь, возможно, в нескольких местах, чтобы преобразовать английский URL-адрес во французский (или другой язык).

14
задан Justin 15 October 2010 в 01:31
поделиться