Passed
Pull Request — master (#1)
by Team eFabrica
01:31
created

TranslationExtension::loadConfiguration()   A

Complexity

Conditions 6
Paths 32

Size

Total Lines 26
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 15
dl 0
loc 26
rs 9.2222
c 0
b 0
f 0
cc 6
nc 32
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Efabrica\Translatte\Bridge\Nette;
6
7
use Efabrica\Translatte\Resolver\ChainResolver;
8
use Efabrica\Translatte\Resource\NeonDirectoryResource;
9
use Efabrica\Translatte\Translator;
10
use Nette\Application\UI\ITemplateFactory;
11
use Nette\DI\CompilerExtension;
12
use Nette\Localization\ITranslator;
13
use Nette\Schema\Expect;
14
use Nette\Schema\Schema;
15
use Nette\DI\Definitions\Statement;
16
use Nette\DI\Definitions\ServiceDefinition;
17
use Nette\DI\Definitions\FactoryDefinition;
18
19
class TranslationExtension extends CompilerExtension
20
{
21
    public function getConfigSchema(): Schema
22
    {
23
        return Expect::array()->default([
24
            'default' => Expect::string()->required(),
25
            'fallback' => Expect::arrayOf('string'),
26
            'dirs' => Expect::arrayOf('string'),
27
            'cache' => Expect::type(Statement::class),
28
            'resolvers' => Expect::arrayOf(Statement::class),
29
            'resources' => Expect::arrayOf(Statement::class)
30
        ]);
31
    }
32
33
    public function loadConfiguration(): void
34
    {
35
        $builder = $this->getContainerBuilder();
36
37
        // Prepare params for translator
38
        $params = ['defaultLang' => $this->config['default']];
39
        if (!empty($this->config['resolvers'])) {
40
            $params['resolver'] = new Statement(ChainResolver::class, [$this->config['resolvers']]);
41
        }
42
        if ($this->config['cache']) {
43
            $params['cache'] = $this->config['cache'];
44
        }
45
46
        $translator = $builder->addDefinition($this->prefix('translator'))
47
            ->setType(ITranslator::class)
48
            ->setFactory(Translator::class, $params);
49
50
        // Configure translator
51
        foreach ($this->config['resources'] as $resource) {
52
            $translator->addSetup('addResource', [$resource]);
53
        }
54
        if (!empty($this->config['fallback'])) {
55
            $translator->addSetup('setFallbackLanguages', [$this->config['fallback']]);
56
        }
57
        if (!empty($this->config['dirs'])) {
58
            $translator->addSetup('addResource', [new Statement(NeonDirectoryResource::class, [$this->config['dirs']])]);
59
        }
60
    }
61
    public function beforeCompile(): void
62
    {
63
        $builder = $this->getContainerBuilder();
64
65
        /** @var ServiceDefinition $translator */
66
        $translator = $builder->getDefinition($this->prefix('translator'));
67
68
        $templateFactoryName = $builder->getByType(ITemplateFactory::class);
69
        if ($templateFactoryName !== null) {
70
            /** @var ServiceDefinition $templateFactory */
71
            $templateFactory = $builder->getDefinition($templateFactoryName);
72
            $templateFactory->addSetup('
73
					$service->onCreate[] = function (Nette\\Bridges\\ApplicationLatte\\Template $template): void {
74
						$template->setTranslator(?);
75
					};', [$translator]);
76
        }
77
78
        if ($builder->hasDefinition('latte.latteFactory')) {
79
            /** @var FactoryDefinition $latteFactory */
80
            $latteFactory = $builder->getDefinition('latte.latteFactory');
81
            $latteFactory->getResultDefinition()
82
                ->addSetup('addProvider', ['translator', $builder->getDefinition($this->prefix('translator'))]);
83
        }
84
    }
85
}
86