Как отобразить переведенные термины таксономии в представлении?


Я использовал модуль Представления для создания представления терминов таксономии.

Термины таксономии также переведены на греческий язык (помимо английского) с использованием типичных модулей i18n.

Но когда я переключаю язык на греческий (во время посещения сайта), все равно появляются термины английской таксономии (а не термины на греческом языке).

Как я могу это решить?

Author: Pierre.Vriens, 2015-05-17

5 answers

Обязательно используйте модуль Представления интернационализации, который расширяет модуль i18n с многоязычной поддержкой представлений .

Чтобы результаты просмотров соответствовали переключателю языков, добавьте фильтр для Перевода контента: Текущий язык пользователя , который является языком, заданным аутентифицированным пользователем в настройках пользователя (он НЕ совпадает с текущим языком браузера или языком сайта).

Если нет возможности для Текущий язык пользователя доступен в форме критериев фильтрации, затем проверьте свою конфигурацию по адресу Конфигурация ->Языки -> обнаружение и выбор: Порядок должен быть URL, по умолчанию, Пользователь, а не что-то вроде По умолчанию, URL, Пользователь (как упоминалось также в https://www.drupal.org/node/1701854#comment-6279474).

Если вы используете Настройки видимости блока и указали показывать только этот блок на странице <front>, то осознавая, что вам, возможно, придется решить еще одну проблему с переводом, как показано в моем ответе на вопрос Как сделать перевод контента доступным для главной страницы?. Речь идет об использовании модуля переменной для правильного перевода значения по умолчанию на первой странице. Без этого Drupal покажет этот блок только на главной странице вашего значения по умолчанию.

Примечания:

  1. Правда, модуль Представления интернационализации имеет только версия DEV для D7, но сейчас более 31 тыс. пользователей используют эту версию. Поэтому я думаю, что "DEV" больше не является допустимым квалификатором выпуска для этой версии, потому что +31 тыс. пользователей не могут ошибаться, верно?

  2. Результаты фильтрации представлений на многоязычном сайте иногда могут быть сложными, как показано также в обсуждениях, таких как https://groups.drupal.org/node/47478 .

 4
Author: Pierre.Vriens, 2017-04-13 12:47:09

Вместо добавления термина: имя, добавьте термин: имя (локализованное) в свое представление.

 4
Author: Maarten De Block, 2015-05-17 11:19:31

Вам необходимо добавить многоязычный контент для каждого термина в вашей таксономии, а внутри блока представлений используйте термин "Контент: Тег (field_tag) (переведенный)" в качестве открытого фильтра. Аналогично, если вы хотите отобразить заголовок узла, нам нужно использовать поля "Перевод сущности: Заголовок узла: переведенный".

 2
Author: Kapil Ropalekar, 2015-08-24 10:34:14

Вам необходимо установить модуль i18n, включить перевод таксономии, а затем выполнить это программно, например, в блоке, реализованном пользовательским модулем, который вызывает i18n_taxonomy_localize_terms().

 1
Author: rémy, 2015-08-24 10:35:55

Предполагая, что вы используете Drupal 7 и модуль Перевода таксономии (i18n_taxonomy, часть Интернационализации (i18n)...

Я написал следующее для одного из своих клиентов. Он работает для сайтов, для которых он был предназначен, но, поскольку конфигурации Drupal могут сильно отличаться от одного сайта к другому, YMMV:)

  • Работает для словаря с режимом перевода , установленным в Локализовать. Термины являются общими для всех языков, но их название и описание может быть локализовано.
  • Работает, когда представление отображает содержимое ( базовая таблица является узлом ) и отображает термины таксономии через Содержимое: Все термины таксономии.
  • Также работает, когда в представлении отображается таксономия (базовая таблица является taxonomy_term_data).

Обратите внимание на использование taxonomy_term_load_multiple для повышения производительности. В других местах предлагаются некоторые решения, которые загружают термины один за другим и переводят их по одному по одному.

/*
 * 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
Author: netgenius.co.uk, 2017-09-15 12:05:35