]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge pull request #3216 from wallabag/change-locale-register
authorJérémy Benoist <j0k3r@users.noreply.github.com>
Mon, 15 Oct 2018 08:31:42 +0000 (08:31 +0000)
committerGitHub <noreply@github.com>
Mon, 15 Oct 2018 08:31:42 +0000 (08:31 +0000)
Added possibility to change locale from login/register pages

app/config/security.yml
src/Wallabag/CoreBundle/Controller/ConfigController.php
src/Wallabag/CoreBundle/Event/Listener/UserLocaleListener.php
src/Wallabag/UserBundle/EventListener/CreateConfigListener.php
src/Wallabag/UserBundle/Resources/config/services.yml
src/Wallabag/UserBundle/Resources/views/Registration/register_content.html.twig
src/Wallabag/UserBundle/Resources/views/layout.html.twig
tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php
tests/Wallabag/CoreBundle/Event/Listener/UserLocaleListenerTest.php
tests/Wallabag/UserBundle/EventListener/CreateConfigListenerTest.php

index 98f43011f961bd7d48225c16d9132006937b9a84..0318fce12999c2534938358602cba2aae313883c 100644 (file)
@@ -64,6 +64,7 @@ security:
         - { 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 }
index 242f557f0fad1c4510182db11d43a5094f9db25b..be6feb7cdd21b441229e72a26813f85e37b69c53 100644 (file)
@@ -8,6 +8,7 @@ use Symfony\Component\HttpFoundation\RedirectResponse;
 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;
@@ -329,6 +330,27 @@ class ConfigController extends Controller
         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.
      *
index 367cdfb00b46be2f49c928d2c94a8ce49ee8a01c..dc1db5c7a009d03cbb78b54f577a4514e8bb008d 100644 (file)
@@ -6,8 +6,10 @@ use Symfony\Component\HttpFoundation\Session\Session;
 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
  */
@@ -30,7 +32,7 @@ class UserLocaleListener
     {
         $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());
         }
     }
index e4d55c19746ff78f0df97bc052c464426f57b87d..5cabfd35ae21516d2294047ff13e5e4b5b54e425 100644 (file)
@@ -6,6 +6,7 @@ use Doctrine\ORM\EntityManager;
 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;
 
 /**
@@ -22,8 +23,9 @@ class CreateConfigListener implements EventSubscriberInterface
     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;
@@ -33,6 +35,7 @@ class CreateConfigListener implements EventSubscriberInterface
         $this->readingSpeed = $readingSpeed;
         $this->actionMarkAsRead = $actionMarkAsRead;
         $this->listMode = $listMode;
+        $this->session = $session;
     }
 
     public static function getSubscribedEvents()
@@ -52,7 +55,7 @@ class CreateConfigListener implements EventSubscriberInterface
         $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);
index d3925de3b1f8991ea9bd9029a73418088bd2be4c..72cda3f8a32899797c51b7d5c3402a64df5cb4f2 100644 (file)
@@ -33,6 +33,7 @@ services:
             - "%wallabag_core.reading_speed%"
             - "%wallabag_core.action_mark_as_read%"
             - "%wallabag_core.list_mode%"
+            - "@session"
         tags:
             - { name: kernel.event_subscriber }
 
index d0a85fc745edd807a62f0034da2af04235c0a252..85cd4f0d3dddc217290e4b999c9e25d2b6304cad 100644 (file)
@@ -3,7 +3,6 @@
 {{ 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') %}
index 99bf7dfdc87657429db22d02db190eb55d69f203..b53f87465d59946a7edc910ad574365ccd1a3b2d 100644 (file)
             {% 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 %}
index d709f4ebd2439596acfe7ea461204317737f56e9..cf9f1e97dc2e64203a0e2335a3e0c5fe70c4a451 100644 (file)
@@ -965,4 +965,39 @@ class ConfigControllerTest extends WallabagCoreTestCase
 
         $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'));
+    }
 }
index 93edfde8c8421977dfa018ef4aae29ac96967f57..ff0a9602b73b8c9fe5c2630042df96b0600b4930 100644 (file)
@@ -56,4 +56,27 @@ class UserLocaleListenerTest extends TestCase
 
         $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'));
+    }
 }
index 2b540fdfeb334c20bb64953a340ec1e2c3db6f24..c13bfbea9b6ae01a929f73282907c23aa024809d 100644 (file)
@@ -8,6 +8,8 @@ use PHPUnit\Framework\TestCase;
 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;
@@ -22,6 +24,7 @@ class CreateConfigListenerTest extends TestCase
 
     protected function setUp()
     {
+        $session = new Session(new MockArraySessionStorage());
         $this->em = $this->getMockBuilder('Doctrine\ORM\EntityManager')
             ->disableOriginalConstructor()
             ->getMock();
@@ -34,7 +37,8 @@ class CreateConfigListenerTest extends TestCase
             'fr',
             1,
             1,
-            1
+            1,
+            $session
         );
 
         $this->dispatcher = new EventDispatcher();