diff --git a/CHANGES b/CHANGES index 994dbcf..9d03903 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +0.2.4 2019-03-14 +- Add 'lang'-attribute to translated form fields and use this in switch_language.js + 0.2.3 2018-11-13 - Django 2 compatibility - Correctly handle default parameter. diff --git a/setup.py b/setup.py index 06e66e9..ef63270 100644 --- a/setup.py +++ b/setup.py @@ -46,7 +46,7 @@ def read(filename): setup( name='django-shared-multilingual', version=get_version('shared/multilingual'), - description=' Collection Django tools for multilingual websites.', + description=' Collection of Django tools for multilingual websites.', long_description=read('README.md'), author='Erik Stein', author_email='erik@classlibrary.net', diff --git a/shared/multilingual/static/multilingual/js/switch_language.js b/shared/multilingual/static/multilingual/js/switch_language.js index 077d496..8fc35a5 100644 --- a/shared/multilingual/static/multilingual/js/switch_language.js +++ b/shared/multilingual/static/multilingual/js/switch_language.js @@ -1,27 +1,24 @@ -// TODO Add lang attribute to form fields, use lang attribute to query fields + function showLanguages(languages) { - document.querySelectorAll('.form-row, .field-box').forEach(function(row) { - var lang = []; - row.classList.forEach(function(cls) { - if (cls) { - var l = cls.split('_').pop(); - if (l.length == 2 || l.length == 3) { - // TODO Currently this filters out *all* fields which have a _ suffix, e.g. template_key - // TODO Quick fix; better use "lang" attribute - if (['de', 'en', 'rom'].indexOf(l) > -1) { - lang.push(l); - } - } - } - }); - if (lang.length) { - var display = 'none'; - if (lang.filter(function(l) { return languages.includes(l); }).length > 0) { - display = 'block' - } - row.style.display = display; + // Query all input[type=text] and textarea elements which have + // a lang attribute; hide all but those in the languages parameter + + document.querySelectorAll( + 'input[lang][type="text"]:not([lang=""]), textarea[lang]:not([lang=""])' + ).forEach( function(widget) { + var display = 'none'; + if ( languages.includes(widget.attributes['lang'].value) ) { + display = 'block' + } + // Hide direct parent (.field-box) if there are multiple field per row, + // hide the row if there is only field in it + if ( widget.parentElement.classList.contains(".field-box") ) { + widget.parentElement.style.display = display + } else { + widget.parentElement.parentElement.style.display = display } }) + localStorage.admin_languages = languages.join(' ') document.querySelectorAll('.language-select').forEach(function(a) { if (a.dataset.languages == localStorage.admin_languages) { diff --git a/shared/multilingual/utils/fields.py b/shared/multilingual/utils/fields.py index c7d2b7c..9b8c784 100644 --- a/shared/multilingual/utils/fields.py +++ b/shared/multilingual/utils/fields.py @@ -45,7 +45,6 @@ class TranslatableFieldMixin: """ base_class = None - formfield_class = forms.fields.CharField extra_parameter_names = [] def __init__(self, verbose_name=None, **kwargs): @@ -98,7 +97,17 @@ class TranslatableFieldMixin: self.base_class = [f for f in self.__class__.__bases__ if issubclass(f, models.Field)][0] - localized_field = self.base_class( + class LocalizedFieldClass(self.base_class): + lang = lang_code + + def formfield(self, **kwargs): + formfield = super().formfield(**kwargs) + formfield.widget.attrs.update({ + 'lang': self.lang, + }) + return formfield + + localized_field = LocalizedFieldClass( format_lazy("{} ({})", self.verbose_name, lang_code), **params ) @@ -110,13 +119,6 @@ class TranslatableFieldMixin: setattr(cls, name, property(get_translated_value(name))) - def formfield(self, **kwargs): - defaults = { - 'form_class': self.formfield_class, - } - defaults.update(kwargs) - return super(TranslatableFieldMixin, self).formfield(**defaults) - class TranslatableCharField(TranslatableFieldMixin, models.CharField): pass @@ -126,16 +128,13 @@ class TranslatableSlugField(TranslatableFieldMixin, models.SlugField): pass +# TODO TranslatableFormField not used, remove? class TranslatableFormField(forms.fields.CharField): - # def __init__(self, *args, **kwargs): - # kwargs.update({'widget': CKEditorWidget(config_name=config_name, extra_plugins=extra_plugins, - # external_plugin_resources=external_plugin_resources)}) - # super(RichTextFormField, self).__init__(*args, **kwargs) pass class TranslatableTextField(TranslatableFieldMixin, models.TextField): - formfield_class = forms.fields.CharField + pass class TranslatableJSONField(TranslatableFieldMixin, JSONField):