diff options
Diffstat (limited to 'overload_translation/utils.py')
| -rw-r--r-- | overload_translation/utils.py | 80 | 
1 files changed, 80 insertions, 0 deletions
diff --git a/overload_translation/utils.py b/overload_translation/utils.py new file mode 100644 index 000000000..1b7c04cdd --- /dev/null +++ b/overload_translation/utils.py @@ -0,0 +1,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)
\ No newline at end of file  | 
