feature #28523 [FrameworkBundle] Register an identity translator as fallback (yceruto)

This PR was merged into the 4.2-dev branch.

Discussion
----------

[FrameworkBundle] Register an identity translator as fallback

| Q             | A
| ------------- | ---
| Branch?       | master
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| Fixed tickets | #27589
| License       | MIT
| Doc PR        | -

The same approach as https://github.com/symfony/symfony/pull/24358, suggested by @xabbuh here https://github.com/symfony/symfony/issues/27589#issuecomment-421542776

**Templating Engine Context**

The Form component can be used without the Translation component.
However, to be able to use the default form themes provided by the
`FrameworkBundle` you need to have the `translator` helper to be available.

This change ensure that there will always be a `translator` helper which
as a fallback will just return the message key if no translator is present.

Commits
-------

5330f2d017 [FrameworkBundle] Register an identity translator as fallback
This commit is contained in:
Nicolas Grekas 2018-09-21 13:01:20 +02:00
commit e198a26baf
7 changed files with 28 additions and 38 deletions

View File

@ -17,6 +17,7 @@ use Symfony\Bridge\Twig\TokenParser\TransChoiceTokenParser;
use Symfony\Bridge\Twig\TokenParser\TransDefaultDomainTokenParser;
use Symfony\Bridge\Twig\TokenParser\TransTokenParser;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Contracts\Translation\TranslatorTrait;
use Twig\Extension\AbstractExtension;
use Twig\NodeVisitor\NodeVisitorInterface;
use Twig\TokenParser\AbstractTokenParser;
@ -29,6 +30,13 @@ use Twig\TwigFilter;
*/
class TranslationExtension extends AbstractExtension
{
use TranslatorTrait {
getLocale as private;
setLocale as private;
trans as private doTrans;
transChoice as private doTransChoice;
}
private $translator;
private $translationNodeVisitor;
@ -91,7 +99,7 @@ class TranslationExtension extends AbstractExtension
public function trans($message, array $arguments = array(), $domain = null, $locale = null)
{
if (null === $this->translator) {
return strtr($message, $arguments);
return $this->doTrans($message, $arguments, $domain, $locale);
}
return $this->translator->trans($message, $arguments, $domain, $locale);
@ -100,7 +108,7 @@ class TranslationExtension extends AbstractExtension
public function transchoice($message, $count, array $arguments = array(), $domain = null, $locale = null)
{
if (null === $this->translator) {
return strtr($message, $arguments);
return $this->doTransChoice($message, $count, array_merge(array('%count%' => $count), $arguments), $domain, $locale);
}
return $this->translator->transChoice($message, $count, array_merge(array('%count%' => $count), $arguments), $domain, $locale);

View File

@ -873,10 +873,6 @@ class FrameworkExtension extends Extension
} else {
$container->removeDefinition('templating.helper.assets');
}
if (!$this->translationConfigEnabled) {
$container->removeDefinition('templating.helper.translator');
}
}
}

View File

@ -58,7 +58,7 @@
<service id="templating.helper.translator" class="Symfony\Bundle\FrameworkBundle\Templating\Helper\TranslatorHelper">
<tag name="templating.helper" alias="translator" />
<argument type="service" id="translator" />
<argument type="service" id="translator" on-invalid="null" />
</service>
<service id="templating.helper.form" class="Symfony\Bundle\FrameworkBundle\Templating\Helper\FormHelper">

View File

@ -13,15 +13,23 @@ namespace Symfony\Bundle\FrameworkBundle\Templating\Helper;
use Symfony\Component\Templating\Helper\Helper;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Contracts\Translation\TranslatorTrait;
/**
* @author Fabien Potencier <fabien@symfony.com>
*/
class TranslatorHelper extends Helper
{
use TranslatorTrait {
getLocale as private;
setLocale as private;
trans as private doTrans;
transChoice as private doTransChoice;
}
protected $translator;
public function __construct(TranslatorInterface $translator)
public function __construct(TranslatorInterface $translator = null)
{
$this->translator = $translator;
}
@ -31,6 +39,10 @@ class TranslatorHelper extends Helper
*/
public function trans($id, array $parameters = array(), $domain = 'messages', $locale = null)
{
if (null === $this->translator) {
return $this->doTrans($id, $parameters, $domain, $locale);
}
return $this->translator->trans($id, $parameters, $domain, $locale);
}
@ -39,6 +51,10 @@ class TranslatorHelper extends Helper
*/
public function transChoice($id, $number, array $parameters = array(), $domain = 'messages', $locale = null)
{
if (null === $this->translator) {
return $this->doTransChoice($id, $number, $parameters, $domain, $locale);
}
return $this->translator->transChoice($id, $number, $parameters, $domain, $locale);
}

View File

@ -1,8 +0,0 @@
<?php
$container->loadFromExtension('framework', array(
'translator' => false,
'templating' => array(
'engines' => array('php'),
),
));

View File

@ -1,8 +0,0 @@
<?php
$container->loadFromExtension('framework', array(
'translator' => true,
'templating' => array(
'engines' => array('php'),
),
));

View File

@ -701,20 +701,6 @@ abstract class FrameworkExtensionTest extends TestCase
$this->assertEquals(array('en', 'fr'), $calls[1][1][0]);
}
public function testTranslatorHelperIsRegisteredWhenTranslatorIsEnabled()
{
$container = $this->createContainerFromFile('templating_php_translator_enabled');
$this->assertTrue($container->has('templating.helper.translator'));
}
public function testTranslatorHelperIsNotRegisteredWhenTranslatorIsDisabled()
{
$container = $this->createContainerFromFile('templating_php_translator_disabled');
$this->assertFalse($container->has('templating.helper.translator'));
}
/**
* @expectedException \Symfony\Component\Config\Definition\Exception\InvalidConfigurationException
*/