pandora/pandora/translation/models.py

140 lines
4.7 KiB
Python
Raw Normal View History

import hashlib
from django.conf import settings
from django.core.cache import cache
from django.db import models
import django.utils.translation
from django.utils import timezone
import ox
from . import managers
def get_cache_key(key, lang):
return '%s-%s' % (hashlib.sha1(key.encode()).hexdigest(), lang)
def load_itemkey_translations():
from annotation.models import Annotation
2018-12-17 10:59:24 +00:00
from item.models import Item
from django.db.models import QuerySet
2018-12-17 10:59:24 +00:00
used_keys = set()
for layer in settings.CONFIG['layers']:
if layer.get('translate'):
qs = Annotation.objects.filter(layer=layer['id'])
query = qs.query
query.group_by = ['value']
for value in QuerySet(query=query, model=Annotation).values_list('value', flat=True):
for lang in settings.CONFIG['languages']:
if lang == settings.CONFIG['language']:
continue
2018-12-17 10:59:24 +00:00
used_keys.add(value)
t, _ = Translation.objects.get_or_create(lang=lang, key=value, defaults={
'type': Translation.CONTENT
})
translated_keys = []
for key in settings.CONFIG['itemKeys']:
if key.get('translate'):
translated_keys.append(key['id'])
if translated_keys:
for item in Item.objects.all():
for key in translated_keys:
values = item.get(key)
if isinstance(values, str):
values = [values]
if values:
for value in values:
for lang in settings.CONFIG['languages']:
if lang == settings.CONFIG['language']:
continue
used_keys.add(value)
t, _ = Translation.objects.get_or_create(lang=lang, key=value, defaults={
'type': Translation.CONTENT
})
Translation.objects.filter(type=Translation.CONTENT).exclude(key__in=used_keys).delete()
def load_translations():
import os
import json
from glob import glob
locale = {}
for file in glob('%s/json/locale.??.json' % settings.STATIC_ROOT):
lang = file.split('.')[-2]
if lang not in locale:
locale[lang] = {}
with open(os.path.join(file)) as fd:
locale[lang].update(json.load(fd))
for lang, locale in locale.items():
used_keys = []
if lang in settings.CONFIG['languages']:
for key, value in locale.items():
used_keys.append(key)
t, created = Translation.objects.get_or_create(lang=lang, key=key)
if created:
t.type = Translation.UI
t.value = value
t.save()
Translation.objects.filter(type=Translation.UI, lang=lang).exclude(key__in=used_keys).delete()
class Translation(models.Model):
CONTENT = 1
UI = 2
created = models.DateTimeField(auto_now_add=True, editable=False)
modified = models.DateTimeField(default=timezone.now, editable=False)
type = models.IntegerField('type', default=0)
lang = models.CharField('language', max_length=8)
key = models.CharField('key', max_length=4096)
value = models.CharField('translation', max_length=4096, null=True, blank=True, default=None)
objects = managers.TranslationManager()
class Meta:
unique_together = ('key', 'lang')
def __str__(self):
return '%s->%s [%s]' % (self.key, self.value, self.lang)
def json(self, keys=None, user=None):
data = {
'id': ox.toAZ(self.id)
}
for key in ('key', 'lang', 'value'):
data[key] = getattr(self, key)
return data
@classmethod
def get_translations(cls, key):
return list(cls.objects.filter(key=key).order_by('-lang').values_list('lang', flat=True))
@classmethod
def get_translation(cls, key, lang):
cache_key = get_cache_key(key, lang)
data = cache.get(cache_key)
if not data:
trans = None
for translation in cls.objects.filter(key=key, lang=lang):
trans = translation.get_value()
break
if trans is None:
cls.needs_translation(key)
trans = key
cache.set(cache_key, trans, 5*60)
return trans
return data
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
cache.delete(get_cache_key(self.key, self.lang))
def get_value(self):
if self.value:
return self.value
return self.key