Completed
Push — master ( b220cf...77a24b )
by Simonas
104:16 queued 39:36
created

Export::export()   B

Complexity

Conditions 6
Paths 10

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 6.131

Importance

Changes 8
Bugs 4 Features 4
Metric Value
c 8
b 4
f 4
dl 0
loc 20
ccs 11
cts 13
cp 0.8462
rs 8.8571
cc 6
eloc 12
nc 10
nop 1
crap 6.131
1
<?php
2
3
/*
4
 * This file is part of the ONGR package.
5
 *
6
 * (c) NFQ Technologies UAB <[email protected]>
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
namespace ONGR\TranslationsBundle\Service;
13
14
use ONGR\TranslationsBundle\Document\Message;
15
use ONGR\TranslationsBundle\Document\Translation;
16
use ONGR\TranslationsBundle\Storage\StorageInterface;
17
use ONGR\TranslationsBundle\Translation\Export\ExporterInterface;
18
use Symfony\Component\Filesystem\Filesystem;
19
20
/**
21
 * Class Export.
22
 */
23
class Export
24
{
25
    /**
26
     * @var StorageInterface
27
     */
28
    private $storage;
29
30
    /**
31
     * @var ExporterInterface
32
     */
33
    private $exporter;
34
35
    /**
36
     * @var LoadersContainer
37
     */
38
    private $loadersContainer;
39
40
    /**
41
     * @var array
42
     */
43
    private $managedLocales = [];
44
45
    /**
46
     * @var Translation[]
47
     */
48
    private $refresh = [];
49
50
    /**
51
     * @param LoadersContainer  $loadersContainer
52
     * @param StorageInterface  $storage
53
     * @param ExporterInterface $exporter
54
     */
55 5
    public function __construct(
56
        LoadersContainer $loadersContainer,
57
        StorageInterface $storage,
58
        ExporterInterface $exporter
59
    ) {
60 5
        $this->storage = $storage;
61 5
        $this->exporter = $exporter;
62 5
        $this->loadersContainer = $loadersContainer;
63 5
    }
64
65
    /**
66
     * Exports translations from ES to files.
67
     *
68
     * @param array $domains To export.
69
     */
70 5
    public function export($domains = [])
71
    {
72 5
        foreach ($this->readStorage($domains) as $file => $translations) {
73 1
            if (!file_exists($file)) {
74 1
                $this->getFilesystem()->touch($file);
75
            }
76 1
            list($domain, $locale, $extension) = explode('.', $file);
77 1
            if ($this->loadersContainer && $this->loadersContainer->has($extension)) {
78
                $messageCatalogue = $this->loadersContainer->get($extension)->load($file, $locale, $domain);
79
                $translations = array_merge($messageCatalogue->all($domain), $translations);
80
            }
81
82 1
            $this->exporter->export($file, $translations);
83
        }
84
85 1
        if (!empty($this->refresh)) {
86 1
            $this->storage->write($this->refresh);
87 1
            $this->refresh = [];
88
        }
89 1
    }
90
91
    /**
92
     * Sets managed locales.
93
     *
94
     * @param array $managedLocales
95
     */
96 4
    public function setManagedLocales($managedLocales)
97
    {
98 4
        $this->managedLocales = $managedLocales;
99 4
    }
100
101
    /**
102
     * @return array
103
     */
104 5
    public function getManagedLocales()
105
    {
106 5
        return $this->managedLocales;
107
    }
108
109
    /**
110
     * Get translations for export.
111
     *
112
     * @param array $domains To read from storage.
113
     *
114
     * @return array
115
     */
116 5
    private function readStorage($domains)
117
    {
118 5
        $data = [];
119 5
        $translations = $this->storage->read($this->getManagedLocales(), $domains);
120
121
        /** @var Translation $translation */
122 1
        foreach ($translations as $translation) {
123 1
            $messages = $translation->getMessages();
124 1
            $wasDirty = false;
125
126 1
            foreach ($messages as $key => $message) {
127 1
                if ($message->getStatus() === Message::DIRTY) {
128 1
                    $path = sprintf(
129 1
                        '%s' . DIRECTORY_SEPARATOR . '%s.%s.%s',
130 1
                        $translation->getPath(),
131 1
                        $translation->getDomain(),
132 1
                        $message->getLocale(),
133 1
                        $translation->getFormat()
134
                    );
135 1
                    $data[$path][$translation->getKey()] = $message->getMessage();
136
137 1
                    $message->setStatus(Message::FRESH);
138 1
                    $messages[$key] = $message;
139 1
                    $wasDirty = true;
140
                }
141
            }
142
143 1
            if ($wasDirty) {
144 1
                $translation->setMessages($messages);
145 1
                $this->refresh[] = $translation;
146
            }
147
        }
148
149 1
        return $data;
150
    }
151
152
    /**
153
     * @return Filesystem
154
     */
155
    protected function getFilesystem()
156
    {
157
        return new Filesystem();
158
    }
159
}
160