2014-02-20 72 views
0

我試圖做一個頁面3種語言。覆蓋默認語言MVC4 RESX文件

英語,丹麥語,西班牙語。

我使用的語言的resx文件,我做了它工作,所以我現在可以看到,如果我的系統設置爲英語我會英語或丹麥會給丹麥的語言。 但是我試圖實現一個覆蓋功能,所以我可以通過一個按鈕手動更改頁面上的語言我想象它會是3個標誌按鈕來更改語言。不過,我似乎無法重寫語言。而且我遇到了更多的問題,而不僅僅是堅持使用默認設置。

這裏是如何我已經設置了我的一些事情:

我建立了我的路線是這樣的:

routes.MapRoute(
      name: "DefaultLocalized", 
      url: "{language}-{culture}/{controller}/{action}/{id}", 
      defaults: new 
      { 
       controller = "Home", 
       action = "Index", 
       language = "da", 
       culture = "DK", 
       id = UrlParameter.Optional } 
     ); 
     routes.MapRoute(
      name: "DefaultInternationalized", 
      url: "{language}-{culture}/{controller}/{action}/{id}", 
      defaults: new 
      { 
       controller = "Home", 
       action = "Index", 
       language = "en", 
       culture = "UK", 
       id = UrlParameter.Optional 
      } 
     ); 
     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

當我嘗試這似乎我不能夠使用最後一個默認路由。 ,當我嘗試重寫我的語言,它是默認設置爲丹麥這樣我就可以看到英文頁面的URL果然讀EN-UK /主頁,但語言依然是我的瀏覽器默認語言。

我試圖做一個過濾器這樣

public class InternationalizationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     string language = (string)filterContext.RouteData.Values["language"]; //?? "da"; 
     string culture = (string)filterContext.RouteData.Values["culture"];// ?? "DK"; 

     Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture)); 
     Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture)); 

    } 

我的希望是,這將激活並決定語言,但現在看來,這從來不會。

我在這條道路的resx文件。

View/Languages/ 

這些名字

Resources.resx 
Resources.da-DK.resx 
Resources.es-ES.resx 

我想知道我要去還是什麼我失蹤。 我的想法是,我可以在

mydomain/Home 

在用戶的默認語言本地化進入正常的頁面。 然後在訪問覆蓋的語言:

mydomain/en-UK/Home 
mydomain/da-DK/Home 
mydomain/es-ES/Home 

但似乎工作方式不會。我還沒有補充,所以西班牙語可以工作,因爲我正在考慮首先使用丹麥語和英語。

有人告訴我,我錯過了什麼。或者詢問我是否提供了有關我的問題的足夠細節。

+0

我想根據我的解決辦法來糾正發佈Akh製成。它確實解決了一些事情,現在網站總是出現。但是它總是以我的語言出現,而不是重寫的語言。 以及默認路由,它應該是瀏覽器決定自動將其他頁面指向da-DK網址,而不是停留在那裏,如果頁面自己決定它應該保持標準域url。如果用戶想要覆蓋它應該去da-DK或其他任何人。 還有一個問題,當我嘗試用en-GB覆蓋它時,它仍然顯示爲丹麥語 – Helbo

回答

1
routes.MapRoute(
     name: "DefaultInternationalized", 
     url: "{language}-{culture}/{controller}/{action}/{id}", 
     defaults: new 
     { 
      controller = "Home", 
      action = "Index", 
      language = "en", 
      culture = "UK", 
      id = UrlParameter.Optional 
     } 
    ); 

代碼的第一個問題是en-UK是英國的錯誤文化。它是en-GB。

2你沒有在route.MapRoute中設置默認文化。 使用此代碼

 routes.MapRoute(
      "DefaultLocalized", 
      "{language}-{culture}/{controller}/{action}/{id}", 
      new 
      { 
       controller = "Home", 
       action = "Index", 
       language = "da", 
       culture = "DK", 
       id = UrlParameter.Optional 
      } 
     ); 
     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new 
      { 
       controller = "Home", 
       action = "Index", 
       language = "en", 
       culture = "US", 
       id = UrlParameter.Optional 
      } // Parameter defaults 
     ); 

或者你可以改變你的過濾器默認的文化是這樣的: -

public class InternationalizationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     string language = (string)filterContext.RouteData.Values["language"]; //?? "da"; 
     string culture = (string)filterContext.RouteData.Values["culture"];// ?? "DK"; 
     language = language == null ? "en" : language; 
     culture = culture == null ? "US" : culture; 

     Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture)); 
     Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(string.Format("{0}-{1}", language, culture)); 

    } 
} 

文化信息看看這個link

+0

感謝您的回答。 現在看來它有點作用。 現在的問題是,我是選擇默認語言的人,我希望瀏覽器選擇默認語言,並且用戶能夠覆蓋默認語言。 另一件事是該語言永遠不會改變爲EN-GB,即使網址發生變化,它也僅僅停留在丹麥語中。當我點擊一個鏈接時,在默認路由中,它會在url中變成da-DK前綴,我只想讓默認路由的行爲保持原樣。沒有改變到任何其他的網址。 – Helbo

+0

我現在開始工作了,看起來我只是讀了你的文章,以及我已經做了幾次,然後纔想出來。非常感謝。 – Helbo