10

khó để tìm câu trả lời cho câu hỏi cụ này, bệnh rất pop của nó lên đây:Make URL ngôn ngữ cụ thể (thông qua các tuyến đường)

Chúng tôi muốn xây dựng lên các url của chúng tôi hoàn toàn ngôn ngữ cụ thể, có nghĩa là

www.mysite.com/EN

www.mysite.com/DE

này được thực hiện trong RouteConfig với

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

Nhưng sau đó một phần khó khăn:

www.mysite.com/EN/Categories

www.mysite.com/DE/Kategorien

Tức là làm cho tên người điều khiển xuất hiện bằng nhiều ngôn ngữ, nhưng trỏ tới cùng một bộ điều khiển. Điều này thậm chí có thể?

+0

Xem [văn bản ASP.NET MVC 5 trong tuyến đường và url] (http://stackoverflow.com/a/32839796/181087) để có giải pháp hoàn chỉnh. – NightOwl888

Trả lời

13

Vâng, điều này là một phần có thể (chỉ phần ngôn ngữ). Tên bộ điều khiển bằng một ngôn ngữ khác chắc chắn là một điểm thú vị, nhưng tôi nghĩ thật khó để đạt được điều đó. Hãy suy nghĩ về những gì nó sẽ giống như cho các ngôn ngữ Bidi như tiếng Ả Rập và tiếng Do Thái. Nó có thể là một ý tưởng tốt để sử dụng bộ điều khiển trong các ngôn ngữ khác nhau nhưng bạn sẽ tạo ra một sự tàn phá cho chính mình và tôi tin rằng bạn sẽ phải thay đổi cấu trúc MVC cơ bản để cho phép điều này.

Phần thay đổi ngôn ngữ thật dễ dàng và có thể được thực hiện như bên dưới.

Điều bạn có thể muốn xem là toàn cầu hóa. Về cơ bản phần ngôn ngữ tương ứng với văn bản giao diện người dùng chủ đề hiện tại. Những gì bạn cần là những điều sau đây:

  1. Xác định một con đường, một cái gì đó như thế này:

    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. Đăng ký Application_AcquireRequestState và định nghĩa nó một cái gì đó như thế này:

    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; 
    } 
    

    Mặc dù CurrentUICulture là gì bạn cần chuyển đổi ngôn ngữ tải thông tin từ một tệp tài nguyên, bạn cũng nên thay đổi CurrentCulture thành cùng một CultureInfo;

  3. Cuối cùng, hãy đảm bảo bạn có tệp tài nguyên tương ứng và tệp tài nguyên dự phòng.

tôi đã sử dụng tài sản của NameCultureInfo vì vậy bạn Đức sẽ được de-DE, tiếng Anh en-US vv này nên làm các trick.

Trong trường hợp bạn cần thêm thông tin, tôi có thể tải lên dự án mẫu MVC để bạn kiểm tra.

UPDATE: Một cách thô làm những gì bạn muốn là để đảo ngược thứ tự của các đoạn đường đến một cái gì đó như thế này:

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

Bằng cách này bạn có thể thực hiện một yêu cầu sau đây http://www.your_url.com/de/Kategorien. Trong trường hợp này, Kategorien ánh xạ tới id thay vì một bộ điều khiển. Bạn điều khiển vẫn bằng tiếng Anh hoặc tiếng Đức (tùy thuộc vào cách bạn đặt tên nó) nhưng người dùng sẽ thấy một ngôn ngữ khác. Trong nền nhìn của bạn có thể là một cái gì đó như thế này:

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

Bạn có thể vượt qua thêm thông tin như thông số, nhưng bạn sẽ cần phải điều chỉnh tuyến đường của bạn để tìm một cái gì đó như: {ngôn ngữ}/{loại}/{tiểu thể loại}/{action}/{controller}

Chỉ cần biết rằng điều này có thể trở thành cơn đau ở cổ trong thời gian dài và nếu bạn thử điều này, thì hãy đảm bảo bạn ghi lại tài liệu tốt.

+0

Hi Husein, Cảm ơn câu trả lời của bạn. Việc thực hiện ngôn ngữ đó có vẻ tốt, tôi sẽ thực hiện nó như thế. Nhưng vấn đề thực sự (khó khăn) là sự khác biệt giữa 5 ngôn ngữ khác nhau sau đó. /EN/Categories /NL/Categorieen /DE/Kategorien /FR/loại PL/Kategorie ... nên tất cả các điểm đến bộ điều khiển tương tự. Tôi không chắc liệu điều đó có khả thi hay không, có lẽ chỉ với những ràng buộc cho 5 đoạn văn này ... – stefjnl

+0

Tôi đã cập nhật câu trả lời của mình với một ý tưởng đã xảy ra với tôi. Hy vọng nó giúp. –

+0

hi Ron, chỉ cần một đầu lên rằng tôi cuối cùng thực hiện nhiều hơn hoặc ít hơn câu trả lời cập nhật của bạn, làm cho các loại một biến. routes.MapRoute ( tên: "CategoryOverview", url: "{ngôn ngữ}/{loại}", giá trị mặc định: mới {language = lang, controller = "Categories", action = "Index"} ) ; – stefjnl

Các vấn đề liên quan