Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

274
Vistas
Menú traducible personalizado de Wagtail

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%}
over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda