50 $targetPath = $this->languageKey !==
'default' && @is_file($localizedTargetPath) ? $localizedTargetPath :
$this->sourcePath;
72 $bodyOfFileTag = $root->data->languageKey;
73 if ($bodyOfFileTag ===
null) {
77 if ($element ===
'source' || $this->languageKey ===
'default') {
82 if ($element ===
'target') {
84 $localizedBodyOfFileTag = $root->data->xpath(
'languageKey[@index=\'' . $this->languageKey .
'\']
');
85 if (isset($localizedBodyOfFileTag[0]) && $localizedBodyOfFileTag[0] instanceof \SimpleXMLElement) {
86 $parsedDataTarget = $this->getParsedDataForElement($localizedBodyOfFileTag[0], $element);
87 $mergedData = $parsedDataTarget + $parsedData;
88 if ($this->languageKey === 'default') {
89 $parsedData = array_intersect_key($mergedData, $parsedData, $parsedDataTarget);
91 $parsedData = array_intersect_key($mergedData, $parsedDataTarget);
105 protected function getParsedDataForElement(\SimpleXMLElement $bodyOfFileTag, $element)
108 $children = $bodyOfFileTag->children();
109 if ($children->count() === 0) {
110 // Check for externally-referenced resource:
111 // <languageKey index="fr">EXT:yourext/path/to/localized/locallang.xml</languageKey>
112 $reference = sprintf('%s
', $bodyOfFileTag);
113 if (substr($reference, -4) === '.xml
') {
114 return $this->getParsedTargetData(GeneralUtility::getFileAbsFileName($reference));
118 foreach ($children as $translationElement) {
119 if ($translationElement->getName() === 'label
') {
120 $parsedData[(string)$translationElement['index
']][0] = [
121 $element => (string)$translationElement
134 protected function doParsingFromRoot(\SimpleXMLElement $root)
136 return $this->doParsingFromRootForElement($root, 'source
');
145 protected function doParsingTargetFromRoot(\SimpleXMLElement $root)
147 return $this->doParsingFromRootForElement($root, 'target
');
158 public function getParsedTargetData($path)
160 if (!isset($this->parsedTargetFiles[$path])) {
161 $this->parsedTargetFiles[$path] = $this->parseXmlTargetFile($path);
163 return $this->parsedTargetFiles[$path];
173 protected function parseXmlTargetFile($targetPath)
175 $rootXmlNode = false;
176 if (file_exists($targetPath)) {
177 $xmlContent = file_get_contents($targetPath);
178 // Disables the functionality to allow external entities to be loaded when parsing the XML, must be kept
179 $previousValueOfEntityLoader = libxml_disable_entity_loader(true);
180 $rootXmlNode = simplexml_load_string($xmlContent, 'SimpleXMLElement
', LIBXML_NOWARNING);
181 libxml_disable_entity_loader($previousValueOfEntityLoader);
183 if (!isset($rootXmlNode) || $rootXmlNode === false) {
184 $xmlError = libxml_get_last_error();
185 throw new InvalidXmlFileException(
186 'The path provided does not point to existing and accessible well-formed XML file. Reason:
' . $xmlError->message . ' in
' . $targetPath . ', line
' . $xmlError->line,
190 return $this->doParsingTargetFromRoot($rootXmlNode);