Como alterar o comportamento ou a exibição do alternador de idiomas?

8

Nas páginas traduzidas, o alternador de idiomas mostra links para os idiomas traduzidos, mas para idiomas não traduzidos, não há link, mas o nome do idioma sem um link. No caso de não haver um nó correspondente em um determinado idioma, gostaria que o alternador de idiomas mostrasse um link para a primeira página.

Como posso realizar esse comportamento? Muito obrigado!

saltador
fonte
Você pode fazer isso usando apenas modelos de página ou nó e regras CSS.
Topcode4u

Respostas:

13

Adicione próximo ao arquivo template.php do seu tema:

<?php 
  function YOURTHEMENAME_links__locale_block($variables) {
    foreach($variables['links'] as $key => $lang) {
      if (isset($lang['attributes']['class']) && in_array('locale-untranslated', $lang['attributes']['class'])) {
        // Set here any page link.
        $variables['links'][$key]['href'] = '<front>';
      }
    }
    return theme_links($variables);
  }
Nikit
fonte
Obrigado pela sua resposta. Esses links <front> estão localizados então?
ligação em ponte
11
Esta página inicial / inicial apontará para a página inicial do idioma selecionado atual.
Nikit
Obrigado mais uma vez, eu acho que a solução é muito melhor do que aquele que eu acabei usando :)
jumper de
4

existe um módulo para isso agora - Language Switcher Fallback. Faz exatamente o que você pediu, direcionando o usuário para a primeira página se não houver conversão para um nó. Veja aqui https://drupal.org/project/language_switcher_fallback

Ardi H
fonte
1

No final, eu usei essa abordagem.

function YOURTHEME_language_switch_links_alter(array &$links, $type, $path) {
  $language_type = variable_get('translation_language_type', LANGUAGE_TYPE_INTERFACE);

  if ($type == $language_type && preg_match("!^node/(\d+)(/.+|)!", $path, $matches)) {
    $node = node_load((int) $matches[1]);

    if (empty($node->tnid)) {
      // If the node cannot be found nothing needs to be done. If it does not
      // have translations it might be a language neutral node, in which case we
      // must leave the language switch links unaltered. This is true also for
      // nodes not having translation support enabled.
      if (empty($node) || entity_language('node', $node) == LANGUAGE_NONE || !translation_supported_type($node->type)) {
        return;
      }
      $langcode = entity_language('node', $node);
      $translations = array($langcode => $node);
    }
    else {
      $translations = translation_node_get_translations($node->tnid);
    }

    foreach ($links as $langcode => $link) {
      if (isset($translations[$langcode]) && $translations[$langcode]->status) {
        // Translation in a different node.
        $links[$langcode]['href'] = 'node/' . $translations[$langcode]->nid . $matches[2];
      }
      else {
        // No translation in this language, or no permission to view.
        $links[$langcode]['href'] = '<front>';
      }
    }
  }
}

Que substitui esse fragmento de código no módulo de tradução original.

  else {
    // No translation in this language, or no permission to view.
    unset($links[$langcode]['href']);
    $links[$langcode]['attributes']['class'][] = 'locale-untranslated';

Tenho certeza de que a outra solução é mais bonita, mas essa solução também está funcionando.

saltador
fonte
11
A primeira solução não funcionou para mim ... Essa funcionou como um encanto! Valeu.
Carles Estevadeordal