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 |