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?
-
#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 objetoRequest
(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.
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.
Proyectos Symfony destacados
La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más
Síguenos en @symfony_es para acceder a las últimas noticias.