Skip to content

Commit 7b53162

Browse files
committed
Translation form: customizable field labels
1 parent bdf7969 commit 7b53162

File tree

4 files changed

+36
-4
lines changed

4 files changed

+36
-4
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
django-modeltrans change log
22
============================
33

4+
## 0.7.1 (2021-07-20)
5+
- Add customizable field labels to `TranslationModelForm`
6+
47
## 0.7.0 (2021-06-30)
58
- Add `TranslationModelForm`
69

docs/pages/translation-model-form.rst

+6-1
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,9 @@ The label of the field is adjusted to include the relevant language
7171
and to designate the field as a translation or default fallback field, as follows:
7272

7373
- translation fields: "field name (NL, translation language)"
74-
- fallback field: "field name (EN, default language)"
74+
- fallback field: "field name (EN, fallback language)"
75+
76+
The labels "translation language" and "fallback language" are customizable using the `Meta` options:
77+
78+
- `fallback_label` (defaults to "fallback language")
79+
- `translation_label` (defaults to "translation language")

modeltrans/forms.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ def __init__(self, options=None):
1818
super().__init__(options)
1919
self.languages = getattr(options, "languages", ["browser", "fallback"])
2020
self.fallback_language = getattr(options, "fallback_language", None)
21+
self.labels = {
22+
"fallback": getattr(options, "fallback_label", _("fallback language")),
23+
"translation": getattr(options, "translation_label", _("translation language")),
24+
}
2125

2226

2327
class TranslationModelFormMetaClass(forms.models.ModelFormMetaclass):
@@ -202,6 +206,7 @@ def __init__(self, *args, languages=None, fallback_language=None, **kwargs):
202206

203207
self.model_i18n_field = get_i18n_field(self._meta.model)
204208
self.languages = languages or self._meta.languages
209+
self.labels = self._meta.labels
205210
self.i18n_fields = [
206211
field for field in self.model_i18n_field.fields if field in self.base_fields.keys()
207212
]
@@ -245,7 +250,9 @@ def set_translation_field_attributes(self):
245250
if field_name != original_field_name:
246251
language = field_name.replace(f"{original_field_name}_", "")
247252
is_translation = language != self.fallback_language
248-
label_text = _("translation language") if is_translation else _("default language")
253+
label_text = (
254+
self.labels["translation"] if is_translation else self.labels["fallback"]
255+
)
249256
label = f"{original_field.label} ({language.upper()}, {label_text})"
250257
self.fields[field_name].label = label
251258
self.fields[field_name].required = (

tests/test_forms.py

+19-2
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ def test_setting_of_field_properties(self):
219219
"""Test that fields are set with the correct properties."""
220220
with self.subTest("Browser (fallback) language"):
221221
title_field = Form().fields["title"]
222-
self.assertEqual(title_field.label, "Title (EN, default language)")
222+
self.assertEqual(title_field.label, "Title (EN, fallback language)")
223223
self.assertTrue(title_field.required)
224224

225225
with self.subTest("Custom (fallback) language"):
@@ -236,10 +236,27 @@ def test_setting_of_field_properties(self):
236236
self.assertEqual(title_de_field.widget.__class__, forms.widgets.Textarea)
237237

238238
title_fr_field = form.fields["title_fr"]
239-
self.assertEqual(title_fr_field.label, "Title (FR, default language)")
239+
self.assertEqual(title_fr_field.label, "Title (FR, fallback language)")
240240
self.assertEqual(title_fr_field.required, True)
241241
self.assertEqual(title_fr_field.widget.__class__, forms.widgets.Textarea)
242242

243+
with self.subTest("Custom labels"):
244+
245+
class CustomLabelForm(TranslationModelForm):
246+
class Meta:
247+
model = Challenge
248+
fields = ["title"]
249+
languages = ["browser", "fallback"]
250+
fallback_language = "fr"
251+
fallback_label = "default language"
252+
translation_label = "new language"
253+
254+
form = CustomLabelForm()
255+
title_field = form.fields["title"]
256+
self.assertEqual(title_field.label, "Title (EN, new language)")
257+
title_field = form.fields["title_fr"]
258+
self.assertEqual(title_field.label, "Title (FR, default language)")
259+
243260
def test_form_initial_values(self):
244261
challenge = Challenge.objects.create(title="english", title_fr="french")
245262
initial_data = {

0 commit comments

Comments
 (0)