diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 529cd41e06321ee80fd76e8bc388f369be2bab92..da3074ee02f31ac95dc7b400339d45331b39cadb 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -14,6 +14,16 @@ Added
 
 * Owners of one of the parent groups of a object can now have the same rights on it
 as a group owner (can be toggled with a preference).
+* Integrate seating plans in lesson overview
+* Add option to set LessonDocumentation data for all lessons in one week at once.
+* Excuse types can now be marked as `Count as absent`, which they are per default. If not, they aren't counted in the overviews.
+* Add Ukrainian locale (contributed by Sergiy Gorichenko from Fre(i)e Software GmbH).
+
+Fixed
+~~~~~
+
+* The week overview page was not refreshed when a new week was selected in the dropdown.
+* Make generation of full register printout faster.
 
 `2.0.1`_ - 2022-02-12
 ---------------------
diff --git a/aleksis/apps/alsijil/forms.py b/aleksis/apps/alsijil/forms.py
index 7186b6fac2db54c959703f9cc2ba4ab26990b60f..e23d8c47b344e2e7aa2b7a67ce344c42e4fa205d 100644
--- a/aleksis/apps/alsijil/forms.py
+++ b/aleksis/apps/alsijil/forms.py
@@ -13,7 +13,7 @@ from guardian.shortcuts import get_objects_for_user
 from material import Fieldset, Layout, Row
 
 from aleksis.apps.chronos.managers import TimetableType
-from aleksis.apps.chronos.models import Subject, TimePeriod
+from aleksis.apps.chronos.models import LessonPeriod, Subject, TimePeriod
 from aleksis.core.forms import ActionForm, ListActionForm
 from aleksis.core.models import Group, Person, SchoolTerm
 from aleksis.core.util.core_helpers import get_site_preferences
@@ -45,6 +45,30 @@ class LessonDocumentationForm(forms.ModelForm):
         super().__init__(*args, **kwargs)
 
         self.fields["homework"].label = _("Homework for the next lesson")
+        if (
+            self.instance.lesson_period
+            and get_site_preferences()["alsijil__allow_carry_over_same_week"]
+        ):
+            self.fields["carry_over_week"] = forms.BooleanField(
+                label=_("Carry over data to all other lessons with the same subject in this week"),
+                initial=True,
+                required=False,
+            )
+
+    def save(self, **kwargs):
+        lesson_documentation = super(LessonDocumentationForm, self).save(commit=True)
+        if (
+            self.cleaned_data["carry_over_week"]
+            and (
+                lesson_documentation.topic
+                or lesson_documentation.homework
+                or lesson_documentation.group_note
+            )
+            and lesson_documentation.lesson_period
+        ):
+            lesson_documentation.carry_over_data(
+                LessonPeriod.objects.filter(lesson=lesson_documentation.lesson_period.lesson)
+            )
 
 
 class PersonalNoteForm(forms.ModelForm):
@@ -197,11 +221,11 @@ class ExtraMarkForm(forms.ModelForm):
 
 
 class ExcuseTypeForm(forms.ModelForm):
-    layout = Layout("short_name", "name")
+    layout = Layout("short_name", "name", "count_as_absent")
 
     class Meta:
         model = ExcuseType
-        fields = ["short_name", "name"]
+        fields = ["short_name", "name", "count_as_absent"]
 
 
 class PersonOverviewForm(ActionForm):
diff --git a/aleksis/apps/alsijil/locale/ru/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/ru/LC_MESSAGES/django.po
new file mode 100644
index 0000000000000000000000000000000000000000..cfdaa5cfb780278cb399496235d9af4140f18d64
--- /dev/null
+++ b/aleksis/apps/alsijil/locale/ru/LC_MESSAGES/django.po
@@ -0,0 +1,1437 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-04-23 12:35+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n"
+"%100>=11 && n%100<=14)? 2 : 3);\n"
+#: aleksis/apps/alsijil/actions.py:18
+msgid "Mark as excused"
+msgstr ""
+
+#: aleksis/apps/alsijil/actions.py:25
+msgid "Mark as unexcused"
+msgstr ""
+
+#: aleksis/apps/alsijil/actions.py:32
+#, python-brace-format
+msgid "Mark as {excuse_type.name}"
+msgstr ""
+
+#: aleksis/apps/alsijil/actions.py:48 aleksis/apps/alsijil/tables.py:29
+#: aleksis/apps/alsijil/tables.py:53 aleksis/apps/alsijil/tables.py:78
+#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:29
+msgid "Delete"
+msgstr ""
+
+#: aleksis/apps/alsijil/actions.py:68
+msgid "{} asks you to check some class register entries."
+msgstr ""
+
+#: aleksis/apps/alsijil/actions.py:86
+#, python-brace-format
+msgid "We have successfully sent notifications to {count_teachers} persons for {count_items} lessons."
+msgstr ""
+
+#: aleksis/apps/alsijil/actions.py:92
+msgid "Ask teacher to check data"
+msgstr ""
+
+#: aleksis/apps/alsijil/data_checks.py:12
+msgid "Delete object"
+msgstr ""
+
+#: aleksis/apps/alsijil/data_checks.py:22
+msgid "Set current groups"
+msgstr ""
+
+#: aleksis/apps/alsijil/data_checks.py:33
+msgid "Reset personal note to defaults"
+msgstr ""
+
+#: aleksis/apps/alsijil/data_checks.py:45
+msgid "Ensure that there are no personal notes in cancelled lessons"
+msgstr ""
+
+#: aleksis/apps/alsijil/data_checks.py:46
+msgid "The personal note is related to a cancelled lesson."
+msgstr ""
+
+#: aleksis/apps/alsijil/data_checks.py:73
+msgid "Ensure that 'groups_of_person' is set for every personal note"
+msgstr ""
+
+#: aleksis/apps/alsijil/data_checks.py:74
+msgid "The personal note has no group in 'groups_of_person'."
+msgstr ""
+
+#: aleksis/apps/alsijil/data_checks.py:99
+msgid "Ensure that there are no filled out lesson documentations on holidays"
+msgstr ""
+
+#: aleksis/apps/alsijil/data_checks.py:100
+msgid "The lesson documentation is on holidays."
+msgstr ""
+
+#: aleksis/apps/alsijil/data_checks.py:133
+msgid "Ensure that there are no filled out personal notes on holidays"
+msgstr ""
+
+#: aleksis/apps/alsijil/data_checks.py:134
+msgid "The personal note is on holidays."
+msgstr ""
+
+#: aleksis/apps/alsijil/data_checks.py:162
+msgid "Ensure that there are no excused personal notes without an absence"
+msgstr ""
+
+#: aleksis/apps/alsijil/data_checks.py:163
+msgid "The personal note is marked as excused, but not as absent."
+msgstr ""
+
+#: aleksis/apps/alsijil/filters.py:12
+msgid "After"
+msgstr ""
+
+#: aleksis/apps/alsijil/filters.py:13
+msgid "Before"
+msgstr ""
+
+#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:302
+#: aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:227
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:220
+msgid "Subject"
+msgstr ""
+
+#: aleksis/apps/alsijil/filters.py:30
+msgid "Tardiness is lower than"
+msgstr ""
+
+#: aleksis/apps/alsijil/filters.py:31
+msgid "Tardiness is bigger than"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:47
+msgid "Homework for the next lesson"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:73 aleksis/apps/alsijil/forms.py:214
+#: aleksis/apps/alsijil/forms.py:301
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:219
+msgid "Group"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:79
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:190
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:221
+msgid "Teacher"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:96
+msgid "You can't select a group and a teacher both."
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:150 aleksis/apps/alsijil/forms.py:303
+#: aleksis/apps/alsijil/models.py:480
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
+msgid "Start date"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:151 aleksis/apps/alsijil/forms.py:304
+#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
+msgid "End date"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:152
+msgid "Start period"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:153
+msgid "End period"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:154 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/tables.py:138
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:397
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:75
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:352
+msgid "Absent"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:155 aleksis/apps/alsijil/tables.py:146
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:134
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:85
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:84
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:297
+msgid "Excused"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:157 aleksis/apps/alsijil/models.py:71
+#: aleksis/apps/alsijil/models.py:245
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:73
+msgid "Excuse type"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:162
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:34
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:94
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:354
+msgid "Remarks"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:227
+#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:9
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
+msgid "Person"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:299
+msgid "School term"
+msgstr ""
+
+#: aleksis/apps/alsijil/forms.py:300
+msgid "Has lesson documentation"
+msgstr ""
+
+#: aleksis/apps/alsijil/managers.py:88 aleksis/apps/alsijil/tables.py:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:176
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:240
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:316
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:50
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:21
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:375
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:455
+#: aleksis/apps/alsijil/util/alsijil_helpers.py:315
+msgid "Event"
+msgstr ""
+
+#: aleksis/apps/alsijil/menus.py:6 aleksis/apps/alsijil/preferences.py:9
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
+msgid "Class register"
+msgstr ""
+
+#: aleksis/apps/alsijil/menus.py:16
+msgid "Current lesson"
+msgstr ""
+
+#: aleksis/apps/alsijil/menus.py:27
+msgid "Current week"
+msgstr ""
+
+#: aleksis/apps/alsijil/menus.py:38
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
+msgid "My groups"
+msgstr ""
+
+#: aleksis/apps/alsijil/menus.py:49
+msgid "My overview"
+msgstr ""
+
+#: aleksis/apps/alsijil/menus.py:60
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
+msgid "My students"
+msgstr ""
+
+#: aleksis/apps/alsijil/menus.py:71
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
+msgid "Assign group role"
+msgstr ""
+
+#: aleksis/apps/alsijil/menus.py:82
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
+msgid "All lessons"
+msgstr ""
+
+#: aleksis/apps/alsijil/menus.py:93 aleksis/apps/alsijil/models.py:72
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
+msgid "Excuse types"
+msgstr ""
+
+#: aleksis/apps/alsijil/menus.py:104 aleksis/apps/alsijil/models.py:250
+#: aleksis/apps/alsijil/models.py:432 aleksis/apps/alsijil/tables.py:120
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:18
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
+msgid "Extra marks"
+msgstr ""
+
+#: aleksis/apps/alsijil/menus.py:115
+msgid "Manage group roles"
+msgstr ""
+
+#: aleksis/apps/alsijil/model_extensions.py:190
+msgid "Can view week overview of group class register"
+msgstr ""
+
+#: aleksis/apps/alsijil/model_extensions.py:194
+msgid "Can view lesson overview of group class register"
+msgstr ""
+
+#: aleksis/apps/alsijil/model_extensions.py:196
+msgid "Can view all personal notes of a group"
+msgstr ""
+
+#: aleksis/apps/alsijil/model_extensions.py:197
+msgid "Can edit all personal notes of a group"
+msgstr ""
+
+#: aleksis/apps/alsijil/model_extensions.py:199
+msgid "Can view all lesson documentation of a group"
+msgstr ""
+
+#: aleksis/apps/alsijil/model_extensions.py:202
+msgid "Can edit all lesson documentation of a group"
+msgstr ""
+
+#: aleksis/apps/alsijil/model_extensions.py:204
+msgid "Can view full register of a group"
+msgstr ""
+
+#: aleksis/apps/alsijil/model_extensions.py:206
+msgid "Can register an absence for all members of a group"
+msgstr ""
+
+#: aleksis/apps/alsijil/model_extensions.py:208
+msgid "Can assign a group role for this group"
+msgstr ""
+
+#: aleksis/apps/alsijil/model_extensions.py:209
+msgid "Can register an absence for a person"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:50 aleksis/apps/alsijil/models.py:419
+msgid "Short name"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:51 aleksis/apps/alsijil/models.py:420
+#: aleksis/apps/alsijil/models.py:444
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:23
+msgid "Name"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:55 aleksis/apps/alsijil/tables.py:41
+msgid "Count as absent"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:57
+msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:225 aleksis/apps/alsijil/models.py:324
+msgid "Year"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:284
+msgid "Personal note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:285
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:375
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:22
+msgid "Personal notes"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:336
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:132
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:263
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:26
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:421
+msgid "Lesson topic"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:337
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:133
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:269
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:347
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:34
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:422
+msgid "Homework"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:338
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:134
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:275
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:351
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:42
+msgid "Group note"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:385
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:17
+msgid "Lesson documentation"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:386
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:21
+msgid "Lesson documentations"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:431
+msgid "Extra mark"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:445
+msgid "Icon"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:446
+msgid "Colour"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:452 aleksis/apps/alsijil/models.py:467
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
+msgid "Group role"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:453
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:34
+#: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
+msgid "Group roles"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:457
+msgid "Can assign group role"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:473
+msgid "Assigned person"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:246
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:326
+msgid "Groups"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:485
+msgid "Can be left empty if end date is not clear yet"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:500
+msgid "Group role assignment"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:501
+msgid "Group role assignments"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:508
+msgid "Can view lesson overview"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:509
+msgid "Can view week overview"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:510
+msgid "Can view full register"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:511
+msgid "Can register absence"
+msgstr ""
+
+#: aleksis/apps/alsijil/models.py:512
+msgid "Can list all personal note filters"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:17
+msgid "Block adding personal notes for cancelled lessons"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:25
+msgid "Allow users to view their own personal notes"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:34
+msgid "Allow primary group owners to register future absences for students in their groups"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:43
+msgid "Allow original teachers to edit their lessons although they are substituted"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:52
+msgid "Carry over data from first lesson period to the following lesson periods in lessons over multiple periods"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:55
+msgid "This will carry over data only if the data in the following periods are empty."
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:63
+msgid "Carry over personal notes to all following lesson periods on the same day."
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:72
+msgid "Allow teachers to open lesson periods on the same day and not just at the beginning of the period"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:76
+msgid "Lessons in the past are not affected by this setting, you can open them whenever you want."
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:85
+msgid "Allow teachers to add data for lessons in holidays"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:94
+msgid "Allow group owners to assign group roles to the parents of the group's members"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:103
+msgid "Show assigned group roles in week view"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:104
+msgid "Only week view of groups"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:112
+msgid "Show assigned group roles in lesson view"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:122
+msgid "Items per page in lessons table"
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:126
+msgid "Each page must show at least one item."
+msgstr ""
+
+#: aleksis/apps/alsijil/preferences.py:134
+msgid "Filter lessons by existence of their lesson documentation on default"
+msgstr ""
+
+#: aleksis/apps/alsijil/tables.py:23 aleksis/apps/alsijil/tables.py:47
+#: aleksis/apps/alsijil/tables.py:72
+#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:13
+msgid "Edit"
+msgstr ""
+
+#: aleksis/apps/alsijil/tables.py:96
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:348
+msgid "Date"
+msgstr ""
+
+#: aleksis/apps/alsijil/tables.py:99
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:21
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+msgid "Period"
+msgstr ""
+
+#: aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:131
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:257
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:336
+msgid "Teachers"
+msgstr ""
+
+#: aleksis/apps/alsijil/tables.py:118
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:160
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:39
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:114
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:323
+msgid "Tardiness"
+msgstr ""
+
+#: aleksis/apps/alsijil/tables.py:119
+msgid "Excuse"
+msgstr ""
+
+#: aleksis/apps/alsijil/tables.py:156
+#, python-brace-format
+msgid "{value}' late"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:5
+#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:6
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:30
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:385
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:138
+msgid "Register absence"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:5
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:6
+msgid "Confirm: Register absence"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:10
+msgid ""
+"\n"
+"      Do you really want to register the following absence?\n"
+"    "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:26
+msgid ""
+"\n"
+"                As the length of this absence is longer than one day,\n"
+"                please double check the correctness of your entry.\n"
+"              "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:35
+#, python-format
+msgid " %(count)s affected lessons "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:40
+msgid ""
+"\n"
+"                  There are no affected lessons. Registering this absence won't have any effect.\n"
+"                "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:57
+msgid "Reset status to 'not absent'"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:79
+msgid "Cancel"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:21
+msgid "Students"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:35
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:76
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:78
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
+msgid "Students list"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:39
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:82
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:72
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:81
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:27
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:43
+#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:16
+#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:35
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:6
+msgid "Week view"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:45
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:90
+msgid "Roles"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:51
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:98
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:31
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:50
+#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:20
+#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:42
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:82
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:97
+msgid "Generate printout"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:59
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:104
+msgid "No groups available."
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:71
+msgid "students"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:5
+msgid "Lesson"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:28
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:27
+msgid "Persons"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:36
+msgid "Seating plan"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:46
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:94
+msgid "Previous"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:54
+msgid "More"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:87
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:93
+msgid "My previous lesson"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:98
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:104
+msgid "My next lesson"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:105
+msgid "Next"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:161
+msgid ""
+"\n"
+"                  This lesson overlaps with holidays and can't be edited.\n"
+"                "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:10
+msgid "Class register: person"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:18
+#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:10
+msgid "Back"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:22
+#, python-format
+msgid ""
+"\n"
+"      Class register overview for %(person)s\n"
+"    "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:50
+msgid "Statistics"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:65
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:344
+msgid "Relevant personal notes"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:68
+msgid "Filter personal notes"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:73
+msgid "Clear all filters"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:76
+msgid "Close"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:79
+msgid "Filter"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:91
+msgid "Filter results"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:119
+msgid "Statistics on absences, tardiness and remarks"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:128
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:14
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:80
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:291
+msgid "Absences"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:132
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:138
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:296
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:302
+msgid "thereof"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:140
+msgid "Without Excuse Type"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:150
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:102
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:81
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:313
+msgid "Unexcused"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:12
+#, python-format
+msgid "Students list: %(group)s"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:54
+msgid "Select"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:62
+msgid "Toggle filters"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:69
+#, python-format
+msgid ""
+"CW %(week)s:\n"
+"      %(instance)s"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:293
+msgid "Unfold"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:360
+msgid "Visit lesson overview"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:398
+msgid "unexcused"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:401
+msgid "Summed up tardiness"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:404
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:117
+msgid "Count of tardiness"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:436
+msgid "No lessons available"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:439
+msgid ""
+"\n"
+"            There are no lessons for the selected group or teacher in this week.\n"
+"          "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/create.html:6
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/create.html:7
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:18
+msgid "Create excuse type"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/edit.html:6
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/edit.html:7
+msgid "Edit excuse type"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/warning.html:4
+#: aleksis/apps/alsijil/templates/alsijil/group_role/warning.html:4
+msgid ""
+"\n"
+"    This function should only be used to define alternatives to the default excuse which also will be counted extra.\n"
+"    Don't use this to create a default excuse or if you don't divide between different types of excuse.\n"
+"  "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/create.html:6
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/create.html:7
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:14
+msgid "Create extra mark"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/edit.html:6
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/edit.html:7
+msgid "Edit extra mark"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:9
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:16
+#, python-format
+msgid "Assign group role for %(group)s"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:34
+msgid "Assign"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:12
+#, python-format
+msgid "Group roles for %(group)s"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:28
+msgid "Back to my groups"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:36
+msgid "Assign a role to a person"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:45
+msgid "Current roles"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:48
+msgid "All assignments"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:66
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:83
+msgid "Actions"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/create.html:6
+#: aleksis/apps/alsijil/templates/alsijil/group_role/create.html:7
+#: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:16
+msgid "Create group role"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/edit.html:6
+#: aleksis/apps/alsijil/templates/alsijil/group_role/edit.html:7
+msgid "Edit group role"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/edit_assignment.html:7
+#: aleksis/apps/alsijil/templates/alsijil/group_role/edit_assignment.html:8
+msgid "Edit group role assignment"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assigned_roles.html:31
+msgid "No one assigned."
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assigned_roles.html:41
+msgid ""
+"\n"
+"    You can get some additional actions for each group role assignment if you click on the name of the\n"
+"    corresponding person.\n"
+"  "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:21
+msgid "Stop"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/notifications/check.html:1
+msgid "Please check if the following class register entries are complete and correct:"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:139
+msgid "(e)"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:33
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:56
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:143
+msgid "(u)"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:4
+msgid "Legend"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:7
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:71
+msgid "General"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:137
+msgid "(a)"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14
+msgid "Unexcused absences"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:49
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:138
+msgid "Sum (e)"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18
+msgid "Sum of excused absences"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22
+msgid "Regular excused absences"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:41
+msgid "Excuse types (not counted as absent)"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:42
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:7
+#, python-format
+msgid "%(period)s. period"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+#, python-format
+msgid ""
+"\n"
+"            %(period_from)s.–%(period_to)s.  period\n"
+"          "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:8
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:10
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:136
+msgid "Save"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:19
+#, python-format
+msgid ""
+"\n"
+"        Previous %(subject)s lesson\n"
+"      "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:30
+#, python-format
+msgid ""
+"\n"
+"        Next %(subject)s lesson\n"
+"      "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:13
+msgid "Change history"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:59
+msgid "Tardiness (in m)"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:6
+msgid "Overview: Previous lesson"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:13
+msgid "Lesson topic of previous lesson:"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:20
+msgid "Homework for this lesson:"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:27
+msgid "Group notes for previous lesson:"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:34
+msgid "Absent persons:"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:41
+msgid "Late persons:"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:8
+#, python-format
+msgid ""
+"Seating plan for %(group)s in\n"
+"          %(room)s"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:14
+#, python-format
+msgid ""
+"\n"
+"            This seating plan is taken from the parent group of %(child_group)s.\n"
+"            If you want, you can take it over for your group and then customize it.\n"
+"          "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:30
+msgid "Edit seating plan"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:37
+msgid "Copy plan and edit"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:56
+msgid "There is no seating plan for this lesson."
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:64
+#, python-format
+msgid ""
+"\n"
+"                  Create a new seating plan for %(group)s (%(subject)s) in %(room)s\n"
+"                "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:78
+#, python-format
+msgid ""
+"\n"
+"                    Create a new seating plan for %(group)s in %(room)s\n"
+"                  "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:6
+msgid "Data complete"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:17
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:30
+msgid "Missing data"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:19
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:32
+msgid "Pending"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:28
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:466
+msgid "Lesson cancelled"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:34
+msgid "Substitution"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:4
+msgid "Lesson filter"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:9
+msgid "Update filters"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:22
+msgid "Lesson table"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:31
+msgid "Execute"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:6
+msgid "No students available."
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:13
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:24
+msgid "Primary group"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:15
+msgid "Uncounted Absences"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:48
+msgid "Sum"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:90
+msgid "Regular excused"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:130
+msgid "Show more details"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:131
+msgid "Details"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:6
+msgid "Class register:"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:26
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:59
+msgid "Owners"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:30
+msgid "Printed on"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:38
+msgid ""
+"\n"
+"        This printout is intended for archival purposes. The main copy of\n"
+"        the class register is stored in the AlekSIS School Information\n"
+"        System.\n"
+"      "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:45
+msgid ""
+"\n"
+"        Copies of the class register, both digital and as printout, must\n"
+"        only be kept inside the school and/or on devices authorised by the\n"
+"        school.\n"
+"      "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:52
+msgid ""
+"\n"
+"        The owner of the group and the headteacher confirm the above, as\n"
+"        well as the correctness of this printout.\n"
+"      "
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:62
+msgid "Headteacher"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:69
+msgid "Abbreviations"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:78
+msgid "Late"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:89
+msgid "Custom excuse types"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:101
+msgid "Custom excuse types (not counted as absent)"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:113
+msgid "Available extra marks"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:127
+msgid "Persons in group"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:132
+msgid "No."
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:133
+msgid "Last name"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:134
+msgid "First name"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:135
+msgid "Sex"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:136
+msgid "Date of birth"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:147
+msgid "(b)"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:184
+msgid "Teachers and lessons in group"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:191
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:222
+msgid "Lesson start"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:192
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:223
+msgid "Lesson end"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:193
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:224
+msgid "Per week"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:214
+msgid "Teachers and lessons in child groups"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:247
+msgid "Personal overview"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:249
+msgid "Contact details"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:288
+msgid "Absences and tardiness"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:303
+msgid "Without excuse type"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:349
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:419
+msgid "Pe."
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:350
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:420
+msgid "Subj."
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:351
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:424
+msgid "Te."
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:353
+msgid "Tard."
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:381
+msgid "Yes"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:386
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:484
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:499
+msgid "e"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:413
+msgid "Week"
+msgstr ""
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:423
+msgid "Notes"
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:118
+msgid "You either selected an invalid lesson or there is currently no lesson in progress."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:151
+msgid "You are not allowed to create a lesson documentation for a lesson in the future."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:266
+msgid "The lesson documentation has been saved."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:300
+msgid "The personal notes have been saved."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1079
+msgid "The absence has been saved."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1100
+msgid "The personal note has been deleted."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1122
+msgid "The extra mark has been created."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1134
+msgid "The extra mark has been saved."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1145
+msgid "The extra mark has been deleted."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1166
+msgid "The excuse type has been created."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1178
+msgid "The excuse type has been saved."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1189
+msgid "The excuse type has been deleted."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1210
+msgid "The group role has been created."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1222
+msgid "The group role has been saved."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1233
+msgid "The group role has been deleted."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1266 aleksis/apps/alsijil/views.py:1298
+msgid "The group role has been assigned."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1317
+msgid "The group role assignment has been saved."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1338
+msgid "The group role assignment has been stopped."
+msgstr ""
+
+#: aleksis/apps/alsijil/views.py:1351
+msgid "The group role assignment has been deleted."
+msgstr ""
diff --git a/aleksis/apps/alsijil/locale/uk/LC_MESSAGES/django.po b/aleksis/apps/alsijil/locale/uk/LC_MESSAGES/django.po
new file mode 100644
index 0000000000000000000000000000000000000000..9375b86c3d4dd90ab2cd0f6e76eebad2b5e65b9f
--- /dev/null
+++ b/aleksis/apps/alsijil/locale/uk/LC_MESSAGES/django.po
@@ -0,0 +1,1526 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2022-04-23 12:35+0000\n"
+"PO-Revision-Date: 2022-05-18 23:27+0000\n"
+"Last-Translator: Serhii Horichenko <m@sgg.im>\n"
+"Language-Team: Ukrainian <https://translate.edugit.org/projects/aleksis/"
+"aleksis-app-alsijil/uk/>\n"
+"Language: uk\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 "
+"? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > "
+"14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % "
+"100 >=11 && n % 100 <=14 )) ? 2: 3);\n"
+"X-Generator: Weblate 4.12.1\n"
+
+#: aleksis/apps/alsijil/actions.py:18
+msgid "Mark as excused"
+msgstr "Позначити як пояснений"
+
+#: aleksis/apps/alsijil/actions.py:25
+msgid "Mark as unexcused"
+msgstr "Позначити як непояснений"
+
+#: aleksis/apps/alsijil/actions.py:32
+#, python-brace-format
+msgid "Mark as {excuse_type.name}"
+msgstr "Позначити як {excuse_type.name}"
+
+#: aleksis/apps/alsijil/actions.py:48 aleksis/apps/alsijil/tables.py:29
+#: aleksis/apps/alsijil/tables.py:53 aleksis/apps/alsijil/tables.py:78
+#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:29
+msgid "Delete"
+msgstr "Видалити"
+
+#: aleksis/apps/alsijil/actions.py:68
+msgid "{} asks you to check some class register entries."
+msgstr "{} просить тебе перевірити деякі записи класного журналу."
+
+#: aleksis/apps/alsijil/actions.py:86
+#, python-brace-format
+msgid "We have successfully sent notifications to {count_teachers} persons for {count_items} lessons."
+msgstr ""
+"Ми надіслали сповіщення для {count_teachers} осіб щодо {count_items} уроків."
+
+#: aleksis/apps/alsijil/actions.py:92
+msgid "Ask teacher to check data"
+msgstr "Попросити вчителя перевірити дані"
+
+#: aleksis/apps/alsijil/data_checks.py:12
+msgid "Delete object"
+msgstr "Видалити об'єкт"
+
+#: aleksis/apps/alsijil/data_checks.py:22
+msgid "Set current groups"
+msgstr "Встановити поточні групи"
+
+#: aleksis/apps/alsijil/data_checks.py:33
+msgid "Reset personal note to defaults"
+msgstr "Скинути персональні нотатки на типові"
+
+#: aleksis/apps/alsijil/data_checks.py:45
+msgid "Ensure that there are no personal notes in cancelled lessons"
+msgstr "Переконайтеся, щоб у скасованих уроках не було особистих нотаток"
+
+#: aleksis/apps/alsijil/data_checks.py:46
+msgid "The personal note is related to a cancelled lesson."
+msgstr "У скасованого уроку є пов'язані особисті нотатки."
+
+#: aleksis/apps/alsijil/data_checks.py:73
+msgid "Ensure that 'groups_of_person' is set for every personal note"
+msgstr ""
+"Переконайтеся, що для кожної особистої нотатки установлені \"групи_осіб\""
+
+#: aleksis/apps/alsijil/data_checks.py:74
+msgid "The personal note has no group in 'groups_of_person'."
+msgstr "Ця особиста нотатка не має групи у \"групі_осіб\"."
+
+#: aleksis/apps/alsijil/data_checks.py:99
+msgid "Ensure that there are no filled out lesson documentations on holidays"
+msgstr "Переконайтеся, що на вихідні немає заповненого учбового матеріалу"
+
+#: aleksis/apps/alsijil/data_checks.py:100
+msgid "The lesson documentation is on holidays."
+msgstr "Цей учбовий матеріал є на вихідних."
+
+#: aleksis/apps/alsijil/data_checks.py:133
+msgid "Ensure that there are no filled out personal notes on holidays"
+msgstr "Переконайтеся, що на вихідні немає заповнених особистих нотаток"
+
+#: aleksis/apps/alsijil/data_checks.py:134
+msgid "The personal note is on holidays."
+msgstr "Ці особисті нотатки є на вихідних."
+
+#: aleksis/apps/alsijil/data_checks.py:162
+msgid "Ensure that there are no excused personal notes without an absence"
+msgstr "Переконайтеся, що немає особистих нотаток щодо пояснення без пропусків"
+
+#: aleksis/apps/alsijil/data_checks.py:163
+msgid "The personal note is marked as excused, but not as absent."
+msgstr "Ця персональна нотатка відмічена як пояснення, але не як пропуск."
+
+#: aleksis/apps/alsijil/filters.py:12
+msgid "After"
+msgstr "Після"
+
+#: aleksis/apps/alsijil/filters.py:13
+msgid "Before"
+msgstr "Перед"
+
+#: aleksis/apps/alsijil/filters.py:14 aleksis/apps/alsijil/forms.py:302
+#: aleksis/apps/alsijil/tables.py:116
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:227
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:189
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:220
+msgid "Subject"
+msgstr "Предмет"
+
+#: aleksis/apps/alsijil/filters.py:30
+msgid "Tardiness is lower than"
+msgstr "Запізнення менше ніж на"
+
+#: aleksis/apps/alsijil/filters.py:31
+msgid "Tardiness is bigger than"
+msgstr "Запізнення більше ніж на"
+
+#: aleksis/apps/alsijil/forms.py:47
+msgid "Homework for the next lesson"
+msgstr "Домашня робота на наступний урок"
+
+#: aleksis/apps/alsijil/forms.py:73 aleksis/apps/alsijil/forms.py:214
+#: aleksis/apps/alsijil/forms.py:301
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:219
+msgid "Group"
+msgstr "Група"
+
+#: aleksis/apps/alsijil/forms.py:79
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:190
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:221
+msgid "Teacher"
+msgstr "Викладач"
+
+#: aleksis/apps/alsijil/forms.py:96
+msgid "You can't select a group and a teacher both."
+msgstr "Ви не можете обрати одночасно групу та викладача."
+
+#: aleksis/apps/alsijil/forms.py:150 aleksis/apps/alsijil/forms.py:303
+#: aleksis/apps/alsijil/models.py:480
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:64
+msgid "Start date"
+msgstr "Дата початку"
+
+#: aleksis/apps/alsijil/forms.py:151 aleksis/apps/alsijil/forms.py:304
+#: aleksis/apps/alsijil/models.py:484
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:65
+msgid "End date"
+msgstr "Дата закінчення"
+
+#: aleksis/apps/alsijil/forms.py:152
+msgid "Start period"
+msgstr "Початок уроків"
+
+#: aleksis/apps/alsijil/forms.py:153
+msgid "End period"
+msgstr "Закінчення уроків"
+
+#: aleksis/apps/alsijil/forms.py:154 aleksis/apps/alsijil/tables.py:117
+#: aleksis/apps/alsijil/tables.py:138
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:50
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:397
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:29
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:75
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:352
+msgid "Absent"
+msgstr "Відсутній(-я)"
+
+#: aleksis/apps/alsijil/forms.py:155 aleksis/apps/alsijil/tables.py:146
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:54
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:134
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:31
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:85
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:84
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:297
+msgid "Excused"
+msgstr "Пояснено"
+
+#: aleksis/apps/alsijil/forms.py:157 aleksis/apps/alsijil/models.py:71
+#: aleksis/apps/alsijil/models.py:245
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:32
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:73
+msgid "Excuse type"
+msgstr "Тип пояснення"
+
+#: aleksis/apps/alsijil/forms.py:162
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:34
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:94
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:354
+msgid "Remarks"
+msgstr "Зауваження"
+
+#: aleksis/apps/alsijil/forms.py:227
+#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:9
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:63
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:28
+msgid "Person"
+msgstr "Особа"
+
+#: aleksis/apps/alsijil/forms.py:299
+msgid "School term"
+msgstr "Навчальний рік"
+
+#: aleksis/apps/alsijil/forms.py:300
+msgid "Has lesson documentation"
+msgstr "Має учбовий матеріал"
+
+#: aleksis/apps/alsijil/managers.py:88 aleksis/apps/alsijil/tables.py:130
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:176
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:240
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:316
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:50
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:21
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:375
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:455
+#: aleksis/apps/alsijil/util/alsijil_helpers.py:315
+msgid "Event"
+msgstr "Подія"
+
+#: aleksis/apps/alsijil/menus.py:6 aleksis/apps/alsijil/preferences.py:9
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:16
+msgid "Class register"
+msgstr "Класний журнал"
+
+#: aleksis/apps/alsijil/menus.py:16
+msgid "Current lesson"
+msgstr "Поточний урок"
+
+#: aleksis/apps/alsijil/menus.py:27
+msgid "Current week"
+msgstr "Поточний тиждень"
+
+#: aleksis/apps/alsijil/menus.py:38
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:8
+msgid "My groups"
+msgstr "Мої групи"
+
+#: aleksis/apps/alsijil/menus.py:49
+msgid "My overview"
+msgstr "Мій огляд"
+
+#: aleksis/apps/alsijil/menus.py:60
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:9
+msgid "My students"
+msgstr "Мої студенти"
+
+#: aleksis/apps/alsijil/menus.py:71
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:11
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:18
+msgid "Assign group role"
+msgstr "Призначити роль групи"
+
+#: aleksis/apps/alsijil/menus.py:82
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/all_objects.html:8
+msgid "All lessons"
+msgstr "Усі уроки"
+
+#: aleksis/apps/alsijil/menus.py:93 aleksis/apps/alsijil/models.py:72
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:30
+msgid "Excuse types"
+msgstr "Типи пояснень"
+
+#: aleksis/apps/alsijil/menus.py:104 aleksis/apps/alsijil/models.py:250
+#: aleksis/apps/alsijil/models.py:432 aleksis/apps/alsijil/tables.py:120
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:57
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:33
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:18
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:331
+msgid "Extra marks"
+msgstr "Додаткові відмітки"
+
+#: aleksis/apps/alsijil/menus.py:115
+msgid "Manage group roles"
+msgstr "Керування ролями групи"
+
+#: aleksis/apps/alsijil/model_extensions.py:190
+msgid "Can view week overview of group class register"
+msgstr "Може бачити класний журнал групи за тиждень"
+
+#: aleksis/apps/alsijil/model_extensions.py:194
+msgid "Can view lesson overview of group class register"
+msgstr "Може бачити класний журнал групи за урок"
+
+#: aleksis/apps/alsijil/model_extensions.py:196
+msgid "Can view all personal notes of a group"
+msgstr "Може бачити усі особисті нотатки групи"
+
+#: aleksis/apps/alsijil/model_extensions.py:197
+msgid "Can edit all personal notes of a group"
+msgstr "Може редагувати усі особисті нотатки групи"
+
+#: aleksis/apps/alsijil/model_extensions.py:199
+msgid "Can view all lesson documentation of a group"
+msgstr "Може бачити увесь учбовий матеріал групи"
+
+#: aleksis/apps/alsijil/model_extensions.py:202
+msgid "Can edit all lesson documentation of a group"
+msgstr "Може редагувати увесь учбовий матеріал групи"
+
+#: aleksis/apps/alsijil/model_extensions.py:204
+msgid "Can view full register of a group"
+msgstr "Може бачити класний журнал групи без обмежень"
+
+#: aleksis/apps/alsijil/model_extensions.py:206
+msgid "Can register an absence for all members of a group"
+msgstr "Може реєструвати пропуски для усіх учасників групи"
+
+#: aleksis/apps/alsijil/model_extensions.py:208
+msgid "Can assign a group role for this group"
+msgstr "Може призначати роль групи для цієї групи"
+
+#: aleksis/apps/alsijil/model_extensions.py:209
+msgid "Can register an absence for a person"
+msgstr "Може реєструвати відсутність особи"
+
+#: aleksis/apps/alsijil/models.py:50 aleksis/apps/alsijil/models.py:419
+msgid "Short name"
+msgstr "Коротке ім'я"
+
+#: aleksis/apps/alsijil/models.py:51 aleksis/apps/alsijil/models.py:420
+#: aleksis/apps/alsijil/models.py:444
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:20
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:12
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:23
+msgid "Name"
+msgstr "Повне ім'я"
+
+#: aleksis/apps/alsijil/models.py:55 aleksis/apps/alsijil/tables.py:41
+msgid "Count as absent"
+msgstr "Кількість відсутніх"
+
+#: aleksis/apps/alsijil/models.py:57
+msgid "If checked, this excuse type will be counted as a missed lesson. If not checked,it won't show up in the absence report."
+msgstr ""
+"Якщо відмічено, цей тип пояснення буде зарахований як пропущений урок. Якщо "
+"не відмічено, то без запису у звіт відсутності."
+
+#: aleksis/apps/alsijil/models.py:225 aleksis/apps/alsijil/models.py:324
+msgid "Year"
+msgstr "Рік"
+
+#: aleksis/apps/alsijil/models.py:284
+msgid "Personal note"
+msgstr "Особиста нотатка"
+
+#: aleksis/apps/alsijil/models.py:285
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:47
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:375
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:22
+msgid "Personal notes"
+msgstr "Особисті нотатки"
+
+#: aleksis/apps/alsijil/models.py:336
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:132
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:263
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:342
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:26
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:421
+msgid "Lesson topic"
+msgstr "Тема уроку"
+
+#: aleksis/apps/alsijil/models.py:337
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:133
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:269
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:347
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:34
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:422
+msgid "Homework"
+msgstr "Домашня робота"
+
+#: aleksis/apps/alsijil/models.py:338
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:134
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:275
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:351
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:42
+msgid "Group note"
+msgstr "Групова нотатка"
+
+#: aleksis/apps/alsijil/models.py:385
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/documentation.html:17
+msgid "Lesson documentation"
+msgstr "Учбовий матеріал"
+
+#: aleksis/apps/alsijil/models.py:386
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:43
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:21
+msgid "Lesson documentations"
+msgstr "Учбові матеріали"
+
+#: aleksis/apps/alsijil/models.py:431
+msgid "Extra mark"
+msgstr "Додаткова відмітка"
+
+#: aleksis/apps/alsijil/models.py:445
+msgid "Icon"
+msgstr "Іконка"
+
+#: aleksis/apps/alsijil/models.py:446
+msgid "Colour"
+msgstr "Колір"
+
+#: aleksis/apps/alsijil/models.py:452 aleksis/apps/alsijil/models.py:467
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:62
+msgid "Group role"
+msgstr "Роль групи"
+
+#: aleksis/apps/alsijil/models.py:453
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:34
+#: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:8
+#: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:9
+msgid "Group roles"
+msgstr "Ролі груп"
+
+#: aleksis/apps/alsijil/models.py:457
+msgid "Can assign group role"
+msgstr "Може призначати роль групи"
+
+#: aleksis/apps/alsijil/models.py:473
+msgid "Assigned person"
+msgstr "Призначена особа"
+
+#: aleksis/apps/alsijil/models.py:478 aleksis/apps/alsijil/tables.py:105
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:128
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:246
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:326
+msgid "Groups"
+msgstr "Групи"
+
+#: aleksis/apps/alsijil/models.py:485
+msgid "Can be left empty if end date is not clear yet"
+msgstr "Якщо немає точної кінцевої дати, можна залишити порожнім"
+
+#: aleksis/apps/alsijil/models.py:500
+msgid "Group role assignment"
+msgstr "Призначення ролі групи"
+
+#: aleksis/apps/alsijil/models.py:501
+msgid "Group role assignments"
+msgstr "Призначення ролі групи"
+
+#: aleksis/apps/alsijil/models.py:508
+msgid "Can view lesson overview"
+msgstr "Може бачити огляд уроку"
+
+#: aleksis/apps/alsijil/models.py:509
+msgid "Can view week overview"
+msgstr "Може бачити огляд тижня"
+
+#: aleksis/apps/alsijil/models.py:510
+msgid "Can view full register"
+msgstr "Може бачити повний журнал"
+
+#: aleksis/apps/alsijil/models.py:511
+msgid "Can register absence"
+msgstr "Може реєструвати пропуск"
+
+#: aleksis/apps/alsijil/models.py:512
+msgid "Can list all personal note filters"
+msgstr "Може бачити усі фільтри особистих нотаток"
+
+#: aleksis/apps/alsijil/preferences.py:17
+msgid "Block adding personal notes for cancelled lessons"
+msgstr "Блокувати додавання особистих нотаток до скасованих уроків"
+
+#: aleksis/apps/alsijil/preferences.py:25
+msgid "Allow users to view their own personal notes"
+msgstr "Дозволити користувачам переглядати власні особисті нотатки"
+
+#: aleksis/apps/alsijil/preferences.py:34
+msgid "Allow primary group owners to register future absences for students in their groups"
+msgstr ""
+"Дозволити власникам основних груп реєструвати майбутні пропуски студентів у "
+"їх групах"
+
+#: aleksis/apps/alsijil/preferences.py:43
+msgid "Allow original teachers to edit their lessons although they are substituted"
+msgstr ""
+"Дозволити початковим викладачам навіть після їх заміни редагувати свої уроки"
+
+#: aleksis/apps/alsijil/preferences.py:52
+msgid "Carry over data from first lesson period to the following lesson periods in lessons over multiple periods"
+msgstr ""
+"Переносити дані з першого уроку в розкладі на поточні уроки через декілька "
+"уроків"
+
+#: aleksis/apps/alsijil/preferences.py:55
+msgid "This will carry over data only if the data in the following periods are empty."
+msgstr "Це перенесе дані лише в тому разі, коли в поточних уроках даних немає."
+
+#: aleksis/apps/alsijil/preferences.py:63
+msgid "Carry over personal notes to all following lesson periods on the same day."
+msgstr "Переносити особисті нотатки до всіх наступних уроків того ж дня."
+
+#: aleksis/apps/alsijil/preferences.py:72
+msgid "Allow teachers to open lesson periods on the same day and not just at the beginning of the period"
+msgstr ""
+"Дозволити викладачам відкривати уроки того самого дня і не лише на початку "
+"уроків"
+
+#: aleksis/apps/alsijil/preferences.py:76
+msgid "Lessons in the past are not affected by this setting, you can open them whenever you want."
+msgstr ""
+"Ці налаштування не впливають на минулі уроки. Ви можете відкривати їх "
+"будь-коли."
+
+#: aleksis/apps/alsijil/preferences.py:85
+msgid "Allow teachers to add data for lessons in holidays"
+msgstr ""
+"Дозволити викладачам додавати навчальний матеріал (дані для уроків) на "
+"вихідних"
+
+#: aleksis/apps/alsijil/preferences.py:94
+msgid "Allow group owners to assign group roles to the parents of the group's members"
+msgstr "Дозволити власникам груп призначати ролі груп батькам учасників груп"
+
+#: aleksis/apps/alsijil/preferences.py:103
+msgid "Show assigned group roles in week view"
+msgstr "Показати призначені ролі груп у тижневому огляді"
+
+#: aleksis/apps/alsijil/preferences.py:104
+msgid "Only week view of groups"
+msgstr "Лише тижневі огляди груп"
+
+#: aleksis/apps/alsijil/preferences.py:112
+msgid "Show assigned group roles in lesson view"
+msgstr "Показати призначені ролі груп в огляді уроку"
+
+#: aleksis/apps/alsijil/preferences.py:122
+msgid "Items per page in lessons table"
+msgstr "Кількість записів у розкладі на сторінку"
+
+#: aleksis/apps/alsijil/preferences.py:126
+msgid "Each page must show at least one item."
+msgstr "Кожна сторінка повинна мати принаймні один запис."
+
+#: aleksis/apps/alsijil/preferences.py:134
+msgid "Filter lessons by existence of their lesson documentation on default"
+msgstr "Типово фільтувати уроки за наявністю у них учбового матеріалу"
+
+#: aleksis/apps/alsijil/tables.py:23 aleksis/apps/alsijil/tables.py:47
+#: aleksis/apps/alsijil/tables.py:72
+#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:13
+msgid "Edit"
+msgstr "Редагувати"
+
+#: aleksis/apps/alsijil/tables.py:96
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:348
+msgid "Date"
+msgstr "Дата"
+
+#: aleksis/apps/alsijil/tables.py:99
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:21
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:126
+msgid "Period"
+msgstr "Урок"
+
+#: aleksis/apps/alsijil/tables.py:111
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:131
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:257
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:336
+msgid "Teachers"
+msgstr "Викладачі"
+
+#: aleksis/apps/alsijil/tables.py:118
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:160
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:30
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:16
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:39
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:114
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:323
+msgid "Tardiness"
+msgstr "Запізнення"
+
+#: aleksis/apps/alsijil/tables.py:119
+msgid "Excuse"
+msgstr "Пояснення"
+
+#: aleksis/apps/alsijil/tables.py:156
+#, python-brace-format
+msgid "{value}' late"
+msgstr "{value}' затримка"
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:5
+#: aleksis/apps/alsijil/templates/alsijil/absences/register.html:6
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:30
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:385
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:138
+msgid "Register absence"
+msgstr "Реєстрація відсутності"
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:5
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:6
+msgid "Confirm: Register absence"
+msgstr "Підтвердження: Реєстрація відсутності"
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:10
+msgid ""
+"\n"
+"      Do you really want to register the following absence?\n"
+"    "
+msgstr ""
+"\n"
+"      Ви дійсно хочете зареєструвати цей пропуск?\n"
+"    "
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:26
+msgid ""
+"\n"
+"                As the length of this absence is longer than one day,\n"
+"                please double check the correctness of your entry.\n"
+"              "
+msgstr ""
+"\n"
+"                Оскільки пропуск більше одного дня,\n"
+"                переконайтеся, будь ласка, двічі у точності вашого запису.\n"
+"              "
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:35
+#, python-format
+msgid " %(count)s affected lessons "
+msgstr " %(count)s залежних уроків "
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:40
+msgid ""
+"\n"
+"                  There are no affected lessons. Registering this absence won't have any effect.\n"
+"                "
+msgstr ""
+"\n"
+"                  Залежних уроків немає. Реєстрація пропуску ні на що не "
+"впливає.\n"
+"                "
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:57
+msgid "Reset status to 'not absent'"
+msgstr "Скинути статус на 'не відсутній'"
+
+#: aleksis/apps/alsijil/templates/alsijil/absences/register_confirm.html:79
+msgid "Cancel"
+msgstr "Скасувати"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:21
+msgid "Students"
+msgstr "Студенти"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:35
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:76
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:78
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:90
+msgid "Students list"
+msgstr "Список студентів"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:39
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:82
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:72
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:81
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:27
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:43
+#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:16
+#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:35
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:6
+msgid "Week view"
+msgstr "Тижневий огляд"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:45
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:90
+msgid "Roles"
+msgstr "Ролі"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:51
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:98
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:31
+#: aleksis/apps/alsijil/templates/alsijil/class_register/persons.html:50
+#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:20
+#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:42
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:82
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:97
+msgid "Generate printout"
+msgstr "Підготувати для друку"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:59
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:104
+msgid "No groups available."
+msgstr "Групи не доступні."
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/groups.html:71
+msgid "students"
+msgstr "студенти"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:5
+msgid "Lesson"
+msgstr "Урок"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:28
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:27
+msgid "Persons"
+msgstr "Особи"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:36
+msgid "Seating plan"
+msgstr "План розміщення"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:46
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:94
+msgid "Previous"
+msgstr "Попередній"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:54
+msgid "More"
+msgstr "Ще"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:87
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:93
+msgid "My previous lesson"
+msgstr "Мій попередній урок"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:98
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:104
+msgid "My next lesson"
+msgstr "Мій наступний урок"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:105
+msgid "Next"
+msgstr "Наступний"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html:161
+msgid ""
+"\n"
+"                  This lesson overlaps with holidays and can't be edited.\n"
+"                "
+msgstr ""
+"\n"
+"                  Цей урок перекриває вихідні і його не можна редагувати.\n"
+"                "
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:10
+msgid "Class register: person"
+msgstr "Класний журнал: особа"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:18
+#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:10
+msgid "Back"
+msgstr "Назад"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:22
+#, python-format
+msgid ""
+"\n"
+"      Class register overview for %(person)s\n"
+"    "
+msgstr ""
+"\n"
+"      Огляд класного журналу для %(person)s\n"
+"    "
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:50
+msgid "Statistics"
+msgstr "Статистика"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:65
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:344
+msgid "Relevant personal notes"
+msgstr "Відповідні особисті нотатки"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:68
+msgid "Filter personal notes"
+msgstr "Фільтрувати особисті нотатки"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:73
+msgid "Clear all filters"
+msgstr "Очистити фільтри"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:76
+msgid "Close"
+msgstr "Закрити"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:79
+msgid "Filter"
+msgstr "Фільтри"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:91
+msgid "Filter results"
+msgstr "Результат фільтрів"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:119
+msgid "Statistics on absences, tardiness and remarks"
+msgstr "Статистика пропусків, запізнень та зауважень"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:128
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:14
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:25
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:80
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:291
+msgid "Absences"
+msgstr "Відсутності"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:132
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:138
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:296
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:302
+msgid "thereof"
+msgstr "отже"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:140
+msgid "Without Excuse Type"
+msgstr "Без Типу Пояснення"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/person.html:150
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:102
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:81
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:313
+msgid "Unexcused"
+msgstr "Необґрунтоване"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:5
+#: aleksis/apps/alsijil/templates/alsijil/class_register/students_list.html:12
+#, python-format
+msgid "Students list: %(group)s"
+msgstr "Список студентів: %(group)s"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:54
+msgid "Select"
+msgstr "Обрати"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:62
+msgid "Toggle filters"
+msgstr "Перемикнути фільтри"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:69
+#, python-format
+msgid ""
+"CW %(week)s:\n"
+"      %(instance)s"
+msgstr ""
+"ТЖ %(week)s:\n"
+"      %(instance)s"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:293
+msgid "Unfold"
+msgstr "Розгорнути"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:360
+msgid "Visit lesson overview"
+msgstr "Перегляд відвідування уроку"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:398
+msgid "unexcused"
+msgstr "непояснене"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:401
+msgid "Summed up tardiness"
+msgstr "Сумарні запізнення"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:404
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:117
+msgid "Count of tardiness"
+msgstr "Кількість запізень"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:436
+msgid "No lessons available"
+msgstr "Немає доступних уроків"
+
+#: aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html:439
+msgid ""
+"\n"
+"            There are no lessons for the selected group or teacher in this week.\n"
+"          "
+msgstr ""
+"\n"
+"            Для обраної групи або викладача на цьому тижні уроків немає.\n"
+"          "
+
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/create.html:6
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/create.html:7
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/list.html:18
+msgid "Create excuse type"
+msgstr "Створити тип пояснення"
+
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/edit.html:6
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/edit.html:7
+msgid "Edit excuse type"
+msgstr "Редагувати тип пояснення"
+
+#: aleksis/apps/alsijil/templates/alsijil/excuse_type/warning.html:4
+#: aleksis/apps/alsijil/templates/alsijil/group_role/warning.html:4
+msgid ""
+"\n"
+"    This function should only be used to define alternatives to the default excuse which also will be counted extra.\n"
+"    Don't use this to create a default excuse or if you don't divide between different types of excuse.\n"
+"  "
+msgstr ""
+"\n"
+"    Ця функція використовується лише для визначення альтернатив до типового "
+"пояснення, яке додатково буде враховане.\n"
+"    Не користуйтеся цим для створення типового пояснення або якщо не "
+"розділяєте на типи пояснень.\n"
+"  "
+
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/create.html:6
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/create.html:7
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/list.html:14
+msgid "Create extra mark"
+msgstr "Створити додаткову позначку"
+
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/edit.html:6
+#: aleksis/apps/alsijil/templates/alsijil/extra_mark/edit.html:7
+msgid "Edit extra mark"
+msgstr "Редагувати додаткову позначку"
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:9
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:16
+#, python-format
+msgid "Assign group role for %(group)s"
+msgstr "Призначити роль групи для %(group)s"
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assign.html:34
+msgid "Assign"
+msgstr "Призначити"
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:9
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:12
+#, python-format
+msgid "Group roles for %(group)s"
+msgstr "Ролі груп для %(group)s"
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:28
+msgid "Back to my groups"
+msgstr "Назад до моїх груп"
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:36
+msgid "Assign a role to a person"
+msgstr "Призначити роль особі"
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:45
+msgid "Current roles"
+msgstr "Поточні ролі"
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:48
+msgid "All assignments"
+msgstr "Усі призначення"
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:66
+#: aleksis/apps/alsijil/templates/alsijil/group_role/assigned_list.html:83
+msgid "Actions"
+msgstr "Дії"
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/create.html:6
+#: aleksis/apps/alsijil/templates/alsijil/group_role/create.html:7
+#: aleksis/apps/alsijil/templates/alsijil/group_role/list.html:16
+msgid "Create group role"
+msgstr "Створити роль групи"
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/edit.html:6
+#: aleksis/apps/alsijil/templates/alsijil/group_role/edit.html:7
+msgid "Edit group role"
+msgstr "Редагувати роль групи"
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/edit_assignment.html:7
+#: aleksis/apps/alsijil/templates/alsijil/group_role/edit_assignment.html:8
+msgid "Edit group role assignment"
+msgstr "Редагувати призначення ролі групи"
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assigned_roles.html:31
+msgid "No one assigned."
+msgstr "Ніхто не призначений."
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assigned_roles.html:41
+msgid ""
+"\n"
+"    You can get some additional actions for each group role assignment if you click on the name of the\n"
+"    corresponding person.\n"
+"  "
+msgstr ""
+"\n"
+"    Ви можете отримати деякі додаткові дії для кожного призначення ролі "
+"групи після кліку\n"
+"     на ім'я відповідної особи.\n"
+"  "
+
+#: aleksis/apps/alsijil/templates/alsijil/group_role/partials/assignment_options.html:21
+msgid "Stop"
+msgstr "Стоп"
+
+#: aleksis/apps/alsijil/templates/alsijil/notifications/check.html:1
+msgid "Please check if the following class register entries are complete and correct:"
+msgstr ""
+"Перевірте, будь ласка, чи ці записи класного журналу повні та правильні:"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:27
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:50
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:139
+msgid "(e)"
+msgstr "(п)"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/absences.html:6
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:33
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:56
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:143
+msgid "(u)"
+msgstr "(н)"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:4
+msgid "Legend"
+msgstr "Легенда"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:7
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:71
+msgid "General"
+msgstr "Загальне"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:10
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:137
+msgid "(a)"
+msgstr "(в)"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:14
+msgid "Unexcused absences"
+msgstr "Необґрунтовані пропуски"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:26
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:49
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:138
+msgid "Sum (e)"
+msgstr "Сума (п)"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:18
+msgid "Sum of excused absences"
+msgstr "Кількість пропусків з поясненням"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:22
+msgid "Regular excused absences"
+msgstr "Регулярні пояснення пропусків"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/legend.html:41
+msgid "Excuse types (not counted as absent)"
+msgstr "Типи пояснень (не враховані як пропуски)"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:28
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:42
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:7
+#, python-format
+msgid "%(period)s. period"
+msgstr "%(period)s. урок"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/heading.html:31
+#, python-format
+msgid ""
+"\n"
+"            %(period_from)s.–%(period_to)s.  period\n"
+"          "
+msgstr ""
+"\n"
+"            %(period_from)s.–%(period_to)s.  уроки\n"
+"          "
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:8
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:10
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:136
+msgid "Save"
+msgstr "Зберегти"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:19
+#, python-format
+msgid ""
+"\n"
+"        Previous %(subject)s lesson\n"
+"      "
+msgstr ""
+"\n"
+"        Попередній урок %(subject)s\n"
+"      "
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/prev_next.html:30
+#, python-format
+msgid ""
+"\n"
+"        Next %(subject)s lesson\n"
+"      "
+msgstr ""
+"\n"
+"        Наступний урок %(subject)s\n"
+"      "
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/more.html:13
+msgid "Change history"
+msgstr "Змінити історію"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/notes.html:59
+msgid "Tardiness (in m)"
+msgstr "Запізнення (хв)"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:6
+msgid "Overview: Previous lesson"
+msgstr "Огляд: Попередній урок"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:13
+msgid "Lesson topic of previous lesson:"
+msgstr "Тема попереднього уроку:"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:20
+msgid "Homework for this lesson:"
+msgstr "Домашня робота на цей урок:"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:27
+msgid "Group notes for previous lesson:"
+msgstr "Нотатки групи на попередньому уроці:"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:34
+msgid "Absent persons:"
+msgstr "Відсутні:"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/previous_lesson.html:41
+msgid "Late persons:"
+msgstr "Запізнилися:"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:8
+#, python-format
+msgid ""
+"Seating plan for %(group)s in\n"
+"          %(room)s"
+msgstr ""
+"План розміщення %(group)s у\n"
+"          %(room)s"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:14
+#, python-format
+msgid ""
+"\n"
+"            This seating plan is taken from the parent group of %(child_group)s.\n"
+"            If you want, you can take it over for your group and then customize it.\n"
+"          "
+msgstr ""
+"\n"
+"            Цей план розміщення взятий із батьківської групи %(child_group)s."
+"\n"
+"            При необхідності, Ви можете його налаштувати під свою групу.\n"
+"          "
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:30
+msgid "Edit seating plan"
+msgstr "Редагувати план розміщення"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:37
+msgid "Copy plan and edit"
+msgstr "Скопіювати план та відредагувати"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:56
+msgid "There is no seating plan for this lesson."
+msgstr "Для цього уроку немає плану розміщення."
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:64
+#, python-format
+msgid ""
+"\n"
+"                  Create a new seating plan for %(group)s (%(subject)s) in %(room)s\n"
+"                "
+msgstr ""
+"\n"
+"                  Створити новий план розміщення %(group)s (%(subject)s) у "
+"%(room)s\n"
+"                "
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html:78
+#, python-format
+msgid ""
+"\n"
+"                    Create a new seating plan for %(group)s in %(room)s\n"
+"                  "
+msgstr ""
+"\n"
+"                    Створити новий план розміщення %(group)s у %(room)s\n"
+"                  "
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:6
+msgid "Data complete"
+msgstr "Дані заповнені"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:17
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:30
+msgid "Missing data"
+msgstr "Дані відсутні"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:19
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:32
+msgid "Pending"
+msgstr "В очікуванні"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:28
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:466
+msgid "Lesson cancelled"
+msgstr "Урок скасований"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/lesson_status.html:34
+msgid "Substitution"
+msgstr "Заміна"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:4
+msgid "Lesson filter"
+msgstr "Фільтр уроків"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:9
+msgid "Update filters"
+msgstr "Оновити фільтри"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:22
+msgid "Lesson table"
+msgstr "Розклад уроків"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/objects_table.html:31
+msgid "Execute"
+msgstr "Виконати"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:6
+msgid "No students available."
+msgstr "Немає доступних студентів."
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:13
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:24
+msgid "Primary group"
+msgstr "Основна група"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:15
+msgid "Uncounted Absences"
+msgstr "Невраховані пропуски"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:48
+msgid "Sum"
+msgstr "Сума"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:90
+msgid "Regular excused"
+msgstr "Регулярні пояснення"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:130
+msgid "Show more details"
+msgstr "Показати більш детально"
+
+#: aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html:131
+msgid "Details"
+msgstr "Деталі"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:6
+msgid "Class register:"
+msgstr "Класний журнал:"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:26
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:59
+msgid "Owners"
+msgstr "Власники"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:30
+msgid "Printed on"
+msgstr "Надруковано"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:38
+msgid ""
+"\n"
+"        This printout is intended for archival purposes. The main copy of\n"
+"        the class register is stored in the AlekSIS School Information\n"
+"        System.\n"
+"      "
+msgstr ""
+"\n"
+"        Ця роздруківка зроблена для архівних потреб. Основна копія\n"
+"        цього класного журналу зберігається в навчальній інформаційній\n"
+"         системі AlekSIS.\n"
+"      "
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:45
+msgid ""
+"\n"
+"        Copies of the class register, both digital and as printout, must\n"
+"        only be kept inside the school and/or on devices authorised by the\n"
+"        school.\n"
+"      "
+msgstr ""
+"\n"
+"        Копії цього класного журналу, в т.ч. цифрові та друковані, повинні\n"
+"        зберігатися лише всередині навчального закладу та/або на пристроях,\n"
+"        дозволених адміністрацією цього навчального закладу.\n"
+"      "
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:52
+msgid ""
+"\n"
+"        The owner of the group and the headteacher confirm the above, as\n"
+"        well as the correctness of this printout.\n"
+"      "
+msgstr ""
+"\n"
+"        Власник групи та директор погоджують зазначене вище, \n"
+"        а також правильність цієї роздруківки.\n"
+"      "
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:62
+msgid "Headteacher"
+msgstr "Директор"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:69
+msgid "Abbreviations"
+msgstr "Скорочення"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:78
+msgid "Late"
+msgstr "Запізнення"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:89
+msgid "Custom excuse types"
+msgstr "Користувацькі типи пояснень"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:101
+msgid "Custom excuse types (not counted as absent)"
+msgstr "Користувацькі типи пояснень (не враховані як пропуски)"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:113
+msgid "Available extra marks"
+msgstr "Доступні додаткові відмітки"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:127
+msgid "Persons in group"
+msgstr "Особи в групі"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:132
+msgid "No."
+msgstr "â„–"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:133
+msgid "Last name"
+msgstr "Прізвище"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:134
+msgid "First name"
+msgstr "Ім'я"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:135
+msgid "Sex"
+msgstr "Стать"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:136
+msgid "Date of birth"
+msgstr "Дата народження"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:147
+msgid "(b)"
+msgstr "(з)"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:184
+msgid "Teachers and lessons in group"
+msgstr "Викладачі та уроки в групі"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:191
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:222
+msgid "Lesson start"
+msgstr "Початок уроку"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:192
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:223
+msgid "Lesson end"
+msgstr "Кінець уроку"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:193
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:224
+msgid "Per week"
+msgstr "На тиждень"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:214
+msgid "Teachers and lessons in child groups"
+msgstr "Викладачі та уроки у підлеглих групах"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:247
+msgid "Personal overview"
+msgstr "Особистий огляд"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:249
+msgid "Contact details"
+msgstr "Контактні дані"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:288
+msgid "Absences and tardiness"
+msgstr "Пропуски та запізнення"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:303
+msgid "Without excuse type"
+msgstr "Без типу пояснення"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:349
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:419
+msgid "Pe."
+msgstr "Ур."
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:350
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:420
+msgid "Subj."
+msgstr "Предм."
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:351
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:424
+msgid "Te."
+msgstr "Вч."
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:353
+msgid "Tard."
+msgstr "Зап."
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:381
+msgid "Yes"
+msgstr "Так"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:386
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:484
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:499
+msgid "e"
+msgstr "п"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:413
+msgid "Week"
+msgstr "Тиждень"
+
+#: aleksis/apps/alsijil/templates/alsijil/print/full_register.html:423
+msgid "Notes"
+msgstr "Нотатки"
+
+#: aleksis/apps/alsijil/views.py:118
+msgid "You either selected an invalid lesson or there is currently no lesson in progress."
+msgstr "Або Ви обрали неправильний урок, або зараз уроку немає."
+
+#: aleksis/apps/alsijil/views.py:151
+msgid "You are not allowed to create a lesson documentation for a lesson in the future."
+msgstr "Вам не дозволено створювати учбові матеріали для уроку у майбутньому."
+
+#: aleksis/apps/alsijil/views.py:266
+msgid "The lesson documentation has been saved."
+msgstr "Учбовий матеріал збережений."
+
+#: aleksis/apps/alsijil/views.py:300
+msgid "The personal notes have been saved."
+msgstr "Особисті нотатки збережені."
+
+#: aleksis/apps/alsijil/views.py:1079
+msgid "The absence has been saved."
+msgstr "Пропуск збережений."
+
+#: aleksis/apps/alsijil/views.py:1100
+msgid "The personal note has been deleted."
+msgstr "Особиста нотатка видалена."
+
+#: aleksis/apps/alsijil/views.py:1122
+msgid "The extra mark has been created."
+msgstr "Додаткова позначка сторена."
+
+#: aleksis/apps/alsijil/views.py:1134
+msgid "The extra mark has been saved."
+msgstr "Додаткова позначка збережена."
+
+#: aleksis/apps/alsijil/views.py:1145
+msgid "The extra mark has been deleted."
+msgstr "Додаткова позначка видалена."
+
+#: aleksis/apps/alsijil/views.py:1166
+msgid "The excuse type has been created."
+msgstr "Тип пояснення створений."
+
+#: aleksis/apps/alsijil/views.py:1178
+msgid "The excuse type has been saved."
+msgstr "Тип пояснення збережений."
+
+#: aleksis/apps/alsijil/views.py:1189
+msgid "The excuse type has been deleted."
+msgstr "Тип пояснення видалений."
+
+#: aleksis/apps/alsijil/views.py:1210
+msgid "The group role has been created."
+msgstr "Роль групи створена."
+
+#: aleksis/apps/alsijil/views.py:1222
+msgid "The group role has been saved."
+msgstr "Роль групи збережена."
+
+#: aleksis/apps/alsijil/views.py:1233
+msgid "The group role has been deleted."
+msgstr "Роль групи видалена."
+
+#: aleksis/apps/alsijil/views.py:1266 aleksis/apps/alsijil/views.py:1298
+msgid "The group role has been assigned."
+msgstr "Роль групи призначена."
+
+#: aleksis/apps/alsijil/views.py:1317
+msgid "The group role assignment has been saved."
+msgstr "Призначення ролі групи збережене."
+
+#: aleksis/apps/alsijil/views.py:1338
+msgid "The group role assignment has been stopped."
+msgstr "Призначення ролі групи зупинене."
+
+#: aleksis/apps/alsijil/views.py:1351
+msgid "The group role assignment has been deleted."
+msgstr "Призначення ролі групи видалене."
diff --git a/aleksis/apps/alsijil/migrations/0016_add_not_counted_excuse_types.py b/aleksis/apps/alsijil/migrations/0016_add_not_counted_excuse_types.py
new file mode 100644
index 0000000000000000000000000000000000000000..c45edee40fca69d73ca7edf67c816d389470f1ef
--- /dev/null
+++ b/aleksis/apps/alsijil/migrations/0016_add_not_counted_excuse_types.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.12 on 2022-03-20 10:12
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('alsijil', '0015_fix_unique_personal_note'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='excusetype',
+            name='count_as_absent',
+            field=models.BooleanField(default=True, help_text="If checked, this excuse type will be counted as a missed lesson. If not checked, it won't show up in the absence report.", verbose_name='Count as missed lesson'),
+        ),
+    ]
diff --git a/aleksis/apps/alsijil/model_extensions.py b/aleksis/apps/alsijil/model_extensions.py
index a2c9b8dc7984f7896c60f0c6439542eebb98ccc7..5b0e5ac4b1337dfdc44c97470c36cd954fc7b915 100644
--- a/aleksis/apps/alsijil/model_extensions.py
+++ b/aleksis/apps/alsijil/model_extensions.py
@@ -432,9 +432,18 @@ def generate_person_list_with_class_register_statistics(
     ).annotate(
         absences_count=Count(
             "filtered_personal_notes",
-            filter=Q(filtered_personal_notes__absent=True),
+            filter=Q(filtered_personal_notes__absent=True)
+            & ~Q(filtered_personal_notes__excuse_type__count_as_absent=False),
         ),
         excused=Count(
+            "filtered_personal_notes",
+            filter=Q(
+                filtered_personal_notes__absent=True,
+                filtered_personal_notes__excused=True,
+            )
+            & ~Q(filtered_personal_notes__excuse_type__count_as_absent=False),
+        ),
+        excused_without_excuse_type=Count(
             "filtered_personal_notes",
             filter=Q(
                 filtered_personal_notes__absent=True,
diff --git a/aleksis/apps/alsijil/models.py b/aleksis/apps/alsijil/models.py
index 1805831a1b25cbe01744f9a3a7e7a2baf7f27966..16d6c7d3e4c46ae17db133a981a17d965abe3da2 100644
--- a/aleksis/apps/alsijil/models.py
+++ b/aleksis/apps/alsijil/models.py
@@ -50,6 +50,15 @@ class ExcuseType(ExtensibleModel):
     short_name = models.CharField(max_length=255, unique=True, verbose_name=_("Short name"))
     name = models.CharField(max_length=255, unique=True, verbose_name=_("Name"))
 
+    count_as_absent = models.BooleanField(
+        default=True,
+        verbose_name=_("Count as absent"),
+        help_text=_(
+            "If checked, this excuse type will be counted as a missed lesson. If not checked,"
+            "it won't show up in the absence report."
+        ),
+    )
+
     def __str__(self):
         return f"{self.name} ({self.short_name})"
 
@@ -109,6 +118,14 @@ class RegisterObjectRelatedMixin(WeekRelatedMixin):
         else:
             return self.extra_lesson
 
+    @property
+    def register_object_key(self: Union["LessonDocumentation", "PersonalNote"]) -> str:
+        """Get a unique reference to the related object related."""
+        if self.week and self.year:
+            return f"{self.register_object.pk}_{self.week}_{self.year}"
+        else:
+            return self.register_object.pk
+
     @property
     def calendar_week(self: Union["LessonDocumentation", "PersonalNote"]) -> CalendarWeek:
         """Get the calendar week of this lesson documentation or personal note.
@@ -328,15 +345,13 @@ class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel):
     homework = models.CharField(verbose_name=_("Homework"), max_length=200, blank=True)
     group_note = models.CharField(verbose_name=_("Group note"), max_length=200, blank=True)
 
-    def _carry_over_data(self):
-        """Carry over data to directly adjacent periods in this lesson if data is not already set.
+    def carry_over_data(self, all_periods_of_lesson: LessonPeriod):
+        """Carry over data to given periods in this lesson if data is not already set.
 
-        Can be deactivated using site preference ``alsijil__carry_over``.
+        Both forms of carrying over data can be deactivated using site preferences
+        ``alsijil__carry_over_next_periods`` and ``alsijil__allow_carry_over_same_week``
+        respectively.
         """
-        all_periods_of_lesson = LessonPeriod.objects.filter(
-            lesson=self.lesson_period.lesson,
-            period__weekday=self.lesson_period.period.weekday,
-        )
         for period in all_periods_of_lesson:
             lesson_documentation = period.get_or_create_lesson_documentation(
                 CalendarWeek(week=self.week, year=self.year)
@@ -357,19 +372,24 @@ class LessonDocumentation(RegisterObjectRelatedMixin, ExtensibleModel):
                 changed = True
 
             if changed:
-                lesson_documentation.save(carry_over=False)
+                lesson_documentation.save(carry_over_next_periods=False)
 
     def __str__(self) -> str:
         return f"{self.lesson_period}, {self.date_formatted}"
 
-    def save(self, carry_over=True, *args, **kwargs):
+    def save(self, carry_over_next_periods=True, *args, **kwargs):
         if (
-            get_site_preferences()["alsijil__carry_over"]
+            get_site_preferences()["alsijil__carry_over_next_periods"]
             and (self.topic or self.homework or self.group_note)
             and self.lesson_period
-            and carry_over
+            and carry_over_next_periods
         ):
-            self._carry_over_data()
+            self.carry_over_data(
+                LessonPeriod.objects.filter(
+                    lesson=self.lesson_period.lesson,
+                    period__weekday=self.lesson_period.period.weekday,
+                )
+            )
         super().save(*args, **kwargs)
 
     class Meta:
diff --git a/aleksis/apps/alsijil/preferences.py b/aleksis/apps/alsijil/preferences.py
index 5e1a2913121adb271df2d2c9dc84846eeb9c60bb..2fd34fa7fc4f802a52ead1d2d0291789be4fb9ce 100644
--- a/aleksis/apps/alsijil/preferences.py
+++ b/aleksis/apps/alsijil/preferences.py
@@ -57,7 +57,7 @@ class EditLessonDocumentationAsOriginalTeacher(BooleanPreference):
 @site_preferences_registry.register
 class CarryOverDataToNextPeriods(BooleanPreference):
     section = alsijil
-    name = "carry_over"
+    name = "carry_over_next_periods"
     default = True
     verbose_name = _(
         "Carry over data from first lesson period to the "
@@ -66,6 +66,20 @@ class CarryOverDataToNextPeriods(BooleanPreference):
     help_text = _("This will carry over data only if the data in the following periods are empty.")
 
 
+@site_preferences_registry.register
+class AllowCarryOverLessonDocumentationToCurrentWeek(BooleanPreference):
+    section = alsijil
+    name = "allow_carry_over_same_week"
+    default = False
+    verbose_name = _(
+        "Allow carrying over data from any lesson period to all other lesson \
+                periods with the same lesson and in the same week"
+    )
+    help_text = _(
+        "This will carry over data only if the data in the aforementioned periods are empty."
+    )
+
+
 @site_preferences_registry.register
 class CarryOverPersonalNotesToNextPeriods(BooleanPreference):
     section = alsijil
diff --git a/aleksis/apps/alsijil/tables.py b/aleksis/apps/alsijil/tables.py
index 19abbc3a5d7d80ab5729086fff72dc7e8c60e59e..c82385265b37d6b37f365048b2ad8c4b6ae52cf1 100644
--- a/aleksis/apps/alsijil/tables.py
+++ b/aleksis/apps/alsijil/tables.py
@@ -37,6 +37,10 @@ class ExcuseTypeTable(tables.Table):
 
     name = tables.LinkColumn("edit_excuse_type", args=[A("id")])
     short_name = tables.Column()
+    count_as_absent = tables.BooleanColumn(
+        verbose_name=_("Count as absent"),
+        accessor="count_as_absent",
+    )
     edit = tables.LinkColumn(
         "edit_excuse_type",
         args=[A("id")],
diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html
index 08af12a757d7377747075f5952cc380e5f300595..6de367aee293d9a4c74708ebc2bdaabff775ed88 100644
--- a/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html
+++ b/aleksis/apps/alsijil/templates/alsijil/class_register/lesson.html
@@ -7,6 +7,10 @@
 {% block extra_head %}
   {{ block.super }}
   <link rel="stylesheet" href="{% static 'css/alsijil/lesson.css' %}"/>
+
+  {% if with_seating_plan %}
+    <link rel="stylesheet" href="{% static "css/stoelindeling/seating_plan.css" %}">
+  {% endif %}
 {% endblock %}
 
 {% block nav_content %}
@@ -25,6 +29,14 @@
         </a>
       </li>
     {% endif %}
+    {% if with_seating_plan %}
+      <li class="tab">
+        <a href="#seating-plan">
+          <i class="material-icons">event_seat</i>
+          {% trans "Seating plan" %}
+        </a>
+      </li>
+    {% endif %}
     {% if prev_lesson %}
       {% has_perm "alsijil.view_lessondocumentation_rule" user prev_lesson as can_view_prev_lesson_documentation %}
       {% if prev_lesson.get_lesson_documentation and can_view_prev_lesson_documentation %}
@@ -125,6 +137,12 @@
           </div>
         {% endif %}
 
+        {% if with_seating_plan %}
+          <div class="col s12 no-padding" id="seating-plan">
+            {% include "alsijil/partials/lesson/tabs/seating_plan.html" %}
+          </div>
+        {% endif %}
+
         <div class="col s12 no-padding" id="more">
           {% include "alsijil/partials/lesson/tabs/more.html" %}
         </div>
diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/person.html b/aleksis/apps/alsijil/templates/alsijil/class_register/person.html
index 304aae60e48a0a4292848e3a10ca93f0fb42c370..d11b192fbecb27004b1cb850e0e3070239975187 100644
--- a/aleksis/apps/alsijil/templates/alsijil/class_register/person.html
+++ b/aleksis/apps/alsijil/templates/alsijil/class_register/person.html
@@ -125,30 +125,44 @@
             <div class="collapsible-body">
               <table>
                 <tr>
-                  <th colspan="2">{% trans 'Absences' %}</th>
+                  <th colspan="3">{% trans 'Absences' %}</th>
                   <td>{{ stat.absences_count }}</td>
                 </tr>
                 <tr>
-                  <td rowspan="{{ excuse_types.count|add:2 }}" class="hide-on-small-only">{% trans "thereof" %}</td>
-                  <td rowspan="{{ excuse_types.count|add:2 }}" class="hide-on-med-and-up"></td>
-                  <th class="truncate">{% trans 'Excused' %}</th>
+                  <td rowspan="{{ excuse_types.count|add:3 }}" class="hide-on-small-only">{% trans "thereof" %}</td>
+                  <td rowspan="{{ excuse_types.count|add:3 }}" class="hide-on-med-and-up"></td>
+                  <th colspan="2">{% trans 'Excused' %}</th>
                   <td>{{ stat.excused }}</td>
                 </tr>
+                <tr>
+                  <td rowspan="{{ excuse_types.count|add:1 }}" class="hide-on-small-only">{% trans "thereof" %}</td>
+                  <td rowspan="{{ excuse_types.count|add:1 }}" class="hide-on-med-and-up"></td>
+                  <th colspan="2" class="truncate">{% trans 'Without Excuse Type' %}</th>
+                  <td>{{ stat.excused_no_excuse_type }}</td>
+                </tr>
                 {% for excuse_type in excuse_types %}
-                  <th>{{ excuse_type.name }}</th>
-                  <td>{{ stat|get_dict:excuse_type.count_label }}</td>
+                  <tr>
+                    <th>{{ excuse_type.name }}</th>
+                    <td>{{ stat|get_dict:excuse_type.count_label }}</td>
+                  </tr>
                 {% endfor %}
                 <tr>
-                  <th>{% trans 'Unexcused' %}</th>
+                  <th colspan="2">{% trans 'Unexcused' %}</th>
                   <td>{{ stat.unexcused }}</td>
                 </tr>
+                {% for excuse_type in excuse_types_not_absent %}
+                  <tr>
+                    <th colspan="3">{{ excuse_type.name }}</th>
+                    <td>{{ stat|get_dict:excuse_type.count_label }}</td>
+                  </tr>
+                  {% endfor %}
                 <tr>
-                  <th colspan="2">{% trans 'Tardiness' %}</th>
+                  <th colspan="3">{% trans 'Tardiness' %}</th>
                   <td>{{ stat.tardiness }}'/{{ stat.tardiness_count }} &times;</td>
                 </tr>
                 {% for extra_mark in extra_marks %}
                   <tr>
-                    <th colspan="2">{{ extra_mark.name }}</th>
+                    <th colspan="3">{{ extra_mark.name }}</th>
                     <td>{{ stat|get_dict:extra_mark.count_label }}</td>
                   </tr>
                 {% endfor %}
diff --git a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html
index a79e1273620035abb6532176231501231a0af0ea..4742b43208a86a35e4fcd51ea7e3ef07ddc4dee2 100644
--- a/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html
+++ b/aleksis/apps/alsijil/templates/alsijil/class_register/week_view.html
@@ -41,9 +41,9 @@
 {% endblock %}
 
 {% block content %}
-  <script type="text/javascript" src="{% static " js/helper.js" %}"></script>
+  <script type="text/javascript" src="{% static "js/helper.js" %}"></script>
   {{ week_select|json_script:"week_select" }}
-  <script type="text/javascript" src="{% static " js/chronos/week_select.js" %}"></script>
+  <script type="text/javascript" src="{% static "js/chronos/week_select.js" %}"></script>
   <div class="row">
     <div id="toggle-row" class="col s12 m8 l10 {% if lesson_periods %}pre-hidden{% endif %}">
       <form method="post" action="">
diff --git a/aleksis/apps/alsijil/templates/alsijil/partials/legend.html b/aleksis/apps/alsijil/templates/alsijil/partials/legend.html
index a2c6ba1aaee02c492155c08b902f1562b405b3a7..bf0c82d792b57943b36502f0b94dff3db193a70d 100644
--- a/aleksis/apps/alsijil/templates/alsijil/partials/legend.html
+++ b/aleksis/apps/alsijil/templates/alsijil/partials/legend.html
@@ -7,17 +7,21 @@
         <h6>{% trans "General" %}</h6>
         <ul class="collection">
           <li class="collection-item chip-height">
-            <strong>(a)</strong> {% trans "Absences" %}
+            <strong>{% trans "(a)" %}</strong> {% trans "Absences" %}
             <span class="chip secondary-color white-text right">0</span>
           </li>
           <li class="collection-item chip-height">
-            <strong>(u)</strong> {% trans "Unexcused absences" %}
+            <strong>{% trans "(u)" %}</strong> {% trans "Unexcused absences" %}
             <span class="chip red white-text right">0</span>
           </li>
           <li class="collection-item chip-height">
-            <strong>(e)</strong> {% trans "Excused absences" %}
+            <strong>{% trans "Sum (e)" %}</strong> {% trans "Sum of excused absences" %}
             <span class="chip green white-text right">0</span>
           </li>
+          <li class="collection-item chip-height">
+            <strong>{% trans "(e)" %}</strong> {% trans "Regular excused absences" %}
+            <span class="chip grey white-text right">0</span>
+          </li>
         </ul>
       </div>
 
@@ -33,6 +37,18 @@
               </li>
             {% endfor %}
           </ul>
+          {% if excuse_types_not_absent %}
+            <h6>{% trans "Excuse types (not counted as absent)" %}</h6>
+
+            <ul class="collection">
+              {% for excuse_type in excuse_types_not_absent %}
+                <li class="collection-item chip-height">
+                  <strong>({{ excuse_type.short_name }})</strong> {{ excuse_type.name }}
+                  <span class="chip grey white-text right">0</span>
+                </li>
+              {% endfor %}
+            </ul>
+          {% endif %}
         </div>
       {% endif %}
 
diff --git a/aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html b/aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html
new file mode 100644
index 0000000000000000000000000000000000000000..1dcfbed7d043b1f068e8e8f7f2f74e9028aa8de7
--- /dev/null
+++ b/aleksis/apps/alsijil/templates/alsijil/partials/lesson/tabs/seating_plan.html
@@ -0,0 +1,89 @@
+{% load i18n material_form_internal material_form time_helpers rules %}
+
+
+{% if seating_plan %}
+  <div class="card no-mobile-card">
+    <div class="card-content">
+      <div class="card-title margin-bottom">
+        {% blocktrans with group=seating_plan.group room=seating_plan.room %}Seating plan for {{ group }} in
+          {{ room }}{% endblocktrans %}
+      </div>
+      {% if seating_plan_parent %}
+        <figure class="alert primary">
+          <i class="material-icons left">info</i>
+          {% blocktrans with child_group=first_group %}
+            This seating plan is taken from the parent group of {{ child_group }}.
+            If you want, you can take it over for your group and then customize it.
+          {% endblocktrans %}
+        </figure>
+      {% endif %}
+
+      <div class="row margin-bottom no-padding">
+        <div class="col s12 no-padding">
+          {% has_perm "stoelindeling.edit_seatingplan_rule" user seating_plan as can_edit %}
+          {% has_perm "stoelindeling.copy_seatingplan_for_group_rule" user first_group as can_copy %}
+
+          {% if can_edit %}
+            <a class="btn orange waves-effect waves-light"
+               href="{% url "edit_seating_plan" seating_plan.pk %}?next={{ back_url }}#seating-plan">
+              <i class="material-icons left">edit</i>
+              {% trans "Edit seating plan" %}
+            </a>
+          {% endif %}
+          {% if can_copy and seating_plan_parent %}
+            <a class="btn orange waves-effect waves-light"
+               href="{% url "copy_seating_plan" seating_plan.pk %}?next={{ back_url }}#seating-plan">
+              <i class="material-icons left">content_copy</i>
+              {% trans "Copy plan and edit" %}
+            </a>
+          {% endif %}
+        </div>
+      </div>
+
+      <div class="row">
+        <div class="col s12">
+          {% include "stoelindeling/seating_plan/render.html" %}
+        </div>
+      </div>
+    </div>
+  </div>
+{% else %}
+  <div class="container">
+    <div class="card">
+      <div class="card-content">
+        <div class="card-title">
+          <i class="material-icons left small orange-text">warning</i>
+          {% trans "There is no seating plan for this lesson." %}
+        </div>
+        {% has_perm "stoelindeling.add_seatingplan_rule" user first_group as can_add %}
+        {% if can_add %}
+          <div class="row margin-bottom">
+            <div class="col s12">
+              <a class="btn waves-effect waves-light" href="{% url "create_seating_plan" %}?group={{ first_group.pk }}&subject={{ register_object.get_subject.pk }}&room={{ register_object.get_room.pk }}&next={{ back_url }}#seating-plan">
+                <i class="material-icons left">add</i>
+                {% blocktrans with group=first_group.name subject=register_object.get_subject.name room=register_object.get_room.name %}
+                  Create a new seating plan for {{ group }} ({{ subject }}) in {{ room }}
+                {% endblocktrans %}
+              </a>
+            </div>
+          </div>
+        {% endif %}
+        {% for parent_group in first_group.parent_groups.all %}
+          {% has_perm "stoelindeling.add_seatingplan_rule" user parent_group as can_add %}
+          {% if can_add %}
+            <div class="row">
+              <div class="col s12">
+                <a class="btn waves-effect waves-light" href="{% url "create_seating_plan" %}?group={{ parent_group.pk }}&subject={{ register_object.get_subject.pk }}&room={{ register_object.get_room.pk }}&next={{ back_url }}#seating-plan">
+                  <i class="material-icons left">add</i>
+                  {% blocktrans with group=parent_group.name room=register_object.get_room.name %}
+                    Create a new seating plan for {{ group }} in {{ room }}
+                  {% endblocktrans %}
+                </a>
+              </div>
+            </div>
+          {% endif %}
+        {% endfor %}
+      </div>
+    </div>
+  </div>
+{% endif %}
diff --git a/aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html b/aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html
index 404705dfbc3fe7cb4d6cfde5561ed2f3fb82de13..efa5bc3a89d72c75fbf5f3d1c9de5426c668270f 100644
--- a/aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html
+++ b/aleksis/apps/alsijil/templates/alsijil/partials/persons_with_stats.html
@@ -11,7 +11,8 @@
   <tr class="hide-on-med-and-down">
     <th rowspan="2">{% trans "Name" %}</th>
     <th rowspan="2">{% trans "Primary group" %}</th>
-    <th colspan="{{ excuse_types.count|add:3 }}">{% trans "Absences" %}</th>
+    <th colspan="{{ excuse_types.count|add:4 }}">{% trans "Absences" %}</th>
+    <th colspan="{{ excuse_types_not_absent.count }}">{% trans "Uncounted Absences" %}</th>
     <th rowspan="2">{% trans "Tardiness" %}</th>
     {% if extra_marks %}
       <th colspan="{{ extra_marks.count }}">{% trans "Extra marks" %}</th>
@@ -22,6 +23,7 @@
     <th class="truncate">{% trans "Name" %}</th>
     <th class="truncate">{% trans "Primary group" %}</th>
     <th class="truncate chip-height">{% trans "Absences" %}</th>
+    <th class="chip-height">{% trans "Sum (e)" %}</th>
     <th class="chip-height">{% trans "(e)" %}</th>
     {% for excuse_type in excuse_types %}
       <th class="chip-height">
@@ -29,6 +31,11 @@
       </th>
     {% endfor %}
     <th class="chip-height">{% trans "(u)" %}</th>
+    {% for excuse_type in excuse_types_not_absent %}
+      <th class="chip-height">
+        ({{ excuse_type.short_name }})
+      </th>
+    {% endfor %}
     <th class="truncate chip-height">{% trans "Tardiness" %}</th>
     {% for extra_mark in extra_marks %}
       <th class="chip-height">
@@ -39,6 +46,7 @@
   </tr>
   <tr class="hide-on-med-and-down">
     <th>{% trans "Sum" %}</th>
+    <th>{% trans "Sum (e)" %}</th>
     <th>{% trans "(e)" %}</th>
     {% for excuse_type in excuse_types %}
       <th>
@@ -46,6 +54,11 @@
       </th>
     {% endfor %}
     <th>{% trans "(u)" %}</th>
+    {% for excuse_type in excuse_types_not_absent %}
+      <th>
+        ({{ excuse_type.short_name }})
+      </th>
+    {% endfor %}
     {% for extra_mark in extra_marks %}
       <th>
         {{ extra_mark.short_name }}
@@ -73,6 +86,11 @@
         {{ person.excused }}
         </span>
       </td>
+      <td>
+        <span class="chip grey white-text" title="{% trans "Regular excused" %}">
+          {{ person.excused_without_excuse_type }}
+        </span>
+      </td>
       {% for excuse_type in excuse_types %}
         <td>
           <span class="chip grey white-text" title="{{ excuse_type.name }}">
@@ -85,6 +103,13 @@
         {{ person.unexcused }}
         </span>
       </td>
+      {% for excuse_type in excuse_types_not_absent %}
+        <td>
+          <span class="chip grey white-text" title="{{ excuse_type.name }}">
+            {{ person|get_dict:excuse_type.count_label }}
+          </span>
+        </td>
+      {% endfor %}
       <td>
         <span class="chip orange white-text" title="{% trans "Tardiness" %}">
           {% firstof person.tardiness|to_time|time:"H\h i\m"  "–" %}
diff --git a/aleksis/apps/alsijil/templates/alsijil/print/full_register.html b/aleksis/apps/alsijil/templates/alsijil/print/full_register.html
index 1f8b6132fa0dee3033c7ea466e872e2ffd61fa64..a8f7dd5c3d428c3e3d3e45324865cbd9fccab7f1 100644
--- a/aleksis/apps/alsijil/templates/alsijil/print/full_register.html
+++ b/aleksis/apps/alsijil/templates/alsijil/print/full_register.html
@@ -97,6 +97,18 @@
     </ul>
   {% endif %}
 
+  {% if excuse_types_not_absent %}
+    <h5>{% trans "Custom excuse types (not counted as absent)" %}</h5>
+
+    <ul class="collection">
+      {% for excuse_type in excuse_types_not_absent %}
+        <li class="collection-item">
+          <strong>({{ excuse_type.short_name }})</strong> {{ excuse_type.name }}
+        </li>
+      {% endfor %}
+    </ul>
+  {% endif %}
+
   {% if extra_marks %}
     <h5>{% trans "Available extra marks" %}</h5>
 
@@ -123,11 +135,15 @@
       <th>{% trans 'Sex' %}</th>
       <th>{% trans 'Date of birth' %}</th>
       <th>{% trans '(a)' %}</th>
+      <th>{% trans "Sum (e)" %}</th>
       <th>{% trans "(e)" %}</th>
       {% for excuse_type in excuse_types %}
         <th>({{ excuse_type.short_name }})</th>
       {% endfor %}
       <th>{% trans '(u)' %}</th>
+      {% for excuse_type in excuse_types_not_absent %}
+        <th>({{ excuse_type.short_name }})</th>
+      {% endfor %}
       <th>{% trans '(b)' %}</th>
       {% for extra_mark in extra_marks %}
         <th>{{ extra_mark.short_name }}</th>
@@ -145,11 +161,15 @@
         <td>{{ person.date_of_birth }}</td>
         <td>{{ person.absences_count }}</td>
         <td>{{ person.excused }}</td>
+        <td>{{ person.excused_without_excuse_type }}</td>
         {% for excuse_type in excuse_types %}
           <td>{{ person|get_dict:excuse_type.count_label }}</td>
         {% endfor %}
         <td>{{ person.unexcused }}</td>
-        <td>{{ person.tardiness }}'/{{ person.tardiness_count }} &times;</td>
+        {% for excuse_type in excuse_types_not_absent %}
+          <td>{{ person|get_dict:excuse_type.count_label }}</td>
+        {% endfor %}
+        <td>{{ person.tardiness }}'/{{ person.tardiness_count }}&times;</td>
         {% for extra_mark in extra_marks %}
           <td>{{ person|get_dict:extra_mark.count_label }}</td>
         {% endfor %}
@@ -160,7 +180,7 @@
 
   <div class="page-break">&nbsp;</div>
 
-  {% if group.lessons.all %}
+  {% if lessons %}
     <h4>{% trans 'Teachers and lessons in group' %} {{ group.name }}</h4>
 
     <table id="lessons">
@@ -190,7 +210,7 @@
 
   {% endif %}
 
-  {% if group.child_groups.all %}
+  {% if child_groups %}
     <h4>{% trans 'Teachers and lessons in child groups' %}</h4>
 
     <table id="lessons">
@@ -263,43 +283,63 @@
       </tr>
     </table>
 
-    <h5>{% trans 'Absences and tardiness' %}</h5>
-    <table>
-      <tr>
-        <th colspan="2">{% trans 'Absences' %}</th>
-        <td>{{ person.absences_count }}</td>
-      </tr>
-      <tr>
-        <td rowspan="{{ excuse_types.count|add:2 }}" style="width: 16mm;"
-            class="rotate small-print">{% trans "thereof" %}</td>
-        <th>{% trans 'Excused' %}</th>
-        <td>{{ person.excused }}</td>
-      </tr>
-      {% for excuse_type in excuse_types %}
-        <th>{{ excuse_type.name }}</th>
-        <td>{{ person|get_dict:excuse_type.count_label }}</td>
-      {% endfor %}
-      <tr>
-        <th>{% trans 'Unexcused' %}</th>
-        <td>{{ person.unexcused }}</td>
-      </tr>
-      <tr>
-        <th colspan="2">{% trans 'Tardiness' %}</th>
-        <td>{{ person.tardiness }}'/{{ person.tardiness_count }} &times;</td>
-      </tr>
-    </table>
-
-    {% if extra_marks %}
-      <h5>{% trans 'Extra marks' %}</h5>
-      <table>
-        {% for extra_mark in extra_marks %}
+    <div class="row">
+      <div class="col s6">
+        <h5>{% trans 'Absences and tardiness' %}</h5>
+        <table>
           <tr>
-            <th>{{ extra_mark.name }}</th>
-            <td>{{ person|get_dict:extra_mark.count_label }}</td>
+            <th colspan="3">{% trans 'Absences' %}</th>
+            <td>{{ person.absences_count }}</td>
           </tr>
-        {% endfor %}
-      </table>
-    {% endif %}
+          <tr>
+            <td rowspan="{{ excuse_types.count|add:3 }}" style="width: 16mm;"
+                class="rotate small-print">{% trans "thereof" %}</td>
+            <th colspan="2">{% trans 'Excused' %}</th>
+            <td>{{ person.excused }}</td>
+          </tr>
+          <tr>
+            <td rowspan="{{ excuse_types.count|add:1 }}" style="width: 16mm;"
+                class="rotate small-print">{% trans "thereof" %}</td>
+            <th>{% trans "Without excuse type" %}</th>
+            <td>{{ person.excused_without_excuse_type }}</td>
+          </tr>
+          {% for excuse_type in excuse_types %}
+            <tr>
+              <th>{{ excuse_type.name }}</th>
+              <td>{{ person|get_dict:excuse_type.count_label }}</td>
+            </tr>
+          {% endfor %}
+          <tr>
+            <th colspan="2">{% trans 'Unexcused' %}</th>
+            <td>{{ person.unexcused }}</td>
+          </tr>
+          {% for excuse_type in excuse_types_not_absent %}
+            <tr>
+              <th colspan="3">{{ excuse_type.name }}</th>
+              <td>{{ person|get_dict:excuse_type.count_label }}</td>
+            </tr>
+          {% endfor %}
+          <tr>
+            <th colspan="3">{% trans 'Tardiness' %}</th>
+            <td>{{ person.tardiness }}'/{{ person.tardiness_count }}&times;</td>
+          </tr>
+        </table>
+      </div>
+
+      <div class="col s6">
+        {% if extra_marks %}
+        <h5>{% trans 'Extra marks' %}</h5>
+        <table>
+          {% for extra_mark in extra_marks %}
+            <tr>
+              <th>{{ extra_mark.name }}</th>
+              <td>{{ person|get_dict:extra_mark.count_label }}</td>
+            </tr>
+          {% endfor %}
+        </table>
+      {% endif %}
+      </div>
+    </div>
 
     <h5>{% trans 'Relevant personal notes' %}</h5>
     <table class="small-print">
@@ -387,7 +427,7 @@
       <tbody>
       {% for day in week %}
         {% with register_objects_by_day|get_dict:day as register_objects %}
-          {% for register_object, documentations, notes, substitution in register_objects %}
+          {% for register_object, documentation, notes, substitution in register_objects %}
             <tr class="
                     {% if substitution %}
                       {% if substitution.cancelled %}
@@ -421,47 +461,45 @@
               </td>
               <td class="lesson-topic">
                 {% if register_object.label_ == "event" %}
-                  {{ register_object.title }}: {{ documentations.0.topic }}
+                  {{ register_object.title }}: {{ documentation.topic }}
                 {% elif substitution.cancelled %}
                   {% trans 'Lesson cancelled' %}
                 {% else %}
-                  {{ documentations.0.topic }}
+                  {{ documentation.topic }}
                 {% endif %}
               </td>
-              <td class="lesson-homework">{{ documentations.0.homework }}</td>
+              <td class="lesson-homework">{{ documentation.homework }}</td>
               <td class="lesson-notes">
-                {{ documentations.0.group_note }}
+                {{ documentation.group_note }}
                 {% for note in notes %}
-                  {% if group in note.groups_of_person.all %}
-                    {% if note.absent %}
-                      <span class="lesson-note-absent">
-                        {{ note.person.last_name }}, {{ note.person.first_name|slice:"0:1" }}.
-                        {% if note.excused %}
-                          <span class="lesson-note-excused">
-                            {% if note.excuse_type %}
-                              ({{ note.excuse_type.short_name }})
-                            {% else %}
-                              ({% trans 'e' %})
-                            {% endif %}
-                          </span>
-                        {% endif %}
-                      </span>
-                    {% endif %}
-                    {% if note.late %}
-                      <span class="lesson-note-late">
-                        {{ note.person.last_name }}, {{ note.person.first_name|slice:"0:1" }}.
-                        ({{ note.late }}′)
-                        {% if note.excused %}
-                          <span class="lesson-note-excused">
-                            {% if note.excuse_type %}
-                              ({{ note.excuse_type.short_name }})
-                            {% else %}
-                              ({% trans 'e' %})
-                            {% endif %}
-                          </span>
-                        {% endif %}
-                      </span>
-                    {% endif %}
+                  {% if note.absent %}
+                    <span class="lesson-note-absent">
+                      {{ note.person.last_name }}, {{ note.person.first_name|slice:"0:1" }}.
+                      {% if note.excused %}
+                        <span class="lesson-note-excused">
+                          {% if note.excuse_type %}
+                            ({{ note.excuse_type.short_name }})
+                          {% else %}
+                            ({% trans 'e' %})
+                          {% endif %}
+                        </span>
+                      {% endif %}
+                    </span>
+                  {% endif %}
+                  {% if note.late %}
+                    <span class="lesson-note-late">
+                      {{ note.person.last_name }}, {{ note.person.first_name|slice:"0:1" }}.
+                      ({{ note.late }}′)
+                      {% if note.excused %}
+                        <span class="lesson-note-excused">
+                          {% if note.excuse_type %}
+                            ({{ note.excuse_type.short_name }})
+                          {% else %}
+                            ({% trans 'e' %})
+                          {% endif %}
+                        </span>
+                      {% endif %}
+                    </span>
                   {% endif %}
                   {% for extra_mark in note.extra_marks.all %}
                     <span>
@@ -472,7 +510,7 @@
                 {% endfor %}
               </td>
               <td class="lesson-te">
-                {% if documentations.0.topic %}
+                {% if documentation.topic %}
                   {{ register_object.get_teachers.first.short_name }}
                 {% endif %}
               </td>
diff --git a/aleksis/apps/alsijil/views.py b/aleksis/apps/alsijil/views.py
index de3866e0b4ecb62cffd2fc0223c1383f70772c30..c1ef90f6998d6426239141aa0dc7e40495303836 100644
--- a/aleksis/apps/alsijil/views.py
+++ b/aleksis/apps/alsijil/views.py
@@ -3,6 +3,7 @@ from copy import deepcopy
 from datetime import date, datetime, timedelta
 from typing import Any, Dict, Optional
 
+from django.apps import apps
 from django.core.exceptions import PermissionDenied
 from django.db.models import Count, Exists, FilteredRelation, OuterRef, Prefetch, Q, Sum
 from django.db.models.expressions import Case, When
@@ -185,6 +186,11 @@ def register_object(
     )
 
     if not blocked_because_holidays:
+        groups = register_object.get_groups().all()
+        if groups:
+            first_group = groups.first()
+            context["first_group"] = first_group
+
         # Group roles
         show_group_roles = request.user.person.preferences[
             "alsijil__group_roles_in_lesson_view"
@@ -192,10 +198,22 @@ def register_object(
             "alsijil.view_assigned_grouproles_for_register_object_rule", register_object
         )
         if show_group_roles:
-            groups = register_object.get_groups().all()
             group_roles = GroupRole.objects.with_assignments(date_of_lesson, groups)
             context["group_roles"] = group_roles
 
+        with_seating_plan = (
+            apps.is_installed("aleksis.apps.stoelindeling")
+            and groups
+            and request.user.has_perm("stoelindeling.view_seatingplan_for_group_rule", first_group)
+        )
+        context["with_seating_plan"] = with_seating_plan
+
+        if with_seating_plan:
+            seating_plan = register_object.seating_plan
+            context["seating_plan"] = register_object.seating_plan
+            if seating_plan and seating_plan.group != first_group:
+                context["seating_plan_parent"] = True
+
         # Create or get lesson documentation object; can be empty when first opening lesson
         lesson_documentation = register_object.get_or_create_lesson_documentation(wanted_week)
         context["has_documentation"] = bool(lesson_documentation.topic)
@@ -631,16 +649,27 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
         | Q(event__groups__parent_groups=group)
     )
     personal_notes = (
-        PersonalNote.objects.select_related("lesson_period")
-        .prefetch_related(
-            "lesson_period__substitutions", "lesson_period__lesson__teachers", "groups_of_person"
+        PersonalNote.objects.prefetch_related(
+            "lesson_period__substitutions", "lesson_period__lesson__teachers"
         )
         .not_empty()
         .filter(groups_q)
+        .filter(groups_of_person=group)
     )
-    documentations = (
-        LessonDocumentation.objects.select_related("lesson_period").not_empty().filter(groups_q)
-    )
+    documentations = LessonDocumentation.objects.not_empty().filter(groups_q)
+
+    sorted_documentations = {"extra_lesson": {}, "event": {}, "lesson_period": {}}
+    sorted_personal_notes = {"extra_lesson": {}, "event": {}, "lesson_period": {}, "person": {}}
+    for documentation in documentations:
+        key = documentation.register_object.label_
+        sorted_documentations[key][documentation.register_object_key] = documentation
+
+    for note in personal_notes:
+        key = note.register_object.label_
+        sorted_personal_notes[key].setdefault(note.register_object_key, [])
+        sorted_personal_notes[key][note.register_object_key].append(note)
+        sorted_personal_notes["person"].setdefault(note.person.pk, [])
+        sorted_personal_notes["person"][note.person.pk].append(note)
 
     # Get all lesson periods for the selected group
     lesson_periods = LessonPeriod.objects.filter_group(group).distinct()
@@ -654,8 +683,8 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
         register_objects_by_day.setdefault(day, []).append(
             (
                 extra_lesson,
-                list(filter(lambda d: d.extra_lesson == extra_lesson, documentations)),
-                list(filter(lambda d: d.extra_lesson == extra_lesson, personal_notes)),
+                sorted_documentations["extra_lesson"].get(extra_lesson.pk),
+                sorted_personal_notes["extra_lesson"].get(extra_lesson.pk, []),
                 None,
             )
         )
@@ -669,8 +698,8 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
             register_objects_by_day.setdefault(day, []).append(
                 (
                     event_copy,
-                    list(filter(lambda d: d.event == event, documentations)),
-                    list(filter(lambda d: d.event == event, personal_notes)),
+                    sorted_documentations["event"].get(event.pk),
+                    sorted_personal_notes["event"].get(event.pk, []),
                     None,
                 )
             )
@@ -689,26 +718,17 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
                 <= day
                 <= lesson_period.lesson.validity.date_end
             ):
-                filtered_documentations = list(
-                    filter(
-                        lambda d: d.week == week.week
-                        and d.year == week.year
-                        and d.lesson_period == lesson_period,
-                        documentations,
-                    )
+                filtered_documentation = sorted_documentations["lesson_period"].get(
+                    f"{lesson_period.pk}_{week.week}_{week.year}"
                 )
-                filtered_personal_notes = list(
-                    filter(
-                        lambda d: d.week == week.week
-                        and d.year == week.year
-                        and d.lesson_period == lesson_period,
-                        personal_notes,
-                    )
+                filtered_personal_notes = sorted_personal_notes["lesson_period"].get(
+                    f"{lesson_period.pk}_{week.week}_{week.year}", []
                 )
+
                 substitution = lesson_period.get_substitution(week)
 
                 register_objects_by_day.setdefault(day, []).append(
-                    (lesson_period, filtered_documentations, filtered_personal_notes, substitution)
+                    (lesson_period, filtered_documentation, filtered_personal_notes, substitution)
                 )
 
     persons = group.members.prefetch_related(None).select_related(None)
@@ -716,12 +736,13 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
 
     prefetched_persons = []
     for person in persons:
-        person.filtered_notes = list(filter(lambda d: d.person == person, personal_notes))
+        person.filtered_notes = sorted_personal_notes["person"][person.pk]
         prefetched_persons.append(person)
 
     context["school_term"] = group.school_term
     context["persons"] = prefetched_persons
-    context["excuse_types"] = ExcuseType.objects.all()
+    context["excuse_types"] = ExcuseType.objects.filter(count_as_absent=True)
+    context["excuse_types_not_absent"] = ExcuseType.objects.filter(count_as_absent=False)
     context["extra_marks"] = ExtraMark.objects.all()
     context["group"] = group
     context["weeks"] = weeks
@@ -730,15 +751,22 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
     context["today"] = date.today()
     context["lessons"] = (
         group.lessons.all()
+        .select_related(None)
+        .prefetch_related(None)
         .select_related("validity", "subject")
         .prefetch_related("teachers", "lesson_periods")
     )
-    context["child_groups"] = group.child_groups.all().prefetch_related(
-        "lessons",
-        "lessons__validity",
-        "lessons__subject",
-        "lessons__teachers",
-        "lessons__lesson_periods",
+    context["child_groups"] = (
+        group.child_groups.all()
+        .select_related(None)
+        .prefetch_related(None)
+        .prefetch_related(
+            "lessons",
+            "lessons__validity",
+            "lessons__subject",
+            "lessons__teachers",
+            "lessons__lesson_periods",
+        )
     )
     return render_pdf(request, "alsijil/print/full_register.html", context)
 
@@ -777,7 +805,8 @@ def my_students(request: HttpRequest) -> HttpResponse:
         new_groups.append((group, persons_for_group))
 
     context["groups"] = new_groups
-    context["excuse_types"] = ExcuseType.objects.all()
+    context["excuse_types"] = ExcuseType.objects.filter(count_as_absent=True)
+    context["excuse_types_not_absent"] = ExcuseType.objects.filter(count_as_absent=False)
     context["extra_marks"] = ExtraMark.objects.all()
     return render(request, "alsijil/class_register/persons.html", context)
 
@@ -807,7 +836,8 @@ class StudentsList(PermissionRequiredMixin, DetailView):
             member_of__in=self.request.user.person.owner_of.all()
         )
         context["extra_marks"] = ExtraMark.objects.all()
-        context["excuse_types"] = ExcuseType.objects.all()
+        context["excuse_types"] = ExcuseType.objects.filter(count_as_absent=True)
+        context["excuse_types_not_absent"] = ExcuseType.objects.filter(count_as_absent=False)
         return context
 
 
@@ -924,7 +954,8 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp
         note.set_object_permission_checker(checker)
         personal_notes_list.append(note)
     context["personal_notes"] = personal_notes_list
-    context["excuse_types"] = ExcuseType.objects.all()
+    context["excuse_types"] = ExcuseType.objects.filter(count_as_absent=True)
+    context["excuse_types_not_absent"] = ExcuseType.objects.filter(count_as_absent=False)
 
     form = PersonOverviewForm(request, request.POST or None, queryset=allowed_personal_notes)
     if request.method == "POST" and request.user.has_perm(
@@ -958,12 +989,19 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp
                 continue
 
             stat.update(
-                personal_notes.filter(absent=True).aggregate(absences_count=Count("absent"))
+                personal_notes.filter(absent=True)
+                .exclude(excuse_type__count_as_absent=False)
+                .aggregate(absences_count=Count("absent"))
+            )
+            stat.update(
+                personal_notes.filter(absent=True, excused=True)
+                .exclude(excuse_type__count_as_absent=False)
+                .aggregate(excused=Count("absent"))
             )
             stat.update(
-                personal_notes.filter(
-                    absent=True, excused=True, excuse_type__isnull=True
-                ).aggregate(excused=Count("absent"))
+                personal_notes.filter(absent=True, excused=True, excuse_type__isnull=True)
+                .exclude(excuse_type__count_as_absent=False)
+                .aggregate(excused_no_excuse_type=Count("absent"))
             )
             stat.update(
                 personal_notes.filter(absent=True, excused=False).aggregate(
@@ -990,7 +1028,6 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp
             stats.append((school_term, stat))
         context["stats"] = stats
 
-    context["excuse_types"] = excuse_types
     context["extra_marks"] = extra_marks
 
     # Build filter with own form and logic as django-filter can't work with different models
diff --git a/docs/_static/my_students.png b/docs/_static/my_students.png
index 895b8198e3e7144e683fd70ba4656bbd950b4e47..7473831c7f8d577f0576a022e7ce14de442b9c4a 100644
Binary files a/docs/_static/my_students.png and b/docs/_static/my_students.png differ
diff --git a/docs/admin/30_configure.rst b/docs/admin/30_configure.rst
index 22b8401d6c27c569d7381b17bf9772cb78ced504..e208afe91c18526b59f2505ef611090c430eff6f 100644
--- a/docs/admin/30_configure.rst
+++ b/docs/admin/30_configure.rst
@@ -46,4 +46,7 @@ like class representatives or ventilation services can be defined here.
 
 .. image:: ../_static/edit_group_role.png
   :width: 100%
-  :alt: Form for managing a group role
\ No newline at end of file
+  :alt: Form for managing a group role
+
+Group roles can be managed via menu entry "Manage group roles" located in
+the submenu "Class register".
diff --git a/docs/user/20_overview.rst b/docs/user/20_overview.rst
index fc550253a042c6f3fd43e64e73439b97e7e9c61e..6a44ca2372c6a19b4acd19ab1bccddcc82b7af62 100644
--- a/docs/user/20_overview.rst
+++ b/docs/user/20_overview.rst
@@ -24,7 +24,7 @@ Personal overview for students
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 This menu item provides the student with an overview of the personal notes
-such as tardiness, absences and remarks that teachers hav entered in the class register.
+such as tardiness, absences and remarks that teachers have entered in the class register.
 This enables them to quickly check whether excuses still need to be submitted,
 and to verify what notes have been made about them.
 
@@ -70,6 +70,12 @@ From each entry, you can switch to a detailed view to add specific data.
   :width: 100%
   :alt: List with all students of a teacher
 
+You are also able to create custom excuse types via the menu entry "Excuse
+types". These custom types are also shown in the statistical overview. The
+custom excuse types are also shown in the legend under the students overview
+table.
+
+
 All lessons
 -----------
 
diff --git a/tox.ini b/tox.ini
index 6ba5d926ea520a574125f4a9717b93ba0020a2c3..749e0606f4f02fcbd1649627219b15850cbc0a90 100644
--- a/tox.ini
+++ b/tox.ini
@@ -49,8 +49,8 @@ commands =
 
 [testenv:makemessages]
 commands =
-    poetry run aleksis-admin makemessages --no-wrap -e html,txt,py,email -i static -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la
-    poetry run aleksis-admin makemessages --no-wrap -d djangojs -i **/node_modules -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la
+    poetry run aleksis-admin makemessages --no-wrap -e html,txt,py,email -i static -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la -l uk -l ru
+    poetry run aleksis-admin makemessages --no-wrap -d djangojs -i **/node_modules -l ar -l de_DE -l fr -l nb_NO -l tr_TR -l la -l uk -l ru
 
 [flake8]
 max_line_length = 100