- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: /(unread|starred|archive|all).xml$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
+ - { path: ^/locale, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: /tags/(.*).xml$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/share, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/settings, roles: ROLE_SUPER_ADMIN }
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\Routing\Annotation\Route;
+use Symfony\Component\Validator\Constraints\Locale as LocaleConstraint;
use Wallabag\CoreBundle\Entity\Config;
use Wallabag\CoreBundle\Entity\TaggingRule;
use Wallabag\CoreBundle\Form\Type\ChangePasswordType;
return $this->redirect($request->headers->get('referer'));
}
+ /**
+ * Change the locale for the current user.
+ *
+ * @param Request $request
+ * @param string $language
+ *
+ * @Route("/locale/{language}", name="changeLocale")
+ *
+ * @return \Symfony\Component\HttpFoundation\RedirectResponse
+ */
+ public function setLocaleAction(Request $request, $language = null)
+ {
+ $errors = $this->get('validator')->validate($language, (new LocaleConstraint()));
+
+ if (0 === \count($errors)) {
+ $request->getSession()->set('_locale', $language);
+ }
+
+ return $this->redirect($request->headers->get('referer', $this->generateUrl('homepage')));
+ }
+
/**
* Remove all tags for given tags and a given user and cleanup orphan tags.
*
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
/**
- * Stores the locale of the user in the session after the
- * login. This can be used by the LocaleListener afterwards.
+ * Stores the locale of the user in the session after the login.
+ * If no locale are defined (if user doesn't change it from the login screen), override it with the user's config one.
+ *
+ * This can be used by the LocaleListener afterwards.
*
* @see http://symfony.com/doc/master/cookbook/session/locale_sticky_session.html
*/
{
$user = $event->getAuthenticationToken()->getUser();
- if (null !== $user->getConfig()->getLanguage()) {
+ if (null !== $user->getConfig()->getLanguage() && null === $this->session->get('_locale')) {
$this->session->set('_locale', $user->getConfig()->getLanguage());
}
}
use FOS\UserBundle\Event\UserEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpFoundation\Session\Session;
use Wallabag\CoreBundle\Entity\Config;
/**
private $readingSpeed;
private $actionMarkAsRead;
private $listMode;
+ private $session;
- public function __construct(EntityManager $em, $theme, $itemsOnPage, $rssLimit, $language, $readingSpeed, $actionMarkAsRead, $listMode)
+ public function __construct(EntityManager $em, $theme, $itemsOnPage, $rssLimit, $language, $readingSpeed, $actionMarkAsRead, $listMode, Session $session)
{
$this->em = $em;
$this->theme = $theme;
$this->readingSpeed = $readingSpeed;
$this->actionMarkAsRead = $actionMarkAsRead;
$this->listMode = $listMode;
+ $this->session = $session;
}
public static function getSubscribedEvents()
$config->setTheme($this->theme);
$config->setItemsPerPage($this->itemsOnPage);
$config->setRssLimit($this->rssLimit);
- $config->setLanguage($this->language);
+ $config->setLanguage($this->session->get('_locale', $this->language));
$config->setReadingSpeed($this->readingSpeed);
$config->setActionMarkAsRead($this->actionMarkAsRead);
$config->setListMode($this->listMode);
- "%wallabag_core.reading_speed%"
- "%wallabag_core.action_mark_as_read%"
- "%wallabag_core.list_mode%"
+ - "@session"
tags:
- { name: kernel.event_subscriber }
{{ form_start(form, {'method': 'post', 'action': path('fos_user_registration_register'), 'attr': {'class': 'fos_user_registration_register'}}) }}
<div class="card-content">
<div class="row">
-
{{ form_widget(form._token) }}
{% for flashMessage in app.session.flashbag.get('notice') %}
{% block fos_user_content %}
{% endblock fos_user_content %}
</div>
+ <div class="center">
+ <a href="{{ path('changeLocale', {'language': 'de'}) }}">Deutsch</a> –
+ <a href="{{ path('changeLocale', {'language': 'en'}) }}">English</a> –
+ <a href="{{ path('changeLocale', {'language': 'fr'}) }}">Français</a>
+ </div>
</div>
</main>
{% endblock %}
$client->request('GET', '/config/view-mode');
}
+
+ public function testChangeLocaleWithoutReferer()
+ {
+ $client = $this->getClient();
+
+ $client->request('GET', '/locale/de');
+ $client->followRedirect();
+
+ $this->assertSame('de', $client->getRequest()->getLocale());
+ $this->assertSame('de', $client->getContainer()->get('session')->get('_locale'));
+ }
+
+ public function testChangeLocaleWithReferer()
+ {
+ $client = $this->getClient();
+
+ $client->request('GET', '/login');
+ $client->request('GET', '/locale/de');
+ $client->followRedirect();
+
+ $this->assertSame('de', $client->getRequest()->getLocale());
+ $this->assertSame('de', $client->getContainer()->get('session')->get('_locale'));
+ }
+
+ public function testChangeLocaleToBadLocale()
+ {
+ $client = $this->getClient();
+
+ $client->request('GET', '/login');
+ $client->request('GET', '/locale/yuyuyuyu');
+ $client->followRedirect();
+
+ $this->assertNotSame('yuyuyuyu', $client->getRequest()->getLocale());
+ $this->assertNotSame('yuyuyuyu', $client->getContainer()->get('session')->get('_locale'));
+ }
}
$this->assertNull($session->get('_locale'));
}
+
+ public function testWithLanguageFromSession()
+ {
+ $session = new Session(new MockArraySessionStorage());
+ $listener = new UserLocaleListener($session);
+ $session->set('_locale', 'de');
+
+ $user = new User();
+ $user->setEnabled(true);
+
+ $config = new Config($user);
+ $config->setLanguage('fr');
+
+ $user->setConfig($config);
+
+ $userToken = new UsernamePasswordToken($user, '', 'test');
+ $request = Request::create('/');
+ $event = new InteractiveLoginEvent($request, $userToken);
+
+ $listener->onInteractiveLogin($event);
+
+ $this->assertSame('de', $session->get('_locale'));
+ }
}
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\Session\Session;
+use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
use Wallabag\CoreBundle\Entity\Config;
use Wallabag\UserBundle\Entity\User;
use Wallabag\UserBundle\EventListener\CreateConfigListener;
protected function setUp()
{
+ $session = new Session(new MockArraySessionStorage());
$this->em = $this->getMockBuilder('Doctrine\ORM\EntityManager')
->disableOriginalConstructor()
->getMock();
'fr',
1,
1,
- 1
+ 1,
+ $session
);
$this->dispatcher = new EventDispatcher();