LocaleConfigBatch.php

Same filename and directory in other branches
  1. main core/modules/locale/src/LocaleConfigBatch.php

Namespace

Drupal\locale

File

core/modules/locale/src/LocaleConfigBatch.php

View source
<?php

namespace Drupal\locale;

use Drupal\Core\Batch\BatchBuilder;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Symfony\Component\DependencyInjection\Attribute\AutowireServiceClosure;

/**
 * Provides the locale config update batch services.
 */
class LocaleConfigBatch {
  use StringTranslationTrait;
  public function __construct(protected readonly LocaleConfigManager $localeConfigManager, protected readonly LanguageManagerInterface $languageManager, protected readonly MessengerInterface $messenger, #[AutowireServiceClosure('logger.channel.locale')] protected readonly \Closure $logger) {
  }
  
  /**
   * Builds a locale batch to refresh configuration.
   *
   * @param array $options
   *   An array with options that can have the following elements:
   *   - 'finish_feedback': (optional) Whether or not to give feedback to the
   *     user when the batch is finished. Defaults to TRUE.
   * @param array $langcodes
   *   (optional) Array of language codes. Defaults to all translatable
   *   languages.
   * @param array $components
   *   (optional) Array of component lists indexed by type. If not present or it
   *   is an empty array, it will update all components.
   * @param bool $update_default_config_langcodes
   *   Determines whether default configuration langcodes should be updated.
   *   This should only happen during site and extension install.
   *
   * @return array
   *   The batch definition.
   */
  public function buildBatch(array $options, array $langcodes = [], array $components = [], bool $update_default_config_langcodes = FALSE) : ?array {
    $langcodes = $langcodes ?: array_keys($this->languageManager
      ->getLanguages());
    if ($langcodes && $names = $this->localeConfigManager
      ->getComponentNames($components)) {
      // If the component list is empty we need to ensure that all configuration
      // in the default collection is using the site's default langcode.
      $options += [
        'finish_feedback' => TRUE,
      ];
      $batch_builder = (new BatchBuilder())->setTitle($this->t('Updating configuration translations'))
        ->setInitMessage($this->t('Starting configuration update'))
        ->setErrorMessage($this->t('Error updating configuration translations'));
      if ($update_default_config_langcodes && $this->languageManager
        ->getDefaultLanguage()
        ->getId() !== 'en') {
        $batch_builder->addOperation(self::class . ':batchUpdateDefaultConfigLangcodes');
      }
      // Chunking the array of names into batches of 20 for better performance.
      $name_chunks = array_chunk($names, 20);
      foreach ($name_chunks as $chunk) {
        // During installation the caching of configuration objects is disabled
        // so it is very expensive to initialize the \Drupal::config() object
        // on each request. We batch a small number of configuration object
        // upgrades together to improve the overall performance of the process.
        $batch_builder->addOperation(self::class . ':batchUpdateConfigTranslations', [
          $chunk,
          $langcodes,
        ]);
      }
      if (!empty($options['finish_feedback'])) {
        $batch_builder->setFinishCallback(self::class . ':batchFinished');
      }
      return $batch_builder->toArray();
    }
    return NULL;
  }
  
  /**
   * Implements callback_batch_operation().
   *
   * Updates default configuration when new modules or themes are installed.
   *
   * @param array|\ArrayAccess $context
   *   The batch context.
   */
  public function batchUpdateDefaultConfigLangcodes(array|\ArrayAccess &$context) : void {
    $this->localeConfigManager
      ->updateDefaultConfigLangcodes();
    $context['finished'] = 1;
    $context['message'] = $this->t('Updated default configuration to %langcode', [
      '%langcode' => $this->languageManager
        ->getDefaultLanguage()
        ->getId(),
    ]);
  }
  
  /**
   * Implements callback_batch_operation().
   *
   * Performs configuration translation refresh.
   *
   * @param array $names
   *   An array of names of configuration objects to update.
   * @param array $langcodes
   *   (optional) Array of language codes to update. Defaults to all languages.
   * @param array|\ArrayAccess $context
   *   Contains a list of files imported.
   *
   * @see \Drupal\locale\LocaleConfigBatch::buildBatch()
   */
  public function batchUpdateConfigTranslations(array $names, array $langcodes, array|\ArrayAccess &$context) : void {
    if (!isset($context['results']['stats']['config'])) {
      $context['results']['stats']['config'] = 0;
    }
    $context['results']['stats']['config'] += $this->localeConfigManager
      ->updateConfigTranslations($names, $langcodes);
    foreach ($names as $name) {
      $context['results']['names'][] = $name;
    }
    $context['results']['langcodes'] = $langcodes;
    $context['finished'] = 1;
  }
  
  /**
   * Implements callback_batch_finished().
   *
   * Finishes callback of system page locale import batch.
   *
   * @param bool $success
   *   Information about the success of the batch import.
   * @param array $results
   *   Information about the results of the batch import.
   *
   * @see \Drupal\locale\LocaleConfigBatch::buildBatch()
   */
  public function batchFinished(bool $success, array $results) : void {
    if ($success) {
      $configuration = $results['stats']['config'] ?? 0;
      if ($configuration) {
        $this->messenger
          ->addStatus($this->t('The configuration was successfully updated. There are %number configuration objects updated.', [
          '%number' => $configuration,
        ]));
        ($this->logger)()
          ->notice('The configuration was successfully updated. %number configuration objects updated.', [
          '%number' => $configuration,
        ]);
      }
      else {
        $this->messenger
          ->addStatus($this->t('No configuration objects have been updated.'));
        ($this->logger)()
          ->notice('No configuration objects have been updated.');
      }
    }
  }

}

Classes

Title Deprecated Summary
LocaleConfigBatch Provides the locale config update batch services.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.