Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Cómo crear un sitio web multiidioma en Silex

12 de diciembre de 2014

Hola!! ¿Es posible en Silex crear una aplicación multiidioma?

Pregunto esto porque estoy trasteando con Silex para crear una aplicación multiidioma y me encuentro con el problema que no consigo que haga routing a las siguientes urls:

$app->mount("/{_locale}/contacto", new Sunday\Controllers\contactoController()); // español
$app->mount("/{_locale}/contacte", new Sunday\Controllers\contactoController()); // catalán
$app->mount("/{_locale}/contact",  new Sunday\Controllers\contactoController()); // inglés

Sólo se ejecuta el último mount() que ponga en cualquier caso.

He indagado un poco y he intentado crear las rutas de forma dinámica como se explica en este capítulo del manual de Symfony y tampoco consigo que funcione. (No se si esto no es válido para Silex)

Soy nuevo en esto y no se si lo que intento es viable o no y por eso recurro a vosotros por si me podéis ayudar en este asunto con algún ejemplo o documentación.

Saludos y gracias de antemano.


Respuestas

#1

Sí que puedes crear un sitio web multiidioma con Silex, aunque no es tan cómodo como hacerlo con Symfony. De hecho, es bastante incómodo, tal y como se explica en el apéndice sobre traducción del manual de Silex.

Con respecto al problema concreto que te está sucediendo en este caso, mi sospecha es que en el controlador contactoController() estás asignando nombres a las rutas mediante el método bind(). Por supuesto asignar nombres a las rutas es algo normal, pero en este caso estás montando tres veces el mismo controlador. Como las rutas tienen el mismo nombre en cada caso y como cada ruta sólo puede estar asociada a una URL, cada nueva ruta duplicada va machacando a la anterior y por eso siempre gana la última.

En una aplicación Silex local he hecho la prueba de montar tres veces el mismo controlador usando diferentes prefijos y se producía el mismo error que comentas. Al mostrar el número de rutas montadas en la aplicación con $app['routes']->count(), me salía 68. Después he hecho la prueba de duplicar el controlador en una clase con otro nombre y el número de rutas era el mismo. Por último, he empezado a cambiar el nombre de las rutas de este segundo controlador y a cada ruta que cambiaba, aumentaba en una unidad el número de rutas de la aplicación.

Si usas los ServiceController de Silex, podrías utilizar lo siguiente para crear una única ruta asociada a los tres posibles idiomas del sitio:

$controllers
    ->get('/{_locale}/{nombre}', ...)
    ->assert('nombre', 'contact|contacto|contacte')
    ->bind('contact')
;

@javiereguiluz

12 diciembre 2014, 22:48