You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wagtail自定义菜单多语言翻译问题:如何实现wagtail-localize同款翻译体验

解决方案

该需求可以直接实现,无需更换技术思路,你之前的实现只差3个关键配置步骤:

  • 子模型MenuItem也需要继承TranslatableMixin,保证菜单项内容可翻译
  • 将自定义菜单模型注册到wagtail-localize的可翻译模型列表,后台才会生成和页面一致的翻译操作入口
  • 模板标签查询菜单时增加当前激活语言的过滤逻辑,返回对应语言版本的菜单内容

1. 修正模型定义

from wagtail.models import TranslatableMixin, Locale

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保持和源语言一致,方便统一查询
    slug = AutoSlugField(populate_from="title", editable=True, unique_with=['locale'])

    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(TranslatableMixin, ClusterableModel, AbstractMenuItem):
    page = ParentalKey("Menu", related_name="menu_items")

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

2. 新增wagtail-localize可翻译模型注册

在项目根目录的wagtail_hooks.py文件中添加如下配置:

from wagtail.core import hooks
from wagtail_localize.hooks import register_translatable_model
from .models import Menu, MenuItem

@hooks.register('register_translatable_model')
def register_custom_translatable_models():
    return [Menu, MenuItem]

配置完成后重启服务,菜单管理后台就会出现和页面翻译一致的翻译操作入口。

3. 修正模板标签查询逻辑

from wagtail.models import Locale

@register.simple_tag()
def get_menu(slug, authenticated):
    # 先查询当前激活语言的对应菜单
    current_locale = Locale.get_active()
    try:
        menu = Menu.objects.get(slug=slug, locale=current_locale)
    except Menu.DoesNotExist:
        # 不存在时回退到默认语言版本
        menu = Menu.objects.get(slug=slug, locale=Locale.get_default())
    all_menu_items = menu.menu_items.all()
    menu_items = []
    for item in all_menu_items:
        if item.show(authenticated):
            menu_items.append(item)
    return {"logo": menu.logo, "image": menu.image, "items": menu_items}

注意原代码中authencicated是拼写错误,需要和模板调用时的request.user.is_authenticated参数保持一致。

其他说明

创建翻译版本的菜单时,保持slug和源语言版本一致即可,原有模板调用代码不需要修改。

内容的提问来源于stack exchange,提问作者Schmella

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:27:07