web-dev-qa-db-fra.com

Comment afficher les termes de taxonomie traduits dans une vue?

J'ai utilisé le module Vues pour créer une vue des termes de taxonomie.

Les termes de taxonomie sont également traduits en grec (à l'exception de l'anglais), en utilisant les modules typiques i18n .

Mais lorsque je passe la langue au grec (lors de la visite du site), les termes de taxonomie anglais apparaissent toujours (et non les termes en grec).

Comment puis-je resoudre ceci?

5
sokratis

Assurez-vous d'utiliser le module Internationalizations Views , qui étend le module i18n avec la prise en charge multilingue de Views .

Pour que les résultats des vues correspondent au sélecteur de langue, ajoutez un filtre pour Traduction de contenu: langue actuelle de l'utilisateur, qui est la langue qu'un utilisateur authentifié a définie dans les paramètres utilisateur (ce n'est PAS la même que la la langue actuelle du navigateur ou la langue du site).

Si aucune option pour Langue actuelle de l'utilisateur n'est disponible dans le formulaire de critères de filtrage, vérifiez votre configuration à Configuration -> Langues -> détection et sélection: La commande doit être RL, par défaut, utilisateur et pas quelque chose comme Par défaut, URL, utilisateur (comme mentionné également dans https://www.drupal.org/node/ 1701854 # comment-6279474 ).

Si vous utilisez Bloquer les paramètres de visibilité et indiqué pour afficher uniquement ce bloc sur la page <front>, sachez que vous devrez peut-être résoudre un autre problème de traduction, comme illustré dans ma réponse à la question Comment rendre la traduction de contenu disponible pour la première page? . Il s'agit d'utiliser le module Variable pour traduire correctement le Valeur de la page d'accueil par défaut. Sans cela, Drupal n'affichera ce bloc que sur la première page de votre valeur par défaut.

Notes:

  1. Certes, le module Vues d'internationalisations n'a qu'une version DEV pour D7, mais il existe actuellement plus de 31 000 utilisateurs en utilisant cette version . Par conséquent, je pense que "DEV" n'est plus un qualificatif de version valide pour cette version, car + 31K utilisateurs ne peuvent pas se tromper, non?

  2. Le filtrage des résultats des vues dans un site multilingue peut parfois être difficile, comme illustré également dans des discussions telles que https://groups.drupal.org/node/47478 .

4
Pierre.Vriens

Au lieu d'ajouter le terme: nom, ajoutez le terme: nom (localisé) à votre vue.

4
Maarten De Block

Vous devez ajouter du contenu multilingue pour chaque terme dans votre taxonomie et à l'intérieur du bloc Vues, ​​utilisez le terme "Contenu: Tag (field_tag) (traduit)" comme filtre exposé. De même, si vous souhaitez afficher Node Title, nous devons utiliser les champs "Traduction d'entité: Node Title: Translated").

2
Kapil Ropalekar

Vous devez installer le module i18n , activer la traduction de la taxonomie, puis le faire par programmation, par exemple dans un bloc implémenté par un module personnalisé qui appelle i18n_taxonomy_localize_terms().

1
rémy

En supposant que vous utilisez Drupal 7 et le module Taxonomy Translation (i18n_taxonomy, part of Internationalization (i18n) ...

J'ai écrit ce qui suit pour l'un de mes clients. Il fonctionne pour les sites auxquels il était destiné, mais comme les configurations Drupal peuvent différer considérablement d'un site à l'autre, YMMV :)

  • Fonctionne pour un vocabulaire avec mode de traduction réglé sur Localiser. Les termes sont communs à toutes les langues, mais leur nom et leur description peuvent être localisés.
  • Fonctionne lorsque la vue affiche le contenu ( table de base est nœud) et affiche les termes de taxonomie via Contenu: tous les termes de taxonomie.
  • Fonctionne également lorsque la vue affiche la taxonomie ( table de base est taxonomy_term_data).

Notez l'utilisation de taxonomy_term_load_multiple pour de meilleures performances. Certaines solutions proposées ailleurs chargent les termes un par un et les traduisent un par un.

/*
 * Implement hook_views_pre_render(&$view)
 * Here we handle translation of taxonomy terms.
 * Note: i18n_taxonomy_views module has its own _views_pre_render hook 
 * but that does not currently (7.x-1.18) do what we need here.
 * This could probably be done using HOOK_views_post_execute instead.
 */
function mymodule_views_pre_render(&$view) {
  // If the i18n_taxonomy module is not installed then we have nothing to do.
  if (!function_exists('i18n_taxonomy_localize_terms')) {
    return;
  }

  // ----- Processing for content-based (nodes) View -----
  if ($view->base_table == 'node') {
    //dpm($view->field['term_node_tid']->items, 'pre render: field[term_node_tid]->items');

    // If there is no term data then exit now. 
    if (empty($view->field['term_node_tid']->items)) {
      return;
    }

    // Array to track tids used and placeholders for term name translations.
    $term_translations = array();
    // Loop through nodes in the result set, track the term ids used and set a reference to the translation...
    foreach ($view->field['term_node_tid']->items as $nid => &$vterms) {
      // Loop through all terms for this node.
      foreach ($vterms as $tid => &$vterm) {
        // Track this term id.
        $term_translations[$tid] = '';
        // Store a *reference* to the translated term name which will be loaded later (below).  
        $vterm['name'] =& $term_translations[$tid];
      }
    }

    // Load the terms that we need.
    $terms = taxonomy_term_load_multiple(array_keys($term_translations));
    // Fetch the translations of the terms.
    $terms= i18n_taxonomy_localize_terms($terms);
    // Update our $term_translations array with the translated term names. 
    foreach ($terms as $tid => $term) {
      $term_translations[$tid] = $term->name;
    }
  }

  // ----- Processing for taxonomy-based View -----
  elseif ($view->base_table == 'taxonomy_term_data') {
    // Reference the terms array from $view->result.
    $vterms =& $view->result;

    // Build an array of tids...
    $tids = array();
    foreach ($vterms as $vterm) {
      $tids[] = $vterm->tid;
    }

    // Load all terms.
    $terms = taxonomy_term_load_multiple($tids);
    // Translate the terms.
    $terms = i18n_taxonomy_localize_terms($terms);

    // Copy translations for term names and descriptions back into the $view->result.
    foreach($vterms as &$vterm) {
      $vterm->taxonomy_term_data_name = $terms[$vterm->tid]->name;
      $vterm->taxonomy_term_data_description = $terms[$vterm->tid]->description;
    }
  }
}
0
netgenius.co.uk