2012-12-05 161 views
0

我是ASP.NET的新手,我想設計一個多語言網站。
我想讓用戶從主頁頂部的菜單欄中選擇他們的語言,並讓他們在網頁瀏覽器的地址欄中看到它。
做,所以我說下面代碼RouteConfig類:ASP.NET MVC 4全球化

所有的
routes.MapRoute(
     name; "Default", 
     url: "{lang}/{controller}/{action}/{id}", 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ) 

首先,我不能在CurrentThread設置CultureInfo。我創建了CultureController,並在那裏根據用戶的選擇設置了語言。在其他視圖和控制器中不會更改。 (我聽說每個用戶得到一個線程,當他們進入網站)

 public ActionResult ChangeLanguage (string lang, String returnUrl = null) 
     { 
      if (!new[] { "en", "fr", "ar" }.Contains(lang)) 
       throw new ArgumentException("Language not supported."); 

      Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(lang); 

      if (returnUrl == null) 
       return RedirectToAction("Index", "Home"); 

      return Redirect(returnUrl); 
     } 

問題二:現在我應該在我的鏈接通過郎太,我不想要。例如:

@Html.ActionLink("About", "About", "Home") 

不起作用了。我希望lang參數根據存儲在CurrentThread或Session中的CultureInfo進行填充。 (我目前使用Session)。 (這是甚至可能?? ??)
我感謝任何幫助。

回答

1
  1. 創建行動,改變像你一樣
  2. 選擇從您的列表選擇一種語言或默認的語言(摔不 例外!)
  3. 儲存於一個cookie
  4. 充分利用重定向到引用者站點(不需要通過 通過參數)
  5. 通過讀取cookie在Controller初始化方法 (創建基本Controller類來執行此操作)中設置線程的語言3210(如果不存在或無效設置默認,再次發送Cookie )
+0

非常感謝您的回覆! 但我還有一個問題,你說「把重定向傳遞給引用者站點」。我該怎麼做呢?我認爲我應該根據用戶選擇的語言鏈接「/ Home/About」。URL訪問者應該看到的是「en/Home/About」,但我想用@ Html.ActionLink(「About」 「About」,「Home」)',並讓lang參數根據線程的語言自動附加到URL(反之亦然,根據lang param更新)(原因是當你分享一個法語URL時期望別人看到英文和搜索引擎的鏈接。) – Ashkan

+0

和另一件事(如果有幫助)我在每個語言的DB中都有3列。 (例如我有3個標題欄TitleAR,TitleEN,TitleFR)。我想爲我的模型添加Title屬性,以便根據所選語言返回適當的語言。現在線程的語言在所有的代碼中都是不同的,我應該從Cookie中讀取語言。在Controller的init方法中設置線程的lang是否解決了這個問題? – Ashkan

+0

您需要創建包含參數的路由,例如將其稱爲「lang」(路由模式將如下所示:「{lang}/{controller}/{action}」)。您將在路由的數據收集中使用lang參數,因此在選擇語言時,請更改此參數,然後重新指定HttpResponse.RedirectToRoute(string,RouteValueDictionary))。 ##是的,它會解決「標題屬性」問題。 –