使 URL 語言特定(通過路由)
很難找到這個特定問題的答案,所以在這裡彈出它:
我們希望建立完全特定於語言的網址,這意味著
這是在 RouteConfig 中完成的
url: "{language}/{controller}/{action}/{id}"但接下來是棘手的部分:
即使控制器名稱以多種語言出現,但指向同一個控制器。這甚至可能嗎?
好吧,這是部分可能的(僅限語言部分)。不同語言的控制器名稱絕對是一個有趣的點,但我認為很難做到這一點。想想像阿拉伯語和希伯來語這樣的比迪語會是什麼樣子。在不同的語言中使用控制器可能是一個好主意,但你會給自己造成嚴重破壞,我相信你必須改變底層的 MVC 結構才能實現這一點。
語言更改部分很容易,可以像下面這樣完成。
你可能想看的是全球化。基本上語言部分對應於目前執行緒 UI 文化。您需要的是以下內容:
- 定義一條路線,如下所示:
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 } );
Application_AcquireRequestState像這樣註冊並定義它: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; }儘管
CurrentUICulture您需要切換語言從資源文件載入資訊,但您也應該將 ; 更改CurrentCulture為相同的CultureInfo; 3. 最後,確保您有相應的資源文件和備用資源文件。我使用
Name了屬性,CultureInfo所以您的德語將是 de-DE、English en-US 等。這應該可以解決問題。如果您需要更多資訊,我可以上傳一個範例 MVC 項目供您檢查。
更新:做你想做的一種粗略的方法是將路線段的順序反轉為如下所示:
routes.MapRoute( name: "NewDefault", url: "{language}/{id}/{action}/{controller}", defaults: new { language = lang, controller = "Home", action = "Index", id = "Category"} );這樣您就可以發出以下請求http://www.your_url.com/de/Kategorien。在這種情況下,類別映射到
id而不是控制器。您的控制器使用英語或德語(取決於您如何命名),但使用者會看到不同的語言。在後台,您的視圖可能是這樣的:public ActionResult Index(string id, string categoryName) { // Fetch data based on category name (categoryName) return View(); }您可以將其他資訊作為參數傳遞,但您需要調整您的路線,使其看起來像:{language}/{category}/{subcategory}/{action}/{controller}
只要知道從長遠來看這可能會成為頸部疼痛,如果您嘗試這樣做,請確保將其記錄好。