Browse Source

lang-attr for translated form fields.

master 0.2.4
Erik Stein 6 years ago
parent
commit
e00691395a
  1. 3
      CHANGES
  2. 2
      setup.py
  3. 39
      shared/multilingual/static/multilingual/js/switch_language.js
  4. 27
      shared/multilingual/utils/fields.py

3
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.

2
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',

39
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) {

27
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):

Loading…
Cancel
Save