Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit8fe1a87

Browse files
committed
[FrameworkBundle] Add EnabledLocalesPass to process environment variables for enabled locales
1 parentbfbe7ac commit8fe1a87

File tree

5 files changed

+169
-13
lines changed

5 files changed

+169
-13
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespaceSymfony\Bundle\FrameworkBundle\DependencyInjection\Compiler;
13+
14+
useSymfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
15+
useSymfony\Component\DependencyInjection\ContainerBuilder;
16+
17+
/**
18+
* @internal
19+
*/
20+
class EnabledLocalesPassimplements CompilerPassInterface
21+
{
22+
publicfunctionprocess(ContainerBuilder$container):void
23+
{
24+
$enabledLocales =$container->resolveEnvPlaceholders($container->getParameter('kernel.enabled_locales'),true);
25+
$container->setParameter('kernel.enabled_locales',$enabledLocales);
26+
27+
if ($container->hasDefinition('translator.default')) {
28+
$translator =$container->findDefinition('translator.default');
29+
$translator->setArgument(5,$enabledLocales);
30+
}
31+
if ($container->hasDefinition('routing.loader')) {
32+
$routing =$container->findDefinition('routing.loader');
33+
if ($enabledLocales) {
34+
$routingEnabledLocales =implode('|',array_map('preg_quote',$enabledLocales));
35+
$routing->replaceArgument(2, ['_locale' =>$routingEnabledLocales]);
36+
}
37+
}
38+
39+
$providerDefinitions = [
40+
'translation.provider_collection_factory' =>1,
41+
'console.command.translation_pull' =>5,
42+
'console.command.translation_push' =>3,
43+
];
44+
45+
$locales =$enabledLocales;
46+
47+
foreach ($providerDefinitionsas$definitionId =>$argumentIndex) {
48+
if ($container->hasDefinition($definitionId)) {
49+
$definition =$container->getDefinition($definitionId);
50+
$locales =array_merge($locales,$definition->getArgument($argumentIndex));
51+
break;
52+
}
53+
}
54+
55+
foreach ($providerDefinitionsas$definitionId =>$argumentIndex) {
56+
if (!$container->hasDefinition($definitionId)) {
57+
continue;
58+
}
59+
$definition =$container->getDefinition($definitionId);
60+
$definition->replaceArgument($argumentIndex,$locales);
61+
}
62+
}
63+
}

‎src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php‎

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -447,10 +447,10 @@ public function load(array $configs, ContainerBuilder $container): void
447447
$this->registerEsiConfiguration($config['esi'],$container,$loader);
448448
$this->registerSsiConfiguration($config['ssi'],$container,$loader);
449449
$this->registerFragmentsConfiguration($config['fragments'],$container,$loader);
450-
$this->registerTranslatorConfiguration($config['translator'],$container,$loader,$config['default_locale'],$config['enabled_locales']);
450+
$this->registerTranslatorConfiguration($config['translator'],$container,$loader,$config['default_locale']);
451451
$this->registerWorkflowConfiguration($config['workflows'],$container,$loader);
452452
$this->registerDebugConfiguration($config['php_errors'],$container,$loader);
453-
$this->registerRouterConfiguration($config['router'],$container,$loader,$config['enabled_locales']);
453+
$this->registerRouterConfiguration($config['router'],$container,$loader);
454454
$this->registerPropertyAccessConfiguration($config['property_access'],$container,$loader);
455455
$this->registerSecretsConfiguration($config['secrets'],$container,$loader,$config['secret'] ??null);
456456

@@ -1347,7 +1347,7 @@ private function registerDebugConfiguration(array $config, ContainerBuilder $con
13471347
}
13481348
}
13491349

1350-
privatefunctionregisterRouterConfiguration(array$config,ContainerBuilder$container,PhpFileLoader$loader,array$enabledLocales = []):void
1350+
privatefunctionregisterRouterConfiguration(array$config,ContainerBuilder$container,PhpFileLoader$loader):void
13511351
{
13521352
if (!$this->readConfigEnabled('router',$container,$config)) {
13531353
$container->removeDefinition('console.command.router_debug');
@@ -1374,11 +1374,6 @@ private function registerRouterConfiguration(array $config, ContainerBuilder $co
13741374
$container->getDefinition('routing.loader')->replaceArgument(1, ['utf8' =>true]);
13751375
}
13761376

1377-
if ($enabledLocales) {
1378-
$enabledLocales =implode('|',array_map('preg_quote',$enabledLocales));
1379-
$container->getDefinition('routing.loader')->replaceArgument(2, ['_locale' =>$enabledLocales]);
1380-
}
1381-
13821377
if (!ContainerBuilder::willBeAvailable('symfony/expression-language', ExpressionLanguage::class, ['symfony/framework-bundle','symfony/routing'])) {
13831378
$container->removeDefinition('router.expression_language_provider');
13841379
}
@@ -1636,7 +1631,7 @@ private function createVersion(ContainerBuilder $container, ?string $version, ?s
16361631
returnnewReference('assets.empty_version_strategy');
16371632
}
16381633

1639-
privatefunctionregisterTranslatorConfiguration(array$config,ContainerBuilder$container,LoaderInterface$loader,string$defaultLocale,array$enabledLocales):void
1634+
privatefunctionregisterTranslatorConfiguration(array$config,ContainerBuilder$container,LoaderInterface$loader,string$defaultLocale):void
16401635
{
16411636
if (!$this->readConfigEnabled('translator',$container,$config)) {
16421637
$container->removeDefinition('console.command.translation_debug');
@@ -1672,7 +1667,6 @@ private function registerTranslatorConfiguration(array $config, ContainerBuilder
16721667
$defaultOptions =$translator->getArgument(4);
16731668
$defaultOptions['cache_dir'] =$config['cache_dir'];
16741669
$translator->setArgument(4,$defaultOptions);
1675-
$translator->setArgument(5,$enabledLocales);
16761670

16771671
$container->setParameter('translator.logging',$config['logging']);
16781672
$container->setParameter('translator.default_path',$config['default_path']);
@@ -1806,11 +1800,11 @@ private function registerTranslatorConfiguration(array $config, ContainerBuilder
18061800
return;
18071801
}
18081802

1809-
$locales =$enabledLocales;
1803+
$locales =[];
18101804

18111805
foreach ($config['providers']as$provider) {
18121806
if ($provider['locales']) {
1813-
$locales+=$provider['locales'];
1807+
$locales=array_merge($locales,$provider['locales']);
18141808
}
18151809
}
18161810

‎src/Symfony/Bundle/FrameworkBundle/FrameworkBundle.php‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
useSymfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddDebugLogProcessorPass;
1616
useSymfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AssetsContextPass;
1717
useSymfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ContainerBuilderDebugDumpPass;
18+
useSymfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\EnabledLocalesPass;
1819
useSymfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ErrorLoggerCompilerPass;
1920
useSymfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\ProfilerPass;
2021
useSymfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\RemoveUnusedSessionMarshallingHandlerPass;
@@ -167,6 +168,7 @@ public function build(ContainerBuilder $container): void
167168
$container->addCompilerPass(newTranslationLintCommandPass(), PassConfig::TYPE_BEFORE_REMOVING,10);
168169
// must be registered as late as possible to get access to all Twig paths registered in
169170
// twig.template_iterator definition
171+
$container->addCompilerPass(newEnabledLocalesPass());
170172
$this->addCompilerPassIfExists($container, TranslatorPass::class, PassConfig::TYPE_BEFORE_OPTIMIZATION, -32);
171173
$this->addCompilerPassIfExists($container, TranslatorPathsPass::class, PassConfig::TYPE_AFTER_REMOVING);
172174
$this->addCompilerPassIfExists($container, LoggingTranslatorPass::class);

‎src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
usePsr\Cache\CacheItemPoolInterface;
1616
usePsr\Log\LoggerAwareInterface;
1717
usePsr\Log\LogLevel;
18+
useSymfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\EnabledLocalesPass;
1819
useSymfony\Bundle\FrameworkBundle\DependencyInjection\FrameworkExtension;
1920
useSymfony\Bundle\FrameworkBundle\FrameworkBundle;
2021
useSymfony\Bundle\FrameworkBundle\Tests\DependencyInjection\Fixtures\Workflow\Validator\DefinitionValidator;
@@ -2879,7 +2880,7 @@ protected function createContainerFromFile(string $file, array $data = [], bool
28792880
$container->getCompilerPassConfig()->setRemovingPasses([]);
28802881
$container->getCompilerPassConfig()->setAfterRemovingPasses([]);
28812882
}
2882-
$container->getCompilerPassConfig()->setBeforeOptimizationPasses([newLoggerPass()]);
2883+
$container->getCompilerPassConfig()->setBeforeOptimizationPasses([newLoggerPass(),newEnabledLocalesPass()]);
28832884
$container->getCompilerPassConfig()->setBeforeRemovingPasses([newAddConstraintValidatorsPass(),newTranslatorPass()]);
28842885

28852886
if (!$compile) {

‎src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/PhpFrameworkExtensionTest.php‎

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespaceSymfony\Bundle\FrameworkBundle\Tests\DependencyInjection;
1313

1414
usePHPUnit\Framework\Attributes\DataProvider;
15+
useSymfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\EnabledLocalesPass;
1516
useSymfony\Component\Config\Definition\Exception\InvalidConfigurationException;
1617
useSymfony\Component\Config\FileLocator;
1718
useSymfony\Component\DependencyInjection\ContainerBuilder;
@@ -425,6 +426,101 @@ public static function emailValidationModeProvider()
425426
}
426427
yield ['loose'];
427428
}
429+
430+
#[DataProvider('enabledLocalesDataProvider')]
431+
/**
432+
* @dataProvider enabledLocalesDataProvider
433+
*/
434+
publicfunctiontestEnabledLocales(mixed$enabledLocalesValue,array$envVars,array$expectedLocales)
435+
{
436+
$container =$this->createContainerFromClosure(function ($container)use ($enabledLocalesValue,$envVars) {
437+
foreach ($envVarsas$name =>$value) {
438+
$container->setParameter('env('.$name.')',$value);
439+
}
440+
$container->addCompilerPass(newEnabledLocalesPass());
441+
442+
$container->loadFromExtension('framework', [
443+
'enabled_locales' =>$enabledLocalesValue,
444+
'translator' => [
445+
'enabled' =>true,
446+
'fallbacks' => ['en'],
447+
'providers' => [
448+
'loco' => [
449+
'dsn' =>'%env(DSN)%',
450+
'domains' => ['messages'],
451+
'locales' => ['uk']
452+
],
453+
'crowdin' => [
454+
'dsn' =>'%env(DSN)%',
455+
'domains' => ['messages'],
456+
'locales' => ['sk']
457+
],
458+
'lokalise' => [
459+
'dsn' =>'%env(DSN)%',
460+
'domains' => ['messages'],
461+
'locales' => ['cz']
462+
],
463+
'phrase' => [
464+
'dsn' =>'%env(DSN)%',
465+
'domains' => ['messages'],
466+
'locales' => ['pl']
467+
]
468+
]
469+
],
470+
'router' => [
471+
'resource' =>'%kernel.project_dir%/config/routes.yaml',
472+
'type' =>'yaml',
473+
],
474+
]);
475+
});
476+
477+
$this->assertEquals($expectedLocales,$container->getParameter('kernel.enabled_locales'));
478+
479+
$routerLoaderDef =$container->getDefinition('routing.loader');
480+
$this->assertSame(['_locale' =>implode('|',$expectedLocales)],$routerLoaderDef->getArgument(2));
481+
482+
$translatorDef =$container->getDefinition('translator.default');
483+
$this->assertSame($expectedLocales,$translatorDef->getArgument(5));
484+
485+
$providerDefinitions = [
486+
'translation.provider_collection_factory' =>1,
487+
'console.command.translation_pull' =>5,
488+
'console.command.translation_push' =>3,
489+
];
490+
491+
foreach ($providerDefinitionsas$definitionId =>$argumentIndex) {
492+
$this->assertEquals(
493+
array_merge(
494+
$expectedLocales,
495+
['uk','sk','cz','pl']
496+
),
497+
$container->getDefinition($definitionId)->getArgument($argumentIndex)
498+
);
499+
}
500+
}
501+
502+
publicstaticfunctionenabledLocalesDataProvider():\Generator
503+
{
504+
yield [
505+
'enabledLocalesValue' => ['fr','de'],
506+
'envVars' => [],
507+
'expectedLocales' => ['fr','de']];
508+
yield [
509+
'enabledLocalesValue' => ['%env(LOCALE)%'],
510+
'envVars' => ['LOCALE' =>'de'],
511+
'expectedLocales' => ['de']
512+
];
513+
yield [
514+
'enabledLocalesValue' =>'%env(json:AVAILABLE_LOCALES)%',
515+
'envVars' => ['AVAILABLE_LOCALES' =>'["en", "fr", "de"]'],
516+
'expectedLocales' => ['en','fr','de']
517+
];
518+
yield [
519+
'enabledLocalesValue' =>'%env(json:resolve::AVAILABLE_LOCALES)%',
520+
'envVars' => ['LOCALE' =>'de','AVAILABLE_LOCALES' =>'["en", "fr", "%env(LOCALE)%"]'],
521+
'expectedLocales' => ['en','fr','de']
522+
];
523+
}
428524
}
429525

430526
class WorkflowValidatorWithConstructorimplements DefinitionValidatorInterface

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp