Mercurial > hg > isophonics-drupal-site
comparison core/modules/language/src/Entity/ConfigurableLanguage.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 129ea1e6d783 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4c8ae668cc8c |
---|---|
1 <?php | |
2 | |
3 namespace Drupal\language\Entity; | |
4 | |
5 use Drupal\Core\Config\Entity\ConfigEntityBase; | |
6 use Drupal\Core\Entity\EntityStorageInterface; | |
7 use Drupal\Core\Language\LanguageManager; | |
8 use Drupal\language\ConfigurableLanguageManager; | |
9 use Drupal\language\ConfigurableLanguageManagerInterface; | |
10 use Drupal\language\Exception\DeleteDefaultLanguageException; | |
11 use Drupal\language\ConfigurableLanguageInterface; | |
12 | |
13 /** | |
14 * Defines the ConfigurableLanguage entity. | |
15 * | |
16 * @ConfigEntityType( | |
17 * id = "configurable_language", | |
18 * label = @Translation("Language"), | |
19 * handlers = { | |
20 * "list_builder" = "Drupal\language\LanguageListBuilder", | |
21 * "access" = "Drupal\language\LanguageAccessControlHandler", | |
22 * "form" = { | |
23 * "add" = "Drupal\language\Form\LanguageAddForm", | |
24 * "edit" = "Drupal\language\Form\LanguageEditForm", | |
25 * "delete" = "Drupal\language\Form\LanguageDeleteForm" | |
26 * } | |
27 * }, | |
28 * admin_permission = "administer languages", | |
29 * config_prefix = "entity", | |
30 * entity_keys = { | |
31 * "id" = "id", | |
32 * "label" = "label", | |
33 * "weight" = "weight" | |
34 * }, | |
35 * links = { | |
36 * "delete-form" = "/admin/config/regional/language/delete/{configurable_language}", | |
37 * "edit-form" = "/admin/config/regional/language/edit/{configurable_language}", | |
38 * "collection" = "/admin/config/regional/language", | |
39 * } | |
40 * ) | |
41 */ | |
42 class ConfigurableLanguage extends ConfigEntityBase implements ConfigurableLanguageInterface { | |
43 | |
44 /** | |
45 * The language ID (machine name). | |
46 * | |
47 * @var string | |
48 */ | |
49 protected $id; | |
50 | |
51 /** | |
52 * The human-readable label for the language. | |
53 * | |
54 * @var string | |
55 */ | |
56 protected $label; | |
57 | |
58 /** | |
59 * The direction of language, either DIRECTION_LTR or DIRECTION_RTL. | |
60 * | |
61 * @var int | |
62 */ | |
63 protected $direction = self::DIRECTION_LTR; | |
64 | |
65 /** | |
66 * The weight of the language, used in lists of languages. | |
67 * | |
68 * @var int | |
69 */ | |
70 protected $weight = 0; | |
71 | |
72 /** | |
73 * Locked languages cannot be edited. | |
74 * | |
75 * @var bool | |
76 */ | |
77 protected $locked = FALSE; | |
78 | |
79 /** | |
80 * Used during saving to detect when the site becomes multilingual. | |
81 * | |
82 * This property is not saved to the language entity, but is needed for | |
83 * detecting when to rebuild the services. | |
84 * | |
85 * @see \Drupal\language\Entity\ConfigurableLanguage::preSave() | |
86 * @see \Drupal\language\Entity\ConfigurableLanguage::postSave() | |
87 * | |
88 * @var bool | |
89 */ | |
90 protected $preSaveMultilingual; | |
91 | |
92 /** | |
93 * {@inheritdoc} | |
94 */ | |
95 public function isDefault() { | |
96 return static::getDefaultLangcode() == $this->id(); | |
97 } | |
98 | |
99 /** | |
100 * {@inheritdoc} | |
101 */ | |
102 public function isLocked() { | |
103 return (bool) $this->locked; | |
104 } | |
105 | |
106 /** | |
107 * {@inheritdoc} | |
108 */ | |
109 public function preSave(EntityStorageInterface $storage) { | |
110 parent::preSave($storage); | |
111 // Store whether or not the site is already multilingual so that we can | |
112 // rebuild services if necessary during | |
113 // \Drupal\language\Entity\ConfigurableLanguage::postSave(). | |
114 $this->preSaveMultilingual = \Drupal::languageManager()->isMultilingual(); | |
115 } | |
116 | |
117 /** | |
118 * {@inheritdoc} | |
119 */ | |
120 public function postSave(EntityStorageInterface $storage, $update = TRUE) { | |
121 parent::postSave($storage, $update); | |
122 | |
123 $language_manager = \Drupal::languageManager(); | |
124 $language_manager->reset(); | |
125 if (!$this->isLocked() && $language_manager instanceof ConfigurableLanguageManagerInterface && !$this->isSyncing()) { | |
126 $language_manager->updateLockedLanguageWeights(); | |
127 } | |
128 | |
129 // Update URL Prefixes for all languages after the | |
130 // LanguageManagerInterface::getLanguages() cache is flushed. | |
131 language_negotiation_url_prefixes_update(); | |
132 | |
133 // If after adding this language the site will become multilingual, we need | |
134 // to rebuild language services. | |
135 if (!$this->preSaveMultilingual && !$update && $language_manager instanceof ConfigurableLanguageManagerInterface) { | |
136 $language_manager::rebuildServices(); | |
137 } | |
138 if (!$update) { | |
139 // Install any available language configuration overrides for the language. | |
140 \Drupal::service('language.config_factory_override')->installLanguageOverrides($this->id()); | |
141 } | |
142 } | |
143 | |
144 /** | |
145 * {@inheritdoc} | |
146 * | |
147 * @throws \DeleteDefaultLanguageException | |
148 * Exception thrown if we're trying to delete the default language entity. | |
149 * This is not allowed as a site must have a default language. | |
150 */ | |
151 public static function preDelete(EntityStorageInterface $storage, array $entities) { | |
152 $default_langcode = static::getDefaultLangcode(); | |
153 foreach ($entities as $entity) { | |
154 if ($entity->id() == $default_langcode && !$entity->isUninstalling()) { | |
155 throw new DeleteDefaultLanguageException('Can not delete the default language'); | |
156 } | |
157 } | |
158 } | |
159 | |
160 /** | |
161 * {@inheritdoc} | |
162 */ | |
163 public static function postDelete(EntityStorageInterface $storage, array $entities) { | |
164 parent::postDelete($storage, $entities); | |
165 $language_manager = \Drupal::languageManager(); | |
166 $language_manager->reset(); | |
167 $entity = reset($entities); | |
168 if ($language_manager instanceof ConfigurableLanguageManagerInterface && !$entity->isUninstalling() && !$entity->isSyncing()) { | |
169 $language_manager->updateLockedLanguageWeights(); | |
170 } | |
171 // If after deleting this language the site will become monolingual, we need | |
172 // to rebuild language services. | |
173 if (!\Drupal::languageManager()->isMultilingual()) { | |
174 ConfigurableLanguageManager::rebuildServices(); | |
175 } | |
176 } | |
177 | |
178 /** | |
179 * Gets the default langcode. | |
180 * | |
181 * @return string | |
182 * The current default langcode. | |
183 */ | |
184 protected static function getDefaultLangcode() { | |
185 $language = \Drupal::service('language.default')->get(); | |
186 return $language->getId(); | |
187 } | |
188 | |
189 /** | |
190 * {@inheritdoc} | |
191 */ | |
192 public function getName() { | |
193 return $this->label(); | |
194 } | |
195 | |
196 /** | |
197 * {@inheritdoc} | |
198 */ | |
199 public function setName($name) { | |
200 $this->label = $name; | |
201 | |
202 return $this; | |
203 } | |
204 | |
205 /** | |
206 * {@inheritdoc} | |
207 */ | |
208 public function getId() { | |
209 return $this->id(); | |
210 } | |
211 | |
212 /** | |
213 * {@inheritdoc} | |
214 */ | |
215 public function getDirection() { | |
216 return $this->direction; | |
217 } | |
218 | |
219 /** | |
220 * {@inheritdoc} | |
221 */ | |
222 public function getWeight() { | |
223 return $this->weight; | |
224 } | |
225 | |
226 /** | |
227 * {@inheritdoc} | |
228 */ | |
229 public function setWeight($weight) { | |
230 $this->weight = $weight; | |
231 return $this; | |
232 } | |
233 | |
234 /** | |
235 * Creates a configurable language object from a langcode. | |
236 * | |
237 * @param string $langcode | |
238 * The language code to use to create the object. | |
239 * | |
240 * @return $this | |
241 * | |
242 * @see \Drupal\Core\Language\LanguageManager::getStandardLanguageList() | |
243 */ | |
244 public static function createFromLangcode($langcode) { | |
245 $standard_languages = LanguageManager::getStandardLanguageList(); | |
246 if (!isset($standard_languages[$langcode])) { | |
247 // Drupal does not know about this language, so we set its values with the | |
248 // best guess. The user will be able to edit afterwards. | |
249 return static::create([ | |
250 'id' => $langcode, | |
251 'label' => $langcode, | |
252 ]); | |
253 } | |
254 else { | |
255 // A known predefined language, details will be filled in properly. | |
256 return static::create([ | |
257 'id' => $langcode, | |
258 'label' => $standard_languages[$langcode][0], | |
259 'direction' => isset($standard_languages[$langcode][2]) ? $standard_languages[$langcode][2] : static::DIRECTION_LTR, | |
260 ]); | |
261 } | |
262 } | |
263 | |
264 } |