1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Magento\Framework\View\Model\Layout;
use Magento\Framework\Simplexml\Element;
class Translator
{
/**
* Translate layout node
*
* @param Element $node
* @param array $args
* @return void
**/
public function translateActionParameters(Element $node, &$args)
{
if (false === $this->_isNodeTranslatable($node)) {
return;
}
foreach ($this->_getNodeNamesToTranslate($node) as $translatableArg) {
/*
* .(dot) character is used as a path separator in nodes hierarchy
* e.g. info.title means that Magento needs to translate value of <title> node
* that is a child of <info> node
*/
// @var $argumentHierarchy array - path to translatable item in $args array
$argumentHierarchy = explode('.', $translatableArg);
$argumentStack = & $args;
$canTranslate = true;
while (is_array($argumentStack) && count($argumentStack) > 0) {
$argumentName = array_shift($argumentHierarchy);
if (isset($argumentStack[$argumentName])) {
/*
* Move to the next element in arguments hierarchy
* in order to find target translatable argument
*/
$argumentStack = & $argumentStack[$argumentName];
} else {
// Target argument cannot be found
$canTranslate = false;
break;
}
}
if ($canTranslate && is_string($argumentStack)) {
// $argumentStack is now a reference to target translatable argument so it can be translated
$argumentStack = $this->_translateValue($argumentStack);
}
}
}
/**
* Translate argument value
*
* @param Element $node
* @return string
*/
public function translateArgument(Element $node)
{
$value = $this->_getNodeValue($node);
if ($this->_isSelfTranslatable($node)) {
$value = $this->_translateValue($value);
} elseif ($this->_isNodeTranslatable($node->getParent())) {
if (true === in_array($node->getName(), $this->_getNodeNamesToTranslate($node->getParent()))) {
$value = $this->_translateValue($value);
}
}
return $value;
}
/**
* Get node names that have to be translated
*
* @param Element $node
* @return array
*/
protected function _getNodeNamesToTranslate(Element $node)
{
return explode(' ', (string)$node['translate']);
}
/**
* Check if node has to be translated
*
* @param Element $node
* @return bool
*/
protected function _isNodeTranslatable(Element $node)
{
return isset($node['translate']);
}
/**
* Check if node has to translate own value
*
* @param Element $node
* @return bool
*/
protected function _isSelfTranslatable(Element $node)
{
return $this->_isNodeTranslatable($node) && 'true' == (string)$node['translate'];
}
/**
* Get node value
*
* @param Element $node
* @return string
*/
protected function _getNodeValue(Element $node)
{
return trim((string)$node);
}
/**
* Translate node value
*
* @param string $value
* @return \Magento\Framework\Phrase
*/
protected function _translateValue($value)
{
return (string)new \Magento\Framework\Phrase($value);
}
}