Skip to content

Commit

Permalink
Improved Symfony integration : locale listener
Browse files Browse the repository at this point in the history
  • Loading branch information
mnapoli committed May 26, 2014
1 parent d8ebe45 commit 05a8735
Show file tree
Hide file tree
Showing 4 changed files with 124 additions and 15 deletions.
66 changes: 66 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,72 @@ translated:
default_locale: %locale%
```

The TranslatedBundle will automatically listen to the request's locale and configure the `Translator` accordingly.

That means you have nothing to do: just use the Translator, and it will use the request's locale to translate things.

If the current locale is not stored inside the request, you will need to set up an event listener manually.
Here is an basic example using the session:

```php
class LocaleListener
{
private $translator;
private $session;

public function __construct(Translator $translator)
{
$this->translator = $translator;
}

public function setSession(Session $session)
{
$this->session = $session;
}

public function onRequest(GetResponseEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}

$locale = $request->getSession()->get('_locale');
if ($locale) {
$this->translator->setLanguage($locale);
}
}

public function onLogin(InteractiveLoginEvent $event)
{
$user = $event->getAuthenticationToken()->getUser();
$lang = $user->getLanguage();

if ($lang) {
$this->session->set('_locale', $lang);
}
}
}
```

When the user logs in, his/her locale is stored inside the session. Here is the configuration:

```yaml
services:
acme.locale.interactive_login_listener:
class: Acme\UserBundle\EventListener\LocaleListener
calls:
- [ setSession, [@session] ]
tags:
- { name: kernel.event_listener, event: security.interactive_login, method: onLogin }

acme.locale.kernel_request_listener:
class: Acme\UserBundle\EventListener\LocaleListener
calls:
- [ setSession, [@session] ]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onRequest }
```

- Zend Framework 1

```php
Expand Down
35 changes: 35 additions & 0 deletions src/Integration/Symfony2/EventListener/LocaleListener.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<?php

namespace Mnapoli\Translated\Integration\Symfony2\EventListener;

use Mnapoli\Translated\Translator;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;

/**
* LocaleListener
*/
class LocaleListener
{
/**
* @var Translator
*/
private $translator;

public function __construct(Translator $translator)
{
$this->translator = $translator;
}

public function onRequest(GetResponseEvent $event)
{
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}

$request = $event->getRequest();
if ($request->getLocale()) {
$this->translator->setLanguage($request->getLocale());
}
}
}
8 changes: 8 additions & 0 deletions src/Integration/Symfony2/Resources/config/services.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,21 @@
</parameters>

<services>

<service id="translated.translator" class="Mnapoli\Translated\Translator">
<argument>%translated.default_locale%</argument>
</service>

<service id="translated.twig_extension" class="Mnapoli\Translated\Integration\Twig\TranslatedTwigExtension">
<argument type="service" id="translated.translator" />
<tag name="twig.extension" />
</service>

<service id="translated.listener.request_listener" class="Mnapoli\Translated\Integration\Symfony2\EventListener\LocaleListener">
<argument type="service" id="translated.translator" />
<tag name="kernel.event_listener" event="kernel.request" method="onRequest" />
</service>

</services>

</container>
30 changes: 15 additions & 15 deletions tests/Integration/Symfony2/Symfony2Test.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,25 +32,24 @@ public function testConfigDefaultLocale()
$this->assertEquals('fr', $container->get('translated.translator')->getLanguage());
}

public function testTranslator()
/**
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage The "translated.default_locale" configuration option must be defined
*/
public function testMandatoryDefaultLocale()
{
$container = $this->getContainer();
$extension = new TranslatedExtension();

$container->registerExtension($extension);

$config = [
[
'default_locale' => 'fr',
],
[],
];
$extension->load($config, $container);

$this->assertTrue($container->get('translated.translator') instanceof Translator);
$this->assertEquals('fr', $container->get('translated.translator')->getLanguage());
}

public function testTwigExtension()
public function testTranslator()
{
$container = $this->getContainer();
$extension = new TranslatedExtension();
Expand All @@ -64,24 +63,25 @@ public function testTwigExtension()
];
$extension->load($config, $container);

$this->assertTrue($container->get('translated.twig_extension') instanceof TranslatedTwigExtension);
$this->assertTrue($container->get('translated.translator') instanceof Translator);
$this->assertEquals('fr', $container->get('translated.translator')->getLanguage());
}

/**
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage The "translated.default_locale" configuration option must be defined
*/
public function testMandatoryDefaultLocale()
public function testTwigExtension()
{
$container = $this->getContainer();
$extension = new TranslatedExtension();

$container->registerExtension($extension);

$config = [
[],
[
'default_locale' => 'fr',
],
];
$extension->load($config, $container);

$this->assertTrue($container->get('translated.twig_extension') instanceof TranslatedTwigExtension);
}

private function getContainer()
Expand Down

0 comments on commit 05a8735

Please sign in to comment.