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