mirror of
https://github.com/wallabag/wallabag.git
synced 2025-02-04 04:52:22 +00:00
Merge pull request #3216 from wallabag/change-locale-register
Added possibility to change locale from login/register pages
This commit is contained in:
commit
5bb01c0344
10 changed files with 102 additions and 7 deletions
|
@ -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 }
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 }
|
||||
|
||||
|
|
|
@ -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') %}
|
||||
|
|
|
@ -15,6 +15,11 @@
|
|||
{% 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 %}
|
||||
|
|
|
@ -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'));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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'));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in a new issue