it-swarm.com.de

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

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!

8
jumper

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

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

4
Ardi H

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.

1
jumper