summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMy-Name-Is-Nabil <midorady9999@gmail.com>2022-02-18 03:21:35 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-02-18 08:34:49 +0100
commit3079133c73f3b8b0e929673b06b62dce1f54be71 (patch)
tree13558ed42800a58cbc9b7443ed4dcfb5797c4f1c
parentb2ed0d78f2dff9986ef15b9098c1b6d9ce720a99 (diff)
Fixed #33514 -- Added fallbacks to subsequent language codes in Select2 translations.
-rw-r--r--django/contrib/admin/widgets.py15
-rw-r--r--tests/admin_widgets/test_autocomplete_widget.py7
2 files changed, 21 insertions, 1 deletions
diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py
index b81ea7de3e..c64c5d14f3 100644
--- a/django/contrib/admin/widgets.py
+++ b/django/contrib/admin/widgets.py
@@ -450,6 +450,19 @@ SELECT2_TRANSLATIONS = {
SELECT2_TRANSLATIONS.update({"zh-hans": "zh-CN", "zh-hant": "zh-TW"})
+def get_select2_language():
+ lang_code = get_language()
+ supported_code = SELECT2_TRANSLATIONS.get(lang_code)
+ if supported_code is None:
+ # If 'zh-hant-tw' is not supported, try subsequent language codes i.e.
+ # 'zh-hant' and 'zh'.
+ i = None
+ while (i := lang_code.rfind("-", 0, i)) > -1:
+ if supported_code := SELECT2_TRANSLATIONS.get(lang_code[:i]):
+ return supported_code
+ return supported_code
+
+
class AutocompleteMixin:
"""
Select widget mixin that loads options from AutocompleteJsonView via AJAX.
@@ -466,7 +479,7 @@ class AutocompleteMixin:
self.db = using
self.choices = choices
self.attrs = {} if attrs is None else attrs.copy()
- self.i18n_name = SELECT2_TRANSLATIONS.get(get_language())
+ self.i18n_name = get_select2_language()
def get_url(self):
return reverse(self.url_name % self.admin_site.name)
diff --git a/tests/admin_widgets/test_autocomplete_widget.py b/tests/admin_widgets/test_autocomplete_widget.py
index c7bcbd1d13..e2827b9147 100644
--- a/tests/admin_widgets/test_autocomplete_widget.py
+++ b/tests/admin_widgets/test_autocomplete_widget.py
@@ -166,6 +166,13 @@ class AutocompleteMixinTests(TestCase):
)
languages = (
("de", "de"),
+ # Subsequent language codes are used when the language code is not
+ # supported.
+ ("de-at", "de"),
+ ("de-ch-1901", "de"),
+ ("en-latn-us", "en"),
+ ("nl-nl-x-informal", "nl"),
+ ("zh-hans-HK", "zh-CN"),
# Language with code 00 does not exist.
("00", None),
# Language files are case sensitive.