function system_post_update_add_langcode_to_all_translatable_config

Adds a langcode to all simple config which needs it.

File

core/modules/system/system.post_update.php, line 235

Code

function system_post_update_add_langcode_to_all_translatable_config(&$sandbox = NULL) : TranslatableMarkup {
    $config_factory = \Drupal::configFactory();
    // If this is the first run, populate the sandbox with the names of all
    // config objects.
    if (!isset($sandbox['names'])) {
        $sandbox['names'] = $config_factory->listAll();
        $sandbox['max'] = count($sandbox['names']);
    }
    
    /** @var \Drupal\Core\Config\TypedConfigManagerInterface $typed_config_manager */
    $typed_config_manager = \Drupal::service(TypedConfigManagerInterface::class);
    
    /** @var \Drupal\Core\Config\ConfigManagerInterface $config_manager */
    $config_manager = \Drupal::service(ConfigManagerInterface::class);
    $default_langcode = \Drupal::languageManager()->getDefaultLanguage()
        ->getId();
    $names = array_splice($sandbox['names'], 0, Settings::get('entity_update_batch_size', 50));
    foreach ($names as $name) {
        // We're only dealing with simple config, which won't map to an entity type.
        // But if this is a simple config object that has no schema, we can't do
        // anything here and we don't need to, because config must have schema in
        // order to be translatable.
        if ($config_manager->getEntityTypeIdByName($name) || !$typed_config_manager->hasConfigSchema($name)) {
            continue;
        }
        $config = \Drupal::configFactory()->getEditable($name);
        $typed_config = $typed_config_manager->createFromNameAndData($name, $config->getRawData());
        // Simple config is always a mapping.
        assert($typed_config instanceof Mapping, "Failed on config name '{$name}'");
        // If this config contains any elements (at any level of nesting) which
        // are translatable, but the config hasn't got a langcode, assign one. But
        // if nothing in the config structure is translatable, the config shouldn't
        // have a langcode at all.
        if ($typed_config->hasTranslatableElements()) {
            if ($config->get('langcode')) {
                continue;
            }
            $config->set('langcode', $default_langcode);
        }
        else {
            if (!array_key_exists('langcode', $config->get())) {
                continue;
            }
            $config->clear('langcode');
        }
        $config->save();
    }
    $sandbox['#finished'] = empty($sandbox['max']) || empty($sandbox['names']) ? 1 : ($sandbox['max'] - count($sandbox['names'])) / $sandbox['max'];
    if ($sandbox['#finished'] === 1) {
        return new TranslatableMarkup('Finished updating simple config langcodes.');
    }
    return new PluralTranslatableMarkup($sandbox['max'] - count($sandbox['names']), 'Processed @count items of @total.', 'Processed @count items of @total.', [
        '@total' => $sandbox['max'],
    ]);
}

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