rosetta_translation-1.0.0-alpha1/rosetta_translation.module

rosetta_translation.module
<?php

/**
 * @file
 * Primary module hooks for Rosetta Translation module.
 */

declare(strict_types=1);

/**
 * Attach library and settings on non-admin pages.
 */
function rosetta_translation_page_attachments(array &$attachments): void {
  if (!\Drupal::service('router.admin_context')->isAdminRoute()) {
    $config = \Drupal::config('rosetta_translation.settings');
    /** @var \Drupal\rosetta_translation\Service\RosettaVersionManager $versionManager */
    $versionManager = \Drupal::service('rosetta_translation.version_manager');
    $resolvedTag = $versionManager->resolveVersion((string) $config->get('rosetta_version') ?: 'latest');
    $distUrl = $resolvedTag ? $versionManager->buildDistUrl($resolvedTag) : NULL;

    // Attach the Rosetta dist file as an external script before our behavior library.
    if (!empty($distUrl)) {
      $attachments['#attached']['html_head'][] = [
        [
          '#tag' => 'script',
          '#attributes' => [
            'src' => $distUrl,
            'defer' => TRUE,
          ],
        ],
        'rosetta_translation.rosetta_dist',
      ];
    }

    // Attach our behavior library.
    $attachments['#attached']['library'][] = 'rosetta_translation/rosetta_translation_global';

    $preferred = trim((string) $config->get('preferred_supported_languages'));
    $preferredArray = $preferred !== '' ? array_values(array_filter(array_map('trim', explode(',', $preferred)))) : [];

    $ignoreClasses = trim((string) $config->get('ignore_classes'));
    $ignoreClassesArray = $ignoreClasses !== '' ? array_values(array_filter(array_map('trim', explode(',', $ignoreClasses)))) : [];

    $ignoreSelectors = trim((string) $config->get('ignore_selectors'));
    $ignoreSelectorsArray = $ignoreSelectors !== '' ? array_values(array_filter(array_map('trim', explode(',', $ignoreSelectors)))) : [];

    $includedAttributes = trim((string) $config->get('included_attributes'));
    $includedAttributesArray = $includedAttributes !== '' ? array_values(array_filter(array_map('trim', explode(',', $includedAttributes)))) : [];

    $attachments['#attached']['drupalSettings']['rosettaTranslation'] = [
      'pageLanguage' => (string) $config->get('page_language') ?: 'en',
      'siteName' => (string) $config->get('site_name'),
      'preferredSupportedLanguages' => $preferredArray,
      'attributionImageUrl' => (string) $config->get('attribution_image_url'),
      'logoImageUrl' => (string) $config->get('logo_image_url'),
      'chunkSize' => (int) $config->get('chunk_size') ?: 10,
      'intersectionThreshold' => (float) $config->get('intersection_threshold') ?: 0.0,
      'ignoreIntersection' => (bool) $config->get('ignore_intersection') ?: FALSE,
      'ignoreClasses' => $ignoreClassesArray,
      'ignoreSelectors' => $ignoreSelectorsArray,
      'updateDocumentLanguageAttribute' => (bool) $config->get('update_document_language_attribute') ?: FALSE,
      'verboseOutput' => (bool) $config->get('verbose_output') ?: FALSE,
      'buttons' => (string) $config->get('buttons'),
      'includedAttributes' => $includedAttributesArray,
      'endpoints' => [
        'translate' => (string) $config->get('translate_endpoint'),
      ],
      'showBanner' => (bool) ($config->get('show_banner') ?? TRUE),
      'sessionUrlUpdates' => (bool) $config->get('session_url_updates') ?: FALSE,
      'containerId' => (string) $config->get('select_widget_container_id') ?: 'rosetta_translate_element',
      'version' => (string) $config->get('rosetta_version') ?: 'latest',
      'resolvedTag' => $resolvedTag,
      'distUrl' => $distUrl,
    ];
  }
}

/**
 * Limit the Rosetta language select block to a single placement per theme.
 */
function rosetta_translation_form_block_form_alter(array &$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id): void {
  // Add a validation handler to prevent placing multiple instances of the
  // Rosetta language select block within the same theme.
  $form['#validate'][] = 'rosetta_translation_block_form_validate_unique_rosetta_block';
}

/**
 * Validate callback to ensure only one Rosetta select block is placed per theme.
 */
function rosetta_translation_block_form_validate_unique_rosetta_block(array &$form, \Drupal\Core\Form\FormStateInterface $form_state): void {
  $form_object = $form_state->getFormObject();
  if (!$form_object || !method_exists($form_object, 'getEntity')) {
    return;
  }

  /** @var \Drupal\block\Entity\Block $block */
  $block = $form_object->getEntity();
  if ($block->getPluginId() !== 'rosetta_language_select') {
    return;
  }

  $theme = $block->getTheme();
  $storage = \Drupal::entityTypeManager()->getStorage('block');
  $query = $storage->getQuery()
    ->condition('theme', $theme)
    ->condition('plugin', 'rosetta_language_select');

  // Exclude the current block when editing an existing placement.
  if (!$block->isNew()) {
    $query->condition('id', $block->id(), '<>');
  }

  $ids = $query->execute();
  if (!empty($ids)) {
    $form_state->setErrorByName('id', t('Only one "Rosetta language select" block may be placed per theme.'));
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc