* * * * * * @author Cornel Boppart * @package Vhs * @subpackage ViewHelpers\Resource */ class LanguageViewHelper extends AbstractViewHelper { use TemplateVariableViewHelperTrait; const LOCALLANG_DEFAULT = 'locallang.xlf'; /** * Registers all arguments for this ViewHelper. * * @return void */ public function initializeArguments() { $this->registerAsArgument(); $this->registerArgument('extensionName', 'string', 'Name of the extension', FALSE, NULL); $this->registerArgument('path', 'string', 'Absolute or relative path to the locallang file', FALSE, self::LOCALLANG_DEFAULT); $this->registerArgument('languageKey', 'string', 'Key for getting translation of a different than current initialized language', FALSE, NULL); } /** * The main render method of this ViewHelper. * * @return array|string */ public function render() { $path = $this->getResolvedPath(); $languageKey = $this->getLanguageKey(); $locallang = GeneralUtility::readLLfile($path, $languageKey); $labels = $this->getLabelsByLanguageKey($locallang, $languageKey); $labels = $this->getLabelsFromTarget($labels); return $this->renderChildrenWithVariableOrReturnInput($labels); } /** * Gets the extension name from defined argument or * tries to resolve it from the controller context if not set. * * @return string * @throws Exception */ protected function getResolvedExtensionName() { $extensionName = $this->arguments['extensionName']; if ((NULL === $extensionName) && (TRUE === $this->controllerContext instanceof ControllerContext)) { $request = $this->controllerContext->getRequest(); $extensionName = $request->getControllerExtensionName(); } if (TRUE === empty($extensionName)) { throw new Exception('Unable to read extension name from ControllerContext and value not manually specified'); } return $extensionName; } /** * Gets the resolved file path with trying to resolve relative paths even if no * extension key is defined. * * @return string */ protected function getResolvedPath() { $path = $this->arguments['path']; $absoluteFileName = GeneralUtility::getFileAbsFileName($this->arguments['path']); if (FALSE === file_exists($absoluteFileName)) { $extensionName = $this->getResolvedExtensionName(); $extensionKey = GeneralUtility::camelCaseToLowerCaseUnderscored($extensionName); $absoluteFileName = ExtensionManagementUtility::extPath($extensionKey, $path); } return $absoluteFileName; } /** * Gets the translated labels by a specific language key * or fallback to 'default'. * * @param array $locallang * @param string $languageKey * @return array */ protected function getLabelsByLanguageKey($locallang, $languageKey) { $labels = array(); if (FALSE === empty($locallang[$languageKey])) { $labels = $locallang[$languageKey]; } elseif (FALSE === empty($locallang['default'])) { $labels = $locallang['default']; } return $labels; } /** * Simplify label array with just taking the value from target. * * @param array $labels * @return array */ protected function getLabelsFromTarget($labels) { if (TRUE === is_array($labels)) { foreach ($labels as $labelKey => $label) { $labels[$labelKey] = $label[0]['target']; } } return $labels; } /** * Gets the language key from arguments or from current * initialized language if argument is not defined. * * @return string */ protected function getLanguageKey() { $languageKey = $this->arguments['languageKey']; if (NULL === $languageKey) { $languageKey = $this->getInitializedLanguage(); } return $languageKey; } /** * Gets the key of current initialized language * or fallback to 'default'. * * @return string */ protected function getInitializedLanguage() { $language = 'default'; if ('FE' === TYPO3_MODE) { $language = $GLOBALS['TSFE']->lang; } elseif (TRUE === is_object($GLOBALS['LANG'])) { $language = $GLOBALS['LANG']->lang; } return $language; } }