Symfony 2.2 podría incluir la negociación automática de contenido

Symfony 2.2 podría incluir soporte para la negociación automática de contenido, tal y como se describe en el pull request 5711 del repositorio de Symfony. El mecanismo de negociación de contenido se describe en el estándar de HTTP y es algo que tu navegador hace cada vez que solicita una página.

Si utilizas Firebug o una herramienta similar para observar las cabeceras HTTP de cualquier petición que realice tu navegador, verás algo como lo siguiente:

Accept           text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding  gzip, deflate
Accept-Language  es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Cache-Control    max-age=0
...

Observa cómo las cabeceras Accept y Accept-Language indican una serie de valores junto con parámetros q (del inglés quality). El valor de este parámetro varía entre 0 y 1 e indica la preferencia que tiene cada opción de la cabecera. Así, los contenidos en español tienen una preferencia de 0.8, seguidos de los contenidos en inglés de Estados Unidos (0.5) y los contenidos en cualquier otro inglés (0.3).

Cuando tu navegador realiza esa petición, el servidor comprueba si el contenido solicitado está disponible en varios formatos y/o idiomas. Si no existen variantes, sirve el único contenido disponible sin hacer caso a tus preferencias. Si el contenido dispone de diversas variantes, el servidor trata de elegir la que mejor se adapta a tus preferencias.

Todos los servidores web soportan la negociación de contenido desde hace tiempo, como por ejemplo se explica en la documentación de Apache 2.2. Ahora, y si todo sale bien, Symfony 2.2 incluirá esta característica de serie, lo que te permitirá definir rutas como la siguiente:

ofertas_index:
    pattern: /ofertas.{_locale}.{_format}
    requirements:
        _locale: en|es|fr
        _format: html|json|xml
    options:
        negotiate: [_locale, _format]

Mediante la clave options, la ruta indica que dos de sus parámetros son negociables (_locale y _format). Si un usuario realiza una petición que acepta varios idiomas, Symfony 2.2 seleccionará automáticamente el idioma más apropiado. Si la petición no incluye ninguno de los idiomas soportados (en, es, o fr), Symfony 2.2 responderá con el error 406 de HTTP (Not acceptable).

La negociación automática de contenido por el momento solo es una prueba de concepto, por lo que podría finalmente no incluirse en Symfony 2.2. Puedes ver la larguísima discusión sobre el tema en el pull request 5711 y también puedes ver una prueba real de su uso en el gist 3872155.

Comentarios

  1. Gracias Javier. Yo pensaba que esto ya lo tenía Symfony. Entonces, si con la versión actual de symfony yo quiero que una web detecte el idioma del navegador ¿cómo lo tendría que hacer? ¿por javascript y luego redirigiendo a midominio.com/es o /en por ejemplo?

    Jorge Fabá Ferrández el 31 de octubre de 2012, 10:41:30

  2. Jorge, Symfony2 tiene algo similar, pero no es automático. Para detectar automáticamente el mejor idioma para cada usuario, puedes utilizar el método getPreferredLanguage() del objeto Request (ver detalles en la API de Symfony2).

    Lo que se propone ahora es que esta gestión del idioma preferido (o del formato preferido) se realice automáticamente.

    Javier Eguiluz el 2 de noviembre de 2012, 9:41:37

Este artículo ya no permite añadir más comentarios.
¿Por qué? Los artículos cierran sus comentarios automáticamente unos meses después de su publicación para asegurar que estos sigan siendo relevantes.

Publicada el

27 de octubre de 2012

Etiquetas

Proyectos Symfony destacados

La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.