56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
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)
|