MultidimensionalArrayTrait::fromArray()   D
last analyzed

Complexity

Conditions 9
Paths 20

Size

Total Lines 28
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 9
eloc 16
nc 20
nop 2
dl 0
loc 28
rs 4.909
c 0
b 0
f 0
1
<?php
2
3
namespace Gettext\Utils;
4
5
use Gettext\Translations;
6
7
/**
8
 * Trait used by all generators that exports the translations to multidimensional arrays
9
 * (context => [original => [translation, plural1, pluraln...]]).
10
 */
11
trait MultidimensionalArrayTrait
12
{
13
    use HeadersGeneratorTrait;
14
    use HeadersExtractorTrait;
15
16
    /**
17
     * Returns a multidimensional array.
18
     *
19
     * @param Translations $translations
20
     * @param bool         $includeHeaders
21
     * @param bool         $forceArray
22
     *
23
     * @return array
24
     */
25
    private static function toArray(Translations $translations, $includeHeaders, $forceArray = false)
26
    {
27
        $pluralForm = $translations->getPluralForms();
28
        $pluralSize = is_array($pluralForm) ? ($pluralForm[0] - 1) : null;
29
        $messages = [];
30
31
        if ($includeHeaders) {
32
            $messages[''] = [
33
                '' => [self::generateHeaders($translations)],
34
            ];
35
        }
36
37
        foreach ($translations as $translation) {
38
            $context = $translation->getContext();
39
            $original = $translation->getOriginal();
40
41
            if (!isset($messages[$context])) {
42
                $messages[$context] = [];
43
            }
44
45
            if ($translation->hasPluralTranslations(true)) {
46
                $messages[$context][$original] = $translation->getPluralTranslations($pluralSize);
47
                array_unshift($messages[$context][$original], $translation->getTranslation());
48
            } elseif ($forceArray) {
49
                $messages[$context][$original] = [$translation->getTranslation()];
50
            } else {
51
                $messages[$context][$original] = $translation->getTranslation();
52
            }
53
        }
54
55
        return [
56
            'domain' => $translations->getDomain(),
57
            'plural-forms' => $translations->getHeader('Plural-Forms'),
58
            'messages' => $messages,
59
        ];
60
    }
61
62
    /**
63
     * Extract the entries from a multidimensional array.
64
     *
65
     * @param array        $messages
66
     * @param Translations $translations
67
     */
68
    private static function fromArray(array $messages, Translations $translations)
69
    {
70
        if (!empty($messages['domain'])) {
71
            $translations->setDomain($messages['domain']);
72
        }
73
74
        if (!empty($messages['plural-forms'])) {
75
            $translations->setHeader(Translations::HEADER_PLURAL, $messages['plural-forms']);
76
        }
77
78
        foreach ($messages['messages'] as $context => $contextTranslations) {
79
            foreach ($contextTranslations as $original => $value) {
80
                if ($context === '' && $original === '') {
81
                    self::extractHeaders(is_array($value) ? array_shift($value) : $value, $translations);
82
                    continue;
83
                }
84
85
                $translation = $translations->insert($context, $original);
86
87
                if (is_array($value)) {
88
                    $translation->setTranslation(array_shift($value));
89
                    $translation->setPluralTranslations($value);
90
                } else {
91
                    $translation->setTranslation($value);
92
                }
93
            }
94
        }
95
    }
96
}
97