我是鹡鸰新手,我正在使用自定义菜单。我设置了一个自定义菜单类并使用标签来显示模板中的菜单项。 这工作正常,但是我需要根据我的网站使用的语言创建不同的菜单。(我知道 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%}
以下是无需额外软件包即可“手动”处理此问题的方法。首先请仔细检查您的配置。
一方面,您可以将翻译后的标题添加到您在这些菜单中列出的页面模型中。例如,称之为
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 modeltransaction 不适用于仅片段页面模型。 Wagtail with Codered Crx 的导航栏几乎是完美的……但有一个大问题。 LayouSetting 使用导航栏的一个实例...那么我们如何才能实现多语言...?
TranslatableMixin 是一个提供帮助的方向...但我们仍然有与 Navbar 模型相关的 LayoutSettings。
奇怪的是,还没有人解决这个问题(页脚菜单)。