Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Internationalization for pyfeedback #317

Merged
merged 30 commits into from
Nov 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
54f862d
changed settings for translation
4-dash Sep 27, 2024
8732227
split urls into 2 files, added i18n_patterns, affected test files are…
4-dash Oct 24, 2024
802af13
added new translation files, removed old one
4-dash Oct 24, 2024
b8386e0
translate_url templatetag is added, changes were made to make code co…
4-dash Nov 9, 2024
ea47829
added language dropdown
4-dash Nov 10, 2024
1ba9f20
added translation tags to templates
4-dash Nov 16, 2024
8c6b74a
changed settings for translation
4-dash Sep 27, 2024
22ff9e5
split urls into 2 files, added i18n_patterns, affected test files are…
4-dash Oct 24, 2024
f784db1
added new translation files, removed old one
4-dash Oct 24, 2024
2332ff5
translate_url templatetag is added, changes were made to make code co…
4-dash Nov 9, 2024
882c34e
merged changes from master
4-dash Nov 10, 2024
0714e70
added translation tags to templates
4-dash Nov 16, 2024
a777e3b
Merge branch 'translation_en' of https://github.com/d120/pyfeedback i…
4-dash Nov 16, 2024
fee6a20
added get_text to model base.py and view veranstalter.py
4-dash Nov 19, 2024
1e89e98
migrated changes to base.py
4-dash Nov 19, 2024
8cd2309
translated to english
4-dash Nov 20, 2024
347964e
compiled translations
4-dash Nov 20, 2024
789c4bb
added more translations, and tags
4-dash Nov 21, 2024
21c2ba8
small translation correction
4-dash Nov 21, 2024
b6ce10c
fixed problems with translating
4-dash Nov 22, 2024
081e228
fixed bugs, missing translations added
4-dash Nov 22, 2024
f1249be
fixed translations
4-dash Nov 22, 2024
d644a73
small translation addition
4-dash Nov 22, 2024
b68ed05
fixed bug related to translate_url templatetag
4-dash Nov 23, 2024
61b68ad
fixd translation bug
4-dash Nov 23, 2024
d3706ab
compiled translations
4-dash Nov 23, 2024
4af711a
migrated changes
4-dash Nov 23, 2024
802810d
add missing js imports to veranstalter/dashboard.html
joachimschmidt557 Nov 24, 2024
2b3caf3
header.html: fix CSS of language dropdown
joachimschmidt557 Nov 24, 2024
18f9dff
corrected translation error
4-dash Nov 24, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 12 additions & 11 deletions src/feedback/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from django import forms
from django.http.response import HttpResponseRedirect
from django.shortcuts import render
from django.utils.translation import gettext_lazy as _

from feedback.models import Person, Veranstaltung, Semester, \
Mailvorlage, Kommentar, Tutor, BarcodeScanner, BarcodeScannEvent, BarcodeAllowedState, \
Expand Down Expand Up @@ -45,7 +46,7 @@ def assign_fachgebiet_action(self, request, queryset):
person.save()
suggestion_list = [(x, y) for x, y in suggestion_list if x is not person]

self.message_user(request, "Fachgebiete erfolgreich zugewiesen.")
self.message_user(request, _("Fachgebiete erfolgreich zugewiesen."))

if ('save' in request.POST) or not suggestion_list:
return HttpResponseRedirect(request.get_full_path())
Expand All @@ -57,7 +58,7 @@ def assign_fachgebiet_action(self, request, queryset):

return render(request, 'admin/fachgebiet.html', {'data': suggestion_list, 'fachgebiet': form, })

assign_fachgebiet_action.short_description = "Einem Fachgebiet zuweisen"
assign_fachgebiet_action.short_description = _("Einem Fachgebiet zuweisen")
actions = [assign_fachgebiet_action]


Expand All @@ -74,11 +75,11 @@ def has_add_permission(self, request, obj=None):
class VeranstaltungAdmin(admin.ModelAdmin):
"""Admin View für Veranstaltung"""
fieldsets = [
('Stammdaten', {'fields':
(_('Stammdaten'), {'fields':
['typ', 'name', 'semester', 'status', 'lv_nr', 'grundstudium', 'evaluieren',
'veranstalter', 'link_veranstalter',
]}),
('Bestellung', {'fields': ['sprache', 'anzahl', 'digitale_eval', 'digitale_eval_type', 'verantwortlich', 'ergebnis_empfaenger', 'primaerdozent',
(_('Bestellung'), {'fields': ['sprache', 'anzahl', 'digitale_eval', 'digitale_eval_type', 'verantwortlich', 'ergebnis_empfaenger', 'primaerdozent',
'auswertungstermin', 'freiefrage1', 'freiefrage2', 'kleingruppen', ]}),
]
list_display = ('typ', 'name', 'semester', 'grundstudium', 'evaluieren', 'anzahl',
Expand Down Expand Up @@ -117,15 +118,15 @@ def status_aendern_action(self, request, queryset):
for veranstaltung in queryset:
veranstaltung.log(request.user)

self.message_user(request, "Status erfolgreich geändert.")
self.message_user(request, _("Status erfolgreich geändert."))
return HttpResponseRedirect(request.get_full_path())

if not form:
form = self.StatusAendernForm(initial={'_selected_action': queryset.values_list('id', flat=True)})

return render(request, 'admin/status_aendern.html', {'veranstaltungen': queryset, 'status': form, })

status_aendern_action.short_description = "Ändere den Status einer Veranstaltung"
status_aendern_action.short_description = _("Ändere den Status einer Veranstaltung")

class KeineEvaluationForm(forms.Form):
_selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
Expand All @@ -141,14 +142,14 @@ def keine_evaluation_action(self, request, queryset):
for veranstaltung in queryset:
veranstaltung.log(request.user)

self.message_user(request, "Veranstaltungen wurden erfolgreich auf Keine Evaluation gesetzt.")
self.message_user(request, _("Veranstaltungen wurden erfolgreich auf Keine Evaluation gesetzt."))
return HttpResponseRedirect(request.get_full_path())
# nach dem return landet Python in status_aendern_action
if not form:
form = self.KeineEvaluationForm(initial={'_selected_action': queryset.values_list('id', flat=True)})
return render(request, 'admin/keine_evaluation.html', {'veranstaltungen': queryset, 'status': form, })

keine_evaluation_action.short_description = "Keine Evaluation für diese Veranstaltung(en)"
keine_evaluation_action.short_description = _("Keine Evaluation für diese Veranstaltung(en)")

actions = [status_aendern_action, keine_evaluation_action]

Expand All @@ -174,10 +175,10 @@ class KommentarAdmin(admin.ModelAdmin):
class TutorAdmin(admin.ModelAdmin):
"""Admin View für Tutor"""
fieldsets = [
('Stammdaten', {'fields':
(_('Stammdaten'), {'fields':
['vorname', 'nachname', 'email',
]}),
('Lehrveranstaltung', {'fields':
(_('Lehrveranstaltung'), {'fields':
['veranstaltung', 'nummer', 'anmerkung'
]}),
]
Expand Down Expand Up @@ -244,7 +245,7 @@ def save_related(self, request, form, formsets, change):
person.save()
count_added += 1
if count_added > 0:
self.message_user(request, "Dieses Fachgebiet wurde {0} Personen zugeordnet".format(count_added))
self.message_user(request, _("Dieses Fachgebiet wurde {count_added} Personen zugeordnet").format(count_added=count_added))


class FragebogenAdmin(admin.ModelAdmin):
Expand Down
22 changes: 12 additions & 10 deletions src/feedback/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

from feedback.models import Person, Veranstaltung, Kommentar, BarcodeScannEvent
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _

from feedback.models import Semester, Mailvorlage

Expand Down Expand Up @@ -53,10 +54,11 @@ def __init__(self, *args, **kwargs):
self.fields["ergebnis_empfaenger"].queryset = veranstalter_queryset

# Keine negative Anzahl möglich
self.fields["anzahl"] = forms.IntegerField(min_value=1)
self.fields["anzahl"] = forms.IntegerField(label=_("Anzahl"), min_value=1)

self.fields["auswertungstermin"] = forms.DateField(
help_text="Zu diesem Termin werden die Ergebnisse versandt. Nach diesem Datum können keine Evaluationsbögen mehr abgegeben werden und die digitale Evaluation geschlossen.",
label=_("Auswertungstermin"),
help_text=_("Zu diesem Termin werden die Ergebnisse versandt. Nach diesem Datum können keine Evaluationsbögen mehr abgegeben werden und die digitale Evaluation geschlossen."),
widget=forms.DateInput(attrs={"type": "date", "value": Semester.current().standard_ergebnisversand}),
)

Expand Down Expand Up @@ -118,7 +120,7 @@ class Meta:

class UploadFileForm(forms.Form):
"""Definiert die Form für den XML Import."""
file = forms.FileField(label="Datei")
file = forms.FileField(label=_("Datei"))


class PersonForm(forms.ModelForm):
Expand All @@ -133,7 +135,7 @@ def clean(self):
email = self.cleaned_data.get("email")

if not geschlecht or not email:
raise forms.ValidationError("Das Feld für die Anrede oder Email ist leer.")
raise forms.ValidationError(_("Das Feld für die Anrede oder Email ist leer."))


class PersonUpdateForm(forms.ModelForm):
Expand Down Expand Up @@ -163,12 +165,12 @@ class Meta:
exclude = ("veranstaltung",)


CLOSE_ORDER_CHOICES = (("ja", "Ja"), ("nein", "Nein"))
CLOSE_ORDER_CHOICES = (("ja", _("Ja")), ("nein", _("Nein")))


class CloseOrderForm(forms.Form):
"""Definiert die Form für das Beenden der Bestellphase"""
auswahl = forms.ChoiceField(choices=CLOSE_ORDER_CHOICES)
auswahl = forms.ChoiceField(choices=CLOSE_ORDER_CHOICES, label=_("Auswahl"))


class CreateBarcodeScannEventForm(forms.ModelForm):
Expand Down Expand Up @@ -198,12 +200,12 @@ def clean(self):


class UploadTANCSV(forms.Form):
csv = forms.FileField(label='CSV Datei aus Evasys', help_text='Im Evasysseitenmenü unter dem Punkt "Teilnahmeübersicht" generierbar.')
csv = forms.FileField(label=_('CSV Datei aus Evasys'), help_text=_('Im Evasysseitenmenü unter dem Punkt "Teilnahmeübersicht" generierbar.'))

class SendOrPDF(forms.Form):
choice = forms.ChoiceField(choices=(('mail', 'Versende TANs per E-Mail',),), label='Verarbeitungsart')
choice = forms.ChoiceField(choices=(('mail', _('Versende TANs per E-Mail'),),), label=_('Verarbeitungsart'))

class EMailTemplates(forms.Form):
losungstemplate = forms.ModelChoiceField(Mailvorlage.objects.all(),
required=False, help_text='Hier wird eine E-Mail an alle Veranstalter*innen ohne Anhang versendet. Es werden die selben Ersetzungen wie beim Standardmailsystem unterstützt und zusätzlich das Feld {{ losung }}.')
tantemplate = forms.ModelChoiceField(Mailvorlage.objects.all(), required=False, help_text='Hier wird die gewählte Vorlage an alle Veranstalter*innen mit einer CSV Datei versendet. Es werden die selben Ersetzungen wie beim Standardmailsystem unterstützt.')
required=False, help_text=_('Hier wird eine E-Mail an alle Veranstalter*innen ohne Anhang versendet. Es werden die selben Ersetzungen wie beim Standardmailsystem unterstützt und zusätzlich das Feld {{ losung }}.'))
tantemplate = forms.ModelChoiceField(Mailvorlage.objects.all(), required=False, help_text=_('Hier wird die gewählte Vorlage an alle Veranstalter*innen mit einer CSV Datei versendet. Es werden die selben Ersetzungen wie beim Standardmailsystem unterstützt.'))
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Generated by Django 5.1.1 on 2024-11-19 19:01

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('feedback', '0052_auto_20240817_2346'),
]

operations = [
migrations.AlterField(
model_name='alternativvorname',
name='vorname',
field=models.CharField(blank=True, max_length=30, verbose_name='Vorname'),
),
migrations.AlterField(
model_name='person',
name='nachname',
field=models.CharField(blank=True, max_length=30, verbose_name='Nachname'),
),
migrations.AlterField(
model_name='person',
name='vorname',
field=models.CharField(blank=True, max_length=30, verbose_name='Vorname'),
),
migrations.AlterField(
model_name='tutor',
name='nachname',
field=models.CharField(max_length=30, verbose_name='Nachname'),
),
migrations.AlterField(
model_name='tutor',
name='vorname',
field=models.CharField(max_length=30, verbose_name='Vorname'),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
# Generated by Django 5.1.1 on 2024-11-23 19:54

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('feedback', '0053_alter_alternativvorname_vorname_and_more'),
]

operations = [
migrations.AlterField(
model_name='alternativvorname',
name='vorname',
field=models.CharField(blank=True, max_length=30, verbose_name='first name'),
),
migrations.AlterField(
model_name='emailendung',
name='fachgebiet',
field=models.ForeignKey(blank=True, help_text='Hier soll der Domainname einer Email-Adresse eines Fachgebiets stehen.', on_delete=django.db.models.deletion.CASCADE, to='feedback.fachgebiet', verbose_name='Fachgebiet'),
),
migrations.AlterField(
model_name='fachgebietemail',
name='fachgebiet',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='fachgebiet', to='feedback.fachgebiet', verbose_name='Fachgebiet'),
),
migrations.AlterField(
model_name='person',
name='fachgebiet',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='feedback.fachgebiet', verbose_name='Fachgebiet'),
),
migrations.AlterField(
model_name='person',
name='nachname',
field=models.CharField(blank=True, max_length=30, verbose_name='last name'),
),
migrations.AlterField(
model_name='person',
name='vorname',
field=models.CharField(blank=True, max_length=30, verbose_name='first name'),
),
migrations.AlterField(
model_name='semester',
name='fragebogen',
field=models.CharField(choices=[('2008', 'Fragebogen 2008'), ('2009', 'Fragebogen 2009'), ('2012', 'Fragebogen 2012'), ('2016', 'Fragebogen 2016'), ('2020', 'Fragebogen 2020')], help_text='Verwendete Version des Fragebogens.', max_length=5, verbose_name='Fragebogen'),
),
migrations.AlterField(
model_name='semester',
name='sichtbarkeit',
field=models.CharField(choices=[('ADM', 'Administratoren'), ('VER', 'Veranstalter'), ('ALL', 'alle (öffentlich)')], help_text='Sichtbarkeit der Evaluationsergebnisse.<br /><em>Administratoren:</em> nur für Mitglieder des Feedback-Teams<br /><em>Veranstalter:</em> Veranstalter und Mitglieder des Feedback-Teams<br /><em>alle (öffentlich):</em> alle (beschränkt auf das Uninetz)<br />', max_length=3, verbose_name='Sichtbarkeit'),
),
migrations.AlterField(
model_name='semester',
name='vollerhebung',
field=models.BooleanField(default=False, verbose_name='Vollerhebung'),
),
migrations.AlterField(
model_name='tutor',
name='anmerkung',
field=models.CharField(max_length=100, verbose_name='Anmerkung'),
),
migrations.AlterField(
model_name='tutor',
name='nachname',
field=models.CharField(max_length=30, verbose_name='last name'),
),
migrations.AlterField(
model_name='tutor',
name='veranstaltung',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='feedback.veranstaltung', verbose_name='Veranstaltung'),
),
migrations.AlterField(
model_name='tutor',
name='vorname',
field=models.CharField(max_length=30, verbose_name='first name'),
),
migrations.AlterField(
model_name='veranstaltung',
name='anzahl',
field=models.IntegerField(blank=True, null=True, verbose_name='Anzahl'),
),
migrations.AlterField(
model_name='veranstaltung',
name='evaluieren',
field=models.BooleanField(choices=[(True, 'Ja'), (False, 'Nein')], default=True, verbose_name='Evaluieren'),
),
migrations.AlterField(
model_name='veranstaltung',
name='grundstudium',
field=models.BooleanField(verbose_name='Grundstudium'),
),
migrations.AlterField(
model_name='veranstaltung',
name='name',
field=models.CharField(max_length=150, verbose_name='Name'),
),
migrations.AlterField(
model_name='veranstaltung',
name='primaerdozent',
field=models.ForeignKey(blank=True, help_text='Die Person, die im Anschreiben erwähnt wird', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='primaerdozent', to='feedback.person', verbose_name='Primaerdozent'),
),
migrations.AlterField(
model_name='veranstaltung',
name='sprache',
field=models.CharField(blank=True, choices=[('de', 'Deutsch'), ('en', 'Englisch')], max_length=2, null=True, verbose_name='Sprache'),
),
migrations.AlterField(
model_name='veranstaltung',
name='typ',
field=models.CharField(choices=[('v', 'Vorlesung'), ('vu', 'Vorlesung mit Übung'), ('pr', 'Praktikum'), ('se', 'Seminar')], help_text='Wenn Ihre Vorlesung keine Übung hat wählen Sie bitte <i>Vorlesung</i> aus', max_length=2, verbose_name='Typ'),
),
migrations.AlterField(
model_name='veranstaltung',
name='veranstalter',
field=models.ManyToManyField(blank=True, help_text='Alle Personen, die mit der Veranstaltung befasst sind und z.B. Fragebögen bestellen können sollen.', to='feedback.person', verbose_name='Veranstalter'),
),
migrations.AlterField(
model_name='veranstaltung',
name='verantwortlich',
field=models.ForeignKey(blank=True, help_text='Diese Person wird von uns bei Rückfragen kontaktiert und bekommt die Fragenbögen zugeschickt', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='verantwortlich', to='feedback.person', verbose_name='Verantwortlich'),
),
migrations.AlterField(
model_name='veranstaltung',
name='veroeffentlichen',
field=models.BooleanField(choices=[(True, 'Ja'), (False, 'Nein')], default=True, verbose_name='Veroeffentlichen'),
),
]
Loading
Loading