def test_newsletter_languages(self): # newsletter_languages() returns the set of languages # of the newsletters # (Note that newsletter_languages() is not part of the external # API, but is used internally) models.Newsletter.objects.create( slug='slug', title='title', active=False, languages='en-US', vendor_id='VENDOR1', ) models.Newsletter.objects.create( slug='slug2', title='title', active=False, languages='fr, de ', vendor_id='VENDOR2', ) models.Newsletter.objects.create( slug='slug3', title='title', active=False, languages='en-US, fr', vendor_id='VENDOR3', ) expect = set(['en-US', 'fr', 'de']) self.assertEqual(expect, newsletter_languages())
def get_accept_languages(header_value): """ Parse the user's Accept-Language HTTP header and return a list of languages """ # adapted from bedrock: http://j.mp/1o3pWo5 languages = [] pattern = re.compile(r'^([A-Za-z]{2,3})(?:-([A-Za-z]{2})(?:-[A-Za-z0-9]+)?)?$') # bug 1102652 header_value = header_value.replace('_', '-') try: parsed = parse_accept_lang_header(header_value) except ValueError: # see https://code.djangoproject.com/ticket/21078 return languages for lang, priority in parsed: m = pattern.match(lang) if not m: continue lang = m.group(1).lower() # Check if the shorter code is supported. This covers obsolete long # codes like fr-FR (should match fr) or ja-JP (should match ja) if m.group(2) and lang not in newsletter_languages(): lang += '-' + m.group(2).upper() if lang not in languages: languages.append(lang) return languages
def get_accept_languages(header_value): """ Parse the user's Accept-Language HTTP header and return a list of languages """ # adapted from bedrock: http://j.mp/1o3pWo5 languages = [] pattern = re.compile( r'^([A-Za-z]{2,3})(?:-([A-Za-z]{2})(?:-[A-Za-z0-9]+)?)?$') # bug 1102652 header_value = header_value.replace('_', '-') try: parsed = parse_accept_lang_header(header_value) except ValueError: # see https://code.djangoproject.com/ticket/21078 return languages for lang, priority in parsed: m = pattern.match(lang) if not m: continue lang = m.group(1).lower() # Check if the shorter code is supported. This covers obsolete long # codes like fr-FR (should match fr) or ja-JP (should match ja) if m.group(2) and lang not in newsletter_languages(): lang += '-' + m.group(2).upper() if lang not in languages: languages.append(lang) return languages
def test_newsletter_languages(self): # newsletter_languages() returns the set of languages # of the newsletters # (Note that newsletter_languages() is not part of the external # API, but is used internally) models.Newsletter.objects.create( slug="slug", title="title", active=False, languages="en-US", vendor_id="VENDOR1" ) models.Newsletter.objects.create( slug="slug2", title="title", active=False, languages="fr, de ", vendor_id="VENDOR2" ) models.Newsletter.objects.create( slug="slug3", title="title", active=False, languages="en-US, fr", vendor_id="VENDOR3" ) expect = set(["en-US", "fr", "de"]) self.assertEqual(expect, newsletter_languages())
def get_best_language(languages): """ Return the best language for use with our newsletters. If none match, return first in list. @param languages: list of language codes. @return: a single language code """ if not languages: return None # try again with 2 letter languages languages_2l = [lang[:2] for lang in languages] supported_langs = newsletter_languages() for lang in chain(languages, languages_2l): if lang in supported_langs: return lang return languages[0]