Merge branch '4.2'
* 4.2: [TwigBridge] Deprecating legacy Twig paths in DebugCommand and simplifications [Cache] Fixed Memcached adapter doClear()to call flush() Fixes sprintf(): Too few arguments in Translator fix TransChoiceTokenParser deprecation message [DoctrineBridge] Conflict with Messenger <4.2 [Contracts] extract LocaleAwareInterface out of TranslatorInterface
This commit is contained in:
commit
e6fa538387
|
@ -68,6 +68,7 @@ Finder
|
||||||
Form
|
Form
|
||||||
----
|
----
|
||||||
|
|
||||||
|
* The `symfony/translation` dependency has been removed - run `composer require symfony/translation` if you need the component
|
||||||
* The `getExtendedType()` method of the `FormTypeExtensionInterface` is deprecated and will be removed in 5.0. Type
|
* The `getExtendedType()` method of the `FormTypeExtensionInterface` is deprecated and will be removed in 5.0. Type
|
||||||
extensions must implement the static `getExtendedTypes()` method instead and return an iterable of extended types.
|
extensions must implement the static `getExtendedTypes()` method instead and return an iterable of extended types.
|
||||||
|
|
||||||
|
@ -381,6 +382,7 @@ TwigBundle
|
||||||
Validator
|
Validator
|
||||||
---------
|
---------
|
||||||
|
|
||||||
|
* The `symfony/translation` dependency has been removed - run `composer require symfony/translation` if you need the component
|
||||||
* The `checkMX` and `checkHost` options of the `Email` constraint are deprecated
|
* The `checkMX` and `checkHost` options of the `Email` constraint are deprecated
|
||||||
* The component is now decoupled from `symfony/translation` and uses `Symfony\Contracts\Translation\TranslatorInterface` instead
|
* The component is now decoupled from `symfony/translation` and uses `Symfony\Contracts\Translation\TranslatorInterface` instead
|
||||||
* The `ValidatorBuilderInterface` has been deprecated and `ValidatorBuilder` made final
|
* The `ValidatorBuilderInterface` has been deprecated and `ValidatorBuilder` made final
|
||||||
|
|
|
@ -46,7 +46,8 @@
|
||||||
},
|
},
|
||||||
"conflict": {
|
"conflict": {
|
||||||
"phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
|
"phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
|
||||||
"symfony/dependency-injection": "<3.4"
|
"symfony/dependency-injection": "<3.4",
|
||||||
|
"symfony/messenger": "<4.2"
|
||||||
},
|
},
|
||||||
"suggest": {
|
"suggest": {
|
||||||
"symfony/form": "",
|
"symfony/form": "",
|
||||||
|
|
|
@ -208,8 +208,8 @@ EOF
|
||||||
$io->table(array('Namespace', 'Paths'), $this->buildTableRows($paths));
|
$io->table(array('Namespace', 'Paths'), $this->buildTableRows($paths));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($wronBundles = $this->findWrongBundleOverrides()) {
|
if ($wrongBundles = $this->findWrongBundleOverrides()) {
|
||||||
foreach ($this->buildWarningMessages($wronBundles) as $message) {
|
foreach ($this->buildWarningMessages($wrongBundles) as $message) {
|
||||||
$io->warning($message);
|
$io->warning($message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -253,13 +253,7 @@ EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($namespaces as $namespace) {
|
foreach ($namespaces as $namespace) {
|
||||||
$paths = array_map(function ($path) {
|
$paths = array_map(array($this, 'getRelativePath'), $loader->getPaths($namespace));
|
||||||
if (null !== $this->projectDir && 0 === strpos($path, $this->projectDir)) {
|
|
||||||
$path = ltrim(substr($path, \strlen($this->projectDir)), \DIRECTORY_SEPARATOR);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $path;
|
|
||||||
}, $loader->getPaths($namespace));
|
|
||||||
|
|
||||||
if (FilesystemLoader::MAIN_NAMESPACE === $namespace) {
|
if (FilesystemLoader::MAIN_NAMESPACE === $namespace) {
|
||||||
$namespace = '(None)';
|
$namespace = '(None)';
|
||||||
|
@ -368,53 +362,38 @@ EOF
|
||||||
|
|
||||||
if ($this->rootDir && $this->projectDir) {
|
if ($this->rootDir && $this->projectDir) {
|
||||||
$folders = glob($this->rootDir.'/Resources/*/views', GLOB_ONLYDIR);
|
$folders = glob($this->rootDir.'/Resources/*/views', GLOB_ONLYDIR);
|
||||||
$relativePath = ltrim(substr($this->rootDir.'/Resources/', \strlen($this->projectDir)), \DIRECTORY_SEPARATOR);
|
$relativePath = ltrim(substr($this->rootDir.\DIRECTORY_SEPARATOR.'Resources/', \strlen($this->projectDir)), \DIRECTORY_SEPARATOR);
|
||||||
$bundleNames = array_reduce(
|
$bundleNames = array_reduce($folders, function ($carry, $absolutePath) use ($relativePath) {
|
||||||
$folders,
|
|
||||||
function ($carry, $absolutePath) use ($relativePath) {
|
|
||||||
if (0 === strpos($absolutePath, $this->projectDir)) {
|
if (0 === strpos($absolutePath, $this->projectDir)) {
|
||||||
$name = basename(\dirname($absolutePath));
|
$name = basename(\dirname($absolutePath));
|
||||||
$path = $relativePath.$name;
|
$path = ltrim($relativePath.$name, \DIRECTORY_SEPARATOR);
|
||||||
$carry[$name] = $path;
|
$carry[$name] = $path;
|
||||||
|
|
||||||
|
@trigger_error(sprintf('Templates directory "%s" is deprecated since Symfony 4.2, use "%s" instead.', $absolutePath, $this->twigDefaultPath.'/bundles/'.$name), E_USER_DEPRECATED);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $carry;
|
return $carry;
|
||||||
},
|
}, $bundleNames);
|
||||||
$bundleNames
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->twigDefaultPath && $this->projectDir) {
|
if ($this->twigDefaultPath && $this->projectDir) {
|
||||||
$folders = glob($this->twigDefaultPath.'/bundles/*', GLOB_ONLYDIR);
|
$folders = glob($this->twigDefaultPath.'/bundles/*', GLOB_ONLYDIR);
|
||||||
$relativePath = ltrim(substr($this->twigDefaultPath.'/bundles', \strlen($this->projectDir)), \DIRECTORY_SEPARATOR);
|
$relativePath = ltrim(substr($this->twigDefaultPath.'/bundles/', \strlen($this->projectDir)), \DIRECTORY_SEPARATOR);
|
||||||
$bundleNames = array_reduce(
|
$bundleNames = array_reduce($folders, function ($carry, $absolutePath) use ($relativePath) {
|
||||||
$folders,
|
|
||||||
function ($carry, $absolutePath) use ($relativePath) {
|
|
||||||
if (0 === strpos($absolutePath, $this->projectDir)) {
|
if (0 === strpos($absolutePath, $this->projectDir)) {
|
||||||
$path = ltrim(substr($absolutePath, \strlen($this->projectDir)), \DIRECTORY_SEPARATOR);
|
$name = basename($absolutePath);
|
||||||
$name = ltrim(substr($path, \strlen($relativePath)), \DIRECTORY_SEPARATOR);
|
$path = ltrim($relativePath.$name, \DIRECTORY_SEPARATOR);
|
||||||
$carry[$name] = $path;
|
$carry[$name] = $path;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $carry;
|
return $carry;
|
||||||
},
|
}, $bundleNames);
|
||||||
$bundleNames
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (\count($bundleNames)) {
|
if ($notFoundBundles = array_diff_key($bundleNames, $this->bundlesMetadata)) {
|
||||||
$notFoundBundles = array_diff_key($bundleNames, $this->bundlesMetadata);
|
|
||||||
if (\count($notFoundBundles)) {
|
|
||||||
$alternatives = array();
|
$alternatives = array();
|
||||||
foreach ($notFoundBundles as $notFoundBundle => $path) {
|
foreach ($notFoundBundles as $notFoundBundle => $path) {
|
||||||
$alternatives[$path] = array();
|
$alternatives[$path] = $this->findAlternatives($notFoundBundle, array_keys($this->bundlesMetadata));
|
||||||
foreach ($this->bundlesMetadata as $name => $bundle) {
|
|
||||||
$lev = levenshtein($notFoundBundle, $name);
|
|
||||||
if ($lev <= \strlen($notFoundBundle) / 3 || false !== strpos($name, $notFoundBundle)) {
|
|
||||||
$alternatives[$path][] = $name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,52 @@ class DebugCommandTest extends TestCase
|
||||||
$this->assertEquals($expected, json_decode($tester->getDisplay(true), true));
|
$this->assertEquals($expected, json_decode($tester->getDisplay(true), true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testWarningsWrongBundleOverriding()
|
||||||
|
{
|
||||||
|
$bundleMetadata = array(
|
||||||
|
'TwigBundle' => 'vendor/twig-bundle/',
|
||||||
|
'WebProfilerBundle' => 'vendor/web-profiler-bundle/',
|
||||||
|
);
|
||||||
|
$defaultPath = \dirname(__DIR__).\DIRECTORY_SEPARATOR.'Fixtures'.\DIRECTORY_SEPARATOR.'templates';
|
||||||
|
|
||||||
|
$tester = $this->createCommandTester(array(), $bundleMetadata, $defaultPath);
|
||||||
|
$ret = $tester->execute(array('--filter' => 'unknown', '--format' => 'json'), array('decorated' => false));
|
||||||
|
|
||||||
|
$expected = array('warnings' => array(
|
||||||
|
'Path "templates/bundles/UnknownBundle" not matching any bundle found',
|
||||||
|
'Path "templates/bundles/WebProfileBundle" not matching any bundle found, did you mean "WebProfilerBundle"?',
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->assertEquals(0, $ret, 'Returns 0 in case of success');
|
||||||
|
$this->assertEquals($expected, json_decode($tester->getDisplay(true), true));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group legacy
|
||||||
|
* @expectedDeprecation Templates directory "%sResources/BarBundle/views" is deprecated since Symfony 4.2, use "%stemplates/bundles/BarBundle" instead.
|
||||||
|
*/
|
||||||
|
public function testDeprecationForWrongBundleOverridingInLegacyPath()
|
||||||
|
{
|
||||||
|
$bundleMetadata = array(
|
||||||
|
'TwigBundle' => 'vendor/twig-bundle/',
|
||||||
|
'WebProfilerBundle' => 'vendor/web-profiler-bundle/',
|
||||||
|
);
|
||||||
|
$defaultPath = \dirname(__DIR__).\DIRECTORY_SEPARATOR.'Fixtures'.\DIRECTORY_SEPARATOR.'templates';
|
||||||
|
$rootDir = \dirname(__DIR__).\DIRECTORY_SEPARATOR.'Fixtures';
|
||||||
|
|
||||||
|
$tester = $this->createCommandTester(array(), $bundleMetadata, $defaultPath, $rootDir);
|
||||||
|
$ret = $tester->execute(array('--filter' => 'unknown', '--format' => 'json'), array('decorated' => false));
|
||||||
|
|
||||||
|
$expected = array('warnings' => array(
|
||||||
|
'Path "Resources/BarBundle" not matching any bundle found',
|
||||||
|
'Path "templates/bundles/UnknownBundle" not matching any bundle found',
|
||||||
|
'Path "templates/bundles/WebProfileBundle" not matching any bundle found, did you mean "WebProfilerBundle"?',
|
||||||
|
));
|
||||||
|
|
||||||
|
$this->assertEquals(0, $ret, 'Returns 0 in case of success');
|
||||||
|
$this->assertEquals($expected, json_decode($tester->getDisplay(true), true));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @expectedException \Symfony\Component\Console\Exception\InvalidArgumentException
|
* @expectedException \Symfony\Component\Console\Exception\InvalidArgumentException
|
||||||
* @expectedExceptionMessage Malformed namespaced template name "@foo" (expecting "@namespace/template_name").
|
* @expectedExceptionMessage Malformed namespaced template name "@foo" (expecting "@namespace/template_name").
|
||||||
|
@ -233,7 +279,7 @@ TXT
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function createCommandTester(array $paths = array()): CommandTester
|
private function createCommandTester(array $paths = array(), array $bundleMetadata = array(), string $defaultPath = null, string $rootDir = null): CommandTester
|
||||||
{
|
{
|
||||||
$projectDir = \dirname(__DIR__).\DIRECTORY_SEPARATOR.'Fixtures';
|
$projectDir = \dirname(__DIR__).\DIRECTORY_SEPARATOR.'Fixtures';
|
||||||
$loader = new FilesystemLoader(array(), $projectDir);
|
$loader = new FilesystemLoader(array(), $projectDir);
|
||||||
|
@ -246,7 +292,7 @@ TXT
|
||||||
}
|
}
|
||||||
|
|
||||||
$application = new Application();
|
$application = new Application();
|
||||||
$application->add(new DebugCommand(new Environment($loader), $projectDir));
|
$application->add(new DebugCommand(new Environment($loader), $projectDir, $bundleMetadata, $defaultPath, $rootDir));
|
||||||
$command = $application->find('debug:twig');
|
$command = $application->find('debug:twig');
|
||||||
|
|
||||||
return new CommandTester($command);
|
return new CommandTester($command);
|
||||||
|
|
|
@ -19,17 +19,4 @@ class StubTranslator implements TranslatorInterface
|
||||||
{
|
{
|
||||||
return '[trans]'.$id.'[/trans]';
|
return '[trans]'.$id.'[/trans]';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
|
|
||||||
{
|
|
||||||
return '[trans]'.$id.'[/trans]';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setLocale($locale)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLocale()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ class TransChoiceTokenParser extends TransTokenParser
|
||||||
$lineno = $token->getLine();
|
$lineno = $token->getLine();
|
||||||
$stream = $this->parser->getStream();
|
$stream = $this->parser->getStream();
|
||||||
|
|
||||||
@trigger_error(sprintf('The "transchoice" tag is deprecated since Symfony 4.2, use the "trans" one instead with a "%count%" parameter in %s line %d.', $stream->getSourceContext()->getName(), $lineno), E_USER_DEPRECATED);
|
@trigger_error(sprintf('The "transchoice" tag is deprecated since Symfony 4.2, use the "trans" one instead with a "%%count%%" parameter in %s line %d.', $stream->getSourceContext()->getName(), $lineno), E_USER_DEPRECATED);
|
||||||
|
|
||||||
$vars = new ArrayExpression(array(), $lineno);
|
$vars = new ArrayExpression(array(), $lineno);
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7.1.3",
|
"php": "^7.1.3",
|
||||||
"symfony/contracts": "^1.0",
|
"symfony/contracts": "^1.0.2",
|
||||||
"twig/twig": "^1.35|^2.4.4"
|
"twig/twig": "^1.35|^2.4.4"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
|
|
|
@ -111,16 +111,4 @@ class TranslatorWithTranslatorBag implements TranslatorInterface
|
||||||
public function trans($id, array $parameters = array(), $domain = null, $locale = null)
|
public function trans($id, array $parameters = array(), $domain = null, $locale = null)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setLocale($locale)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLocale()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,17 +19,4 @@ class StubTranslator implements TranslatorInterface
|
||||||
{
|
{
|
||||||
return '[trans]'.$id.'[/trans]';
|
return '[trans]'.$id.'[/trans]';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function transChoice($id, $number, array $parameters = array(), $domain = null, $locale = null)
|
|
||||||
{
|
|
||||||
return '[trans]'.$id.'[/trans]';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setLocale($locale)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getLocale()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,8 +19,9 @@
|
||||||
"php": "^7.1.3",
|
"php": "^7.1.3",
|
||||||
"ext-xml": "*",
|
"ext-xml": "*",
|
||||||
"symfony/cache": "~4.2",
|
"symfony/cache": "~4.2",
|
||||||
"symfony/dependency-injection": "^4.2",
|
|
||||||
"symfony/config": "~4.2",
|
"symfony/config": "~4.2",
|
||||||
|
"symfony/contracts": "^1.0.2",
|
||||||
|
"symfony/dependency-injection": "^4.2",
|
||||||
"symfony/event-dispatcher": "^4.1",
|
"symfony/event-dispatcher": "^4.1",
|
||||||
"symfony/http-foundation": "^4.1.2",
|
"symfony/http-foundation": "^4.1.2",
|
||||||
"symfony/http-kernel": "^4.2",
|
"symfony/http-kernel": "^4.2",
|
||||||
|
|
|
@ -193,6 +193,11 @@ class MemcachedAdapterTest extends AdapterTestCase
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testClear()
|
||||||
|
{
|
||||||
|
$this->assertTrue($this->createCachePool()->clear());
|
||||||
|
}
|
||||||
|
|
||||||
public function testMultiServerDsn()
|
public function testMultiServerDsn()
|
||||||
{
|
{
|
||||||
$dsn = 'memcached:?host[localhost]&host[localhost:12345]&host[/some/memcached.sock:]=3';
|
$dsn = 'memcached:?host[localhost]&host[localhost:12345]&host[/some/memcached.sock:]=3';
|
||||||
|
|
|
@ -292,7 +292,7 @@ trait MemcachedTrait
|
||||||
*/
|
*/
|
||||||
protected function doClear($namespace)
|
protected function doClear($namespace)
|
||||||
{
|
{
|
||||||
return false;
|
return '' === $namespace && $this->getClient()->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
private function checkResultCode($result)
|
private function checkResultCode($result)
|
||||||
|
|
|
@ -17,8 +17,8 @@ use Symfony\Component\HttpFoundation\RequestStack;
|
||||||
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
|
use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
|
||||||
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
|
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
|
||||||
use Symfony\Component\HttpKernel\KernelEvents;
|
use Symfony\Component\HttpKernel\KernelEvents;
|
||||||
use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
|
use Symfony\Component\Translation\TranslatorInterface;
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
use Symfony\Contracts\Translation\LocaleAwareInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Synchronizes the locale between the request and the translator.
|
* Synchronizes the locale between the request and the translator.
|
||||||
|
@ -31,12 +31,12 @@ class TranslatorListener implements EventSubscriberInterface
|
||||||
private $requestStack;
|
private $requestStack;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param TranslatorInterface $translator
|
* @param LocaleAwareInterface $translator
|
||||||
*/
|
*/
|
||||||
public function __construct($translator, RequestStack $requestStack)
|
public function __construct($translator, RequestStack $requestStack)
|
||||||
{
|
{
|
||||||
if (!$translator instanceof LegacyTranslatorInterface && !$translator instanceof TranslatorInterface) {
|
if (!$translator instanceof TranslatorInterface && !$translator instanceof LocaleAwareInterface) {
|
||||||
throw new \TypeError(sprintf('Argument 1 passed to %s() must be an instance of %s, %s given.', __METHOD__, TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator)));
|
throw new \TypeError(sprintf('Argument 1 passed to %s() must be an instance of %s, %s given.', __METHOD__, LocaleAwareInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator)));
|
||||||
}
|
}
|
||||||
$this->translator = $translator;
|
$this->translator = $translator;
|
||||||
$this->requestStack = $requestStack;
|
$this->requestStack = $requestStack;
|
||||||
|
|
|
@ -17,7 +17,7 @@ use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
|
||||||
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
|
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
|
||||||
use Symfony\Component\HttpKernel\EventListener\TranslatorListener;
|
use Symfony\Component\HttpKernel\EventListener\TranslatorListener;
|
||||||
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
use Symfony\Contracts\Translation\LocaleAwareInterface;
|
||||||
|
|
||||||
class TranslatorListenerTest extends TestCase
|
class TranslatorListenerTest extends TestCase
|
||||||
{
|
{
|
||||||
|
@ -27,7 +27,7 @@ class TranslatorListenerTest extends TestCase
|
||||||
|
|
||||||
protected function setUp()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
$this->translator = $this->getMockBuilder(TranslatorInterface::class)->getMock();
|
$this->translator = $this->getMockBuilder(LocaleAwareInterface::class)->getMock();
|
||||||
$this->requestStack = $this->getMockBuilder('Symfony\Component\HttpFoundation\RequestStack')->getMock();
|
$this->requestStack = $this->getMockBuilder('Symfony\Component\HttpFoundation\RequestStack')->getMock();
|
||||||
$this->listener = new TranslatorListener($this->translator, $this->requestStack);
|
$this->listener = new TranslatorListener($this->translator, $this->requestStack);
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7.1.3",
|
"php": "^7.1.3",
|
||||||
"symfony/contracts": "^1.0",
|
"symfony/contracts": "^1.0.2",
|
||||||
"symfony/event-dispatcher": "~4.1",
|
"symfony/event-dispatcher": "~4.1",
|
||||||
"symfony/http-foundation": "^4.1.1",
|
"symfony/http-foundation": "^4.1.1",
|
||||||
"symfony/debug": "~3.4|~4.0",
|
"symfony/debug": "~3.4|~4.0",
|
||||||
|
|
|
@ -13,6 +13,7 @@ namespace Symfony\Component\Translation;
|
||||||
|
|
||||||
use Symfony\Component\Translation\Exception\InvalidArgumentException;
|
use Symfony\Component\Translation\Exception\InvalidArgumentException;
|
||||||
use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
|
use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
|
||||||
|
use Symfony\Contracts\Translation\LocaleAwareInterface;
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -39,8 +40,8 @@ class DataCollectorTranslator implements LegacyTranslatorInterface, TranslatorIn
|
||||||
if (!$translator instanceof LegacyTranslatorInterface && !$translator instanceof TranslatorInterface) {
|
if (!$translator instanceof LegacyTranslatorInterface && !$translator instanceof TranslatorInterface) {
|
||||||
throw new \TypeError(sprintf('Argument 1 passed to %s() must be an instance of %s, %s given.', __METHOD__, TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator)));
|
throw new \TypeError(sprintf('Argument 1 passed to %s() must be an instance of %s, %s given.', __METHOD__, TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator)));
|
||||||
}
|
}
|
||||||
if (!$translator instanceof TranslatorBagInterface) {
|
if (!$translator instanceof TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) {
|
||||||
throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface and TranslatorBagInterface.', \get_class($translator)));
|
throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.', \get_class($translator)));
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->translator = $translator;
|
$this->translator = $translator;
|
||||||
|
|
|
@ -66,7 +66,7 @@ class MessageFormatter implements MessageFormatterInterface, IntlFormatterInterf
|
||||||
*/
|
*/
|
||||||
public function choiceFormat($message, $number, $locale, array $parameters = array())
|
public function choiceFormat($message, $number, $locale, array $parameters = array())
|
||||||
{
|
{
|
||||||
@trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the format() one instead with a %count% parameter.', __METHOD__), E_USER_DEPRECATED);
|
@trigger_error(sprintf('The "%s()" method is deprecated since Symfony 4.2, use the format() one instead with a %%count%% parameter.', __METHOD__), E_USER_DEPRECATED);
|
||||||
|
|
||||||
$parameters = array('%count%' => $number) + $parameters;
|
$parameters = array('%count%' => $number) + $parameters;
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ namespace Symfony\Component\Translation;
|
||||||
use Psr\Log\LoggerInterface;
|
use Psr\Log\LoggerInterface;
|
||||||
use Symfony\Component\Translation\Exception\InvalidArgumentException;
|
use Symfony\Component\Translation\Exception\InvalidArgumentException;
|
||||||
use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
|
use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
|
||||||
|
use Symfony\Contracts\Translation\LocaleAwareInterface;
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -37,8 +38,8 @@ class LoggingTranslator implements TranslatorInterface, LegacyTranslatorInterfac
|
||||||
if (!$translator instanceof LegacyTranslatorInterface && !$translator instanceof TranslatorInterface) {
|
if (!$translator instanceof LegacyTranslatorInterface && !$translator instanceof TranslatorInterface) {
|
||||||
throw new \TypeError(sprintf('Argument 1 passed to %s() must be an instance of %s, %s given.', __METHOD__, TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator)));
|
throw new \TypeError(sprintf('Argument 1 passed to %s() must be an instance of %s, %s given.', __METHOD__, TranslatorInterface::class, \is_object($translator) ? \get_class($translator) : \gettype($translator)));
|
||||||
}
|
}
|
||||||
if (!$translator instanceof TranslatorBagInterface) {
|
if (!$translator instanceof TranslatorBagInterface || !$translator instanceof LocaleAwareInterface) {
|
||||||
throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface and TranslatorBagInterface.', \get_class($translator)));
|
throw new InvalidArgumentException(sprintf('The Translator "%s" must implement TranslatorInterface, TranslatorBagInterface and LocaleAwareInterface.', \get_class($translator)));
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->translator = $translator;
|
$this->translator = $translator;
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
namespace Symfony\Component\Translation;
|
namespace Symfony\Component\Translation;
|
||||||
|
|
||||||
use Symfony\Component\Translation\Exception\InvalidArgumentException;
|
use Symfony\Component\Translation\Exception\InvalidArgumentException;
|
||||||
|
use Symfony\Contracts\Translation\LocaleAwareInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TranslatorInterface.
|
* TranslatorInterface.
|
||||||
|
@ -20,7 +21,7 @@ use Symfony\Component\Translation\Exception\InvalidArgumentException;
|
||||||
*
|
*
|
||||||
* @deprecated since Symfony 4.2, use Symfony\Contracts\Translation\TranslatorInterface instead
|
* @deprecated since Symfony 4.2, use Symfony\Contracts\Translation\TranslatorInterface instead
|
||||||
*/
|
*/
|
||||||
interface TranslatorInterface
|
interface TranslatorInterface extends LocaleAwareInterface
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* Translates the given message.
|
* Translates the given message.
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7.1.3",
|
"php": "^7.1.3",
|
||||||
"symfony/contracts": "^1.0",
|
"symfony/contracts": "^1.0.2",
|
||||||
"symfony/polyfill-mbstring": "~1.0"
|
"symfony/polyfill-mbstring": "~1.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
|
|
|
@ -17,6 +17,7 @@ use Symfony\Component\DependencyInjection\Definition;
|
||||||
use Symfony\Component\DependencyInjection\Reference;
|
use Symfony\Component\DependencyInjection\Reference;
|
||||||
use Symfony\Component\Validator\DependencyInjection\AddValidatorInitializersPass;
|
use Symfony\Component\Validator\DependencyInjection\AddValidatorInitializersPass;
|
||||||
use Symfony\Component\Validator\Util\LegacyTranslatorProxy;
|
use Symfony\Component\Validator\Util\LegacyTranslatorProxy;
|
||||||
|
use Symfony\Contracts\Translation\LocaleAwareInterface;
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
use Symfony\Contracts\Translation\TranslatorTrait;
|
use Symfony\Contracts\Translation\TranslatorTrait;
|
||||||
|
|
||||||
|
@ -72,7 +73,7 @@ class AddValidatorInitializersPassTest extends TestCase
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class TestTranslator implements TranslatorInterface
|
class TestTranslator implements TranslatorInterface, LocaleAwareInterface
|
||||||
{
|
{
|
||||||
use TranslatorTrait;
|
use TranslatorTrait;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
namespace Symfony\Component\Validator\Util;
|
namespace Symfony\Component\Validator\Util;
|
||||||
|
|
||||||
use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
|
use Symfony\Component\Translation\TranslatorInterface as LegacyTranslatorInterface;
|
||||||
|
use Symfony\Contracts\Translation\LocaleAwareInterface;
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -23,6 +24,9 @@ class LegacyTranslatorProxy implements LegacyTranslatorInterface, TranslatorInte
|
||||||
|
|
||||||
public function __construct(TranslatorInterface $translator)
|
public function __construct(TranslatorInterface $translator)
|
||||||
{
|
{
|
||||||
|
if (!$translator instanceof LocaleAwareInterface) {
|
||||||
|
throw new \InvalidArgumentException(sprintf('The translator passed to "%s()" must implement "%s".', __METHOD__, LocaleAwareInterface::class));
|
||||||
|
}
|
||||||
$this->translator = $translator;
|
$this->translator = $translator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ use Symfony\Component\Validator\Mapping\Loader\XmlFileLoader;
|
||||||
use Symfony\Component\Validator\Mapping\Loader\YamlFileLoader;
|
use Symfony\Component\Validator\Mapping\Loader\YamlFileLoader;
|
||||||
use Symfony\Component\Validator\Util\LegacyTranslatorProxy;
|
use Symfony\Component\Validator\Util\LegacyTranslatorProxy;
|
||||||
use Symfony\Component\Validator\Validator\RecursiveValidator;
|
use Symfony\Component\Validator\Validator\RecursiveValidator;
|
||||||
|
use Symfony\Contracts\Translation\LocaleAwareInterface;
|
||||||
use Symfony\Contracts\Translation\TranslatorInterface;
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
use Symfony\Contracts\Translation\TranslatorTrait;
|
use Symfony\Contracts\Translation\TranslatorTrait;
|
||||||
|
|
||||||
|
@ -332,7 +333,7 @@ class ValidatorBuilder implements ValidatorBuilderInterface
|
||||||
$translator = $this->translator;
|
$translator = $this->translator;
|
||||||
|
|
||||||
if (null === $translator) {
|
if (null === $translator) {
|
||||||
$translator = new class() implements TranslatorInterface {
|
$translator = new class() implements TranslatorInterface, LocaleAwareInterface {
|
||||||
use TranslatorTrait;
|
use TranslatorTrait;
|
||||||
};
|
};
|
||||||
// Force the locale to be 'en' when no translator is provided rather than relying on the Intl default locale
|
// Force the locale to be 'en' when no translator is provided rather than relying on the Intl default locale
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
],
|
],
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7.1.3",
|
"php": "^7.1.3",
|
||||||
"symfony/contracts": "^1.0",
|
"symfony/contracts": "^1.0.2",
|
||||||
"symfony/polyfill-ctype": "~1.8",
|
"symfony/polyfill-ctype": "~1.8",
|
||||||
"symfony/polyfill-mbstring": "~1.0"
|
"symfony/polyfill-mbstring": "~1.0"
|
||||||
},
|
},
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Contracts\Translation;
|
||||||
|
|
||||||
|
interface LocaleAwareInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Sets the current locale.
|
||||||
|
*
|
||||||
|
* @param string $locale The locale
|
||||||
|
*
|
||||||
|
* @throws \InvalidArgumentException If the locale contains invalid characters
|
||||||
|
*/
|
||||||
|
public function setLocale($locale);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the current locale.
|
||||||
|
*
|
||||||
|
* @return string The locale
|
||||||
|
*/
|
||||||
|
public function getLocale();
|
||||||
|
}
|
|
@ -62,20 +62,4 @@ interface TranslatorInterface
|
||||||
* @throws \InvalidArgumentException If the locale contains invalid characters
|
* @throws \InvalidArgumentException If the locale contains invalid characters
|
||||||
*/
|
*/
|
||||||
public function trans($id, array $parameters = array(), $domain = null, $locale = null);
|
public function trans($id, array $parameters = array(), $domain = null, $locale = null);
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the current locale.
|
|
||||||
*
|
|
||||||
* @param string $locale The locale
|
|
||||||
*
|
|
||||||
* @throws \InvalidArgumentException If the locale contains invalid characters
|
|
||||||
*/
|
|
||||||
public function setLocale($locale);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the current locale.
|
|
||||||
*
|
|
||||||
* @return string The locale
|
|
||||||
*/
|
|
||||||
public function getLocale();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ namespace Symfony\Contracts\Translation;
|
||||||
use Symfony\Component\Translation\Exception\InvalidArgumentException;
|
use Symfony\Component\Translation\Exception\InvalidArgumentException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A trait to help implement TranslatorInterface.
|
* A trait to help implement TranslatorInterface and LocaleAwareInterface.
|
||||||
*
|
*
|
||||||
* @author Fabien Potencier <fabien@symfony.com>
|
* @author Fabien Potencier <fabien@symfony.com>
|
||||||
*/
|
*/
|
||||||
|
|
Reference in New Issue