I am using Silex and Twig for a website and I want to allow the user to change the langage of the site.
My problem
Right now, it works if I change the locale in the URL :
/my-account
: my page content is in English (default _locale)
/fr/my-account
: my page content is in French
/en/my-account
: my page content is in English
How can I do the do the same by clicking on an html element?
I am looking for some idea to solve my problem and some good practice to do this "the right way" if possible.
My code
Here is the Silex component I use to manage the 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;
});
Here is my html for the user to change the langage:
<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>
Now my jQuery to get the value :
$(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);
}
});
});
});
My Ajax controller :
$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');
If I do this, my Ajax success console.log(resp);
give me en
as I want.
Some ideas / questions about how to do it
- Is it a good idea to do it with an Ajax call?
- If I change
fr
byen
in my url it works, is it a good idea to try to do it in javascript usingwindow.location.href
for example? (I think not but still asking) - I saw this solution for an other problem and try it in my controller but I get this error :
500 (Internal Server Error)
(I did the same, with$new_langue
instead of$app['defaultLanguage']
and with the right name for my homepage).
It's the first time I create a full website with Silex and I'm beginner with php framework so if someone can help to achieve what I want...thanks by advance !
EDIT :
According to the anwser I get and what I want to achieve, is it possible to change the locale and staying in the same page with Silex / Twig?
For example, this give me the current route : global.request.get('_route')
and this global.request.get('_locale')
give me the locale.
If I take the example of my Home Page, this is how my controller look right now (I just show the template) :
$app->match('/', function (Request $request) use ($app) {
return $app['twig']->render('home.html.twig');
})->bind('home');
As you can see, I have no {_locale} param in my URL. So can I keep this "clean URL" without the {_locale} and make a click that stay in the same page + change the current langage?
I'd like to make somehting like this : <a href="{{ path(global.request.get('_route')), global.request.set('_locale', 'FR') }}">FR</a>
But it won't work for sure...can I do this?