Add language translation score to selector widget (#3603)

Co-authored-by: Richard Schreiber <schreiber@rami.io>
This commit is contained in:
Raphael Michel
2023-09-20 16:02:18 +02:00
committed by GitHub
parent 7b3eeaf411
commit 39a0eaff3e
5 changed files with 130 additions and 15 deletions

View File

@@ -44,6 +44,7 @@ from django.forms.utils import from_current_timezone
from django.urls import reverse
from django.utils.html import escape
from django.utils.safestring import mark_safe
from django.utils.text import format_lazy
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from django_scopes.forms import SafeModelMultipleChoiceField
@@ -51,6 +52,7 @@ from django_scopes.forms import SafeModelMultipleChoiceField
from pretix.helpers.hierarkey import clean_filename
from ...base.forms import I18nModelForm
from ...helpers.i18n import get_language_score
from ...helpers.images import (
IMAGE_EXTS, validate_uploaded_file_for_valid_image,
)
@@ -300,18 +302,43 @@ class SlugWidget(forms.TextInput):
class MultipleLanguagesWidget(forms.CheckboxSelectMultiple):
template_name = 'pretixcontrol/multi_languages_select.html'
option_template_name = 'pretixcontrol/multi_languages_widget.html'
def sort(self):
self.choices = sorted(self.choices, key=lambda l: (
def filter_and_sort(choices, languages, cond=True):
return sorted(
[c for c in choices if (c[0] in languages) == cond],
key=lambda c: str(c[1])
)
self.choices = (
(
0 if l[0] in settings.LANGUAGES_OFFICIAL
else (
1 if l[0] not in settings.LANGUAGES_INCUBATING
else 2
)
), str(l[1])
))
'',
filter_and_sort(self.choices, settings.LANGUAGES_OFFICIAL)
),
(
(
_('Community translations'),
format_lazy(
_('These translations are not maintained by the pretix team. We cannot vouch for their correctness '
'and new or recently changed features might not be translated and will show in English instead. '
'You can <a href="{translate_url}" target="_blank">help translating</a>.'),
translate_url='https://translate.pretix.eu'
),
'fa fa-group'
),
filter_and_sort(self.choices, settings.LANGUAGES_OFFICIAL.union(settings.LANGUAGES_INCUBATING), False)
),
(
(
_('Development only'),
_('These translations are still in progress. These languages can currently only be selected on development '
'installations of pretix, not in production.'),
'fa fa-flask text-danger'
),
filter_and_sort(self.choices, settings.LANGUAGES_INCUBATING)
)
)
def options(self, name, value, attrs=None):
self.sort()
@@ -325,6 +352,8 @@ class MultipleLanguagesWidget(forms.CheckboxSelectMultiple):
opt = super().create_option(name, value, label, selected, index, subindex, attrs)
opt['official'] = value in settings.LANGUAGES_OFFICIAL
opt['incubating'] = value in settings.LANGUAGES_INCUBATING
base_score = get_language_score("de")
opt['score'] = round(get_language_score(value) / base_score * 100)
return opt

View File

@@ -0,0 +1,5 @@
{% with id=widget.attrs.id %}<div{% if id %} id="{{ id }}"{% endif %} class="{{ widget.attrs.class }} checkbox">{% for group, options, index in widget.optgroups %}{% if group %}
<div class="checkbox-group"><div class="checkbox-group-legend"><span>{% if group.2 %}<i class="{{ group.2 }}" aria-hidden="true"></i> {% endif %}{{ group.0 }}</span></div><p class="text-muted">{{ group.1|safe }}</p>{% endif %}{% for option in options %}<div class="checkbox">
{% include option.template_name with widget=option %}</div>{% endfor %}{% if group %}
</div>{% endif %}{% endfor %}
</div>{% endwith %}

View File

@@ -5,13 +5,12 @@
{% include "django/forms/widgets/input.html" %}
{% if widget.wrap_label %}
{{ widget.label }}
{% if widget.incubating %}
<span class="label label-danger" data-toggle="tooltip" title="{% trans "The translation for this language is still in progress. This language can currently only be selected on development installations of pretix, not in production." %}">
{% trans "Translation in development" %}
</span>
{% elif not widget.official %}
<span class="label label-warning" data-toggle="tooltip" title="{% trans "This translation is not maintained by the pretix team. We cannot vouch for its correctness and new or recently changed features might not be translated and will show in English instead. You can help translating at translate.pretix.eu." %}">
{% trans "Unofficial translation" %}
{% if widget.incubating or not widget.official %}
&nbsp;
<span class="label label-{% if widget.score > 50 %}success{% else %}{% if widget.score > 30 %}info{% else %}default{% endif %}{% endif %}"
data-toggle="tooltip"
title="{% trans "This percentage of texts is translated across all parts of the system including most plugins. Even a low value might be enough if you only use specific features. Untranslated texts will show up in English." %}">
{{ widget.score }} %
</span>
{% endif %}
</label>