Commit 76d26d89 authored by Michal Čihař's avatar Michal Čihař Committed by Tim Graham
Browse files

Fixed #24063 -- Allowed locale variants supported by gettext.

The locale code can contain a variant after @, so allowed that.
parent 9d6914da
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -43,9 +43,12 @@ accept_language_re = re.compile(r'''
        (?:\s*,\s*|$)                                 # Multiple accepts per header.
        ''', re.VERBOSE)

language_code_re = re.compile(r'^[a-z]{1,8}(?:-[a-z0-9]{1,8})*$', re.IGNORECASE)
language_code_re = re.compile(
    r'^[a-z]{1,8}(?:-[a-z0-9]{1,8})*(?:@[a-z0-9]{1,20})?$',
    re.IGNORECASE
)

language_code_prefix_re = re.compile(r'^/([\w-]+)(/|$)')
language_code_prefix_re = re.compile(r'^/([\w@-]+)(/|$)')


@receiver(setting_changed)
+4 −0
Original line number Diff line number Diff line
@@ -162,6 +162,10 @@ Internationalization
* The :func:`django.utils.timezone.make_aware` function gained an ``is_dst``
  argument to help resolve ambiguous times during DST transitions.

* You can now use locale variants supported by gettext. These are usually used
  for languages which can be written in different scripts, for example Latin
  and Cyrillic (e.g. ``be@latin``).

Management Commands
^^^^^^^^^^^^^^^^^^^

+9 −0
Original line number Diff line number Diff line
@@ -1420,9 +1420,18 @@ class CountrySpecificLanguageTests(TestCase):
        self.assertTrue(check_for_language('en'))
        self.assertTrue(check_for_language('en-us'))
        self.assertTrue(check_for_language('en-US'))
        self.assertTrue(check_for_language('be'))
        self.assertTrue(check_for_language('be@latin'))
        self.assertTrue(check_for_language('sr-RS@latin'))
        self.assertTrue(check_for_language('sr-RS@12345'))
        self.assertFalse(check_for_language('en-ü'))
        self.assertFalse(check_for_language('en\x00'))
        self.assertFalse(check_for_language(None))
        self.assertFalse(check_for_language('be@ '))
        # Specifying encoding is not supported (Django enforces UTF-8)
        self.assertFalse(check_for_language('tr-TR.UTF-8'))
        self.assertFalse(check_for_language('tr-TR.UTF8'))
        self.assertFalse(check_for_language('de-DE.utf-8'))

    def test_get_language_from_request(self):
        # issue 19919