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.'));
}
}
