Рейтинг:0

Можно ли отображать представление на основе языка содержимого?

флаг us

Drupal поддерживает концепцию языка интерфейса и языка контента. У меня (и у каждого клиента, которого я когда-либо спрашивал) другое мнение о том, что такое «контент» и что такое «интерфейс», чем у Drupal (в большинстве случаев). Я рассматриваю интерфейс как элементы, которые администратор или редактор будет использовать для выполнения своей работы (меню администратора, вкладка редактирования, справочная информация в формах и т. д.), а контент — это то, что увидят неадминистраторы (часто это аноним, но не всегда).

Представление, которое я создаю для представления «контента» на сайте, я, естественно, считаю контентом, но у Drupal непоследовательное и часто неверное представление о том, что это такое.

Для начала я настроил сайт таким образом, чтобы язык интерфейса определялся предпочтительным языком пользователя (как установил бы администратор/редактор сайта), а язык контента определялся префиксом языкового кода URL.

Пример тестового представления выглядит следующим образом на FR (url — /fr/test) — язык интерфейса установлен на EN:

контент = французский, интерфейс = английский

Это явно неверно, как видно при правильном отображении, когда я установил язык интерфейса на FR:

контент = FR, интерфейс = FR

Представления имеют множество опций для установки того, как определяется язык рендеринга «контента». В моем примере выше он настроен на отображение на основе «языка контента» страницы (и, следовательно, URL-адреса). Это работает для большинства полевых данных (название, термины таксономии, переведенные текстовые поля); но, к сожалению, не работает для полей Datetime - они, кажется, жестко запрограммированы для неправильного перевода с использованием интерфейса. Но вы также можете видеть, что части конфигурации представления (название представления, метки полей и т. д.) также переводятся как интерфейс.

Есть ли способ сообщить представлению о переводе с помощью языка содержимого?

Я использовал следующий код:

  $languageManager = \Drupal::languageManager();
  $langcode = $languageManager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId();
  $language = $languageManager->getLanguage($langcode);
  $languageManager->setConfigOverrideLanguage($language);

в функции предварительной обработки блока, чтобы позволить некоторым частям блока, которые неправильно используют язык интерфейса, переводить на язык содержимого. Есть ли какой-то аналогичный способ переопределить язык интерфейса, который представление использует для перевода? Я надеюсь, что это что-то вроде кода выше, но я просто не вставляю его в нужное место (я безуспешно пробовал хуки для предварительной сборки, предварительной визуализации, query_alter).

Если это возможно сделать, я бы хотел написать модуль contrib, чтобы использовать существующий пользовательский интерфейс в представлении, чтобы установить язык рендеринга и заставить его отображать все, а не только определенные поля.

Jaypan avatar
флаг de
«Это явно неверно, как видно»
liquidcms avatar
флаг us
хорошо, может быть, не так ясно? Язык содержимого установлен (префикс URL) на французский, поэтому я хотел бы, чтобы таблица была на французском языке. Все это. Единственными частями, для которых установлено значение FR, установленное языком рендеринга представления, являются данные в столбце (1). Остальные части: заголовки столбцов, данные в столбцах 2 и 3 (даты) и заголовок представления по-прежнему отображаются на английском языке. Правильный вывод можно увидеть на втором изображении, когда я устанавливаю язык интерфейса на FR.
Jaypan avatar
флаг de
Даты — это интерфейс, поэтому я считаю, что они отображаются на языке интерфейса, а не на текущем языке контента. У меня, к сожалению, нет решения для этого.
liquidcms avatar
флаг us
Не могу придумать аргумент, что даты будут считаться любым определением интерфейса Drupal, но да, они неправильно переводятся как интерфейс. Я уверен, что это ошибка; но не то, о чем я спрашиваю. Вместо того, чтобы отправлять патч, чтобы просто исправить модуль Datetime, я хочу выяснить, как сделать полную визуализацию представления с определенным языком.
флаг ru
Даты не переводятся, они локализованы (как и знак десятичной точки), а локализация основана на языке интерфейса. Например. «07/12» — это «12 июля» в США, в то время как каждый европеец прочитал бы это как «7 декабря». Без контекста «1.000» будет означать «один (ноль запятых)» в США и «тысяча» в немецкоязычных странах. Локализация Drupal превосходна, и так и так прекрасно.
Jaypan avatar
флаг de
Даты можно переводить - они настраиваются, и для них можно включить перевод.
liquidcms avatar
флаг us
@Hudri, я понимаю, как работают даты. На самом деле 2 части: локализованные строки, такие как месяц и день недели, а также переведенные форматы, как упоминает Джейпан. Проблема в том, что "исходя из языка интерфейса" - да, это правда - и неправильно. Зачем вам нужна таблица Views, в которой все столбцы указаны на правильном языке, кроме столбца даты? Я предполагаю, что вы всегда работали с Drupal по умолчанию, который должен иметь связанный перевод интерфейса/контента. Примечание: мой ОП касается контроля за отображением представлений, а не дат. Я думаю, Джейпан понимает, что я пытаюсь сделать. :)
флаг ru
*Проблема в том, что "исходя из языка интерфейса" - да, это верно - и неправильно.* - Я здесь категорически не согласен :-) Наша компания ориентируется на клиентов в сфере туризма, _все_ наши проекты многоязычны. Например. они предлагают праздничные пакеты, и важно получить формат даты в общем формате даты гостя (даже если узел не переведен, они все равно получают локализованные даты из языка интерфейса). Это избавляет от множества вопросов и проблем в нашем бизнесе. По теме: Извините, я не знаю ответа.
liquidcms avatar
флаг us
Да, наши варианты использования разные. Мой предназначен для канадского федерального правительственного сайта. Непереведенных страниц не бывает. Моя цель — создать сайт, содержимое которого (включая даты) определяется языком содержимого сайта (url); но редакторы сайта могут работать на предпочитаемом ими языке (интерфейсе). Но ближе к делу; Drupal почти позволяет использовать эти различные варианты использования. Даже для представлений у них есть возможность выбрать язык для отображения представления — он просто работает неправильно. Я предполагаю, что на вашем сайте установлено такое же определение содержимого/интерфейса, верно?
Рейтинг:0
флаг us

Угх... видимо, на мой вопрос всегда был ответ. Когда я добавляю фрагмент кода:

  $languageManager = \Drupal::languageManager();
  $langcode = $languageManager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId();
  $language = $languageManager->getLanguage($langcode);
  $languageManager->setConfigOverrideLanguage($language);

к хуку _views_pre_render он делает то, что я хочу, и использует язык переопределения конфигурации, чтобы переопределить язык, используемый для настраиваемых частей представления (заголовок, заголовки столбцов и т. д.). Единственное, что он не обрабатывает, - это даты, так как они просто сделаны неправильно в модуле Datetime. Не уверен, почему я не видел, как это работает, когда пробовал раньше.

И я могу переопределить базовую службу DateFormatter, чтобы использовать язык содержимого вместо языка по умолчанию (который является интерфейсом), и это исправляет даты повсюду на сайте. Вероятно, это должно быть представлено как патч для ядра, поскольку я уверен, что это ошибка — почему даты считаются интерфейсом иначе, чем весь другой контент?

Ответить или комментировать

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