diff --git a/.ci/install.sh b/.ci/install.sh
index 8d27d301..272d3b5d 100755
--- a/.ci/install.sh
+++ b/.ci/install.sh
@@ -5,8 +5,8 @@ set -ex
if [ "$FLATPAK" ]; then
sudo apt-get -y install flatpak flatpak-builder elfutils
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
- flatpak --noninteractive install --user flathub org.kde.Platform//5.14
- flatpak --noninteractive install --user flathub org.kde.Sdk//5.14
+ flatpak --noninteractive install --user flathub org.kde.Platform//5.15
+ flatpak --noninteractive install --user flathub org.kde.Sdk//5.15
exit
fi
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
diff --git a/README.md b/README.md
index bd6e1a9e..1f17d4a3 100644
--- a/README.md
+++ b/README.md
@@ -28,6 +28,7 @@ Most of the features you would expect from a chat application are missing right
but we are getting close to a more feature complete client.
Specifically there is support for:
- E2E encryption.
+- VoIP calls (voice & video)
- User registration.
- Creating, joining & leaving rooms.
- Sending & receiving invites.
@@ -124,6 +125,13 @@ brew cask install nheko
- Boost 1.70 or greater.
- [libolm](https://gitlab.matrix.org/matrix-org/olm)
- [spdlog](https://github.com/gabime/spdlog)
+- [GStreamer](https://gitlab.freedesktop.org/gstreamer) 1.18.0 or greater (optional, needed for VoIP support).
+ - Installing the gstreamer core library plus gst-plugins-base, gst-plugins-good & gst-plugins-bad
+ is often sufficient. The qmlgl plugin though is often packaged separately. The actual plugin requirements
+ are as follows:
+ - Voice call support: dtls, opus, rtpmanager, srtp, webrtc
+ - Video call support (optional): compositor, opengl, qmlgl, rtp, vpx
+ - [libnice](https://gitlab.freedesktop.org/libnice/libnice)
- A compiler that supports C++ 17:
- Clang 6 (tested on Travis CI)
- GCC 7 (tested on Travis CI)
diff --git a/resources/langs/nheko_cs.ts b/resources/langs/nheko_cs.ts
index 3f353b51..a0371d24 100644
--- a/resources/langs/nheko_cs.ts
+++ b/resources/langs/nheko_cs.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation type="unfinished"></translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
@@ -139,7 +139,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@@ -154,7 +154,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@@ -164,7 +164,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation type="unfinished"></translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can'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="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation type="unfinished"></translation>
@@ -473,7 +473,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
@@ -508,7 +508,7 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation type="unfinished"></translation>
</message>
@@ -543,12 +543,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation type="unfinished"></translation>
</message>
@@ -653,7 +653,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation type="unfinished"></translation>
</message>
@@ -748,22 +748,23 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation type="unfinished"></translation>
</message>
@@ -783,32 +784,32 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation type="unfinished"></translation>
</message>
@@ -824,7 +825,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@@ -971,8 +972,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
@@ -1118,12 +1118,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1213,7 +1213,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2059,7 +2059,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation type="unfinished"></translation>
</message>
@@ -2069,7 +2069,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation type="unfinished"></translation>
</message>
@@ -2081,7 +2081,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2090,7 +2090,7 @@ Media size: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
diff --git a/resources/langs/nheko_de.ts b/resources/langs/nheko_de.ts
index 91d687e6..996c2de5 100644
--- a/resources/langs/nheko_de.ts
+++ b/resources/langs/nheko_de.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation type="unfinished"></translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation>Du bist dem Raum beigetreten.</translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation>Eingeladener Benutzer: %1</translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation>Das Migrieren des Caches auf die aktuelle Version ist fehlgeschlagen. Das kann verschiedene Gründe als Ursache haben. Bitte melde den Fehler und verwende in der Zwischenzeit eine ältere Version. Alternativ kannst du das Cache manuell löschen.</translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation>Raum %1 erzeugt.</translation>
</message>
@@ -139,7 +139,7 @@
<translation>Verbannung von %1 wurde aufgehoben.</translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation>Cache migration fehlgeschlagen!</translation>
</message>
@@ -154,7 +154,7 @@
<translation>Der Cache auf der Festplatte wurde mit einer neueren Nheko - Version angelegt. Bitte aktualisiere Nheko oder entferne den Cache.</translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Wiederherstellung des OLM Accounts fehlgeschlagen. Bitte logge dich erneut ein.</translation>
</message>
@@ -164,7 +164,7 @@
<translation>Gespeicherte Nachrichten konnten nicht wiederhergestellt werden. Bitte melde Dich erneut an.</translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Fehler beim Setup der Verschlüsselungsschlüssel. Servermeldung: %1 %2. Bitte versuche es später erneut.</translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation>Anwenden</translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation type="unfinished">-- Entschlüsselungsfehler (Fehler bei Suche nach megolm Schlüsseln in Datenbank) --</translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can'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="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation type="unfinished">-- Verschlüsseltes Event (Unbekannter Eventtyp) --</translation>
@@ -473,7 +473,7 @@
<translation>Matrix-ID</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation>z.B. @joe:matrix.org</translation>
</message>
@@ -512,7 +512,7 @@ Beispiel: https://mein.server:8787</translation>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation>ANMELDEN</translation>
</message>
@@ -547,12 +547,12 @@ Beispiel: https://mein.server:8787</translation>
<translation>SSO ANMELDUNG</translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation>Leeres Passwort</translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation>SSO Anmeldung fehlgeschlagen</translation>
</message>
@@ -657,7 +657,7 @@ Beispiel: https://mein.server:8787</translation>
<translation type="unfinished">Versende Datei</translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation type="unfinished">Schreibe eine Nachricht…</translation>
</message>
@@ -752,22 +752,23 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation>Benutzername</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation>Der Benutzername sollte nicht leer sein und nur aus a-z, 0-9, ., _, =, - und / bestehen.</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation>Passwort</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation>Bitte wähle ein sicheres Passwort. Die genauen Anforderungen bestimmt dein Server.</translation>
</message>
@@ -787,32 +788,32 @@ Beispiel: https://mein.server:8787</translation>
<translation>Ein Server, der Registrierungen zulässt. Weil Matrix ein dezentralisiertes Protokoll ist, musst du erst einen Server ausfindig machen oder einen persönlichen Server aufsetzen.</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation>REGISTRIEREN</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation>Keine unterstützten Registrierungsmethoden!</translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
- <translation>Ungültiger Benutzername</translation>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Passwort nicht lang genug (mind. 8 Zeichen)</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation>Passwörter stimmen nicht überein</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation>Ungültiger Servername</translation>
</message>
@@ -828,7 +829,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation>keine Version gespeichert</translation>
</message>
@@ -975,8 +976,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Nachricht zurückziehen fehlgeschlagen: %1</translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
@@ -1121,12 +1121,12 @@ Beispiel: https://mein.server:8787</translation>
<translation>%1 hat das Anklopfen zurückgezogen.</translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation>Du bist dem Raum beigetreten.</translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation>Hat das Anklopfen von %1 abgewiesen.</translation>
</message>
@@ -1216,7 +1216,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2064,7 +2064,7 @@ Medien-Größe: %2
<translation>Verschlüsselung</translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation>Ende-zu-Ende Verschlüsselung</translation>
</message>
@@ -2074,7 +2074,7 @@ Medien-Größe: %2
<translation>Verschlüsselung befindet sich momentan in einem experimentellen Stadium, unerwartete Fehler können auftreten. <br>Sie kann anschließend nicht wieder deaktiviert werden.</translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation>Schlüsselnfrage beantworten</translation>
</message>
@@ -2086,7 +2086,7 @@ Medien-Größe: %2
<translation>Ob nheko automatisch auf Anfragen mit Sessionschlüsseln antworten soll, oder nicht. Bitte mit Vorsicht nutzen, da dies eine temporäre Massnahme ist. Sie dient dem Test von E2E Verschlüsselung, bis die Geräteverifikation fertig gestellt ist.</translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation>
<numerusform>%n Teilnehmer</numerusform>
@@ -2094,7 +2094,7 @@ Medien-Größe: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation>Aktivierung der Verschlüsselung fehlgeschlagen: %1</translation>
</message>
diff --git a/resources/langs/nheko_el.ts b/resources/langs/nheko_el.ts
index 60c6b591..c7e07d77 100644
--- a/resources/langs/nheko_el.ts
+++ b/resources/langs/nheko_el.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation type="unfinished"></translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
@@ -139,7 +139,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@@ -154,7 +154,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@@ -164,7 +164,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation type="unfinished"></translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can'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="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation type="unfinished"></translation>
@@ -473,7 +473,7 @@
<translation>Matrix ID</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation>π.χ @john:matrix.org</translation>
</message>
@@ -508,7 +508,7 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation>ΕΙΣΟΔΟΣ</translation>
</message>
@@ -543,12 +543,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation>Κενός κωδικός</translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation type="unfinished"></translation>
</message>
@@ -653,7 +653,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation type="unfinished">Γράψε ένα μήνυμα...</translation>
</message>
@@ -748,22 +748,23 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation>Όνομα χρήστη</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation>Κωδικός</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation type="unfinished"></translation>
</message>
@@ -783,32 +784,32 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation>ΕΓΓΡΑΦΗ</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
- <translation>Μη έγκυρο όνομα χρήστη</translation>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Ο κωδικός δεν αποτελείται από αρκετους χαρακτήρες</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation>Οι κωδικοί δεν ταιριίαζουν</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation>Λανθασμένο όνομα διακομιστή</translation>
</message>
@@ -824,7 +825,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@@ -971,8 +972,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
@@ -1117,12 +1117,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1212,7 +1212,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2058,7 +2058,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation type="unfinished"></translation>
</message>
@@ -2068,7 +2068,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation type="unfinished"></translation>
</message>
@@ -2080,7 +2080,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2088,7 +2088,7 @@ Media size: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
diff --git a/resources/langs/nheko_en.ts b/resources/langs/nheko_en.ts
index 9859ba78..43bc3a64 100644
--- a/resources/langs/nheko_en.ts
+++ b/resources/langs/nheko_en.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation>Unmute Mic</translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation>You joined this room.</translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation>Invited user: %1</translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation>Room %1 created.</translation>
</message>
@@ -139,7 +139,7 @@
<translation>Unbanned user: %1</translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation>Cache migration failed!</translation>
</message>
@@ -154,7 +154,7 @@
<translation>The cache on your disk is newer than this version of Nheko supports. Please update or clear your cache.</translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Failed to restore OLM account. Please login again.</translation>
</message>
@@ -164,7 +164,7 @@
<translation>Failed to restore save data. Please login again.</translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation>Apply</translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation>-- Decryption Error (failed to retrieve megolm keys from db) --</translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can't be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation>-- Decryption Error (%1) --</translation>
</message>
<message>
- <location line="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation>-- Encrypted Event (Unknown event type) --</translation>
@@ -473,7 +473,7 @@
<translation>Matrix ID</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation>e.g @joe:matrix.org</translation>
</message>
@@ -512,7 +512,7 @@ Example: https://server.my:8787</translation>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation>LOGIN</translation>
</message>
@@ -547,12 +547,12 @@ Example: https://server.my:8787</translation>
<translation>SSO LOGIN</translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation>Empty password</translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation>SSO login failed</translation>
</message>
@@ -657,7 +657,7 @@ Example: https://server.my:8787</translation>
<translation type="unfinished">Send a file</translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation>Write a message…</translation>
</message>
@@ -752,22 +752,23 @@ Example: https://server.my:8787</translation>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation>Username</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation>Password</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation>Please choose a secure password. The exact requirements for password strength may depend on your server.</translation>
</message>
@@ -787,32 +788,32 @@ Example: https://server.my:8787</translation>
<translation>A server that allows registration. Since matrix is decentralized, you need to first find a server you can register on or host your own.</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation>REGISTER</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation>No supported registration flows!</translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
- <translation>Invalid username</translation>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Password is not long enough (min 8 chars)</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation>Passwords don't match</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation>Invalid server name</translation>
</message>
@@ -828,7 +829,7 @@ Example: https://server.my:8787</translation>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation>no version stored</translation>
</message>
@@ -975,8 +976,7 @@ Example: https://server.my:8787</translation>
<translation>Message redaction failed: %1</translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation>Failed to encrypt event, sending aborted!</translation>
@@ -1121,12 +1121,12 @@ Example: https://server.my:8787</translation>
<translation>%1 redacted their knock.</translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation>You joined this room.</translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation>Rejected the knock from %1.</translation>
</message>
@@ -1216,7 +1216,7 @@ Example: https://server.my:8787</translation>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2072,7 +2072,7 @@ Media size: %2
<translation>Encryption</translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation>End-to-End Encryption</translation>
</message>
@@ -2082,7 +2082,7 @@ Media size: %2
<translation>Encryption is currently experimental and things might break unexpectedly. <br>Please take note that it can't be disabled afterwards.</translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation>Respond to key requests</translation>
</message>
@@ -2096,7 +2096,7 @@ Media size: %2
E2E implementation until device verification is completed.</translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation>
<numerusform>%n member</numerusform>
@@ -2104,7 +2104,7 @@ Media size: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation>Failed to enable encryption: %1</translation>
</message>
diff --git a/resources/langs/nheko_eo.ts b/resources/langs/nheko_eo.ts
index 6cc748f7..3ea3311a 100644
--- a/resources/langs/nheko_eo.ts
+++ b/resources/langs/nheko_eo.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation type="unfinished"></translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation>Vi aliĝis ĉi tiun ĉambron.</translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translatorcomment>I believe that the -at ending is correct here.</translatorcomment>
<translation>Ĉambro %1 farit.</translation>
@@ -140,7 +140,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@@ -155,7 +155,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@@ -165,7 +165,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
@@ -262,7 +262,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation type="unfinished"></translation>
</message>
@@ -377,20 +377,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can'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="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation type="unfinished"></translation>
@@ -474,7 +474,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
@@ -512,7 +512,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translatorcomment>Maybe shouldn't be imperative?</translatorcomment>
<translation>ENSALUTU</translation>
@@ -548,12 +548,12 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation>SSO ENSALUTU</translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation type="unfinished"></translation>
</message>
@@ -658,7 +658,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished">Sendu dosieron</translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation type="unfinished">Skribu mesaĝon...</translation>
</message>
@@ -753,22 +753,23 @@ Ekzemplo: https://servisto.mia:8787</translation>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation>Uzantnomo</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation type="unfinished"></translation>
</message>
@@ -788,32 +789,32 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation type="unfinished">REGISTRU</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation type="unfinished"></translation>
</message>
@@ -829,7 +830,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@@ -979,8 +980,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
@@ -1127,12 +1127,12 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation>Vi aliĝis ĉi tiun ĉambron.</translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1222,7 +1222,7 @@ Ekzemplo: https://servisto.mia:8787</translation>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2069,7 +2069,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation type="unfinished"></translation>
</message>
@@ -2079,7 +2079,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation type="unfinished"></translation>
</message>
@@ -2091,7 +2091,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2099,7 +2099,7 @@ Media size: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
diff --git a/resources/langs/nheko_et.ts b/resources/langs/nheko_et.ts
index f4516f5d..d183b9ff 100644
--- a/resources/langs/nheko_et.ts
+++ b/resources/langs/nheko_et.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation>Lülita mikrofon sisse</translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation>Sa liitusid selle jututoaga.</translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation>Kutsutud kasutaja: %1</translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation>Puhverdatud andmete muutmine sobivaks rakenduse praeguse versiooniga ei õnnestunud. Sellel võib olla erinevaid põhjuseid. Palun saada meile veateade ja seni kasuta vanemat rakenduse versiooni. Aga kui sa soovid proovida, siis kustuta puhverdatud andmed käsitsi.</translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation>%1 jututuba on loodud.</translation>
</message>
@@ -139,7 +139,7 @@
<translation>Suhtluskeeld eemaldatud: %1</translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation>Puhvri versiooniuuendus ebaõnnestus!</translation>
</message>
@@ -154,7 +154,7 @@
<translation>Sinu andmekandjale salvestatud puhvri versioon on uuem, kui käesolev Nheko versioon kasutada oskab. Palun tee Nheko uuendus või kustuta puhverdatud andmed.</translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>OLM konto taastamine ei õnnestunud. Palun logi uuesti sisse.</translation>
</message>
@@ -164,7 +164,7 @@
<translation>Salvestatud andmete taastamine ei õnnestunud. Palun logi uuesti sisse.</translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Krüptovõtmete kasutusele võtmine ei õnnestunud. Koduserveri vastus päringule: %1 %2. Palun proovi hiljem uuesti.</translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation>Rakenda</translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation>-- Dekrüptimise viga (megolm'i võtmete laadimine andmebaasist ei õnnestunud) --</translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can't be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation>-- Dekrüptimise viga (%1) --</translation>
</message>
<message>
- <location line="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation>-- Krüptitud sündmus (Tundmatu sündmuse tüüp) --</translation>
@@ -473,7 +473,7 @@
<translation>Matrix'i kasutajatunnus</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation>näiteks @kadri:matrix.org</translation>
</message>
@@ -512,7 +512,7 @@ Näiteks: https://server.minu:8787</translation>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation>LOGI SISSE</translation>
</message>
@@ -547,12 +547,12 @@ Näiteks: https://server.minu:8787</translation>
<translation>ÜHEKORDNE SISSELOGIMINE</translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation>Tühi salasõna</translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation>Ühekordne sisselogimine ei õnnestunud</translation>
</message>
@@ -657,7 +657,7 @@ Näiteks: https://server.minu:8787</translation>
<translation type="unfinished">Saada fail</translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation>Kirjuta sõnum…</translation>
</message>
@@ -752,22 +752,23 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation>Kasutajanimi</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation>Kasutajanimi ei tohi olla tühi ning võib sisaldada vaid a-z, 0-9, ., _, =, -, / tähemärke.</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation>Salasõna</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation>Palun vali tutvaline salasõna. Täpsemad nõuded salasõnale sõltuvad sinu koduserveri seadistustest.</translation>
</message>
@@ -787,32 +788,32 @@ Näiteks: https://server.minu:8787</translation>
<translation>See on server, kus sa oma kasutajakonto registreerid. Kuna Matrix on hajutatud suhtlusvõrk, siis esmalt pead leidma sulle sobiliku koduserveri või panema püsti täitsa oma enda koduserveri.</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation>REGISTREERI</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation>Selline registreerimise töövoog pole toetatud!</translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
- <translation>Vigane kasutajanimi</translation>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Salasõna pole piisavalt pikk (vähemalt 8 tähemärki)</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation>Salasõnad ei klapi omavahel</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation>Vigane koduserveri nimi</translation>
</message>
@@ -828,7 +829,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation>salvestatud versiooni ei leidu</translation>
</message>
@@ -975,8 +976,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>Sõnumi ümbersõnastamine ebaõnnestus: %1</translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation>Sündmuse krüptimine ei õnnestunud, katkestame saatmise!</translation>
@@ -1121,12 +1121,12 @@ Näiteks: https://server.minu:8787</translation>
<translation>%1 muutis oma koputust jututoa uksele.</translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation>Sa liitusid jututoaga.</translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation>Lükkas tagasi %1 koputuse jututoa uksele.</translation>
</message>
@@ -1216,7 +1216,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2072,7 +2072,7 @@ Meedia suurus: %2
<translation>Krüptimine</translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation>Läbiv krüptimine</translation>
</message>
@@ -2082,7 +2082,7 @@ Meedia suurus: %2
<translation>Krüptimine on nhekos hetkel veel katseline ning nii mõndagi võib ootamatult katki minna. <br>Palun arvesta, et krüptimist ei saa hiljem enam välja lülitada.</translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation>Vasta krüptovõtmete päringutele</translation>
</message>
@@ -2096,7 +2096,7 @@ Meedia suurus: %2
testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.</translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation>
<numerusform>%n kasutaja</numerusform>
@@ -2104,7 +2104,7 @@ Meedia suurus: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation>Krüptimise kasutuselevõtmine ei õnnestunud: %1</translation>
</message>
diff --git a/resources/langs/nheko_fi.ts b/resources/langs/nheko_fi.ts
index 5860a7b0..66abb214 100644
--- a/resources/langs/nheko_fi.ts
+++ b/resources/langs/nheko_fi.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation type="unfinished"></translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
@@ -139,7 +139,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@@ -154,7 +154,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>OLM-tilin palauttaminen epäonnistui. Ole hyvä ja kirjaudu sisään uudelleen.</translation>
</message>
@@ -164,7 +164,7 @@
<translation>Tallennettujen tietojen palauttaminen epäonnistui. Ole hyvä ja kirjaudu sisään uudelleen.</translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Salausavainten lähetys epäonnistui. Palvelimen vastaus: %1 %2. Ole hyvä ja yritä uudelleen myöhemmin.</translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation>Tallenna</translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation>-- Virhe purkaessa salausta (megolm-avaimien hakeminen tietokannasta epäonnistui) --</translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can't be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation>-- Virhe purkaessa salausta (%1) --</translation>
</message>
<message>
- <location line="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation>-- Salattu viesti (tuntematon viestityyppi) --</translation>
@@ -473,7 +473,7 @@
<translation>Matrix-tunnus</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation>esim. @joe:matrix.org</translation>
</message>
@@ -508,7 +508,7 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation>KIRJAUDU</translation>
</message>
@@ -543,12 +543,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation>Tyhjä salasana</translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation type="unfinished"></translation>
</message>
@@ -653,7 +653,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Lähetä tiedosto</translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation>Kirjoita viesti…</translation>
</message>
@@ -748,22 +748,23 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation>Käyttäjänimi</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation>Salasana</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation type="unfinished"></translation>
</message>
@@ -783,32 +784,32 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation>REKISTERÖIDY</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
- <translation>Epäkelpo käyttäjänimi</translation>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Salasana ei ole tarpeeksi pitkä (vähintään 8 merkkiä)</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation>Salasanat eivät täsmää</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation>Epäkelpo palvelimen nimi</translation>
</message>
@@ -824,7 +825,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation>ei tallennettua versiota</translation>
</message>
@@ -971,8 +972,7 @@ Example: https://server.my:8787</source>
<translation>Viestin muokkaus epäonnistui: %1</translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
@@ -1117,12 +1117,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1212,7 +1212,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2060,7 +2060,7 @@ Median koko: %2
<translation>Salaus</translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation>Päästä-päähän-salaus</translation>
</message>
@@ -2070,7 +2070,7 @@ Median koko: %2
<translation>Salaus on tällä hetkellä kokeellinen ja asiat saattavat mennä rikki odottamattomasti.<br>Huomaa, ettei sitä voi poistaa käytöstä jälkikäteen.</translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation>Vastaa avainpyyntöihin</translation>
</message>
@@ -2084,7 +2084,7 @@ Median koko: %2
kunnes laitteiden vahvistus on valmis.</translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation>
<numerusform>%n käyttäjä</numerusform>
@@ -2092,7 +2092,7 @@ Median koko: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation>Salauksen aktivointi epäonnistui: %1</translation>
</message>
diff --git a/resources/langs/nheko_fr.ts b/resources/langs/nheko_fr.ts
index 8da64a1b..d9e6af01 100644
--- a/resources/langs/nheko_fr.ts
+++ b/resources/langs/nheko_fr.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation>Ne plus couper le micro</translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation>Vous avez rejoint ce salon.</translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation>%1 a été invité(e)</translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation>La migration du cache vers la version actuelle a échoué. Cela peut arriver pour différentes raisons. Signalez le problème et essayez d'utiliser une ancienne version en attendant. Vous pouvez également supprimer le cache manuellement.</translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation>Salon %1 créé.</translation>
</message>
@@ -139,7 +139,7 @@
<translation>%1 n'est plus banni(e)</translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation>Échec de la migration du cache !</translation>
</message>
@@ -154,7 +154,7 @@
<translation>Le cache sur votre disque est plus récent que cette version de Nheko ne supporte. Veuillez mettre à jour ou supprimer votre cache.</translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Échec de la restauration du compte OLM. Veuillez vous reconnecter.</translation>
</message>
@@ -164,7 +164,7 @@
<translation>Échec de la restauration des données sauvegardées. Veuillez vous reconnecter.</translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Échec de la configuration des clés de chiffrement. Réponse du serveur : %1 %2. Veuillez réessayer plus tard.</translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation>Appliquer</translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation>-- Échec du déchiffrement (échec de la récupération des clés megolm depuis la base de données) --</translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can't be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation>-- Erreur de déchiffrement (%1) --</translation>
</message>
<message>
- <location line="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation>-- Évènement chiffré (type d'évènement inconnu) --</translation>
@@ -473,7 +473,7 @@
<translation>Identifiant Matrix</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation>ex : @joe:matrix.org</translation>
</message>
@@ -512,7 +512,7 @@ Exemple : https ://monserveur.example.com :8787</translation>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation>CONNEXION</translation>
</message>
@@ -547,12 +547,12 @@ Exemple : https ://monserveur.example.com :8787</translation>
<translation>CONNEXION SSO</translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation>Mot de passe vide</translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation>Échec de la connexion SSO</translation>
</message>
@@ -657,7 +657,7 @@ Exemple : https ://monserveur.example.com :8787</translation>
<translation type="unfinished">Envoyer un fichier</translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation>Écrivez un message…</translation>
</message>
@@ -752,22 +752,23 @@ Exemple : https ://monserveur.example.com :8787</translation>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation>Nom d'utilisateur</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation>Le nom d'utilisateur ne doit pas être vide, et ne peut contenir que les caractères a à z, 0 à 9, et « . _ = - / ».</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation>Mot de passe</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation>Veuillez choisir un mot de passe fort. Les demandes exactes sur la robustesse du mot de passe peuvent dépendre de votre serveur.</translation>
</message>
@@ -787,32 +788,32 @@ Exemple : https ://monserveur.example.com :8787</translation>
<translation>Un serveur qui autorise les créations de compte. Matrix étant décentralisé, vous devez tout d'abord trouver un serveur sur lequel vous pouvez vous inscrire, ou bien héberger le vôtre.</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation>S'ENREGISTRER</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation>Pas de méthode d'inscription supportée !</translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
- <translation>Nom d'utilisateur invalide</translation>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Le mot de passe n'est pas assez long (8 caractères minimum)</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation>Les mots de passe ne sont pas identiques</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation>Le nom du serveur est invalide</translation>
</message>
@@ -828,7 +829,7 @@ Exemple : https ://monserveur.example.com :8787</translation>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation>pas de version enregistrée</translation>
</message>
@@ -975,8 +976,7 @@ Exemple : https ://monserveur.example.com :8787</translation>
<translation>Échec de la suppression du message : %1</translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation>Échec du chiffrement de l'évènement, envoi abandonné !</translation>
@@ -1121,12 +1121,12 @@ Exemple : https ://monserveur.example.com :8787</translation>
<translation>%1 ne frappe plus au salon.</translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation>Vous avez rejoint ce salon.</translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation>%1 a été rejeté après avoir frappé au salon.</translation>
</message>
@@ -1216,7 +1216,7 @@ Exemple : https ://monserveur.example.com :8787</translation>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2073,7 +2073,7 @@ Taille du média : %2
<translation>Chiffrement</translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation>Chiffrement bout-à-bout</translation>
</message>
@@ -2084,7 +2084,7 @@ Taille du média : %2
Veuillez noter qu'il n'est pas possible de le désactiver ultérieurement.</translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation>Répondre aux requêtes de clés</translation>
</message>
@@ -2099,7 +2099,7 @@ temporaire pour valider l'implémentation du chiffrement de bout en bout en
attendant que la vérification des appareils soit opérationnelle.</translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation>
<numerusform>%n membre</numerusform>
@@ -2107,7 +2107,7 @@ attendant que la vérification des appareils soit opérationnelle.</translation>
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation>Échec de l'activation du chiffrement  : %1</translation>
</message>
diff --git a/resources/langs/nheko_it.ts b/resources/langs/nheko_it.ts
index 8fe4120c..a3f874d7 100644
--- a/resources/langs/nheko_it.ts
+++ b/resources/langs/nheko_it.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation type="unfinished"></translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation>Sei entrato in questa stanza.</translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation>Invitato utente: %1</translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation>Migrazione della cache alla versione corrente fallita. Questo può avere diverse cause. Per favore apri una issue e nel frattempo prova ad usare una versione più vecchia. In alternativa puoi provare a cancellare la cache manualmente.</translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation>Stanza %1 creata.</translation>
</message>
@@ -139,7 +139,7 @@
<translation>Rimosso il ban dall'utente: %1</translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation>Migrazione della cache fallita!</translation>
</message>
@@ -154,7 +154,7 @@
<translation>La cache sul tuo disco è più nuova di quella supportata da questa versione di Nheko. Per favore aggiorna o pulisci la tua cache.</translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Impossibile ripristinare l'account OLM. Per favore accedi nuovamente.</translation>
</message>
@@ -164,7 +164,7 @@
<translation>Impossibile ripristinare i dati salvati. Per favore accedi nuovamente.</translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Impossibile configurare le chiavi crittografiche. Risposta del server: %1 %2. Per favore riprova in seguito.</translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation>Applica</translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation type="unfinished">-- Errore di Decrittazione (impossibile recuperare le chiavi megolm dal DB) --</translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can't be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation type="unfinished">-- Errore di Decrittazione (%1) --</translation>
</message>
<message>
- <location line="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation type="unfinished">-- Evento Criptato (Tipo di evento ignoto) --</translation>
@@ -473,7 +473,7 @@
<translation>ID Matrix</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation>es. @joe:matrix.org</translation>
</message>
@@ -512,7 +512,7 @@ Esempio: https://server.mio:8787</translation>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation>ACCEDI</translation>
</message>
@@ -547,12 +547,12 @@ Esempio: https://server.mio:8787</translation>
<translation>ACCESSO SSO</translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation>Password vuota</translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation>Accesso SSO fallito</translation>
</message>
@@ -657,7 +657,7 @@ Esempio: https://server.mio:8787</translation>
<translation type="unfinished">Invia un file</translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation type="unfinished">Scrivi un messaggio…</translation>
</message>
@@ -752,22 +752,23 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation>Nome utente</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation>Il nome utente non deve essere vuoto e deve contenere solo i caratteri a-z, 0-9, ., _, =, -, e /.</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation>Password</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation>Per favore scegli una password sicura. I requisiti di robustezza della password potrebbero dipendere dal server.</translation>
</message>
@@ -787,32 +788,32 @@ Esempio: https://server.mio:8787</translation>
<translation>Un server che consente la registrazione. Siccome matrix è decentralizzata, devi prima trovare un server su cui registrarti o ospitarne uno tuo.</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation>REGISTRATI</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation>Non ci sono processi di registrazione supportati!</translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
- <translation>Nome utente non valido</translation>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>La password non è abbastanza lunga (minimo 8 caratteri)</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation>Le password non corrispondono</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation>Nome del server non valido</translation>
</message>
@@ -828,7 +829,7 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation>nessuna versione memorizzata</translation>
</message>
@@ -975,8 +976,7 @@ Esempio: https://server.mio:8787</translation>
<translation>Oscuramento del messaggio fallito: %1</translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
@@ -1121,12 +1121,12 @@ Esempio: https://server.mio:8787</translation>
<translation>%1 ha oscurato la sua bussata.</translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation>Sei entrato in questa stanza.</translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation>Rifiutata la bussata di %1.</translation>
</message>
@@ -1216,7 +1216,7 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2064,7 +2064,7 @@ Peso media: %2
<translation>Crittografia</translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation>Crittografia End-to-End</translation>
</message>
@@ -2074,7 +2074,7 @@ Peso media: %2
<translation>La crittografia è ancora sperimentale e le cose potrebbero rompersi inaspettatamente. <br>Per favore prendi nota che in seguito non potrà essere disabilitata.</translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation>Rispondi alle richieste di chiavi</translation>
</message>
@@ -2088,7 +2088,7 @@ Peso media: %2
l'implementazione di E2E fino al completamento della verifica dei dispositivi.</translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation>
<numerusform>%n membro</numerusform>
@@ -2096,7 +2096,7 @@ Peso media: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation>Impossibile abilitare la crittografia: %1</translation>
</message>
diff --git a/resources/langs/nheko_ja.ts b/resources/langs/nheko_ja.ts
index 273f3662..6545fa6f 100644
--- a/resources/langs/nheko_ja.ts
+++ b/resources/langs/nheko_ja.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation type="unfinished"></translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation>招待されたユーザー: %1</translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
@@ -139,7 +139,7 @@
<translation>永久追放を解除されたユーザー: %1</translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@@ -154,7 +154,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>OLMアカウントを復元できませんでした。もう一度ログインして下さい。</translation>
</message>
@@ -164,7 +164,7 @@
<translation>セーブデータを復元できませんでした。もう一度ログインして下さい。</translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>暗号化鍵を設定できませんでした。サーバーの応答: %1 %2. 後でやり直して下さい。</translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation>適用</translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation type="unfinished">-- 復号エラー (データベースからmegolm鍵を取得できませんでした) --</translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can'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="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation type="unfinished">-- 暗号化イベント (不明なイベント型です) --</translation>
@@ -473,7 +473,7 @@
<translation>Matrix ID</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation>例 @joe:matrix.org</translation>
</message>
@@ -508,7 +508,7 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation>ログイン</translation>
</message>
@@ -543,12 +543,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation>パスワードが入力されていません</translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation type="unfinished"></translation>
</message>
@@ -653,7 +653,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">ファイルを送信</translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation type="unfinished">メッセージを書く...</translation>
</message>
@@ -748,22 +748,23 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation>ユーザー名</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation>パスワード</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation type="unfinished"></translation>
</message>
@@ -783,32 +784,32 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation>登録</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
- <translation>無効なユーザー名です</translation>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>パスワード長が不足しています (最小8文字)</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation>パスワードが一致しません</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation>無効なサーバー名です</translation>
</message>
@@ -824,7 +825,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation>バージョンが保存されていません</translation>
</message>
@@ -971,8 +972,7 @@ Example: https://server.my:8787</source>
<translation>メッセージを編集できませんでした: %1</translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
@@ -1116,12 +1116,12 @@ Example: https://server.my:8787</source>
<translation>%1がノックを編集しました。</translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation>%1からのノックを拒否しました。</translation>
</message>
@@ -1211,7 +1211,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2059,7 +2059,7 @@ Media size: %2
<translation>暗号化</translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation>エンドツーエンド暗号化</translation>
</message>
@@ -2069,7 +2069,7 @@ Media size: %2
<translation>暗号化機能は実験段階にあるので、予期せずに壊れるかもしれません。 <br>この機能を後から無効にできないことに注意して下さい。</translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation>鍵の要求に応答する</translation>
</message>
@@ -2083,14 +2083,14 @@ Media size: %2
これを利用する際は注意して下さい。</translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation>
<numerusform>%n人</numerusform>
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation>暗号化を有効にできませんでした: %1</translation>
</message>
diff --git a/resources/langs/nheko_nl.ts b/resources/langs/nheko_nl.ts
index 5888b7ea..29dd240b 100644
--- a/resources/langs/nheko_nl.ts
+++ b/resources/langs/nheko_nl.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation type="unfinished"></translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
@@ -139,7 +139,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@@ -154,7 +154,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@@ -164,7 +164,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation type="unfinished"></translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can'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="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation type="unfinished"></translation>
@@ -473,7 +473,7 @@
<translation>Matrix-id</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation>b.v @jan:matrix.org<</translation>
</message>
@@ -508,7 +508,7 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation>INLOGGEN</translation>
</message>
@@ -543,12 +543,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation>Leeg wachtwoord</translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation type="unfinished"></translation>
</message>
@@ -653,7 +653,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation type="unfinished">Typ een bericht...</translation>
</message>
@@ -748,22 +748,23 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation>Gebruikersnaam</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation>Wachtwoord</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation type="unfinished"></translation>
</message>
@@ -783,32 +784,32 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation>REGISTREREN</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
- <translation>Ongeldige gebruikersnaam</translation>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Het wachtwoord is niet lang genoeg (minimaal 8 tekens)</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation>De wachtwoorden komen niet overeen</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation>Ongeldige servernaam</translation>
</message>
@@ -824,7 +825,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@@ -971,8 +972,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
@@ -1117,12 +1117,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1212,7 +1212,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2060,7 +2060,7 @@ Mediagrootte: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation type="unfinished"></translation>
</message>
@@ -2070,7 +2070,7 @@ Mediagrootte: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation type="unfinished"></translation>
</message>
@@ -2082,7 +2082,7 @@ Mediagrootte: %2
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2090,7 +2090,7 @@ Mediagrootte: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
diff --git a/resources/langs/nheko_pl.ts b/resources/langs/nheko_pl.ts
index 4c765b46..330673b9 100644
--- a/resources/langs/nheko_pl.ts
+++ b/resources/langs/nheko_pl.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation type="unfinished"></translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
@@ -139,7 +139,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@@ -154,7 +154,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Nie udało się przywrócić konta OLM. Spróbuj zalogować się ponownie.</translation>
</message>
@@ -164,7 +164,7 @@
<translation>Nie udało się przywrócić zapisanych danych. Spróbuj zalogować się ponownie.</translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation type="unfinished"></translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can'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="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation type="unfinished"></translation>
@@ -473,7 +473,7 @@
<translation>ID Matrixa</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation>np. @joe:matrix.org</translation>
</message>
@@ -508,7 +508,7 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation>ZALOGUJ</translation>
</message>
@@ -543,12 +543,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation>Puste hasło</translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation type="unfinished"></translation>
</message>
@@ -653,7 +653,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Wyślij plik</translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation type="unfinished">Napisz wiadomość…</translation>
</message>
@@ -748,22 +748,23 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation>Nazwa użytkownika</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation>Hasło</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation type="unfinished"></translation>
</message>
@@ -783,32 +784,32 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation>ZAREJESTRUJ</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
- <translation>Nieprawidłowa nazwa użytkownika</translation>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Hasło jest zbyt krótkie (min. 8 znaków)</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation>Hasła nie pasują do siebie</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation>Nieprawidłowa nazwa serwera</translation>
</message>
@@ -824,7 +825,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@@ -971,8 +972,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
@@ -1118,12 +1118,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1213,7 +1213,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2061,7 +2061,7 @@ Rozmiar multimediów: %2
<translation>Szyfrowanie</translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation>Szyfrowanie end-to-end</translation>
</message>
@@ -2071,7 +2071,7 @@ Rozmiar multimediów: %2
<translation>Szyfrowanie jest obecnie eksperymentalne i może spowodować nieoczekiwane błędy. <br>Zapamiętaj, że nie może zostać później wyłączona.</translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation>Odpowiadaj na żądania o klucze</translation>
</message>
@@ -2085,7 +2085,7 @@ Rozmiar multimediów: %2
do testowania implementacji E2E, zanim weryfikacja urządzeń będzie ukończona.</translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation>
<numerusform>%n członek</numerusform>
@@ -2094,7 +2094,7 @@ Rozmiar multimediów: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation>Nie udało się włączyć szyfrowania: %1</translation>
</message>
diff --git a/resources/langs/nheko_pt_PT.ts b/resources/langs/nheko_pt_PT.ts
index 88876456..64b57a94 100644
--- a/resources/langs/nheko_pt_PT.ts
+++ b/resources/langs/nheko_pt_PT.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation type="unfinished"></translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
@@ -139,7 +139,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@@ -154,7 +154,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@@ -164,7 +164,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation type="unfinished"></translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can'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="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation type="unfinished"></translation>
@@ -473,7 +473,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
@@ -508,7 +508,7 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation type="unfinished"></translation>
</message>
@@ -543,12 +543,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation type="unfinished"></translation>
</message>
@@ -653,7 +653,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation type="unfinished"></translation>
</message>
@@ -748,22 +748,23 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation type="unfinished"></translation>
</message>
@@ -783,32 +784,32 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation type="unfinished"></translation>
</message>
@@ -824,7 +825,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@@ -971,8 +972,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
@@ -1117,12 +1117,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1212,7 +1212,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2058,7 +2058,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation type="unfinished"></translation>
</message>
@@ -2068,7 +2068,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation type="unfinished"></translation>
</message>
@@ -2080,7 +2080,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2088,7 +2088,7 @@ Media size: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
diff --git a/resources/langs/nheko_ro.ts b/resources/langs/nheko_ro.ts
index 1b0adc84..e4ec38fa 100644
--- a/resources/langs/nheko_ro.ts
+++ b/resources/langs/nheko_ro.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation type="unfinished"></translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
@@ -139,7 +139,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@@ -154,7 +154,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@@ -164,7 +164,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation type="unfinished"></translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can'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="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation type="unfinished"></translation>
@@ -473,7 +473,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
@@ -508,7 +508,7 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation type="unfinished"></translation>
</message>
@@ -543,12 +543,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation type="unfinished"></translation>
</message>
@@ -653,7 +653,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation type="unfinished"></translation>
</message>
@@ -748,22 +748,23 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation type="unfinished"></translation>
</message>
@@ -783,32 +784,32 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation type="unfinished"></translation>
</message>
@@ -824,7 +825,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@@ -971,8 +972,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
@@ -1118,12 +1118,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1213,7 +1213,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2059,7 +2059,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation type="unfinished"></translation>
</message>
@@ -2069,7 +2069,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation type="unfinished"></translation>
</message>
@@ -2081,7 +2081,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2090,7 +2090,7 @@ Media size: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
diff --git a/resources/langs/nheko_ru.ts b/resources/langs/nheko_ru.ts
index 0d4e9181..0958c6be 100644
--- a/resources/langs/nheko_ru.ts
+++ b/resources/langs/nheko_ru.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation>Включить Микрофон</translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation>Вы присоединились к этой комнате.</translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation>Приглашённый пользователь: %1</translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation>Миграция кэша для текущей версии не удалась. Это может происходить по разным причинам. Пожалуйста сообщите о проблеме и попробуйте временно использовать старую версию. Так-же вы можете попробовать удалить кэш самостоятельно.</translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation>Комната %1 создана.</translation>
</message>
@@ -139,7 +139,7 @@
<translation>Разблокированный пользователь: %1</translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation>Миграция кэша не удалась!</translation>
</message>
@@ -154,7 +154,7 @@
<translation>Ваш кэш новее, чем эта версия Nheko поддерживает. Пожалуйста обновитесь или отчистите ваш кэш.</translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Не удалось восстановить учетную запись OLM. Пожалуйста, войдите снова.</translation>
</message>
@@ -164,7 +164,7 @@
<translation>Не удалось восстановить сохраненные данные. Пожалуйста, войдите снова.</translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Не удалось настроить ключи шифрования. Ответ сервера:%1 %2. Пожалуйста, попробуйте позже.</translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation>Применить</translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation>-- Ошибка дешифрования (Не удалось получить megolm-ключи для бд) --</translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can't be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation>-- Ошибка Дешифрования (%1) --</translation>
</message>
<message>
- <location line="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation>-- Шифрованое Событие (Неизвестный тип события) --</translation>
@@ -444,17 +444,17 @@
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+228"/>
<source>Select a file</source>
- <translation type="unfinished">Выберите файл</translation>
+ <translation>Выберите файл</translation>
</message>
<message>
<location line="+0"/>
<source>All Files (*)</source>
- <translation type="unfinished">Все файлы (*)</translation>
+ <translation>Все файлы (*)</translation>
</message>
<message>
<location line="+329"/>
<source>Failed to upload media. Please try again.</source>
- <translation type="unfinished">Не удалось загрузить медиа. Пожалуйста попробуйте ещё раз</translation>
+ <translation>Не удалось загрузить медиа. Пожалуйста попробуйте ещё раз</translation>
</message>
</context>
<context>
@@ -473,7 +473,7 @@
<translation>Идентификатор Matrix</translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation>Пример: @joe:matrix.org</translation>
</message>
@@ -512,19 +512,19 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation>ВОЙТИ</translation>
</message>
<message>
<location line="-100"/>
<source>Autodiscovery failed. Received malformed response.</source>
- <translation type="unfinished"></translation>
+ <translation>Автообноружение не удалось. Получен поврежденный ответ.</translation>
</message>
<message>
<location line="+6"/>
<source>Autodiscovery failed. Unknown error when requesting .well-known.</source>
- <translation type="unfinished"></translation>
+ <translation>Автообноружение не удалось. Не известаня ошибка во время запроса .well-known.</translation>
</message>
<message>
<location line="+25"/>
@@ -544,15 +544,15 @@ Example: https://server.my:8787</source>
<message>
<location line="+55"/>
<source>SSO LOGIN</source>
- <translation type="unfinished"></translation>
+ <translation>SSO ВХОД</translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation>Пустой пароль</translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation>SSO вход не удался</translation>
</message>
@@ -576,7 +576,7 @@ Example: https://server.my:8787</source>
<location filename="../qml/delegates/MessageDelegate.qml" line="+105"/>
<location line="+9"/>
<source>removed</source>
- <translation type="unfinished"></translation>
+ <translation>убрано</translation>
</message>
<message>
<location line="+9"/>
@@ -636,7 +636,7 @@ Example: https://server.my:8787</source>
<message>
<location line="+9"/>
<source>Negotiating call...</source>
- <translation type="unfinished"></translation>
+ <translation>Совершение звонка...</translation>
</message>
</context>
<context>
@@ -644,32 +644,32 @@ Example: https://server.my:8787</source>
<message>
<location filename="../qml/MessageInput.qml" line="+27"/>
<source>Hang up</source>
- <translation type="unfinished">Завершить звонок</translation>
+ <translation>Завершить звонок</translation>
</message>
<message>
<location line="+0"/>
<source>Place a call</source>
- <translation type="unfinished">Позвонить</translation>
+ <translation>Позвонить</translation>
</message>
<message>
<location line="+18"/>
<source>Send a file</source>
- <translation type="unfinished">Отправить файл</translation>
+ <translation>Отправить файл</translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation>Написать сообщение…</translation>
</message>
<message>
<location line="+144"/>
<source>Emoji</source>
- <translation type="unfinished">Эмоджи</translation>
+ <translation>Эмоджи</translation>
</message>
<message>
<location line="+16"/>
<source>Send</source>
- <translation type="unfinished"></translation>
+ <translation>Отправить</translation>
</message>
</context>
<context>
@@ -728,7 +728,7 @@ Example: https://server.my:8787</source>
<message>
<location filename="../../src/main.cpp" line="+169"/>
<source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source>
- <translation type="unfinished"></translation>
+ <translation>Создать уникальный профиль, который позволяет вести несколько аккаунтов и запускать множество сущностей nheko. </translation>
</message>
<message>
<location line="+2"/>
@@ -752,24 +752,25 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation>Имя пользователя</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
- <translation>Имя пользователя не должно быть пустым и должно содержать только символы a-z, 0-9, ., _, =, -, and /.</translation>
+ <translation>Имя пользователя не должно быть пустым и должно содержать только символы a-z, 0-9, ., _, =, -, и /.</translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation>Пароль</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
- <translation type="unfinished"></translation>
+ <translation>Пожалуйста выбирите надежный пароль. Надёжность пароля, влияет на безопасность сервера.</translation>
</message>
<message>
<location line="+4"/>
@@ -784,35 +785,35 @@ Example: https://server.my:8787</source>
<message>
<location line="+2"/>
<source>A server that allows registration. Since matrix is decentralized, you need to first find a server you can register on or host your own.</source>
- <translation type="unfinished"></translation>
+ <translation>Сервер разрешающий регистрацию.Поскольку matrix децентрализованный, нужно выбрать сервер где вы можете зарегистрироваться или поднимите свой сервер.</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation>РЕГИСТРАЦИЯ</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
- <translation type="unfinished"></translation>
+ <translation>Нет поддреживаемых регистрационных потоков</translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
- <translation>Некорректное имя пользователя</translation>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
+ <translation>Одно или более полей имеют некорректный ввод. Пожалуйста устраните ошибки и попробуйте снова.</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>Слишком короткий пароль (минимум 8 символов)</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation>Пароли не совпадают</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation>Неверное имя сервера</translation>
</message>
@@ -828,9 +829,9 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
- <translation type="unfinished"></translation>
+ <translation>нет сохраненной версии</translation>
</message>
</context>
<context>
@@ -849,25 +850,25 @@ Example: https://server.my:8787</source>
<location line="+18"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
- <translation type="unfinished"></translation>
+ <translation>Важные</translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
- <translation type="unfinished"></translation>
+ <translation>Низкий Приоритет</translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
- <translation type="unfinished"></translation>
+ <translation>Серверное Объявление</translation>
</message>
<message>
<location line="+12"/>
<source>Adds or removes the specified tag.</source>
<comment>WhatsThis hint for tag menu actions</comment>
- <translation type="unfinished"></translation>
+ <translation>Добавить или удалить выбранные тэг.</translation>
</message>
<message>
<location line="+38"/>
@@ -879,13 +880,13 @@ Example: https://server.my:8787</source>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
- <translation type="unfinished"></translation>
+ <translation>Новый Тэг</translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
- <translation type="unfinished"></translation>
+ <translation>Тэг:</translation>
</message>
<message>
<location line="+169"/>
@@ -975,8 +976,7 @@ Example: https://server.my:8787</source>
<translation>Ошибка редактирования сообщения: %1</translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation>Не удалось зашифровать сообщение, отправка отменена!</translation>
@@ -1019,7 +1019,7 @@ Example: https://server.my:8787</source>
<message>
<location line="+2"/>
<source>%1 made this room require and invitation to join.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 сделал вход в комнату по приглашению.</translation>
</message>
<message>
<location line="+23"/>
@@ -1094,7 +1094,7 @@ Example: https://server.my:8787</source>
<message>
<location line="+2"/>
<source>Revoked the invite to %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Приглашение для %1 отменено.</translation>
</message>
<message>
<location line="+3"/>
@@ -1119,23 +1119,23 @@ Example: https://server.my:8787</source>
<message>
<location line="-11"/>
<source>%1 redacted their knock.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 отредактировал его "стук".</translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation>Вы присоединились к этой комнате.</translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
- <translation type="unfinished"></translation>
+ <translation>Отверг "стук" от %1</translation>
</message>
<message>
<location line="+2"/>
<source>%1 left after having already left!</source>
<comment>This is a leave event after the user already left and shouldn't happen apart from state resets</comment>
- <translation type="unfinished"></translation>
+ <translation>%1 покинул чат, после того, как уже его покинул.</translation>
</message>
<message>
<location line="+15"/>
@@ -1145,7 +1145,7 @@ Example: https://server.my:8787</source>
<message>
<location line="-5"/>
<source>%1 knocked.</source>
- <translation type="unfinished"></translation>
+ <translation>%1 постучался.</translation>
</message>
</context>
<context>
@@ -1201,7 +1201,7 @@ Example: https://server.my:8787</source>
<message>
<location line="+5"/>
<source>Remove message</source>
- <translation type="unfinished"></translation>
+ <translation>Убрать сообщение</translation>
</message>
<message>
<location line="+7"/>
@@ -1211,15 +1211,15 @@ Example: https://server.my:8787</source>
<message>
<location line="+41"/>
<source>No room open</source>
- <translation type="unfinished"></translation>
+ <translation>Комната не выбрана</translation>
</message>
</context>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
- <translation type="unfinished"></translation>
+ <translation>Не найдено личного чата с этим пользователем. Создайте зашифрованный личный чат с этим пользователем и попытайтесь еще раз.</translation>
</message>
</context>
<context>
@@ -1299,7 +1299,7 @@ Example: https://server.my:8787</source>
<message>
<location line="+9"/>
<source>Set presence automatically</source>
- <translation type="unfinished"></translation>
+ <translation>Установить 'presence'автоматически</translation>
</message>
<message>
<location line="+6"/>
@@ -1375,54 +1375,54 @@ Example: https://server.my:8787</source>
<message>
<location line="+57"/>
<source>Keep the application running in the background after closing the client window.</source>
- <translation type="unfinished"></translation>
+ <translation>Держать приложение запущенным в фоне, после закрытия окна.</translation>
</message>
<message>
<location line="+3"/>
<source>Start the application in the background without showing the client window.</source>
- <translation type="unfinished"></translation>
+ <translation>Запускать приложение в фоне, без открытия окна.</translation>
</message>
<message>
<location line="+4"/>
<source>Change the appearance of user avatars in chats.
OFF - square, ON - Circle.</source>
- <translation type="unfinished"></translation>
+ <translation>Поменять отображение пользовательского аватара в чатах. ВЫКЛ - квадратный, ВКЛ - округлый.</translation>
</message>
<message>
<location line="+3"/>
<source>Show a column containing groups and tags next to the room list.</source>
- <translation type="unfinished"></translation>
+ <translation>Отображать колонку содержащую группы и тэги рядом со списком комнаты.</translation>
</message>
<message>
<location line="+1"/>
<source>Decrypt messages in sidebar</source>
- <translation type="unfinished"></translation>
+ <translation>Дешифровывать сообщение в сайдбаре</translation>
</message>
<message>
<location line="+2"/>
<source>Decrypt the messages shown in the sidebar.
Only affects messages in encrypted chats.</source>
- <translation type="unfinished"></translation>
+ <translation>Дешифровывать сообщение отображающиеся в сайдбаре. Действует только на шифрованные чаты.</translation>
</message>
<message>
<location line="+2"/>
<source>Show buttons in timeline</source>
- <translation type="unfinished"></translation>
+ <translation>Отображать кнопки в таймлайне</translation>
</message>
<message>
<location line="+2"/>
<source>Show buttons to quickly reply, react or access additional options next to each message.</source>
- <translation type="unfinished"></translation>
+ <translation>Отображать кнопки быстрого ответа, реакции или предоставления дополнительных опций рядом с каждым сообщением.</translation>
</message>
<message>
<location line="+2"/>
<source>Limit width of timeline</source>
- <translation type="unfinished"></translation>
+ <translation>Ограничить ширину таймлайна</translation>
</message>
<message>
<location line="+2"/>
<source>Set the max width of messages in the timeline (in pixels). This can help readability on wide screen, when Nheko is maximised</source>
- <translation type="unfinished"></translation>
+ <translation>Установить максимальную ширину сообщений в таймлайне (в пикселях). Это может повысить читаемость на широких экранах, когда Nheko в полноэкранном режиме.</translation>
</message>
<message>
<location line="+2"/>
@@ -1433,19 +1433,21 @@ Only affects messages in encrypted chats.</source>
<location line="+2"/>
<source>Show who is typing in a room.
This will also enable or disable sending typing notifications to others.</source>
- <translation type="unfinished"></translation>
+ <translation>Отображать кто печатает в комнате.</translation>
</message>
<message>
<location line="+3"/>
<source>Sort rooms by unreads</source>
- <translation type="unfinished"></translation>
+ <translation>Сортировать комнату по непрочитанным</translation>
</message>
<message>
<location line="+2"/>
<source>Display rooms with new messages first.
If this is off, the list of rooms will only be sorted by the timestamp of the last message in a room.
If this is on, rooms which have active notifications (the small circle with a number in it) will be sorted on top. Rooms, that you have muted, will still be sorted by timestamp, since you don't seem to consider them as important as the other rooms.</source>
- <translation type="unfinished"></translation>
+ <translation>Отображать сначала комнаты с новыми сообщениями.
+Если это выключено, список комнат будет отсортировать по времени последнего сообщения в комнате.
+Если это включено, комнаты в которых включены уведомления (маленькие кружки с числами) буду отсортированы на верху. Комнаты, которые вы заглушили, будут отсортированы по времени, пока вы не сделаете их важнее чем другие комнаты.</translation>
</message>
<message>
<location line="+7"/>
@@ -1456,18 +1458,20 @@ If this is on, rooms which have active notifications (the small circle with a nu
<location line="+2"/>
<source>Show if your message was read.
Status is displayed next to timestamps.</source>
- <translation type="unfinished"></translation>
+ <translation>Показывать, если ваше сообщение было прочитано.
+Стату отображается за временем сообщения.</translation>
</message>
<message>
<location line="+2"/>
<source>Send messages as Markdown</source>
- <translation type="unfinished"></translation>
+ <translation>Посылать сообщение в формате Markdown</translation>
</message>
<message>
<location line="+2"/>
<source>Allow using markdown in messages.
When disabled, all messages are sent as a plain text.</source>
- <translation type="unfinished"></translation>
+ <translation>Разрешить использовать markdown в сообщениях.
+Когда выключено, все сообщения посылаются как обычный текст.</translation>
</message>
<message>
<location line="+2"/>
@@ -1477,43 +1481,44 @@ When disabled, all messages are sent as a plain text.</source>
<message>
<location line="+2"/>
<source>Notify about received message when the client is not currently focused.</source>
- <translation type="unfinished"></translation>
+ <translation>Предупреждать о получании сообщение, когда приложение не выбрано.</translation>
</message>
<message>
<location line="+1"/>
<source>Alert on notification</source>
- <translation type="unfinished"></translation>
+ <translation>Предупреждать о уведомлении</translation>
</message>
<message>
<location line="+2"/>
<source>Show an alert when a message is received.
This usually causes the application icon in the task bar to animate in some fashion.</source>
- <translation type="unfinished"></translation>
+ <translation>Показывать предупреждение, когда получено сообщеение.
+На это обычно реагирует иконка приложения в таскбаре.</translation>
</message>
<message>
<location line="+2"/>
<source>Highlight message on hover</source>
- <translation type="unfinished"></translation>
+ <translation>Подсвечивать сообщение на панели</translation>
</message>
<message>
<location line="+2"/>
<source>Change the background color of messages when you hover over them.</source>
- <translation type="unfinished"></translation>
+ <translation>Поменять цвет фона сообщения, когда вы навели курсор над ним.</translation>
</message>
<message>
<location line="+1"/>
<source>Large Emoji in timeline</source>
- <translation type="unfinished"></translation>
+ <translation>Большие эмоджи в таймлайне</translation>
</message>
<message>
<location line="+2"/>
<source>Make font size larger if messages with only a few emojis are displayed.</source>
- <translation type="unfinished"></translation>
+ <translation>Делать шрифт больше, если сообщения содержать только несколько эмоджи.</translation>
</message>
<message>
<location line="+56"/>
<source>Share keys with verified users and devices</source>
- <translation type="unfinished"></translation>
+ <translation>Делиться ключами с проверенными участниками и устройствами</translation>
</message>
<message>
<location line="-48"/>
@@ -1523,7 +1528,7 @@ This usually causes the application icon in the task bar to animate in some fash
<message>
<location line="+2"/>
<source>Change the scale factor of the whole user interface.</source>
- <translation type="unfinished"></translation>
+ <translation>Поменять коэфициент масштаба для всего пользовательского интерфейса.</translation>
</message>
<message>
<location line="+4"/>
@@ -1533,7 +1538,7 @@ This usually causes the application icon in the task bar to animate in some fash
<message>
<location line="+1"/>
<source>Font Family</source>
- <translation type="unfinished"></translation>
+ <translation>Семья Шрифта</translation>
</message>
<message>
<location line="+8"/>
@@ -1543,42 +1548,42 @@ This usually causes the application icon in the task bar to animate in some fash
<message>
<location line="+4"/>
<source>Ringtone</source>
- <translation type="unfinished"></translation>
+ <translation>Мелодия Звонка</translation>
</message>
<message>
<location line="+2"/>
<source>Set the notification sound to play when a call invite arrives</source>
- <translation type="unfinished"></translation>
+ <translation>Установить звук уведомления, когда получено приглашение для звонка.</translation>
</message>
<message>
<location line="+1"/>
<source>Microphone</source>
- <translation type="unfinished"></translation>
+ <translation>Микрофон</translation>
</message>
<message>
<location line="+1"/>
<source>Camera</source>
- <translation type="unfinished"></translation>
+ <translation>Камера</translation>
</message>
<message>
<location line="+1"/>
<source>Camera resolution</source>
- <translation type="unfinished"></translation>
+ <translation>Разрешение Камеры</translation>
</message>
<message>
<location line="+1"/>
<source>Camera frame rate</source>
- <translation type="unfinished"></translation>
+ <translation>Частота смены кадров для камеры</translation>
</message>
<message>
<location line="+14"/>
<source>Allow fallback call assist server</source>
- <translation type="unfinished"></translation>
+ <translation>Разрешить помощь резервного сервера для звонков</translation>
</message>
<message>
<location line="+2"/>
<source>Will use turn.matrix.org as assist when your home server does not offer one.</source>
- <translation type="unfinished"></translation>
+ <translation>Будет использован turn.matrix.org для помощи, когда вам домашний сервер не позволяет.</translation>
</message>
<message>
<location line="+4"/>
@@ -1618,37 +1623,37 @@ This usually causes the application icon in the task bar to animate in some fash
<message>
<location line="+57"/>
<source>INTERFACE</source>
- <translation type="unfinished"></translation>
+ <translation>ИНТЕРФЕЙС</translation>
</message>
<message>
<location line="+156"/>
<source>Touchscreen mode</source>
- <translation type="unfinished"></translation>
+ <translation>Сенсорный режим</translation>
</message>
<message>
<location line="+2"/>
<source>Will prevent text selection in the timeline to make touch scrolling easier.</source>
- <translation type="unfinished"></translation>
+ <translation>Будет прерывать выделение текста в таймлайне, чтобы сделать перелистывание косанием проще.</translation>
</message>
<message>
<location line="+12"/>
<source>Emoji Font Family</source>
- <translation type="unfinished"></translation>
+ <translation>Семья шрифта эмоджи</translation>
</message>
<message>
<location line="+40"/>
<source>Automatically replies to key requests from other users, if they are verified.</source>
- <translation type="unfinished"></translation>
+ <translation>Автоматически отвечать на запросы ключей от других пользователей, если они верифицированы.</translation>
</message>
<message>
<location line="+54"/>
<source>Select a file</source>
- <translation type="unfinished">Выберите файл</translation>
+ <translation>Выберите файл</translation>
</message>
<message>
<location line="+0"/>
<source>All Files (*)</source>
- <translation type="unfinished">Все файлы (*)</translation>
+ <translation>Все файлы (*)</translation>
</message>
<message>
<location line="+217"/>
@@ -1699,22 +1704,22 @@ This usually causes the application icon in the task bar to animate in some fash
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+7"/>
<source>Waiting for other party</source>
- <translation type="unfinished"></translation>
+ <translation>Ожидание другой стороны</translation>
</message>
<message>
<location line="+15"/>
<source>Waiting for other side to accept the verification request.</source>
- <translation type="unfinished"></translation>
+ <translation>Ожидание подтверждения запроса верификации другой стороной.</translation>
</message>
<message>
<location line="+2"/>
<source>Waiting for other side to continue the verification process.</source>
- <translation type="unfinished"></translation>
+ <translation>Ожидание другой стороны для продолжения верификационного процесса.</translation>
</message>
<message>
<location line="+2"/>
<source>Waiting for other side to complete the verification process.</source>
- <translation type="unfinished"></translation>
+ <translation>Ожидание другой стороны, для завершение верификационного процесса.</translation>
</message>
<message>
<location line="+15"/>
@@ -1727,7 +1732,7 @@ This usually causes the application icon in the task bar to animate in some fash
<message>
<location filename="../../src/WelcomePage.cpp" line="+47"/>
<source>Welcome to nheko! The desktop client for the Matrix protocol.</source>
- <translation>Добро пожаловать в nheko, клиент протокола Matrix!</translation>
+ <translation>Добро пожаловать в nheko, клиент для протокола Matrix!</translation>
</message>
<message>
<location line="+1"/>
@@ -1758,17 +1763,17 @@ This usually causes the application icon in the task bar to animate in some fash
<message>
<location filename="../../src/dialogs/AcceptCall.cpp" line="+43"/>
<source>Incoming call: No microphone found.</source>
- <translation type="unfinished"></translation>
+ <translation>Входящий звонок: Микрофон не выбран.</translation>
</message>
<message>
<location line="+51"/>
<source>Video Call</source>
- <translation type="unfinished"></translation>
+ <translation>Видео Звонок</translation>
</message>
<message>
<location line="+0"/>
<source>Voice Call</source>
- <translation type="unfinished"></translation>
+ <translation>Голосовой Звонок</translation>
</message>
<message>
<location line="+7"/>
@@ -1829,7 +1834,7 @@ This usually causes the application icon in the task bar to animate in some fash
<message>
<location filename="../../src/dialogs/FallbackAuth.cpp" line="+30"/>
<source>Open Fallback in Browser</source>
- <translation type="unfinished"></translation>
+ <translation>Открыть ответ в Браузере</translation>
</message>
<message>
<location line="+1"/>
@@ -1909,7 +1914,7 @@ This usually causes the application icon in the task bar to animate in some fash
<message>
<location filename="../../src/dialogs/PlaceCall.cpp" line="+35"/>
<source>No microphone found.</source>
- <translation type="unfinished"></translation>
+ <translation>Микрофон не найден.</translation>
</message>
<message>
<location line="+27"/>
@@ -1919,7 +1924,7 @@ This usually causes the application icon in the task bar to animate in some fash
<message>
<location line="+6"/>
<source>Video</source>
- <translation type="unfinished"></translation>
+ <translation>Видео</translation>
</message>
<message>
<location line="+4"/>
@@ -1929,7 +1934,7 @@ This usually causes the application icon in the task bar to animate in some fash
<message>
<location line="+10"/>
<source>Place a call to </source>
- <translation type="unfinished"></translation>
+ <translation>Позвонить </translation>
</message>
</context>
<context>
@@ -2066,7 +2071,7 @@ Media size: %2
<translation>Шифрование</translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation>Сквозное шифрование</translation>
</message>
@@ -2076,9 +2081,9 @@ Media size: %2
<translation>Шифрование в настоящее время является экспериментальным, поэтому возможны сбои. <br>Пожалуйста, имейте ввиду, что его нельзя отключить впоследствии.</translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
- <translation type="unfinished"></translation>
+ <translation>Отвечать на запросы на ключ</translation>
</message>
<message>
<location line="+3"/>
@@ -2088,7 +2093,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation>
<numerusform>%n участник</numerusform>
@@ -2097,7 +2102,7 @@ Media size: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation>Не удалось включить шифрование: %1</translation>
</message>
@@ -2153,7 +2158,7 @@ Media size: %2
<message>
<location line="+14"/>
<source>Confirm DM</source>
- <translation type="unfinished"></translation>
+ <translation>Подтвердить личный чат</translation>
</message>
<message>
<location line="+1"/>
diff --git a/resources/langs/nheko_si.ts b/resources/langs/nheko_si.ts
index 5e6d5218..62f6ba65 100644
--- a/resources/langs/nheko_si.ts
+++ b/resources/langs/nheko_si.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation type="unfinished"></translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
@@ -139,7 +139,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@@ -154,7 +154,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@@ -164,7 +164,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation type="unfinished"></translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can'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="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation type="unfinished"></translation>
@@ -473,7 +473,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
@@ -508,7 +508,7 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation type="unfinished"></translation>
</message>
@@ -543,12 +543,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation type="unfinished"></translation>
</message>
@@ -653,7 +653,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation type="unfinished"></translation>
</message>
@@ -748,22 +748,23 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation type="unfinished"></translation>
</message>
@@ -783,32 +784,32 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation type="unfinished"></translation>
</message>
@@ -824,7 +825,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@@ -971,8 +972,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
@@ -1117,12 +1117,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1212,7 +1212,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2058,7 +2058,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation type="unfinished"></translation>
</message>
@@ -2068,7 +2068,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation type="unfinished"></translation>
</message>
@@ -2080,7 +2080,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2088,7 +2088,7 @@ Media size: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
diff --git a/resources/langs/nheko_sv.ts b/resources/langs/nheko_sv.ts
index ae1f3f12..b5c928fa 100644
--- a/resources/langs/nheko_sv.ts
+++ b/resources/langs/nheko_sv.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation type="unfinished"></translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
@@ -139,7 +139,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@@ -154,7 +154,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
@@ -164,7 +164,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation type="unfinished"></translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can'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="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation type="unfinished"></translation>
@@ -473,7 +473,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation type="unfinished"></translation>
</message>
@@ -508,7 +508,7 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation type="unfinished"></translation>
</message>
@@ -543,12 +543,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation type="unfinished"></translation>
</message>
@@ -653,7 +653,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation type="unfinished"></translation>
</message>
@@ -748,22 +748,23 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation type="unfinished"></translation>
</message>
@@ -783,32 +784,32 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation type="unfinished"></translation>
</message>
@@ -824,7 +825,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@@ -971,8 +972,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
@@ -1117,12 +1117,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1212,7 +1212,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2058,7 +2058,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation type="unfinished"></translation>
</message>
@@ -2068,7 +2068,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation type="unfinished"></translation>
</message>
@@ -2080,7 +2080,7 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation type="unfinished">
<numerusform></numerusform>
@@ -2088,7 +2088,7 @@ Media size: %2
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
diff --git a/resources/langs/nheko_zh_CN.ts b/resources/langs/nheko_zh_CN.ts
index ac3411a7..7a4e29c2 100644
--- a/resources/langs/nheko_zh_CN.ts
+++ b/resources/langs/nheko_zh_CN.ts
@@ -4,7 +4,7 @@
<context>
<name>ActiveCallBar</name>
<message>
- <location filename="../qml/ActiveCallBar.qml" line="+132"/>
+ <location filename="../qml/ActiveCallBar.qml" line="+174"/>
<source>Unmute Mic</source>
<translation type="unfinished"></translation>
</message>
@@ -35,7 +35,7 @@
<context>
<name>Cache</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1850"/>
+ <location filename="../../src/Cache.cpp" line="+1821"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@@ -49,17 +49,17 @@
</message>
<message>
<location line="+4"/>
- <location line="+767"/>
+ <location line="+765"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-495"/>
+ <location line="-493"/>
<source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+451"/>
+ <location line="+449"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
@@ -139,7 +139,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-577"/>
+ <location line="-575"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@@ -154,7 +154,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+51"/>
+ <location line="+50"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>恢复 OLM 账户失败。请重新登录。</translation>
</message>
@@ -164,7 +164,7 @@
<translation>恢复保存的数据失败。请重新登录。</translation>
</message>
<message>
- <location line="+166"/>
+ <location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
@@ -261,7 +261,7 @@
<context>
<name>EditModal</name>
<message>
- <location filename="../../src/dialogs/RoomSettings.cpp" line="+74"/>
+ <location filename="../../src/dialogs/RoomSettings.cpp" line="+73"/>
<source>Apply</source>
<translation type="unfinished"></translation>
</message>
@@ -376,20 +376,20 @@
</message>
<message>
<location line="+32"/>
- <location line="+62"/>
+ <location line="+63"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can't be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-48"/>
- <location line="+61"/>
+ <location line="-49"/>
+ <location line="+62"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can'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="-51"/>
+ <location line="-52"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn't parse it, because Nheko/mtxclient don't support that event type yet.</comment>
<translation type="unfinished"></translation>
@@ -473,7 +473,7 @@
<translation></translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>e.g @joe:matrix.org</source>
<translation>例如 @joe:matrix.org</translation>
</message>
@@ -508,7 +508,7 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+19"/>
- <location line="+220"/>
+ <location line="+213"/>
<source>LOGIN</source>
<translation>登录</translation>
</message>
@@ -543,12 +543,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+35"/>
+ <location line="+37"/>
<source>Empty password</source>
<translation>空密码</translation>
</message>
<message>
- <location line="+52"/>
+ <location line="+54"/>
<source>SSO login failed</source>
<translation type="unfinished"></translation>
</message>
@@ -653,7 +653,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">发送一个文件</translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+41"/>
<source>Write a message...</source>
<translation type="unfinished">写一条消息...</translation>
</message>
@@ -748,22 +748,23 @@ Example: https://server.my:8787</source>
<context>
<name>RegisterPage</name>
<message>
- <location filename="../../src/RegisterPage.cpp" line="+88"/>
+ <location filename="../../src/RegisterPage.cpp" line="+89"/>
<source>Username</source>
<translation>用户名</translation>
</message>
<message>
- <location line="+3"/>
+ <location line="+2"/>
+ <location line="+286"/>
<source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+4"/>
+ <location line="-282"/>
<source>Password</source>
<translation>密码</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+3"/>
<source>Please choose a secure password. The exact requirements for password strength may depend on your server.</source>
<translation type="unfinished"></translation>
</message>
@@ -783,32 +784,32 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+30"/>
<source>REGISTER</source>
<translation>注册</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+62"/>
<source>No supported registration flows!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+135"/>
- <source>Invalid username</source>
- <translation>无效的用户名</translation>
+ <location line="+208"/>
+ <source>One or more fields have invalid inputs. Please correct those issues and try again.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location line="+2"/>
+ <location line="-25"/>
<source>Password is not long enough (min 8 chars)</source>
<translation>密码不够长(至少8个字符)</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Passwords don't match</source>
<translation>密码不匹配</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+5"/>
<source>Invalid server name</source>
<translation>无效的服务器名</translation>
</message>
@@ -824,7 +825,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
- <location filename="../../src/Cache.cpp" line="+1794"/>
+ <location filename="../../src/Cache.cpp" line="+1831"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@@ -971,8 +972,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished">删除消息失败:%1</translation>
</message>
<message>
- <location line="+130"/>
- <location line="+8"/>
+ <location line="+74"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
@@ -1116,12 +1116,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-812"/>
+ <location line="-748"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+814"/>
+ <location line="+750"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@@ -1211,7 +1211,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
- <location filename="../../src/timeline/TimelineViewManager.cpp" line="+452"/>
+ <location filename="../../src/timeline/TimelineViewManager.cpp" line="+455"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@@ -2059,7 +2059,7 @@ Media size: %2
<translation>加密</translation>
</message>
<message>
- <location line="+8"/>
+ <location line="+31"/>
<source>End-to-End Encryption</source>
<translation>端到端加密</translation>
</message>
@@ -2069,7 +2069,7 @@ Media size: %2
<translation>加密正在实验阶段,可能会意外地坏掉。<br>请注意此后无法禁用。</translation>
</message>
<message>
- <location line="+27"/>
+ <location line="-24"/>
<source>Respond to key requests</source>
<translation>回应密钥请求</translation>
</message>
@@ -2083,14 +2083,14 @@ Media size: %2
这是一个临时的测试端到端加密的方案。</translation>
</message>
<message numerus="yes">
- <location line="+51"/>
+ <location line="+80"/>
<source>%n member(s)</source>
<translation>
<numerusform>%n 成员</numerusform>
</translation>
</message>
<message>
- <location line="+140"/>
+ <location line="+142"/>
<source>Failed to enable encryption: %1</source>
<translation>启用加密失败:%1</translation>
</message>
diff --git a/resources/qml/ActiveCallBar.qml b/resources/qml/ActiveCallBar.qml
index 9bbac632..3059e213 100644
--- a/resources/qml/ActiveCallBar.qml
+++ b/resources/qml/ActiveCallBar.qml
@@ -55,27 +55,69 @@ Rectangle {
state: TimelineManager.callState
states: [
State {
- name: "OFFERSENT"; when: state == WebRTCState.OFFERSENT
- PropertyChanges { target: callStateLabel; text: "Calling..." }
+ name: "OFFERSENT"
+ when: state == WebRTCState.OFFERSENT
+
+ PropertyChanges {
+ target: callStateLabel
+ text: "Calling..."
+ }
+
},
State {
- name: "CONNECTING"; when: state == WebRTCState.CONNECTING
- PropertyChanges { target: callStateLabel; text: "Connecting..." }
+ name: "CONNECTING"
+ when: state == WebRTCState.CONNECTING
+
+ PropertyChanges {
+ target: callStateLabel
+ text: "Connecting..."
+ }
+
},
State {
- name: "ANSWERSENT"; when: state == WebRTCState.ANSWERSENT
- PropertyChanges { target: callStateLabel; text: "Connecting..." }
+ name: "ANSWERSENT"
+ when: state == WebRTCState.ANSWERSENT
+
+ PropertyChanges {
+ target: callStateLabel
+ text: "Connecting..."
+ }
+
},
State {
- name: "CONNECTED"; when: state == WebRTCState.CONNECTED
- PropertyChanges { target: callStateLabel; text: "00:00" }
- PropertyChanges { target: callTimer; startTime: Math.floor((new Date()).getTime() / 1000) }
- PropertyChanges { target: stackLayout; currentIndex: TimelineManager.onVideoCall ? 1 : 0 }
+ name: "CONNECTED"
+ when: state == WebRTCState.CONNECTED
+
+ PropertyChanges {
+ target: callStateLabel
+ text: "00:00"
+ }
+
+ PropertyChanges {
+ target: callTimer
+ startTime: Math.floor((new Date()).getTime() / 1000)
+ }
+
+ PropertyChanges {
+ target: stackLayout
+ currentIndex: TimelineManager.onVideoCall ? 1 : 0
+ }
+
},
State {
- name: "DISCONNECTED"; when: state == WebRTCState.DISCONNECTED
- PropertyChanges { target: callStateLabel; text: "" }
- PropertyChanges { target: stackLayout; currentIndex: 0 }
+ name: "DISCONNECTED"
+ when: state == WebRTCState.DISCONNECTED
+
+ PropertyChanges {
+ target: callStateLabel
+ text: ""
+ }
+
+ PropertyChanges {
+ target: stackLayout
+ currentIndex: 0
+ }
+
}
]
}
diff --git a/resources/qml/Avatar.qml b/resources/qml/Avatar.qml
index 4adff572..076e84c0 100644
--- a/resources/qml/Avatar.qml
+++ b/resources/qml/Avatar.qml
@@ -49,6 +49,12 @@ Rectangle {
}
+ MouseArea {
+ id: mouseArea
+
+ anchors.fill: parent
+ onClicked: TimelineManager.openImageOverlay(TimelineManager.timeline.avatarUrl(userid), TimelineManager.timeline.data.id)
+ }
}
Rectangle {
diff --git a/resources/qml/MessageInput.qml b/resources/qml/MessageInput.qml
index ae95cbb6..e8ebd5fc 100644
--- a/resources/qml/MessageInput.qml
+++ b/resources/qml/MessageInput.qml
@@ -82,6 +82,7 @@ Rectangle {
popup.completer.setSearchString(textArea.getText(completerTriggeredAt, cursorPosition));
}
+ selectByMouse: true
placeholderText: qsTr("Write a message...")
placeholderTextColor: colors.buttonText
color: colors.text
diff --git a/src/Cache.cpp b/src/Cache.cpp
index 738f1152..97e99700 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -318,52 +318,67 @@ Cache::saveInboundMegolmSession(const MegolmSessionIndex &index,
auto txn = lmdb::txn::begin(env_);
lmdb::dbi_put(txn, inboundMegolmSessionDb_, lmdb::val(key), lmdb::val(pickled));
txn.commit();
-
- {
- std::unique_lock<std::mutex> lock(session_storage.group_inbound_mtx);
- session_storage.group_inbound_sessions[key] = std::move(session);
- }
}
-OlmInboundGroupSession *
+mtx::crypto::InboundGroupSessionPtr
Cache::getInboundMegolmSession(const MegolmSessionIndex &index)
{
- std::unique_lock<std::mutex> lock(session_storage.group_inbound_mtx);
- return session_storage.group_inbound_sessions[json(index).dump()].get();
+ using namespace mtx::crypto;
+
+ try {
+ auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
+ std::string key = json(index).dump();
+ lmdb::val value;
+
+ if (lmdb::dbi_get(txn, inboundMegolmSessionDb_, lmdb::val(key), value)) {
+ auto session = unpickle<InboundSessionObject>(
+ std::string(value.data(), value.size()), SECRET);
+ return session;
+ }
+ } catch (std::exception &e) {
+ nhlog::db()->error("Failed to get inbound megolm session {}", e.what());
+ }
+
+ return nullptr;
}
bool
Cache::inboundMegolmSessionExists(const MegolmSessionIndex &index)
{
- std::unique_lock<std::mutex> lock(session_storage.group_inbound_mtx);
- return session_storage.group_inbound_sessions.find(json(index).dump()) !=
- session_storage.group_inbound_sessions.end();
+ using namespace mtx::crypto;
+
+ try {
+ auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
+ std::string key = json(index).dump();
+ lmdb::val value;
+
+ return lmdb::dbi_get(txn, inboundMegolmSessionDb_, lmdb::val(key), value);
+ } catch (std::exception &e) {
+ nhlog::db()->error("Failed to get inbound megolm session {}", e.what());
+ }
+
+ return false;
}
void
-Cache::updateOutboundMegolmSession(const std::string &room_id, int message_index)
+Cache::updateOutboundMegolmSession(const std::string &room_id,
+ const OutboundGroupSessionData &data_,
+ mtx::crypto::OutboundGroupSessionPtr &ptr)
{
using namespace mtx::crypto;
if (!outboundMegolmSessionExists(room_id))
return;
- OutboundGroupSessionData data;
- OlmOutboundGroupSession *session;
- {
- std::unique_lock<std::mutex> lock(session_storage.group_outbound_mtx);
- data = session_storage.group_outbound_session_data[room_id];
- session = session_storage.group_outbound_sessions[room_id].get();
-
- // Update with the current message.
- data.message_index = message_index;
- session_storage.group_outbound_session_data[room_id] = data;
- }
+ OutboundGroupSessionData data = data_;
+ data.message_index = olm_outbound_group_session_message_index(ptr.get());
+ data.session_id = mtx::crypto::session_id(ptr.get());
+ data.session_key = mtx::crypto::session_key(ptr.get());
// Save the updated pickled data for the session.
json j;
j["data"] = data;
- j["session"] = pickle<OutboundSessionObject>(session, SECRET);
+ j["session"] = pickle<OutboundSessionObject>(ptr.get(), SECRET);
auto txn = lmdb::txn::begin(env_);
lmdb::dbi_put(txn, outboundMegolmSessionDb_, lmdb::val(room_id), lmdb::val(j.dump()));
@@ -379,10 +394,6 @@ Cache::dropOutboundMegolmSession(const std::string &room_id)
return;
{
- std::unique_lock<std::mutex> lock(session_storage.group_outbound_mtx);
- session_storage.group_outbound_session_data.erase(room_id);
- session_storage.group_outbound_sessions.erase(room_id);
-
auto txn = lmdb::txn::begin(env_);
lmdb::dbi_del(txn, outboundMegolmSessionDb_, lmdb::val(room_id), nullptr);
txn.commit();
@@ -392,7 +403,7 @@ Cache::dropOutboundMegolmSession(const std::string &room_id)
void
Cache::saveOutboundMegolmSession(const std::string &room_id,
const OutboundGroupSessionData &data,
- mtx::crypto::OutboundGroupSessionPtr session)
+ mtx::crypto::OutboundGroupSessionPtr &session)
{
using namespace mtx::crypto;
const auto pickled = pickle<OutboundSessionObject>(session.get(), SECRET);
@@ -404,30 +415,40 @@ Cache::saveOutboundMegolmSession(const std::string &room_id,
auto txn = lmdb::txn::begin(env_);
lmdb::dbi_put(txn, outboundMegolmSessionDb_, lmdb::val(room_id), lmdb::val(j.dump()));
txn.commit();
-
- {
- std::unique_lock<std::mutex> lock(session_storage.group_outbound_mtx);
- session_storage.group_outbound_session_data[room_id] = data;
- session_storage.group_outbound_sessions[room_id] = std::move(session);
- }
}
bool
Cache::outboundMegolmSessionExists(const std::string &room_id) noexcept
{
- std::unique_lock<std::mutex> lock(session_storage.group_outbound_mtx);
- return (session_storage.group_outbound_sessions.find(room_id) !=
- session_storage.group_outbound_sessions.end()) &&
- (session_storage.group_outbound_session_data.find(room_id) !=
- session_storage.group_outbound_session_data.end());
+ try {
+ auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
+ lmdb::val value;
+ return lmdb::dbi_get(txn, outboundMegolmSessionDb_, lmdb::val(room_id), value);
+ } catch (std::exception &e) {
+ nhlog::db()->error("Failed to retrieve outbound Megolm Session: {}", e.what());
+ return false;
+ }
}
OutboundGroupSessionDataRef
Cache::getOutboundMegolmSession(const std::string &room_id)
{
- std::unique_lock<std::mutex> lock(session_storage.group_outbound_mtx);
- return OutboundGroupSessionDataRef{session_storage.group_outbound_sessions[room_id].get(),
- session_storage.group_outbound_session_data[room_id]};
+ try {
+ using namespace mtx::crypto;
+
+ auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
+ lmdb::val value;
+ lmdb::dbi_get(txn, outboundMegolmSessionDb_, lmdb::val(room_id), value);
+ auto obj = json::parse(std::string_view(value.data(), value.size()));
+
+ OutboundGroupSessionDataRef ref{};
+ ref.data = obj.at("data").get<OutboundGroupSessionData>();
+ ref.session = unpickle<OutboundSessionObject>(obj.at("session"), SECRET);
+ return ref;
+ } catch (std::exception &e) {
+ nhlog::db()->error("Failed to retrieve outbound Megolm Session: {}", e.what());
+ return {};
+ }
}
//
@@ -537,56 +558,6 @@ Cache::saveOlmAccount(const std::string &data)
txn.commit();
}
-void
-Cache::restoreSessions()
-{
- using namespace mtx::crypto;
-
- auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
- std::string key, value;
-
- //
- // Inbound Megolm Sessions
- //
- {
- auto cursor = lmdb::cursor::open(txn, inboundMegolmSessionDb_);
- while (cursor.get(key, value, MDB_NEXT)) {
- auto session = unpickle<InboundSessionObject>(value, SECRET);
- session_storage.group_inbound_sessions[key] = std::move(session);
- }
- cursor.close();
- }
-
- //
- // Outbound Megolm Sessions
- //
- {
- auto cursor = lmdb::cursor::open(txn, outboundMegolmSessionDb_);
- while (cursor.get(key, value, MDB_NEXT)) {
- json obj;
-
- try {
- obj = json::parse(value);
-
- session_storage.group_outbound_session_data[key] =
- obj.at("data").get<OutboundGroupSessionData>();
-
- auto session =
- unpickle<OutboundSessionObject>(obj.at("session"), SECRET);
- session_storage.group_outbound_sessions[key] = std::move(session);
- } catch (const nlohmann::json::exception &e) {
- nhlog::db()->critical(
- "failed to parse outbound megolm session data: {}", e.what());
- }
- }
- cursor.close();
- }
-
- txn.commit();
-
- nhlog::db()->info("sessions restored");
-}
-
std::string
Cache::restoreOlmAccount()
{
@@ -3125,6 +3096,39 @@ Cache::roomMembers(const std::string &room_id)
return members;
}
+std::map<std::string, std::optional<UserKeyCache>>
+Cache::getMembersWithKeys(const std::string &room_id)
+{
+ lmdb::val keys;
+
+ try {
+ auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
+ std::map<std::string, std::optional<UserKeyCache>> members;
+
+ auto db = getMembersDb(txn, room_id);
+ auto keysDb = getUserKeysDb(txn);
+
+ std::string user_id, unused;
+ auto cursor = lmdb::cursor::open(txn, db);
+ while (cursor.get(user_id, unused, MDB_NEXT)) {
+ auto res = lmdb::dbi_get(txn, keysDb, lmdb::val(user_id), keys);
+
+ if (res) {
+ members[user_id] =
+ json::parse(std::string_view(keys.data(), keys.size()))
+ .get<UserKeyCache>();
+ } else {
+ members[user_id] = {};
+ }
+ }
+ cursor.close();
+
+ return members;
+ } catch (std::exception &) {
+ return {};
+ }
+}
+
QString
Cache::displayName(const QString &room_id, const QString &user_id)
{
@@ -3265,6 +3269,8 @@ Cache::updateUserKeys(const std::string &sync_token, const mtx::responses::Query
updates[user].self_signing_keys = keys;
for (auto &[user, update] : updates) {
+ nhlog::db()->debug("Updated user keys: {}", user);
+
lmdb::val oldKeys;
auto res = lmdb::dbi_get(txn, db, lmdb::val(user), oldKeys);
@@ -3327,6 +3333,8 @@ Cache::markUserKeysOutOfDate(lmdb::txn &txn,
query.token = sync_token;
for (const auto &user : user_ids) {
+ nhlog::db()->debug("Marking user keys out of date: {}", user);
+
lmdb::val oldKeys;
auto res = lmdb::dbi_get(txn, db, lmdb::val(user), oldKeys);
@@ -3681,11 +3689,40 @@ from_json(const json &j, MemberInfo &info)
}
void
+to_json(nlohmann::json &obj, const DeviceAndMasterKeys &msg)
+{
+ obj["devices"] = msg.devices;
+ obj["master_keys"] = msg.master_keys;
+}
+
+void
+from_json(const nlohmann::json &obj, DeviceAndMasterKeys &msg)
+{
+ msg.devices = obj.at("devices").get<decltype(msg.devices)>();
+ msg.master_keys = obj.at("master_keys").get<decltype(msg.master_keys)>();
+}
+
+void
+to_json(nlohmann::json &obj, const SharedWithUsers &msg)
+{
+ obj["keys"] = msg.keys;
+}
+
+void
+from_json(const nlohmann::json &obj, SharedWithUsers &msg)
+{
+ msg.keys = obj.at("keys").get<std::map<std::string, DeviceAndMasterKeys>>();
+}
+
+void
to_json(nlohmann::json &obj, const OutboundGroupSessionData &msg)
{
obj["session_id"] = msg.session_id;
obj["session_key"] = msg.session_key;
obj["message_index"] = msg.message_index;
+
+ obj["initially"] = msg.initially;
+ obj["currently"] = msg.currently;
}
void
@@ -3694,6 +3731,9 @@ from_json(const nlohmann::json &obj, OutboundGroupSessionData &msg)
msg.session_id = obj.at("session_id");
msg.session_key = obj.at("session_key");
msg.message_index = obj.at("message_index");
+
+ msg.initially = obj.value("initially", SharedWithUsers{});
+ msg.currently = obj.value("currently", SharedWithUsers{});
}
void
@@ -4128,9 +4168,9 @@ isRoomMember(const std::string &user_id, const std::string &room_id)
void
saveOutboundMegolmSession(const std::string &room_id,
const OutboundGroupSessionData &data,
- mtx::crypto::OutboundGroupSessionPtr session)
+ mtx::crypto::OutboundGroupSessionPtr &session)
{
- instance_->saveOutboundMegolmSession(room_id, data, std::move(session));
+ instance_->saveOutboundMegolmSession(room_id, data, session);
}
OutboundGroupSessionDataRef
getOutboundMegolmSession(const std::string &room_id)
@@ -4143,9 +4183,11 @@ outboundMegolmSessionExists(const std::string &room_id) noexcept
return instance_->outboundMegolmSessionExists(room_id);
}
void
-updateOutboundMegolmSession(const std::string &room_id, int message_index)
+updateOutboundMegolmSession(const std::string &room_id,
+ const OutboundGroupSessionData &data,
+ mtx::crypto::OutboundGroupSessionPtr &session)
{
- instance_->updateOutboundMegolmSession(room_id, message_index);
+ instance_->updateOutboundMegolmSession(room_id, data, session);
}
void
dropOutboundMegolmSession(const std::string &room_id)
@@ -4173,7 +4215,7 @@ saveInboundMegolmSession(const MegolmSessionIndex &index,
{
instance_->saveInboundMegolmSession(index, std::move(session));
}
-OlmInboundGroupSession *
+mtx::crypto::InboundGroupSessionPtr
getInboundMegolmSession(const MegolmSessionIndex &index)
{
return instance_->getInboundMegolmSession(index);
@@ -4220,10 +4262,4 @@ restoreOlmAccount()
{
return instance_->restoreOlmAccount();
}
-
-void
-restoreSessions()
-{
- return instance_->restoreSessions();
-}
} // namespace cache
diff --git a/src/Cache.h b/src/Cache.h
index 8cbb0006..f38f1960 100644
--- a/src/Cache.h
+++ b/src/Cache.h
@@ -235,13 +235,15 @@ isRoomMember(const std::string &user_id, const std::string &room_id);
void
saveOutboundMegolmSession(const std::string &room_id,
const OutboundGroupSessionData &data,
- mtx::crypto::OutboundGroupSessionPtr session);
+ mtx::crypto::OutboundGroupSessionPtr &session);
OutboundGroupSessionDataRef
getOutboundMegolmSession(const std::string &room_id);
bool
outboundMegolmSessionExists(const std::string &room_id) noexcept;
void
-updateOutboundMegolmSession(const std::string &room_id, int message_index);
+updateOutboundMegolmSession(const std::string &room_id,
+ const OutboundGroupSessionData &data,
+ mtx::crypto::OutboundGroupSessionPtr &session);
void
dropOutboundMegolmSession(const std::string &room_id);
@@ -256,7 +258,7 @@ exportSessionKeys();
void
saveInboundMegolmSession(const MegolmSessionIndex &index,
mtx::crypto::InboundGroupSessionPtr session);
-OlmInboundGroupSession *
+mtx::crypto::InboundGroupSessionPtr
getInboundMegolmSession(const MegolmSessionIndex &index);
bool
inboundMegolmSessionExists(const MegolmSessionIndex &index);
@@ -277,9 +279,7 @@ getLatestOlmSession(const std::string &curve25519);
void
saveOlmAccount(const std::string &pickled);
+
std::string
restoreOlmAccount();
-
-void
-restoreSessions();
}
diff --git a/src/CacheCryptoStructs.h b/src/CacheCryptoStructs.h
index 6256dcf9..eb2cc445 100644
--- a/src/CacheCryptoStructs.h
+++ b/src/CacheCryptoStructs.h
@@ -6,12 +6,28 @@
#include <mtx/responses/crypto.hpp>
#include <mtxclient/crypto/objects.hpp>
+struct DeviceAndMasterKeys
+{
+ // map from device id or master key id to message_index
+ std::map<std::string, uint64_t> devices, master_keys;
+};
+
+struct SharedWithUsers
+{
+ // userid to keys
+ std::map<std::string, DeviceAndMasterKeys> keys;
+};
+
// Extra information associated with an outbound megolm session.
struct OutboundGroupSessionData
{
std::string session_id;
std::string session_key;
uint64_t message_index = 0;
+
+ // who has access to this session.
+ // Rotate, when a user leaves the room and share, when a user gets added.
+ SharedWithUsers initially, currently;
};
void
@@ -21,7 +37,7 @@ from_json(const nlohmann::json &obj, OutboundGroupSessionData &msg);
struct OutboundGroupSessionDataRef
{
- OlmOutboundGroupSession *session;
+ mtx::crypto::OutboundGroupSessionPtr session;
OutboundGroupSessionData data;
};
@@ -52,18 +68,6 @@ to_json(nlohmann::json &obj, const MegolmSessionIndex &msg);
void
from_json(const nlohmann::json &obj, MegolmSessionIndex &msg);
-struct OlmSessionStorage
-{
- // Megolm sessions
- std::map<std::string, mtx::crypto::InboundGroupSessionPtr> group_inbound_sessions;
- std::map<std::string, mtx::crypto::OutboundGroupSessionPtr> group_outbound_sessions;
- std::map<std::string, OutboundGroupSessionData> group_outbound_session_data;
-
- // Guards for accessing megolm sessions.
- std::mutex group_outbound_mtx;
- std::mutex group_inbound_mtx;
-};
-
struct StoredOlmSession
{
std::uint64_t last_message_ts = 0;
diff --git a/src/Cache_p.h b/src/Cache_p.h
index 9c919fb5..fab2d964 100644
--- a/src/Cache_p.h
+++ b/src/Cache_p.h
@@ -59,6 +59,8 @@ public:
// user cache stores user keys
std::optional<UserKeyCache> userKeys(const std::string &user_id);
+ std::map<std::string, std::optional<UserKeyCache>> getMembersWithKeys(
+ const std::string &room_id);
void updateUserKeys(const std::string &sync_token,
const mtx::responses::QueryKeys &keyQuery);
void markUserKeysOutOfDate(lmdb::txn &txn,
@@ -232,10 +234,12 @@ public:
//
void saveOutboundMegolmSession(const std::string &room_id,
const OutboundGroupSessionData &data,
- mtx::crypto::OutboundGroupSessionPtr session);
+ mtx::crypto::OutboundGroupSessionPtr &session);
OutboundGroupSessionDataRef getOutboundMegolmSession(const std::string &room_id);
bool outboundMegolmSessionExists(const std::string &room_id) noexcept;
- void updateOutboundMegolmSession(const std::string &room_id, int message_index);
+ void updateOutboundMegolmSession(const std::string &room_id,
+ const OutboundGroupSessionData &data,
+ mtx::crypto::OutboundGroupSessionPtr &session);
void dropOutboundMegolmSession(const std::string &room_id);
void importSessionKeys(const mtx::crypto::ExportedSessionKeys &keys);
@@ -246,7 +250,8 @@ public:
//
void saveInboundMegolmSession(const MegolmSessionIndex &index,
mtx::crypto::InboundGroupSessionPtr session);
- OlmInboundGroupSession *getInboundMegolmSession(const MegolmSessionIndex &index);
+ mtx::crypto::InboundGroupSessionPtr getInboundMegolmSession(
+ const MegolmSessionIndex &index);
bool inboundMegolmSessionExists(const MegolmSessionIndex &index);
//
@@ -264,8 +269,6 @@ public:
void saveOlmAccount(const std::string &pickled);
std::string restoreOlmAccount();
- void restoreSessions();
-
signals:
void newReadReceipts(const QString &room_id, const std::vector<QString> &event_ids);
void roomReadStatus(const std::map<QString, bool> &status);
@@ -577,7 +580,6 @@ private:
QString localUserId_;
QString cacheDirectory_;
- OlmSessionStorage session_storage;
VerificationStorage verification_storage;
};
diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index cb5f242f..dab414a9 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -526,7 +526,6 @@ ChatPage::loadStateFromCache()
nhlog::db()->info("restoring state from cache");
try {
- cache::restoreSessions();
olm::client()->load(cache::restoreOlmAccount(), STORAGE_SECRET_KEY);
emit initializeEmptyViews(cache::client()->roomIds());
diff --git a/src/LoginPage.cpp b/src/LoginPage.cpp
index ac625db1..8076d6d6 100644
--- a/src/LoginPage.cpp
+++ b/src/LoginPage.cpp
@@ -90,6 +90,7 @@ LoginPage::LoginPage(QWidget *parent)
matrixid_input_ = new TextField(this);
matrixid_input_->setLabel(tr("Matrix ID"));
+ matrixid_input_->setRegexp(QRegularExpression("@.+?:.{3,}"));
matrixid_input_->setPlaceholderText(tr("e.g @joe:matrix.org"));
matrixid_input_->setToolTip(
tr("Your login name. A mxid should start with @ followed by the user id. After the user "
@@ -175,7 +176,6 @@ LoginPage::LoginPage(QWidget *parent)
connect(this, &LoginPage::versionOkCb, this, &LoginPage::versionOk);
connect(this, &LoginPage::versionErrorCb, this, &LoginPage::versionError);
- connect(this, &LoginPage::loginErrorCb, this, &LoginPage::loginError);
connect(back_button_, SIGNAL(clicked()), this, SLOT(onBackButtonClicked()));
connect(login_button_, SIGNAL(clicked()), this, SLOT(onLoginButtonClicked()));
@@ -186,32 +186,24 @@ LoginPage::LoginPage(QWidget *parent)
connect(matrixid_input_, SIGNAL(editingFinished()), this, SLOT(onMatrixIdEntered()));
connect(serverInput_, SIGNAL(editingFinished()), this, SLOT(onServerAddressEntered()));
}
-
void
-LoginPage::loginError(const QString &msg)
+LoginPage::showError(const QString &msg)
{
auto rect = QFontMetrics(font()).boundingRect(msg);
int width = rect.width();
int height = rect.height();
- error_label_->setFixedHeight(qCeil(width / 200) * height);
+ error_label_->setFixedHeight((int)qCeil(width / 200.0) * height);
error_label_->setText(msg);
}
void
-LoginPage::matrixIdError(const QString &msg)
-{
- error_matrixid_label_->show();
- error_matrixid_label_->setText(msg);
- matrixid_input_->setValid(false);
-}
-
-bool
-LoginPage::isMatrixIdValid()
+LoginPage::showError(QLabel *label, const QString &msg)
{
- QRegularExpressionValidator v(QRegularExpression("@.+?:.{3,}"), this);
- QString s = matrixid_input_->text();
- int pos = 0;
- return v.validate(s, pos) == QValidator::Acceptable;
+ auto rect = QFontMetrics(font()).boundingRect(msg);
+ int width = rect.width();
+ int height = rect.height();
+ label->setFixedHeight((int)qCeil(width / 200.0) * height);
+ label->setText(msg);
}
void
@@ -221,19 +213,21 @@ LoginPage::onMatrixIdEntered()
User user;
- if (!isMatrixIdValid()) {
- matrixIdError("You have entered an invalid Matrix ID e.g @joe:matrix.org");
+ if (!matrixid_input_->isValid()) {
+ error_matrixid_label_->show();
+ showError(error_matrixid_label_,
+ "You have entered an invalid Matrix ID e.g @joe:matrix.org");
return;
} else {
error_matrixid_label_->setText("");
error_matrixid_label_->hide();
- matrixid_input_->setValid(true);
}
try {
user = parse<User>(matrixid_input_->text().toStdString());
} catch (const std::exception &e) {
- matrixIdError("You have entered an invalid Matrix ID e.g @joe:matrix.org");
+ showError(error_matrixid_label_,
+ "You have entered an invalid Matrix ID e.g @joe:matrix.org");
return;
}
@@ -345,7 +339,7 @@ LoginPage::onServerAddressEntered()
void
LoginPage::versionError(const QString &error)
{
- loginError(error);
+ showError(error_label_, error);
serverInput_->show();
spinner_->stop();
@@ -383,25 +377,27 @@ LoginPage::onLoginButtonClicked()
User user;
- if (!isMatrixIdValid()) {
- matrixIdError("You have entered an invalid Matrix ID e.g @joe:matrix.org");
+ if (!matrixid_input_->isValid()) {
+ error_matrixid_label_->show();
+ showError(error_matrixid_label_,
+ "You have entered an invalid Matrix ID e.g @joe:matrix.org");
return;
} else {
error_matrixid_label_->setText("");
error_matrixid_label_->hide();
- matrixid_input_->setValid(true);
}
try {
user = parse<User>(matrixid_input_->text().toStdString());
} catch (const std::exception &e) {
- matrixIdError("You have entered an invalid Matrix ID e.g @joe:matrix.org");
+ showError(error_matrixid_label_,
+ "You have entered an invalid Matrix ID e.g @joe:matrix.org");
return;
}
if (loginMethod == LoginMethod::Password) {
if (password_input_->text().isEmpty())
- return loginError(tr("Empty password"));
+ return showError(error_label_, tr("Empty password"));
http::client()->login(
user.localpart(),
@@ -410,7 +406,8 @@ LoginPage::onLoginButtonClicked()
: deviceName_->text().toStdString(),
[this](const mtx::responses::Login &res, mtx::http::RequestErr err) {
if (err) {
- emit loginError(QString::fromStdString(err->matrix_error.error));
+ showError(error_label_,
+ QString::fromStdString(err->matrix_error.error));
emit errorOccurred();
return;
}
@@ -435,7 +432,8 @@ LoginPage::onLoginButtonClicked()
http::client()->login(
req, [this](const mtx::responses::Login &res, mtx::http::RequestErr err) {
if (err) {
- emit loginError(
+ showError(
+ error_label_,
QString::fromStdString(err->matrix_error.error));
emit errorOccurred();
return;
@@ -453,7 +451,7 @@ LoginPage::onLoginButtonClicked()
sso->deleteLater();
});
connect(sso, &SSOHandler::ssoFailed, this, [this, sso]() {
- emit loginError(tr("SSO login failed"));
+ showError(error_label_, tr("SSO login failed"));
emit errorOccurred();
sso->deleteLater();
});
diff --git a/src/LoginPage.h b/src/LoginPage.h
index 92b60afe..5ed21dec 100644
--- a/src/LoginPage.h
+++ b/src/LoginPage.h
@@ -56,7 +56,6 @@ signals:
//! Used to trigger the corresponding slot outside of the main thread.
void versionErrorCb(const QString &err);
- void loginErrorCb(const QString &err);
void versionOkCb(LoginPage::LoginMethod method);
void loginOk(const mtx::responses::Login &res);
@@ -66,8 +65,8 @@ protected:
public slots:
// Displays errors produced during the login.
- void loginError(const QString &msg);
- void matrixIdError(const QString &msg);
+ void showError(const QString &msg);
+ void showError(QLabel *label, const QString &msg);
private slots:
// Callback for the back button.
@@ -88,7 +87,6 @@ private slots:
void versionOk(LoginPage::LoginMethod method);
private:
- bool isMatrixIdValid();
void checkHomeserverVersion();
std::string initialDeviceName()
{
diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index 37b54151..60b5168b 100644
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -108,7 +108,7 @@ MainWindow::MainWindow(const QString profile, QWidget *parent)
connect(chat_page_, &ChatPage::unreadMessages, this, &MainWindow::setWindowTitle);
connect(chat_page_, SIGNAL(unreadMessages(int)), trayIcon_, SLOT(setUnreadCount(int)));
connect(chat_page_, &ChatPage::showLoginPage, this, [this](const QString &msg) {
- login_page_->loginError(msg);
+ login_page_->showError(msg);
showLoginPage();
});
diff --git a/src/Olm.cpp b/src/Olm.cpp
index cdafabf3..808279a3 100644
--- a/src/Olm.cpp
+++ b/src/Olm.cpp
@@ -278,11 +278,168 @@ mtx::events::msg::Encrypted
encrypt_group_message(const std::string &room_id, const std::string &device_id, nlohmann::json body)
{
using namespace mtx::events;
+ using namespace mtx::identifiers;
+
+ auto own_user_id = http::client()->user_id().to_string();
+
+ auto members = cache::client()->getMembersWithKeys(room_id);
+
+ std::map<std::string, std::vector<std::string>> sendSessionTo;
+ mtx::crypto::OutboundGroupSessionPtr session = nullptr;
+ OutboundGroupSessionData group_session_data;
+
+ if (cache::outboundMegolmSessionExists(room_id)) {
+ auto res = cache::getOutboundMegolmSession(room_id);
+
+ auto member_it = members.begin();
+ auto session_member_it = res.data.currently.keys.begin();
+ auto session_member_it_end = res.data.currently.keys.end();
+
+ while (member_it != members.end() || session_member_it != session_member_it_end) {
+ if (member_it == members.end()) {
+ // a member left, purge session!
+ nhlog::crypto()->debug(
+ "Rotating megolm session because of left member");
+ break;
+ }
+
+ if (session_member_it == session_member_it_end) {
+ // share with all remaining members
+ while (member_it != members.end()) {
+ sendSessionTo[member_it->first] = {};
+
+ if (member_it->second)
+ for (const auto &dev :
+ member_it->second->device_keys)
+ if (member_it->first != own_user_id ||
+ dev.first != device_id)
+ sendSessionTo[member_it->first]
+ .push_back(dev.first);
+
+ ++member_it;
+ }
+
+ session = std::move(res.session);
+ break;
+ }
+
+ if (member_it->first > session_member_it->first) {
+ // a member left, purge session
+ nhlog::crypto()->debug(
+ "Rotating megolm session because of left member");
+ break;
+ } else if (member_it->first < session_member_it->first) {
+ // new member, send them the session at this index
+ sendSessionTo[member_it->first] = {};
+
+ for (const auto &dev : member_it->second->device_keys)
+ if (member_it->first != own_user_id ||
+ dev.first != device_id)
+ sendSessionTo[member_it->first].push_back(
+ dev.first);
+
+ ++member_it;
+ } else {
+ // compare devices
+ bool device_removed = false;
+ for (const auto &dev : session_member_it->second.devices) {
+ if (!member_it->second ||
+ !member_it->second->device_keys.count(dev.first)) {
+ device_removed = true;
+ break;
+ }
+ }
+
+ if (device_removed) {
+ // device removed, rotate session!
+ nhlog::crypto()->debug(
+ "Rotating megolm session because of removed device of {}",
+ member_it->first);
+ break;
+ }
+
+ // check for new devices to share with
+ if (member_it->second)
+ for (const auto &dev : member_it->second->device_keys)
+ if (!session_member_it->second.devices.count(
+ dev.first) &&
+ (member_it->first != own_user_id ||
+ dev.first != device_id))
+ sendSessionTo[member_it->first].push_back(
+ dev.first);
+
+ ++member_it;
+ ++session_member_it;
+ if (member_it == members.end() &&
+ session_member_it == session_member_it_end) {
+ // all devices match or are newly added
+ session = std::move(res.session);
+ }
+ }
+ }
+
+ group_session_data = std::move(res.data);
+ }
+
+ if (!session) {
+ nhlog::ui()->debug("creating new outbound megolm session");
+
+ // Create a new outbound megolm session.
+ session = olm::client()->init_outbound_group_session();
+ const auto session_id = mtx::crypto::session_id(session.get());
+ const auto session_key = mtx::crypto::session_key(session.get());
+
+ // Saving the new megolm session.
+ OutboundGroupSessionData session_data{};
+ session_data.session_id = mtx::crypto::session_id(session.get());
+ session_data.session_key = mtx::crypto::session_key(session.get());
+ session_data.message_index = 0;
+
+ sendSessionTo.clear();
+
+ for (const auto &[user, devices] : members) {
+ sendSessionTo[user] = {};
+ session_data.initially.keys[user] = {};
+ if (devices) {
+ for (const auto &[device_id_, key] : devices->device_keys) {
+ (void)key;
+ if (device_id != device_id_ || user != own_user_id) {
+ sendSessionTo[user].push_back(device_id_);
+ session_data.initially.keys[user]
+ .devices[device_id_] = 0;
+ }
+ }
+ }
+ }
+
+ cache::saveOutboundMegolmSession(room_id, session_data, session);
+ group_session_data = std::move(session_data);
+
+ {
+ MegolmSessionIndex index;
+ index.room_id = room_id;
+ index.session_id = session_id;
+ index.sender_key = olm::client()->identity_keys().curve25519;
+ auto megolm_session =
+ olm::client()->init_inbound_group_session(session_key);
+ cache::saveInboundMegolmSession(index, std::move(megolm_session));
+ }
+ }
+
+ mtx::events::DeviceEvent<mtx::events::msg::RoomKey> megolm_payload{};
+ megolm_payload.content.algorithm = MEGOLM_ALGO;
+ megolm_payload.content.room_id = room_id;
+ megolm_payload.content.session_id = mtx::crypto::session_id(session.get());
+ megolm_payload.content.session_key = mtx::crypto::session_key(session.get());
+ megolm_payload.type = mtx::events::EventType::RoomKey;
+
+ if (!sendSessionTo.empty())
+ olm::send_encrypted_to_device_messages(sendSessionTo, megolm_payload);
- // relations shouldn't be encrypted...
mtx::common::ReplyRelatesTo relation;
mtx::common::RelatesTo r_relation;
+ // relations shouldn't be encrypted...
if (body["content"].contains("m.relates_to") &&
body["content"]["m.relates_to"].contains("m.in_reply_to")) {
relation = body["content"]["m.relates_to"];
@@ -292,25 +449,35 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id,
body["content"].erase("m.relates_to");
}
- // Always check before for existence.
- auto res = cache::getOutboundMegolmSession(room_id);
- auto payload = olm::client()->encrypt_group_message(res.session, body.dump());
+ auto payload = olm::client()->encrypt_group_message(session.get(), body.dump());
// Prepare the m.room.encrypted event.
msg::Encrypted data;
data.ciphertext = std::string((char *)payload.data(), payload.size());
data.sender_key = olm::client()->identity_keys().curve25519;
- data.session_id = res.data.session_id;
+ data.session_id = mtx::crypto::session_id(session.get());
data.device_id = device_id;
data.algorithm = MEGOLM_ALGO;
data.relates_to = relation;
data.r_relates_to = r_relation;
- auto message_index = olm_outbound_group_session_message_index(res.session);
- nhlog::crypto()->debug("next message_index {}", message_index);
+ group_session_data.message_index = olm_outbound_group_session_message_index(session.get());
+ nhlog::crypto()->debug("next message_index {}", group_session_data.message_index);
+
+ // update current set of members for the session with the new members and that message_index
+ for (const auto &[user, devices] : sendSessionTo) {
+ if (!group_session_data.currently.keys.count(user))
+ group_session_data.currently.keys[user] = {};
+
+ for (const auto &device_id_ : devices) {
+ if (!group_session_data.currently.keys[user].devices.count(device_id_))
+ group_session_data.currently.keys[user].devices[device_id_] =
+ group_session_data.message_index;
+ }
+ }
// We need to re-pickle the session after we send a message to save the new message_index.
- cache::updateOutboundMegolmSession(room_id, message_index);
+ cache::updateOutboundMegolmSession(room_id, group_session_data, session);
return data;
}
@@ -534,7 +701,7 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR
return;
}
- auto session_key = mtx::crypto::export_session(session);
+ auto session_key = mtx::crypto::export_session(session.get());
//
// Prepare the m.room_key event.
//
@@ -584,8 +751,9 @@ decryptEvent(const MegolmSessionIndex &index,
std::string msg_str;
try {
auto session = cache::client()->getInboundMegolmSession(index);
- auto res = olm::client()->decrypt_group_message(session, event.content.ciphertext);
- msg_str = std::string((char *)res.data.data(), res.data.size());
+ auto res =
+ olm::client()->decrypt_group_message(session.get(), event.content.ciphertext);
+ msg_str = std::string((char *)res.data.data(), res.data.size());
} catch (const lmdb::error &e) {
return {DecryptionErrorCode::DbError, e.what(), std::nullopt};
} catch (const mtx::crypto::olm_exception &e) {
diff --git a/src/RegisterPage.cpp b/src/RegisterPage.cpp
index b8fe93b5..26a66ab7 100644
--- a/src/RegisterPage.cpp
+++ b/src/RegisterPage.cpp
@@ -20,6 +20,7 @@
#include <QPainter>
#include <QStyleOption>
#include <QTimer>
+#include <QtMath>
#include <mtx/responses/register.hpp>
@@ -86,13 +87,13 @@ RegisterPage::RegisterPage(QWidget *parent)
username_input_ = new TextField();
username_input_->setLabel(tr("Username"));
- username_input_->setValidator(
- new QRegularExpressionValidator(QRegularExpression("[a-z0-9._=/-]+"), this));
+ username_input_->setRegexp(QRegularExpression("[a-z0-9._=/-]+"));
username_input_->setToolTip(tr("The username must not be empty, and must contain only the "
"characters a-z, 0-9, ., _, =, -, and /."));
password_input_ = new TextField();
password_input_->setLabel(tr("Password"));
+ password_input_->setRegexp(QRegularExpression("^.{8,}$"));
password_input_->setEchoMode(QLineEdit::Password);
password_input_->setToolTip(tr("Please choose a secure password. The exact requirements "
"for password strength may depend on your server."));
@@ -107,19 +108,32 @@ RegisterPage::RegisterPage(QWidget *parent)
tr("A server that allows registration. Since matrix is decentralized, you need to first "
"find a server you can register on or host your own."));
+ error_username_label_ = new QLabel(this);
+ error_username_label_->setWordWrap(true);
+ error_username_label_->hide();
+
+ error_password_label_ = new QLabel(this);
+ error_password_label_->setWordWrap(true);
+ error_password_label_->hide();
+
+ error_password_confirmation_label_ = new QLabel(this);
+ error_password_confirmation_label_->setWordWrap(true);
+ error_password_confirmation_label_->hide();
+
form_layout_->addWidget(username_input_, Qt::AlignHCenter);
+ form_layout_->addWidget(error_username_label_, Qt::AlignHCenter);
form_layout_->addWidget(password_input_, Qt::AlignHCenter);
+ form_layout_->addWidget(error_password_label_, Qt::AlignHCenter);
form_layout_->addWidget(password_confirmation_, Qt::AlignHCenter);
+ form_layout_->addWidget(error_password_confirmation_label_, Qt::AlignHCenter);
form_layout_->addWidget(server_input_, Qt::AlignHCenter);
button_layout_ = new QHBoxLayout();
button_layout_->setSpacing(0);
button_layout_->setMargin(0);
- QFont font;
-
error_label_ = new QLabel(this);
- error_label_->setFont(font);
+ error_label_->setWordWrap(true);
register_button_ = new RaisedButton(tr("REGISTER"), this);
register_button_->setMinimumSize(350, 65);
@@ -135,17 +149,24 @@ RegisterPage::RegisterPage(QWidget *parent)
top_layout_->addLayout(form_wrapper_);
top_layout_->addStretch(1);
top_layout_->addLayout(button_layout_);
- top_layout_->addStretch(1);
top_layout_->addWidget(error_label_, 0, Qt::AlignHCenter);
+ top_layout_->addStretch(1);
connect(back_button_, SIGNAL(clicked()), this, SLOT(onBackButtonClicked()));
connect(register_button_, SIGNAL(clicked()), this, SLOT(onRegisterButtonClicked()));
connect(username_input_, SIGNAL(returnPressed()), register_button_, SLOT(click()));
+ connect(username_input_, &TextField::editingFinished, this, &RegisterPage::checkFields);
connect(password_input_, SIGNAL(returnPressed()), register_button_, SLOT(click()));
+ connect(password_input_, &TextField::editingFinished, this, &RegisterPage::checkFields);
connect(password_confirmation_, SIGNAL(returnPressed()), register_button_, SLOT(click()));
+ connect(
+ password_confirmation_, &TextField::editingFinished, this, &RegisterPage::checkFields);
connect(server_input_, SIGNAL(returnPressed()), register_button_, SLOT(click()));
- connect(this, &RegisterPage::registerErrorCb, this, &RegisterPage::registerError);
+ connect(server_input_, &TextField::editingFinished, this, &RegisterPage::checkFields);
+ connect(this, &RegisterPage::registerErrorCb, this, [this](const QString &msg) {
+ showError(msg);
+ });
connect(
this,
&RegisterPage::registrationFlow,
@@ -299,25 +320,93 @@ RegisterPage::onBackButtonClicked()
}
void
-RegisterPage::registerError(const QString &msg)
+RegisterPage::showError(const QString &msg)
{
emit errorOccurred();
+ auto rect = QFontMetrics(font()).boundingRect(msg);
+ int width = rect.width();
+ int height = rect.height();
+ error_label_->setFixedHeight(qCeil(width / 200.0) * height);
error_label_->setText(msg);
}
void
-RegisterPage::onRegisterButtonClicked()
+RegisterPage::showError(QLabel *label, const QString &msg)
+{
+ emit errorOccurred();
+ auto rect = QFontMetrics(font()).boundingRect(msg);
+ int width = rect.width();
+ int height = rect.height();
+ label->setFixedHeight((int)qCeil(width / 200.0) * height);
+ label->setText(msg);
+}
+
+bool
+RegisterPage::checkOneField(QLabel *label, const TextField *t_field, const QString &msg)
+{
+ if (t_field->isValid()) {
+ label->setText("");
+ label->hide();
+ return true;
+ } else {
+ label->show();
+ showError(label, msg);
+ return false;
+ }
+}
+
+bool
+RegisterPage::checkFields()
{
error_label_->setText("");
+ error_username_label_->setText("");
+ error_password_label_->setText("");
+ error_password_confirmation_label_->setText("");
+
+ error_username_label_->hide();
+ error_password_label_->hide();
+ error_password_confirmation_label_->hide();
+
+ password_confirmation_->setValid(true);
+ server_input_->setValid(true);
+
+ bool all_fields_good = true;
+ if (username_input_->isModified() &&
+ !checkOneField(error_username_label_,
+ username_input_,
+ tr("The username must not be empty, and must contain only the "
+ "characters a-z, 0-9, ., _, =, -, and /."))) {
+ all_fields_good = false;
+ } else if (password_input_->isModified() &&
+ !checkOneField(error_password_label_,
+ password_input_,
+ tr("Password is not long enough (min 8 chars)"))) {
+ all_fields_good = false;
+ } else if (password_confirmation_->isModified() &&
+ password_input_->text() != password_confirmation_->text()) {
+ error_password_confirmation_label_->show();
+ showError(error_password_confirmation_label_, tr("Passwords don't match"));
+ password_confirmation_->setValid(false);
+ all_fields_good = false;
+ } else if (server_input_->isModified() &&
+ (!server_input_->hasAcceptableInput() || server_input_->text().isEmpty())) {
+ showError(tr("Invalid server name"));
+ server_input_->setValid(false);
+ all_fields_good = false;
+ }
+ if (!username_input_->isModified() || !password_input_->isModified() ||
+ !password_confirmation_->isModified() || !server_input_->isModified()) {
+ all_fields_good = false;
+ }
+ return all_fields_good;
+}
- if (!username_input_->hasAcceptableInput()) {
- registerError(tr("Invalid username"));
- } else if (!password_input_->hasAcceptableInput()) {
- registerError(tr("Password is not long enough (min 8 chars)"));
- } else if (password_input_->text() != password_confirmation_->text()) {
- registerError(tr("Passwords don't match"));
- } else if (!server_input_->hasAcceptableInput()) {
- registerError(tr("Invalid server name"));
+void
+RegisterPage::onRegisterButtonClicked()
+{
+ if (!checkFields()) {
+ showError(error_label_, tr("One or more fields have invalid inputs. Please correct those issues and try again."));
+ return;
} else {
auto username = username_input_->text().toStdString();
auto password = password_input_->text().toStdString();
diff --git a/src/RegisterPage.h b/src/RegisterPage.h
index 59ba3d1d..6d212955 100644
--- a/src/RegisterPage.h
+++ b/src/RegisterPage.h
@@ -57,10 +57,13 @@ private slots:
void onBackButtonClicked();
void onRegisterButtonClicked();
- // Display registration specific errors to the user.
- void registerError(const QString &msg);
+ // function for showing different errors
+ void showError(const QString &msg);
private:
+ bool checkOneField(QLabel *label, const TextField *t_field, const QString &msg);
+ bool checkFields();
+ void showError(QLabel *label, const QString &msg);
QVBoxLayout *top_layout_;
QHBoxLayout *back_layout_;
@@ -69,6 +72,9 @@ private:
QLabel *logo_;
QLabel *error_label_;
+ QLabel *error_username_label_;
+ QLabel *error_password_label_;
+ QLabel *error_password_confirmation_label_;
FlatButton *back_button_;
RaisedButton *register_button_;
diff --git a/src/WelcomePage.cpp b/src/WelcomePage.cpp
index e4b0e1c6..22b73ac7 100644
--- a/src/WelcomePage.cpp
+++ b/src/WelcomePage.cpp
@@ -37,8 +37,7 @@ WelcomePage::WelcomePage(QWidget *parent)
QFont subTitleFont;
subTitleFont.setPointSizeF(subTitleFont.pointSizeF() * 1.5);
- QIcon icon;
- icon.addFile(":/logos/splash.png");
+ QIcon icon{QIcon::fromTheme("nheko", QIcon{":/logos/splash.png"})};
auto logo_ = new QLabel(this);
logo_->setPixmap(icon.pixmap(256));
diff --git a/src/main.cpp b/src/main.cpp
index 6fbccf5c..5eeebb82 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -174,7 +174,7 @@ main(int argc, char *argv[])
parser.process(app);
- app.setWindowIcon(QIcon(":/logos/nheko.png"));
+ app.setWindowIcon(QIcon::fromTheme("nheko", QIcon{":/logos/nheko.png"}));
http::init();
diff --git a/src/timeline/EventStore.cpp b/src/timeline/EventStore.cpp
index 1cb729d3..e561d099 100644
--- a/src/timeline/EventStore.cpp
+++ b/src/timeline/EventStore.cpp
@@ -604,8 +604,9 @@ EventStore::decryptEvent(const IdIndex &idx,
std::string msg_str;
try {
auto session = cache::client()->getInboundMegolmSession(index);
- auto res = olm::client()->decrypt_group_message(session, e.content.ciphertext);
- msg_str = std::string((char *)res.data.data(), res.data.size());
+ auto res =
+ olm::client()->decrypt_group_message(session.get(), e.content.ciphertext);
+ msg_str = std::string((char *)res.data.data(), res.data.size());
} catch (const lmdb::error &e) {
nhlog::db()->critical("failed to retrieve megolm session with index ({}, {}, {})",
index.room_id,
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 53791c98..11fa60c0 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -910,80 +910,16 @@ TimelineModel::sendEncryptedMessage(mtx::events::RoomEvent<T> msg, mtx::events::
{"room_id", room_id}};
try {
- // Check if we have already an outbound megolm session then we can use.
- if (cache::outboundMegolmSessionExists(room_id)) {
- mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> event;
- event.content =
- olm::encrypt_group_message(room_id, http::client()->device_id(), doc);
- event.event_id = msg.event_id;
- event.room_id = room_id;
- event.sender = http::client()->user_id().to_string();
- event.type = mtx::events::EventType::RoomEncrypted;
- event.origin_server_ts = QDateTime::currentMSecsSinceEpoch();
-
- emit this->addPendingMessageToStore(event);
- return;
- }
-
- nhlog::ui()->debug("creating new outbound megolm session");
-
- // Create a new outbound megolm session.
- auto outbound_session = olm::client()->init_outbound_group_session();
- const auto session_id = mtx::crypto::session_id(outbound_session.get());
- const auto session_key = mtx::crypto::session_key(outbound_session.get());
-
- mtx::events::DeviceEvent<mtx::events::msg::RoomKey> megolm_payload;
- megolm_payload.content.algorithm = "m.megolm.v1.aes-sha2";
- megolm_payload.content.room_id = room_id;
- megolm_payload.content.session_id = session_id;
- megolm_payload.content.session_key = session_key;
- megolm_payload.type = mtx::events::EventType::RoomKey;
-
- // Saving the new megolm session.
- // TODO: Maybe it's too early to save.
- OutboundGroupSessionData session_data;
- session_data.session_id = session_id;
- session_data.session_key = session_key;
- session_data.message_index = 0;
- cache::saveOutboundMegolmSession(
- room_id, session_data, std::move(outbound_session));
-
- {
- MegolmSessionIndex index;
- index.room_id = room_id;
- index.session_id = session_id;
- index.sender_key = olm::client()->identity_keys().curve25519;
- auto megolm_session =
- olm::client()->init_inbound_group_session(session_key);
- cache::saveInboundMegolmSession(index, std::move(megolm_session));
- }
-
- const auto members = cache::roomMembers(room_id);
- nhlog::ui()->info("retrieved {} members for {}", members.size(), room_id);
-
- std::map<std::string, std::vector<std::string>> targets;
- for (const auto &member : members)
- targets[member] = {};
-
- olm::send_encrypted_to_device_messages(targets, megolm_payload);
-
- try {
- mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> event;
- event.content =
- olm::encrypt_group_message(room_id, http::client()->device_id(), doc);
- event.event_id = msg.event_id;
- event.room_id = room_id;
- event.sender = http::client()->user_id().to_string();
- event.type = mtx::events::EventType::RoomEncrypted;
- event.origin_server_ts = QDateTime::currentMSecsSinceEpoch();
-
- emit this->addPendingMessageToStore(event);
- } catch (const lmdb::error &e) {
- nhlog::db()->critical("failed to save megolm outbound session: {}",
- e.what());
- emit ChatPage::instance()->showNotification(
- tr("Failed to encrypt event, sending aborted!"));
- }
+ mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> event;
+ event.content =
+ olm::encrypt_group_message(room_id, http::client()->device_id(), doc);
+ event.event_id = msg.event_id;
+ event.room_id = room_id;
+ event.sender = http::client()->user_id().to_string();
+ event.type = mtx::events::EventType::RoomEncrypted;
+ event.origin_server_ts = QDateTime::currentMSecsSinceEpoch();
+
+ emit this->addPendingMessageToStore(event);
// TODO: Let the user know about the errors.
} catch (const lmdb::error &e) {
diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index d0356e15..03eb53fc 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -363,6 +363,9 @@ TimelineViewManager::toggleCameraView()
void
TimelineViewManager::openImageOverlay(QString mxcUrl, QString eventId) const
{
+ if (mxcUrl.isEmpty()) {
+ return;
+ }
QQuickImageResponse *imgResponse =
imgProvider->requestImageResponse(mxcUrl.remove("mxc://"), QSize());
connect(imgResponse, &QQuickImageResponse::finished, this, [this, eventId, imgResponse]() {
diff --git a/src/ui/TextField.cpp b/src/ui/TextField.cpp
index 941d00a3..055fe73b 100644
--- a/src/ui/TextField.cpp
+++ b/src/ui/TextField.cpp
@@ -6,6 +6,7 @@
#include <QPaintEvent>
#include <QPainter>
#include <QPropertyAnimation>
+#include <QRegularExpressionValidator>
TextField::TextField(QWidget *parent)
: QLineEdit(parent)
@@ -70,18 +71,24 @@ TextField::hasLabel() const
return show_label_;
}
-bool
-TextField::isValid() const
-{
- return is_valid_;
-}
-
void
TextField::setValid(bool valid)
{
is_valid_ = valid;
}
+bool
+TextField::isValid() const
+{
+ QString s = text();
+ int pos = 0;
+ if (regexp_.pattern().isEmpty()) {
+ return is_valid_;
+ }
+ QRegularExpressionValidator v(QRegularExpression(regexp_), 0);
+ return v.validate(s, pos) == QValidator::Acceptable;
+}
+
void
TextField::setLabelFontSize(qreal size)
{
@@ -156,6 +163,12 @@ TextField::setUnderlineColor(const QColor &color)
update();
}
+void
+TextField::setRegexp(const QRegularExpression ®exp)
+{
+ regexp_ = regexp;
+}
+
QColor
TextField::underlineColor() const
{
diff --git a/src/ui/TextField.h b/src/ui/TextField.h
index 966155f4..01fd5782 100644
--- a/src/ui/TextField.h
+++ b/src/ui/TextField.h
@@ -4,6 +4,7 @@
#include <QLineEdit>
#include <QPaintEvent>
#include <QPropertyAnimation>
+#include <QRegularExpression>
#include <QStateMachine>
#include <QtGlobal>
@@ -30,6 +31,7 @@ public:
void setLabelFontSize(qreal size);
void setShowLabel(bool value);
void setUnderlineColor(const QColor &color);
+ void setRegexp(const QRegularExpression ®exp);
void setValid(bool valid);
QColor inkColor() const;
@@ -56,6 +58,7 @@ private:
TextFieldLabel *label_;
TextFieldStateMachine *state_machine_;
bool show_label_;
+ QRegularExpression regexp_;
bool is_valid_;
qreal label_font_size_;
};
|