1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
from django.conf import settings
from django.core.cache import cache
from django.db import connection
from django.db.utils import DatabaseError
from django.utils.functional import lazy
from django.utils.translation import gettext as _, pgettext as _p, get_language
import hashlib
from overload_translation import models
NO_VALUE = "<<no-value>>"
def check_db_is_init():
"""
Not yet initialized for first migrations
"""
with connection.cursor() as cursor:
sql = """SELECT EXISTS (
SELECT 1 FROM information_schema.tables
WHERE table_name = 'overload_translation_translationoverload');"""
cursor.execute(sql)
res = cursor.fetchall()
return res and res[0][0]
def check_has_translations():
if not check_db_is_init():
return False
try:
nb = models.TranslationOverload.objects.count()
except DatabaseError:
return False
has_translation_key = "{}-has-dynamic-translation".format(
settings.PROJECT_SLUG)
if not nb:
cache.set(has_translation_key, False, settings.CACHE_TIMEOUT)
return False
cache.set(has_translation_key, True, settings.CACHE_TIMEOUT)
return True
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 gettext(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 not check_has_translations():
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
gettext_lazy = lazy(gettext, str)
def pgettext(context, message):
return gettext(message, context=context)
pgettext_lazy = lazy(pgettext, str)
|