Рейтинг:0

Итак, object.field_supplier_products возвращает "product1"

флаг us
jfc

Создание «черного списка тегов» для пользователей в представлении

Я использую REST API в Drupal 9 и использую литералы шаблонов JavaScript для генерации некоторых данных.

<span class="products">${Drupal.t(object.field_supplier_products)}</span>

Например, для создания списка продуктов, которые извлекаются из API, это мой код:

Это возвращает то, что у меня есть в field_supplier_products, например, «Продукт 1, Продукт 1, Продукт 3», но я не могу найти переводы строк.

Это многоязычный сайт, и названия этих продуктов необходимо перевести.

<span class="products">${Drupal.t('Product One')}</span>
<span class="products">${Drupal.t('Product Two')}</span>
<span class="products">${Drupal.t('Product Three')}</span>

Если я сделаю -

Затем я вижу названия продуктов в переводе строки

Есть ли какой-нибудь способ или обходной путь, позволяющий использовать Drupal.t с переменными?

* Редактировать — пример вне API —

Drupal.t("что-то перевести")

Я могу найти строку "что-то перевести"

translateVariable = 'перевод в переменной'

Drupal.t(перевести переменную)

Нет результатов для «перевода в переменной», когда я искал строку

* Редактировать 2 -

Еще немного контекста - я использую модуль веб-служб Drupal RESTful, чтобы иметь REST API для представления. Я создал представление, в котором есть все мои продукты.

У меня есть файл JavaScript product.js, который используется для создания разметки в моем файле products.html.twig. В этом файле есть этот код -
(функция ($, Друпал) {
    если (document.querySelector('#products-page')) {
        $.ajax({
            метод: «ПОЛУЧИТЬ»,
            URL-адрес: '/API/продукты/'
        }).done(функция (данные, статус, xhr) {
            $.each(данные, функция (индекс, объект) {
                $('#продукты .обертка').append(`
                <div class="продукт col-12">
                    <span class="products">${Drupal.t(object.field_supplier_products)}</span>
                </div>
                
                `)
            });
        });
    }
})

Пример некоторых json, возвращаемых из объекта -

    {
        "title": "Поставщик 1",
        "нид": "1",
        "market_id": "2",
        "идентификатор_продукта": "15",
        "field_supplier_products": продукт1,
    },

Kevin avatar
флаг in
Вы делаете это на сайте, который не является Drupal? API должен передать перевод в своем ответе.
jfc avatar
флаг us
jfc
Сайт Drupal, я просто использую Drupal REST API для создания разметки вместо представления.
Jaypan avatar
флаг de
Итак, вы используете JS-скрипт в Drupal, чтобы сделать вызов REST API к тому же экземпляру Drupal (он же сам)? Является ли вызов `Drupal.t()` в файле JS вызовом API? Немного сложно разобраться в вашей архитектуре, чтобы дать правильный ответ, поэтому, если бы вы могли объяснить архитектуру и где находится вызов `Drupal.t()`, вам было бы легче оказать помощь.
jfc avatar
флаг us
jfc
Я отредактировал свой пост, добавив некоторые подробности @Jaypan
Jaypan avatar
флаг de
Я до сих пор не понимаю вашу архитектуру, но я думаю, что теперь вижу проблему и добавлю решение ниже.
Рейтинг:0
флаг de

Проблема связана с тем, что вы пытаетесь перевести переменную, а не литеральную строку:

Drupal.t(object.field_supplier_products)

В Drupal переменные не следует переводить как по соображениям безопасности, так и для поддержания чистоты таблицы переводов. Теперь на стороне сервера в PHP, если бы вы использовали т() функция вокруг переменной, например т ($ цвет) это выдаст предупреждение, но значение все равно должно быть переводимым (я не пробовал/не проверял несколько лет). Но если я правильно помню, с JS и Друпал.t() функции вообще невозможно преобразовать переменные. Это связано с тем, что скрипт Drupal фактически анализирует значения Drupal и повторно генерирует переведенные значения, кэширует переведенные значения, и этот новый файл отправляется в браузер. Таким образом, на самом деле в браузере не происходит перевода, перевод фактически выполняется PHP на сервере, и новый файл генерируется до того, как файл будет отправлен в браузер.

Решение состоит в том, чтобы убедиться, что ваши значения переведены в REST API, чтобы они уже были переведены, когда ваш JS их получает, и не требовалось использование Друпал.t() функция. Из вашего сообщения видно, что конечная точка REST также является экземпляром Drupal, поэтому, чтобы сделать это на сервере REST, вы должны:

  1. Настройте сервер REST API как многоязычный сайт с определением языка по URL-адресу.
  2. Сделайте запрос к API, используя многоязычный URL-адрес для языка, который необходимо получить.

Например, если ваш многоязычный сайт отличается префиксом пути, у вас будет:

  • http://www.example.com/path/to/restserver [основной язык]
  • http://www.example.com/[LANGUAGE_PREFIX]/path/to/restserver (язык LANGUAGE_PREFIX)

Затем ваш JS запросит REST API из соответствующего языкового пути.

Я часто нахожу полезным генерировать URL-адрес на стороне сервера и передавать этот сгенерированный PHP URL-адрес, который будет содержать языковой префикс для текущего языка, в JS, который затем динамически вызывает URL-адрес.

Сначала это делается путем создания библиотеки, которая добавляет ваш JS-файл и зависит от настроек Drupal:

пример_библиотеки:
  js:
    путь/к/file.js: {}
  зависимости:
    - настройки ядра/друпала

Затем ваш элемент рендеринга подключит библиотеку и передаст URL-адрес JS-файлу в библиотеке:

используйте Drupal\Core\Url;
$ страница[
  'некоторый_элемент' => [
    '#prefix' => '<div id="example_placeholder">',
    '#суффикс' => '</div>',
    '#markup' => $this->t('Заполнитель'),
    '# прикрепленный' => [
      'библиотека' => ['[МОДУЛЬ]/example_library'],
      'drupalSettings' => [
        'примермодуля' => [
          'ajaxCallbackUrl' => Url::fromRoute('[МАРШРУТ РЕСТАПИ]', [], ['absolute' => TRUE])->toString(),
        ],
      ],
    ],
  ],
];

Теперь сценарий файл.js будет иметь доступ к URL-адресу REST API с языковым префиксом в drupalSettings.exampleModule.ajaxCallbackUrl переменная.

файл.js:

функция (настройки друпала) {

  функция сделать что-то () {
    console.log(drupalSettings.exampleModule.ajaxCallbackUrl);
  }
}(Настройки друпала));

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

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