¿Cómo cambiar el comportamiento o la visualización del selector de idiomas?

8

En las páginas traducidas, el selector de idiomas muestra enlaces a idiomas traducidos, pero para los idiomas no traducidos no hay un enlace, sino el nombre del idioma sin un enlace. En el caso de que no haya un nodo correspondiente en un idioma determinado, me gustaría que el selector de idioma muestre un enlace a la página principal.

¿Cómo puedo lograr este comportamiento? ¡Muchas gracias!

saltador
fuente
Puede hacerlo simplemente usando plantillas de página o de nodo y reglas CSS.
topcode4u

Respuestas:

13

Agregue el siguiente en el archivo template.php de su tema:

<?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
fuente
Gracias por su respuesta. ¿Estos enlaces <front> están localizados entonces?
puente
1
Esta página principal / de inicio apuntará a la página principal del idioma seleccionado actualmente.
Nikit
Gracias de nuevo, creo que su solución es mucho mejor que la que terminé usando :)
puente
1

Al final utilicé este enfoque.

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

Que reemplaza este fragmento de código en el módulo de traducción original.

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

Estoy bastante seguro de que la otra solución es más hermosa, pero esta solución también está funcionando.

saltador
fuente
1
La primera solución no funcionó para mí ... ¡Esta funcionó de maravilla! Gracias.
Carles Estevadeordal