Wie ändere ich das Verhalten oder die Anzeige des Sprachumschalters?

8

Auf übersetzten Seiten zeigt der Sprachumschalter Links zu übersetzten Sprachen an. Bei nicht übersetzten Sprachen gibt es jedoch keinen Link, sondern den Namen der Sprache ohne Link. Für den Fall, dass es in einer bestimmten Sprache keinen entsprechenden Knoten gibt, möchte ich, dass der Sprachumschalter stattdessen einen Link zur Startseite anzeigt.

Wie kann ich dieses Verhalten erreichen? Vielen Dank!

Jumper
quelle
Sie können dies nur mithilfe von Seiten- oder Knotenvorlagen und CSS-Regeln tun.
Topcode4u

Antworten:

13

Fügen Sie als nächstes die Datei template.php Ihres Themas hinzu:

<?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
quelle
Vielen Dank für Ihre Antwort. Sind diese <front> -Links dann lokalisiert?
Springer
1
Diese Start- / Startseite zeigt auf die aktuell ausgewählte Startseite der Sprache.
Nikit
Nochmals vielen Dank, ich denke, Ihre Lösung ist viel besser als die, die ich letztendlich verwendet habe :)
Jumper
4

Dafür gibt es jetzt ein Modul - Language Switcher Fallback. Tut genau das, was Sie gefragt haben, und leitet den Benutzer zur Startseite weiter, wenn keine Übersetzung in einen Knoten erfolgt. Siehe hier https://drupal.org/project/language_switcher_fallback

Ardi H.
quelle
1

Am Ende habe ich diesen Ansatz verwendet.

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

Welches ersetzt dieses Codefragment im ursprünglichen Übersetzungsmodul.

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

Ich bin mir ziemlich sicher, dass die andere Lösung schöner ist, aber diese Lösung funktioniert auch.

Jumper
quelle
1
Die erste Lösung hat bei mir nicht funktioniert ... Diese hat als Charme funktioniert! Danke.
Carles Estevadeordal