You are here

social_content_translation.install in Open Social 10.3.x

Installation tasks for the Social Language Content Translation module.

File

modules/custom/social_language/modules/social_content_translation/social_content_translation.install
View source
<?php

/**
 * @file
 * Installation tasks for the Social Language Content Translation module.
 */
use Drupal\Core\Config\FileStorage;
use Drupal\Core\Entity\ContentEntityBase;
use Drupal\language\Entity\ContentLanguageSettings;

/**
 * Implements hook_install().
 */
function social_content_translation_install() {
  social_content_translation_install_language_settings_for_entities();
}

/**
 * Implements hook_uninstall().
 */
function social_content_translation_uninstall() {
  \Drupal::configFactory()
    ->getEditable('social_content_translation.settings')
    ->delete();
}

/**
 * Disable field translations.
 *
 * Disable content translation for all fields in nodes, paragraphs and
 * taxonomy terms. They are enabled by default when turning on content
 * translation but we want to control this to only the fields that are in
 * ContentTranslationDefaultsConfigOverride classes.
 *
 * @deprecated
 *   The function is deprecated and will be removed as redundant.
 * @see https://github.com/goalgorilla/open_social/pull/2434
 */
function social_content_translation_disable_field_translations() {
  $entity_types = [
    'node',
    'paragraph',
    'taxonomy_term',
  ];

  /** @var \Drupal\Core\Entity\EntityFieldManagerInterface $field_manager */
  $field_manager = \Drupal::service('entity_field.manager');

  /** @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info */
  $entity_type_bundle_info = \Drupal::service('entity_type.bundle.info');
  $all_bundles = $entity_type_bundle_info
    ->getAllBundleInfo();

  // Only disable the listed entity types.
  $bundles = array_filter($all_bundles, function ($k) use ($entity_types) {
    return in_array($k, $entity_types);
  }, ARRAY_FILTER_USE_KEY);
  foreach ($bundles as $entity_type_id => $bundle_info) {
    $definition = \Drupal::entityTypeManager()
      ->getDefinition($entity_type_id);

    // Fields that must remain translatable for content translation to work
    // properly.
    $exceptions = [
      $definition
        ->getKey('default_langcode'),
      $definition
        ->getKey('langcode'),
      $definition
        ->getKey('status'),
      $definition
        ->getKey('uid'),
      $definition
        ->getKey('content_translation_source'),
      $definition
        ->getKey('content_translation_outdated'),
      $definition
        ->getKey('revision_translation_affected'),
    ];
    foreach (array_keys($bundle_info) as $bundle) {
      $fields = $field_manager
        ->getFieldDefinitions($entity_type_id, $bundle);
      foreach ($fields as $field) {
        $field_config = $field
          ->getConfig($bundle);

        // Only disable translatable fields and always allow some exceptions
        // that are required for content translation to function properly.
        if ($field_config
          ->isTranslatable() && !in_array($field
          ->getName(), $exceptions)) {
          $field_config
            ->setTranslatable(FALSE)
            ->save();
        }
      }
    }
  }

  // Ensure entity and menu router information are correctly rebuilt.
  \Drupal::service('entity_type.manager')
    ->clearCachedDefinitions();
  \Drupal::service('router.builder')
    ->setRebuildNeeded();
}

/**
 * Install translation configuration.
 *
 *  "Content Translation" module provide UI where we can enabled/disable
 *  translations for entity types we want. So here we enabling translations
 *  for modules if it have "language.content_settings*" configuration in
 *  "config/optional" folder.
 */
function social_content_translation_install_language_settings_for_entities() {
  $config_storage = \Drupal::service('config.storage');

  // Get enabled modules.
  $modules = \Drupal::moduleHandler()
    ->getModuleList();
  foreach ($modules as $module_name => $extension) {

    // Check if modules have target configuration.
    $config_path = drupal_get_path('module', $module_name) . '/config/optional';
    $source = new FileStorage($config_path);
    if (!($list = $source
      ->listAll('language.content_settings'))) {

      // Do nothing.
      continue;
    }
    foreach ($list as $config_name) {

      // Probably, configuration can be already existed if module provided
      // it was enabled after "Content Translation" module was enabled.
      // Otherwise lets install it.
      if (!$config_storage
        ->exists($config_name)) {
        $file = $source
          ->read($config_name);

        // We create a config as an entity because it allows to update field
        // definitions for translated fields.
        // @see content_translation_language_content_settings_insert()
        $config = ContentLanguageSettings::create($file);
        $config
          ->save();
      }
    }
  }
  \Drupal::service('entity_type.bundle.info')
    ->clearCachedBundles();
  \Drupal::service('router.builder')
    ->setRebuildNeeded();
}

/**
 * Add support translations for entities.
 */
function social_content_translation_update_8001() {
  $module_names = [
    'social_group_flexible_group',
  ];
  $config = \Drupal::configFactory()
    ->getEditable('social_content_translation.settings');
  foreach ($module_names as $module_name) {
    $config
      ->set($module_name, TRUE);
    $config
      ->save(TRUE);
  }
}

/**
 * Add translations compatibility for Topics.
 */
function social_content_translation_update_10301() {
  $module_names = [
    'social_topic',
  ];
  $config = \Drupal::configFactory()
    ->getEditable('social_content_translation.settings');
  foreach ($module_names as $module_name) {
    $config
      ->set($module_name, TRUE);
    $config
      ->save(TRUE);
  }
}

Functions

Namesort descending Description
social_content_translation_disable_field_translations Deprecated Disable field translations.
social_content_translation_install Implements hook_install().
social_content_translation_install_language_settings_for_entities Install translation configuration.
social_content_translation_uninstall Implements hook_uninstall().
social_content_translation_update_10301 Add translations compatibility for Topics.
social_content_translation_update_8001 Add support translations for entities.