Как использовать маршрутизацию на веб-сайте ASP MVC для локализации на два языка - но сохраняя существующие URL-адреса - PullRequest
1 голос
/ 13 апреля 2010

У нас есть пара веб-сайтов ASP MVC, использующих стандартные настройки шаблонов VS по умолчанию - Работая как нужно. Но теперь я хочу локализовать эти веб-сайты (они теперь на голландском, и я добавлю английский язык) Я хотел бы использовать маршрутизацию, а не ресурс, потому что: 1. Языки будут различаться по содержанию, количеству страниц и т. Д. 2. Содержание в основном текстовое.

Мне бы хотелось, чтобы URL-адреса выглядели примерно так: www.domain.com/en/Home/Index, www.domain.nl/nl/Home/Index. Но последний также должен работать с - www.domain.nl/Home/Index - Witch - это захватывающие URL.

Я реализовал ViewEngine областей Phil Haacks из этого поста в блоге - http://haacked.com/archive/2008/11/04/areas-in-aspnetmvc.aspx. Но только поместил англоязычный веб-сайт в области и сохранил голландский язык в старой структуре. Ведьмы служат запасным вариантом Филса по умолчанию. Но проблема здесь в том, что мне приходится дублировать мои контроллеры для обоих языков.

Итак, я попробовал метод работы, описанный в этом шаге - ASP.NET MVC - Маршрут локализации . Работает нормально с? En? и / nl /, но не со старыми URL.

При использовании этого кода в global.asax URL без языка не работает.

public static void RegisterRoutes(RouteCollection routes)
        {
            //routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",                                              // Route name
                "{culture}/{controller}/{action}/{id}",                           // URL with parameters
                new { culture = "nl-NL", controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );

            routes.MapRoute(
                "DefaultWitoutCulture",                                              // Route name
                "{controller}/{action}/{id}",                           // URL with parameters
                new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );

        }

Я правильно пропускаю кое-что простое, но не могу заставить это работать на меня. Или есть лучший способ сделать это?

Ответы [ 2 ]

3 голосов
/ 13 апреля 2010

Чтобы сделать URL-адрес без использования культуры, я бы, вероятно, создал собственную реализацию класса route. Это может выглядеть примерно так:

public class LocalizedRoute : Route
{
    //Constuctors

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var routeData = base.GetRouteData(httpContext);
        var culture = "en";
        if (httpContext.Request.Url.ToString().Contains(".nl"))
            culture = "nl";

        routeData.Values.Add("culture", culture);

        return routeData;
    }
}

Тогда вы можете использовать что-то вроде этого при регистрации ваших маршрутов:

var route = new LocalizedRoute("{controller}/{action}/{id}", new MvcRouteHandler()) {
    Defaults = new RouteValueDictionary(new { controller = "Home", action = "Index", id = "" }),
    Constraints = new RouteValueDictionary(),
    DataTokens = new RouteValueDictionary()
};

routes.Add("DefaultWitoutCulture", route);

Этот код, конечно, можно немного почистить. Но это основной пример того, как я бы решил вашу проблему.

2 голосов
/ 14 апреля 2010

Спасибо, Маттиас.

После некоторых проб и ошибок я пришел с этим решением, которое локализуется на английский и голландский, но также должно работать со старыми URL-адресами - из-за ограничения.

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default",                                                              // Route name
                "{culture}/{controller}/{action}/{id}",                                 // URL with parameters
                new { culture = "nl", controller = "Home", action = "Index", id = "" },
                new { culture = @"\Aen|nl\z" }                                          // Parameter defaults
            );

            routes.MapRoute(
                "DefaultWitoutCulture",                                                 // Route name
                "{controller}/{action}/{id}",                                           // URL with parameters
                new { culture = "nl", controller = "Home", action = "Index", id = "" }  // Parameter defaults
            );

        } 
...