1# -*- coding: utf-8 -*-
2
3from babel import Locale, UnknownLocaleError
4from django.utils.translation import get_language
5from threading import local
6
7try:
8    from django.utils.deprecation import MiddlewareMixin
9except ImportError:
10    # Not required for Django <= 1.9, see:
11    # https://docs.djangoproject.com/en/1.10/topics/http/middleware/#upgrading-pre-django-1-10-style-middleware
12    MiddlewareMixin = object
13
14
15__all__ = ['get_current_locale', 'LocaleMiddleware']
16
17_thread_locals = local()
18
19
20def get_current_locale():
21    """Get current locale data outside views.
22
23    See http://babel.pocoo.org/en/stable/api/core.html#babel.core.Locale
24    for Locale objects documentation
25    """
26    return getattr(_thread_locals, 'locale', None)
27
28
29class LocaleMiddleware(MiddlewareMixin):
30
31    """Simple Django middleware that makes available a Babel `Locale` object
32    via the `request.locale` attribute.
33    """
34
35    def process_request(self, request):
36        try:
37            code = getattr(request, 'LANGUAGE_CODE', get_language())
38            locale = Locale.parse(code, sep='-')
39        except (ValueError, UnknownLocaleError):
40            pass
41        else:
42            _thread_locals.locale = request.locale = locale
43