Commit 96420cbd authored by catch's avatar catch
Browse files

Issue #2613222 by webflo, alexpott, ameymudras, pooja saraah, _utsavsharma,...

Issue #2613222 by webflo, alexpott, ameymudras, pooja saraah, _utsavsharma, penyaskito, Janvi Dasani: Language module shouldn't alter config in sync mode

(cherry picked from commit 7e2db381)
parent 30405997
Loading
Loading
Loading
Loading
Loading
+24 −3
Original line number Diff line number Diff line
@@ -7,12 +7,15 @@

use Drupal\Core\Url;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Config\FileStorage;
use Drupal\Core\Config\InstallStorage;
use Drupal\Core\Entity\ContentEntityFormInterface;
use Drupal\Core\Entity\EntityFormInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Installer\InstallerKernel;
use Drupal\Core\Language\LanguageInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Session\AccountInterface;
@@ -289,8 +292,26 @@ function language_negotiation_url_prefixes_update() {
/**
 * Implements hook_modules_installed().
 */
function language_modules_installed($modules) {
function language_modules_installed($modules, $is_syncing) {
  if ($is_syncing) {
    return;
  }

  if (!in_array('language', $modules)) {
    if (InstallerKernel::installationAttempted()) {
      // If the install profile provides its own language.types configuration do
      // not overwrite it.
      $profile_directory = \Drupal::service('extension.list.profile')->getPath(\Drupal::installProfile());
      $profile_storages = [
        new FileStorage($profile_directory . '/' . InstallStorage::CONFIG_INSTALL_DIRECTORY),
        new FileStorage($profile_directory . '/' . InstallStorage::CONFIG_OPTIONAL_DIRECTORY),
      ];
      foreach ($profile_storages as $storage) {
        if ($storage->exists('language.types')) {
          return;
        }
      }
    }
    // Since newly (un)installed modules may change the default settings for
    // non-locked language types (e.g. content language), we need to resave the
    // language type configuration.
@@ -318,8 +339,8 @@ function language_modules_installed($modules) {
/**
 * Implements hook_modules_uninstalled().
 */
function language_modules_uninstalled($modules) {
  language_modules_installed($modules);
function language_modules_uninstalled($modules, $is_syncing) {
  language_modules_installed($modules, $is_syncing);
}

/**
+42 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\Tests\language\Functional;

use Drupal\Tests\BrowserTestBase;

/**
 * Ensures the language config is installed but not altered on install.
 *
 * @group language
 */
class LanguageConfigInstallOverrideExistingTest extends BrowserTestBase {

  /**
   * {@inheritdoc}
   */
  protected $profile = 'test_language_negotiation';

  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';

  /**
   * Tests when language config is installed existing config is not overridden.
   */
  public function testLanguageConfigInstallOverrideExisting() {
    /** @var \Drupal\Core\Config\StorageInterface $storage */
    $storage = $this->container->get('config.storage');
    $config = $this->config('language.types');

    // The negotiation methods that have been removed should be disabled after
    // purging if not avoided in language_modules_installed().
    $language_types_data = $storage->read('language.types');
    $this->assertTrue(isset($language_types_data['negotiation']['language_content']['enabled']['test_language_negotiation_method']));
    $this->assertTrue(isset($language_types_data['negotiation']['language_content']['enabled']['language-selected']));

    $this->assertEquals(-10, $config->get('negotiation.language_content.enabled.test_language_negotiation_method'));
    $this->assertEquals(12, $config->get('negotiation.language_content.enabled.language-selected'));
  }

}
+39 −0
Original line number Diff line number Diff line
all:
  - language_interface
  - language_content
  - language_url
configurable:
  - language_interface
  - language_content
negotiation:
  language_content:
    enabled:
      test_language_negotiation_method: -10
      language-url: -8
      language-selected: 12
    method_weights:
      test_language_negotiation_method: -10
      language-content-entity: -9
      language-url: -8
      language-session: -6
      language-user: -4
      language-browser: -2
      language-interface: 9
      language-selected: 12
  language_url:
    enabled:
      language-url: 0
      language-url-fallback: 1
  language_interface:
    enabled:
      language-user-admin: -20
      language-user: -19
      language-url: -18
      language-selected: -15
    method_weights:
      language-user-admin: -20
      language-user: -19
      language-url: -18
      language-session: -17
      language-browser: -16
      language-selected: -15
+7 −0
Original line number Diff line number Diff line
name: Testing language negotiation
type: profile
description: 'Minimal profile for running tests related the language negotiation.'
version: VERSION
hidden: true
install:
  - drupal:language