Menu de navigation traduit de Wagtail
Lors de la gestion de contenu multilingue sur votre site Web, votre menu de navigation peut ne pas s'afficher dans la langue locale.
J'ai récemment rencontré un problème lors de l'utilisation du plug-in Wagtail Localize pour traduire du contenu dans différentes langues. Les pages ont été bien traduites, mais le menu de navigation supérieur est toujours resté dans la langue par défaut.
Après avoir examiné ce problème pendant trop longtemps, j'ai finalement trouvé une solution et je voulais la documenter au cas où quelqu'un d'autre rencontrerait le même problème.
C'était le contenu de base/templatetags/navigation_tags.py avant :
from django import template
from wagtail.core.models import Page, Site
from mybase.base.models import FooterText
register = template.Library()
# https://docs.djangoproject.com/en/3.2/howto/custom-template-tags/
@register.simple_tag(takes_context=True)
def get_site_root(context):
# This returns a core.Page. The main menu needs to have the site.root_page
# defined else will return an object attribute error ('str' object has no
# attribute 'get_children')
return Site.find_for_request(context['request']).root_page
def has_menu_children(page):
# This is used by the top_menu property
# get_children is a Treebeard API thing
# https://tabo.pe/projects/django-treebeard/docs/4.0.1/api.html
return page.get_children().live().in_menu().exists()
...
Et c'était le contenu de templates/tags/top_menu.html :
{% load navigation_tags wagtailcore_tags %}
{% get_site_root as site_root %}
{% for menuitem in menuitems %}
<li class="presentation {{ menuitem.title|lower|cut:" " }}{% if menuitem.active %} active{% endif %}{% if menuitem.show_dropdown %} has-submenu{% endif %}">
{% if menuitem.show_dropdown %}
<a href="{% pageurl menuitem %}" class="allow-toggle">{{ menuitem.title }} <span><a class="caret-custom dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"></a></span></a>
{% top_menu_children parent=menuitem %}
{# Used to display child menu items #}
{% else %}
<a href="{% pageurl menuitem %}" role="menuitem">{{ menuitem.title }}</a>
{% endif %}
</li>
{% endfor %}
Il peut y avoir d'autres solutions, et comme d'habitude, le correctif réel dépend fortement de votre implémentation particulière de Wagtail, mais le correctif pour moi consistait à modifier base/templatetags/navigation_tags.py pour récupérer la page correspondant à la langue de la requête :
from django import template
from wagtail.models import Page, Site
from mybase.base.models import FooterText
from wagtail.core.models import Locale
register = template.Library()
# https://docs.djangoproject.com/en/3.2/howto/custom-template-tags/
@register.simple_tag(takes_context=True)
def get_site_root(context):
# This returns a core.Page. The main menu needs to have the site.root_page
# defined else will return an object attribute error ('str' object has no
# attribute 'get_children')
request = context['request']
language = request.LANGUAGE_CODE
locale = Locale.objects.get(language_code=language)
return Site.find_for_request(context['request']).root_page.get_translation(locale)
...
Tagged with:
Wagtail