Nuevo en Symfony 4.1: Traducción de rutas
El componente Routing fue mejorado recientemente para convertirlo en el router más rápido que existe en PHP. Ahora, justo a tiempo para incluirla en Symfony 4.1, le hemos añadido otra funcionalidad increíble: las rutas se pueden traducir a diferentes idiomas.
Gracias a esta funcionalidad, ya puedes hacer que el path
de la ruta sea
diferente en función del idioma del usuario. Ni que decir tiene que esta
funcionalidad es básica para las aplicaciones internacionalizadas y por eso
algunos bundles de terceros como JMSI18nRoutingBundle tienen millones de
descargas. En Symfony 4.1 hemos integrado esta funcionalidad en el propio
componente Routing por lo que está disponible en cualquier aplicación Symfony
sin tener que instalar ningún bundle.
En la práctica, si quieres traducir una ruta solo tienes que pasar a su opción
path
un array de paths por idioma:
contact: controller: App\Controller\ContactController::send path: en: /send-us-an-email nl: /stuur-ons-een-email
También puedes definir los paths usando el formato XML o las anotaciones PHP:
use Symfony\Component\Routing\Annotation\Route; class ContactController { /** * @Route({ * "en": "/send-us-an-email", * "nl": "/stuur-ons-een-email" * }, name="contact") */ public function send() { // ... } }
Internamente Symfony crea una ruta por cada idioma (en el ejemplo anterior, se
crean las rutas contact.en
y contact.nl
) pero puedes seguir usando el nombre
original de la ruta para generar las URLs.
Cuando se genera una URL, se usa por defecto el idioma del usuario actual, pero puedes pasar el idioma explícitamente para forzar la generación de una determinada URL:
/** @var UrlGeneratorInterface $urlGenerator */ // si no se indica nada, se usa el idioma del usuario actual $url = $urlGenerator->generate('contact'); // también puedes indicar el idioma explícitamente (genera: '/stuur-ons-een-email') $url = $urlGenerator->generate('contact', ['_locale' => 'nl']); // esto también funcionaría, pero no se recomienda para no lidiar con cadenas concatenadas // $url = $urlGenerator->generate('contact.nl');
Los prefijos de las rutas también se pueden traducir (tanto en YAML/XML como en
la anotación @Route
) y puedes combinarlo tanto con rutas traducidas como con
rutas sin traducir:
# config/routes/annotations.yaml site: resource: '../src/Controller/' type: annotation prefix: en: '/site' es: '/sitio'
class DefaultController extends Controller { /** * @Route({"en": "/contact", "es": "/contacto"}, name="contact") */ public function contact() { // ... } /** * @Route("/page/{slug}", name="page") */ public function page($slug) { // ... } }
En este ejemplo, las cuatro rutas generadas serían:
Nombre de la ruta | Path de la ruta |
---|---|
contact.en |
/site/contact |
contact.es |
/sitio/contacto |
page.en |
/site/page/{slug} |
page.es |
/sitio/page/{slug} |
Esta funcionalidad fue contribuida por Frank de Jonge en el pull request #26143.
Fuente: New in Symfony 4.1: Internationalized routing
Comentarios
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.