Bagaimana cara mengubah perilaku atau tampilan pengalih bahasa?

8

Pada halaman yang diterjemahkan, pengalih bahasa menunjukkan tautan ke bahasa yang diterjemahkan, tetapi untuk bahasa yang tidak diterjemahkan tidak ada tautan, tetapi nama bahasa tanpa tautan. Dalam hal ini, bahwa tidak ada simpul yang sesuai dalam bahasa yang diberikan, saya ingin pengalih bahasa untuk menampilkan tautan ke halaman depan.

Bagaimana saya bisa menyelesaikan perilaku ini? Terima kasih banyak!

peloncat
sumber
Anda dapat melakukannya hanya dengan menggunakan halaman, atau templat simpul dan aturan CSS.
topcode4u

Jawaban:

13

Tambahkan selanjutnya ke file template.php tema Anda:

<?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
sumber
Terima kasih atas jawaban Anda. Apakah tautan <front> ini dilokalkan?
jumper
1
Halaman depan / beranda ini akan mengarah ke halaman depan bahasa yang dipilih saat ini.
Nikit
Terima kasih lagi, saya pikir solusi Anda jauh lebih baik daripada yang saya akhirnya gunakan :)
jumper
4

ada modul untuk ini sekarang - Language Switcher Fallback. Melakukan persis apa yang Anda minta, mengarahkan pengguna ke halaman depan jika tidak ada terjemahan ke sebuah node. Lihat di sini https://drupal.org/project/language_switcher_fallback

Ardi H
sumber
1

Pada akhirnya saya menggunakan pendekatan ini.

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

Yang menggantikan fragmen kode ini dalam modul Terjemahan asli.

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

Saya cukup yakin solusi lain lebih indah, tetapi solusi ini juga berfungsi.

peloncat
sumber
1
Solusi pertama tidak bekerja untuk saya ... Yang ini berfungsi sebagai pesona! Terima kasih.
Carles Estevadeordal