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!


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

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


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.


1
Die erste Lösung hat bei mir nicht funktioniert ... Diese hat als Charme funktioniert! Danke.
Carles Estevadeordal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.