Добрый день. Возник вопрос, следующего содержания: на странице выводится несколько блоков. Для каждого создан тип материала. На сайте сделана мультиязычность. Т.е. в админке можно перевести любую из нод.
Выводятся эти блоки таким образом:
<?php
namespace Drupal\text_imgs\Plugin\Block;
use Drupal\Core\Block\BlockBase;
class TextImgsBlock extends BlockBase
{
public function build()
{
$query = \Drupal::entityQuery('node')
->condition('type', 'text_imgs')
->condition('status', NODE_PUBLISHED)
->sort('field_sort', 'ASC')
->range(0,6);
$nodeIds = $query->execute();
$items = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple($nodeIds);
return array(
'#theme' => 'text-imgs',
'#data' => array(
'items' => $items
),
);
}
}?>
Сейчас соответственно переводится только та часть текста, которая непосредственно относится к текущей странице. Блоки добавленные таким образом не переводятся. Подскажите каким образом можно это сделать? Спасибо.
Комментарии
Выглядит странно, контент должен переводиться. Может, дело в теминге "text-imgs"?
Как крайний вариант можете попробовать что-то типа
<?php
$langCode = \Drupal::languageManager()->getCurrentLanguage()->getId();
foreach ($items as $item) {
$itemsTranslated[] = $item->getTranslation($langCode)
}
return [
'#theme' => 'text-imgs',
'#data' => [
'items' => $itemsTranslated
],
];
?>
Но не факт что поможет, так как, повторюсь, это должно делаться автоматически
P.S. Кто знает почему у меня уехала строка с #theme ? У автора, судя по всему, та же проблема. Копировал с IDE, там проблем не было
Для пустой строки перед
return
нужно было добавить пробел. Видимо особенность работы фильтра, который раскрашивает код. Теперь нормально выглядит.Спасибо Вам огромное! Почти помогло. При вот таком коде:
<?php
class OrganizerImgsBlock extends BlockBase
{
/**
* @inheritdoc
*/
public function build()
{
//Строим запрос
$langCode = \Drupal::languageManager()->getCurrentLanguage()->getId();
$query = \Drupal::entityQuery('node')
->condition('type', 'organizer_imgs')
->condition('status', NODE_PUBLISHED)
->sort('field_sort', 'ASC')
->range(0,6);
$nodeIds = $query->execute();
$items = \Drupal::entityTypeManager()->getStorage('node')->loadMultiple($nodeIds);
foreach ($items as $item) {
$itemsTranslated[] = $item->getTranslation($langCode);
}
return array(
'#theme' => 'organizer-imgs',
'#data' => array(
'items' => $itemsTranslated
),
);
}
}
?>
появляется ошибка "InvalidArgumentException: Invalid translation language (en) specified. in Drupal\Core\Entity\ContentEntityBase->getTranslation() " В общем, получается нужно у объекта hasTranslation проверить есть ли перевод на нужном языке.
Делаю проверку. таким образом:
<?php
foreach ($items as $item) {
if ($item->hasTranslation($langCode)) {
$itemsTranslated[] = $item->getTranslation($langCode);
}
}
?>
и у меня переводится блок. Но выводится только он.. Те, что не были переведены не выводятся. Наверное как-то по-другому нужно?