Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\language;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Core\Language\LanguageInterface;
|
Chris@0
|
6 use Drupal\Core\Config\ConfigFactoryInterface;
|
Chris@0
|
7 use Drupal\Core\Extension\ModuleHandlerInterface;
|
Chris@0
|
8 use Drupal\Core\Language\Language;
|
Chris@0
|
9 use Drupal\Core\Language\LanguageDefault;
|
Chris@0
|
10 use Drupal\Core\Language\LanguageManager;
|
Chris@0
|
11 use Drupal\Core\StringTranslation\TranslatableMarkup;
|
Chris@0
|
12 use Drupal\Core\Url;
|
Chris@0
|
13 use Drupal\language\Config\LanguageConfigFactoryOverrideInterface;
|
Chris@0
|
14 use Drupal\language\Entity\ConfigurableLanguage;
|
Chris@0
|
15 use Symfony\Component\HttpFoundation\RequestStack;
|
Chris@0
|
16
|
Chris@0
|
17 /**
|
Chris@0
|
18 * Overrides default LanguageManager to provide configured languages.
|
Chris@0
|
19 */
|
Chris@0
|
20 class ConfigurableLanguageManager extends LanguageManager implements ConfigurableLanguageManagerInterface {
|
Chris@0
|
21
|
Chris@0
|
22 /**
|
Chris@0
|
23 * The configuration storage service.
|
Chris@0
|
24 *
|
Chris@0
|
25 * @var \Drupal\Core\Config\ConfigFactoryInterface
|
Chris@0
|
26 */
|
Chris@0
|
27 protected $configFactory;
|
Chris@0
|
28
|
Chris@0
|
29 /**
|
Chris@0
|
30 * The module handler service.
|
Chris@0
|
31 *
|
Chris@0
|
32 * @var \Drupal\Core\Extension\ModuleHandlerInterface
|
Chris@0
|
33 */
|
Chris@0
|
34 protected $moduleHandler;
|
Chris@0
|
35
|
Chris@0
|
36 /**
|
Chris@0
|
37 * The language configuration override service.
|
Chris@0
|
38 *
|
Chris@0
|
39 * @var \Drupal\language\Config\LanguageConfigFactoryOverrideInterface
|
Chris@0
|
40 */
|
Chris@0
|
41 protected $configFactoryOverride;
|
Chris@0
|
42
|
Chris@0
|
43 /**
|
Chris@0
|
44 * The request object.
|
Chris@0
|
45 *
|
Chris@0
|
46 * @var \Symfony\Component\HttpFoundation\RequestStack
|
Chris@0
|
47 */
|
Chris@0
|
48 protected $requestStack;
|
Chris@0
|
49
|
Chris@0
|
50 /**
|
Chris@0
|
51 * The language negotiator.
|
Chris@0
|
52 *
|
Chris@0
|
53 * @var \Drupal\language\LanguageNegotiatorInterface
|
Chris@0
|
54 */
|
Chris@0
|
55 protected $negotiator;
|
Chris@0
|
56
|
Chris@0
|
57 /**
|
Chris@0
|
58 * Local cache for language type configuration data.
|
Chris@0
|
59 *
|
Chris@0
|
60 * @var array
|
Chris@0
|
61 */
|
Chris@0
|
62 protected $languageTypes;
|
Chris@0
|
63
|
Chris@0
|
64 /**
|
Chris@0
|
65 * Local cache for language type information.
|
Chris@0
|
66 *
|
Chris@0
|
67 * @var array
|
Chris@0
|
68 */
|
Chris@0
|
69 protected $languageTypesInfo;
|
Chris@0
|
70
|
Chris@0
|
71 /**
|
Chris@0
|
72 * An array of language objects keyed by language type.
|
Chris@0
|
73 *
|
Chris@0
|
74 * @var \Drupal\Core\Language\LanguageInterface[]
|
Chris@0
|
75 */
|
Chris@0
|
76 protected $negotiatedLanguages;
|
Chris@0
|
77
|
Chris@0
|
78 /**
|
Chris@0
|
79 * An array of language negotiation method IDs keyed by language type.
|
Chris@0
|
80 *
|
Chris@0
|
81 * @var array
|
Chris@0
|
82 */
|
Chris@0
|
83 protected $negotiatedMethods;
|
Chris@0
|
84
|
Chris@0
|
85 /**
|
Chris@0
|
86 * Whether or not the language manager has been initialized.
|
Chris@0
|
87 *
|
Chris@0
|
88 * @var bool
|
Chris@0
|
89 */
|
Chris@0
|
90 protected $initialized = FALSE;
|
Chris@0
|
91
|
Chris@0
|
92 /**
|
Chris@17
|
93 * Whether language types are in the process of language initialization.
|
Chris@0
|
94 *
|
Chris@17
|
95 * @var bool[]
|
Chris@0
|
96 */
|
Chris@17
|
97 protected $initializing = [];
|
Chris@0
|
98
|
Chris@0
|
99 /**
|
Chris@0
|
100 * {@inheritdoc}
|
Chris@0
|
101 */
|
Chris@0
|
102 public static function rebuildServices() {
|
Chris@0
|
103 \Drupal::service('kernel')->invalidateContainer();
|
Chris@0
|
104 }
|
Chris@0
|
105
|
Chris@0
|
106 /**
|
Chris@0
|
107 * Constructs a new ConfigurableLanguageManager object.
|
Chris@0
|
108 *
|
Chris@0
|
109 * @param \Drupal\Core\Language\LanguageDefault $default_language
|
Chris@0
|
110 * The default language service.
|
Chris@0
|
111 * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
|
Chris@0
|
112 * The configuration factory service.
|
Chris@0
|
113 * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
|
Chris@0
|
114 * The module handler service.
|
Chris@0
|
115 * @param \Drupal\language\Config\LanguageConfigFactoryOverrideInterface $config_override
|
Chris@0
|
116 * The language configuration override service.
|
Chris@0
|
117 * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
|
Chris@0
|
118 * The request stack object.
|
Chris@0
|
119 */
|
Chris@0
|
120 public function __construct(LanguageDefault $default_language, ConfigFactoryInterface $config_factory, ModuleHandlerInterface $module_handler, LanguageConfigFactoryOverrideInterface $config_override, RequestStack $request_stack) {
|
Chris@0
|
121 $this->defaultLanguage = $default_language;
|
Chris@0
|
122 $this->configFactory = $config_factory;
|
Chris@0
|
123 $this->moduleHandler = $module_handler;
|
Chris@0
|
124 $this->configFactoryOverride = $config_override;
|
Chris@0
|
125 $this->requestStack = $request_stack;
|
Chris@0
|
126 }
|
Chris@0
|
127
|
Chris@0
|
128 /**
|
Chris@0
|
129 * {@inheritdoc}
|
Chris@0
|
130 */
|
Chris@0
|
131 public function init() {
|
Chris@0
|
132 if (!$this->initialized) {
|
Chris@0
|
133 foreach ($this->getDefinedLanguageTypes() as $type) {
|
Chris@0
|
134 $this->getCurrentLanguage($type);
|
Chris@0
|
135 }
|
Chris@0
|
136 $this->initialized = TRUE;
|
Chris@0
|
137 }
|
Chris@0
|
138 }
|
Chris@0
|
139
|
Chris@0
|
140 /**
|
Chris@0
|
141 * {@inheritdoc}
|
Chris@0
|
142 */
|
Chris@0
|
143 public function isMultilingual() {
|
Chris@0
|
144 return count($this->getLanguages(LanguageInterface::STATE_CONFIGURABLE)) > 1;
|
Chris@0
|
145 }
|
Chris@0
|
146
|
Chris@0
|
147 /**
|
Chris@0
|
148 * {@inheritdoc}
|
Chris@0
|
149 */
|
Chris@0
|
150 public function getLanguageTypes() {
|
Chris@0
|
151 $this->loadLanguageTypesConfiguration();
|
Chris@0
|
152 return $this->languageTypes['configurable'];
|
Chris@0
|
153 }
|
Chris@0
|
154
|
Chris@0
|
155 /**
|
Chris@0
|
156 * {@inheritdoc}
|
Chris@0
|
157 */
|
Chris@0
|
158 public function getDefinedLanguageTypes() {
|
Chris@0
|
159 $this->loadLanguageTypesConfiguration();
|
Chris@0
|
160 return $this->languageTypes['all'];
|
Chris@0
|
161 }
|
Chris@0
|
162
|
Chris@0
|
163 /**
|
Chris@0
|
164 * Retrieves language types from the configuration storage.
|
Chris@0
|
165 *
|
Chris@0
|
166 * @return array
|
Chris@0
|
167 * An array of language type names.
|
Chris@0
|
168 */
|
Chris@0
|
169 protected function loadLanguageTypesConfiguration() {
|
Chris@0
|
170 if (!$this->languageTypes) {
|
Chris@0
|
171 $this->languageTypes = $this->configFactory->get('language.types')->get() ?: ['configurable' => [], 'all' => parent::getLanguageTypes()];
|
Chris@0
|
172 }
|
Chris@0
|
173 return $this->languageTypes;
|
Chris@0
|
174 }
|
Chris@0
|
175
|
Chris@0
|
176 /**
|
Chris@0
|
177 * {@inheritdoc}
|
Chris@0
|
178 */
|
Chris@0
|
179 public function getDefinedLanguageTypesInfo() {
|
Chris@0
|
180 if (!isset($this->languageTypesInfo)) {
|
Chris@0
|
181 $defaults = parent::getDefinedLanguageTypesInfo();
|
Chris@0
|
182
|
Chris@0
|
183 $info = $this->moduleHandler->invokeAll('language_types_info');
|
Chris@0
|
184 $language_info = $info + $defaults;
|
Chris@0
|
185
|
Chris@0
|
186 // Let other modules alter the list of language types.
|
Chris@0
|
187 $this->moduleHandler->alter('language_types_info', $language_info);
|
Chris@0
|
188 $this->languageTypesInfo = $language_info;
|
Chris@0
|
189 }
|
Chris@0
|
190 return $this->languageTypesInfo;
|
Chris@0
|
191 }
|
Chris@0
|
192
|
Chris@0
|
193 /**
|
Chris@0
|
194 * {@inheritdoc}
|
Chris@0
|
195 */
|
Chris@0
|
196 public function saveLanguageTypesConfiguration(array $values) {
|
Chris@0
|
197 $config = $this->configFactory->getEditable('language.types');
|
Chris@0
|
198 if (isset($values['configurable'])) {
|
Chris@0
|
199 $config->set('configurable', $values['configurable']);
|
Chris@0
|
200 }
|
Chris@0
|
201 if (isset($values['all'])) {
|
Chris@0
|
202 $config->set('all', $values['all']);
|
Chris@0
|
203 }
|
Chris@18
|
204 $config->save(TRUE);
|
Chris@0
|
205 }
|
Chris@0
|
206
|
Chris@0
|
207 /**
|
Chris@0
|
208 * {@inheritdoc}
|
Chris@0
|
209 */
|
Chris@0
|
210 public function getCurrentLanguage($type = LanguageInterface::TYPE_INTERFACE) {
|
Chris@0
|
211 if (!isset($this->negotiatedLanguages[$type])) {
|
Chris@0
|
212 // Ensure we have a valid value for this language type.
|
Chris@0
|
213 $this->negotiatedLanguages[$type] = $this->getDefaultLanguage();
|
Chris@0
|
214
|
Chris@0
|
215 if ($this->negotiator && $this->isMultilingual()) {
|
Chris@17
|
216 if (!isset($this->initializing[$type])) {
|
Chris@17
|
217 $this->initializing[$type] = TRUE;
|
Chris@0
|
218 $negotiation = $this->negotiator->initializeType($type);
|
Chris@0
|
219 $this->negotiatedLanguages[$type] = reset($negotiation);
|
Chris@0
|
220 $this->negotiatedMethods[$type] = key($negotiation);
|
Chris@17
|
221 unset($this->initializing[$type]);
|
Chris@0
|
222 }
|
Chris@0
|
223 // If the current interface language needs to be retrieved during
|
Chris@0
|
224 // initialization we return the system language. This way string
|
Chris@0
|
225 // translation calls happening during initialization will return the
|
Chris@0
|
226 // original strings which can be translated by calling them again
|
Chris@0
|
227 // afterwards. This can happen for instance while parsing negotiation
|
Chris@0
|
228 // method definitions.
|
Chris@0
|
229 elseif ($type == LanguageInterface::TYPE_INTERFACE) {
|
Chris@0
|
230 return new Language(['id' => LanguageInterface::LANGCODE_SYSTEM]);
|
Chris@0
|
231 }
|
Chris@0
|
232 }
|
Chris@0
|
233 }
|
Chris@0
|
234
|
Chris@0
|
235 return $this->negotiatedLanguages[$type];
|
Chris@0
|
236 }
|
Chris@0
|
237
|
Chris@0
|
238 /**
|
Chris@0
|
239 * {@inheritdoc}
|
Chris@0
|
240 */
|
Chris@0
|
241 public function reset($type = NULL) {
|
Chris@0
|
242 if (!isset($type)) {
|
Chris@0
|
243 $this->initialized = FALSE;
|
Chris@0
|
244 $this->negotiatedLanguages = [];
|
Chris@0
|
245 $this->negotiatedMethods = [];
|
Chris@0
|
246 $this->languageTypes = NULL;
|
Chris@0
|
247 $this->languageTypesInfo = NULL;
|
Chris@0
|
248 $this->languages = [];
|
Chris@0
|
249 if ($this->negotiator) {
|
Chris@0
|
250 $this->negotiator->reset();
|
Chris@0
|
251 }
|
Chris@0
|
252 }
|
Chris@0
|
253 elseif (isset($this->negotiatedLanguages[$type])) {
|
Chris@0
|
254 unset($this->negotiatedLanguages[$type]);
|
Chris@0
|
255 unset($this->negotiatedMethods[$type]);
|
Chris@0
|
256 }
|
Chris@0
|
257 return $this;
|
Chris@0
|
258 }
|
Chris@0
|
259
|
Chris@0
|
260 /**
|
Chris@0
|
261 * {@inheritdoc}
|
Chris@0
|
262 */
|
Chris@0
|
263 public function getNegotiator() {
|
Chris@0
|
264 return $this->negotiator;
|
Chris@0
|
265 }
|
Chris@0
|
266
|
Chris@0
|
267 /**
|
Chris@0
|
268 * {@inheritdoc}
|
Chris@0
|
269 */
|
Chris@0
|
270 public function setNegotiator(LanguageNegotiatorInterface $negotiator) {
|
Chris@0
|
271 $this->negotiator = $negotiator;
|
Chris@0
|
272 $this->initialized = FALSE;
|
Chris@0
|
273 $this->negotiatedLanguages = [];
|
Chris@0
|
274 }
|
Chris@0
|
275
|
Chris@0
|
276 /**
|
Chris@0
|
277 * {@inheritdoc}
|
Chris@0
|
278 */
|
Chris@0
|
279 public function getLanguages($flags = LanguageInterface::STATE_CONFIGURABLE) {
|
Chris@0
|
280 // If a config override is set, cache using that language's ID.
|
Chris@0
|
281 if ($override_language = $this->getConfigOverrideLanguage()) {
|
Chris@0
|
282 $static_cache_id = $override_language->getId();
|
Chris@0
|
283 }
|
Chris@0
|
284 else {
|
Chris@0
|
285 $static_cache_id = $this->getCurrentLanguage()->getId();
|
Chris@0
|
286 }
|
Chris@0
|
287
|
Chris@0
|
288 if (!isset($this->languages[$static_cache_id][$flags])) {
|
Chris@0
|
289 // Initialize the language list with the default language and default
|
Chris@0
|
290 // locked languages. These cannot be removed. This serves as a fallback
|
Chris@0
|
291 // list if this method is invoked while the language module is installed
|
Chris@0
|
292 // and the configuration entities for languages are not yet fully
|
Chris@0
|
293 // imported.
|
Chris@0
|
294 $default = $this->getDefaultLanguage();
|
Chris@0
|
295 $languages = [$default->getId() => $default];
|
Chris@0
|
296 $languages += $this->getDefaultLockedLanguages($default->getWeight());
|
Chris@0
|
297
|
Chris@0
|
298 // Load configurable languages on top of the defaults. Ideally this could
|
Chris@0
|
299 // use the entity API to load and instantiate ConfigurableLanguage
|
Chris@0
|
300 // objects. However the entity API depends on the language system, so that
|
Chris@0
|
301 // would result in infinite loops. We use the configuration system
|
Chris@0
|
302 // directly and instantiate runtime Language objects. When language
|
Chris@0
|
303 // entities are imported those cover the default and locked languages, so
|
Chris@0
|
304 // site-specific configuration will prevail over the fallback values.
|
Chris@0
|
305 // Having them in the array already ensures if this is invoked in the
|
Chris@0
|
306 // middle of importing language configuration entities, the defaults are
|
Chris@0
|
307 // always present.
|
Chris@0
|
308 $config_ids = $this->configFactory->listAll('language.entity.');
|
Chris@0
|
309 foreach ($this->configFactory->loadMultiple($config_ids) as $config) {
|
Chris@0
|
310 $data = $config->get();
|
Chris@0
|
311 $data['name'] = $data['label'];
|
Chris@0
|
312 $languages[$data['id']] = new Language($data);
|
Chris@0
|
313 }
|
Chris@0
|
314 Language::sort($languages);
|
Chris@0
|
315
|
Chris@0
|
316 // Filter the full list of languages based on the value of $flags.
|
Chris@0
|
317 $this->languages[$static_cache_id][$flags] = $this->filterLanguages($languages, $flags);
|
Chris@0
|
318 }
|
Chris@0
|
319
|
Chris@0
|
320 return $this->languages[$static_cache_id][$flags];
|
Chris@0
|
321 }
|
Chris@0
|
322
|
Chris@0
|
323 /**
|
Chris@0
|
324 * {@inheritdoc}
|
Chris@0
|
325 */
|
Chris@0
|
326 public function getNativeLanguages() {
|
Chris@0
|
327 $languages = $this->getLanguages(LanguageInterface::STATE_CONFIGURABLE);
|
Chris@0
|
328 $natives = [];
|
Chris@0
|
329
|
Chris@0
|
330 $original_language = $this->getConfigOverrideLanguage();
|
Chris@0
|
331
|
Chris@0
|
332 foreach ($languages as $langcode => $language) {
|
Chris@0
|
333 $this->setConfigOverrideLanguage($language);
|
Chris@0
|
334 $natives[$langcode] = ConfigurableLanguage::load($langcode);
|
Chris@0
|
335 }
|
Chris@0
|
336 $this->setConfigOverrideLanguage($original_language);
|
Chris@0
|
337 Language::sort($natives);
|
Chris@0
|
338 return $natives;
|
Chris@0
|
339 }
|
Chris@0
|
340
|
Chris@0
|
341 /**
|
Chris@0
|
342 * {@inheritdoc}
|
Chris@0
|
343 */
|
Chris@0
|
344 public function updateLockedLanguageWeights() {
|
Chris@0
|
345 // Get the weight of the last configurable language.
|
Chris@0
|
346 $configurable_languages = $this->getLanguages(LanguageInterface::STATE_CONFIGURABLE);
|
Chris@0
|
347 $max_weight = end($configurable_languages)->getWeight();
|
Chris@0
|
348
|
Chris@0
|
349 $locked_languages = $this->getLanguages(LanguageInterface::STATE_LOCKED);
|
Chris@0
|
350 // Update locked language weights to maintain the existing order, if
|
Chris@0
|
351 // necessary.
|
Chris@0
|
352 if (reset($locked_languages)->getWeight() <= $max_weight) {
|
Chris@0
|
353 foreach ($locked_languages as $language) {
|
Chris@0
|
354 // Update system languages weight.
|
Chris@0
|
355 $max_weight++;
|
Chris@0
|
356 ConfigurableLanguage::load($language->getId())
|
Chris@0
|
357 ->setWeight($max_weight)
|
Chris@0
|
358 ->save();
|
Chris@0
|
359 }
|
Chris@0
|
360 }
|
Chris@0
|
361 }
|
Chris@0
|
362
|
Chris@0
|
363 /**
|
Chris@0
|
364 * {@inheritdoc}
|
Chris@0
|
365 */
|
Chris@0
|
366 public function getFallbackCandidates(array $context = []) {
|
Chris@0
|
367 if ($this->isMultilingual()) {
|
Chris@0
|
368 $candidates = [];
|
Chris@0
|
369 if (empty($context['operation']) || $context['operation'] != 'locale_lookup') {
|
Chris@0
|
370 // If the fallback context is not locale_lookup, initialize the
|
Chris@0
|
371 // candidates with languages ordered by weight and add
|
Chris@0
|
372 // LanguageInterface::LANGCODE_NOT_SPECIFIED at the end. Interface
|
Chris@0
|
373 // translation fallback should only be based on explicit configuration
|
Chris@0
|
374 // gathered via the alter hooks below.
|
Chris@0
|
375 $candidates = array_keys($this->getLanguages());
|
Chris@0
|
376 $candidates[] = LanguageInterface::LANGCODE_NOT_SPECIFIED;
|
Chris@0
|
377 $candidates = array_combine($candidates, $candidates);
|
Chris@0
|
378
|
Chris@0
|
379 // The first candidate should always be the desired language if
|
Chris@0
|
380 // specified.
|
Chris@0
|
381 if (!empty($context['langcode'])) {
|
Chris@0
|
382 $candidates = [$context['langcode'] => $context['langcode']] + $candidates;
|
Chris@0
|
383 }
|
Chris@0
|
384 }
|
Chris@0
|
385
|
Chris@0
|
386 // Let other modules hook in and add/change candidates.
|
Chris@0
|
387 $type = 'language_fallback_candidates';
|
Chris@0
|
388 $types = [];
|
Chris@0
|
389 if (!empty($context['operation'])) {
|
Chris@0
|
390 $types[] = $type . '_' . $context['operation'];
|
Chris@0
|
391 }
|
Chris@0
|
392 $types[] = $type;
|
Chris@0
|
393 $this->moduleHandler->alter($types, $candidates, $context);
|
Chris@0
|
394 }
|
Chris@0
|
395 else {
|
Chris@0
|
396 $candidates = parent::getFallbackCandidates($context);
|
Chris@0
|
397 }
|
Chris@0
|
398
|
Chris@0
|
399 return $candidates;
|
Chris@0
|
400 }
|
Chris@0
|
401
|
Chris@0
|
402 /**
|
Chris@0
|
403 * {@inheritdoc}
|
Chris@0
|
404 */
|
Chris@0
|
405 public function getLanguageSwitchLinks($type, Url $url) {
|
Chris@0
|
406 $links = FALSE;
|
Chris@0
|
407
|
Chris@0
|
408 if ($this->negotiator) {
|
Chris@0
|
409 foreach ($this->negotiator->getNegotiationMethods($type) as $method_id => $method) {
|
Chris@0
|
410 $reflector = new \ReflectionClass($method['class']);
|
Chris@0
|
411
|
Chris@0
|
412 if ($reflector->implementsInterface('\Drupal\language\LanguageSwitcherInterface')) {
|
Chris@0
|
413 $result = $this->negotiator->getNegotiationMethodInstance($method_id)->getLanguageSwitchLinks($this->requestStack->getCurrentRequest(), $type, $url);
|
Chris@0
|
414
|
Chris@0
|
415 if (!empty($result)) {
|
Chris@0
|
416 // Allow modules to provide translations for specific links.
|
Chris@0
|
417 $this->moduleHandler->alter('language_switch_links', $result, $type, $url);
|
Chris@0
|
418 $links = (object) ['links' => $result, 'method_id' => $method_id];
|
Chris@0
|
419 break;
|
Chris@0
|
420 }
|
Chris@0
|
421 }
|
Chris@0
|
422 }
|
Chris@0
|
423 }
|
Chris@0
|
424
|
Chris@0
|
425 return $links;
|
Chris@0
|
426 }
|
Chris@0
|
427
|
Chris@0
|
428 /**
|
Chris@14
|
429 * Sets the configuration override language.
|
Chris@14
|
430 *
|
Chris@14
|
431 * @param \Drupal\Core\Language\LanguageInterface $language
|
Chris@14
|
432 * The language to override configuration with.
|
Chris@14
|
433 *
|
Chris@14
|
434 * @return $this
|
Chris@0
|
435 */
|
Chris@0
|
436 public function setConfigOverrideLanguage(LanguageInterface $language = NULL) {
|
Chris@0
|
437 $this->configFactoryOverride->setLanguage($language);
|
Chris@0
|
438 return $this;
|
Chris@0
|
439 }
|
Chris@0
|
440
|
Chris@0
|
441 /**
|
Chris@0
|
442 * {@inheritdoc}
|
Chris@0
|
443 */
|
Chris@0
|
444 public function getConfigOverrideLanguage() {
|
Chris@0
|
445 return $this->configFactoryOverride->getLanguage();
|
Chris@0
|
446 }
|
Chris@0
|
447
|
Chris@0
|
448 /**
|
Chris@0
|
449 * {@inheritdoc}
|
Chris@0
|
450 */
|
Chris@0
|
451 public function getLanguageConfigOverride($langcode, $name) {
|
Chris@0
|
452 return $this->configFactoryOverride->getOverride($langcode, $name);
|
Chris@0
|
453 }
|
Chris@0
|
454
|
Chris@0
|
455 /**
|
Chris@0
|
456 * {@inheritdoc}
|
Chris@0
|
457 */
|
Chris@0
|
458 public function getLanguageConfigOverrideStorage($langcode) {
|
Chris@0
|
459 return $this->configFactoryOverride->getStorage($langcode);
|
Chris@0
|
460 }
|
Chris@0
|
461
|
Chris@0
|
462 /**
|
Chris@0
|
463 * {@inheritdoc}
|
Chris@0
|
464 */
|
Chris@0
|
465 public function getStandardLanguageListWithoutConfigured() {
|
Chris@0
|
466 $languages = $this->getLanguages();
|
Chris@0
|
467 $predefined = $this->getStandardLanguageList();
|
Chris@0
|
468 foreach ($predefined as $key => $value) {
|
Chris@0
|
469 if (isset($languages[$key])) {
|
Chris@0
|
470 unset($predefined[$key]);
|
Chris@0
|
471 continue;
|
Chris@0
|
472 }
|
Chris@0
|
473 $predefined[$key] = new TranslatableMarkup($value[0]);
|
Chris@0
|
474 }
|
Chris@0
|
475 natcasesort($predefined);
|
Chris@0
|
476 return $predefined;
|
Chris@0
|
477 }
|
Chris@0
|
478
|
Chris@0
|
479 /**
|
Chris@0
|
480 * {@inheritdoc}
|
Chris@0
|
481 */
|
Chris@0
|
482 public function getNegotiatedLanguageMethod($type = LanguageInterface::TYPE_INTERFACE) {
|
Chris@0
|
483 if (isset($this->negotiatedLanguages[$type]) && isset($this->negotiatedMethods[$type])) {
|
Chris@0
|
484 return $this->negotiatedMethods[$type];
|
Chris@0
|
485 }
|
Chris@0
|
486 }
|
Chris@0
|
487
|
Chris@0
|
488 }
|