from django.utils.translation import get_language_info from django.utils.translation import gettext_lazy as _ from django.utils.translation import activate as activate_lang from django.utils.translation import get_language from django.template.response import TemplateResponse from django.utils.safestring import mark_safe from django.urls import reverse, resolve from django.shortcuts import render from navbar.models import Element from django.conf import settings from django import template import re register = template.Library() path_re = re.compile("^(/[a-z]+)/(.*)") def get_lang_name(lang_code): li = get_language_info(lang_code) return li["name_local"] def get_lang_data(path_info, lang_code, curr_lang): lang_name = get_lang_name(lang_code) rm = resolve(path_info) activate_lang(lang_code) if path_info == "/": lang_url = f"/{lang_code}/" else: lang_url = reverse( rm.view_name, current_app="npb", args=rm.args, kwargs=rm.kwargs ) activate_lang(curr_lang) return (lang_code, lang_name, lang_url) def get_base_context(lang, url): return { "user": None, "current_url": url, "elems": Element.objects.filter(parent=None).order_by("weight"), "current_lang_code": lang, "current_lang_name": get_lang_name(lang), "all_langs": [get_lang_data(url, l[0], lang) for l in settings.LANGUAGES], } @register.simple_tag(takes_context=True) def navbar(context): request = context["request"] curr_lang = get_language() ctx = get_base_context(curr_lang, request.path_info) ctx["user"] = request.user tpl = TemplateResponse(request, "navbar/navbar.html", context=ctx).render() return mark_safe(tpl.rendered_content)