Перевод отдельных нод на одной странице

Аватар пользователя alex.bo alex.bo 12 февраля в 12:04

Добрый день. Возник вопрос, следующего содержания: на странице выводится несколько блоков. Для каждого создан тип материала. На сайте сделана мультиязычность. Т.е. в админке можно перевести любую из нод.
Выводятся эти блоки таким образом:

<?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
            
),
        );
    }
}
?>

Сейчас соответственно переводится только та часть текста, которая непосредственно относится к текущей странице. Блоки добавленные таким образом не переводятся. Подскажите каким образом можно это сделать? Спасибо.

Комментарии

Аватар пользователя zvse zvse 13 февраля в 23:53
1

Выглядит странно, контент должен переводиться. Может, дело в теминге "text-imgs"?
Как крайний вариант можете попробовать что-то типа

<?php
  $langCode 
= \Drupal::languageManager()->getCurrentLanguage()->getId();
  foreach (
$items as $item) {
    
$itemsTranslated[] = $item->getTranslation($langCode)
  }
  
  return [
    
'#theme' => 'text-imgs',
    
'#data' => [
      
'items' => $itemsTranslated
    
],
  ];
?>

Но не факт что поможет, так как, повторюсь, это должно делаться автоматически

Аватар пользователя zvse zvse 13 февраля в 18:41

P.S. Кто знает почему у меня уехала строка с #theme ? У автора, судя по всему, та же проблема. Копировал с IDE, там проблем не было

Аватар пользователя madt madt 13 февраля в 23:52

Для пустой строки перед return нужно было добавить пробел. Видимо особенность работы фильтра, который раскрашивает код. Теперь нормально выглядит.

Аватар пользователя alex.bo alex.bo 14 февраля в 12:45

Спасибо Вам огромное! Почти помогло. При вот таком коде:

<?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);
  }
}
?>

и у меня переводится блок. Но выводится только он.. Те, что не были переведены не выводятся. Наверное как-то по-другому нужно?