Skip to content

Commit f36d05d

Browse files
Configure included and excluded domains using monolog style
1 parent ce43d25 commit f36d05d

File tree

5 files changed

+76
-37
lines changed

5 files changed

+76
-37
lines changed

src/Translator/doc/index.rst

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,13 @@ including or excluding translation domains in your ``config/packages/ux_translat
8484
.. code-block:: yaml
8585
8686
ux_translator:
87-
# By listing the domains you want to include:
88-
included_domains: ['messages', 'admin']
87+
domains: ~ # Include all the domains
8988
90-
# Or by excluding the domains you don't want:
91-
excluded_domains: ['validators', 'security']
89+
domains: foo # Include only domain 'foo'
90+
domains: '!foo' # Include all domains, except 'foo'
91+
92+
domains: [foo, bar] # Include only domains 'foo' and 'bar'
93+
domains: ['!foo', '!bar'] # Include all domains, except 'foo' and 'bar'
9294
9395
9496
Configuring the default locale

src/Translator/src/DependencyInjection/Configuration.php

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
1515
use Symfony\Component\Config\Definition\ConfigurationInterface;
16+
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
1617

1718
/**
1819
* @author Hugo Alliaume <hugo@alliau.me>
@@ -28,21 +29,60 @@ public function getConfigTreeBuilder(): TreeBuilder
2829
$rootNode
2930
->children()
3031
->scalarNode('dump_directory')->defaultValue('%kernel.project_dir%/var/translations')->end()
31-
->arrayNode('excluded_domains')
32-
->info('List of domains to exclude from the generated translations.')
33-
->scalarPrototype()->end()
34-
->defaultValue([])
35-
->end()
36-
->arrayNode('included_domains')
37-
->info('List of domains to include in the generated translations. By default, all domains are included.')
38-
->scalarPrototype()->end()
39-
->defaultValue([])
32+
->arrayNode('domains')
33+
->info('List of domains to include/exclude from the generated translations. Prefix with a `!` to exclude a domain.')
34+
->children()
35+
->scalarNode('type')
36+
->validate()
37+
->ifNotInArray(['inclusive', 'exclusive'])
38+
->thenInvalid('The type of domains has to be inclusive or exclusive')
39+
->end()
40+
->end()
41+
->arrayNode('elements')
42+
->scalarPrototype()->end()
43+
->end()
44+
->end()
45+
->canBeUnset()
46+
->beforeNormalization()
47+
->ifString()
48+
->then(fn ($v) => ['elements' => [$v]])
49+
->end()
50+
->beforeNormalization()
51+
->ifTrue(function ($v) { return \is_array($v) && is_numeric(key($v)); })
52+
->then(function ($v) { return ['elements' => $v]; })
53+
->end()
54+
->validate()
55+
->always(function ($v) {
56+
$isExclusive = null;
57+
$elements = [];
58+
if (isset($v['type'])) {
59+
$isExclusive = 'exclusive' === $v['type'];
60+
}
61+
foreach ($v['elements'] as $domain) {
62+
if (str_starts_with($domain, '!')) {
63+
if (false === $isExclusive) {
64+
throw new InvalidConfigurationException('You cannot mix included and excluded domains.');
65+
}
66+
$isExclusive = true;
67+
$elements[] = substr($domain, 1);
68+
} else {
69+
if (true === $isExclusive) {
70+
throw new InvalidConfigurationException('You cannot mix included and excluded domains.');
71+
}
72+
$isExclusive = false;
73+
$elements[] = $domain;
74+
}
75+
}
76+
77+
if (!\count($elements)) {
78+
return null;
79+
}
80+
81+
return ['type' => $isExclusive ? 'exclusive' : 'inclusive', 'elements' => array_unique($elements)];
82+
})
83+
->end()
4084
->end()
4185
->end()
42-
->validate()
43-
->ifTrue(fn ($v) => $v['excluded_domains'] && $v['included_domains'])
44-
->thenInvalid('You cannot set both "excluded_domains" and "included_domains" at the same time.')
45-
->end()
4686
;
4787

4888
return $treeBuilder;

src/Translator/src/DependencyInjection/UxTranslatorExtension.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ public function load(array $configs, ContainerBuilder $container)
3838
$dumperDefinition = $container->getDefinition('ux.translator.translations_dumper');
3939
$dumperDefinition->setArgument(0, $config['dump_directory']);
4040

41-
if ($config['excluded_domains']) {
42-
$dumperDefinition->addMethodCall('setExcludedDomains', [$config['excluded_domains']]);
43-
}
44-
if ($config['included_domains']) {
45-
$dumperDefinition->addMethodCall('setIncludedDomains', [$config['included_domains']]);
41+
if (isset($config['domains'])) {
42+
$method = 'inclusive' === $config['domains']['type'] ? 'addIncludedDomain' : 'addExcludedDomain';
43+
foreach ($config['domains']['elements'] as $domainName) {
44+
$dumperDefinition->addMethodCall($method, [$domainName]);
45+
}
4646
}
4747
}
4848

src/Translator/src/TranslationsDumper.php

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -87,23 +87,20 @@ public function dump(MessageCatalogueInterface ...$catalogues): void
8787
);
8888
}
8989

90-
/**
91-
* @param list<string> $domains
92-
*/
93-
public function setExcludedDomains(array $domains): void
90+
public function addExcludedDomain(string $domain): void
9491
{
95-
if ($this->includedDomains && $domains) {
92+
if ($this->includedDomains) {
9693
throw new \LogicException('You cannot set both "excluded_domains" and "included_domains" at the same time.');
9794
}
98-
$this->excludedDomains = $domains;
95+
$this->excludedDomains[] = $domain;
9996
}
10097

101-
public function setIncludedDomains(array $domains): void
98+
public function addIncludedDomain(string $domain): void
10299
{
103-
if ($this->excludedDomains && $domains) {
100+
if ($this->excludedDomains) {
104101
throw new \LogicException('You cannot set both "excluded_domains" and "included_domains" at the same time.');
105102
}
106-
$this->includedDomains = $domains;
103+
$this->includedDomains[] = $domain;
107104
}
108105

109106
/**

src/Translator/tests/TranslationsDumperTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public function testDump(): void
105105

106106
public function testDumpWithExcludedDomains(): void
107107
{
108-
$this->translationsDumper->setExcludedDomains(['foobar']);
108+
$this->translationsDumper->addExcludedDomain('foobar');
109109
$this->translationsDumper->dump(...$this->getMessageCatalogues());
110110

111111
$this->assertFileExists(self::$translationsDumpDir.'/index.js');
@@ -114,7 +114,7 @@ public function testDumpWithExcludedDomains(): void
114114

115115
public function testDumpIncludedDomains(): void
116116
{
117-
$this->translationsDumper->setIncludedDomains(['messages']);
117+
$this->translationsDumper->addIncludedDomain('messages');
118118
$this->translationsDumper->dump(...$this->getMessageCatalogues());
119119

120120
$this->assertFileExists(self::$translationsDumpDir.'/index.js');
@@ -125,16 +125,16 @@ public function testSetBothIncludedAndExcludedDomains(): void
125125
{
126126
$this->expectException(\LogicException::class);
127127
$this->expectExceptionMessage('You cannot set both "excluded_domains" and "included_domains" at the same time.');
128-
$this->translationsDumper->setIncludedDomains(['foobar']);
129-
$this->translationsDumper->setExcludedDomains(['foobar']);
128+
$this->translationsDumper->addIncludedDomain('foobar');
129+
$this->translationsDumper->addExcludedDomain('messages');
130130
}
131131

132132
public function testSetBothExcludedAndIncludedDomains(): void
133133
{
134134
$this->expectException(\LogicException::class);
135135
$this->expectExceptionMessage('You cannot set both "excluded_domains" and "included_domains" at the same time.');
136-
$this->translationsDumper->setExcludedDomains(['foobar']);
137-
$this->translationsDumper->setIncludedDomains(['foobar']);
136+
$this->translationsDumper->addExcludedDomain('foobar');
137+
$this->translationsDumper->addIncludedDomain('messages');
138138
}
139139

140140
/**

0 commit comments

Comments
 (0)