Completed
Push — develop ( cdec83...f839d1 )
by Peter
02:11
created

Translate::resolveLocale()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 4
nc 2
nop 1
1
<?php
2
/**
3
 * Webino (http://webino.sk)
4
 *
5
 * @link        https://github.com/webino/WebinoDraw for the canonical source repository
6
 * @copyright   Copyright (c) 2012-2017 Webino, s. r. o. (http://webino.sk)
7
 * @author      Peter Bačinský <[email protected]>
8
 * @license     BSD-3-Clause
9
 */
10
11
namespace WebinoDraw\Draw\Helper;
12
13
use WebinoDraw\Dom\Attr;
14
use WebinoDraw\Dom\NodeList;
15
use WebinoDraw\VarTranslator\Translation;
16
use Zend\I18n\Translator\TranslatorInterface;
17
18
/**
19
 * Class Translate
20
 */
21
class Translate extends Element
22
{
23
    /**
24
     * Draw helper service name
25
     */
26
    const SERVICE = 'webinodrawtranslate';
27
28
    /**
29
     * @var TranslatorInterface
30
     */
31
    protected $translator;
32
33
    /**
34
     * @param TranslatorInterface|object $translator
35
     */
36
    public function __construct(TranslatorInterface $translator)
37
    {
38
        $this->translator = $translator;
39
    }
40
41
    /**
42
     * @param TranslatorInterface $translator
43
     * @return $this
44
     */
45
    public function setTranslator(TranslatorInterface $translator)
46
    {
47
        $this->translator = $translator;
48
        return $this;
49
    }
50
51
    /**
52
     * @param NodeList $nodes
53
     * @param array $spec
54
     * @return self
55
     */
56
    public function drawNodes(NodeList $nodes, array $spec)
57
    {
58
        $remainNodes = $this->translateAttribNodes(
59
            $nodes,
60
            $this->resolveTextDomain($spec),
61
            $this->resolveLocale($spec)
62
        );
63
64
        if (empty($remainNodes)) {
65
            // return early when all nodes were attribs
66
            return $this;
67
        }
68
69
        return parent::drawNodes($nodes->create($remainNodes), $spec);
70
    }
71
72
    /**
73
     * @param string $value
74
     * @param Translation $varTranslation
75
     * @param array $spec
76
     * @return string
77
     */
78
    public function translateValue($value, Translation $varTranslation, array $spec)
79
    {
80
        $varValue = trim(parent::translateValue($value, $varTranslation, $spec));
81
        if (empty($varValue)) {
82
            return '';
83
        }
84
85
        return $this->translator->translate(
86
            $varValue,
87
            $this->resolveTextDomain($spec),
88
            $this->resolveLocale($spec)
89
        );
90
    }
91
92
    /**
93
     * @param NodeList $nodes
94
     * @param string $textDomain
95
     * @param string $locale
96
     * @return array
97
     */
98
    protected function translateAttribNodes(NodeList $nodes, $textDomain, $locale)
99
    {
100
        $remainNodes = [];
101
        foreach ($nodes as $node) {
102
            if ($node instanceof Attr && !$node->isEmpty()) {
103
                $node->nodeValue = $this->translator->translate($node->nodeValue, $textDomain, $locale);
104
            }
105
106
            $remainNodes[] = $node;
107
        }
108
109
        return $remainNodes;
110
    }
111
112
    /**
113
     * @param array $spec
114
     * @return string
115
     */
116
    protected function resolveTextDomain(array $spec)
117
    {
118
        return !empty($spec['text_domain'])
119
               ? $this->getVarTranslation()->translateString($spec['text_domain'])
120
               : 'default';
121
    }
122
123
    /**
124
     * @param array $spec
125
     * @return string
126
     */
127
    protected function resolveLocale(array $spec)
128
    {
129
        return !empty($spec['locale'])
130
               ? $this->getVarTranslation()->translateString($spec['locale'])
131
               : null;
132
    }
133
}
134