Drupal поддерживает концепцию языка интерфейса и языка контента. У меня (и у каждого клиента, которого я когда-либо спрашивал) другое мнение о том, что такое «контент» и что такое «интерфейс», чем у Drupal (в большинстве случаев). Я рассматриваю интерфейс как элементы, которые администратор или редактор будет использовать для выполнения своей работы (меню администратора, вкладка редактирования, справочная информация в формах и т. д.), а контент — это то, что увидят неадминистраторы (часто это аноним, но не всегда).
Представление, которое я создаю для представления «контента» на сайте, я, естественно, считаю контентом, но у Drupal непоследовательное и часто неверное представление о том, что это такое.
Для начала я настроил сайт таким образом, чтобы язык интерфейса определялся предпочтительным языком пользователя (как установил бы администратор/редактор сайта), а язык контента определялся префиксом языкового кода URL.
Пример тестового представления выглядит следующим образом на FR (url — /fr/test) — язык интерфейса установлен на EN:
Это явно неверно, как видно при правильном отображении, когда я установил язык интерфейса на FR:
Представления имеют множество опций для установки того, как определяется язык рендеринга «контента». В моем примере выше он настроен на отображение на основе «языка контента» страницы (и, следовательно, URL-адреса). Это работает для большинства полевых данных (название, термины таксономии, переведенные текстовые поля); но, к сожалению, не работает для полей Datetime - они, кажется, жестко запрограммированы для неправильного перевода с использованием интерфейса. Но вы также можете видеть, что части конфигурации представления (название представления, метки полей и т. д.) также переводятся как интерфейс.
Есть ли способ сообщить представлению о переводе с помощью языка содержимого?
Я использовал следующий код:
$languageManager = \Drupal::languageManager();
$langcode = $languageManager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId();
$language = $languageManager->getLanguage($langcode);
$languageManager->setConfigOverrideLanguage($language);
в функции предварительной обработки блока, чтобы позволить некоторым частям блока, которые неправильно используют язык интерфейса, переводить на язык содержимого. Есть ли какой-то аналогичный способ переопределить язык интерфейса, который представление использует для перевода? Я надеюсь, что это что-то вроде кода выше, но я просто не вставляю его в нужное место (я безуспешно пробовал хуки для предварительной сборки, предварительной визуализации, query_alter).
Если это возможно сделать, я бы хотел написать модуль contrib, чтобы использовать существующий пользовательский интерфейс в представлении, чтобы установить язык рендеринга и заставить его отображать все, а не только определенные поля.