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');
}
}