TYPO3 CMS  TYPO3_8-7
Locales.php
Go to the documentation of this file.
1 <?php
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
19 
29 {
35  protected $languages = [
36  'default' => 'English',
37  'af' => 'Afrikaans',
38  'ar' => 'Arabic',
39  'bs' => 'Bosnian',
40  'bg' => 'Bulgarian',
41  'ca' => 'Catalan',
42  'ch' => 'Chinese (Simpl.)',
43  'cs' => 'Czech',
44  'da' => 'Danish',
45  'de' => 'German',
46  'el' => 'Greek',
47  'eo' => 'Esperanto',
48  'es' => 'Spanish',
49  'et' => 'Estonian',
50  'eu' => 'Basque',
51  'fa' => 'Persian',
52  'fi' => 'Finnish',
53  'fo' => 'Faroese',
54  'fr' => 'French',
55  'fr_CA' => 'French (Canada)',
56  'gl' => 'Galician',
57  'he' => 'Hebrew',
58  'hi' => 'Hindi',
59  'hr' => 'Croatian',
60  'hu' => 'Hungarian',
61  'is' => 'Icelandic',
62  'it' => 'Italian',
63  'ja' => 'Japanese',
64  'ka' => 'Georgian',
65  'kl' => 'Greenlandic',
66  'km' => 'Khmer',
67  'ko' => 'Korean',
68  'lt' => 'Lithuanian',
69  'lv' => 'Latvian',
70  'ms' => 'Malay',
71  'nl' => 'Dutch',
72  'no' => 'Norwegian',
73  'pl' => 'Polish',
74  'pt' => 'Portuguese',
75  'pt_BR' => 'Brazilian Portuguese',
76  'ro' => 'Romanian',
77  'ru' => 'Russian',
78  'sk' => 'Slovak',
79  'sl' => 'Slovenian',
80  'sq' => 'Albanian',
81  'sr' => 'Serbian',
82  'sv' => 'Swedish',
83  'th' => 'Thai',
84  'tr' => 'Turkish',
85  'uk' => 'Ukrainian',
86  'vi' => 'Vietnamese',
87  'zh' => 'Chinese (Trad.)'
88  ];
89 
95  protected $isoReverseMapping = [
96  'bs' => 'ba', // Bosnian
97  'cs' => 'cz', // Czech
98  'da' => 'dk', // Danish
99  'el' => 'gr', // Greek
100  'fr_CA' => 'qc', // French (Canada)
101  'gl' => 'ga', // Galician
102  'ja' => 'jp', // Japanese
103  'ka' => 'ge', // Georgian
104  'kl' => 'gl', // Greenlandic
105  'ko' => 'kr', // Korean
106  'ms' => 'my', // Malay
107  'pt_BR' => 'br', // Portuguese (Brazil)
108  'sl' => 'si', // Slovenian
109  'sv' => 'se', // Swedish
110  'uk' => 'ua', // Ukrainian
111  'vi' => 'vn', // Vietnamese
112  'zh' => 'hk', // Chinese (China)
113  'zh_CN' => 'ch', // Chinese (Simplified)
114  'zh_HK' => 'hk', // Chinese (Simplified Hong Kong)
115  'zh_Hans_CN' => 'ch' // Chinese (Simplified Han)
116  ];
117 
123  protected $isoMapping;
124 
131 
135  public static function initialize()
136  {
138  $instance = GeneralUtility::makeInstance(self::class);
139  $instance->isoMapping = array_flip($instance->isoReverseMapping);
140  // Allow user-defined locales
141  if (isset($GLOBALS['TYPO3_CONF_VARS']['SYS']['localization']['locales']['user']) && is_array($GLOBALS['TYPO3_CONF_VARS']['SYS']['localization']['locales']['user'])) {
142  foreach ($GLOBALS['TYPO3_CONF_VARS']['SYS']['localization']['locales']['user'] as $locale => $name) {
143  if (!isset($instance->languages[$locale])) {
144  $instance->languages[$locale] = $name;
145  }
146  }
147  }
148  // Initializes the locale dependencies with TYPO3 supported locales
149  $instance->localeDependencies = [];
150  foreach ($instance->languages as $locale => $name) {
151  if (strlen($locale) === 5) {
152  $instance->localeDependencies[$locale] = [substr($locale, 0, 2)];
153  }
154  }
155  // Merge user-provided locale dependencies
156  if (isset($GLOBALS['TYPO3_CONF_VARS']['SYS']['localization']['locales']['dependencies']) && is_array($GLOBALS['TYPO3_CONF_VARS']['SYS']['localization']['locales']['dependencies'])) {
157  ArrayUtility::mergeRecursiveWithOverrule($instance->localeDependencies, $GLOBALS['TYPO3_CONF_VARS']['SYS']['localization']['locales']['dependencies']);
158  }
159  }
160 
166  public function getLocales()
167  {
168  return array_keys($this->languages);
169  }
170 
176  public function getLanguages()
177  {
178  return $this->languages;
179  }
180 
186  public function getIsoMapping()
187  {
188  return $this->isoMapping;
189  }
190 
197  public function getLocaleDependencies($locale)
198  {
199  $dependencies = [];
200  if (isset($this->localeDependencies[$locale])) {
201  $dependencies = $this->localeDependencies[$locale];
202  // Search for dependencies recursively
203  $localeDependencies = $dependencies;
204  foreach ($localeDependencies as $dependency) {
205  if (isset($this->localeDependencies[$dependency])) {
206  $dependencies = array_merge($dependencies, $this->getLocaleDependencies($dependency));
207  }
208  }
209  }
210  return $dependencies;
211  }
212 
220  public function getPreferredClientLanguage($languageCodesList)
221  {
222  $allLanguageCodesFromLocales = ['en' => 'default'];
223  foreach ($this->isoReverseMapping as $isoLang => $typo3Lang) {
224  $isoLang = str_replace('_', '-', $isoLang);
225  $allLanguageCodesFromLocales[$isoLang] = $typo3Lang;
226  }
227  foreach ($this->getLocales() as $locale) {
228  $locale = str_replace('_', '-', $locale);
229  $allLanguageCodesFromLocales[$locale] = $locale;
230  }
231  $selectedLanguage = 'default';
232  $preferredLanguages = GeneralUtility::trimExplode(',', $languageCodesList);
233  // Order the preferred languages after they key
234  $sortedPreferredLanguages = [];
235  foreach ($preferredLanguages as $preferredLanguage) {
236  $quality = 1.0;
237  if (strpos($preferredLanguage, ';q=') !== false) {
238  list($preferredLanguage, $quality) = explode(';q=', $preferredLanguage);
239  }
240  $sortedPreferredLanguages[$preferredLanguage] = $quality;
241  }
242  // Loop through the languages, with the highest priority first
243  arsort($sortedPreferredLanguages, SORT_NUMERIC);
244  foreach ($sortedPreferredLanguages as $preferredLanguage => $quality) {
245  if (isset($allLanguageCodesFromLocales[$preferredLanguage])) {
246  $selectedLanguage = $allLanguageCodesFromLocales[$preferredLanguage];
247  break;
248  }
249  // Strip the country code from the end
250  list($preferredLanguage, ) = explode('-', $preferredLanguage);
251  if (isset($allLanguageCodesFromLocales[$preferredLanguage])) {
252  $selectedLanguage = $allLanguageCodesFromLocales[$preferredLanguage];
253  break;
254  }
255  }
256  if (!$selectedLanguage || $selectedLanguage === 'en') {
257  $selectedLanguage = 'default';
258  }
259  return $selectedLanguage;
260  }
261 }
static trimExplode($delim, $string, $removeEmptyValues=false, $limit=0)
static makeInstance($className,... $constructorArguments)
static mergeRecursiveWithOverrule(array &$original, array $overrule, $addKeys=true, $includeEmptyValues=true, $enableUnsetFeature=true)
getPreferredClientLanguage($languageCodesList)
Definition: Locales.php:220
if(TYPO3_MODE==='BE') $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tsfebeuserauth.php']['frontendEditingController']['default']