Drupal8:如何从.links.menu.yml创建多语言菜单项

Drupal8:如何从.links.menu.yml创建多语言菜单项,menu,translation,drupal-8,Menu,Translation,Drupal 8,因此,在许多地方,例如这里: 它解释了如何从模块的module\u name.links.menu.yml向一些现有菜单添加菜单项 问题是菜单项是可翻译的(从后端),但我找不到任何地方如何添加多语言菜单项?那有可能吗 所以,我有一个菜单,我想添加一个菜单项,但在每种语言上,菜单项应有不同的标题和指向的不同url。成功。我创建的第一个links.menu.yml如下: my_menu_item_id: title: 'Dummy Title' description: 'Dummy De

因此,在许多地方,例如这里:

它解释了如何从模块的
module\u name.links.menu.yml
向一些现有菜单添加菜单项

问题是菜单项是可翻译的(从后端),但我找不到任何地方如何添加多语言菜单项?那有可能吗


所以,我有一个菜单,我想添加一个菜单项,但在每种语言上,菜单项应有不同的标题和指向的不同url。

成功。我创建的第一个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
   function mymodule_menu_links_discovered_alter(&$links) {
          $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
          $links['my_menu_item_id']['title'] = 'Title:'.$language;
   }
然后,我在我的模块中添加了
hook\u菜单\u links\u discovered\u alter()
,如下所示:

my_menu_item_id:
  title: 'Dummy Title'
  description: 'Dummy Description'
  url: http://www.google.com
  parent: mainmenu
  menu_name: mainmenu
  weight: -100
   function mymodule_menu_links_discovered_alter(&$links) {
          $language = \Drupal::languageManager()->getCurrentLanguage()->getId();
          $links['my_menu_item_id']['title'] = 'Title:'.$language;
   }
基本上这是可行的,但问题是它并不是每个请求都执行,而是缓存。因此,也就是说,如果你想有不同的标题或网址取决于语言,它不会工作。第一种语言的版本将被缓存,所有其他语言将使用相同的缓存版本。 所以我不得不选择不同的解决方案:

我没有使用这个钩子函数,而是在links.menu.yml中添加了“class”参数:

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
(别忘了把Plugin放在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');
      }

    }