17 use Psr\Http\Message\ServerRequestInterface;
67 public static function translate($key, $extensionName =
null, $arguments =
null,
string $languageKey =
null, array $alternativeLanguageKeys =
null)
69 if ((
string)$key ===
'') {
75 if (GeneralUtility::isFirstPartOfStr($key,
'LLL:')) {
76 $keyParts = explode(
':', $key);
78 $key = array_pop($keyParts);
79 $languageFilePath = implode(
':', $keyParts);
81 if (empty($extensionName)) {
82 throw new \InvalidArgumentException(
83 'Parameter $extensionName cannot be empty if a fully-qualified key is not specified.',
87 $languageFilePath = static::getLanguageFilePath($extensionName);
89 $languageKeys = static::getLanguageKeys();
90 if ($languageKey ===
null) {
91 $languageKey = $languageKeys[
'languageKey'];
93 if (empty($alternativeLanguageKeys)) {
94 $alternativeLanguageKeys = $languageKeys[
'alternativeLanguageKeys'];
96 static::initializeLocalization($languageFilePath, $languageKey, $alternativeLanguageKeys, $extensionName);
99 if (!empty(self::$LOCAL_LANG[$languageFilePath][$languageKey][$key][0][
'target'])
100 || isset(self::$LOCAL_LANG_UNSET[$languageFilePath][$languageKey][$key])
103 $value = self::$LOCAL_LANG[$languageFilePath][$languageKey][$key][0][
'target'];
104 } elseif (!empty($alternativeLanguageKeys)) {
105 $languages = array_reverse($alternativeLanguageKeys);
106 foreach ($languages as $language) {
107 if (!empty(self::$LOCAL_LANG[$languageFilePath][$language][$key][0][
'target'])
108 || isset(self::$LOCAL_LANG_UNSET[$languageFilePath][$language][$key])
111 $value = self::$LOCAL_LANG[$languageFilePath][$language][$key][0][
'target'];
116 if ($value ===
null && (!empty(self::$LOCAL_LANG[$languageFilePath][
'default'][$key][0][
'target'])
117 || isset(self::$LOCAL_LANG_UNSET[$languageFilePath][
'default'][$key]))
121 $value = self::$LOCAL_LANG[$languageFilePath][
'default'][$key][0][
'target'];
124 if (is_array($arguments) && $value !==
null) {
128 return sprintf($value, ...array_values($arguments)) ?: sprintf(
'Error: could not translate key "%s" with value "%s" and %d argument(s)!', $key, $value, count($arguments));
142 protected static function initializeLocalization(
string $languageFilePath,
string $languageKey, array $alternativeLanguageKeys,
string $extensionName =
null)
144 $languageFactory = GeneralUtility::makeInstance(LocalizationFactory::class);
146 if (empty(self::$LOCAL_LANG[$languageFilePath][$languageKey])) {
147 $parsedData = $languageFactory->getParsedData($languageFilePath, $languageKey);
148 foreach ($parsedData as $tempLanguageKey => $data) {
150 self::$LOCAL_LANG[$languageFilePath][$tempLanguageKey] = $data;
154 if ($languageKey !==
'default') {
155 foreach ($alternativeLanguageKeys as $alternativeLanguageKey) {
156 if (empty(self::$LOCAL_LANG[$languageFilePath][$alternativeLanguageKey])) {
157 $tempLL = $languageFactory->getParsedData($languageFilePath, $alternativeLanguageKey);
158 if (isset($tempLL[$alternativeLanguageKey])) {
159 self::$LOCAL_LANG[$languageFilePath][$alternativeLanguageKey] = $tempLL[$alternativeLanguageKey];
164 if (!empty($extensionName)) {
165 static::loadTypoScriptLabels($extensionName, $languageFilePath);
177 return 'EXT:' . GeneralUtility::camelCaseToLowerCaseUnderscored($extensionName) .
'/' . self::$locallangPath .
'locallang.xlf';
189 'languageKey' =>
'default',
190 'alternativeLanguageKeys' => [],
192 if (TYPO3_MODE ===
'FE') {
193 $tsfe = static::getTypoScriptFrontendController();
197 if ($siteLanguage instanceof SiteLanguage) {
198 $languageKeys[
'languageKey'] = $siteLanguage->getTypo3Language();
199 } elseif (isset($tsfe->config[
'config'][
'language'])) {
200 $languageKeys[
'languageKey'] = $tsfe->config[
'config'][
'language'];
201 if (isset($tsfe->config[
'config'][
'language_alt'])) {
202 $languageKeys[
'alternativeLanguageKeys'][] = $tsfe->config[
'config'][
'language_alt'];
206 if (empty($languageKeys[
'alternativeLanguageKeys'])) {
207 $locales = GeneralUtility::makeInstance(Locales::class);
208 if (in_array($languageKeys[
'languageKey'],
$locales->getLocales())) {
209 foreach (
$locales->getLocaleDependencies($languageKeys[
'languageKey']) as $language) {
210 $languageKeys[
'alternativeLanguageKeys'][] = $language;
214 } elseif (!empty(
$GLOBALS[
'BE_USER']->uc[
'lang'])) {
215 $languageKeys[
'languageKey'] =
$GLOBALS[
'BE_USER']->uc[
'lang'];
216 } elseif (!empty(static::getLanguageService()->lang)) {
217 $languageKeys[
'languageKey'] = static::getLanguageService()->lang;
219 return $languageKeys;
234 if (!is_array($frameworkConfiguration[
'_LOCAL_LANG'] ??
false)) {
237 self::$LOCAL_LANG_UNSET[$languageFilePath] = [];
238 foreach ($frameworkConfiguration[
'_LOCAL_LANG'] as $languageKey => $labels) {
239 if (!is_array($labels)) {
242 foreach ($labels as $labelKey => $labelValue) {
243 if (is_string($labelValue)) {
244 self::$LOCAL_LANG[$languageFilePath][$languageKey][$labelKey][0][
'target'] = $labelValue;
245 if ($labelValue ===
'') {
246 self::$LOCAL_LANG_UNSET[$languageFilePath][$languageKey][$labelKey] =
'';
248 } elseif (is_array($labelValue)) {
250 foreach ($labelValue as $key => $value) {
251 self::$LOCAL_LANG[$languageFilePath][$languageKey][$key][0][
'target'] = $value;
253 self::$LOCAL_LANG_UNSET[$languageFilePath][$languageKey][$key] =
'';
275 foreach ($labelValues as $key => $labelValue) {
276 if (!empty($parentKey)) {
277 if ($key ===
'_typoScriptNodeValue') {
280 $key = $parentKey .
'.' . $key;
283 if (is_array($labelValue)) {
285 $result = array_merge($result, $labelValue);
287 $result[$key] = $labelValue;
300 if (static::$configurationManager !==
null) {
301 return static::$configurationManager;
303 $objectManager = GeneralUtility::makeInstance(ObjectManager::class);
317 if (
$GLOBALS[
'TYPO3_REQUEST'] instanceof ServerRequestInterface) {
318 return $GLOBALS[
'TYPO3_REQUEST']->getAttribute(
'language',
null);