2011-10-19 3 views
2

Je développe multilingue pages asp.net site mvc. La langue stocke dans l'URL. Celui par défaut sera l'anglais. Je BaseController classeMultilanguages ​​asp.net site mvc et routage

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); 
     } 

et quelques routes

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" } 
      ); 

    } 

Je veux faire ce qui suit: si la langue actuelle est l'anglais l'URL ne doit pas contenir « en-us » valeur, parce que les Anglais est la langue par défaut. Et vice versa: s'il n'y a pas de paramètre "culture" dans l'URL (c'est-à-dire dans RouteData.Values["culture"]) alors la langue par défaut est l'anglais.

Comment puis-je le faire?

MISE À JOUR: la clarification sur ce que je veux. La page principale (_Layout.cshtml) contient le lien vers la page "About site"

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

Si le site en anglais il pointe /en-us/about. Mais je veux (si le site en anglais) il faut pointer vers /about (sans en-us).

+0

Vous faites fondamentalement la culture nécessaire dans chaque demande, il devra donc être inclus dans chaque demande. Par défaut, le premier paramètre sera toujours la culture. Donc, si c'est «/ home», alors «home» devient la culture. Ce n'est pas la chose la plus facile à faire. Les itinéraires sont-ils définis ou pouvez-vous les changer? – Buildstarted

+0

Je peux les changer. – Alexandre

+0

Vous voudrez probablement déplacer la culture vers le dernier élément et en faire le '{* culture}' mais ce n'est toujours pas facile. Vous devrez peut-être créer une contrainte de route et dupliquer toutes vos routes sans le paramètre de culture. – Buildstarted

Répondre

1

Le problème avec cette configuration d'itinéraire est de décider si le premier jeton de l'itinéraire est un nom de culture valide. Par exemple, vous devrez faire face à des routes comme:

  • /fr-FR/home/index
  • /home/index

Dans le premier cas culture="fr-FR" et dans le second culture="home". Donc, pour faire face à cela, vous pouvez essayer quelque chose comme:

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

C'est un bon conseil. Mais que dois-je faire avec mon problème? – Alexandre

+0

@AlexMaslakov, quel est votre problème? –

+0

<< Si la langue actuelle est l'anglais, l'url ne doit pas contenir la valeur "en-us", car l'anglais est la langue par défaut. Et vice-versa: s'il n'y a pas de paramètre "culture" dans url (c'est-à-dire dans RouteData.Values ​​["culture"]) alors la langue par défaut est l'anglais >> Dans les autres termes: comment supprimer les valeurs supplémentaires " us "de l'url si la culture par défaut est l'anglais? – Alexandre