Version 1
[yaffs-website] / web / core / modules / language / src / Plugin / Condition / Language.php
diff --git a/web/core/modules/language/src/Plugin/Condition/Language.php b/web/core/modules/language/src/Plugin/Condition/Language.php
new file mode 100644 (file)
index 0000000..a5b3d41
--- /dev/null
@@ -0,0 +1,150 @@
+<?php
+
+namespace Drupal\language\Plugin\Condition;
+
+use Drupal\Core\Condition\ConditionPluginBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides a 'Language' condition.
+ *
+ * @Condition(
+ *   id = "language",
+ *   label = @Translation("Language"),
+ *   context = {
+ *     "language" = @ContextDefinition("language", label = @Translation("Language"))
+ *   }
+ * )
+ */
+class Language extends ConditionPluginBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * The Language manager.
+   *
+   * @var \Drupal\Core\Language\LanguageManagerInterface
+   */
+  protected $languageManager;
+
+  /**
+   * Creates a new Language instance.
+   *
+   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
+   *   The language manager.
+   * @param array $configuration
+   *   The plugin configuration, i.e. an array with configuration values keyed
+   *   by configuration option name. The special key 'context' may be used to
+   *   initialize the defined contexts by setting it to an array of context
+   *   values keyed by context names.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   */
+  public function __construct(LanguageManagerInterface $language_manager, array $configuration, $plugin_id, $plugin_definition) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->languageManager = $language_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $container->get('language_manager'),
+      $configuration,
+      $plugin_id,
+      $plugin_definition
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    if ($this->languageManager->isMultilingual()) {
+      // Fetch languages.
+      $languages = $this->languageManager->getLanguages();
+      $langcodes_options = [];
+      foreach ($languages as $language) {
+        $langcodes_options[$language->getId()] = $language->getName();
+      }
+      $form['langcodes'] = [
+        '#type' => 'checkboxes',
+        '#title' => $this->t('Language selection'),
+        '#default_value' => $this->configuration['langcodes'],
+        '#options' => $langcodes_options,
+        '#description' => $this->t('Select languages to enforce. If none are selected, all languages will be allowed.'),
+      ];
+    }
+    else {
+      $form['langcodes'] = [
+        '#type' => 'value',
+        '#default_value' => $this->configuration['langcodes'],
+      ];
+    }
+    return parent::buildConfigurationForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
+    $this->configuration['langcodes'] = array_filter($form_state->getValue('langcodes'));
+    parent::submitConfigurationForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function summary() {
+    $language_list = $this->languageManager->getLanguages(LanguageInterface::STATE_ALL);
+    $selected = $this->configuration['langcodes'];
+    // Reduce the language list to an array of language names.
+    $language_names = array_reduce($language_list, function(&$result, $item) use ($selected) {
+      // If the current item of the $language_list array is one of the selected
+      // languages, add it to the $results array.
+      if (!empty($selected[$item->getId()])) {
+        $result[$item->getId()] = $item->getName();
+      }
+      return $result;
+    }, []);
+
+    // If we have more than one language selected, separate them by commas.
+    if (count($this->configuration['langcodes']) > 1) {
+      $languages = implode(', ', $language_names);
+    }
+    else {
+      // If we have just one language just grab the only present value.
+      $languages = array_pop($language_names);
+    }
+    if (!empty($this->configuration['negate'])) {
+      return t('The language is not @languages.', ['@languages' => $languages]);
+    }
+    return t('The language is @languages.', ['@languages' => $languages]);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function evaluate() {
+    if (empty($this->configuration['langcodes']) && !$this->isNegated()) {
+      return TRUE;
+    }
+
+    $language = $this->getContextValue('language');
+    // Language visibility settings.
+    return !empty($this->configuration['langcodes'][$language->getId()]);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return ['langcodes' => []] + parent::defaultConfiguration();
+  }
+
+}