| 1 | from django.utils.cache import patch_vary_headers |
|---|
| 2 | from django.utils import translation |
|---|
| 3 | from string import split |
|---|
| 4 | from django.conf import settings |
|---|
| 5 | import datetime |
|---|
| 6 | from django.http import HttpResponseNotFound |
|---|
| 7 | from django.template.loader import render_to_string |
|---|
| 8 | from django.template import RequestContext |
|---|
| 9 | |
|---|
| 10 | LANGUAGE_COOKIE_KEY = 'site_language' |
|---|
| 11 | |
|---|
| 12 | class LocaleMiddleware(object): |
|---|
| 13 | |
|---|
| 14 | def process_request(self, request): |
|---|
| 15 | # get language from URL |
|---|
| 16 | # split returns something like this: ['', 'ru', 'blog', ''] |
|---|
| 17 | language = split(request.path, '/')[1] |
|---|
| 18 | if language is not None and len(language) == 2: |
|---|
| 19 | if not self.is_language_exists(language): |
|---|
| 20 | translation.activate(settings.LANGUAGE_CODE) |
|---|
| 21 | request.LANGUAGE_CODE = translation.get_language() |
|---|
| 22 | return HttpResponseNotFound(render_to_string("404.html", RequestContext(request))) |
|---|
| 23 | # get language from cookies |
|---|
| 24 | if not translation.check_for_language(language): |
|---|
| 25 | if request.COOKIES.has_key(LANGUAGE_COOKIE_KEY): |
|---|
| 26 | language = request.COOKIES[LANGUAGE_COOKIE_KEY] |
|---|
| 27 | # get language from request |
|---|
| 28 | if not translation.check_for_language(language): |
|---|
| 29 | language = translation.get_language_from_request(request) |
|---|
| 30 | # get default language from settings |
|---|
| 31 | if not translation.check_for_language(language): |
|---|
| 32 | language = settings.LANGUAGE_CODE |
|---|
| 33 | translation.activate(language) |
|---|
| 34 | request.LANGUAGE_CODE = translation.get_language() |
|---|
| 35 | |
|---|
| 36 | def process_response(self, request, response): |
|---|
| 37 | patch_vary_headers(response, ('Accept-Language',)) |
|---|
| 38 | response['Content-Language'] = translation.get_language() |
|---|
| 39 | # set language cookie |
|---|
| 40 | max_age = 60 * 60 * 24 * 365 |
|---|
| 41 | expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=max_age), "%a, %d-%b-%Y %H:%M:%S GMT") |
|---|
| 42 | response.set_cookie(key = LANGUAGE_COOKIE_KEY, value = translation.get_language(), max_age = max_age, expires = expires) |
|---|
| 43 | return response |
|---|
| 44 | |
|---|
| 45 | def is_language_exists(self, language): |
|---|
| 46 | for l in settings.LANGUAGES: |
|---|
| 47 | if l[0] == language: |
|---|
| 48 | return True |
|---|
| 49 | return False |
|---|