セキレイ翻訳ナビゲーションメニュー

ウェブサイトで多言語コンテンツを扱う場合、ナビゲーション メニューが現地の言語で表示されない場合があります。

C05348A3-9AB8-42C9-A6E0-81DB3AC59FEB
           

最近、 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