From c89d35e851d26b78f89bd7ece5e3eaa109c8cac0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicolas=20L=C5=93uillet?= Date: Thu, 1 Oct 2015 16:28:38 +0200 Subject: [PATCH] Language selection on config screen --- app/config/config.yml | 5 +++ app/config/services.yml | 12 ++++++ .../Controller/ConfigController.php | 2 +- .../DependencyInjection/Configuration.php | 25 +++++++++++ .../WallabagCoreExtension.php | 4 ++ .../EventListener/LocaleListener.php | 41 +++++++++++++++++++ .../EventListener/UserLocaleListener.php | 35 ++++++++++++++++ .../CoreBundle/Form/Type/ConfigType.php | 12 ++++-- .../CoreBundle/Resources/config/services.yml | 1 + .../Resources/translations/messages.fr.yml | 2 +- .../Tests/Controller/ConfigControllerTest.php | 9 +--- 11 files changed, 136 insertions(+), 12 deletions(-) create mode 100644 src/Wallabag/CoreBundle/DependencyInjection/Configuration.php create mode 100644 src/Wallabag/CoreBundle/EventListener/LocaleListener.php create mode 100644 src/Wallabag/CoreBundle/EventListener/UserLocaleListener.php diff --git a/app/config/config.yml b/app/config/config.yml index 956fdd07..a4d88b94 100644 --- a/app/config/config.yml +++ b/app/config/config.yml @@ -25,6 +25,11 @@ framework: fragments: ~ http_method_override: true +wallabag_core: + languages: + en: 'English' + fr: 'Français' + # Twig Configuration twig: debug: "%kernel.debug%" diff --git a/app/config/services.yml b/app/config/services.yml index ff6a582b..80d6c1a1 100644 --- a/app/config/services.yml +++ b/app/config/services.yml @@ -18,3 +18,15 @@ services: public: false tags: - { name: twig.extension } + + wallabag.locale_listener: + class: Wallabag\CoreBundle\EventListener\LocaleListener + arguments: ["%kernel.default_locale%"] + tags: + - { name: kernel.event_subscriber } + + wallabag.user_locale_listener: + class: Wallabag\CoreBundle\EventListener\UserLocaleListener + arguments: ["@session"] + tags: + - { name: kernel.event_listener, event: security.interactive_login, method: onInteractiveLogin } diff --git a/src/Wallabag/CoreBundle/Controller/ConfigController.php b/src/Wallabag/CoreBundle/Controller/ConfigController.php index ecfecc66..ca4acc6a 100644 --- a/src/Wallabag/CoreBundle/Controller/ConfigController.php +++ b/src/Wallabag/CoreBundle/Controller/ConfigController.php @@ -42,7 +42,7 @@ class ConfigController extends Controller $this->get('session')->getFlashBag()->add( 'notice', - 'Config saved' + 'Config saved. Some parameters will be considered after disconnection.' ); return $this->redirect($this->generateUrl('config')); diff --git a/src/Wallabag/CoreBundle/DependencyInjection/Configuration.php b/src/Wallabag/CoreBundle/DependencyInjection/Configuration.php new file mode 100644 index 00000000..32acd1f1 --- /dev/null +++ b/src/Wallabag/CoreBundle/DependencyInjection/Configuration.php @@ -0,0 +1,25 @@ +root('wallabag_core'); + + $rootNode + ->children() + ->arrayNode('languages') + ->prototype('scalar')->end() + ->end() + ->end() + ; + + return $treeBuilder; + } +} diff --git a/src/Wallabag/CoreBundle/DependencyInjection/WallabagCoreExtension.php b/src/Wallabag/CoreBundle/DependencyInjection/WallabagCoreExtension.php index 7493351b..330cc957 100644 --- a/src/Wallabag/CoreBundle/DependencyInjection/WallabagCoreExtension.php +++ b/src/Wallabag/CoreBundle/DependencyInjection/WallabagCoreExtension.php @@ -11,6 +11,10 @@ class WallabagCoreExtension extends Extension { public function load(array $configs, ContainerBuilder $container) { + $configuration = new Configuration(); + $config = $this->processConfiguration($configuration, $configs); + $container->setParameter('wallabag_core.languages', $config['languages']); + $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('services.yml'); } diff --git a/src/Wallabag/CoreBundle/EventListener/LocaleListener.php b/src/Wallabag/CoreBundle/EventListener/LocaleListener.php new file mode 100644 index 00000000..71795316 --- /dev/null +++ b/src/Wallabag/CoreBundle/EventListener/LocaleListener.php @@ -0,0 +1,41 @@ +defaultLocale = $defaultLocale; + } + + public function onKernelRequest(GetResponseEvent $event) + { + $request = $event->getRequest(); + if (!$request->hasPreviousSession()) { + return; + } + + // try to see if the locale has been set as a _locale routing parameter + if ($locale = $request->attributes->get('_locale')) { + $request->getSession()->set('_locale', $locale); + } else { + // if no explicit locale has been set on this request, use one from the session + $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale)); + } + } + + public static function getSubscribedEvents() + { + return array( + // must be registered before the default Locale listener + KernelEvents::REQUEST => array(array('onKernelRequest', 17)), + ); + } +} diff --git a/src/Wallabag/CoreBundle/EventListener/UserLocaleListener.php b/src/Wallabag/CoreBundle/EventListener/UserLocaleListener.php new file mode 100644 index 00000000..97bfabc8 --- /dev/null +++ b/src/Wallabag/CoreBundle/EventListener/UserLocaleListener.php @@ -0,0 +1,35 @@ +session = $session; + } + + /** + * @param InteractiveLoginEvent $event + */ + public function onInteractiveLogin(InteractiveLoginEvent $event) + { + $user = $event->getAuthenticationToken()->getUser(); + + if (null !== $user->getConfig()->getLanguage()) { + $this->session->set('_locale', $user->getConfig()->getLanguage()); + } + } +} diff --git a/src/Wallabag/CoreBundle/Form/Type/ConfigType.php b/src/Wallabag/CoreBundle/Form/Type/ConfigType.php index 49b05b80..1f0ad89d 100644 --- a/src/Wallabag/CoreBundle/Form/Type/ConfigType.php +++ b/src/Wallabag/CoreBundle/Form/Type/ConfigType.php @@ -9,16 +9,20 @@ use Symfony\Component\OptionsResolver\OptionsResolver; class ConfigType extends AbstractType { private $themes = array(); + private $languages = array(); /** - * @param array $themes Themes come from the LiipThemeBundle (liip_theme.themes) + * @param array $themes Themes come from the LiipThemeBundle (liip_theme.themes) + * @param array $languages Languages come from configuration, array just code language as key and label as value */ - public function __construct($themes) + public function __construct($themes, $languages) { $this->themes = array_combine( $themes, array_map(function ($s) { return ucwords(strtolower(str_replace('-', ' ', $s))); }, $themes) ); + + $this->languages = $languages; } public function buildForm(FormBuilderInterface $builder, array $options) @@ -29,7 +33,9 @@ class ConfigType extends AbstractType 'choices_as_values' => true, )) ->add('items_per_page') - ->add('language') + ->add('language', 'choice', array( + 'choices' => $this->languages, + )) ->add('save', 'submit') ; } diff --git a/src/Wallabag/CoreBundle/Resources/config/services.yml b/src/Wallabag/CoreBundle/Resources/config/services.yml index c38787de..e29fcd1f 100644 --- a/src/Wallabag/CoreBundle/Resources/config/services.yml +++ b/src/Wallabag/CoreBundle/Resources/config/services.yml @@ -10,6 +10,7 @@ services: class: Wallabag\CoreBundle\Form\Type\ConfigType arguments: - %liip_theme.themes% + - %wallabag_core.languages% tags: - { name: form.type, alias: config } diff --git a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml index aced4d83..7b10dea1 100644 --- a/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml +++ b/src/Wallabag/CoreBundle/Resources/translations/messages.fr.yml @@ -108,7 +108,7 @@ download the application: "téléchargez l'application" # Flash messages Information updated: "Vos informations personnelles ont bien été mises à jour" -Config saved: "Les paramètres de wallabag ont bien été mis à jour" +"Config saved. Some parameters will be considered after disconnection.": "Les paramètres ont bien été mis à jour. Certains seront pris en compte après déconnexion." RSS information updated: "La configuration des flux RSS a bien été mise à jour" Password updated: "Votre mot de passe a bien été mis à jour" Entry starred: "Article ajouté dans les favoris" diff --git a/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php b/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php index 3da5e8b7..7085151a 100644 --- a/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php +++ b/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php @@ -46,7 +46,7 @@ class ConfigControllerTest extends WallabagCoreTestCase $data = array( 'config[theme]' => 0, 'config[items_per_page]' => '30', - 'config[language]' => 'fr_FR', + 'config[language]' => 'en', ); $client->submit($form, $data); @@ -65,12 +65,7 @@ class ConfigControllerTest extends WallabagCoreTestCase array(array( 'config[theme]' => 0, 'config[items_per_page]' => '', - 'config[language]' => 'fr_FR', - )), - array(array( - 'config[theme]' => 0, - 'config[items_per_page]' => '12', - 'config[language]' => '', + 'config[language]' => 'en', )), ); } -- 2.41.0