middleware.py 1.95 KB
Newer Older
1
"""
2
Middleware for Language Preferences
3 4
"""

asadiqbal committed
5
from openedx.core.djangoapps.user_api.preferences.api import get_user_preference, delete_user_preference
6
from lang_pref import LANGUAGE_KEY
7
from django.utils.translation import LANGUAGE_SESSION_KEY
8 9
from django.utils.translation.trans_real import parse_accept_lang_header
from lang_pref.api import released_languages
10 11


12
class LanguagePreferenceMiddleware(object):
13 14 15 16 17 18 19 20 21
    """
    Middleware for user preferences.

    Ensures that, once set, a user's preferences are reflected in the page
    whenever they are logged in.
    """

    def process_request(self, request):
        """
22
        If a user's UserPreference contains a language preference, use the user's preference.
23
        """
asadiqbal committed
24 25 26
        languages = released_languages()
        system_released_languages = [seq[0] for seq in languages]

27 28 29
        # If the user is logged in, check for their language preference
        if request.user.is_authenticated():
            # Get the user's language preference
30
            user_pref = get_user_preference(request.user, LANGUAGE_KEY)
31
            # Set it to the LANGUAGE_SESSION_KEY (Django-specific session setting governing language pref)
32
            if user_pref:
asadiqbal committed
33 34 35 36 37 38 39 40 41 42 43 44 45 46
                if user_pref in system_released_languages:
                    request.session[LANGUAGE_SESSION_KEY] = user_pref
                else:
                    delete_user_preference(request.user, LANGUAGE_KEY)
        else:
            preferred_language = request.META.get('HTTP_ACCEPT_LANGUAGE', '')
            lang_headers = [seq[0] for seq in parse_accept_lang_header(preferred_language)]

            # Setting the session language to the browser language, if it is supported.
            for browser_lang in lang_headers:
                if browser_lang in system_released_languages:
                    if request.session.get(LANGUAGE_SESSION_KEY, None) is None:
                        request.session[LANGUAGE_SESSION_KEY] = unicode(browser_lang)
                    break