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

Publicada el

19 de abril de 2018

Etiquetas

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.