-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathentity_language_fallback.module
More file actions
90 lines (78 loc) · 3.34 KB
/
entity_language_fallback.module
File metadata and controls
90 lines (78 loc) · 3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php
/**
* @file
* Add fallback languages to entities.
*/
use Drupal\Core\Form\FormStateInterface;
use Drupal\language\ConfigurableLanguageInterface;
use Drupal\language\Entity\ConfigurableLanguage;
/**
* Implements hook_language_fallback_candidates_alter()
*/
function entity_language_fallback_language_fallback_candidates_alter(array &$candidates, array $context) {
$operation = $context['operation'];
if ($operation == 'entity_upcast' || $operation == 'entity_view') {
$attempted_langcode = $context['langcode'];
/** @var @var \Drupal\node\NodeInterface $entity */
$entity = $context['data'];
if (is_a($entity, 'Drupal\node\NodeInterface')) {
$candidates = [$attempted_langcode => $attempted_langcode];
/** @var Drupal\language\Entity\ConfigurableLanguage $language */
$language = ConfigurableLanguage::load($attempted_langcode);
$fallback_langcodes = $language->getThirdpartySetting('entity_language_fallback', 'fallback_langcodes', []);
foreach ($fallback_langcodes as $fallback_langcode) {
if (!empty($fallback_langcode) && $attempted_langcode != $fallback_langcode && !in_array($fallback_langcode, $candidates)) {
$candidates[$fallback_langcode] = $fallback_langcode;
}
}
}
}
}
/**
* Implements hook_form_FORM_ID_alter()
*/
function entity_language_fallback_form_language_admin_edit_form_alter(&$form, FormStateInterface $form_state) {
/** @var Drupal\language\Entity\ConfigurableLanguage $this_language */
$this_language = $form_state->getFormObject()->getEntity();
$languages = Drupal::languageManager()->getLanguages();
$options = [];
foreach($languages as $language) {
// Only include this language if its not itself.
if ($language->getId() != $this_language->getId()) {
$options[$language->getId()] = $language->getName();
}
}
$form['entity_language_fallback'] = [
'#title' => t('Entity fallback language'),
'#description' => t('Choose one or more fallback languages in prioritized order. The languages are used as fallback in entity view.'),
'#type' => 'details',
'#open' => TRUE,
'#tree' => TRUE,
];
// Creating one priority field per available language.
$default_values = $this_language->getThirdPartySetting('entity_language_fallback', 'fallback_langcodes', []);
for ($i = 0; $i < count($options); $i++) {
$form['entity_language_fallback'][$i] = [
'#type' => 'select',
'#title' => t('Priority @priority', ['@priority' => $i + 1]),
'#description' => t('Choose the language used as priority @priority fallback language.', ['@priority' => $i + 1]),
'#options' => $options,
'#default_value' => !empty($default_values[$i]) ? $default_values[$i] : '',
'#empty_option' => t('-None-'),
'#tree' => TRUE,
];
}
$form['#entity_builders'][] = 'entity_language_fallback_form_language_admin_edit_form_builder';
}
/**
* Entity builder for the language form entity_language_fallback options.
*
* @see entity_language_fallback_form_language_admin_edit_form_alter()
*/
function entity_language_fallback_form_language_admin_edit_form_builder($entity_type, ConfigurableLanguageInterface $this_language, &$form, FormStateInterface $form_state) {
$this_language->setThirdPartySetting(
'entity_language_fallback',
'fallback_langcodes',
$form_state->getValue('entity_language_fallback')
);
}