Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 82 additions & 8 deletions web/themes/interledger/interledger.theme
Original file line number Diff line number Diff line change
Expand Up @@ -37,22 +37,95 @@ function interledger_preprocess_html(&$variables) {

/**
* Prepares a translation disclaimer flag for block--interledger-content.
*
* Sets `showTranslationDisclaimer` to TRUE if the current node lacks a translation
* in the active language.
*/
function interledger_preprocess_block__interledger_content(&$variables) {
$default_language = \Drupal::languageManager()->getDefaultLanguage()->getId();
$current_language = \Drupal::languageManager()->getCurrentLanguage()->getId();

if ($current_language === $default_language) {
$variables['showTranslationDisclaimer'] = false;
return;
}

$node = \Drupal::routeMatch()->getParameter('node');
$variables['showTranslationDisclaimer'] = false;

if ($node instanceof Node) {
$variables['showTranslationDisclaimer'] = !$node->hasTranslation($current_language);
return;
}

// Check if we're on a view page
$route_match = \Drupal::routeMatch();
$view_id = $route_match->getParameter('view_id');
$display_id = $route_match->getParameter('display_id');

if ($view_id && $display_id) {
$variables['showTranslationDisclaimer'] = _interledger_check_view_for_untranslated_content($view_id, $display_id, $current_language);
} else {
$variables['showTranslationDisclaimer'] = _interledger_has_untranslated_content($variables['content'], $current_language);
}
}

/**
* Checks a view for untranslated nodes.
*/
function _interledger_check_view_for_untranslated_content($view_id, $display_id, $current_language) {
$current_view = views_get_current_view();
if ($current_view && $current_view->storage->id() === $view_id && $current_view->current_display === $display_id && !empty($current_view->result)) {
$view = $current_view;
} else {
$view = \Drupal\views\Views::getView($view_id);
if (!$view) {
return false;
}
$view->setDisplay($display_id);
$view->preExecute();
$view->execute();
}

if ($node instanceof Node && $current_language !== $default_language) {
$hasTranslation = $node->hasTranslation($current_language);
if (!$hasTranslation) {
$variables['showTranslationDisclaimer'] = true;
foreach ($view->result as $row) {
if (isset($row->_entity) && $row->_entity instanceof Node) {
$node = $row->_entity;
if (!$node->hasTranslation($current_language)) {
return true;
}
}
}

return false;
}

/**
* Checks rendered content for untranslated nodes.
*/
function _interledger_has_untranslated_content($content, $current_language) {
if (!is_array($content)) {
return false;
}

foreach ($content as $key => $item) {
if (is_string($key) && strpos($key, '#') === 0) {
continue;
}

if (is_array($item)) {
if (isset($item['#node']) && $item['#node'] instanceof Node) {
if (!$item['#node']->hasTranslation($current_language)) {
return true;
}
}
elseif (isset($item['#entity']) && $item['#entity'] instanceof Node) {
if (!$item['#entity']->hasTranslation($current_language)) {
return true;
}
}
elseif (_interledger_has_untranslated_content($item, $current_language)) {
return true;
}
}
}

return false;
}

/**
Expand Down Expand Up @@ -141,3 +214,4 @@ function interledger_preprocess_field__node__field_speaker_talk_entities(&$varia
$variables['title'][$template_index] = interledger_get_summit_entity_field($node, 'field_titulo_de_la_sesion', 'field_talk_title');
}
}