-
-
Save vstoykov/1366794 to your computer and use it in GitHub Desktop.
try: | |
from django.utils.deprecation import MiddlewareMixin | |
except ImportError: | |
MiddlewareMixin = object | |
class ForceDefaultLanguageMiddleware(MiddlewareMixin): | |
""" | |
Ignore Accept-Language HTTP headers | |
This will force the I18N machinery to always choose settings.LANGUAGE_CODE | |
as the default initial language, unless another one is set via sessions or cookies | |
Should be installed *before* any middleware that checks request.META['HTTP_ACCEPT_LANGUAGE'], | |
namely django.middleware.locale.LocaleMiddleware | |
""" | |
def process_request(self, request): | |
if 'HTTP_ACCEPT_LANGUAGE' in request.META: | |
del request.META['HTTP_ACCEPT_LANGUAGE'] |
Thanks!!!
Thanks ;)
boom...just saved me a couple hours :)
nice one! For Django 1.10 (and Python 3) its now:
def force_default_language_middleware(get_response):
"""
Ignore Accept-Language HTTP headers
This will force the I18N machinery to always choose settings.LANGUAGE_CODE
as the default initial language, unless another one is set via sessions or cookies
Should be installed *before* any middleware that checks request.META['HTTP_ACCEPT_LANGUAGE'],
namely django.middleware.locale.LocaleMiddleware
"""
# One-time configuration and initialization.
def middleware(request):
# Code to be executed for each request before
# the view (and later middleware) are called.
if 'HTTP_ACCEPT_LANGUAGE' in request.META:
del request.META['HTTP_ACCEPT_LANGUAGE']
response = get_response(request)
# Code to be executed for each request/response after
# the view is called.
return response
return middleware
Whoa... Thanks a lot guys! Beyond 2017))
Great, thanks!
Thanks, man!! ^^
Great! Thanks a lot!
I found this page on stack overflow. I was wondering why it is not the answer on top.
thanks for this! wandering around for an answer for almost a week! this saved the day!
Thanks. I added this middleware before any other middleware that is using language code and it works now.
Yet another version:
from contextlib import suppress
from django.conf import settings
def inject_accept_language(get_response):
"""
Ignore Accept-Language HTTP headers.
This will force the I18N machinery to always choose
- Ukrainian for the main site
- ADMIN_LANGUAGE_CODE for the admin site
as the default initial language unless another one is set via
sessions or cookies.
Should be installed *before* any middleware that checks
request.META['HTTP_ACCEPT_LANGUAGE'], namely
`django.middleware.locale.LocaleMiddleware`.
"""
admin_lang = getattr(settings, 'ADMIN_LANGUAGE_CODE',
settings.LANGUAGE_CODE)
def middleware(request):
# Force Ukrainian locale for the main site
lang = admin_lang if request.path.startswith('/admin') else 'uk'
accept = request.META.get('HTTP_ACCEPT_LANGUAGE', []).split(',')
with suppress(ValueError):
# Remove `lang` from the HTTP_ACCEPT_LANGUAGE to avoid duplicates
accept.remove(lang)
accept = [lang] + accept
request.META['HTTP_ACCEPT_LANGUAGE'] = f"""{','.join(accept)}"""
return get_response(request)
return middleware
Yet another version:
from contextlib import suppress from django.conf import settings def inject_accept_language(get_response): """ Ignore Accept-Language HTTP headers. This will force the I18N machinery to always choose - Ukrainian for the main site - ADMIN_LANGUAGE_CODE for the admin site as the default initial language unless another one is set via sessions or cookies. Should be installed *before* any middleware that checks request.META['HTTP_ACCEPT_LANGUAGE'], namely `django.middleware.locale.LocaleMiddleware`. """ admin_lang = getattr(settings, 'ADMIN_LANGUAGE_CODE', settings.LANGUAGE_CODE) def middleware(request): # Force Ukrainian locale for the main site lang = admin_lang if request.path.startswith('/admin') else 'uk' accept = request.META.get('HTTP_ACCEPT_LANGUAGE', []).split(',') with suppress(ValueError): # Remove `lang` from the HTTP_ACCEPT_LANGUAGE to avoid duplicates accept.remove(lang) accept = [lang] + accept request.META['HTTP_ACCEPT_LANGUAGE'] = f"""{','.join(accept)}""" return get_response(request) return middleware
Thank you for this version. But it has issue
accept = request.META.get('HTTP_ACCEPT_LANGUAGE', []).split(',')
It will crash with error 'list' object has no attribute 'split'. I think it should be instead
accept = request.META.get('HTTP_ACCEPT_LANGUAGE', "").split(',')
@dismine Yes, you're right! 👍
Thank You so much @vstoykov!
thanks, saved my day
Thanks everybody involved!
thxAlot - you great sorcerer ;)