Commit 7472192c authored by Jeffrey Bertoen's avatar Jeffrey Bertoen
Browse files

Issue #3257863: Separate default_langcode from system site settings

parent e25fdaed
Loading
Loading
Loading
Loading
+8 −10
Original line number Diff line number Diff line
@@ -12,7 +12,6 @@ use Drupal\domain\DomainInterface;
 * Implements hook_language_switch_links_alter().
 */
function domain_language_negotiation_language_switch_links_alter(array &$links, $type) {
  if ($type === 'language_interface') {
  /** @var \Drupal\domain\DomainNegotiatorInterface $negotiator */
  $negotiator = \Drupal::service('domain.negotiator');

@@ -26,7 +25,6 @@ function domain_language_negotiation_language_switch_links_alter(array &$links,
    }
  }
}
}

/**
 * Implements hook_domain_operations().
+4 −28
Original line number Diff line number Diff line
@@ -82,34 +82,10 @@ class DomainLanguageOverrider implements ConfigFactoryOverrideInterface {
            // Initialize site settings.
            $overrides[$name] = $configs[$name];
          }
        }
        elseif ($name === 'language.negotiation') {
          $languages = \Drupal::config('domain.language.' . $this->domain->getOriginalId() . '.' . $name)->get(
            'languages'
          );

          // Setting array as null will reset keys.
          if (!empty($languages)) {
            // @todo use alter mechanism to properly remove array entries.
            // @see: https://www.drupal.org/node/2829242
            $overrides[$name]['url']['prefixes'] = NULL;
            $overrides[$name]['url']['domains'] = NULL;

            // Set global config var to use second override mechanisms.
            if ($this->nestedLevel === 1) {
              $negotiations = \Drupal::config($name)->getRawData();

              // @todo use 'Drupal\Core\Site\Settings' when available.
              // @see: https://www.drupal.org/node/2183591
              $config[$name]['url']['prefixes'] = array_intersect_key(
                $negotiations['url']['prefixes'],
                $languages
              );
              $config[$name]['url']['domains'] = array_intersect_key(
                $negotiations['url']['domains'],
                $languages
              );
            }

          $languageConfigOverride = \Drupal::config('domain.language.' . $this->domain->getOriginalId() . '.language.negotiation')->getRawData();
          if (!empty($languageConfigOverride['default_langcode'])) {
            $overrides[$name]['default_langcode'] = $languageConfigOverride['default_langcode'];
          }
        }
      }
+19 −38
Original line number Diff line number Diff line
@@ -80,7 +80,10 @@ class DomainLanguageForm extends FormBase {

    // Load the domain default language.
    $config = $this->config('domain.config.' . $domain->getOriginalId() . '.system.site')->getRawData();
    $defaultLanguage = $config['default_langcode'] ?? self::DEFAULT_LANGUAGE_SITE;
    $defaultOldLanguage = $config['default_langcode'] ?? self::DEFAULT_LANGUAGE_SITE;

    $config = $this->config('domain.language.' . $domain->getOriginalId() . '.language.negotiation');
    $data = $config->getRawData();

    /** @var \Drupal\Core\Language\LanguageInterface $defaultLanguageRaw */
    $defaultLanguageRaw = $this->languageManager->getLanguage($defaultRaw);
@@ -108,7 +111,7 @@ class DomainLanguageForm extends FormBase {
        'This will override the default language: %default.',
        ['%default' => $defaultLanguageRaw->getName()]
      ),
      '#default_value' => $defaultLanguage,
      '#default_value' => $data['default_langcode'] ?? $defaultOldLanguage,
      '#required' => TRUE,
    ];

@@ -117,9 +120,6 @@ class DomainLanguageForm extends FormBase {
      $options[$language->getId()] = $language->getName();
    }

    $config = $this->config('domain.language.' . $domain->getOriginalId() . '.language.negotiation');
    $data = $config->getRawData();

    $form['languages'] = [
      '#type' => 'checkboxes',
      '#title' => $this->t('Languages allowed'),
@@ -157,52 +157,33 @@ class DomainLanguageForm extends FormBase {
    $languages = array_filter($form_state->getValue('languages'));

    // Set default language into domain config file.
    $config = $this->configFactory()->getEditable('domain.config.' . $domain_id . '.system.site');
    if ($default_language === self::DEFAULT_LANGUAGE_SITE) {
      $data = $config->getRawData();
      unset($data['default_langcode']);
      $config->setData($data);

      if (empty($data)) {
        // Delete if config is now empty.
        $config->delete();
      }
      else {
        $config->save();
      }
    $config = $this->configFactory()->getEditable('domain.language.' . $domain_id . '.language.negotiation');
    if ($default_language !== self::DEFAULT_LANGUAGE_SITE) {
      $config->set('default_langcode', $default_language);
      $languages[$default_language] = $default_language;
    }
    else {
      $config->set('default_langcode', $default_language);
      $config->save();
      $config->clear('default_langcode');
    }

    // Set default language into domain language file.
    $config = $this->configFactory()->getEditable('domain.language.' . $domain_id . '.language.negotiation');
    if (empty($languages)) {
      $config->delete();
    if (!empty($languages)) {
      $config->set('languages', $languages);
    }
    else {
      $languages[$default_language] = $default_language;
      $config->set('languages', $languages);
      $config->save();
      $config->clear('languages');
    }

    // Remove any prefixes and domains in negotiation settings from
    // domain.config file to avoid any unexpected override.
    $config = $this->configFactory()->getEditable('domain.config.' . $domain_id . '.language.negotiation');
    $data = $config->getRawData();
    unset($data['url']['prefixes'], $data['url']['domains']);
    if (empty($data['url'])) {
      unset($data['url']);
    }
    if (empty($data)) {
    if (empty($config->get('languages'))) {
      $config->delete();
    }
    else {
      $config->setData($data);
      $config->save();
      $this->routeBuilder->rebuild();
      return;
    }

    $config->clear('url.prefixes');
    $config->clear('url.domains');
    $config->save();
    $this->routeBuilder->rebuild();
  }

+52 −27
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@

namespace Drupal\domain_language_negotiation;

use Drupal\Console\Bootstrap\Drupal;
use Drupal\Core\Language\Language;
use Drupal\Core\Language\LanguageDefault as BaseLanguageDefault;
use Drupal\Core\Language\LanguageInterface;
@@ -37,19 +38,52 @@ class LanguageDefault extends BaseLanguageDefault {
   */
  public function get() {
    // Try while domain is loaded.
    if (empty($this->languageDomain)) {
    if (!empty($this->languageDomain)) {
      return $this->languageDomain;
    }
    // Load default language.
      $language = parent::get();
    $this->languageDomain = parent::get();

    try {
      /** @var \Drupal\domain\DomainNegotiatorInterface $negotiator */
      $negotiator = \Drupal::service('domain.negotiator');
      $domain = $negotiator->getActiveDomain();
      if (!$domain) {
        $language = $this->languageDomain;
        unset($this->languageDomain);
        return $language;
      }

      $name = 'domain.language.' . $domain->getOriginalId() . '.language.negotiation';
      $default_langcode = \Drupal::configFactory()->get($name)->get('default_langcode');

      if (!empty($default_langcode)) {
        return $this->setLanguage($default_langcode, $this->languageDomain);
      }

        // Try to load domain override.
        if ($domain = $negotiator->getActiveDomain()) {
      $default_langcode = \Drupal::config('system.site')->get('default_langcode');
      return $this->setLanguage($default_langcode, $this->languageDomain);
    }
    catch (ServiceCircularReferenceException $e) {
      $language = $this->languageDomain;
      unset($this->languageDomain);
      return $language;
    }
  }

  /**
   * Set the default language.
   *
   * @param string $default_langcode
   * @param LanguageInterface $fallback_language
   *
   * @return \Drupal\Core\Language\LanguageInterface
   */
  private function setLanguage(string $default_langcode, LanguageInterface $fallback_language) {
    if ($fallback_language->getId() === $default_langcode) {
      return $fallback_language;
    }

          if ($language->getId() !== $default_langcode) {
    $language = $this->getLanguage($default_langcode);

    // @todo check if necessary ?
@@ -59,21 +93,12 @@ class LanguageDefault extends BaseLanguageDefault {
    if ($translation = \Drupal::translation()) {
      $translation->setDefaultLangcode($language->getId());
    }
          }

    $this->languageDomain = $language;
        }
      }
      catch (ServiceCircularReferenceException $e) {
        // @todo Seems to occur only in command line.
      }

    return $language;
  }

    return $this->languageDomain;
  }

  /**
   * Gets the language.
   *
@@ -83,7 +108,7 @@ class LanguageDefault extends BaseLanguageDefault {
   * @return \Drupal\Core\Language\Language
   *   The language.
   */
  protected function getLanguage($langcode): Language {
  protected function getLanguage(string $langcode): Language {
    $config = \Drupal::config('language.entity.' . $langcode);
    $data = $config->get();
    $data['name'] = $data['label'];