summaryrefslogtreecommitdiff
path: root/overload_translation/utils.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2019-11-15 20:49:27 +0100
committerÉtienne Loks <etienne.loks@iggdrasil.net>2019-11-15 20:51:05 +0100
commit9f7f656da88d8770ac79ad69b9cfaf0b26733b76 (patch)
tree7b615b92d6e3161473184f7f55450148e6e5df99 /overload_translation/utils.py
parent18469769e8fd2bf008c88faae4fc7592d265c446 (diff)
downloadIshtar-9f7f656da88d8770ac79ad69b9cfaf0b26733b76.tar.bz2
Ishtar-9f7f656da88d8770ac79ad69b9cfaf0b26733b76.zip
Overload translation in database
Diffstat (limited to 'overload_translation/utils.py')
-rw-r--r--overload_translation/utils.py80
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