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
相关产品推荐
相关产品推荐

