From 55c322eb7955e6e5881ddcad7a2de61b2fc64faf Mon Sep 17 00:00:00 2001 From: David Valdez Date: Tue, 22 Jan 2019 12:05:38 -0600 Subject: [PATCH] Displays a link to switch the language. Only if the content has been translated already. --- web/themes/custom/agarica/agarica.theme | 53 ++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/web/themes/custom/agarica/agarica.theme b/web/themes/custom/agarica/agarica.theme index 210e044..f4980b3 100644 --- a/web/themes/custom/agarica/agarica.theme +++ b/web/themes/custom/agarica/agarica.theme @@ -1,6 +1,8 @@ getViewBuilder('block') ->view($block); $variables['language_switcher'] = $block_content; + $variables['language_switcher_link'] = agarica_languague_switch_link(); +} + +/** + * Provides a link to switch to another language. + */ +function agarica_languague_switch_link() { + $derivative_id = 'language_interface'; + $route = \Drupal::getContainer()->get('path.matcher')->isFrontPage() ? '' : ''; + $current_language = \Drupal::languageManager()->getCurrentLanguage($derivative_id)->getId(); + $links = \Drupal::languageManager()->getLanguageSwitchLinks($derivative_id, Url::fromRoute($route))->links; + $links['en']['title'] = 'Browser this page on English.'; + $links['es']['title'] = 'Consulta esta pagina en EspaƱol'; + $lid = ($current_language == 'en') ? 'es' : 'en'; + // Remove current language from the links + unset($links[$current_language]); + + // Check if the current path display an entity. + $entity = FALSE; + foreach (\Drupal::routeMatch()->getParameters() as $param) { + if ($param instanceof EntityInterface) { + $entity[] = $param; + } + } + + // Remove links if the content hasnt' been translated yet. + if ($entity) { + $has_translation = (method_exists($entity[0], 'getTranslationStatus')) ? $entity[0]->getTranslationStatus($lid) : FALSE; + $this_translation = ($has_translation && method_exists($entity[0], 'getTranslation')) ? $entity[0]->getTranslation($lid) : FALSE; + $access_translation = ($this_translation && method_exists($this_translation, 'access') && $this_translation->access('view')) ? TRUE : FALSE; + if (!$this_translation || !$access_translation || $current_language == $lid) { + unset($links[$lid]); + } + } + + $links_render_array = []; + // Transform the links to arrays that can be renderer. + foreach ($links as $language => $link) { + $links_render_array[] = [ + '#type' => 'link', + '#url' => $link['url'], + '#title' => $link['title'], + '#options' => [ + 'language' => $link['language'], + ], + ]; + } + + return $links_render_array; }