60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
from types import SimpleNamespace
|
|
from django.contrib.sites.models import Site
|
|
from functools import reduce
|
|
|
|
from django.utils import translation
|
|
from django.utils.translation import gettext_lazy as _
|
|
from django.conf import settings
|
|
|
|
class TranslatedField:
|
|
def __init__(self, field):
|
|
self.en_field = field + "_en"
|
|
self.de_field = field + "_de"
|
|
self.it_field = field + "_it"
|
|
self.fr_field = field + "_fr"
|
|
|
|
def __get__(self, instance, owner):
|
|
lang = translation.get_language()
|
|
en = getattr(instance, self.en_field)
|
|
if lang == 'de':
|
|
return getattr(instance, self.de_field) or en
|
|
elif lang == 'it':
|
|
return getattr(instance, self.it_field) or en
|
|
elif lang == 'fr':
|
|
return getattr(instance, self.fr_field) or en
|
|
else:
|
|
return en
|
|
|
|
|
|
def removeprefix(self: str, prefix: str) -> str:
|
|
if self.startswith(prefix):
|
|
return self[len(prefix):]
|
|
else:
|
|
return self[:]
|
|
|
|
def get_page_url_without_locale(page):
|
|
LOCALES = ["en", "fr", "de", "it"]
|
|
url = page if isinstance(page, str) else page.get_url()
|
|
pathname: str = reduce(lambda acc, l: removeprefix(acc, f"/{l}/"), LOCALES, url)
|
|
pathname = pathname if pathname.startswith("/") else f"/{pathname}"
|
|
return pathname
|
|
|
|
|
|
def most_strict_site_match(page):
|
|
url = get_page_url_without_locale(page)
|
|
matches = [site for site in Site.objects.all() if url.startswith(site.domain)]
|
|
return max(matches or [SimpleNamespace(domain='/')], key=lambda m: len(m.domain))
|
|
|
|
def get_current_site(request_or_url):
|
|
request_path = getattr(request_or_url, "path", request_or_url)
|
|
path = get_page_url_without_locale(request_path)
|
|
path_parts = reduce(lambda acc, v: acc + [v] if v else acc, path.split("/"), [])
|
|
#FIXME: The following is just a workaround
|
|
try:
|
|
return Site.objects.get(domain=f"/{path_parts[0]}/")
|
|
except Site.DoesNotExist:
|
|
return Site.objects.get(domain='/')
|
|
|
|
def get_language_codes():
|
|
return list(dict(settings.LANGUAGES).keys())
|