ASP.NET MVC, SEO y diferentes idiomas

Un valor muy importante de nuestras webs públicas es su posicionamiento en los motores de búsqueda. Si a ello le añadimos que debemos de soportar múltiples idiomas y que queremos aparecer bien posicionados en las búsquedas en diferentes lenguajes de los buscadores, el tema se puede poner bastante divertido.

Hay que tener en cuenta que los buscadores van a realizar su indexación sin especificar una culture en su petición, por lo que las técnicas de obtener la culture del usuario a través de la petición o de una cookie o similar no van a funcionar.

Otro aspecto a tener en cuenta es que los buscadores solo indexarán un idioma por url. ¿Esto qué quiere decir? Si, por ejemplo, tenemos la url http://myshop.com y dependiendo de la culture de la petición vamos a mostrar la página en un idioma u otro, el bot del buscador solo indexará la url para un idioma, que será el que tengamos configurado por defecto, para esa url.

Si queremos tener nuestra web correctamente indexada para inglés, español y alemán debemos tener algo similar a esto:

http://myshop.com/es

http://myshop.com/de

http://myshop.com/en

Así incluso podremos facilitarle al buscador un sitemap.xml con estas url para su indexación en varios idiomas.

¿Dónde entra ASP.NET MVC en todo esto? Pues si hemos desarrollado nuestra web con esta tecnología, podemos contar con la ventaja del sistema de enrutamiento. Registrando la siguiente ruta:

routes.MapRoute("Default",
                "{culture}/{controller}/{action}/{id}",
                 new { 
                      controller = "Home", 
                      action = "Index", 
                      id = UrlParameter.Optional, 
                      culture = "en" }  
                 );
Y teniendo un controlador base similar a este:
public class BaseController : Controller
{        
   public string CurrentLanguage { get; set; }         
   protected override void OnActionExecuting(ActionExecutingContext filterContext)
   {
             if (filterContext.RouteData.Values["culture"] != null)
             {                 
                 string culture = filterContext.RouteData.Values["culture"].ToString().ToLower();
                 if (culture == "es" || culture == "en" || culture == "de")
                 {                     
                     CurrentLanguage = culture;                     
                     Thread.CurrentThread.CurrentCulture 
                                                = CultureInfo.CreateSpecificCulture(CurrentLanguage);
                     Thread.CurrentThread.CurrentUICulture 
                                                = CultureInfo.CreateSpecificCulture(CurrentLanguage);
                 }             
              }             
     base.OnActionExecuting(filterContext);         
    }     
}
Podremos redigir automáticamente a nuestras vistas con la cultura adecuada.
Para cargar una u otra vista, dependiendo de su idioma hay múltiples técnicas, hay programadores que prefieren utilizar las mismas 
vistas y cargar diferentes ficheros de recursos y hay otros que prefieren tener diferentes vistas en cada uno de los idiomas. 
Yo prefiero una mezcla de las dos soluciones:
- Me gusta tener las cadenas en un fichero de recursos porque se pueden localizar y traducir más facilmente. Además, se pueden especificar las etiquetas lang, meta description y meta keywords para una mejor indexación por parte del bot del buscador.
- Y me gusta tener diferentes vistas por idioma porque, dependiendo del idioma utilizado, las cadenas de texto pueden ocupar una u otra longitud, por lo que, por cuestiones de diseño,
esta opción puede ser interesante.

Publicado por

Vicente García Diez

Mi nombre es Vicente García Diez y soy arquitecto empresarial, experto en tecnologías Microsoft y transformaciones digitales complejas. Soy socio director y Trusted Advisor en abstratio En mi blog trataré temas de Estrategia IT y lecciones aprendidas en mis proyectos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *