Skip to content
This repository has been archived by the owner on Mar 15, 2018. It is now read-only.

Commit

Permalink
let user's "Accept-Language" header take precedence over cookie for r…
Browse files Browse the repository at this point in the history
…egional stores (bug 773498)
  • Loading branch information
cvan committed Jul 13, 2012
1 parent df3bbfd commit cd9a9e3
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 11 deletions.
26 changes: 15 additions & 11 deletions mkt/site/middleware.py
Expand Up @@ -97,10 +97,10 @@ def process_request(self, request):
if remembered in settings.LANGUAGE_URL_MAP:
request.LANG = settings.LANGUAGE_URL_MAP[remembered]

if 'lang' in request.GET or not remembered:
language = Prefixer(request).get_language()
if language:
request.LANG = language
user_defined = Prefixer(request).get_language()
if ('lang' in request.GET or not remembered or
user_defined != settings.LANGUAGE_CODE):
request.LANG = user_defined

if not remembered or remembered != request.LANG:
request.set_cookie('lang', request.LANG)
Expand All @@ -120,17 +120,21 @@ def process_request(self, request):
regions = mkt.regions.REGIONS_DICT
request.REGION = mkt.regions.WORLDWIDE

# This gives us something like: [('en-us', 1.0), ('fr', 0.5)]
header = request.META.get('HTTP_ACCEPT_LANGUAGE', '')
accept_lang = parse_accept_lang_header(header.lower())
if accept_lang:
user_defined = accept_lang[0][0]
else:
user_defined = settings.LANGUAGE_CODE

remembered = request.COOKIES.get('region')
if not remembered:
if not remembered or user_defined != settings.LANGUAGE_CODE:
# TODO: Do geolocation magic.

# This gives us something like: [('en-us', 1.0), ('fr', 0.5)]
header = request.META.get('HTTP_ACCEPT_LANGUAGE', '')
accept_lang = parse_accept_lang_header(header.lower())

# If our locale is `en-US`, then exclude the Worldwide region.
if (request.LANG == settings.LANGUAGE_CODE and accept_lang and
accept_lang[0][0] == request.LANG.lower()):
if (request.LANG == settings.LANGUAGE_CODE and
user_defined == request.LANG.lower()):
choices = mkt.regions.REGIONS_CHOICES[1:]
else:
choices = mkt.regions.REGIONS_CHOICES
Expand Down
18 changes: 18 additions & 0 deletions mkt/site/tests/test_middleware.py
Expand Up @@ -136,6 +136,15 @@ def test_accept_language(self):

self.client.cookies.clear()

def test_accept_language_takes_precedence_over_cookie(self):
r = self.client.get('/')
eq_(r.cookies['lang'].value, settings.LANGUAGE_CODE)

# Even though you remembered my previous language, I've since
# changed it in my browser, so let's respect that.
r = self.client.get('/', HTTP_ACCEPT_LANGUAGE='fr')
eq_(r.cookies['lang'].value, 'fr')


class TestRegionMiddleware(MiddlewareCase):

Expand Down Expand Up @@ -210,6 +219,15 @@ def test_accept_language(self):
eq_(got, expected,
'For %r: expected %r but got %r' % (locale, expected, got))

def test_accept_language_takes_precedence_over_cookie(self):
r = self.client.get('/')
eq_(r.cookies['region'].value, 'worldwide')

# Even though you remembered my previous language, I've since
# changed it in my browser, so let's respect that.
r = self.client.get('/', HTTP_ACCEPT_LANGUAGE='pt-br')
eq_(r.cookies['region'].value, 'brazil')


class TestVaryMiddleware(MiddlewareCase):

Expand Down

0 comments on commit cd9a9e3

Please sign in to comment.