Drupal 8: как создать многоязычный пункт меню из .links.menu.yml

Итак, во многих местах, то есть здесь:

https://www.drupal.org/docs/8/api/menu-api/providing-module-defined-menu-links

Объясняется, как добавить пункт меню в какое-либо существующее меню из module_name.links.menu.yml вашего модуля.

Проблема в том, что пункты меню можно переводить (из бэкэнда), но я нигде не нашел, как добавить пункты меню на нескольких языках? Это вообще возможно?

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

1
0
1 319
1

Ответы 1

Удалось. Первые ссылки.menu.yml я создал вот так:

my_menu_item_id:
  title: 'Dummy Title'
  description: 'Dummy Description'
  url: http://www.google.com
  parent: mainmenu
  menu_name: mainmenu
  weight: -100

Затем я добавил в свой модуль hook_menu_links_discovered_alter() вот так:

   function mymodule_menu_links_discovered_alter(&$links) {
          $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
          $links['my_menu_item_id']['title'] = 'Title:'.$language;
   }

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

Вместо использования этой функции-хука я добавил параметр "class" в links.menu.yml:

my_menu_item_id:
  class: Drupal\my_module\Plugin\Menu\MyPluginClass
  title: 'Dummy Title'
  description: 'Dummy Description'
  url: http://www.google.com
  parent: mainmenu
  menu_name: mainmenu
  weight: -100

Затем, конечно, я создал этот класс в my_module/src/Plugin/Menu (не забудьте поместить плагин в src dir!), И он выглядит так:

<?php

namespace Drupal\my_module\Plugin\Menu;

use Drupal\Core\Menu\MenuLinkDefault;
use Drupal\Core\Url;

    class MyPluginClass extends MenuLinkDefault {


      /**
       * {@inheritdoc}
       */
      public function getTitle() {

        $language = \Drupal::languageManager()->getCurrentLanguage()->getId();

        return (string) 'Title: '.$language;
      }

      public function getUrlObject($title_attribute = TRUE) {
        return Url::fromUri('http://www.yahoo.com');
      }

    }

Другие вопросы по теме