Asp.net-Mvc

使 URL 語言特定(通過路由)

  • January 14, 2019

很難找到這個特定問題的答案,所以在這裡彈出它:

我們希望建立完全特定於語言的網址,這意味著

www.mysite.com/EN

www.mysite.com/DE

這是在 RouteConfig 中完成的

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

但接下來是棘手的部分:

www.mysite.com/EN/Categories

www.mysite.com/DE/Kategorien

即使控制器名稱以多種語言出現,但指向同一個控制器。這甚至可能嗎?

好吧,這是部分可能的(僅限語言部分)。不同語言的控制器名稱絕對是一個有趣的點,但我認為很難做到這一點。想想像阿拉伯語和希伯來語這樣的比迪語會是什麼樣子。在不同的語言中使用控制器可能是一個好主意,但你會給自己造成嚴重破壞,我相信你必須改變底層的 MVC 結構才能實現這一點。

語言更改部分很容易,可以像下面這樣完成。

你可能想看的是全球化。基本上語言部分對應於目前執行緒 UI 文化。您需要的是以下內容:

  1. 定義一條路線,如下所示:
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 }
);
  1. 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}

只要知道從長遠來看這可能會成為頸部疼痛,如果您嘗試這樣做,請確保將其記錄好。

引用自:https://stackoverflow.com/questions/15006572