Upgraded drupal core with security updates
[yaffs-website] / web / core / modules / language / src / Entity / ConfigurableLanguage.php
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 }