3 namespace Drupal\language;
5 use Drupal\Core\Config\ConfigFactoryInterface;
6 use Drupal\Core\Config\Entity\DraggableListBuilder;
7 use Drupal\Core\Entity\EntityInterface;
8 use Drupal\Core\Entity\EntityStorageInterface;
9 use Drupal\Core\Entity\EntityTypeInterface;
10 use Drupal\Core\Form\FormStateInterface;
11 use Drupal\Core\Language\LanguageManagerInterface;
12 use Symfony\Component\DependencyInjection\ContainerInterface;
15 * Defines a class to build a listing of language entities.
17 * @see \Drupal\language\Entity\ConfigurableLanguage
19 class LanguageListBuilder extends DraggableListBuilder {
24 protected $entitiesKey = 'languages';
27 * The language manager.
29 * @var \Drupal\Core\Language\LanguageManagerInterface
31 protected $languageManager;
34 * The configuration factory.
36 * @var \Drupal\Core\Config\ConfigFactoryInterface
38 protected $configFactory;
43 public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
46 $container->get('entity.manager')->getStorage($entity_type->id()),
47 $container->get('language_manager'),
48 $container->get('config.factory')
53 * Constructs a new LanguageListBuilder object.
55 * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
56 * The entity type definition.
57 * @param \Drupal\Core\Entity\EntityStorageInterface $storage
58 * The entity storage handler class.
59 * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
60 * The language manager.
61 * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
62 * The factory for configuration objects.
64 public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, LanguageManagerInterface $language_manager, ConfigFactoryInterface $config_factory) {
65 parent::__construct($entity_type, $storage);
66 $this->languageManager = $language_manager;
67 $this->configFactory = $config_factory;
73 public function load() {
74 $entities = $this->storage->loadByProperties(['locked' => FALSE]);
76 // Sort the entities using the entity class's sort() method.
77 // See \Drupal\Core\Config\Entity\ConfigEntityBase::sort().
78 uasort($entities, [$this->entityType->getClass(), 'sort']);
85 public function getFormId() {
86 return 'language_admin_overview_form';
92 public function buildHeader() {
95 'default' => t('Default'),
96 ] + parent::buildHeader();
103 public function buildRow(EntityInterface $entity) {
104 $row['label'] = $entity->label();
107 '#parents' => ['site_default_language'],
108 '#title' => t('Set @title as default', ['@title' => $entity->label()]),
109 '#title_display' => 'invisible',
110 '#return_value' => $entity->id(),
111 '#id' => 'edit-site-default-language-' . $entity->id(),
113 // Mark the right language as default in the form.
114 if ($entity->id() == $this->languageManager->getDefaultLanguage()->getId()) {
115 $row['default']['#default_value'] = $entity->id();
117 return $row + parent::buildRow($entity);
123 public function buildForm(array $form, FormStateInterface $form_state) {
124 $form = parent::buildForm($form, $form_state);
126 $form[$this->entitiesKey]['#languages'] = $this->entities;
127 $form['actions']['submit']['#value'] = t('Save configuration');
134 public function validateForm(array &$form, FormStateInterface $form_state) {
135 if (!isset($this->entities[$form_state->getValue('site_default_language')])) {
136 $form_state->setErrorByName('site_default_language', $this->t('Selected default language no longer exists.'));
143 public function submitForm(array &$form, FormStateInterface $form_state) {
144 parent::submitForm($form, $form_state);
146 // Save the default language if changed.
147 $new_id = $form_state->getValue('site_default_language');
148 if ($new_id != $this->languageManager->getDefaultLanguage()->getId()) {
149 $this->configFactory->getEditable('system.site')->set('default_langcode', $new_id)->save();
150 $this->languageManager->reset();
153 if ($this->languageManager instanceof ConfigurableLanguageManagerInterface) {
154 $this->languageManager->updateLockedLanguageWeights();
157 drupal_set_message(t('Configuration saved.'));
158 // Force the redirection to the page with the language we have just
159 // selected as default.
160 $form_state->setRedirectUrl($this->entities[$new_id]->urlInfo('collection', ['language' => $this->entities[$new_id]]));