diff core/modules/locale/src/LocaleDefaultConfigStorage.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/modules/locale/src/LocaleDefaultConfigStorage.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,159 @@
+<?php
+
+namespace Drupal\locale;
+
+use Drupal\Core\Config\ExtensionInstallStorage;
+use Drupal\Core\Config\StorageInterface;
+use Drupal\language\ConfigurableLanguageManagerInterface;
+
+/**
+ * Provides access to default configuration for locale integration.
+ *
+ * Allows unified access to default configuration from one of three sources:
+ * - Required default configuration (config/install/*)
+ * - Optional default configuration (config/optional/*)
+ * - Predefined languages mocked as default configuration (list defined in
+ *   LocaleConfigManagerInterface::getStandardLanguageList())
+ *
+ * These sources are considered equal in terms of how locale module interacts
+ * with them for translation. Their translatable source strings are exposed
+ * for interface translation and participate in remote translation updates.
+ */
+class LocaleDefaultConfigStorage {
+
+  /**
+   * The storage instance for reading configuration data.
+   *
+   * @var \Drupal\Core\Config\StorageInterface
+   */
+  protected $configStorage;
+
+  /**
+   * The language manager.
+   *
+   * @var \Drupal\language\ConfigurableLanguageManagerInterface
+   */
+  protected $languageManager;
+
+  /**
+   * The storage instance for reading required default configuration data.
+   *
+   * @var \Drupal\Core\Config\StorageInterface
+   */
+  protected $requiredInstallStorage;
+
+  /**
+   * The storage instance for reading optional default configuration data.
+   *
+   * @var \Drupal\Core\Config\StorageInterface
+   */
+  protected $optionalInstallStorage;
+
+  /**
+   * Constructs a LocaleDefaultConfigStorage.
+   *
+   * @param \Drupal\Core\Config\StorageInterface $config_storage
+   *   The storage object to use for reading configuration data.
+   * @param \Drupal\language\ConfigurableLanguageManagerInterface $language_manager
+   *   The language manager.
+   */
+  public function __construct(StorageInterface $config_storage, ConfigurableLanguageManagerInterface $language_manager, $install_profile) {
+    $this->configStorage = $config_storage;
+    $this->languageManager = $language_manager;
+
+    $this->requiredInstallStorage = new ExtensionInstallStorage($this->configStorage, ExtensionInstallStorage::CONFIG_INSTALL_DIRECTORY, ExtensionInstallStorage::DEFAULT_COLLECTION, TRUE, $install_profile);
+    $this->optionalInstallStorage = new ExtensionInstallStorage($this->configStorage, ExtensionInstallStorage::CONFIG_OPTIONAL_DIRECTORY, ExtensionInstallStorage::DEFAULT_COLLECTION, TRUE, $install_profile);
+  }
+
+  /**
+   * Read a configuration from install storage or default languages.
+   *
+   * @param string $name
+   *   Configuration object name.
+   *
+   * @return array
+   *   Configuration data from install storage or default language.
+   */
+  public function read($name) {
+    if ($this->requiredInstallStorage->exists($name)) {
+      return $this->requiredInstallStorage->read($name);
+    }
+    elseif ($this->optionalInstallStorage->exists($name)) {
+      return $this->optionalInstallStorage->read($name);
+    }
+    elseif (strpos($name, 'language.entity.') === 0) {
+      // Simulate default languages as if they were shipped as default
+      // configuration.
+      $langcode = str_replace('language.entity.', '', $name);
+      $predefined_languages = $this->languageManager->getStandardLanguageList();
+      if (isset($predefined_languages[$langcode])) {
+        $data = $this->configStorage->read($name);
+        $data['label'] = $predefined_languages[$langcode][0];
+        return $data;
+      }
+    }
+  }
+
+  /**
+   * Return the list of configuration in install storage and current languages.
+   *
+   * @return array
+   *   List of configuration in install storage and current languages.
+   */
+  public function listAll() {
+    $languages = $this->predefinedConfiguredLanguages();
+    return array_unique(
+      array_merge(
+        $this->requiredInstallStorage->listAll(),
+        $this->optionalInstallStorage->listAll(),
+        $languages
+      )
+    );
+  }
+
+  /**
+   * Get all configuration names and folders for a list of modules or themes.
+   *
+   * @param string $type
+   *   Type of components: 'module' | 'theme' | 'profile'
+   * @param array $list
+   *   Array of theme or module names.
+   *
+   * @return array
+   *   Configuration names provided by that component. In case of language
+   *   module this list is extended with configured languages that have
+   *   predefined names as well.
+   */
+  public function getComponentNames($type, array $list) {
+    $names = array_unique(
+      array_merge(
+        array_keys($this->requiredInstallStorage->getComponentNames($type, $list)),
+        array_keys($this->optionalInstallStorage->getComponentNames($type, $list))
+      )
+    );
+    if ($type == 'module' && in_array('language', $list)) {
+      $languages = $this->predefinedConfiguredLanguages();
+      $names = array_unique(array_merge($names, $languages));
+    }
+    return $names;
+  }
+
+  /**
+   * Compute the list of configuration names that match predefined languages.
+   *
+   * @return array
+   *   The list of configuration names that match predefined languages.
+   */
+  protected function predefinedConfiguredLanguages() {
+    $names = $this->configStorage->listAll('language.entity.');
+    $predefined_languages = $this->languageManager->getStandardLanguageList();
+    foreach ($names as $id => $name) {
+      $langcode = str_replace('language.entity.', '', $name);
+      if (!isset($predefined_languages[$langcode])) {
+        unset($names[$id]);
+      }
+    }
+    return array_values($names);
+  }
+
+}