diff options
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 |
commit | 9f7f656da88d8770ac79ad69b9cfaf0b26733b76 (patch) | |
tree | 7b615b92d6e3161473184f7f55450148e6e5df99 /overload_translation | |
parent | 18469769e8fd2bf008c88faae4fc7592d265c446 (diff) | |
download | Ishtar-9f7f656da88d8770ac79ad69b9cfaf0b26733b76.tar.bz2 Ishtar-9f7f656da88d8770ac79ad69b9cfaf0b26733b76.zip |
Overload translation in database
Diffstat (limited to 'overload_translation')
-rw-r--r-- | overload_translation/__init__.py | 1 | ||||
-rw-r--r-- | overload_translation/admin.py | 13 | ||||
-rw-r--r-- | overload_translation/migrations/0001_initial.py | 34 | ||||
-rw-r--r-- | overload_translation/migrations/__init__.py | 0 | ||||
-rw-r--r-- | overload_translation/models.py | 17 | ||||
-rw-r--r-- | overload_translation/utils.py | 80 |
6 files changed, 145 insertions, 0 deletions
diff --git a/overload_translation/__init__.py b/overload_translation/__init__.py new file mode 100644 index 000000000..e9e41546e --- /dev/null +++ b/overload_translation/__init__.py @@ -0,0 +1 @@ +default_app_config = 'ishtar_common.apps.TranslationOverloadConfig' diff --git a/overload_translation/admin.py b/overload_translation/admin.py new file mode 100644 index 000000000..85f7543cd --- /dev/null +++ b/overload_translation/admin.py @@ -0,0 +1,13 @@ +from django.contrib import admin + +from overload_translation import models +from ishtar_common.apps import admin_site + + +class TranslationOverloadAdmin(admin.ModelAdmin): + list_display = ("message", "context", "lang", "translation") + list_filter = ("lang",) + search_fields = ("message", "context") + + +admin_site.register(models.TranslationOverload, TranslationOverloadAdmin) diff --git a/overload_translation/migrations/0001_initial.py b/overload_translation/migrations/0001_initial.py new file mode 100644 index 000000000..33e2732ad --- /dev/null +++ b/overload_translation/migrations/0001_initial.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.18 on 2019-11-15 17:48 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='TranslationOverload', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('message', models.TextField(verbose_name='String')), + ('context', models.CharField(blank=True, default='', max_length=256, verbose_name='Translation context')), + ('translation', models.TextField(verbose_name='Translation')), + ('lang', models.CharField(choices=[('fr', 'Français'), ('en', 'English')], max_length=4, verbose_name='Language')), + ], + options={ + 'verbose_name_plural': 'Translations overload', + 'verbose_name': 'Translation overload', + }, + ), + migrations.AlterUniqueTogether( + name='translationoverload', + unique_together=set([('message', 'lang', 'context')]), + ), + ] diff --git a/overload_translation/migrations/__init__.py b/overload_translation/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/overload_translation/migrations/__init__.py diff --git a/overload_translation/models.py b/overload_translation/models.py new file mode 100644 index 000000000..723c22836 --- /dev/null +++ b/overload_translation/models.py @@ -0,0 +1,17 @@ +from django.conf import settings +from django.db import models +from django.utils.translation import ugettext_lazy as _ + + +class TranslationOverload(models.Model): + message = models.TextField(_("String")) + context = models.CharField(_("Translation context"), max_length=256, + default="", blank=True) + translation = models.TextField(_("Translation")) + lang = models.CharField(_("Language"), choices=settings.LANGUAGES, + max_length=4) + + class Meta: + verbose_name = _("Translation overload") + verbose_name_plural = _("Translations overload") + unique_together = ("message", "lang", "context") 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 |