1
|
|
|
""" |
2
|
|
|
Internal DRY functions. |
3
|
|
|
""" |
4
|
|
|
from django.conf import settings |
5
|
|
|
from parler import appsettings |
6
|
|
|
from parler.utils import normalize_language_code, is_multilingual_project, get_language_title |
7
|
|
|
|
8
|
|
|
|
9
|
|
|
def get_language_parameter(request, query_language_key='language', object=None, default=None): |
10
|
|
|
""" |
11
|
|
|
Get the language parameter from the current request. |
12
|
|
|
""" |
13
|
|
|
# This is the same logic as the django-admin uses. |
14
|
|
|
# The only difference is the origin of the request parameter. |
15
|
|
|
if not is_multilingual_project(): |
16
|
|
|
# By default, the objects are stored in a single static language. |
17
|
|
|
# This makes the transition to multilingual easier as well. |
18
|
|
|
# The default language can operate as fallback language too. |
19
|
|
|
return default or appsettings.PARLER_LANGUAGES.get_default_language() |
20
|
|
|
else: |
21
|
|
|
# In multilingual mode, take the provided language of the request. |
22
|
|
|
code = request.GET.get(query_language_key) |
23
|
|
|
|
24
|
|
|
if not code: |
25
|
|
|
# forms: show first tab by default |
26
|
|
|
code = default or appsettings.PARLER_LANGUAGES.get_first_language() |
27
|
|
|
|
28
|
|
|
return normalize_language_code(code) |
29
|
|
|
|
30
|
|
|
|
31
|
|
|
def get_language_tabs(request, current_language, available_languages, css_class=None): |
32
|
|
|
""" |
33
|
|
|
Determine the language tabs to show. |
34
|
|
|
""" |
35
|
|
|
tabs = TabsList(css_class=css_class) |
36
|
|
|
get = request.GET.copy() # QueryDict object |
37
|
|
|
tab_languages = [] |
38
|
|
|
|
39
|
|
|
site_id = getattr(settings, 'SITE_ID', None) |
40
|
|
|
for lang_dict in appsettings.PARLER_LANGUAGES.get(site_id, ()): |
41
|
|
|
code = lang_dict['code'] |
42
|
|
|
title = get_language_title(code) |
43
|
|
|
get['language'] = code |
44
|
|
|
url = '?{0}'.format(get.urlencode()) |
45
|
|
|
|
46
|
|
|
if code == current_language: |
47
|
|
|
status = 'current' |
48
|
|
|
elif code in available_languages: |
49
|
|
|
status = 'available' |
50
|
|
|
else: |
51
|
|
|
status = 'empty' |
52
|
|
|
|
53
|
|
|
tabs.append((url, title, code, status)) |
54
|
|
|
tab_languages.append(code) |
55
|
|
|
|
56
|
|
|
# Additional stale translations in the database? |
57
|
|
|
if appsettings.PARLER_SHOW_EXCLUDED_LANGUAGE_TABS: |
58
|
|
|
for code in available_languages: |
59
|
|
|
if code not in tab_languages: |
60
|
|
|
get['language'] = code |
61
|
|
|
url = '?{0}'.format(get.urlencode()) |
62
|
|
|
|
63
|
|
|
if code == current_language: |
64
|
|
|
status = 'current' |
65
|
|
|
else: |
66
|
|
|
status = 'available' |
67
|
|
|
|
68
|
|
|
tabs.append((url, get_language_title(code), code, status)) |
69
|
|
|
|
70
|
|
|
tabs.current_is_translated = current_language in available_languages |
71
|
|
|
tabs.allow_deletion = len(available_languages) > 1 |
72
|
|
|
return tabs |
73
|
|
|
|
74
|
|
|
|
75
|
|
|
class TabsList(list): |
76
|
|
|
|
77
|
|
|
def __init__(self, seq=(), css_class=None): |
78
|
|
|
self.css_class = css_class |
79
|
|
|
self.current_is_translated = False |
80
|
|
|
self.allow_deletion = False |
81
|
|
|
super(TabsList, self).__init__(seq) |
82
|
|
|
|