diff --git a/resources/langs/nheko_de.ts b/resources/langs/nheko_de.ts
index 5251742f0820082678ff9605837158125b10c075..cfc58189815e6e8e1e49cef4e205a61b47f6a4fc 100644
--- a/resources/langs/nheko_de.ts
+++ b/resources/langs/nheko_de.ts
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+718"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation>-- Verschlüsseltes Event (keine Schlüssel zur Entschlüsselung gefunden) --</translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation>-- Entschlüsselungsfehler (Fehler bei Kommunikation mit Datenbank) --</translation>
@@ -497,19 +491,7 @@
         <translation>-- Entschlüsselungsfehler (Fehler bei Suche nach megolm Schlüsseln in Datenbank) --</translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation>-- Entschlüsselungsfehler (%1) --</translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation>-- Verschlüsseltes Event (Unbekannter Eventtyp) --</translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation>Nachricht zurückziehen fehlgeschlagen: %1</translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation>Datei speichern</translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished">-- Verschlüsseltes Event (keine Schlüssel zur Entschlüsselung gefunden) --</translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished">-- Entschlüsselungsfehler (%1) --</translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished">-- Verschlüsseltes Event (Unbekannter Eventtyp) --</translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation>
             <numerusform>%1%2 tippt</numerusform>
@@ -544,42 +544,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -634,11 +634,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
-        <translation>Hat die Verbannung von %1 zurückgezogen.</translation>
+        <source>Unbanned %1.</source>
+        <translation type="unfinished">Hat die Verbannung von %1 zurückgezogen.</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation>%1 hat das Anklopfen zurückgezogen.</translation>
     </message>
@@ -654,12 +659,7 @@
         <translation type="unfinished">%1 hat den Raum verlassen.</translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/resources/langs/nheko_el.ts b/resources/langs/nheko_el.ts
index 0f75ca9f8636db89284bf2de7a9d9fdadb53e9d6..0d374cf55bdbc9f0d39a2093b0c0584ae99b4f76 100644
--- a/resources/langs/nheko_el.ts
+++ b/resources/langs/nheko_el.ts
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+718"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation type="unfinished"></translation>
@@ -497,19 +491,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished"></translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -544,42 +544,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -634,11 +634,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
+        <source>Unbanned %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -654,12 +659,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/resources/langs/nheko_en.ts b/resources/langs/nheko_en.ts
index f01bd5d0cec551eae88bba455604d51030da98ac..c97a4ac200bf00c75659d75dc8f1a664dee2495d 100644
--- a/resources/langs/nheko_en.ts
+++ b/resources/langs/nheko_en.ts
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+718"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation>-- Encrypted Event (No keys found for decryption) --</translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation>-- Decryption Error (failed to communicate with DB) --</translation>
@@ -497,19 +491,7 @@
         <translation>-- Decryption Error (failed to retrieve megolm keys from db) --</translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation>-- Decryption Error (%1) --</translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation>-- Encrypted Event (Unknown event type) --</translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation>Message redaction failed: %1</translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation>Save file</translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished">-- Encrypted Event (No keys found for decryption) --</translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished">-- Decryption Error (%1) --</translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished">-- Encrypted Event (Unknown event type) --</translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation>
             <numerusform>%1%2 is typing</numerusform>
@@ -544,42 +544,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -634,11 +634,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
-        <translation>Unbanned %1.</translation>
+        <source>Unbanned %1.</source>
+        <translation type="unfinished">Unbanned %1.</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation>%1 redacted their knock.</translation>
     </message>
@@ -654,12 +659,7 @@
         <translation type="unfinished">%1 left after having already left!</translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/resources/langs/nheko_fi.ts b/resources/langs/nheko_fi.ts
index 5cc9b9fe58f2a73ff3ec1691b892781c9d5963a8..8659d560a089eff53e32ad8588c7069f79a844dc 100644
--- a/resources/langs/nheko_fi.ts
+++ b/resources/langs/nheko_fi.ts
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+718"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation type="unfinished">-- Salattu viesti (salauksen purkuavaimia ei löydetty) --</translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation type="unfinished">-- Virhe purkaessa salausta (tietokannan kanssa kommunikointi epäonnistui) --</translation>
@@ -497,19 +491,7 @@
         <translation type="unfinished">-- Virhe purkaessa salausta (megolm-avaimien hakeminen tietokannasta epäonnistui) --</translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation type="unfinished">-- Virhe purkaessa salausta (%1) --</translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation type="unfinished">-- Salattu viesti (tuntematon viestityyppi) --</translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation type="unfinished">Viestin poisto epäonnistui: %1</translation>
     </message>
@@ -533,53 +515,71 @@
         <source>Save file</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished">-- Salattu viesti (salauksen purkuavaimia ei löydetty) --</translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished">-- Virhe purkaessa salausta (%1) --</translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished">-- Salattu viesti (tuntematon viestityyppi) --</translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
-        <translation type="unfinished">
+        <translation>
             <numerusform>%1%2 kirjoittaa</numerusform>
             <numerusform>%1 ja %2 kirjoittavat</numerusform>
         </translation>
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -634,11 +634,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
+        <source>Unbanned %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -654,12 +659,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/resources/langs/nheko_fr.ts b/resources/langs/nheko_fr.ts
index 7af4f89e5db7eb4204b2bccef100d5155ae41698..6efe82523e4547cc0df0ebabfe2a936cbd58c661 100644
--- a/resources/langs/nheko_fr.ts
+++ b/resources/langs/nheko_fr.ts
@@ -480,13 +480,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+718"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation type="unfinished"></translation>
@@ -498,19 +492,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -534,9 +516,27 @@
         <source>Save file</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished"></translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -545,42 +545,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -635,11 +635,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
+        <source>Unbanned %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -655,12 +660,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/resources/langs/nheko_ja.ts b/resources/langs/nheko_ja.ts
index 8ee5a05322ef01e80e4a87bdbd6579ee35da897a..05528a42e459967b734ef5dd9b33a0c604c81ea1 100644
--- a/resources/langs/nheko_ja.ts
+++ b/resources/langs/nheko_ja.ts
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+718"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation>-- 暗号化イベント (復号鍵が見つかりません) --</translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation>-- 復号エラー (データベースと通信できませんでした) --</translation>
@@ -497,19 +491,7 @@
         <translation>-- 復号エラー (データベースからmegolm鍵を取得できませんでした) --</translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation>-- 復号エラー (%1) --</translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation>-- 暗号化イベント (不明なイベント型です) --</translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation>メッセージを編集できませんでした: %1</translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation>ファイルを保存</translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished">-- 暗号化イベント (復号鍵が見つかりません) --</translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished">-- 復号エラー (%1) --</translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished">-- 暗号化イベント (不明なイベント型です) --</translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation>
             <numerusform>%1%2が入力しています</numerusform>
@@ -543,42 +543,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -633,11 +633,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
-        <translation>%1の永久追放を解除しました</translation>
+        <source>Unbanned %1.</source>
+        <translation type="unfinished">%1 の永久追放を解除しました。</translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation>%1がノックを編集しました。</translation>
     </message>
@@ -653,12 +658,7 @@
         <translation type="unfinished">退出済みの%1が退出しました!</translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/resources/langs/nheko_nl.ts b/resources/langs/nheko_nl.ts
index b07971bce6bf6c8166373b0a1b4faa04fe65d3bc..79e827146de4ecb51b514628d2868ce9f12012c5 100644
--- a/resources/langs/nheko_nl.ts
+++ b/resources/langs/nheko_nl.ts
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+718"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation type="unfinished"></translation>
@@ -497,19 +491,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation type="unfinished"></translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished"></translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -544,42 +544,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -634,11 +634,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
+        <source>Unbanned %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -654,12 +659,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/resources/langs/nheko_pl.ts b/resources/langs/nheko_pl.ts
index f28164dc5dd6fb17448a422c98ab5a3e4b99201c..774868dbc0981afeee9ed1e28d782853c5f07107 100644
--- a/resources/langs/nheko_pl.ts
+++ b/resources/langs/nheko_pl.ts
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+718"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation type="unfinished"></translation>
@@ -497,19 +491,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished"></translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -545,42 +545,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -635,11 +635,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
+        <source>Unbanned %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -655,12 +660,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/resources/langs/nheko_ru.ts b/resources/langs/nheko_ru.ts
index 8dde197e18f6aeb8f8f8dae968da2961c747a5a2..0dce43f5942e3c1248fe75e5d525e9469b824a10 100644
--- a/resources/langs/nheko_ru.ts
+++ b/resources/langs/nheko_ru.ts
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+718"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation type="unfinished"></translation>
@@ -497,19 +491,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation type="unfinished">Ошибка редактирования сообщения: %1</translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished"></translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -545,42 +545,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -635,11 +635,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
+        <source>Unbanned %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -655,12 +660,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/resources/langs/nheko_zh_CN.ts b/resources/langs/nheko_zh_CN.ts
index 3b7138bbe15d0104385d2d4dc6784dfd99cfcf07..8bd4c750b4ae0409cacf3d8a914c9f901a24fd17 100644
--- a/resources/langs/nheko_zh_CN.ts
+++ b/resources/langs/nheko_zh_CN.ts
@@ -479,13 +479,7 @@
 <context>
     <name>TimelineModel</name>
     <message>
-        <location filename="../../src/timeline/TimelineModel.cpp" line="+718"/>
-        <source>-- Encrypted Event (No keys found for decryption) --</source>
-        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+15"/>
+        <location filename="../../src/timeline/TimelineModel.cpp" line="+733"/>
         <source>-- Decryption Error (failed to communicate with DB) --</source>
         <comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
         <translation type="unfinished"></translation>
@@ -497,19 +491,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>-- Decryption Error (%1) --</source>
-        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+29"/>
-        <source>-- Encrypted Event (Unknown event type) --</source>
-        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet</comment>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+47"/>
+        <location line="+88"/>
         <source>Message redaction failed: %1</source>
         <translation type="unfinished">删除消息失败:%1</translation>
     </message>
@@ -533,9 +515,27 @@
         <source>Save file</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-582"/>
+        <source>-- Encrypted Event (No keys found for decryption) --</source>
+        <comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+46"/>
+        <source>-- Decryption Error (%1) --</source>
+        <comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+29"/>
+        <source>-- Encrypted Event (Unknown event type) --</source>
+        <comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
+        <translation type="unfinished"></translation>
+    </message>
     <message numerus="yes">
-        <location line="+129"/>
-        <source>%1 and %2 are typing</source>
+        <location line="+636"/>
+        <source>%1 and %2 are typing.</source>
         <comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
         <translation type="unfinished">
             <numerusform></numerusform>
@@ -543,42 +543,42 @@
     </message>
     <message>
         <location line="+68"/>
-        <source>%1 opened the room to the public</source>
+        <source>%1 opened the room to the public.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 made this room require and invitation to join</source>
+        <source>%1 made this room require and invitation to join.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room open to guests</source>
+        <source>%1 made the room open to guests.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+2"/>
-        <source>%1 has closed the room to guest access</source>
+        <source>%1 has closed the room to guest access.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+23"/>
-        <source>%1 made the room history world readable. Events may be now read by non-joined people</source>
+        <source>%1 made the room history world readable. Events may be now read by non-joined people.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+4"/>
-        <source>%1 set the room history visible to members from this point on</source>
+        <source>%1 set the room history visible to members from this point on.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they were invited</source>
+        <source>%1 set the room history visible to members since they were invited.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
         <location line="+3"/>
-        <source>%1 set the room history visible to members since they joined the room</source>
+        <source>%1 set the room history visible to members since they joined the room.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
@@ -633,11 +633,16 @@
     </message>
     <message>
         <location line="+2"/>
-        <source>Unbanned %1</source>
+        <source>Unbanned %1.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+3"/>
+        <location line="+14"/>
+        <source>%1 was banned.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-11"/>
         <source>%1 redacted their knock.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -653,12 +658,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location line="+7"/>
-        <source>%1 was banned</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location line="+8"/>
+        <location line="+15"/>
         <source> Reason: %1</source>
         <translation type="unfinished"></translation>
     </message>
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index e1d2e822b87656aa4cc50006b8ab3128944a7c0c..ec98da23ca729cc529b76befb05980a0ca58b9de 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -716,7 +716,7 @@ TimelineModel::decryptEvent(const mtx::events::EncryptedEvent<mtx::events::msg::
         dummy.sender           = e.sender;
         dummy.content.body =
           tr("-- Encrypted Event (No keys found for decryption) --",
-             "Placeholder, when the message was not decrypted yet or can't be decrypted")
+             "Placeholder, when the message was not decrypted yet or can't be decrypted.")
             .toStdString();
 
         try {
@@ -763,7 +763,7 @@ TimelineModel::decryptEvent(const mtx::events::EncryptedEvent<mtx::events::msg::
                 dummy.content.body =
                   tr("-- Decryption Error (%1) --",
                      "Placeholder, when the message can't be decrypted. In this case, the Olm "
-                     "decrytion returned an error, which is passed ad %1")
+                     "decrytion returned an error, which is passed ad %1.")
                     .arg(e.what())
                     .toStdString();
                 return {dummy, false};
@@ -792,7 +792,7 @@ TimelineModel::decryptEvent(const mtx::events::EncryptedEvent<mtx::events::msg::
         dummy.content.body =
           tr("-- Encrypted Event (Unknown event type) --",
              "Placeholder, when the message was decrypted, but we couldn't parse it, because "
-             "Nheko/mtxclient don't support that event type yet")
+             "Nheko/mtxclient don't support that event type yet.")
             .toStdString();
         return {dummy, false};
 }
@@ -1426,7 +1426,7 @@ QString
 TimelineModel::formatTypingUsers(const std::vector<QString> &users, QColor bg)
 {
         QString temp =
-          tr("%1 and %2 are typing",
+          tr("%1 and %2 are typing.",
              "Multiple users are typing. First argument is a comma separated list of potentially "
              "multiple users. Second argument is the last user of that list. (If only one user is "
              "typing, %1 is empty. You should still use it in your string though to silence Qt "
@@ -1494,9 +1494,9 @@ TimelineModel::formatJoinRuleEvent(QString id)
 
         switch (event->content.join_rule) {
         case mtx::events::state::JoinRule::Public:
-                return tr("%1 opened the room to the public").arg(name);
+                return tr("%1 opened the room to the public.").arg(name);
         case mtx::events::state::JoinRule::Invite:
-                return tr("%1 made this room require and invitation to join").arg(name);
+                return tr("%1 made this room require and invitation to join.").arg(name);
         default:
                 // Currently, knock and private are reserved keywords and not implemented in Matrix.
                 return "";
@@ -1519,9 +1519,9 @@ TimelineModel::formatGuestAccessEvent(QString id)
 
         switch (event->content.guest_access) {
         case mtx::events::state::AccessState::CanJoin:
-                return tr("%1 made the room open to guests").arg(name);
+                return tr("%1 made the room open to guests.").arg(name);
         case mtx::events::state::AccessState::Forbidden:
-                return tr("%1 has closed the room to guest access").arg(name);
+                return tr("%1 has closed the room to guest access.").arg(name);
         default:
                 return "";
         }
@@ -1545,16 +1545,16 @@ TimelineModel::formatHistoryVisibilityEvent(QString id)
         switch (event->content.history_visibility) {
         case mtx::events::state::Visibility::WorldReadable:
                 return tr("%1 made the room history world readable. Events may be now read by "
-                          "non-joined people")
+                          "non-joined people.")
                   .arg(name);
         case mtx::events::state::Visibility::Shared:
-                return tr("%1 set the room history visible to members from this point on")
+                return tr("%1 set the room history visible to members from this point on.")
                   .arg(name);
         case mtx::events::state::Visibility::Invited:
-                return tr("%1 set the room history visible to members since they were invited")
+                return tr("%1 set the room history visible to members since they were invited.")
                   .arg(name);
         case mtx::events::state::Visibility::Joined:
-                return tr("%1 set the room history visible to members since they joined the room")
+                return tr("%1 set the room history visible to members since they joined the room.")
                   .arg(name);
         default:
                 return "";
@@ -1661,7 +1661,7 @@ TimelineModel::formatMemberEvent(QString id)
                         else
                                 rendered = tr("Kicked %1.").arg(name);
                 } else if (prevEvent->content.membership == Membership::Ban) {
-                        rendered = tr("Unbanned %1").arg(name);
+                        rendered = tr("Unbanned %1.").arg(name);
                 } else if (prevEvent->content.membership == Membership::Knock) {
                         if (event->state_key == event->sender)
                                 rendered = tr("%1 redacted their knock.").arg(name);
@@ -1675,7 +1675,7 @@ TimelineModel::formatMemberEvent(QString id)
                 break;
 
         case Membership::Ban:
-                rendered = tr("%1 was banned").arg(name);
+                rendered = tr("%1 was banned.").arg(name);
                 break;
         case Membership::Knock:
                 rendered = tr("%1 knocked.").arg(name);