Silex: permite al usuario cambiar el idioma haciendo clic en el elemento html y manteniendo limpia la URL

Estoy usando Silex y Twig para un sitio web y quiero permitir que el usuario cambie el idioma del sitio.

Mi problema

En este momento, funciona si cambio la configuración regional en la URL:

/my-account: el contenido de mi página está en inglés (predeterminado _locale)

/fr/my-account: el contenido de mi página está en francés

/en/my-account: el contenido de mi página está en inglés

¿Cómo puedo hacer lo mismo haciendo clic en un elemento html?

Estoy buscando alguna idea para resolver mi problema y algunas buenas prácticas para hacer esto "de la manera correcta" si es posible.

Mi código

Aquí está el componente Silex que uso para administrar el multilangue:

// TRANSLATION
$app->register(new Silex\Provider\LocaleServiceProvider());
$app->register(new Silex\Provider\TranslationServiceProvider());
$app->register(new \Pmaxs\Silex\Locale\Provider\LocaleServiceProvider(), [
    'locale.locales' => ['en', 'fr'],
    'locale.default_locale' => 'en',
    'locale.resolve_by_host' => false,
    'locale.exclude_routes' => ['^_']
]);
$app->extend('translator', function($translator, $app) {
    $translator->addLoader('yaml', new YamlFileLoader());

    $translator->addResource('yaml', __DIR__.'/../src/locales/en.yml', 'en');
    $translator->addResource('yaml', __DIR__.'/../src/locales/fr.yml', 'fr');

    return $translator;
});

Aquí está mi html para que el usuario cambie el idioma:

<li id="drop-langue" data-lg="en">
    <span id="current-lg">EN</span> // My current langue
    <div class="drop-langue">
        // The list of langage the user can choose : here ONE -> FR
        <div id="list_langue">
          <a class="change_langue" href="#" data-lg="fr"> <span>FR</span></a> // Could be nice to change the langue staying on the same page
        </div>
    </div>
</li>

Ahora mi jQuery para obtener el valor:

$(document).ready(function() {
    $(".change_langue").on("click", function() {
        var new_langue = $(this).data("lg");

        $.ajax({
            url: "{{ path('new-langue') }}",
            type: 'POST',
            data: {'langue': new_langue},
            success: function (resp) {
                console.log(resp);
            },
            error: function (resp) {
                console.log(resp);
            }
        });
    });
});

Mi controlador Ajax:

$app->match('/new-langue', function (Request $request) use ($app) {
    $new_langue = $request->get('langue');

    // some code to change the langage

    return New Response($new_langue);
})->bind('new-langue');

Si hago esto, mi éxito Ajaxconsole.log(resp); Dameen como yo quiera.

Algunas ideas / preguntas sobre cómo hacerlo¿Es una buena idea hacerlo con una llamada Ajax?Si cambiofr poren en mi url funciona, ¿es una buena idea intentar hacerlo en javascript usandowindow.location.href ¿por ejemplo? (Creo que no pero aún preguntando)Yo viesta solución para otro problema e inténtelo en mi controlador, pero aparece este error:500 (Internal Server Error) (Hice lo mismo, con$new_langue en lugar de$app['defaultLanguage'] y con el nombre correcto para mi página de inicio).

Es la primera vez que creo un sitio web completo con Silex y soy principiante con php framework, así que si alguien puede ayudarme a lograr lo que quiero ... ¡gracias de antemano!

EDITAR:

Según la respuesta que obtengo y lo que quiero lograr, ¿es posible cambiar la configuración regional y permanecer en la misma página con Silex / Twig?

Por ejemplo, esto me da la ruta actual:global.request.get('_route') y estoglobal.request.get('_locale') dame el local.

Si tomo el ejemplo de mi página de inicio, así es como se ve mi controlador en este momento (solo muestro la plantilla):

$app->match('/', function (Request $request) use ($app) {
    return $app['twig']->render('home.html.twig');
})->bind('home');

Como puede ver, no tengo el parámetro {_locale} en mi URL.Entonces, ¿puedo mantener esta "URL limpia" sin la {_locale} y hacer un clic que permanezca en la misma página + cambiar el idioma actual?

Me gustaría hacer algo así:<a href="{{ path(global.request.get('_route')), global.request.set('_locale', 'FR') }}">FR</a>

Pero no funcionará con seguridad ... ¿puedo hacer esto?

Respuestas a la pregunta(4)

Su respuesta a la pregunta