diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index d5d45a7d1bd4df1eb5b6e01046c033ee1aa17e85..ac58628a8d6618ee244eb8aba0eed3aacfd36840 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -35,6 +35,7 @@ Fixed
   in an incomplete AlekSIS frontend app.
 * GraphQL mutations did not return errors in case of exceptions.
 * Rendering of "simple" PDF templates failed when used with S3 storage.
+* Log messages on some loggers did not contain log message
 
 `3.1.2`_ - 2023-07-05
 ---------------------
diff --git a/aleksis/core/frontend/messages/de.json b/aleksis/core/frontend/messages/de.json
index 207db33feb3d4b49edb79ebae96230df241fa8fd..dd143b42332ea754758c581b844eb1d44db74d9a 100644
--- a/aleksis/core/frontend/messages/de.json
+++ b/aleksis/core/frontend/messages/de.json
@@ -74,15 +74,20 @@
   "actions": {
     "back": "Zurück",
     "cancel": "Abbrechen",
+    "clear_filters": "Filter zurücksetzen",
     "close": "Schließen",
-    "confirm_deletion": "Sind Sie sicher, dass sie dieses Objekt löschen wollen?",
+    "confirm_deletion": "Sind Sie sicher, dass Sie dieses Objekt löschen wollen?",
+    "confirm_deletion_multiple": "Sind Sie sicher, dass Sie diese Objekte löschen wollen?",
+    "create": "Hinzufügen",
     "delete": "Löschen",
     "edit": "Bearbeiten",
+    "filter": "Filter",
     "save": "Speichern",
     "search": "Suchen",
+    "select_action": "Aktion auswählen",
     "stop_editing": "Bearbeiten beenden",
-    "filter": "Filter",
-    "clear_filters": "Filter zurücksetzen"
+    "title": "Aktionen",
+    "update": "Aktualisieren"
   },
   "administration": {
     "backend_admin": {
@@ -135,8 +140,25 @@
     "notice": "Wenn der Download nicht automatisch beginnt, klicken Sie bitte auf den Button unten.",
     "title": "PDF-Datei wird heruntergeladen ..."
   },
+  "forms": {
+    "date_time": {
+      "date": "Datum",
+      "time": "Zeit"
+    },
+    "errors": {
+      "invalid_color": "Dies ist keine gültige Farbe.",
+      "invalid_date": "Dies ist kein gültiges Datum.",
+      "invalid_time": "Dies ist keine gültige Zeit.",
+      "not_a_number": "Keine gültige Nummer",
+      "not_a_whole_number": "Bitte geben Sie eine ganze Zahl ein",
+      "number_too_big": "Bitte geben Sie eine kleinere Zahl ein.",
+      "number_too_small": "Bitte geben Sie eine größere Zahl ein.",
+      "required": "Dieses Feld ist verpflichtend."
+    }
+  },
   "graphql": {
-    "snackbar_error_message": "Beim Abrufen der Seitendaten ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut."
+    "snackbar_error_message": "Beim Abrufen der Seitendaten ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.",
+    "snackbar_success_message": "Der Vorgang wurde erfolgreich beendet."
   },
   "group": {
     "additional_field": {
@@ -234,11 +256,27 @@
       "menu_title": "Konfiguration"
     }
   },
+  "rooms": {
+    "create_room": "Neuen Raum erstellen",
+    "menu_title": "Räume",
+    "name": "Name",
+    "short_name": "Kurzname",
+    "title_plural": "Räume"
+  },
   "school_term": {
+    "after": "Endet nach",
+    "before": "Beginnt vor",
+    "create_school_term": "Schuljahr erstellen",
+    "date_end": "Enddatum",
+    "date_start": "Startdatum",
     "menu_title": "Schuljahre",
+    "name": "Name",
     "title": "Schuljahr",
     "title_plural": "Schuljahre"
   },
+  "selection": {
+    "num_items_selected": "Keine Objekte ausgewählt | 1 Objekt ausgewählt | {n} Objekte ausgewählt"
+  },
   "service_worker": {
     "dismiss": "Verwerfen",
     "new_version_available": "Es ist eine neue Version der App verfügbar",
@@ -247,7 +285,20 @@
   "status": {
     "changes": "Sie haben nicht gespeicherte Änderungen.",
     "error": "Beim Speichern der letzten Änderungen ist ein Fehler aufgetreten.",
+    "object_create_success": "Das Objekt wurde erfolgreich erstellt.",
+    "object_delete_success": "Das Objekt wurde erfolgreich gelöscht.",
+    "object_edit_success": "Das Objekt wurde erfolgreich bearbeitet.",
+    "objects_delete_success": "Die Objekte wurden erfolgreich gelöscht.",
     "saved": "Alle Änderungen sind gespeichert.",
     "updating": "Änderungen werden synchronisiert."
+  },
+  "weekdays": {
+    "A_0": "Montag",
+    "A_1": "Dienstag",
+    "A_2": "Mittwoch",
+    "A_3": "Donnerstag",
+    "A_4": "Freitag",
+    "A_5": "Samstag",
+    "A_6": "Sonntag"
   }
 }
diff --git a/aleksis/core/frontend/messages/ru.json b/aleksis/core/frontend/messages/ru.json
index 161a4efd7b2dafb90d0785a3a69b224dbe6827dd..ae08b69dc0fb154702bbceb2d87a2147497d5fd6 100644
--- a/aleksis/core/frontend/messages/ru.json
+++ b/aleksis/core/frontend/messages/ru.json
@@ -61,15 +61,26 @@
         "email": "Мы отправим Вам одноразовые коды на эл.почту.",
         "generator": "Вы генерируете одноразовые коды с помощью генератора кодов.",
         "sms": "Мы отправим Вам одноразовые коды на Ваш мобильный.",
-        "webauthn": "Вы используете ключ безопасности (как внешнее устройство или встроенное в Ваше переносное устройство)."
-      }
+        "webauthn": "Вы используете ключ безопасности (как внешнее устройство или встроенное в Ваше переносное устройство).",
+        "yubikey": "Вы используете YubiKey для создания одноразовых кодов."
+      },
+      "other_devices_description": "Если Ваш основное устройство аутентификации будет недоступно во время входа, Вы можете воспользоваться одним из этих устройств:",
+      "other_devices_title": "Другие устройства аутентификации",
+      "primary_device_description": "Во время входа в систему AlekSIS попросит Вас подтвердить вход с помощью следующего устройства. Если это устройство будет недоступно, Вы сможете воспользоваться резервным устройством.",
+      "primary_device_title": "Основное устройство для аутентификации",
+      "title": "Двухфакторная аутентификация"
     }
   },
   "actions": {
     "back": "Назад",
+    "cancel": "Отменить",
     "close": "Закрыть",
+    "confirm_deletion": "Вы действительно хотите удалить этот объект?",
+    "delete": "Удалить",
     "edit": "Редактировать",
-    "search": "Поиск"
+    "save": "Сохранить",
+    "search": "Поиск",
+    "stop_editing": "Завершить редактирование"
   },
   "administration": {
     "backend_admin": {
@@ -167,6 +178,17 @@
       "title": "Приложение OAuth2",
       "title_plural": "Приложения OAuth2"
     },
+    "authorized_application": {
+      "access_since": "Доступ с {date}",
+      "description": "У упомянутых сторонних приложений есть доступ к Вашей учётной записи. Доступ, в котором больше нет необходимости или которому больше не доверяете, можете отозвать в любой момент.",
+      "has_access_to": "Имеет доступ к:",
+      "menu_title": "Приложения третьих сторон",
+      "revoke": "Отозвать доступ",
+      "revoke_question": "Вы действительно хотите отозвать доступ для этого приложения?",
+      "subtitle": "Приложения третьих сторон с доступом к Вашему аккаунту",
+      "title": "Приложения третьих сторон",
+      "valid_until": "Действует до {date}"
+    },
     "authorized_token": {
       "menu_title": "Авторизованные приложения"
     }
@@ -219,5 +241,11 @@
     "dismiss": "Отказаться",
     "new_version_available": "Доступна новая версия программы",
     "update": "Обновить"
+  },
+  "status": {
+    "changes": "У Вас есть несохранённые изменения.",
+    "error": "Во время сохранения последних изменений возникла ошибка.",
+    "saved": "Все изменения сохранены.",
+    "updating": "Изменения синхронизуются."
   }
 }
diff --git a/pyproject.toml b/pyproject.toml
index 2a38377509bcb52ce50fc57917a19d209d863618..04d8d8a9a89ae6913a4bb6bb684fbc594a71edc4 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -127,7 +127,7 @@ customidenticon = "^0.1.5"
 graphene-django = ">=3.0.0, <=3.1.2"
 selenium = "^4.4.3"
 django-vite = "^2.0.2"
-graphene-django-cud = "^0.10.0"
+graphene-django-cud = "^0.11.0"
 uwsgi = "^2.0.21"
 
 [tool.poetry.extras]