summaryrefslogtreecommitdiff
path: root/overload_translation/utils.py
blob: 1b7c04cdd3ed7cba176e4351f568929b7ccc7943 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
from django.conf import settings
from django.core.cache import cache
from django.db.utils import DatabaseError
from django.utils.functional import lazy
from django.utils.translation import ugettext as _, pgettext as _p, get_language

import hashlib

from overload_translation import models


NO_VALUE = "<<no-value>>"


def simple_trans(message, context):
    if context:
        s = _p(context, message)
    else:
        s = _(message)
    if not settings.TRANSLATION_OVERLOAD_DEBUG:
        return s
    s += " - message:\"{}\"".format(
        message.replace("{", "OPEN-BRACES").replace("}", "CLOSE-BRACES"))
    if context:
        s += " - context:\"{}\"".format(context)
    return s


def ugettext(message, context=""):
    has_translation_key = "{}-has-dynamic-translation".format(
        settings.PROJECT_SLUG)
    has_translations = cache.get(has_translation_key)
    if has_translations is False:
        return simple_trans(message, context)
    elif has_translations is None:
        if models.TranslationOverload.objects.count():
            cache.set(has_translation_key, True, settings.CACHE_TIMEOUT)
        else:
            cache.set(has_translation_key, False, settings.CACHE_TIMEOUT)
            return simple_trans(message, context)
    current_language = get_language()
    if not current_language:
        return simple_trans(message, context)
    current_context = current_language
    if context:
        current_context += "-" + context
    key = "{}-translation-{}-{}".format(settings.PROJECT_SLUG,
                                        current_context, message)

    m = hashlib.md5()
    m.update(key.encode('utf-8'))
    key = m.hexdigest()
    value = cache.get(key)
    if value == NO_VALUE:
        return simple_trans(message, context)
    elif value:
        return value
    try:
        q = models.TranslationOverload.objects.filter(
            lang=current_language, message=message, context=context)
        nb = q.count()
    except DatabaseError:
        cache.set(key, NO_VALUE, settings.CACHE_TIMEOUT)
        return simple_trans(message, context)
    if not nb:
        cache.set(key, NO_VALUE, settings.CACHE_TIMEOUT)
        return simple_trans(message, context)
    value = q.values_list("translation", flat=True).all()[0]
    cache.set(key, value, settings.CACHE_TIMEOUT)
    return value


ugettext_lazy = lazy(ugettext, str)


def pgettext(context, message):
    return ugettext(message, context=context)


pgettext_lazy = lazy(pgettext, str)