from django.conf import settings from django.http import Http404, HttpResponsePermanentRedirect from django.utils import translation from django.utils.cache import patch_vary_headers class RedirectLanguage(Exception): pass class LocaleURLMiddleware: def get_language_from_request(self, request): supported = dict(settings.LANGUAGES) lang = settings.LANGUAGE_CODE[:2] check = re.match(r"^/(\w\w)/.*", request.path) changed = False redir = False if check is not None: url_list = request.path.split('/') t = check.group(1) if t in url_list and url_list.index(t) == 1: del url_list[1] request.path = u'/'.join(url_list) if t in supported: lang = t if hasattr(request, 'session'): request.session['django_language'] = lang else: response.set_cookie('django_language', lang) changed = True else: redir = True if not changed: if hasattr(request, 'session'): lang = request.session.get('django_language', None) if lang in supported and lang is not None: return lang, redir else: lang = request.COOKIES.get('django_language', None) if lang in supported and lang is not None: return lang, redir return lang, redir def process_request(self, request): language, redir = self.get_language_from_request(request) if language is None: language = settings.LANGUAGE_CODE[:2] translation.activate(language) request.LANGUAGE_CODE = translation.get_language() if redir: redir_url = '/%s%s' % (language, request.path) return HttpResponsePermanentRedirect(redir_url) def process_response(self, request, response): patch_vary_headers(response, ('Accept-Language',)) translation.deactivate() return response