Wagtail 自定义可翻译菜单

问题描述 投票:0回答:2

我是鹡鸰新手,我正在使用自定义菜单。我设置了一个自定义菜单类并使用标签来显示模板中的菜单项。 这工作正常,但是我需要根据我的网站使用的语言创建不同的菜单。(我知道 wagtailmenus 存在,但是我也找不到令人满意的方法来创建翻译菜单)

我想创建类似 wagtail-localize 对页面所做的翻译体验。这是可能的还是我必须采取不同的方法?

我已经尝试使用 wagtails TranslatableMixin 来简单地创建具有不同翻译的菜单副本,但这似乎不起作用,因为缺少翻译选项(就像对页面完成的那样)。

课程:

class Menu(TranslatableMixin, ClusterableModel):    
    title = models.CharField(max_length=100)
    logo = models.ForeignKey("wagtailimages.Image", blank=True, null=True, on_delete=models.SET_NULL, related_name="menu_logo")
    image = models.ForeignKey("wagtailimages.Image", blank=True, null=True, on_delete=models.SET_NULL, related_name="menu_image")
    slug = AutoSlugField(populate_from="title", editable=True)

    panels = [
        MultiFieldPanel(
            [
                FieldPanel("title"),
                FieldPanel("slug"),
                ImageChooserPanel("logo"),
                ImageChooserPanel("image"),
            ],
            heading="Menu",
        ),
        InlinePanel("menu_items", label="Menu Item"),
    ]

    def __str__(self):
        return self.title

    class Meta(TranslatableMixin.Meta):
        verbose_name = "Menu"



class MenuItem(ClusterableModel, AbstractMenuItem):
    page = ParentalKey("Menu", related_name="menu_items")

    class Meta:
        verbose_name = "Menu Item"

模板标签:

@register.simple_tag()
def get_menu(slug, authencicated):
    menu = Menu.objects.get(slug=slug)
    all_menu_items = menu.menu_items.all()
    menu_items = []
    for item in all_menu_items:
        if item.show(authencicated):
            menu_items.append(item)
    return {"logo": menu.logo, "image": menu.image, "items": menu_items}

模板:

{% get_menu "main-menu" request.user.is_authenticated as menu%}
django wagtail translate wagtail-localize
2个回答
0
投票

以下是无需额外软件包即可“手动”处理此问题的方法。首先请仔细检查您的配置

一方面,您可以将翻译后的标题添加到您在这些菜单中列出的页面模型中。例如,称之为

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

0
投票

Wagtail modeltransaction 不适用于仅片段页面模型。 Wagtail with Codered Crx 的导航栏几乎是完美的……但有一个大问题。 LayouSetting 使用导航栏的一个实例...那么我们如何才能实现多语言...?

TranslatableMixin 是一个提供帮助的方向...但我们仍然有与 Navbar 模型相关的 LayoutSettings。

奇怪的是,还没有人解决这个问题(页脚菜单)。

© www.soinside.com 2019 - 2024. All rights reserved.