From 9f7f656da88d8770ac79ad69b9cfaf0b26733b76 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Fri, 15 Nov 2019 20:49:27 +0100 Subject: Overload translation in database --- overload_translation/utils.py | 80 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 overload_translation/utils.py (limited to 'overload_translation/utils.py') 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 = "<>" + + +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 -- cgit v1.2.3