Completed
Push — master ( e17663...92cd4a )
by Oscar
02:00
created

MultidimensionalArrayTrait   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 86
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 4

Importance

Changes 3
Bugs 0 Features 0
Metric Value
c 3
b 0
f 0
dl 0
loc 86
rs 10
wmc 16
lcom 0
cbo 4

2 Methods

Rating   Name   Duplication   Size   Complexity  
C toArray() 0 36 7
D fromArray() 0 28 9
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 (context => [original => [translation, plural1, pluraln...]]).
9
 */
10
trait MultidimensionalArrayTrait
11
{
12
    use HeadersGeneratorTrait;
13
    use HeadersExtractorTrait;
14
15
    /**
16
     * Returns a multidimensional array.
17
     * 
18
     * @param Translations $translations
19
     * @param bool         $includeHeaders
20
     * @param bool         $forceArray
21
     *
22
     * @return array
23
     */
24
    private static function toArray(Translations $translations, $includeHeaders, $forceArray = false)
25
    {
26
        $pluralForm = $translations->getPluralForms();
27
        $pluralLimit = is_array($pluralForm) ? ($pluralForm[0] - 1) : null;
28
        $messages = [];
29
30
        if ($includeHeaders) {
31
            $messages[''] = [
32
                '' => [self::generateHeaders($translations)],
33
            ];
34
        }
35
36
        foreach ($translations as $translation) {
37
            $context = $translation->getContext();
38
            $original = $translation->getOriginal();
39
40
            if (!isset($messages[$context])) {
41
                $messages[$context] = [];
42
            }
43
44
            if ($translation->hasPluralTranslations()) {
45
                $messages[$context][$original] = $translation->getPluralTranslations($pluralLimit);
46
                array_unshift($messages[$context][$original], $translation->getTranslation());
47
            } elseif ($forceArray) {
48
                $messages[$context][$original] = [$translation->getTranslation()];
49
            } else {
50
                $messages[$context][$original] = $translation->getTranslation();
51
            }
52
        }
53
54
        return [
55
            'domain' => $translations->getDomain(),
56
            'plural-forms' => $translations->getHeader('Plural-Forms'),
57
            'messages' => $messages,
58
        ];
59
    }
60
61
    /**
62
     * Extract the entries from a multidimensional array.
63
     * 
64
     * @param array        $messages
65
     * @param Translations $translations
66
     */
67
    private static function fromArray(array $messages, Translations $translations)
68
    {
69
        if (!empty($messages['domain'])) {
70
            $translations->setDomain($messages['domain']);
71
        }
72
73
        if (!empty($messages['plural-forms'])) {
74
            $translations->setHeader(Translations::HEADER_PLURAL, $messages['plural-forms']);
75
        }
76
77
        foreach ($messages['messages'] as $context => $contextTranslations) {
78
            foreach ($contextTranslations as $original => $value) {
79
                if ($context === '' && $original === '') {
80
                    self::extractHeaders(is_array($value) ? array_shift($value) : $value, $translations);
81
                    continue;
82
                }
83
84
                $translation = $translations->insert($context, $original);
85
86
                if (is_array($value)) {
87
                    $translation->setTranslation(array_shift($value));
88
                    $translation->setPluralTranslations($value);
89
                } else {
90
                    $translation->setTranslation($value);
91
                }
92
            }
93
        }
94
    }
95
}
96