Пользовательское переводимое меню 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
Вернуться на верх