Soy nuevo en wagtail y estoy trabajando con un menú personalizado. Configuré una clase de menú personalizada y uso una etiqueta para mostrar los elementos del menú en las plantillas. Esto funciona bien, sin embargo, necesitaría crear diferentes menús según el idioma en el que se use mi sitio. (Sé que existe wagtailmenus, sin embargo, tampoco pude encontrar una manera satisfactoria de crear menús traducidos allí)
Quería crear una experiencia de traducción similar a la que hace wagtail-localize con las páginas. ¿Es esto posible o tengo que tomar un enfoque diferente?
Ya traté de usar wagtails TranslatableMixin para simplemente crear duplicados de mi menú con diferentes traducciones, sin embargo, esto no parece funcionar, porque falta la opción de traducción (como se hace con las páginas).
Clases:
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"Etiquetas de plantilla:
@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}modelo:
{% get_menu "main-menu" request.user.is_authenticated as menu%}Aquí hay formas de abordar esto "manualmente" sin paquetes adicionales. En primer lugar, compruebe dos veces su configuración .
Por un lado, puede agregar un título traducido a los modelos de página que está enumerando en estos menús. Llámalo title_en , por ejemplo.
Por otro lado, podría agregar estos campos directamente a su clase 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"En la plantilla puede identificar el idioma actual y elegir el menú en consecuencia. Esto también funciona a través de una etiqueta de plantilla (pasando el código de idioma u obteniendo el código de idioma dentro de la etiqueta de plantilla).
{% 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 %}También puede obtener el código de idioma actual en su 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: ...Podría usar una etiqueta de plantilla personalizada adicional para traducir los elementos del menú si la estructura del menú es idéntica:
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