web-dev-qa-db-fra.com

Comment changer le comportement ou l'affichage du sélecteur de langue?

Sur les pages traduites, le sélecteur de langue affiche les liens vers les langues traduites, mais pour les langues non traduites, il n'y a pas de lien, mais le nom de la langue sans lien. Dans le cas où il n'y a pas de nœud correspondant dans une langue donnée, j'aimerais que le sélecteur de langue affiche un lien vers la page d'accueil à la place.

Comment puis-je accomplir ce comportement? Merci beaucoup!

8
jumper

Ajoutez ensuite dans le fichier template.php de votre thème:

<?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);
  }
13
Nikit

il y a maintenant un module pour cela - Language Switcher Fallback. Fait exactement ce que vous avez demandé, en dirigeant l'utilisateur vers la page d'accueil s'il n'y a pas de traduction vers un nœud. Voir ici https://drupal.org/project/language_switcher_fallback

4
Ardi H

Au final, j'ai utilisé cette approche.

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

Qui remplace ce fragment de code dans le module de traduction d'origine.

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

Je suis sûr que l'autre solution est plus belle, mais cette solution fonctionne également.

1
jumper