【问题标题】:Wagtail Custom Translatable Menu鹡鸰自定义可翻译菜单
【发布时间】:2022-01-03 22:14:37
【问题描述】:

我是 wagtail 的新手,我正在使用自定义菜单。我设置了一个自定义菜单类并使用标签来显示模板中的菜单项。 这很好用,但是我需要根据我的网站使用的语言创建不同的菜单。(我知道 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


    【解决方案1】:

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

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

    【讨论】:

    • 这不是我搜索的内容,但感谢您的回复。我搜索了翻译菜单的可能性,例如 wagtail-localize 允许我使用 pages 和 sn-ps。作为一种解决方法,我将我的菜单注册为 sn-ps,然后我可以使用“wagtail-localize”方法翻译它们。然而,遗憾的是,到目前为止,我最初希望制作一个模型(注册到管理侧边栏)可翻译的愿望在 wagtail-localize 中不被支持。
    • 我以前用过Wagtail Modeltranslation。也许值得一看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多