10

Trudno znaleźć odpowiedź na to konkretne pytanie, tak źle pop go tutaj:Producent URL określonego języka (drogami)

Chcemy budować nasze adresy URL zupełnie specyficzny język, co oznacza

www.mysite.com/EN

www.mysite.com/DE

odbywa się to w RouteConfig z

url: "{language}/{controller}/{action}/{id}" 

Ale wtedy Najtrudniejsze:

www.mysite.com/EN/Categories

www.mysite.com/DE/Kategorien

Tj make controllername pojawiają się w wielu językach, ale wskazują ten sam kontroler. Czy to możliwe?

+0

Zobacz [Kultura ASP.NET MVC 5 w trasie i url] (http://stackoverflow.com/a/32839796/181087) dla kompletnego rozwiązania. – NightOwl888

Odpowiedz

13

Cóż, jest to częściowo możliwe (tylko część językowa). Nazwa kontrolera w innym języku jest zdecydowanie interesująca, ale myślę, że trudno byłoby to osiągnąć. Zastanów się, jak to będzie wyglądać w przypadku języków Bidi takich jak arabski i hebrajski. Prawdopodobnie dobrym pomysłem byłoby użycie kontrolera w różnych językach, ale stworzysz spustoszenie dla siebie i uważam, że musiałbyś zmienić bazową strukturę MVC, aby to umożliwić.

Część zmiany języka jest łatwa i można ją wykonać jak poniżej.

Na co możesz spojrzeć, to globalizacja. Zasadniczo część językowa odpowiada aktualnej kulturze UI wątków. Co trzeba jest następujący:

  1. Zdefiniuj trasę, coś takiego:

    var lang = System.Threading.Thread.CurrentThread.CurrentUICulture.Name; 
    
    routes.MapRoute(
        name: "Default", 
        url: "{language}/{controller}/{action}/{id}", 
        defaults: new { language = lang, controller = "Home", 
            action = "Index", id = UrlParameter.Optional } 
    ); 
    
  2. Rejestru Application_AcquireRequestState i zdefiniować go coś takiego:

    protected void Application_AcquireRequestState() 
    { 
        var routes = RouteTable.Routes; 
    
        var httpContext = Request.RequestContext.HttpContext; 
        if (httpContext == null) return; 
    
        var routeData = routes.GetRouteData(httpContext); 
    
        var language = routeData.Values["language"] as string; 
        var cultureInfo = new CultureInfo(language); 
    
        System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; 
        System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo; 
    } 
    

    Chociaż CurrentUICulture jest co potrzebujesz zmienić informacje o ładowaniu języków z pliku zasobów, powinieneś również zmienić CurrentCulture na ten sam CultureInfo;

  3. Na koniec upewnij się, że masz odpowiednie pliki zasobów i zapasowy plik zasobów.

użyłem Name własność CultureInfo więc niemiecki byłaby de-DE, angielski en-US itp To powinno załatwić sprawę.

Jeśli potrzebujesz więcej informacji, mógłbym przesłać przykładowy projekt MVC do zbadania.

UPDATE: Jedna surowy sposób robić to, co chcesz, aby odwrócić kolejność odcinków tras do czegoś takiego:

routes.MapRoute(
    name: "NewDefault", 
    url: "{language}/{id}/{action}/{controller}", 
    defaults: new { language = lang, controller = "Home", action = "Index", id = "Category"} 
); 

W ten sposób można wykonać następującą prośbę http://www.your_url.com/de/Kategorien. W tym przypadku kategorien jest mapowane na id zamiast kontrolera. Kontroler pozostaje w języku angielskim lub niemieckim (w zależności od sposobu jego nazwania), ale użytkownik widzi inny język. W tle Twój widok może być coś takiego:

public ActionResult Index(string id, string categoryName) 
{ 
    // Fetch data based on category name (categoryName) 
    return View(); 
} 

Ty mógł przejść Informacje dodatkowe parametry, ale trzeba będzie dostosować trasę do wyglądać tak: {język}/{kategoria}/{podkategorii}/{action}/{controller}

Po prostu wiedz, że na dłuższą metę może to powodować ból szyi, a jeśli to spróbujesz, upewnij się, że dobrze to dokumentujesz.

+0

Witaj Husein, Dziękuję za odpowiedź. Ta implementacja języka wygląda dobrze, ja to zaimplementuję. Ale prawdziwym (podchwytliwym) problemem jest zróżnicowanie między 5 różnymi językami. /EN/Kategorie /NL/Categorieen /DE/Kategorien /FR/kategorie PL/Kategorie ... powinien wszystko wskazuje na tym samym kontrolerze. Nie jestem pewien, czy to nawet możliwe, może tylko z ograniczeniami dla tych 5 łańcuchów tekstowych ... – stefjnl

+0

Zaktualizowałem swoją odpowiedź z pomysłem, który mi przyszedł. Mam nadzieję, że to pomoże. –

+0

cześć Ron, tylko szefowie, że w końcu zaimplementowałem mniej lub bardziej zaktualizowaną odpowiedź, czyniąc kategorie zmiennymi. routes.MapRoute ( nazwa: "CategoryOverview" url: "{język}/{kategoria}", domyślnie: nowe {language = Lang controller = "Kategorie", action = "Index"} ) ; – stefjnl