summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/utils/translation/trans_real.py2
-rw-r--r--docs/releases/1.10.3.txt3
-rw-r--r--tests/i18n/tests.py7
-rw-r--r--tests/i18n/urls_default_unprefixed.py1
4 files changed, 12 insertions, 1 deletions
diff --git a/django/utils/translation/trans_real.py b/django/utils/translation/trans_real.py
index 7a2a1c63a2..ad4d521590 100644
--- a/django/utils/translation/trans_real.py
+++ b/django/utils/translation/trans_real.py
@@ -48,7 +48,7 @@ language_code_re = re.compile(
re.IGNORECASE
)
-language_code_prefix_re = re.compile(r'^/([\w@-]+)(/|$)')
+language_code_prefix_re = re.compile(r'^/(\w+([@-]\w+)?)(/|$)')
@receiver(setting_changed)
diff --git a/docs/releases/1.10.3.txt b/docs/releases/1.10.3.txt
index 5bb340a3a8..ba01287aa5 100644
--- a/docs/releases/1.10.3.txt
+++ b/docs/releases/1.10.3.txt
@@ -23,3 +23,6 @@ Bugfixes
* Fixed ``QuerySet.bulk_create()`` on PostgreSQL when the number of objects is
a multiple plus one of ``batch_size`` (:ticket:`27385`).
+
+* Prevented ``i18n_patterns()`` from using too much of the URL as the language
+ to fix a use case for ``prefix_default_language=False`` (:ticket:`27063`).
diff --git a/tests/i18n/tests.py b/tests/i18n/tests.py
index 219d2b4022..0f80e0ae91 100644
--- a/tests/i18n/tests.py
+++ b/tests/i18n/tests.py
@@ -1474,6 +1474,7 @@ class MiscTests(SimpleTestCase):
self.assertEqual(g('/de/'), 'de')
self.assertEqual(g('/de-at/'), 'de-at')
self.assertEqual(g('/de-ch/'), 'de')
+ self.assertIsNone(g('/de-simple-page/'))
def test_get_language_from_path_null(self):
from django.utils.translation.trans_null import get_language_from_path as g
@@ -1806,6 +1807,7 @@ class LocaleMiddlewareTests(TestCase):
USE_I18N=True,
LANGUAGES=[
('en', 'English'),
+ ('de', 'German'),
('fr', 'French'),
],
MIDDLEWARE=[
@@ -1836,6 +1838,11 @@ class UnprefixedDefaultLanguageTests(SimpleTestCase):
with self.assertRaisesMessage(AssertionError, "Unexpected kwargs for i18n_patterns(): {'foo':"):
i18n_patterns(object(), foo='bar')
+ def test_page_with_dash(self):
+ # A page starting with /de* shouldn't match the 'de' langauge code.
+ response = self.client.get('/de-simple-page/')
+ self.assertEqual(response.content, b'Yes')
+
@override_settings(
USE_I18N=True,
diff --git a/tests/i18n/urls_default_unprefixed.py b/tests/i18n/urls_default_unprefixed.py
index 8cadbfaa73..92ef8c6246 100644
--- a/tests/i18n/urls_default_unprefixed.py
+++ b/tests/i18n/urls_default_unprefixed.py
@@ -4,6 +4,7 @@ from django.http import HttpResponse
from django.utils.translation import ugettext_lazy as _
urlpatterns = i18n_patterns(
+ url(r'^(?P<arg>[\w-]+)-page', lambda request, **arg: HttpResponse(_("Yes"))),
url(r'^simple/$', lambda r: HttpResponse(_("Yes"))),
prefix_default_language=False,
)