2011-10-19 24 views
2

私は複数のasp.net mvcサイトを開発しています。言語はURLに格納されます。デフォルトのものは英語です。 私は多言語asp.net mvcサイトとルーティング

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      string culture = filterContext.RouteData.Values[MvcApplication.CultureParamerName] as string; 
      if (string.IsNullOrWhiteSpace(culture)) 
       culture = Facade.Common.GetLocale(BECulture.Cultures.English);//==en-us 
      Thread.CurrentThread.CurrentCulture = new CultureInfo(culture); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture); 
      base.OnActionExecuting(filterContext); 
     } 

と、いくつかのルートが

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "Photos_Route", 
      "{culture}/photos/{action}/{id}", 
      new { controller = "photos", action = "show", culture = "en-us" } 
      ); 
     routes.MapRoute(
      "PhotosDownload_Route", 
      "{culture}/photos/{action}/{id}/resolution/{measure1}x{measure2}", 
      new { controller = "photos", action = "download", culture = "en-us" } 
      ); 

     routes.MapRoute(
      "Pages_Router", 
      "{culture}/page/{id}", 
      new { controller = "home", action = "page", id = UrlParameter.Optional, culture = "en-us" } 
      ); 

     routes.MapRoute(
      "Tags_Route", // Route name 
      "{culture}/tag/{tag}", // URL with parameters 
      new { controller = "photos", action = "ShowPhotosByTag", culture = "en-us" } // Parameter defaults 
      ); 



routes.MapRoute(
      "Home_Route", 
      "{culture}/{action}", 
      new { controller = "home", culture = "en-us" } 
      ); 

     routes.MapRoute(
      "Default_Route", 
      "{culture}/{controller}/{action}/{id}", 
      new { controller = "home", action = "index", id = 1, culture = "en-us" } 
      ); 

    } 

私は、次のやりたいBaseControllerクラスがあります。現在の言語は英語であるならば、URLは、「EN-US」の値を含めることはできません英語理由デフォルト言語です。逆の場合は:"culture"というURLが(RouteData.Values["culture"]にある)パラメータがない場合、デフォルトの言語は英語です。

私はそれをどのように行うことができますか?

更新:私が望むものについての明確化。英語でのサイトは、それが/en-us/aboutを指している場合、マスターページ(_Layout.cshtml)は、ページ"About site"

@Html.ActionLink(Resources.Strings.About_LinkText, "about", "home") 

へのリンクが含まれています。しかし、私は(英語のサイトであれば)​​(en-usなし)を指す必要があります。

+0

:これに対処するために、あなたはの線に沿って何かを試みることができます。デフォルトでは、最初のパラメータは常にカルチャになります。だから '/ home'なら' 'home''は文化になります。これは最も簡単なことではありません。ルートが設定されているか、ルートを変更できますか? – Buildstarted

+0

私はそれらを変更することができます。 – Alexandre

+0

文化を最後の項目に移動して '{* culture} 'にしたいと思うかもしれませんが、まだ簡単ではありません。経路制約を作成し、培養パラメータなしですべての経路を複製する必要があるかもしれません – Buildstarted

答えて

1

このルート設定の問題は、ルートの最初のトークンが有効なカルチャ名かどうかを判断することです。

最初のケース culture="fr-FR"には第二 culture="home"
  • /fr-FR/home/index
  • /home/index

:たとえば次のようなルートに対処する必要があります。それはすべての要求に含まれなければならないので、あなたは基本的にすべてのリクエストに必要な文化を作っている

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    string culture = filterContext.RouteData.Values["culture"] as string; 
    var ci = CultureInfo 
     .GetCultures(CultureTypes.AllCultures) 
     .FirstOrDefault(x => x.Name == culture); 
    if (ci == null) 
    { 
     // we couldn't find a suitable culture => fallback to default 
     ci = new CultureInfo("en-US"); 
    } 

    Thread.CurrentThread.CurrentCulture = ci; 
    Thread.CurrentThread.CurrentUICulture = ci; 
    base.OnActionExecuting(filterContext); 
} 
+0

良いアドバイスです。しかし私は私の問題をどうしたらいいですか? – Alexandre

+0

@AlexMaslakov、あなたの問題は何ですか? –

+0

<<現在の言語が英語の場合、英語がデフォルト言語であるため、urlには "en-us"値を含めてはいけません。また、逆もあります:URLにパラメータ "culture"がない場合(RouteData.Values ["culture"])、デフォルトの言語が英語に設定されています>>他の言葉:余分な値を削除する方法en-デフォルトの文化が英語の場合、urlからus? – Alexandre