web-dev-qa-db-fra.com

Comment puis-je respecter le booléen «activé» spécifique à la langue des éléments de menu?

J'essaie de traduire le champ "activé" des éléments de menu dans Drupal 8. Jusqu'à présent, j'ai écrit ce code dans le fichier MYMODULE.module:

function MYMODULE_entity_base_field_info_alter(&$fields, \Drupal\Core\Entity\EntityTypeInterface $entity_type) {
  if ($entity_type->id() == 'menu_link_content' && !empty($fields['enabled'])) {
    $fields['enabled']->setTranslatable(TRUE);
  }
  return $fields;
} 

Cela fonctionne bien et je suis en mesure de définir le champ activé différemment pour différentes langues. par exemple: pour le même élément de menu, je peux vérifier le champ "activé" pour l'anglais, mais décochez le champ "activé" pour le français.

Mais cela ne fonctionne pas comme prévu. Il masque l'élément de menu pour toutes les langues. Dois-je utiliser hook_preprocess() ou hook_preprocess_menu() ou un autre crochet pour l'élément de menu à afficher/masquer en fonction du champ "activé" dans différentes langues? Quelqu'un peut-il me donner des indices à ce sujet?

3
user93578

Pour ce que vous essayez de réaliser, j'ai découvert que vous pouvez utiliser le module Menu Manipulator . Ce module visait initialement à corriger [Problème] Les éléments de menu non traduits sont affichés dans les menus .

Remarques

Ce module vise initialement à corriger ce problème principal avec les éléments de menu non traduits .


Après avoir installé ce module, seuls les éléments de menu disponibles dans la langue actuelle seront affichés. S'il y a un élément de menu dont vous n'avez pas besoin dans une certaine langue, supprimez-le ou supprimez sa traduction.

Pour que cela fonctionne correctement, assurez-vous que votre menu, le titre du menu et "Afficher le sélecteur de langue sur les pages de création et de modification" sont activés pour votre menu sous https://example.com/admin/config/regional/content -langue .

  • Ayant un élément de menu que vous souhaitez afficher uniquement sur le site français, sélectionnez le français comme langue et ne le traduisez pas.
  • Ayant un élément de menu à afficher uniquement sur le site anglais, sélectionnez l'anglais comme langue et ne le traduisez pas.
  • Avoir un élément de menu à afficher sur les deux sites, l'ajouter dans une langue et simplement le traduire.
1
leymannx

L'ajout de ce code dans Drupal/core/modules/menu_link_content/Plugin/Menu/MenuLinkContent.php a fait fonctionner la fonctionnalité exactement comme prévu. (Les éléments du menu ont été désactivés dans une langue mais activés dans une autre)

public function isEnabled() {

        if ($this->languageManager->isMultilingual()) {
          return $this->getEntity()->isEnabled();
        }
        return $this->pluginDefinition['enabled'];
    }

Mais je ne sais pas comment étendre cette classe dans mon module personnalisé et la rendre visible à drupal .. Des idées à ce sujet?

0
user93578