Пользовательское переводимое меню Wagtail
Я новичок в wagtail и работаю с пользовательским меню. Я установил класс пользовательского меню и использую тег для отображения пунктов меню в шаблонах. Это работает хорошо, однако мне нужно создать разные меню в зависимости от того, на каком языке используется мой сайт. (Я знаю, что существует wagtailmenus, однако я не смог найти удовлетворительного способа создания переведенных меню там)
Я хотел создать подобный опыт перевода, как это делает wagtail-localize со страницами. Возможно ли это или мне нужно использовать другой подход?
Я уже пытался использовать wagtails TranslatableMixin для простого создания дубликатов моего меню с разными переводами, однако, похоже, это не работает.
Вот способы подойти к этому "вручную" без дополнительных пакетов. Прежде всего, пожалуйста, дважды проверьте вашу конфигурацию.
С одной стороны, вы можете добавить переведенный заголовок к моделям страниц, которые вы перечисляете в этих меню. Назовите его, например, title_en
.
С другой стороны, вы можете добавить это поле непосредственно в ваш MenuItem
класс:
class MenuItem(ClusterableModel, AbstractMenuItem):
page = ParentalKey("Menu", related_name="menu_items")
title_en = models.CharField(max_length=32, verbose_name="English Title")
title_zh = models.CharField(max_length=32, verbose_name="Chinese Title")
class Meta:
verbose_name = "Menu Item"
В шаблоне можно определить текущий язык и выбрать меню соответствующим образом. Это также работает через тег шаблона (путем передачи кода языка или получения кода языка в теге шаблона).
{% load i18n %}
{% get_current_language as current_language_code %}
# You could either pass the current_language_code to your template tag:
{% get_menu('slug', current_language_code) %}
# Or use multiple template tags:
{% if current_language_code == 'zh' %}
{% get_chinese_menu %}
{% else %}
{% get_english_fallback_menu %}
{% endif %}
Вы также можете получить код текущего языка в файле templatetags.py:
from django.utils.translation import get_language
@register.simple_tag()
def get_menu(slug, ...):
current_language_code = get_language()
if current_language_code == 'zh':
...
else:
...
Вы можете использовать дополнительный пользовательский тег шаблона для перевода пунктов меню, если структура меню идентична:
from django.utils.translation import get_language
@register.simple_tag()
def get_translated_title(item):
current_language_code = get_language()
if current_language_code == 'zh':
return item.title_zh
return item.title_en # fallback