es necesario llamar a $this->get('session')->setLocale($locale)
(reemplace 'sesión' por 'solicitud' para Symfony 2.1) dentro de su controlador.
He creado un formulario, a la que pasa una matriz de idiomas:
<?php
class LanguageType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$langs = $options['languages'];
$langs = array_combine($langs, $langs);
foreach ($langs as &$lang) {
$lang = \Locale::getDisplayName($lang);
}
$builder->add('language', 'choice', array(
'choices' => $langs,
'required' => false,
));
}
public function getDefaultOptions(array $options)
{
return array(
'languages' => array('fr_FR', 'en_GB'),
'csrf_protection' => false,
);
}
public function getName()
{
return 'my_language';
}
}
que entregar esta forma a una acción separada en un controlador, en el que establecer la configuración regional y regresar a una redirección última página:
<?php
class LanguageController extends Controller
{
public function switchLanguageAction()
{
$form = $this->get('form.factory')->create(
new LanguageType(),
array('language' => $this->get('session')->getLocale()),
array('languages' => $this->container->getParameter('roger.admin.languages', null))
);
$request = $this->get('request');
$form->bindRequest($request);
$referer = $request->headers->get('referer');
if ($form->isValid()) {
$locale = $form->get('language')->getData();
$router = $this->get('router');
// Create URL path to pass it to matcher
$urlParts = parse_url($referer);
$basePath = $request->getBaseUrl();
$path = str_replace($basePath, '', $urlParts['path']);
// Match route and get it's arguments
$route = $router->match($path);
$routeAttrs = array_replace($route, array('_locale' => $locale));
$routeName = $routeAttrs['_route'];
unset($routeAttrs['_route']);
// Set Locale
$this->get('session')->setLocale($locale);
return new RedirectResponse($router->generate($routeName, $routeAttrs));
}
return new RedirectResponse($referer);
}
}
funciona con cualquier localización válida (los pases como opción de 'lenguaje', mientras que la creación de su forma), a condición de que la extensión Intl PHP está habilitado. Si no es así, deberá reemplazar \Locale::getDisplayName($lang)
por una lista de nombres de configuración regional creada manualmente.
sí, es lo que he hecho para cada página, sin embargo me gustaría dejar también al usuario elegir el idioma que le gustaría seleccionándolo de una lista. – cvsoftware