Wagtail 번역된 탐색 메뉴
웹사이트에서 다국어 콘텐츠를 처리할 때 탐색 메뉴가 현지 언어로 표시되지 않을 수 있습니다.
최근 Wagtail Localize 플러그인을 사용하여 콘텐츠를 다양한 언어로 번역할 때 문제가 발생했습니다. 페이지는 잘 번역되었지만 상단 탐색 메뉴는 항상 기본 언어로 유지되었습니다.
그 문제를 너무 오랫동안 조사한 후 마침내 해결책을 찾았고 다른 사람이 같은 문제에 직면할 경우를 대비하여 문서화하고 싶었습니다.
이것은 이전에 base/templatetags/navigation_tags.py의 내용이었습니다.
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()
...
그리고 이것은 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 %}
다른 솔루션이 있을 수 있으며 평소와 같이 실제 수정 사항은 특정 Wagtail 구현에 크게 의존하지만 저를 위한 수정 사항은 base/templatetags/navigation_tags.py를 변경하여 요청 언어와 일치하는 페이지를 검색하는 것이었습니다.
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)
...
댓글을 게시했습니다: 0
Tagged with:
Wagtail