Рейтинг:0

Как изменить заголовок страницы «Создать X» на «Добавить X» для всех X?

флаг kz

В Drupal 7 было друпал_get_title()и друпал_set_title(). Они история.

Я хочу изменить заголовок страницы «Создать X» на «Добавить X» для всех X, и я думаю hook_preprocess_page_title() в моем .theme-файле самое подходящее место для этого. (Если вы не согласны, скажите об этом.)

т.е. Я хочу, чтобы это было «Добавить X» для любого «X», когда изначально было «Создать X». Например: «Создать статью» должно стать «Добавить статью». И если заголовок «Статья адвоката», я должен остаться как есть.

По сути, я хочу понюхать строку заголовка и, если она начинается с «Создать», изменить ее на «Добавить». Это до сих пор я получил, и это, очевидно, неполное:

/**
 * Реализует hook_preprocess_page_title().
 */

Первая попытка:

функция mytheme_preprocess_page_title(&$variables) {
  $запрос = \Drupal::request();
  $route_match = \Drupal::routeMatch();
  $title = \Drupal::service('title_resolver')->getTitle($request, $route_match->getRouteObject());
}

Вторая попытка, основанная на предложении 4k4:

функция mytheme_preprocess_page_title(&$variables) {
  $title = $переменные['название'];
  если ($ title экземпляр TranslatableMarkup) {
    $title = $title->getUntranslatedString();
    $title = str_replace('Создать', 'Добавить', $title);
    $variables['title'] = t($title);
  }
  еще {
    $variables['title'] = Разметка::create(str_replace('Создать', 'Добавить', $title));
  }  
}

Заголовки, которые я хочу изменить, взяты из ядра Drupal, и их можно перевести, так что это instanceof TranslatableMarkup ветвь, которая выполняется, но я согласен с запасным вариантом на случай, если это не так, это хорошая идея.

Однако, несмотря на хорошее начало, это не полное решение. Он изменяет отображаемый заголовок формы добавления статьи с «Создать статью» на «Добавить @name».

введите описание изображения здесь

Я проголосовал за ответ 4k4, так как он идет гораздо дальше к решению, чем моя первая попытка, но он все еще не завершен.

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

No Sssweat avatar
флаг ua
Не проверено, но вы можете попробовать решить это с помощью файла шаблона. [page-title.html.twig](https://api.drupal.org/api/drupal/core%21modules%21system%21templates%21page-title.html.twig/8.2.x) изменить `{{ title } }` на `{{ title|replace({'Создать X': "Добавить X"}) }}`
Free Radical avatar
флаг kz
Спасибо @NoSssweat! Да, это работает. Я все еще надеюсь на ответ, объясняющий, как это сделать в PHP. Это не будет работать с переведенными названиями.
No Sssweat avatar
флаг ua
Хм, попробуйте `|replace({'Создать X'|t: "Добавить X"|t})`
Рейтинг:1
флаг cn

Я хочу изменить заголовок страницы «Создать X» на «Добавить X» для всех X, и я думаю, что hook_preprocess_page_title() в моем файле .theme является правильным место, чтобы сделать это. (Если вы не согласны, скажите об этом.)

Вы можете изменить только заголовок, отображаемый в теге body, но не метатег title в теге html.

$title = \Drupal::service('title_resolver')->getTitle($request, $route_match->getRouteObject());

Это дает вам только заголовок из определения маршрута или обратного вызова, а не заголовок, установленный #заглавие в отрендеренном выводе.

$title не является строкой. Строка где-то там, но как мне извлечь его, чтобы увидеть, с чего он начинается?

Это объект разметки. Либо простой, либо переводимый. Видеть Как вы редактируете содержимое экземпляра Drupal\Core\Render\Markup с помощью функции предварительной обработки в Drupal 8? или же Как изменить текст на кнопке отправки в форме узла?

Как мне на самом деле изменить его в контексте хука предварительной обработки. т.е. что эквивалентно drupal_set_title() в этом контексте?

В хуке предварительной обработки вы можете изменять только те переменные, которые отображает шаблон, в этом случае:

$variables['title'] = 'Название Foo';

Если он содержит HTML-разметку, чтобы избежать автоматического экранирования:

$variables['title'] = \Drupal\Core\Render\Markup::create('<i>Foo</i> title');

Если это переводимо:

$variables['title'] = t('Foo title');

Пример кода:

используйте Drupal\Core\StringTranslation\TranslatableMarkup;
использовать Drupal\Core\Render\Markup;
    
/**
 * Реализует hook_preprocess_page_title().
 */
функция mymodule_preprocess_page_title(&$variables) {
  $title = $переменные['название'];
  если ($ title экземпляр TranslatableMarkup) {
    $title_untranslated = $title->getUntranslatedString();
    $title_replaced = str_replace('Создать', 'Добавить', $title_untranslated);
    $variables['title'] = t($title_replaced, $title->getArguments());
  }
}

  
Free Radical avatar
флаг kz
Я хочу, чтобы это было переводимо. Однако я не хочу, чтобы заголовок был «Название Foo», я хочу, чтобы он был «Добавить X» для любого «X», когда изначально было «Создать X». (например, «Создать статью» должно стать «Добавить статью». И если заголовок «Статья в баре», я ничего не хочу делать.Я собираюсь более внимательно изучить ссылки, которые вы предоставляете об объектах разметки, но я до сих пор не понял, как выяснить, начинается ли строка с «Создать».
4uk4 avatar
флаг cn
Итак, вы хотите заменить исходную английскую версию, а затем перевести замененную версию. Это немного сложнее, потому что переводимая разметка возвращает уже переведенную строку в виде строки, и вам нужно использовать метод вместо приведения ее к строке. Я добавляю пример кода, также с резервом для простой разметки, которая работает с преобразованием строк.
4uk4 avatar
флаг cn
Я добавил аргументы t() для заполнителя. Также я удалил запасной вариант, потому что переменная title может содержать разное содержимое, а также целые массивы рендеринга.
Free Radical avatar
флаг kz
Большой! Последнее воплощение работает.
4uk4 avatar
флаг cn
Кстати, скриншот, который вы добавили, — это маршрут node.add. Вы можете заменить этот обратный вызов заголовка в определении маршрута, и он также работает в панировочных сухарях и метатегах: https://api.drupal.org/api/drupal/core%21modules%21node%21src%21Controller%21NodeController.php/function/NodeController. %3A%3AaddPageTitle/9.2.x
Free Radical avatar
флаг kz
Ваше руководство очень ценно, но некоторые из них выходят за рамки моей головы. Не могли бы вы сказать мне, где находится мое определение маршрута и как его изменить (или указать мне подходящий учебник).
4uk4 avatar
флаг cn
См., например (вам нужно только заменить имя маршрута): https://drupal.stackexchange.com/questions/217680/override-user-edit-page-title

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

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