Skip to content

Commit 5be9482

Browse files
committed
Use Django's get_select2_language() to get the i18n locale name
Add to Django in django/django@3079133.
1 parent ab8a438 commit 5be9482

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

django_select2/forms.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,11 @@
5454

5555
import django
5656
from django import forms
57-
from django.contrib.admin.widgets import SELECT2_TRANSLATIONS, AutocompleteMixin
57+
from django.contrib.admin.widgets import AutocompleteMixin
5858
from django.core import signing
5959
from django.db.models import Q
6060
from django.forms.models import ModelChoiceIterator
6161
from django.urls import reverse
62-
from django.utils.translation import get_language
6362

6463
from .cache import cache
6564
from .conf import settings
@@ -89,7 +88,15 @@ class Select2Mixin:
8988
@property
9089
def i18n_name(self):
9190
"""Name of the i18n file for the current language."""
92-
return SELECT2_TRANSLATIONS.get(get_language())
91+
if django.VERSION < (4, 1):
92+
from django.contrib.admin.widgets import SELECT2_TRANSLATIONS
93+
from django.utils.translation import get_language
94+
95+
return SELECT2_TRANSLATIONS.get(get_language())
96+
else:
97+
from django.contrib.admin.widgets import get_select2_language
98+
99+
return get_select2_language()
93100

94101
def build_attrs(self, base_attrs, extra_attrs=None):
95102
"""Add select2 data attributes."""

tests/test_forms.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import os
33
from collections.abc import Iterable
44

5+
import django
56
import pytest
67
from django.db.models import QuerySet
78
from django.urls import reverse
@@ -57,6 +58,13 @@ def test_lang_attr(self):
5758
with translation.override("de"):
5859
assert widget.i18n_name == "de"
5960

61+
# Handle language code with country
62+
with translation.override("fr-FR"):
63+
if django.VERSION < (4, 1):
64+
assert widget.i18n_name is None
65+
else:
66+
assert widget.i18n_name == "fr"
67+
6068
def test_allow_clear(self, db):
6169
required_field = self.form.fields["artist"]
6270
assert required_field.required is True
@@ -175,6 +183,20 @@ def test_i18n(self):
175183
"django_select2/django_select2.js",
176184
)
177185

186+
translation.activate("fr-FR")
187+
with translation.override("fr-FR"):
188+
if django.VERSION < (4, 1):
189+
assert tuple(Select2Widget().media._js) == (
190+
"admin/js/vendor/select2/select2.full.min.js",
191+
"django_select2/django_select2.js",
192+
)
193+
else:
194+
assert tuple(Select2Widget().media._js) == (
195+
"admin/js/vendor/select2/select2.full.min.js",
196+
"admin/js/vendor/select2/i18n/fr.js",
197+
"django_select2/django_select2.js",
198+
)
199+
178200
def test_theme_setting(self, settings):
179201
settings.SELECT2_THEME = "classic"
180202
widget = self.widget_cls()
@@ -261,6 +283,13 @@ def test_lang_attr(self):
261283
widget = self.widget_cls(data_view="heavy_data_1")
262284
assert 'lang="fr"' in widget.render("name", None)
263285

286+
# Handle language code with country
287+
with translation.override("fr-FR"):
288+
if django.VERSION < (4, 1):
289+
assert widget.i18n_name is None
290+
else:
291+
assert widget.i18n_name == "fr"
292+
264293
def test_selected_option(self, db):
265294
not_required_field = self.form.fields["primary_genre"]
266295
assert not_required_field.required is False

0 commit comments

Comments
 (0)