Drupal 8: Как создать многоязычный пункт меню из .links.menu.yml - PullRequest
0 голосов
/ 10 сентября 2018

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

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

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

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

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

1 Ответ

0 голосов
/ 11 сентября 2018

Преемник. Первые links.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');
      }

    }
...