2 declare(strict_types = 1);
18 use Psr\Http\Message\ServerRequestInterface;
89 return GeneralUtility::makeInstance(ObjectManager::class)->get(self::class);
105 array $arguments =
null,
106 string $locallangPathAndFilename =
null,
107 string $language =
null,
113 if ($locallangPathAndFilename) {
114 $key = $locallangPathAndFilename .
':' . $key;
117 $keyParts = explode(
':', $key);
118 if (GeneralUtility::isFirstPartOfStr($key,
'LLL:')) {
119 $locallangPathAndFilename = $keyParts[1] .
':' . $keyParts[2];
121 } elseif (GeneralUtility::isFirstPartOfStr($key,
'EXT:')) {
122 $locallangPathAndFilename = $keyParts[0] .
':' . $keyParts[1];
125 if (count($keyParts) === 2) {
126 $locallangPathAndFilename = $keyParts[0];
132 $this->languageKey = $language;
138 if (!empty($this->LOCAL_LANG[$this->languageKey][$key][0][
'target'])
139 || isset($this->LOCAL_LANG_UNSET[$this->languageKey][$key])
143 } elseif (!empty($this->alternativeLanguageKeys)) {
144 $languages = array_reverse($this->alternativeLanguageKeys);
145 foreach ($languages as $language) {
146 if (!empty($this->LOCAL_LANG[$language][$key][0][
'target'])
147 || isset($this->LOCAL_LANG_UNSET[$language][$key])
150 $value = $this->LOCAL_LANG[$language][$key][0][
'target'];
156 if ($value ===
null && (!empty($this->LOCAL_LANG[
'default'][$key][0][
'target'])
157 || isset($this->LOCAL_LANG_UNSET[
'default'][$key]))
161 $value = $this->LOCAL_LANG[
'default'][$key][0][
'target'];
164 if (is_array($arguments) && !empty($arguments) && $value !==
null) {
165 $value = vsprintf($value, $arguments);
168 $value = $defaultValue;
186 foreach ($result as $key => $value) {
187 if (is_array($value)) {
190 $translationFiles =
null;
191 if (is_string($translationFile)) {
192 $translationFiles = [$translationFile];
193 } elseif (is_array($translationFile)) {
197 if ($translationFiles) {
198 foreach ($translationFiles as $_translationFile) {
199 $translatedValue = $this->
translate($value,
null, $_translationFile,
null);
200 if (!empty($translatedValue)) {
201 $result[$key] = $translatedValue;
206 $result[$key] = $this->
translate($value,
null,
null,
null, $value);
222 array $arguments =
null,
223 array $translationFiles = []
229 $result[$language] = $key;
230 foreach ($translationFiles as $translationFile) {
231 $translatedValue = $this->
translate($key, $arguments, $translationFile, $language, $key);
232 if ($translatedValue !== $key) {
233 $result[$language] = $translatedValue;
252 FormRuntime $formRuntime,
253 string $finisherIdentifier,
256 array $renderingOptions = []
258 if (empty($finisherIdentifier)) {
259 throw new \InvalidArgumentException(
'The argument "finisherIdentifier" is empty', 1476216059);
261 if (empty($optionKey)) {
262 throw new \InvalidArgumentException(
'The argument "optionKey" is empty', 1476216060);
265 $finisherIdentifier = preg_replace(
'/Finisher$/',
'', $finisherIdentifier);
266 $translationFile = $renderingOptions[
'translationFile'] ??
null;
267 if (empty($translationFile)) {
268 $translationFile = $formRuntime->getRenderingOptions()[
'translation'][
'translationFile'];
271 if (is_string($translationFile)) {
272 $translationFiles = [$translationFile];
277 if (isset($renderingOptions[
'translatePropertyValueIfEmpty'])) {
278 $translatePropertyValueIfEmpty = (bool)$renderingOptions[
'translatePropertyValueIfEmpty'];
280 $translatePropertyValueIfEmpty =
true;
283 if (empty($optionValue) && !$translatePropertyValueIfEmpty) {
288 if (isset($renderingOptions[
'language'])) {
289 $language = $renderingOptions[
'language'];
294 }
catch (MissingArrayPathException $e) {
298 $originalFormIdentifier =
null;
299 if (isset($formRuntime->getRenderingOptions()[
'_originalIdentifier'])) {
300 $originalFormIdentifier = $formRuntime->getRenderingOptions()[
'_originalIdentifier'];
303 $translationKeyChain = [];
304 foreach ($translationFiles as $translationFile) {
305 if (!empty($originalFormIdentifier)) {
306 $translationKeyChain[] = sprintf(
'%s:%s.finisher.%s.%s', $translationFile, $originalFormIdentifier, $finisherIdentifier, $optionKey);
308 $translationKeyChain[] = sprintf(
'%s:%s.finisher.%s.%s', $translationFile, $formRuntime->getIdentifier(), $finisherIdentifier, $optionKey);
309 $translationKeyChain[] = sprintf(
'%s:finisher.%s.%s', $translationFile, $finisherIdentifier, $optionKey);
313 $translatedValue = empty($translatedValue) ? $optionValue : $translatedValue;
315 return $translatedValue;
327 RootRenderableInterface $element,
328 array $propertyParts,
329 FormRuntime $formRuntime
331 if (empty($propertyParts)) {
332 throw new \InvalidArgumentException(
'The argument "propertyParts" is empty', 1476216007);
335 $propertyType =
'properties';
336 $property = implode(
'.', $propertyParts);
337 $renderingOptions = $element->getRenderingOptions();
339 if ($property ===
'label') {
340 $defaultValue = $element->getLabel();
342 if ($element instanceof FormElementInterface) {
345 }
catch (MissingArrayPathException $exception) {
346 $defaultValue =
null;
349 $propertyType =
'renderingOptions';
352 }
catch (MissingArrayPathException $exception) {
353 $defaultValue =
null;
358 if (isset($renderingOptions[
'translation'][
'translatePropertyValueIfEmpty'])) {
359 $translatePropertyValueIfEmpty = $renderingOptions[
'translation'][
'translatePropertyValueIfEmpty'];
361 $translatePropertyValueIfEmpty =
true;
364 if (empty($defaultValue) && !$translatePropertyValueIfEmpty) {
365 return $defaultValue;
368 $defaultValue = empty($defaultValue) ?
'' : $defaultValue;
369 $translationFile = $renderingOptions[
'translation'][
'translationFile'] ??
null;
370 if (empty($translationFile)) {
371 $translationFile = $formRuntime->getRenderingOptions()[
'translation'][
'translationFile'];
374 if (is_string($translationFile)) {
375 $translationFiles = [$translationFile];
381 if (isset($renderingOptions[
'translation'][
'language'])) {
382 $language = $renderingOptions[
'translation'][
'language'];
387 }
catch (MissingArrayPathException $e) {
391 $originalFormIdentifier =
null;
392 if (isset($formRuntime->getRenderingOptions()[
'_originalIdentifier'])) {
393 $originalFormIdentifier = $formRuntime->getRenderingOptions()[
'_originalIdentifier'];
396 if ($property ===
'options' && is_array($defaultValue)) {
397 foreach ($defaultValue as $optionValue => &$optionLabel) {
398 $translationKeyChain = [];
399 foreach ($translationFiles as $translationFile) {
400 if (!empty($originalFormIdentifier)) {
401 if ($element instanceof FormRuntime) {
402 $translationKeyChain[] = sprintf(
'%s:%s.element.%s.%s.%s.%s', $translationFile, $originalFormIdentifier, $originalFormIdentifier, $propertyType, $property, $optionValue);
403 $translationKeyChain[] = sprintf(
'%s:element.%s.%s.%s.%s', $translationFile, $originalFormIdentifier, $propertyType, $property, $optionValue);
405 $translationKeyChain[] = sprintf(
'%s:%s.element.%s.%s.%s.%s', $translationFile, $originalFormIdentifier, $element->getIdentifier(), $propertyType, $property, $optionValue);
408 $translationKeyChain[] = sprintf(
'%s:%s.element.%s.%s.%s.%s', $translationFile, $formRuntime->getIdentifier(), $element->getIdentifier(), $propertyType, $property, $optionValue);
409 $translationKeyChain[] = sprintf(
'%s:element.%s.%s.%s.%s', $translationFile, $element->getIdentifier(), $propertyType, $property, $optionValue);
410 $translationKeyChain[] = sprintf(
'%s:element.%s.%s.%s.%s', $translationFile, $element->getType(), $propertyType, $property, $optionValue);
414 $optionLabel = empty($translatedValue) ? $optionLabel : $translatedValue;
416 $translatedValue = $defaultValue;
417 } elseif ($property ===
'fluidAdditionalAttributes' && is_array($defaultValue)) {
418 foreach ($defaultValue as $propertyName => &$propertyValue) {
419 $translationKeyChain = [];
420 foreach ($translationFiles as $translationFile) {
421 if (!empty($originalFormIdentifier)) {
422 if ($element instanceof FormRuntime) {
423 $translationKeyChain[] = sprintf(
'%s:%s.element.%s.%s.%s', $translationFile, $originalFormIdentifier, $originalFormIdentifier, $propertyType, $propertyName);
424 $translationKeyChain[] = sprintf(
'%s:element.%s.%s.%s', $translationFile, $originalFormIdentifier, $propertyType, $propertyName);
426 $translationKeyChain[] = sprintf(
'%s:%s.element.%s.%s.%s', $translationFile, $originalFormIdentifier, $element->getIdentifier(), $propertyType, $propertyName);
429 $translationKeyChain[] = sprintf(
'%s:%s.element.%s.%s.%s', $translationFile, $formRuntime->getIdentifier(), $element->getIdentifier(), $propertyType, $propertyName);
430 $translationKeyChain[] = sprintf(
'%s:element.%s.%s.%s', $translationFile, $element->getIdentifier(), $propertyType, $propertyName);
431 $translationKeyChain[] = sprintf(
'%s:element.%s.%s.%s', $translationFile, $element->getType(), $propertyType, $propertyName);
435 $propertyValue = empty($translatedValue) ? $propertyValue : $translatedValue;
437 $translatedValue = $defaultValue;
439 $translationKeyChain = [];
440 foreach ($translationFiles as $translationFile) {
441 if (!empty($originalFormIdentifier)) {
442 if ($element instanceof FormRuntime) {
443 $translationKeyChain[] = sprintf(
'%s:%s.element.%s.%s.%s', $translationFile, $originalFormIdentifier, $originalFormIdentifier, $propertyType, $property);
444 $translationKeyChain[] = sprintf(
'%s:element.%s.%s.%s', $translationFile, $originalFormIdentifier, $propertyType, $property);
446 $translationKeyChain[] = sprintf(
'%s:%s.element.%s.%s.%s', $translationFile, $originalFormIdentifier, $element->getIdentifier(), $propertyType, $property);
449 $translationKeyChain[] = sprintf(
'%s:%s.element.%s.%s.%s', $translationFile, $formRuntime->getIdentifier(), $element->getIdentifier(), $propertyType, $property);
450 $translationKeyChain[] = sprintf(
'%s:element.%s.%s.%s', $translationFile, $element->getIdentifier(), $propertyType, $property);
451 $translationKeyChain[] = sprintf(
'%s:element.%s.%s.%s', $translationFile, $element->getType(), $propertyType, $property);
455 $translatedValue = empty($translatedValue) ? $defaultValue : $translatedValue;
458 return $translatedValue;
472 RootRenderableInterface $element,
475 string $defaultValue =
'',
476 FormRuntime $formRuntime
479 throw new \InvalidArgumentException(
'The argument "code" is empty', 1489272978);
482 $validationErrors = $element->getProperties()[
'validationErrorMessages'] ??
null;
483 if (is_array($validationErrors)) {
484 foreach ($validationErrors as $validationError) {
485 if ((
int)$validationError[
'code'] === $code) {
486 return sprintf($validationError[
'message'], $arguments);
491 $renderingOptions = $element->getRenderingOptions();
492 $translationFile = $renderingOptions[
'translation'][
'translationFile'] ??
null;
493 if (empty($translationFile)) {
494 $translationFile = $formRuntime->getRenderingOptions()[
'translation'][
'translationFile'];
497 if (is_string($translationFile)) {
498 $translationFiles = [$translationFile];
504 if (isset($renderingOptions[
'language'])) {
505 $language = $renderingOptions[
'language'];
508 $originalFormIdentifier =
null;
509 if (isset($formRuntime->getRenderingOptions()[
'_originalIdentifier'])) {
510 $originalFormIdentifier = $formRuntime->getRenderingOptions()[
'_originalIdentifier'];
513 $translationKeyChain = [];
514 foreach ($translationFiles as $translationFile) {
515 if (!empty($originalFormIdentifier)) {
516 if ($element instanceof FormRuntime) {
517 $translationKeyChain[] = sprintf(
'%s:%s.validation.error.%s.%s', $translationFile, $originalFormIdentifier, $originalFormIdentifier, $code);
518 $translationKeyChain[] = sprintf(
'%s:validation.error.%s.%s', $translationFile, $originalFormIdentifier, $code);
520 $translationKeyChain[] = sprintf(
'%s:%s.validation.error.%s.%s', $translationFile, $originalFormIdentifier, $element->getIdentifier(), $code);
522 $translationKeyChain[] = sprintf(
'%s:%s.validation.error.%s', $translationFile, $originalFormIdentifier, $code);
524 $translationKeyChain[] = sprintf(
'%s:%s.validation.error.%s.%s', $translationFile, $formRuntime->getIdentifier(), $element->getIdentifier(), $code);
525 $translationKeyChain[] = sprintf(
'%s:%s.validation.error.%s', $translationFile, $formRuntime->getIdentifier(), $code);
526 $translationKeyChain[] = sprintf(
'%s:validation.error.%s.%s', $translationFile, $element->getIdentifier(), $code);
527 $translationKeyChain[] = sprintf(
'%s:validation.error.%s', $translationFile, $code);
531 $translatedValue = empty($translatedValue) ? $defaultValue : $translatedValue;
532 return $translatedValue;
560 array $translationKeyChain,
561 string $language =
null,
562 array $arguments =
null
564 $translatedValue =
null;
565 foreach ($translationKeyChain as $translationKey) {
566 $translatedValue = $this->
translate($translationKey, $arguments,
null, $language);
567 if (!empty($translatedValue)) {
571 return $translatedValue;
579 if (empty($this->languageKey)) {
583 if (!empty($locallangPathAndFilename)) {
585 $languageFactory = GeneralUtility::makeInstance(LocalizationFactory::class);
586 $this->LOCAL_LANG = $languageFactory->getParsedData($locallangPathAndFilename, $this->languageKey);
588 foreach ($this->alternativeLanguageKeys as $language) {
589 $tempLL = $languageFactory->getParsedData($locallangPathAndFilename, $language);
590 if ($this->languageKey !==
'default' && isset($tempLL[$language])) {
591 $this->LOCAL_LANG[$language] = $tempLL[$language];
604 $this->languageKey =
'default';
606 $this->alternativeLanguageKeys = [];
607 if (TYPO3_MODE ===
'FE') {
612 } elseif (isset($tsfe->config[
'config'][
'language'])) {
613 $this->languageKey = $tsfe->config[
'config'][
'language'];
614 if (isset($tsfe->config[
'config'][
'language_alt'])) {
615 $this->alternativeLanguageKeys[] = $tsfe->config[
'config'][
'language_alt'];
619 if ($this->languageKey !==
'default' && empty($this->alternativeLanguageKeys)) {
621 $locales = GeneralUtility::makeInstance(Locales::class);
622 if (in_array($this->languageKey,
$locales->getLocales(),
true)) {
623 foreach (
$locales->getLocaleDependencies($this->languageKey) as $language) {
624 $this->alternativeLanguageKeys[] = $language;
628 } elseif (!empty(
$GLOBALS[
'BE_USER']->uc[
'lang'])) {
629 $this->languageKey =
$GLOBALS[
'BE_USER']->uc[
'lang'];
645 if (!is_array($frameworkConfiguration[
'_LOCAL_LANG'] ??
null)) {
648 $this->LOCAL_LANG_UNSET = [];
649 foreach ($frameworkConfiguration[
'_LOCAL_LANG'] as
$languageKey => $labels) {
650 if (!(is_array($labels) && isset($this->LOCAL_LANG[
$languageKey]))) {
653 foreach ($labels as $labelKey => $labelValue) {
654 if (is_string($labelValue)) {
655 $this->LOCAL_LANG[
$languageKey][$labelKey][0][
'target'] = $labelValue;
656 if ($labelValue ===
'') {
659 } elseif (is_array($labelValue)) {
661 foreach ($labelValue as $key => $value) {
662 $this->LOCAL_LANG[
$languageKey][$key][0][
'target'] = $value;
686 foreach ($labelValues as $key => $labelValue) {
687 if (!empty($parentKey)) {
688 $key = $parentKey .
'.' . $key;
690 if (is_array($labelValue)) {
692 $result = array_merge($result, $labelValue);
694 $result[$key] = $labelValue;
708 if (count(array_filter(array_keys($array),
'is_string')) === 0) {
721 if ($this->configurationManager !==
null) {
725 $this->configurationManager = GeneralUtility::makeInstance(ObjectManager::class)
726 ->get(ConfigurationManagerInterface::class);
737 if (
$GLOBALS[
'TYPO3_REQUEST'] instanceof ServerRequestInterface) {
738 return $GLOBALS[
'TYPO3_REQUEST']->getAttribute(
'language',
null);
748 $languages = array_merge(
750 array_values(
$GLOBALS[
'TYPO3_CONF_VARS'][
'EXTCONF'][
'lang'][
'availableLanguages'] ?? [])