Merge remote-tracking branch 'origin/master' into cross-signing

This commit is contained in:
Nicolas Werner 2020-09-24 21:36:43 +02:00
commit 4802c34009
43 changed files with 8773 additions and 2200 deletions

View File

@ -305,7 +305,6 @@ set(SRC_FILES
src/SideBarActions.cpp
src/Splitter.cpp
src/TextInputWidget.cpp
src/TopRoomBar.cpp
src/TrayIcon.cpp
src/UserInfoWidget.cpp
src/UserSettingsPage.cpp
@ -514,7 +513,6 @@ qt5_wrap_cpp(MOC_HEADERS
src/SideBarActions.h
src/Splitter.h
src/TextInputWidget.h
src/TopRoomBar.h
src/TrayIcon.h
src/UserInfoWidget.h
src/UserSettingsPage.h

View File

@ -132,6 +132,7 @@ Nheko can use bundled version for most of those libraries automatically, if the
To use them, you can enable the hunter integration by passing `-DHUNTER_ENABLED=ON`.
It is probably wise to link those dependencies statically by passing `-DBUILD_SHARED_LIBS=OFF`
You can select which bundled dependencies you want to use py passing various `-DUSE_BUNDLED_*` flags. By default all dependencies are bundled *if* you enable hunter.
If you experience build issues and you are trying to link `mtxclient` library without hunter, make sure the library version(commit) as mentioned in the `CMakeList.txt` is used. Sometimes we have to make breaking changes in `mtxclient` and for that period the master branch of both repos may not be compatible.
The bundle flags are currently:

1995
resources/langs/nheko_cs.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1359"/>
<location filename="../../src/Cache.cpp" line="+1658"/>
<source>You joined this room.</source>
<translation>Du bist dem Raum beigetreten.</translation>
</message>
@ -12,33 +12,53 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+229"/>
<location filename="../../src/ChatPage.cpp" line="+218"/>
<source>Failed to invite user: %1</source>
<translation>Nutzer konnte nicht eingeladen werden: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+926"/>
<location line="+947"/>
<source>Invited user: %1</source>
<translation>Eingeladener Benutzer: %1</translation>
</message>
<message>
<location line="-474"/>
<location line="-458"/>
<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>Migrieren des Caches auf die aktuelle Version fehlgeschlagen. Das kann verschiedene Gründe als Ursache haben. Bitte lege einen Bugreport an und verwende in der Zwischenzeit eine ältere Version. Alternativ kannst du das Cache manuell entfernen.</translation>
<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="+439"/>
<location line="+415"/>
<source>Room %1 created.</source>
<translation>Raum %1 erzeugt.</translation>
</message>
<message>
<location line="+30"/>
<location line="+26"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to invite %1 to %2: %3</source>
<translation>Einladung von %1 in Raum %2 fehlgeschlagen: %3</translation>
</message>
<message>
<location line="+19"/>
<location line="+15"/>
<source>Confirm kick</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to kick %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to kick %1 to %2: %3</source>
<translation>%1 konnte nicht aus %2 gekickt werden: %3</translation>
</message>
@ -48,7 +68,17 @@
<translation>%1 wurde gekickt.</translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm ban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to ban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to ban %1 in %2: %3</source>
<translation>%1 konnte nicht aus %2 verbannt werden: %3</translation>
</message>
@ -58,7 +88,17 @@
<translation>%1 wurde gebannt.</translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm unban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to unban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to unban %1 in %2: %3</source>
<translation>Verbannung von %1 aus %2 konnte nicht aufgehoben werden: %3</translation>
</message>
@ -68,12 +108,12 @@
<translation>Verbannung von %1 wurde aufgehoben.</translation>
</message>
<message>
<location line="-828"/>
<location line="-874"/>
<source>Failed to upload media. Please try again.</source>
<translation>Medienupload fehlgeschlagen. Bitte versuche es erneut.</translation>
</message>
<message>
<location line="+296"/>
<location line="+334"/>
<source>Cache migration failed!</source>
<translation>Cache migration fehlgeschlagen!</translation>
</message>
@ -85,31 +125,31 @@
<message>
<location line="+1"/>
<source>The cache on your disk is newer than this version of Nheko supports. Please update or clear your cache.</source>
<translation>Das Cache auf der Festplatte wurde mit einer neueren Nheko version angelegt. Bitte aktualisiere Nheko oder entferne das Cache.</translation>
<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="+111"/>
<location line="+67"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Wiederherstellung des OLM Accounts fehlgeschlagen. Bitte logge dich erneut ein.</translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Failed to restore save data. Please login again.</source>
<translation>Gespeicherte Nachrichten konnten nicht wiederhergestellt werden. Bitte melde Dich erneut an.</translation>
</message>
<message>
<location line="+156"/>
<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>
<message>
<location line="+54"/>
<location line="+252"/>
<location line="+99"/>
<location line="+251"/>
<source>Please try to login again: %1</source>
<translation>Bitte melde dich erneut an: %1</translation>
</message>
<message>
<location line="-187"/>
<location line="-219"/>
<source>Failed to join room: %1</source>
<translation>Konnte Raum nicht betreten: %1</translation>
</message>
@ -198,22 +238,22 @@
<location filename="../qml/emoji/EmojiPicker.qml" line="+117"/>
<location line="+139"/>
<source>Search</source>
<translation type="unfinished"></translation>
<translation>Suche</translation>
</message>
<message>
<location line="-42"/>
<source>People</source>
<translation type="unfinished"></translation>
<translation>Leute</translation>
</message>
<message>
<location line="+2"/>
<source>Nature</source>
<translation type="unfinished"></translation>
<translation>Natur</translation>
</message>
<message>
<location line="+2"/>
<source>Food</source>
<translation type="unfinished"></translation>
<translation>Essen</translation>
</message>
<message>
<location line="+2"/>
@ -223,7 +263,7 @@
<message>
<location line="+2"/>
<source>Travel</source>
<translation type="unfinished"></translation>
<translation>Reisen</translation>
</message>
<message>
<location line="+2"/>
@ -251,7 +291,44 @@
<message>
<location line="+2"/>
<source>This message is not encrypted!</source>
<translation>Diese Nachricht ist nicht verschlüsselt!</translation>
<translation>Diese Nachricht ist unverschlüsselt!</translation>
</message>
</context>
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+418"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished">-- Verschlüsseltes Event (keine Schlüssel zur Entschlüsselung gefunden) --</translation>
</message>
<message>
<location line="+19"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;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="+14"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation type="unfinished">-- Entschlüsselungsfehler (%1) --</translation>
</message>
<message>
<location line="+10"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished">-- Verschlüsseltes Event (Unbekannter Eventtyp) --</translation>
</message>
<message>
<location line="+13"/>
<source>-- Replay attack! This message index was reused! --</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>-- Message by unverified device! --</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -371,6 +448,7 @@ Beispiel: https://mein.server:8787</translation>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+66"/>
<location line="+6"/>
<source>redacted</source>
<translation>gelöscht</translation>
</message>
@ -404,6 +482,36 @@ Beispiel: https://mein.server:8787</translation>
<source>%1 created and configured room: %2</source>
<translation>%1 hat den Raum erstellt: %2</translation>
</message>
<message>
<location line="+7"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a video call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 answered the call.</source>
<translation>%1 hat den Anruf angenommen.</translation>
</message>
<message>
<location line="+6"/>
<source>%1 ended the call.</source>
<translation>%1 hat den Anruf beendet.</translation>
</message>
<message>
<location line="+6"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Placeholder</name>
@ -492,7 +600,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+984"/>
<location filename="../../src/Cache.cpp" line="+1443"/>
<source>no version stored</source>
<translation>keine Version gespeichert</translation>
</message>
@ -616,13 +724,13 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>TextInputWidget</name>
<message>
<location filename="../../src/TextInputWidget.cpp" line="+460"/>
<location filename="../../src/TextInputWidget.cpp" line="+574"/>
<source>Send a file</source>
<translation>Versende Datei</translation>
</message>
<message>
<location line="+13"/>
<location filename="../../src/TextInputWidget.h" line="+145"/>
<location filename="../../src/TextInputWidget.h" line="+160"/>
<source>Write a message...</source>
<translation>Schreibe eine Nachricht</translation>
</message>
@ -637,7 +745,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Emoji</translation>
</message>
<message>
<location line="+86"/>
<location line="+94"/>
<source>Select a file</source>
<translation>Datei auswählen</translation>
</message>
@ -646,6 +754,16 @@ Beispiel: https://mein.server:8787</translation>
<source>All Files (*)</source>
<translation>Alle Dateien (*)</translation>
</message>
<message>
<location line="+64"/>
<source>Place a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/TextInputWidget.h" line="-5"/>
<source>Connection lost. Nheko is trying to re-connect...</source>
@ -655,30 +773,20 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+891"/>
<source>-- Decryption Error (failed to communicate with DB) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
<translation>-- Entschlüsselungsfehler (Fehler bei Kommunikation mit Datenbank) --</translation>
</message>
<message>
<location line="+20"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation>-- Entschlüsselungsfehler (Fehler bei Suche nach megolm Schlüsseln in Datenbank) --</translation>
</message>
<message>
<location line="+13"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1.</comment>
<translation>-- Entschlüsselungsfehler (%1) --</translation>
</message>
<message>
<location line="+99"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+805"/>
<source>Message redaction failed: %1</source>
<translation>Nachricht zurückziehen fehlgeschlagen: %1</translation>
</message>
<message>
<location line="+488"/>
<location line="+114"/>
<location line="+17"/>
<location line="+101"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+195"/>
<source>Save image</source>
<translation>Bild speichern</translation>
</message>
@ -697,20 +805,8 @@ Beispiel: https://mein.server:8787</translation>
<source>Save file</source>
<translation>Datei speichern</translation>
</message>
<message>
<location line="-643"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation>-- Verschlüsseltes Event (keine Schlüssel zur Entschlüsselung gefunden) --</translation>
</message>
<message>
<location line="+82"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation>-- Verschlüsseltes Event (Unbekannter Eventtyp) --</translation>
</message>
<message numerus="yes">
<location line="+693"/>
<location line="+129"/>
<source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation>
@ -764,7 +860,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>%1 hat die Berechtigungen dieses Raums bearbeitet.</translation>
</message>
<message>
<location line="+48"/>
<location line="+33"/>
<source>%1 was invited.</source>
<translation>%1 wurde eingeladen.</translation>
</message>
@ -829,12 +925,12 @@ Beispiel: https://mein.server:8787</translation>
<translation>%1 hat das Anklopfen zurückgezogen.</translation>
</message>
<message>
<location line="-1281"/>
<location line="-943"/>
<source>You joined this room.</source>
<translation>Du bist dem Raum beigetreten.</translation>
</message>
<message>
<location line="+1283"/>
<location line="+945"/>
<source>Rejected the knock from %1.</source>
<translation>Hat das Anklopfen von %1 abgewiesen.</translation>
</message>
@ -858,12 +954,12 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+91"/>
<location filename="../qml/TimelineRow.qml" line="+94"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<location line="+16"/>
<source>Reply</source>
<translation>Antworten</translation>
</message>
@ -876,7 +972,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+54"/>
<location filename="../qml/TimelineView.qml" line="+61"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
@ -916,49 +1012,52 @@ Beispiel: https://mein.server:8787</translation>
<translation>Speichern unter...</translation>
</message>
<message>
<location line="+14"/>
<location line="+12"/>
<source>No room open</source>
<translation>Kein Raum geöffnet</translation>
</message>
<message>
<location line="+271"/>
<location line="+53"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+15"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+28"/>
<source>Room options</source>
<translation type="unfinished">Raumoptionen</translation>
</message>
<message>
<location line="+7"/>
<source>Invite users</source>
<translation type="unfinished">Benutzer einladen</translation>
</message>
<message>
<location line="+4"/>
<source>Members</source>
<translation type="unfinished">Teilnehmer</translation>
</message>
<message>
<location line="+4"/>
<source>Leave room</source>
<translation type="unfinished">Raum verlassen</translation>
</message>
<message>
<location line="+4"/>
<source>Settings</source>
<translation type="unfinished">Einstellungen</translation>
</message>
<message>
<location line="+253"/>
<source>Close</source>
<translation>Schließen</translation>
</message>
</context>
<context>
<name>TopRoomBar</name>
<message>
<location filename="../../src/TopRoomBar.cpp" line="+86"/>
<source>Room options</source>
<translation>Raumoptionen</translation>
</message>
<message>
<location line="+5"/>
<source>Mentions</source>
<translation>Erwähnungen</translation>
</message>
<message>
<location line="+34"/>
<source>Invite users</source>
<translation>Benutzer einladen</translation>
</message>
<message>
<location line="+6"/>
<source>Members</source>
<translation>Teilnehmer</translation>
</message>
<message>
<location line="+5"/>
<source>Leave room</source>
<translation>Raum verlassen</translation>
</message>
<message>
<location line="+5"/>
<source>Settings</source>
<translation>Einstellungen</translation>
</message>
</context>
<context>
<name>TrayIcon</name>
<message>
@ -1018,7 +1117,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+535"/>
<location filename="../../src/UserSettingsPage.cpp" line="+566"/>
<source>Minimize to tray</source>
<translation>Ins Benachrichtigungsfeld minimieren</translation>
</message>
@ -1038,7 +1137,12 @@ Beispiel: https://mein.server:8787</translation>
<translation>Runde Profilbilder</translation>
</message>
<message>
<location line="-5"/>
<location line="-63"/>
<source>CALLS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Keep the application running in the background after closing the client window.</source>
<translation type="unfinished"></translation>
</message>
@ -1201,7 +1305,17 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Erscheinungsbild</translation>
</message>
<message>
<location line="+3"/>
<location line="+4"/>
<source>Allow fallback call assist server</source>
<translation type="unfinished"></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>
</message>
<message>
<location line="+4"/>
<source>Device ID</source>
<translation>Geräte-ID</translation>
</message>
@ -1211,7 +1325,7 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Gerätefingerabdruck</translation>
</message>
<message>
<location line="-113"/>
<location line="-120"/>
<source>Session Keys</source>
<translation>Sitzungsschlüssel</translation>
</message>
@ -1231,22 +1345,22 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>VERSCHLÜSSELUNG</translation>
</message>
<message>
<location line="-71"/>
<location line="-78"/>
<source>GENERAL</source>
<translation>ALLGEMEINES</translation>
</message>
<message>
<location line="+29"/>
<location line="+30"/>
<source>INTERFACE</source>
<translation>OBERFLÄCHE</translation>
</message>
<message>
<location line="+166"/>
<location line="+172"/>
<source>Emoji Font Family</source>
<translation>Emojischriftart</translation>
</message>
<message>
<location line="+179"/>
<location line="+191"/>
<source>Open Sessions File</source>
<translation>Öffne Sessions Datei</translation>
</message>
@ -1318,11 +1432,24 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+147"/>
<location filename="../../src/Utils.cpp" line="+146"/>
<source>Yesterday</source>
<translation>Gestern</translation>
</message>
</context>
<context>
<name>dialogs::AcceptCall</name>
<message>
<location filename="../../src/dialogs/AcceptCall.cpp" line="+89"/>
<source>Accept</source>
<translation type="unfinished">Akzeptieren</translation>
</message>
<message>
<location line="+5"/>
<source>Reject</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::CreateRoom</name>
<message>
@ -1446,6 +1573,19 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Willst du dich wirklich abmelden?</translation>
</message>
</context>
<context>
<name>dialogs::PlaceCall</name>
<message>
<location filename="../../src/dialogs/PlaceCall.cpp" line="+60"/>
<source>Voice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Cancel</source>
<translation type="unfinished">Abbrechen</translation>
</message>
</context>
<context>
<name>dialogs::PreviewUploadOverlay</name>
<message>
@ -1644,7 +1784,7 @@ Medien-Größe: %2
<context>
<name>dialogs::UserProfile</name>
<message>
<location filename="../../src/dialogs/UserProfile.cpp" line="+63"/>
<location filename="../../src/dialogs/UserProfile.cpp" line="+64"/>
<source>Ban the user from the room</source>
<translation>Banne den Nutzer aus diesem Raum</translation>
</message>
@ -1664,7 +1804,17 @@ Medien-Größe: %2
<translation>Gespräch beginnen</translation>
</message>
<message>
<location line="+61"/>
<location line="+14"/>
<source>Confirm DM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2) to a direct chat?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<source>Devices</source>
<translation>Geräte</translation>
</message>
@ -1715,7 +1865,7 @@ Medien-Größe: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+103"/>
<location filename="../../src/Utils.h" line="+106"/>
<source>You sent an audio clip</source>
<translation>Du hast eine Audiodatei gesendet.</translation>
</message>
@ -1794,6 +1944,36 @@ Medien-Größe: %2
<source>%1 sent an encrypted message</source>
<translation>%1 hat eine verschlüsselte Nachricht gesendet.</translation>
</message>
<message>
<location line="+5"/>
<source>You placed a call</source>
<translation>Du hast angerufen</translation>
</message>
<message>
<location line="+3"/>
<source>%1 placed a call</source>
<translation>%1 hat angerufen</translation>
</message>
<message>
<location line="+5"/>
<source>You answered a call</source>
<translation>Du hast einen Anruf angenommen</translation>
</message>
<message>
<location line="+3"/>
<source>%1 answered a call</source>
<translation>%1 hat einen Anruf angenommen</translation>
</message>
<message>
<location line="+5"/>
<source>You ended a call</source>
<translation>Du hast einen Anruf beendet</translation>
</message>
<message>
<location line="+3"/>
<source>%1 ended a call</source>
<translation>%1 hat einen Anruf beendet</translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>

View File

@ -4,7 +4,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1359"/>
<location filename="../../src/Cache.cpp" line="+1658"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@ -12,33 +12,53 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+229"/>
<location filename="../../src/ChatPage.cpp" line="+218"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<location line="+926"/>
<location line="+947"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-474"/>
<location line="-458"/>
<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="+439"/>
<location line="+415"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+26"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to invite %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+15"/>
<source>Confirm kick</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to kick %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to kick %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +68,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm ban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to ban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to ban %1 in %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -58,7 +88,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm unban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to unban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to unban %1 in %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -68,12 +108,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="-828"/>
<location line="-874"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+296"/>
<location line="+334"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -88,28 +128,28 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+111"/>
<location line="+67"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Failed to restore save data. Please login again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<location line="+252"/>
<location line="+99"/>
<location line="+251"/>
<source>Please try to login again: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-187"/>
<location line="-219"/>
<source>Failed to join room: %1</source>
<translation type="unfinished"></translation>
</message>
@ -254,6 +294,43 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+418"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+10"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>-- Replay attack! This message index was reused! --</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>-- Message by unverified device! --</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -367,6 +444,7 @@ Example: https://server.my:8787</source>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+66"/>
<location line="+6"/>
<source>redacted</source>
<translation type="unfinished"></translation>
</message>
@ -400,6 +478,36 @@ Example: https://server.my:8787</source>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a video call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Placeholder</name>
@ -488,7 +596,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+984"/>
<location filename="../../src/Cache.cpp" line="+1443"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -612,13 +720,13 @@ Example: https://server.my:8787</source>
<context>
<name>TextInputWidget</name>
<message>
<location filename="../../src/TextInputWidget.cpp" line="+460"/>
<location filename="../../src/TextInputWidget.cpp" line="+574"/>
<source>Send a file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location filename="../../src/TextInputWidget.h" line="+145"/>
<location filename="../../src/TextInputWidget.h" line="+160"/>
<source>Write a message...</source>
<translation>Γράψε ένα μήνυμα...</translation>
</message>
@ -633,7 +741,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+86"/>
<location line="+94"/>
<source>Select a file</source>
<translation>Διάλεξε ένα αρχείο</translation>
</message>
@ -642,6 +750,16 @@ Example: https://server.my:8787</source>
<source>All Files (*)</source>
<translation>Όλα τα αρχεία (*)</translation>
</message>
<message>
<location line="+64"/>
<source>Place a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/TextInputWidget.h" line="-5"/>
<source>Connection lost. Nheko is trying to re-connect...</source>
@ -651,30 +769,20 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+891"/>
<source>-- Decryption Error (failed to communicate with DB) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+20"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+99"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+805"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+488"/>
<location line="+114"/>
<location line="+17"/>
<location line="+101"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+195"/>
<source>Save image</source>
<translation type="unfinished">Αποθήκευση Εικόνας</translation>
</message>
@ -693,20 +801,8 @@ Example: https://server.my:8787</source>
<source>Save file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-643"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+82"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+693"/>
<location line="+129"/>
<source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation type="unfinished">
@ -760,7 +856,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+48"/>
<location line="+33"/>
<source>%1 was invited.</source>
<translation type="unfinished"></translation>
</message>
@ -825,12 +921,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-1281"/>
<location line="-943"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1283"/>
<location line="+945"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -854,12 +950,12 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+91"/>
<location filename="../qml/TimelineRow.qml" line="+94"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -872,7 +968,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+54"/>
<location filename="../qml/TimelineView.qml" line="+61"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
@ -912,47 +1008,50 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+12"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+271"/>
<source>Close</source>
<location line="+53"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TopRoomBar</name>
<message>
<location filename="../../src/TopRoomBar.cpp" line="+86"/>
<location line="+15"/>
<location line="+15"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+28"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Mentions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<location line="+7"/>
<source>Invite users</source>
<translation>Προσκάλεσε χρήστες</translation>
<translation type="unfinished">Προσκάλεσε χρήστες</translation>
</message>
<message>
<location line="+6"/>
<location line="+4"/>
<source>Members</source>
<translation>Μέλη</translation>
<translation type="unfinished">Μέλη</translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Leave room</source>
<translation>Βγές από τη συνομιλία</translation>
<translation type="unfinished">Βγές</translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Settings</source>
<translation>Ρυθμίσεις</translation>
<translation type="unfinished">Ρυθμίσεις</translation>
</message>
<message>
<location line="+253"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1014,7 +1113,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+535"/>
<location filename="../../src/UserSettingsPage.cpp" line="+566"/>
<source>Minimize to tray</source>
<translation>Ελαχιστοποίηση</translation>
</message>
@ -1034,7 +1133,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="-63"/>
<source>CALLS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Keep the application running in the background after closing the client window.</source>
<translation type="unfinished"></translation>
</message>
@ -1197,7 +1301,17 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Φόντο</translation>
</message>
<message>
<location line="+3"/>
<location line="+4"/>
<source>Allow fallback call assist server</source>
<translation type="unfinished"></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>
</message>
<message>
<location line="+4"/>
<source>Device ID</source>
<translation type="unfinished"></translation>
</message>
@ -1207,7 +1321,7 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
<message>
<location line="-113"/>
<location line="-120"/>
<source>Session Keys</source>
<translation type="unfinished"></translation>
</message>
@ -1227,22 +1341,22 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
<message>
<location line="-71"/>
<location line="-78"/>
<source>GENERAL</source>
<translation>ΓΕΝΙΚΑ</translation>
</message>
<message>
<location line="+29"/>
<location line="+30"/>
<source>INTERFACE</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+166"/>
<location line="+172"/>
<source>Emoji Font Family</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+179"/>
<location line="+191"/>
<source>Open Sessions File</source>
<translation type="unfinished"></translation>
</message>
@ -1314,11 +1428,24 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+147"/>
<location filename="../../src/Utils.cpp" line="+146"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::AcceptCall</name>
<message>
<location filename="../../src/dialogs/AcceptCall.cpp" line="+89"/>
<source>Accept</source>
<translation type="unfinished">Αποδοχή</translation>
</message>
<message>
<location line="+5"/>
<source>Reject</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::CreateRoom</name>
<message>
@ -1442,6 +1569,19 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Αποσύνδεση. Είστε σίγουροι;</translation>
</message>
</context>
<context>
<name>dialogs::PlaceCall</name>
<message>
<location filename="../../src/dialogs/PlaceCall.cpp" line="+60"/>
<source>Voice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Cancel</source>
<translation type="unfinished">Άκυρο</translation>
</message>
</context>
<context>
<name>dialogs::PreviewUploadOverlay</name>
<message>
@ -1638,7 +1778,7 @@ Media size: %2
<context>
<name>dialogs::UserProfile</name>
<message>
<location filename="../../src/dialogs/UserProfile.cpp" line="+63"/>
<location filename="../../src/dialogs/UserProfile.cpp" line="+64"/>
<source>Ban the user from the room</source>
<translation type="unfinished"></translation>
</message>
@ -1658,7 +1798,17 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
<location line="+61"/>
<location line="+14"/>
<source>Confirm DM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2) to a direct chat?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<source>Devices</source>
<translation type="unfinished"></translation>
</message>
@ -1709,7 +1859,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+103"/>
<location filename="../../src/Utils.h" line="+106"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</message>
@ -1788,6 +1938,36 @@ Media size: %2
<source>%1 sent an encrypted message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You ended a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 ended a call</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>

View File

@ -4,7 +4,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1359"/>
<location filename="../../src/Cache.cpp" line="+1658"/>
<source>You joined this room.</source>
<translation>You joined this room.</translation>
</message>
@ -12,33 +12,53 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+229"/>
<location filename="../../src/ChatPage.cpp" line="+218"/>
<source>Failed to invite user: %1</source>
<translation>Failed to invite user: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+926"/>
<location line="+947"/>
<source>Invited user: %1</source>
<translation>Invited user: %1</translation>
</message>
<message>
<location line="-474"/>
<location line="-458"/>
<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="+439"/>
<location line="+415"/>
<source>Room %1 created.</source>
<translation>Room %1 created.</translation>
</message>
<message>
<location line="+30"/>
<location line="+26"/>
<source>Confirm invite</source>
<translation>Confirm invite</translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Do you really want to invite %1 (%2)?</translation>
</message>
<message>
<location line="+11"/>
<source>Failed to invite %1 to %2: %3</source>
<translation>Failed to invite %1 to %2: %3</translation>
</message>
<message>
<location line="+19"/>
<location line="+15"/>
<source>Confirm kick</source>
<translation>Confirm kick</translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to kick %1 (%2)?</source>
<translation>Do you really want to kick %1 (%2)?</translation>
</message>
<message>
<location line="+11"/>
<source>Failed to kick %1 to %2: %3</source>
<translation>Failed to kick %1 to %2: %3</translation>
</message>
@ -48,7 +68,17 @@
<translation>Kicked user: %1</translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm ban</source>
<translation>Confirm ban</translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to ban %1 (%2)?</source>
<translation>Do you really want to ban %1 (%2)?</translation>
</message>
<message>
<location line="+11"/>
<source>Failed to ban %1 in %2: %3</source>
<translation>Failed to ban %1 in %2: %3</translation>
</message>
@ -58,7 +88,17 @@
<translation>Banned user: %1</translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm unban</source>
<translation>Confirm unban</translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to unban %1 (%2)?</source>
<translation>Do you really want to unban %1 (%2)?</translation>
</message>
<message>
<location line="+11"/>
<source>Failed to unban %1 in %2: %3</source>
<translation>Failed to unban %1 in %2: %3</translation>
</message>
@ -68,12 +108,12 @@
<translation>Unbanned user: %1</translation>
</message>
<message>
<location line="-828"/>
<location line="-874"/>
<source>Failed to upload media. Please try again.</source>
<translation>Failed to upload media. Please try again.</translation>
</message>
<message>
<location line="+296"/>
<location line="+334"/>
<source>Cache migration failed!</source>
<translation>Cache migration failed!</translation>
</message>
@ -88,28 +128,28 @@
<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="+111"/>
<location line="+67"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Failed to restore OLM account. Please login again.</translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Failed to restore save data. Please login again.</source>
<translation>Failed to restore save data. Please login again.</translation>
</message>
<message>
<location line="+156"/>
<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>
<message>
<location line="+54"/>
<location line="+252"/>
<location line="+99"/>
<location line="+251"/>
<source>Please try to login again: %1</source>
<translation>Please try to login again: %1</translation>
</message>
<message>
<location line="-187"/>
<location line="-219"/>
<source>Failed to join room: %1</source>
<translation>Failed to join room: %1</translation>
</message>
@ -155,7 +195,7 @@
<location line="+2"/>
<source>Server Notices</source>
<comment>Tag translation for m.server_notice</comment>
<translation type="unfinished"></translation>
<translation>Server Notices</translation>
</message>
<message>
<location line="+2"/>
@ -203,42 +243,42 @@
<message>
<location line="-42"/>
<source>People</source>
<translation type="unfinished"></translation>
<translation>People</translation>
</message>
<message>
<location line="+2"/>
<source>Nature</source>
<translation type="unfinished"></translation>
<translation>Nature</translation>
</message>
<message>
<location line="+2"/>
<source>Food</source>
<translation type="unfinished"></translation>
<translation>Food</translation>
</message>
<message>
<location line="+2"/>
<source>Activity</source>
<translation type="unfinished">Activity</translation>
<translation>Activity</translation>
</message>
<message>
<location line="+2"/>
<source>Travel</source>
<translation type="unfinished"></translation>
<translation>Travel</translation>
</message>
<message>
<location line="+2"/>
<source>Objects</source>
<translation type="unfinished">Objects</translation>
<translation>Objects</translation>
</message>
<message>
<location line="+2"/>
<source>Symbols</source>
<translation type="unfinished">Symbols</translation>
<translation>Symbols</translation>
</message>
<message>
<location line="+2"/>
<source>Flags</source>
<translation type="unfinished">Flags</translation>
<translation>Flags</translation>
</message>
</context>
<context>
@ -251,7 +291,44 @@
<message>
<location line="+2"/>
<source>This message is not encrypted!</source>
<translation type="unfinished"></translation>
<translation>This message is not encrypted!</translation>
</message>
</context>
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+418"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation>-- Encrypted Event (No keys found for decryption) --</translation>
</message>
<message>
<location line="+19"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation>-- Decryption Error (failed to retrieve megolm keys from db) --</translation>
</message>
<message>
<location line="+14"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation>-- Decryption Error (%1) --</translation>
</message>
<message>
<location line="+10"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation>-- Encrypted Event (Unknown event type) --</translation>
</message>
<message>
<location line="+13"/>
<source>-- Replay attack! This message index was reused! --</source>
<translation>-- Replay attack! This message index was reused! --</translation>
</message>
<message>
<location line="+7"/>
<source>-- Message by unverified device! --</source>
<translation>-- Message by unverified device! --</translation>
</message>
</context>
<context>
@ -298,7 +375,7 @@ If Nheko fails to discover your homeserver, it will show you a field to enter th
<message>
<location line="+2"/>
<source>A name for this device, which will be shown to others, when verifying your devices. If none is provided a default is used.</source>
<translation type="unfinished"></translation>
<translation>A name for this device, which will be shown to others, when verifying your devices. If none is provided a default is used.</translation>
</message>
<message>
<location line="+6"/>
@ -371,6 +448,7 @@ Example: https://server.my:8787</translation>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+66"/>
<location line="+6"/>
<source>redacted</source>
<translation>redacted</translation>
</message>
@ -405,12 +483,27 @@ Example: https://server.my:8787</translation>
<translation>%1 created and configured room: %2</translation>
</message>
<message>
<location line="+6"/>
<source>%1 placed a %2 call.</source>
<translation>%1 placed a %2 call.</translation>
<location line="+7"/>
<source>%1 placed a voice call.</source>
<translation>%1 placed a voice call.</translation>
</message>
<message>
<location line="+6"/>
<location line="+1"/>
<source>%1 placed a video call.</source>
<translation>%1 placed a video call.</translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a call.</source>
<translation>%1 placed a call.</translation>
</message>
<message>
<location line="+19"/>
<source>Negotiating call...</source>
<translation>Negotiating call</translation>
</message>
<message>
<location line="-12"/>
<source>%1 answered the call.</source>
<translation>%1 answered the call.</translation>
</message>
@ -507,7 +600,7 @@ Example: https://server.my:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+984"/>
<location filename="../../src/Cache.cpp" line="+1443"/>
<source>no version stored</source>
<translation>no version stored</translation>
</message>
@ -522,49 +615,49 @@ Example: https://server.my:8787</translation>
<message>
<location line="+7"/>
<source>Tag room as:</source>
<translation type="unfinished"></translation>
<translation>Tag room as:</translation>
</message>
<message>
<location line="+18"/>
<source>Favourite</source>
<comment>Standard matrix tag for favourites</comment>
<translation type="unfinished"></translation>
<translation>Favourite</translation>
</message>
<message>
<location line="+3"/>
<source>Low Priority</source>
<comment>Standard matrix tag for low priority rooms</comment>
<translation type="unfinished"></translation>
<translation>Low Priority</translation>
</message>
<message>
<location line="+3"/>
<source>Server Notice</source>
<comment>Standard matrix tag for server notices</comment>
<translation type="unfinished"></translation>
<translation>Server Notice</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>Adds or removes the specified tag.</translation>
</message>
<message>
<location line="+38"/>
<source>New tag...</source>
<comment>Add a new tag to the room</comment>
<translation type="unfinished"></translation>
<translation>New tag</translation>
</message>
<message>
<location line="+4"/>
<source>New Tag</source>
<comment>Tag name prompt title</comment>
<translation type="unfinished"></translation>
<translation>New Tag</translation>
</message>
<message>
<location line="+1"/>
<source>Tag:</source>
<comment>Tag name prompt</comment>
<translation type="unfinished"></translation>
<translation>Tag:</translation>
</message>
<message>
<location line="+173"/>
@ -631,13 +724,13 @@ Example: https://server.my:8787</translation>
<context>
<name>TextInputWidget</name>
<message>
<location filename="../../src/TextInputWidget.cpp" line="+460"/>
<location filename="../../src/TextInputWidget.cpp" line="+574"/>
<source>Send a file</source>
<translation>Send a file</translation>
</message>
<message>
<location line="+13"/>
<location filename="../../src/TextInputWidget.h" line="+145"/>
<location filename="../../src/TextInputWidget.h" line="+160"/>
<source>Write a message...</source>
<translation>Write a message</translation>
</message>
@ -652,7 +745,7 @@ Example: https://server.my:8787</translation>
<translation>Emoji</translation>
</message>
<message>
<location line="+86"/>
<location line="+94"/>
<source>Select a file</source>
<translation>Select a file</translation>
</message>
@ -661,6 +754,16 @@ Example: https://server.my:8787</translation>
<source>All Files (*)</source>
<translation>All Files (*)</translation>
</message>
<message>
<location line="+64"/>
<source>Place a call</source>
<translation>Place a call</translation>
</message>
<message>
<location line="+3"/>
<source>Hang up</source>
<translation>Hang up</translation>
</message>
<message>
<location filename="../../src/TextInputWidget.h" line="-5"/>
<source>Connection lost. Nheko is trying to re-connect...</source>
@ -670,30 +773,20 @@ Example: https://server.my:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+891"/>
<source>-- Decryption Error (failed to communicate with DB) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
<translation>-- Decryption Error (failed to communicate with DB) --</translation>
</message>
<message>
<location line="+20"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation>-- Decryption Error (failed to retrieve megolm keys from db) --</translation>
</message>
<message>
<location line="+13"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1.</comment>
<translation>-- Decryption Error (%1) --</translation>
</message>
<message>
<location line="+99"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+805"/>
<source>Message redaction failed: %1</source>
<translation>Message redaction failed: %1</translation>
</message>
<message>
<location line="+488"/>
<location line="+114"/>
<location line="+17"/>
<location line="+101"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation>Failed to encrypt event, sending aborted!</translation>
</message>
<message>
<location line="+195"/>
<source>Save image</source>
<translation>Save image</translation>
</message>
@ -712,20 +805,8 @@ Example: https://server.my:8787</translation>
<source>Save file</source>
<translation>Save file</translation>
</message>
<message>
<location line="-643"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation>-- Encrypted Event (No keys found for decryption) --</translation>
</message>
<message>
<location line="+82"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation>-- Encrypted Event (Unknown event type) --</translation>
</message>
<message numerus="yes">
<location line="+693"/>
<location line="+129"/>
<source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation>
@ -779,7 +860,7 @@ Example: https://server.my:8787</translation>
<translation>%1 has changed the room&apos;s permissions.</translation>
</message>
<message>
<location line="+48"/>
<location line="+33"/>
<source>%1 was invited.</source>
<translation>%1 was invited.</translation>
</message>
@ -801,7 +882,7 @@ Example: https://server.my:8787</translation>
<message>
<location line="+2"/>
<source>%1 changed some profile info.</source>
<translation type="unfinished"></translation>
<translation>%1 changed some profile info.</translation>
</message>
<message>
<location line="+4"/>
@ -844,12 +925,12 @@ Example: https://server.my:8787</translation>
<translation>%1 redacted their knock.</translation>
</message>
<message>
<location line="-1281"/>
<location line="-943"/>
<source>You joined this room.</source>
<translation>You joined this room.</translation>
</message>
<message>
<location line="+1283"/>
<location line="+945"/>
<source>Rejected the knock from %1.</source>
<translation>Rejected the knock from %1.</translation>
</message>
@ -873,12 +954,12 @@ Example: https://server.my:8787</translation>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+91"/>
<location filename="../qml/TimelineRow.qml" line="+94"/>
<source>React</source>
<translation type="unfinished"></translation>
<translation>React</translation>
</message>
<message>
<location line="+17"/>
<location line="+16"/>
<source>Reply</source>
<translation>Reply</translation>
</message>
@ -891,9 +972,9 @@ Example: https://server.my:8787</translation>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+54"/>
<location filename="../qml/TimelineView.qml" line="+61"/>
<source>React</source>
<translation type="unfinished"></translation>
<translation>React</translation>
</message>
<message>
<location line="+4"/>
@ -931,48 +1012,51 @@ Example: https://server.my:8787</translation>
<translation>Save as</translation>
</message>
<message>
<location line="+14"/>
<location line="+12"/>
<source>No room open</source>
<translation>No room open</translation>
</message>
<message>
<location line="+271"/>
<source>Close</source>
<translation>Close</translation>
<location line="+53"/>
<source>Back to room list</source>
<translation>Back to room list</translation>
</message>
</context>
<context>
<name>TopRoomBar</name>
<message>
<location filename="../../src/TopRoomBar.cpp" line="+86"/>
<location line="+15"/>
<location line="+15"/>
<source>No room selected</source>
<translation>No room selected</translation>
</message>
<message>
<location line="+28"/>
<source>Room options</source>
<translation>Room options</translation>
</message>
<message>
<location line="+5"/>
<source>Mentions</source>
<translation>Mentions</translation>
</message>
<message>
<location line="+34"/>
<location line="+7"/>
<source>Invite users</source>
<translation>Invite users</translation>
</message>
<message>
<location line="+6"/>
<location line="+4"/>
<source>Members</source>
<translation>Members</translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Leave room</source>
<translation>Leave room</translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Settings</source>
<translation>Settings</translation>
</message>
<message>
<location line="+253"/>
<source>Close</source>
<translation>Close</translation>
</message>
</context>
<context>
<name>TrayIcon</name>
@ -997,43 +1081,43 @@ Example: https://server.my:8787</translation>
<message>
<location line="+20"/>
<source>Set custom status message</source>
<translation type="unfinished"></translation>
<translation>Set custom status message</translation>
</message>
<message>
<location line="+4"/>
<source>Custom status message</source>
<translation type="unfinished"></translation>
<translation>Custom status message</translation>
</message>
<message>
<location line="+1"/>
<source>Status:</source>
<translation type="unfinished"></translation>
<translation>Status:</translation>
</message>
<message>
<location line="+9"/>
<source>Set presence automatically</source>
<translation type="unfinished"></translation>
<translation>Set presence automatically</translation>
</message>
<message>
<location line="+6"/>
<source>Online</source>
<translation type="unfinished"></translation>
<translation>Online</translation>
</message>
<message>
<location line="+5"/>
<source>Unavailable</source>
<translation type="unfinished"></translation>
<translation>Unavailable</translation>
</message>
<message>
<location line="+6"/>
<source>Offline</source>
<translation type="unfinished"></translation>
<translation>Offline</translation>
</message>
</context>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+535"/>
<location filename="../../src/UserSettingsPage.cpp" line="+566"/>
<source>Minimize to tray</source>
<translation>Minimize to tray</translation>
</message>
@ -1053,25 +1137,31 @@ Example: https://server.my:8787</translation>
<translation>Circular Avatars</translation>
</message>
<message>
<location line="-5"/>
<location line="-63"/>
<source>CALLS</source>
<translation>CALLS</translation>
</message>
<message>
<location line="+58"/>
<source>Keep the application running in the background after closing the client window.</source>
<translation type="unfinished"></translation>
<translation>Keep the application running in the background after closing the client window.</translation>
</message>
<message>
<location line="+3"/>
<source>Start the application in the background without showing the client window.</source>
<translation type="unfinished"></translation>
<translation>Start the application in the background without showing the client window.</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>Change the appearance of user avatars in chats.
OFF - square, ON - Circle.</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>Show a column containing groups and tags next to the room list.</translation>
</message>
<message>
<location line="+1"/>
@ -1082,7 +1172,8 @@ OFF - square, ON - Circle.</source>
<location line="+2"/>
<source>Decrypt the messages shown in the sidebar.
Only affects messages in encrypted chats.</source>
<translation type="unfinished"></translation>
<translation>Decrypt the messages shown in the sidebar.
Only affects messages in encrypted chats.</translation>
</message>
<message>
<location line="+2"/>
@ -1092,17 +1183,17 @@ Only affects messages in encrypted chats.</source>
<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>Show buttons to quickly reply, react or access additional options next to each message.</translation>
</message>
<message>
<location line="+2"/>
<source>Limit width of timeline</source>
<translation type="unfinished"></translation>
<translation>Limit width of timeline</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>Set the max width of messages in the timeline (in pixels). This can help readability on wide screen, when Nheko is maximised.</translation>
</message>
<message>
<location line="+2"/>
@ -1113,7 +1204,8 @@ 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>Show who is typing in a room.
This will also enable or disable sending typing notifications to others.</translation>
</message>
<message>
<location line="+3"/>
@ -1125,7 +1217,9 @@ This will also enable or disable sending typing notifications to others.</source
<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&apos;t seem to consider them as important as the other rooms.</source>
<translation type="unfinished"></translation>
<translation>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&apos;t seem to consider them as important as the other rooms.</translation>
</message>
<message>
<location line="+7"/>
@ -1136,7 +1230,8 @@ 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>Show if your message was read.
Status is displayed next to timestamps.</translation>
</message>
<message>
<location line="+2"/>
@ -1147,7 +1242,8 @@ Status is displayed next to timestamps.</source>
<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>Allow using markdown in messages.
When disabled, all messages are sent as a plain text.</translation>
</message>
<message>
<location line="+2"/>
@ -1157,38 +1253,39 @@ 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>Notify about received message when the client is not currently focused.</translation>
</message>
<message>
<location line="+1"/>
<source>Alert on notification</source>
<translation type="unfinished"></translation>
<translation>Alert on notification</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>Show an alert when a message is received.
This usually causes the application icon in the task bar to animate in some fashion.</translation>
</message>
<message>
<location line="+2"/>
<source>Highlight message on hover</source>
<translation type="unfinished"></translation>
<translation>Highlight message on hover</translation>
</message>
<message>
<location line="+2"/>
<source>Change the background color of messages when you hover over them.</source>
<translation type="unfinished"></translation>
<translation>Change the background color of messages when you hover over them.</translation>
</message>
<message>
<location line="+1"/>
<source>Large Emoji in timeline</source>
<translation type="unfinished"></translation>
<translation>Large Emoji in timeline</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>Make font size larger if messages with only a few emojis are displayed.</translation>
</message>
<message>
<location line="+5"/>
@ -1198,7 +1295,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>Change the scale factor of the whole user interface.</translation>
</message>
<message>
<location line="+4"/>
@ -1216,7 +1313,17 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Theme</translation>
</message>
<message>
<location line="+3"/>
<location line="+4"/>
<source>Allow fallback call assist server</source>
<translation>Allow fallback call assist server</translation>
</message>
<message>
<location line="+2"/>
<source>Will use turn.matrix.org as assist when your home server does not offer one.</source>
<translation>Will use turn.matrix.org as assist when your home server does not offer one.</translation>
</message>
<message>
<location line="+4"/>
<source>Device ID</source>
<translation>Device ID</translation>
</message>
@ -1226,7 +1333,7 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Device Fingerprint</translation>
</message>
<message>
<location line="-113"/>
<location line="-120"/>
<source>Session Keys</source>
<translation>Session Keys</translation>
</message>
@ -1246,22 +1353,22 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>ENCRYPTION</translation>
</message>
<message>
<location line="-71"/>
<location line="-78"/>
<source>GENERAL</source>
<translation>GENERAL</translation>
</message>
<message>
<location line="+29"/>
<location line="+30"/>
<source>INTERFACE</source>
<translation>INTERFACE</translation>
</message>
<message>
<location line="+166"/>
<location line="+172"/>
<source>Emoji Font Family</source>
<translation>Emoji Font Family</translation>
</message>
<message>
<location line="+179"/>
<location line="+191"/>
<source>Open Sessions File</source>
<translation>Open Sessions File</translation>
</message>
@ -1333,11 +1440,24 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+147"/>
<location filename="../../src/Utils.cpp" line="+146"/>
<source>Yesterday</source>
<translation>Yesterday</translation>
</message>
</context>
<context>
<name>dialogs::AcceptCall</name>
<message>
<location filename="../../src/dialogs/AcceptCall.cpp" line="+89"/>
<source>Accept</source>
<translation>Accept</translation>
</message>
<message>
<location line="+5"/>
<source>Reject</source>
<translation>Reject</translation>
</message>
</context>
<context>
<name>dialogs::CreateRoom</name>
<message>
@ -1461,6 +1581,19 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Logout. Are you sure?</translation>
</message>
</context>
<context>
<name>dialogs::PlaceCall</name>
<message>
<location filename="../../src/dialogs/PlaceCall.cpp" line="+60"/>
<source>Voice</source>
<translation>Voice</translation>
</message>
<message>
<location line="+4"/>
<source>Cancel</source>
<translation>Cancel</translation>
</message>
</context>
<context>
<name>dialogs::PreviewUploadOverlay</name>
<message>
@ -1661,7 +1794,7 @@ Media size: %2
<context>
<name>dialogs::UserProfile</name>
<message>
<location filename="../../src/dialogs/UserProfile.cpp" line="+63"/>
<location filename="../../src/dialogs/UserProfile.cpp" line="+64"/>
<source>Ban the user from the room</source>
<translation>Ban the user from the room</translation>
</message>
@ -1681,7 +1814,17 @@ Media size: %2
<translation>Start a conversation</translation>
</message>
<message>
<location line="+61"/>
<location line="+14"/>
<source>Confirm DM</source>
<translation>Confirm DM</translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2) to a direct chat?</source>
<translation>Do you really want to invite %1 (%2) to a direct chat?</translation>
</message>
<message>
<location line="+54"/>
<source>Devices</source>
<translation>Devices</translation>
</message>
@ -1732,7 +1875,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+103"/>
<location filename="../../src/Utils.h" line="+106"/>
<source>You sent an audio clip</source>
<translation>You sent an audio clip</translation>
</message>

2009
resources/langs/nheko_et.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1359"/>
<location filename="../../src/Cache.cpp" line="+1658"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@ -12,33 +12,53 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+229"/>
<location filename="../../src/ChatPage.cpp" line="+218"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<location line="+926"/>
<location line="+947"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-474"/>
<location line="-458"/>
<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="+439"/>
<location line="+415"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+26"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to invite %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+15"/>
<source>Confirm kick</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to kick %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to kick %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +68,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm ban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to ban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to ban %1 in %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -58,7 +88,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm unban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to unban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to unban %1 in %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -68,12 +108,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="-828"/>
<location line="-874"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+296"/>
<location line="+334"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -88,28 +128,28 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+111"/>
<location line="+67"/>
<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>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Failed to restore save data. Please login again.</source>
<translation>Tallennettujen tietojen palauttaminen epäonnistui. Ole hyvä ja kirjaudu sisään uudelleen.</translation>
</message>
<message>
<location line="+156"/>
<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>
<message>
<location line="+54"/>
<location line="+252"/>
<location line="+99"/>
<location line="+251"/>
<source>Please try to login again: %1</source>
<translation>Ole hyvä ja yritä kirjautua sisään uudelleen: %1</translation>
</message>
<message>
<location line="-187"/>
<location line="-219"/>
<source>Failed to join room: %1</source>
<translation type="unfinished"></translation>
</message>
@ -254,6 +294,43 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+418"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished">-- Salattu viesti (salauksen purkuavaimia ei löydetty) --</translation>
</message>
<message>
<location line="+19"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished">-- Virhe purkaessa salausta (megolm-avaimien hakeminen tietokannasta epäonnistui) --</translation>
</message>
<message>
<location line="+14"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation type="unfinished">-- Virhe purkaessa salausta (%1) --</translation>
</message>
<message>
<location line="+10"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished">-- Salattu viesti (tuntematon viestityyppi) --</translation>
</message>
<message>
<location line="+13"/>
<source>-- Replay attack! This message index was reused! --</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>-- Message by unverified device! --</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -367,6 +444,7 @@ Example: https://server.my:8787</source>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+66"/>
<location line="+6"/>
<source>redacted</source>
<translation type="unfinished"></translation>
</message>
@ -400,6 +478,36 @@ Example: https://server.my:8787</source>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a video call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Placeholder</name>
@ -488,7 +596,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+984"/>
<location filename="../../src/Cache.cpp" line="+1443"/>
<source>no version stored</source>
<translation>ei tallennettua versiota</translation>
</message>
@ -612,13 +720,13 @@ Example: https://server.my:8787</source>
<context>
<name>TextInputWidget</name>
<message>
<location filename="../../src/TextInputWidget.cpp" line="+460"/>
<location filename="../../src/TextInputWidget.cpp" line="+574"/>
<source>Send a file</source>
<translation>Lähetä tiedosto</translation>
</message>
<message>
<location line="+13"/>
<location filename="../../src/TextInputWidget.h" line="+145"/>
<location filename="../../src/TextInputWidget.h" line="+160"/>
<source>Write a message...</source>
<translation>Kirjoita viesti</translation>
</message>
@ -633,7 +741,7 @@ Example: https://server.my:8787</source>
<translation>Emoji</translation>
</message>
<message>
<location line="+86"/>
<location line="+94"/>
<source>Select a file</source>
<translation>Valitse tiedosto</translation>
</message>
@ -642,6 +750,16 @@ Example: https://server.my:8787</source>
<source>All Files (*)</source>
<translation>Kaikki tiedostot (*)</translation>
</message>
<message>
<location line="+64"/>
<source>Place a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/TextInputWidget.h" line="-5"/>
<source>Connection lost. Nheko is trying to re-connect...</source>
@ -651,30 +769,20 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+891"/>
<source>-- Decryption Error (failed to communicate with DB) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
<translation type="unfinished">-- Virhe purkaessa salausta (tietokannan kanssa kommunikointi epäonnistui) --</translation>
</message>
<message>
<location line="+20"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished">-- Virhe purkaessa salausta (megolm-avaimien hakeminen tietokannasta epäonnistui) --</translation>
</message>
<message>
<location line="+13"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1.</comment>
<translation type="unfinished">-- Virhe purkaessa salausta (%1) --</translation>
</message>
<message>
<location line="+99"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+805"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished">Viestin poisto epäonnistui: %1</translation>
</message>
<message>
<location line="+488"/>
<location line="+114"/>
<location line="+17"/>
<location line="+101"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+195"/>
<source>Save image</source>
<translation type="unfinished">Tallenna kuva</translation>
</message>
@ -693,25 +801,13 @@ Example: https://server.my:8787</source>
<source>Save file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-643"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished">-- Salattu viesti (salauksen purkuavaimia ei löydetty) --</translation>
</message>
<message>
<location line="+82"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished">-- Salattu viesti (tuntematon viestityyppi) --</translation>
</message>
<message numerus="yes">
<location line="+693"/>
<location line="+129"/>
<source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation>
<numerusform>%1%2 kirjoittaa</numerusform>
<numerusform>%1 ja %2 kirjoittavat</numerusform>
<numerusform>%1%2 kirjoittaa.</numerusform>
<numerusform>%1 ja %2 kirjoittavat.</numerusform>
</translation>
</message>
<message>
@ -760,7 +856,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+48"/>
<location line="+33"/>
<source>%1 was invited.</source>
<translation type="unfinished"></translation>
</message>
@ -825,12 +921,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-1281"/>
<location line="-943"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1283"/>
<location line="+945"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -854,12 +950,12 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+91"/>
<location filename="../qml/TimelineRow.qml" line="+94"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -872,7 +968,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+54"/>
<location filename="../qml/TimelineView.qml" line="+61"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
@ -912,49 +1008,52 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+12"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+271"/>
<location line="+53"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+15"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+28"/>
<source>Room options</source>
<translation type="unfinished">Huonevaihtoehdot</translation>
</message>
<message>
<location line="+7"/>
<source>Invite users</source>
<translation type="unfinished">Kutsu käyttäjiä</translation>
</message>
<message>
<location line="+4"/>
<source>Members</source>
<translation type="unfinished">Jäsenet</translation>
</message>
<message>
<location line="+4"/>
<source>Leave room</source>
<translation type="unfinished">Poistu huoneesta</translation>
</message>
<message>
<location line="+4"/>
<source>Settings</source>
<translation type="unfinished">Asetukset</translation>
</message>
<message>
<location line="+253"/>
<source>Close</source>
<translation type="unfinished">Sulje</translation>
</message>
</context>
<context>
<name>TopRoomBar</name>
<message>
<location filename="../../src/TopRoomBar.cpp" line="+86"/>
<source>Room options</source>
<translation>Huonevaihtoehdot</translation>
</message>
<message>
<location line="+5"/>
<source>Mentions</source>
<translation>Maininnat</translation>
</message>
<message>
<location line="+34"/>
<source>Invite users</source>
<translation>Kutsu käyttäjiä</translation>
</message>
<message>
<location line="+6"/>
<source>Members</source>
<translation>Jäsenet</translation>
</message>
<message>
<location line="+5"/>
<source>Leave room</source>
<translation>Poistu huoneesta</translation>
</message>
<message>
<location line="+5"/>
<source>Settings</source>
<translation>Asetukset</translation>
</message>
</context>
<context>
<name>TrayIcon</name>
<message>
@ -1014,7 +1113,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+535"/>
<location filename="../../src/UserSettingsPage.cpp" line="+566"/>
<source>Minimize to tray</source>
<translation>Pienennä ilmoitusalueelle</translation>
</message>
@ -1034,7 +1133,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="-63"/>
<source>CALLS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Keep the application running in the background after closing the client window.</source>
<translation type="unfinished"></translation>
</message>
@ -1197,7 +1301,17 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Teema</translation>
</message>
<message>
<location line="+3"/>
<location line="+4"/>
<source>Allow fallback call assist server</source>
<translation type="unfinished"></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>
</message>
<message>
<location line="+4"/>
<source>Device ID</source>
<translation>Laitteen tunnus</translation>
</message>
@ -1207,7 +1321,7 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Laitteen sormenjälki</translation>
</message>
<message>
<location line="-113"/>
<location line="-120"/>
<source>Session Keys</source>
<translation>Istunnon avaimet</translation>
</message>
@ -1227,22 +1341,22 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>SALAUS</translation>
</message>
<message>
<location line="-71"/>
<location line="-78"/>
<source>GENERAL</source>
<translation>YLEISET ASETUKSET</translation>
</message>
<message>
<location line="+29"/>
<location line="+30"/>
<source>INTERFACE</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+166"/>
<location line="+172"/>
<source>Emoji Font Family</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+179"/>
<location line="+191"/>
<source>Open Sessions File</source>
<translation>Avaa Istuntoavaintiedosto</translation>
</message>
@ -1314,11 +1428,24 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+147"/>
<location filename="../../src/Utils.cpp" line="+146"/>
<source>Yesterday</source>
<translation>Eilen</translation>
</message>
</context>
<context>
<name>dialogs::AcceptCall</name>
<message>
<location filename="../../src/dialogs/AcceptCall.cpp" line="+89"/>
<source>Accept</source>
<translation type="unfinished">Hyväksy</translation>
</message>
<message>
<location line="+5"/>
<source>Reject</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::CreateRoom</name>
<message>
@ -1442,6 +1569,19 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Kirjaudutaan ulos. Oletko varma?</translation>
</message>
</context>
<context>
<name>dialogs::PlaceCall</name>
<message>
<location filename="../../src/dialogs/PlaceCall.cpp" line="+60"/>
<source>Voice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Cancel</source>
<translation type="unfinished">Peruuta</translation>
</message>
</context>
<context>
<name>dialogs::PreviewUploadOverlay</name>
<message>
@ -1642,7 +1782,7 @@ Median koko: %2
<context>
<name>dialogs::UserProfile</name>
<message>
<location filename="../../src/dialogs/UserProfile.cpp" line="+63"/>
<location filename="../../src/dialogs/UserProfile.cpp" line="+64"/>
<source>Ban the user from the room</source>
<translation>Anna käyttäjälle porttikielto huoneesta</translation>
</message>
@ -1662,7 +1802,17 @@ Median koko: %2
<translation>Aloita keskustelu</translation>
</message>
<message>
<location line="+61"/>
<location line="+14"/>
<source>Confirm DM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2) to a direct chat?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<source>Devices</source>
<translation>Laitteet</translation>
</message>
@ -1713,7 +1863,7 @@ Median koko: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+103"/>
<location filename="../../src/Utils.h" line="+106"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</message>
@ -1792,6 +1942,36 @@ Median koko: %2
<source>%1 sent an encrypted message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You ended a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 ended a call</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1359"/>
<location filename="../../src/Cache.cpp" line="+1658"/>
<source>You joined this room.</source>
<translation>Sei entrato in questa stanza.</translation>
</message>
@ -12,33 +12,53 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+229"/>
<location filename="../../src/ChatPage.cpp" line="+218"/>
<source>Failed to invite user: %1</source>
<translation>Impossibile invitare l&apos;utente: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+926"/>
<location line="+947"/>
<source>Invited user: %1</source>
<translation>Invitato utente: %1</translation>
</message>
<message>
<location line="-474"/>
<location line="-458"/>
<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="+439"/>
<location line="+415"/>
<source>Room %1 created.</source>
<translation>Stanza %1 creata.</translation>
</message>
<message>
<location line="+30"/>
<location line="+26"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to invite %1 to %2: %3</source>
<translation>Impossibile invitare %1 a %2: %3</translation>
</message>
<message>
<location line="+19"/>
<location line="+15"/>
<source>Confirm kick</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to kick %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to kick %1 to %2: %3</source>
<translation>Impossibile scacciare %1 a %2: %3</translation>
</message>
@ -48,7 +68,17 @@
<translation>Scacciato utente: %1</translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm ban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to ban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to ban %1 in %2: %3</source>
<translation>Impossibile bannare %1 in %2: %3</translation>
</message>
@ -58,7 +88,17 @@
<translation>Utente bannato: %1</translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm unban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to unban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to unban %1 in %2: %3</source>
<translation>Impossibile rimuovere il ban di %1 in %2: %3</translation>
</message>
@ -68,12 +108,12 @@
<translation>Rimosso il ban dall&apos;utente: %1</translation>
</message>
<message>
<location line="-828"/>
<location line="-874"/>
<source>Failed to upload media. Please try again.</source>
<translation>Impossibile inviare il file multimediale. Per favore riprova.</translation>
</message>
<message>
<location line="+296"/>
<location line="+334"/>
<source>Cache migration failed!</source>
<translation>Migrazione della cache fallita!</translation>
</message>
@ -88,28 +128,28 @@
<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="+111"/>
<location line="+67"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Impossibile ripristinare l&apos;account OLM. Per favore accedi nuovamente.</translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Failed to restore save data. Please login again.</source>
<translation>Impossibile ripristinare i dati salvati. Per favore accedi nuovamente.</translation>
</message>
<message>
<location line="+156"/>
<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>
<message>
<location line="+54"/>
<location line="+252"/>
<location line="+99"/>
<location line="+251"/>
<source>Please try to login again: %1</source>
<translation>Per favore prova ad accedere nuovamente: %1</translation>
</message>
<message>
<location line="-187"/>
<location line="-219"/>
<source>Failed to join room: %1</source>
<translation>Impossibile accedere alla stanza: %1</translation>
</message>
@ -254,6 +294,43 @@
<translation>Questo messaggio è in chiaro!</translation>
</message>
</context>
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+418"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished">-- Evento Criptato (Chiavi per la decriptazione non trovate) --</translation>
</message>
<message>
<location line="+19"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;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="+14"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation type="unfinished">-- Errore di Decrittazione (%1) --</translation>
</message>
<message>
<location line="+10"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished">-- Evento Criptato (Tipo di evento ignoto) --</translation>
</message>
<message>
<location line="+13"/>
<source>-- Replay attack! This message index was reused! --</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>-- Message by unverified device! --</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -371,6 +448,7 @@ Esempio: https://server.mio:8787</translation>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+66"/>
<location line="+6"/>
<source>redacted</source>
<translation>oscurato</translation>
</message>
@ -404,6 +482,36 @@ Esempio: https://server.mio:8787</translation>
<source>%1 created and configured room: %2</source>
<translation>%1 creato e configurata stanza: %2</translation>
</message>
<message>
<location line="+7"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a video call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Placeholder</name>
@ -492,7 +600,7 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+984"/>
<location filename="../../src/Cache.cpp" line="+1443"/>
<source>no version stored</source>
<translation>nessuna versione memorizzata</translation>
</message>
@ -616,13 +724,13 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>TextInputWidget</name>
<message>
<location filename="../../src/TextInputWidget.cpp" line="+460"/>
<location filename="../../src/TextInputWidget.cpp" line="+574"/>
<source>Send a file</source>
<translation>Invia un file</translation>
</message>
<message>
<location line="+13"/>
<location filename="../../src/TextInputWidget.h" line="+145"/>
<location filename="../../src/TextInputWidget.h" line="+160"/>
<source>Write a message...</source>
<translation>Scrivi un messaggio</translation>
</message>
@ -637,7 +745,7 @@ Esempio: https://server.mio:8787</translation>
<translation>Emoji</translation>
</message>
<message>
<location line="+86"/>
<location line="+94"/>
<source>Select a file</source>
<translation>Seleziona un file</translation>
</message>
@ -646,6 +754,16 @@ Esempio: https://server.mio:8787</translation>
<source>All Files (*)</source>
<translation>Tutti i file (*)</translation>
</message>
<message>
<location line="+64"/>
<source>Place a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/TextInputWidget.h" line="-5"/>
<source>Connection lost. Nheko is trying to re-connect...</source>
@ -655,30 +773,20 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+891"/>
<source>-- Decryption Error (failed to communicate with DB) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
<translation>-- Errore di Decriptazione (impossibile comunicare con il DB) --</translation>
</message>
<message>
<location line="+20"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation>-- Errore di Decrittazione (impossibile recuperare le chiavi megolm dal DB) --</translation>
</message>
<message>
<location line="+13"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1.</comment>
<translation>-- Errore di Decrittazione (%1) --</translation>
</message>
<message>
<location line="+99"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+805"/>
<source>Message redaction failed: %1</source>
<translation>Oscuramento del messaggio fallito: %1</translation>
</message>
<message>
<location line="+488"/>
<location line="+114"/>
<location line="+17"/>
<location line="+101"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+195"/>
<source>Save image</source>
<translation>Salva immagine</translation>
</message>
@ -697,20 +805,8 @@ Esempio: https://server.mio:8787</translation>
<source>Save file</source>
<translation>Salva file</translation>
</message>
<message>
<location line="-643"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation>-- Evento Criptato (Chiavi per la decriptazione non trovate) --</translation>
</message>
<message>
<location line="+82"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation>-- Evento Criptato (Tipo di evento ignoto) --</translation>
</message>
<message numerus="yes">
<location line="+693"/>
<location line="+129"/>
<source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation>
@ -764,7 +860,7 @@ Esempio: https://server.mio:8787</translation>
<translation>%1 ha cambiato i permessi della stanza.</translation>
</message>
<message>
<location line="+48"/>
<location line="+33"/>
<source>%1 was invited.</source>
<translation>%1 è stato invitato.</translation>
</message>
@ -829,12 +925,12 @@ Esempio: https://server.mio:8787</translation>
<translation>%1 ha oscurato la sua bussata.</translation>
</message>
<message>
<location line="-1281"/>
<location line="-943"/>
<source>You joined this room.</source>
<translation>Sei entrato in questa stanza.</translation>
</message>
<message>
<location line="+1283"/>
<location line="+945"/>
<source>Rejected the knock from %1.</source>
<translation>Rifiutata la bussata di %1.</translation>
</message>
@ -858,12 +954,12 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+91"/>
<location filename="../qml/TimelineRow.qml" line="+94"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<location line="+16"/>
<source>Reply</source>
<translation>Rispondi</translation>
</message>
@ -876,7 +972,7 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+54"/>
<location filename="../qml/TimelineView.qml" line="+61"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
@ -916,49 +1012,52 @@ Esempio: https://server.mio:8787</translation>
<translation>Salva come</translation>
</message>
<message>
<location line="+14"/>
<location line="+12"/>
<source>No room open</source>
<translation>Nessuna stanza aperta</translation>
</message>
<message>
<location line="+271"/>
<location line="+53"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+15"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+28"/>
<source>Room options</source>
<translation type="unfinished">Opzioni della stanza</translation>
</message>
<message>
<location line="+7"/>
<source>Invite users</source>
<translation type="unfinished">Invita utenti</translation>
</message>
<message>
<location line="+4"/>
<source>Members</source>
<translation type="unfinished">Membri</translation>
</message>
<message>
<location line="+4"/>
<source>Leave room</source>
<translation type="unfinished">Lascia la stanza</translation>
</message>
<message>
<location line="+4"/>
<source>Settings</source>
<translation type="unfinished">Impostazioni</translation>
</message>
<message>
<location line="+253"/>
<source>Close</source>
<translation>Chiudi</translation>
</message>
</context>
<context>
<name>TopRoomBar</name>
<message>
<location filename="../../src/TopRoomBar.cpp" line="+86"/>
<source>Room options</source>
<translation>Opzioni della stanza</translation>
</message>
<message>
<location line="+5"/>
<source>Mentions</source>
<translation>Menzioni</translation>
</message>
<message>
<location line="+34"/>
<source>Invite users</source>
<translation>Invita utenti</translation>
</message>
<message>
<location line="+6"/>
<source>Members</source>
<translation>Membri</translation>
</message>
<message>
<location line="+5"/>
<source>Leave room</source>
<translation>Lascia la stanza</translation>
</message>
<message>
<location line="+5"/>
<source>Settings</source>
<translation>Impostazioni</translation>
</message>
</context>
<context>
<name>TrayIcon</name>
<message>
@ -1018,7 +1117,7 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+535"/>
<location filename="../../src/UserSettingsPage.cpp" line="+566"/>
<source>Minimize to tray</source>
<translation>Minimizza nella tray</translation>
</message>
@ -1038,7 +1137,12 @@ Esempio: https://server.mio:8787</translation>
<translation>Avatar Circolari</translation>
</message>
<message>
<location line="-5"/>
<location line="-63"/>
<source>CALLS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Keep the application running in the background after closing the client window.</source>
<translation type="unfinished"></translation>
</message>
@ -1201,7 +1305,17 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Tema</translation>
</message>
<message>
<location line="+3"/>
<location line="+4"/>
<source>Allow fallback call assist server</source>
<translation type="unfinished"></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>
</message>
<message>
<location line="+4"/>
<source>Device ID</source>
<translation>ID Dispositivo</translation>
</message>
@ -1211,7 +1325,7 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Impronta digitale del dispositivo</translation>
</message>
<message>
<location line="-113"/>
<location line="-120"/>
<source>Session Keys</source>
<translation>Chiavi di Sessione</translation>
</message>
@ -1231,22 +1345,22 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>CRITTOGRAFIA</translation>
</message>
<message>
<location line="-71"/>
<location line="-78"/>
<source>GENERAL</source>
<translation>GENERALE</translation>
</message>
<message>
<location line="+29"/>
<location line="+30"/>
<source>INTERFACE</source>
<translation>INTERFACCIA</translation>
</message>
<message>
<location line="+166"/>
<location line="+172"/>
<source>Emoji Font Family</source>
<translation>Famiglia dei caratteri delle Emoji</translation>
</message>
<message>
<location line="+179"/>
<location line="+191"/>
<source>Open Sessions File</source>
<translation>Apri File delle Sessioni</translation>
</message>
@ -1318,11 +1432,24 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+147"/>
<location filename="../../src/Utils.cpp" line="+146"/>
<source>Yesterday</source>
<translation>Ieri</translation>
</message>
</context>
<context>
<name>dialogs::AcceptCall</name>
<message>
<location filename="../../src/dialogs/AcceptCall.cpp" line="+89"/>
<source>Accept</source>
<translation type="unfinished">Accetta</translation>
</message>
<message>
<location line="+5"/>
<source>Reject</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::CreateRoom</name>
<message>
@ -1446,6 +1573,19 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Uscita. Ne sei certo?</translation>
</message>
</context>
<context>
<name>dialogs::PlaceCall</name>
<message>
<location filename="../../src/dialogs/PlaceCall.cpp" line="+60"/>
<source>Voice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Cancel</source>
<translation type="unfinished">Annulla</translation>
</message>
</context>
<context>
<name>dialogs::PreviewUploadOverlay</name>
<message>
@ -1646,7 +1786,7 @@ Peso media: %2
<context>
<name>dialogs::UserProfile</name>
<message>
<location filename="../../src/dialogs/UserProfile.cpp" line="+63"/>
<location filename="../../src/dialogs/UserProfile.cpp" line="+64"/>
<source>Ban the user from the room</source>
<translation>Banna l&apos;utente dalla stanza</translation>
</message>
@ -1666,7 +1806,17 @@ Peso media: %2
<translation>Inizia una conversazione</translation>
</message>
<message>
<location line="+61"/>
<location line="+14"/>
<source>Confirm DM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2) to a direct chat?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<source>Devices</source>
<translation>Dispositivi</translation>
</message>
@ -1717,7 +1867,7 @@ Peso media: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+103"/>
<location filename="../../src/Utils.h" line="+106"/>
<source>You sent an audio clip</source>
<translation>Hai inviato una clip audio</translation>
</message>
@ -1796,6 +1946,36 @@ Peso media: %2
<source>%1 sent an encrypted message</source>
<translation>%1 ha inviato un messaggio criptato</translation>
</message>
<message>
<location line="+5"/>
<source>You placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You ended a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 ended a call</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>

View File

@ -4,7 +4,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1359"/>
<location filename="../../src/Cache.cpp" line="+1658"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@ -12,33 +12,53 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+229"/>
<location filename="../../src/ChatPage.cpp" line="+218"/>
<source>Failed to invite user: %1</source>
<translation>: %1</translation>
</message>
<message>
<location line="+4"/>
<location line="+926"/>
<location line="+947"/>
<source>Invited user: %1</source>
<translation>: %1</translation>
</message>
<message>
<location line="-474"/>
<location line="-458"/>
<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="+439"/>
<location line="+415"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+26"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to invite %1 to %2: %3</source>
<translation>%2%1: %3</translation>
</message>
<message>
<location line="+19"/>
<location line="+15"/>
<source>Confirm kick</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to kick %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to kick %1 to %2: %3</source>
<translation>%2%1: %3</translation>
</message>
@ -48,7 +68,17 @@
<translation>: %1</translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm ban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to ban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to ban %1 in %2: %3</source>
<translation>%2%1: %3</translation>
</message>
@ -58,7 +88,17 @@
<translation>: %1</translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm unban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to unban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to unban %1 in %2: %3</source>
<translation>%2%1: %3</translation>
</message>
@ -68,12 +108,12 @@
<translation>: %1</translation>
</message>
<message>
<location line="-828"/>
<location line="-874"/>
<source>Failed to upload media. Please try again.</source>
<translation></translation>
</message>
<message>
<location line="+296"/>
<location line="+334"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -88,28 +128,28 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+111"/>
<location line="+67"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>OLMアカウントを復元できませんでした</translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Failed to restore save data. Please login again.</source>
<translation></translation>
</message>
<message>
<location line="+156"/>
<location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>: %1 %2. </translation>
</message>
<message>
<location line="+54"/>
<location line="+252"/>
<location line="+99"/>
<location line="+251"/>
<source>Please try to login again: %1</source>
<translation>: %1</translation>
</message>
<message>
<location line="-187"/>
<location line="-219"/>
<source>Failed to join room: %1</source>
<translation>: %1</translation>
</message>
@ -254,6 +294,43 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+418"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished">-- () --</translation>
</message>
<message>
<location line="+19"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished">-- (megolm鍵を取得できませんでした) --</translation>
</message>
<message>
<location line="+14"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation type="unfinished">-- (%1) --</translation>
</message>
<message>
<location line="+10"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished">-- () --</translation>
</message>
<message>
<location line="+13"/>
<source>-- Replay attack! This message index was reused! --</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>-- Message by unverified device! --</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -367,6 +444,7 @@ Example: https://server.my:8787</source>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+66"/>
<location line="+6"/>
<source>redacted</source>
<translation></translation>
</message>
@ -400,6 +478,36 @@ Example: https://server.my:8787</source>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a video call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Placeholder</name>
@ -488,7 +596,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+984"/>
<location filename="../../src/Cache.cpp" line="+1443"/>
<source>no version stored</source>
<translation></translation>
</message>
@ -612,13 +720,13 @@ Example: https://server.my:8787</source>
<context>
<name>TextInputWidget</name>
<message>
<location filename="../../src/TextInputWidget.cpp" line="+460"/>
<location filename="../../src/TextInputWidget.cpp" line="+574"/>
<source>Send a file</source>
<translation></translation>
</message>
<message>
<location line="+13"/>
<location filename="../../src/TextInputWidget.h" line="+145"/>
<location filename="../../src/TextInputWidget.h" line="+160"/>
<source>Write a message...</source>
<translation>...</translation>
</message>
@ -633,7 +741,7 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
<message>
<location line="+86"/>
<location line="+94"/>
<source>Select a file</source>
<translation></translation>
</message>
@ -642,6 +750,16 @@ Example: https://server.my:8787</source>
<source>All Files (*)</source>
<translation> (*)</translation>
</message>
<message>
<location line="+64"/>
<source>Place a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/TextInputWidget.h" line="-5"/>
<source>Connection lost. Nheko is trying to re-connect...</source>
@ -651,30 +769,20 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+891"/>
<source>-- Decryption Error (failed to communicate with DB) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
<translation>-- () --</translation>
</message>
<message>
<location line="+20"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation>-- (megolm鍵を取得できませんでした) --</translation>
</message>
<message>
<location line="+13"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1.</comment>
<translation type="unfinished">-- (%1) --</translation>
</message>
<message>
<location line="+99"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+805"/>
<source>Message redaction failed: %1</source>
<translation>: %1</translation>
</message>
<message>
<location line="+488"/>
<location line="+114"/>
<location line="+17"/>
<location line="+101"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+195"/>
<source>Save image</source>
<translation></translation>
</message>
@ -693,20 +801,8 @@ Example: https://server.my:8787</source>
<source>Save file</source>
<translation></translation>
</message>
<message>
<location line="-643"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished">-- () --</translation>
</message>
<message>
<location line="+82"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished">-- () --</translation>
</message>
<message numerus="yes">
<location line="+693"/>
<location line="+129"/>
<source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation>
@ -759,7 +855,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+48"/>
<location line="+33"/>
<source>%1 was invited.</source>
<translation>%1</translation>
</message>
@ -824,12 +920,12 @@ Example: https://server.my:8787</source>
<translation>%1</translation>
</message>
<message>
<location line="-1281"/>
<location line="-943"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1283"/>
<location line="+945"/>
<source>Rejected the knock from %1.</source>
<translation>%1</translation>
</message>
@ -853,12 +949,12 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+91"/>
<location filename="../qml/TimelineRow.qml" line="+94"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<location line="+16"/>
<source>Reply</source>
<translation></translation>
</message>
@ -871,7 +967,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+54"/>
<location filename="../qml/TimelineView.qml" line="+61"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
@ -911,49 +1007,52 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
<message>
<location line="+14"/>
<location line="+12"/>
<source>No room open</source>
<translation></translation>
</message>
<message>
<location line="+271"/>
<location line="+53"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+15"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+28"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Invite users</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Members</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Leave room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+253"/>
<source>Close</source>
<translation></translation>
</message>
</context>
<context>
<name>TopRoomBar</name>
<message>
<location filename="../../src/TopRoomBar.cpp" line="+86"/>
<source>Room options</source>
<translation></translation>
</message>
<message>
<location line="+5"/>
<source>Mentions</source>
<translation></translation>
</message>
<message>
<location line="+34"/>
<source>Invite users</source>
<translation></translation>
</message>
<message>
<location line="+6"/>
<source>Members</source>
<translation></translation>
</message>
<message>
<location line="+5"/>
<source>Leave room</source>
<translation>退</translation>
</message>
<message>
<location line="+5"/>
<source>Settings</source>
<translation></translation>
</message>
</context>
<context>
<name>TrayIcon</name>
<message>
@ -1013,7 +1112,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+535"/>
<location filename="../../src/UserSettingsPage.cpp" line="+566"/>
<source>Minimize to tray</source>
<translation></translation>
</message>
@ -1033,7 +1132,12 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
<message>
<location line="-5"/>
<location line="-63"/>
<source>CALLS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Keep the application running in the background after closing the client window.</source>
<translation type="unfinished"></translation>
</message>
@ -1196,7 +1300,17 @@ This usually causes the application icon in the task bar to animate in some fash
<translation></translation>
</message>
<message>
<location line="+3"/>
<location line="+4"/>
<source>Allow fallback call assist server</source>
<translation type="unfinished"></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>
</message>
<message>
<location line="+4"/>
<source>Device ID</source>
<translation>ID</translation>
</message>
@ -1206,7 +1320,7 @@ This usually causes the application icon in the task bar to animate in some fash
<translation></translation>
</message>
<message>
<location line="-113"/>
<location line="-120"/>
<source>Session Keys</source>
<translation></translation>
</message>
@ -1226,22 +1340,22 @@ This usually causes the application icon in the task bar to animate in some fash
<translation></translation>
</message>
<message>
<location line="-71"/>
<location line="-78"/>
<source>GENERAL</source>
<translation></translation>
</message>
<message>
<location line="+29"/>
<location line="+30"/>
<source>INTERFACE</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+166"/>
<location line="+172"/>
<source>Emoji Font Family</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+179"/>
<location line="+191"/>
<source>Open Sessions File</source>
<translation></translation>
</message>
@ -1313,11 +1427,24 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+147"/>
<location filename="../../src/Utils.cpp" line="+146"/>
<source>Yesterday</source>
<translation></translation>
</message>
</context>
<context>
<name>dialogs::AcceptCall</name>
<message>
<location filename="../../src/dialogs/AcceptCall.cpp" line="+89"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Reject</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::CreateRoom</name>
<message>
@ -1441,6 +1568,19 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>?</translation>
</message>
</context>
<context>
<name>dialogs::PlaceCall</name>
<message>
<location filename="../../src/dialogs/PlaceCall.cpp" line="+60"/>
<source>Voice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::PreviewUploadOverlay</name>
<message>
@ -1640,7 +1780,7 @@ Media size: %2
<context>
<name>dialogs::UserProfile</name>
<message>
<location filename="../../src/dialogs/UserProfile.cpp" line="+63"/>
<location filename="../../src/dialogs/UserProfile.cpp" line="+64"/>
<source>Ban the user from the room</source>
<translation></translation>
</message>
@ -1660,7 +1800,17 @@ Media size: %2
<translation></translation>
</message>
<message>
<location line="+61"/>
<location line="+14"/>
<source>Confirm DM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2) to a direct chat?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<source>Devices</source>
<translation></translation>
</message>
@ -1711,7 +1861,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+103"/>
<location filename="../../src/Utils.h" line="+106"/>
<source>You sent an audio clip</source>
<translation></translation>
</message>
@ -1790,6 +1940,36 @@ Media size: %2
<source>%1 sent an encrypted message</source>
<translation>%1</translation>
</message>
<message>
<location line="+5"/>
<source>You placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You ended a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 ended a call</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>

View File

@ -4,7 +4,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1359"/>
<location filename="../../src/Cache.cpp" line="+1658"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@ -12,33 +12,53 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+229"/>
<location filename="../../src/ChatPage.cpp" line="+218"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<location line="+926"/>
<location line="+947"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-474"/>
<location line="-458"/>
<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="+439"/>
<location line="+415"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+26"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to invite %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+15"/>
<source>Confirm kick</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to kick %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to kick %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +68,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm ban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to ban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to ban %1 in %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -58,7 +88,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm unban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to unban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to unban %1 in %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -68,12 +108,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="-828"/>
<location line="-874"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+296"/>
<location line="+334"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -88,28 +128,28 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+111"/>
<location line="+67"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Failed to restore save data. Please login again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<location line="+252"/>
<location line="+99"/>
<location line="+251"/>
<source>Please try to login again: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-187"/>
<location line="-219"/>
<source>Failed to join room: %1</source>
<translation type="unfinished"></translation>
</message>
@ -254,6 +294,43 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+418"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+10"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>-- Replay attack! This message index was reused! --</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>-- Message by unverified device! --</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -367,6 +444,7 @@ Example: https://server.my:8787</source>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+66"/>
<location line="+6"/>
<source>redacted</source>
<translation type="unfinished"></translation>
</message>
@ -400,6 +478,36 @@ Example: https://server.my:8787</source>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a video call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Placeholder</name>
@ -488,7 +596,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+984"/>
<location filename="../../src/Cache.cpp" line="+1443"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -612,13 +720,13 @@ Example: https://server.my:8787</source>
<context>
<name>TextInputWidget</name>
<message>
<location filename="../../src/TextInputWidget.cpp" line="+460"/>
<location filename="../../src/TextInputWidget.cpp" line="+574"/>
<source>Send a file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location filename="../../src/TextInputWidget.h" line="+145"/>
<location filename="../../src/TextInputWidget.h" line="+160"/>
<source>Write a message...</source>
<translation>Typ een bericht...</translation>
</message>
@ -633,7 +741,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+86"/>
<location line="+94"/>
<source>Select a file</source>
<translation>Kies een bestand</translation>
</message>
@ -642,6 +750,16 @@ Example: https://server.my:8787</source>
<source>All Files (*)</source>
<translation>Alle bestanden (*)</translation>
</message>
<message>
<location line="+64"/>
<source>Place a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/TextInputWidget.h" line="-5"/>
<source>Connection lost. Nheko is trying to re-connect...</source>
@ -651,30 +769,20 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+891"/>
<source>-- Decryption Error (failed to communicate with DB) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+20"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+99"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+805"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+488"/>
<location line="+114"/>
<location line="+17"/>
<location line="+101"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+195"/>
<source>Save image</source>
<translation type="unfinished">Afbeelding opslaan</translation>
</message>
@ -693,20 +801,8 @@ Example: https://server.my:8787</source>
<source>Save file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-643"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+82"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+693"/>
<location line="+129"/>
<source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation type="unfinished">
@ -760,7 +856,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+48"/>
<location line="+33"/>
<source>%1 was invited.</source>
<translation type="unfinished"></translation>
</message>
@ -825,12 +921,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-1281"/>
<location line="-943"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1283"/>
<location line="+945"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -854,12 +950,12 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+91"/>
<location filename="../qml/TimelineRow.qml" line="+94"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -872,7 +968,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+54"/>
<location filename="../qml/TimelineView.qml" line="+61"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
@ -912,47 +1008,50 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+12"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+271"/>
<source>Close</source>
<location line="+53"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TopRoomBar</name>
<message>
<location filename="../../src/TopRoomBar.cpp" line="+86"/>
<location line="+15"/>
<location line="+15"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+28"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Mentions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<location line="+7"/>
<source>Invite users</source>
<translation>Gebruikers uitnodigen</translation>
<translation type="unfinished">Gebruikers uitnodigen</translation>
</message>
<message>
<location line="+6"/>
<location line="+4"/>
<source>Members</source>
<translation>Leden</translation>
<translation type="unfinished">Leden</translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Leave room</source>
<translation>Kamer verlaten</translation>
<translation type="unfinished">Kamer verlaten</translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Settings</source>
<translation>Instellingen</translation>
<translation type="unfinished">Instellingen</translation>
</message>
<message>
<location line="+253"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -1014,7 +1113,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+535"/>
<location filename="../../src/UserSettingsPage.cpp" line="+566"/>
<source>Minimize to tray</source>
<translation>Minimaliseren naar systeemvak</translation>
</message>
@ -1034,7 +1133,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="-63"/>
<source>CALLS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Keep the application running in the background after closing the client window.</source>
<translation type="unfinished"></translation>
</message>
@ -1197,7 +1301,17 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Thema</translation>
</message>
<message>
<location line="+3"/>
<location line="+4"/>
<source>Allow fallback call assist server</source>
<translation type="unfinished"></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>
</message>
<message>
<location line="+4"/>
<source>Device ID</source>
<translation type="unfinished"></translation>
</message>
@ -1207,7 +1321,7 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
<message>
<location line="-113"/>
<location line="-120"/>
<source>Session Keys</source>
<translation type="unfinished"></translation>
</message>
@ -1227,22 +1341,22 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
<message>
<location line="-71"/>
<location line="-78"/>
<source>GENERAL</source>
<translation>ALGEMEEN</translation>
</message>
<message>
<location line="+29"/>
<location line="+30"/>
<source>INTERFACE</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+166"/>
<location line="+172"/>
<source>Emoji Font Family</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+179"/>
<location line="+191"/>
<source>Open Sessions File</source>
<translation type="unfinished"></translation>
</message>
@ -1314,11 +1428,24 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+147"/>
<location filename="../../src/Utils.cpp" line="+146"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::AcceptCall</name>
<message>
<location filename="../../src/dialogs/AcceptCall.cpp" line="+89"/>
<source>Accept</source>
<translation type="unfinished">Accepteren</translation>
</message>
<message>
<location line="+5"/>
<source>Reject</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::CreateRoom</name>
<message>
@ -1442,6 +1569,19 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Uitloggen. Weet je het zeker?</translation>
</message>
</context>
<context>
<name>dialogs::PlaceCall</name>
<message>
<location filename="../../src/dialogs/PlaceCall.cpp" line="+60"/>
<source>Voice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Cancel</source>
<translation type="unfinished">Annuleren</translation>
</message>
</context>
<context>
<name>dialogs::PreviewUploadOverlay</name>
<message>
@ -1640,7 +1780,7 @@ Mediagrootte: %2
<context>
<name>dialogs::UserProfile</name>
<message>
<location filename="../../src/dialogs/UserProfile.cpp" line="+63"/>
<location filename="../../src/dialogs/UserProfile.cpp" line="+64"/>
<source>Ban the user from the room</source>
<translation type="unfinished"></translation>
</message>
@ -1660,7 +1800,17 @@ Mediagrootte: %2
<translation type="unfinished"></translation>
</message>
<message>
<location line="+61"/>
<location line="+14"/>
<source>Confirm DM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2) to a direct chat?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<source>Devices</source>
<translation type="unfinished"></translation>
</message>
@ -1711,7 +1861,7 @@ Mediagrootte: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+103"/>
<location filename="../../src/Utils.h" line="+106"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</message>
@ -1790,6 +1940,36 @@ Mediagrootte: %2
<source>%1 sent an encrypted message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You ended a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 ended a call</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>

View File

@ -4,7 +4,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1359"/>
<location filename="../../src/Cache.cpp" line="+1658"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@ -12,33 +12,53 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+229"/>
<location filename="../../src/ChatPage.cpp" line="+218"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<location line="+926"/>
<location line="+947"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-474"/>
<location line="-458"/>
<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="+439"/>
<location line="+415"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+26"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to invite %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+15"/>
<source>Confirm kick</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to kick %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to kick %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +68,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm ban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to ban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to ban %1 in %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -58,7 +88,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm unban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to unban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to unban %1 in %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -68,12 +108,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="-828"/>
<location line="-874"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+296"/>
<location line="+334"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -88,28 +128,28 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+111"/>
<location line="+67"/>
<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>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Failed to restore save data. Please login again.</source>
<translation>Nie udało się przywrócić zapisanych danych. Spróbuj zalogować się ponownie.</translation>
</message>
<message>
<location line="+156"/>
<location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<location line="+252"/>
<location line="+99"/>
<location line="+251"/>
<source>Please try to login again: %1</source>
<translation>Spróbuj zalogować się ponownie: %1</translation>
</message>
<message>
<location line="-187"/>
<location line="-219"/>
<source>Failed to join room: %1</source>
<translation type="unfinished"></translation>
</message>
@ -254,6 +294,43 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+418"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+10"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>-- Replay attack! This message index was reused! --</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>-- Message by unverified device! --</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -367,6 +444,7 @@ Example: https://server.my:8787</source>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+66"/>
<location line="+6"/>
<source>redacted</source>
<translation type="unfinished"></translation>
</message>
@ -400,6 +478,36 @@ Example: https://server.my:8787</source>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a video call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Placeholder</name>
@ -488,7 +596,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+984"/>
<location filename="../../src/Cache.cpp" line="+1443"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -612,13 +720,13 @@ Example: https://server.my:8787</source>
<context>
<name>TextInputWidget</name>
<message>
<location filename="../../src/TextInputWidget.cpp" line="+460"/>
<location filename="../../src/TextInputWidget.cpp" line="+574"/>
<source>Send a file</source>
<translation>Wyślij plik</translation>
</message>
<message>
<location line="+13"/>
<location filename="../../src/TextInputWidget.h" line="+145"/>
<location filename="../../src/TextInputWidget.h" line="+160"/>
<source>Write a message...</source>
<translation>Napisz wiadomość</translation>
</message>
@ -633,7 +741,7 @@ Example: https://server.my:8787</source>
<translation>Emoji</translation>
</message>
<message>
<location line="+86"/>
<location line="+94"/>
<source>Select a file</source>
<translation>Wybierz plik</translation>
</message>
@ -642,6 +750,16 @@ Example: https://server.my:8787</source>
<source>All Files (*)</source>
<translation>Wszystkie pliki (*)</translation>
</message>
<message>
<location line="+64"/>
<source>Place a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/TextInputWidget.h" line="-5"/>
<source>Connection lost. Nheko is trying to re-connect...</source>
@ -651,30 +769,20 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+891"/>
<source>-- Decryption Error (failed to communicate with DB) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+20"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+99"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+805"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation>
</message>
<message>
<location line="+488"/>
<location line="+114"/>
<location line="+17"/>
<location line="+101"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+195"/>
<source>Save image</source>
<translation type="unfinished">Zapisz obraz</translation>
</message>
@ -693,20 +801,8 @@ Example: https://server.my:8787</source>
<source>Save file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-643"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+82"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+693"/>
<location line="+129"/>
<source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation type="unfinished">
@ -761,7 +857,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+48"/>
<location line="+33"/>
<source>%1 was invited.</source>
<translation type="unfinished"></translation>
</message>
@ -826,12 +922,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-1281"/>
<location line="-943"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1283"/>
<location line="+945"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -855,12 +951,12 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+91"/>
<location filename="../qml/TimelineRow.qml" line="+94"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -873,7 +969,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+54"/>
<location filename="../qml/TimelineView.qml" line="+61"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
@ -913,49 +1009,52 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+12"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+271"/>
<location line="+53"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+15"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+28"/>
<source>Room options</source>
<translation type="unfinished">Ustawienia pokoju</translation>
</message>
<message>
<location line="+7"/>
<source>Invite users</source>
<translation type="unfinished">Zaproś użytkowników</translation>
</message>
<message>
<location line="+4"/>
<source>Members</source>
<translation type="unfinished">Członkowie</translation>
</message>
<message>
<location line="+4"/>
<source>Leave room</source>
<translation type="unfinished">Opuść pokój</translation>
</message>
<message>
<location line="+4"/>
<source>Settings</source>
<translation type="unfinished">Ustawienia</translation>
</message>
<message>
<location line="+253"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TopRoomBar</name>
<message>
<location filename="../../src/TopRoomBar.cpp" line="+86"/>
<source>Room options</source>
<translation>Ustawienia pokoju</translation>
</message>
<message>
<location line="+5"/>
<source>Mentions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>Invite users</source>
<translation>Zaproś użytkowników</translation>
</message>
<message>
<location line="+6"/>
<source>Members</source>
<translation>Członkowie</translation>
</message>
<message>
<location line="+5"/>
<source>Leave room</source>
<translation>Opuść pokój</translation>
</message>
<message>
<location line="+5"/>
<source>Settings</source>
<translation>Ustawienia</translation>
</message>
</context>
<context>
<name>TrayIcon</name>
<message>
@ -1015,7 +1114,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+535"/>
<location filename="../../src/UserSettingsPage.cpp" line="+566"/>
<source>Minimize to tray</source>
<translation>Zminimalizuj do paska zadań</translation>
</message>
@ -1035,7 +1134,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="-63"/>
<source>CALLS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Keep the application running in the background after closing the client window.</source>
<translation type="unfinished"></translation>
</message>
@ -1198,7 +1302,17 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Motyw</translation>
</message>
<message>
<location line="+3"/>
<location line="+4"/>
<source>Allow fallback call assist server</source>
<translation type="unfinished"></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>
</message>
<message>
<location line="+4"/>
<source>Device ID</source>
<translation>ID urządzenia</translation>
</message>
@ -1208,7 +1322,7 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Odcisk palca urządzenia</translation>
</message>
<message>
<location line="-113"/>
<location line="-120"/>
<source>Session Keys</source>
<translation type="unfinished"></translation>
</message>
@ -1228,22 +1342,22 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>SZYFROWANIE</translation>
</message>
<message>
<location line="-71"/>
<location line="-78"/>
<source>GENERAL</source>
<translation>OGÓLNE</translation>
</message>
<message>
<location line="+29"/>
<location line="+30"/>
<source>INTERFACE</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+166"/>
<location line="+172"/>
<source>Emoji Font Family</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+179"/>
<location line="+191"/>
<source>Open Sessions File</source>
<translation type="unfinished"></translation>
</message>
@ -1315,11 +1429,24 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+147"/>
<location filename="../../src/Utils.cpp" line="+146"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::AcceptCall</name>
<message>
<location filename="../../src/dialogs/AcceptCall.cpp" line="+89"/>
<source>Accept</source>
<translation type="unfinished">Akceptuj</translation>
</message>
<message>
<location line="+5"/>
<source>Reject</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::CreateRoom</name>
<message>
@ -1443,6 +1570,19 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Czy na pewno chcesz wylogować się?</translation>
</message>
</context>
<context>
<name>dialogs::PlaceCall</name>
<message>
<location filename="../../src/dialogs/PlaceCall.cpp" line="+60"/>
<source>Voice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Cancel</source>
<translation type="unfinished">Anuluj</translation>
</message>
</context>
<context>
<name>dialogs::PreviewUploadOverlay</name>
<message>
@ -1644,7 +1784,7 @@ Rozmiar multimediów: %2
<context>
<name>dialogs::UserProfile</name>
<message>
<location filename="../../src/dialogs/UserProfile.cpp" line="+63"/>
<location filename="../../src/dialogs/UserProfile.cpp" line="+64"/>
<source>Ban the user from the room</source>
<translation>Zablokuj użytkownika w tym pokoju</translation>
</message>
@ -1664,7 +1804,17 @@ Rozmiar multimediów: %2
<translation>Rozpocznij rozmowę</translation>
</message>
<message>
<location line="+61"/>
<location line="+14"/>
<source>Confirm DM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2) to a direct chat?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<source>Devices</source>
<translation>Urządzenia</translation>
</message>
@ -1715,7 +1865,7 @@ Rozmiar multimediów: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+103"/>
<location filename="../../src/Utils.h" line="+106"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</message>
@ -1794,6 +1944,36 @@ Rozmiar multimediów: %2
<source>%1 sent an encrypted message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You ended a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 ended a call</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>

View File

@ -4,7 +4,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1359"/>
<location filename="../../src/Cache.cpp" line="+1658"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@ -12,33 +12,53 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+229"/>
<location filename="../../src/ChatPage.cpp" line="+218"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<location line="+926"/>
<location line="+947"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-474"/>
<location line="-458"/>
<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="+439"/>
<location line="+415"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+26"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to invite %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+15"/>
<source>Confirm kick</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to kick %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to kick %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +68,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm ban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to ban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to ban %1 in %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -58,7 +88,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm unban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to unban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to unban %1 in %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -68,12 +108,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="-828"/>
<location line="-874"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+296"/>
<location line="+334"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -88,28 +128,28 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+111"/>
<location line="+67"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Failed to restore save data. Please login again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+156"/>
<location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<location line="+252"/>
<location line="+99"/>
<location line="+251"/>
<source>Please try to login again: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-187"/>
<location line="-219"/>
<source>Failed to join room: %1</source>
<translation type="unfinished"></translation>
</message>
@ -254,6 +294,43 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+418"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+10"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>-- Replay attack! This message index was reused! --</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>-- Message by unverified device! --</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -367,6 +444,7 @@ Example: https://server.my:8787</source>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+66"/>
<location line="+6"/>
<source>redacted</source>
<translation type="unfinished"></translation>
</message>
@ -400,6 +478,36 @@ Example: https://server.my:8787</source>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a video call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Placeholder</name>
@ -488,7 +596,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+984"/>
<location filename="../../src/Cache.cpp" line="+1443"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -612,13 +720,13 @@ Example: https://server.my:8787</source>
<context>
<name>TextInputWidget</name>
<message>
<location filename="../../src/TextInputWidget.cpp" line="+460"/>
<location filename="../../src/TextInputWidget.cpp" line="+574"/>
<source>Send a file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location filename="../../src/TextInputWidget.h" line="+145"/>
<location filename="../../src/TextInputWidget.h" line="+160"/>
<source>Write a message...</source>
<translation type="unfinished"></translation>
</message>
@ -633,7 +741,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+86"/>
<location line="+94"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -642,6 +750,16 @@ Example: https://server.my:8787</source>
<source>All Files (*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+64"/>
<source>Place a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/TextInputWidget.h" line="-5"/>
<source>Connection lost. Nheko is trying to re-connect...</source>
@ -651,30 +769,20 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+891"/>
<source>-- Decryption Error (failed to communicate with DB) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+20"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+99"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+805"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+488"/>
<location line="+114"/>
<location line="+17"/>
<location line="+101"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+195"/>
<source>Save image</source>
<translation type="unfinished"></translation>
</message>
@ -693,20 +801,8 @@ Example: https://server.my:8787</source>
<source>Save file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-643"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+82"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+693"/>
<location line="+129"/>
<source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation type="unfinished">
@ -761,7 +857,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+48"/>
<location line="+33"/>
<source>%1 was invited.</source>
<translation type="unfinished"></translation>
</message>
@ -826,12 +922,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-1281"/>
<location line="-943"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1283"/>
<location line="+945"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -855,12 +951,12 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+91"/>
<location filename="../qml/TimelineRow.qml" line="+94"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -873,7 +969,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+54"/>
<location filename="../qml/TimelineView.qml" line="+61"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
@ -913,48 +1009,51 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+12"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+271"/>
<source>Close</source>
<location line="+53"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TopRoomBar</name>
<message>
<location filename="../../src/TopRoomBar.cpp" line="+86"/>
<location line="+15"/>
<location line="+15"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+28"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Mentions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<location line="+7"/>
<source>Invite users</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<location line="+4"/>
<source>Members</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Leave room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+253"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TrayIcon</name>
@ -1015,7 +1114,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+535"/>
<location filename="../../src/UserSettingsPage.cpp" line="+566"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>
@ -1035,7 +1134,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="-63"/>
<source>CALLS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Keep the application running in the background after closing the client window.</source>
<translation type="unfinished"></translation>
</message>
@ -1198,7 +1302,17 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<location line="+4"/>
<source>Allow fallback call assist server</source>
<translation type="unfinished"></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>
</message>
<message>
<location line="+4"/>
<source>Device ID</source>
<translation type="unfinished"></translation>
</message>
@ -1208,7 +1322,7 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
<message>
<location line="-113"/>
<location line="-120"/>
<source>Session Keys</source>
<translation type="unfinished"></translation>
</message>
@ -1228,22 +1342,22 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
<message>
<location line="-71"/>
<location line="-78"/>
<source>GENERAL</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+29"/>
<location line="+30"/>
<source>INTERFACE</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+166"/>
<location line="+172"/>
<source>Emoji Font Family</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+179"/>
<location line="+191"/>
<source>Open Sessions File</source>
<translation type="unfinished"></translation>
</message>
@ -1315,11 +1429,24 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+147"/>
<location filename="../../src/Utils.cpp" line="+146"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::AcceptCall</name>
<message>
<location filename="../../src/dialogs/AcceptCall.cpp" line="+89"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Reject</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::CreateRoom</name>
<message>
@ -1443,6 +1570,19 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::PlaceCall</name>
<message>
<location filename="../../src/dialogs/PlaceCall.cpp" line="+60"/>
<source>Voice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::PreviewUploadOverlay</name>
<message>
@ -1640,7 +1780,7 @@ Media size: %2
<context>
<name>dialogs::UserProfile</name>
<message>
<location filename="../../src/dialogs/UserProfile.cpp" line="+63"/>
<location filename="../../src/dialogs/UserProfile.cpp" line="+64"/>
<source>Ban the user from the room</source>
<translation type="unfinished"></translation>
</message>
@ -1660,7 +1800,17 @@ Media size: %2
<translation type="unfinished"></translation>
</message>
<message>
<location line="+61"/>
<location line="+14"/>
<source>Confirm DM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2) to a direct chat?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<source>Devices</source>
<translation type="unfinished"></translation>
</message>
@ -1711,7 +1861,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+103"/>
<location filename="../../src/Utils.h" line="+106"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</message>
@ -1790,6 +1940,36 @@ Media size: %2
<source>%1 sent an encrypted message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You ended a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 ended a call</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>

View File

@ -4,7 +4,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1359"/>
<location filename="../../src/Cache.cpp" line="+1658"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@ -12,33 +12,53 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+229"/>
<location filename="../../src/ChatPage.cpp" line="+218"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<location line="+926"/>
<location line="+947"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-474"/>
<location line="-458"/>
<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="+439"/>
<location line="+415"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+26"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to invite %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+15"/>
<source>Confirm kick</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to kick %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to kick %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +68,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm ban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to ban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to ban %1 in %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -58,7 +88,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm unban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to unban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to unban %1 in %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -68,12 +108,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="-828"/>
<location line="-874"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+296"/>
<location line="+334"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -88,28 +128,28 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+111"/>
<location line="+67"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation>Не удалось восстановить учетную запись OLM. Пожалуйста, войдите снова.</translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Failed to restore save data. Please login again.</source>
<translation>Не удалось восстановить сохраненные данные. Пожалуйста, войдите снова.</translation>
</message>
<message>
<location line="+156"/>
<location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation>Не удалось настроить ключи шифрования. Ответ сервера:%1 %2. Пожалуйста, попробуйте позже.</translation>
</message>
<message>
<location line="+54"/>
<location line="+252"/>
<location line="+99"/>
<location line="+251"/>
<source>Please try to login again: %1</source>
<translation>Повторите попытку входа: %1</translation>
</message>
<message>
<location line="-187"/>
<location line="-219"/>
<source>Failed to join room: %1</source>
<translation type="unfinished"></translation>
</message>
@ -254,6 +294,43 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+418"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+10"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>-- Replay attack! This message index was reused! --</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>-- Message by unverified device! --</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -367,6 +444,7 @@ Example: https://server.my:8787</source>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+66"/>
<location line="+6"/>
<source>redacted</source>
<translation type="unfinished"></translation>
</message>
@ -400,6 +478,36 @@ Example: https://server.my:8787</source>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a video call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Placeholder</name>
@ -488,7 +596,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+984"/>
<location filename="../../src/Cache.cpp" line="+1443"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -612,13 +720,13 @@ Example: https://server.my:8787</source>
<context>
<name>TextInputWidget</name>
<message>
<location filename="../../src/TextInputWidget.cpp" line="+460"/>
<location filename="../../src/TextInputWidget.cpp" line="+574"/>
<source>Send a file</source>
<translation>Отправить файл</translation>
</message>
<message>
<location line="+13"/>
<location filename="../../src/TextInputWidget.h" line="+145"/>
<location filename="../../src/TextInputWidget.h" line="+160"/>
<source>Write a message...</source>
<translation>Написать сообщение...</translation>
</message>
@ -633,7 +741,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+86"/>
<location line="+94"/>
<source>Select a file</source>
<translation>Выберите файл</translation>
</message>
@ -642,6 +750,16 @@ Example: https://server.my:8787</source>
<source>All Files (*)</source>
<translation>Все файлы (*)</translation>
</message>
<message>
<location line="+64"/>
<source>Place a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/TextInputWidget.h" line="-5"/>
<source>Connection lost. Nheko is trying to re-connect...</source>
@ -651,30 +769,20 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+891"/>
<source>-- Decryption Error (failed to communicate with DB) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+20"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+99"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+805"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished">Ошибка редактирования сообщения: %1</translation>
</message>
<message>
<location line="+488"/>
<location line="+114"/>
<location line="+17"/>
<location line="+101"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+195"/>
<source>Save image</source>
<translation type="unfinished">Сохранить изображение</translation>
</message>
@ -693,20 +801,8 @@ Example: https://server.my:8787</source>
<source>Save file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-643"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+82"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+693"/>
<location line="+129"/>
<source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation type="unfinished">
@ -761,7 +857,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+48"/>
<location line="+33"/>
<source>%1 was invited.</source>
<translation type="unfinished"></translation>
</message>
@ -826,12 +922,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-1281"/>
<location line="-943"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1283"/>
<location line="+945"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -855,12 +951,12 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+91"/>
<location filename="../qml/TimelineRow.qml" line="+94"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -873,7 +969,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+54"/>
<location filename="../qml/TimelineView.qml" line="+61"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
@ -913,47 +1009,50 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+12"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+271"/>
<source>Close</source>
<translation type="unfinished">Закрыть</translation>
</message>
</context>
<context>
<name>TopRoomBar</name>
<message>
<location filename="../../src/TopRoomBar.cpp" line="+86"/>
<source>Room options</source>
<translation>Настройки комнаты</translation>
</message>
<message>
<location line="+5"/>
<source>Mentions</source>
<location line="+53"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<location line="+15"/>
<location line="+15"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+28"/>
<source>Room options</source>
<translation type="unfinished">Настройки комнаты</translation>
</message>
<message>
<location line="+7"/>
<source>Invite users</source>
<translation>Пригласить пользователей</translation>
<translation type="unfinished">Пригласить пользователей</translation>
</message>
<message>
<location line="+6"/>
<location line="+4"/>
<source>Members</source>
<translation>Участники</translation>
<translation type="unfinished">Участники</translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Leave room</source>
<translation>Покинуть комнату</translation>
<translation type="unfinished">Покинуть комнату</translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Settings</source>
<translation>Настройки</translation>
<translation type="unfinished">Настройки</translation>
</message>
<message>
<location line="+253"/>
<source>Close</source>
<translation type="unfinished">Закрыть</translation>
</message>
</context>
<context>
@ -1015,7 +1114,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+535"/>
<location filename="../../src/UserSettingsPage.cpp" line="+566"/>
<source>Minimize to tray</source>
<translation>Сворачивать в системную панель</translation>
</message>
@ -1035,7 +1134,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="-63"/>
<source>CALLS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Keep the application running in the background after closing the client window.</source>
<translation type="unfinished"></translation>
</message>
@ -1198,7 +1302,17 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Тема</translation>
</message>
<message>
<location line="+3"/>
<location line="+4"/>
<source>Allow fallback call assist server</source>
<translation type="unfinished"></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>
</message>
<message>
<location line="+4"/>
<source>Device ID</source>
<translation>ID устройства</translation>
</message>
@ -1208,7 +1322,7 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Отпечаток устройства</translation>
</message>
<message>
<location line="-113"/>
<location line="-120"/>
<source>Session Keys</source>
<translation>Ключи сеанса</translation>
</message>
@ -1228,22 +1342,22 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>ШИФРОВАНИЕ</translation>
</message>
<message>
<location line="-71"/>
<location line="-78"/>
<source>GENERAL</source>
<translation>ГЛАВНОЕ</translation>
</message>
<message>
<location line="+29"/>
<location line="+30"/>
<source>INTERFACE</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+166"/>
<location line="+172"/>
<source>Emoji Font Family</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+179"/>
<location line="+191"/>
<source>Open Sessions File</source>
<translation>Открыть файл сеансов</translation>
</message>
@ -1316,11 +1430,24 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+147"/>
<location filename="../../src/Utils.cpp" line="+146"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::AcceptCall</name>
<message>
<location filename="../../src/dialogs/AcceptCall.cpp" line="+89"/>
<source>Accept</source>
<translation type="unfinished">Принять</translation>
</message>
<message>
<location line="+5"/>
<source>Reject</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::CreateRoom</name>
<message>
@ -1444,6 +1571,19 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Выйти из учётной записи. Вы уверены?</translation>
</message>
</context>
<context>
<name>dialogs::PlaceCall</name>
<message>
<location filename="../../src/dialogs/PlaceCall.cpp" line="+60"/>
<source>Voice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::PreviewUploadOverlay</name>
<message>
@ -1643,7 +1783,7 @@ Media size: %2
<context>
<name>dialogs::UserProfile</name>
<message>
<location filename="../../src/dialogs/UserProfile.cpp" line="+63"/>
<location filename="../../src/dialogs/UserProfile.cpp" line="+64"/>
<source>Ban the user from the room</source>
<translation>Заблокировать пользователя в комнате</translation>
</message>
@ -1663,7 +1803,17 @@ Media size: %2
<translation>Начать разговор</translation>
</message>
<message>
<location line="+61"/>
<location line="+14"/>
<source>Confirm DM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2) to a direct chat?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<source>Devices</source>
<translation>Устройства</translation>
</message>
@ -1714,7 +1864,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+103"/>
<location filename="../../src/Utils.h" line="+106"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</message>
@ -1793,6 +1943,36 @@ Media size: %2
<source>%1 sent an encrypted message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You ended a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 ended a call</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
<context>
<name>Cache</name>
<message>
<location filename="../../src/Cache.cpp" line="+1359"/>
<location filename="../../src/Cache.cpp" line="+1658"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
@ -12,33 +12,53 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+229"/>
<location filename="../../src/ChatPage.cpp" line="+218"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<location line="+926"/>
<location line="+947"/>
<source>Invited user: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-474"/>
<location line="-458"/>
<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="+439"/>
<location line="+415"/>
<source>Room %1 created.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<location line="+26"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to invite %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<location line="+15"/>
<source>Confirm kick</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to kick %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to kick %1 to %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +68,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm ban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to ban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to ban %1 in %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -58,7 +88,17 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+10"/>
<source>Confirm unban</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to unban %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<source>Failed to unban %1 in %2: %3</source>
<translation type="unfinished"></translation>
</message>
@ -68,12 +108,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="-828"/>
<location line="-874"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+296"/>
<location line="+334"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -88,28 +128,28 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+111"/>
<location line="+67"/>
<source>Failed to restore OLM account. Please login again.</source>
<translation> OLM </translation>
</message>
<message>
<location line="+5"/>
<location line="+4"/>
<source>Failed to restore save data. Please login again.</source>
<translation></translation>
</message>
<message>
<location line="+156"/>
<location line="+165"/>
<source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<location line="+252"/>
<location line="+99"/>
<location line="+251"/>
<source>Please try to login again: %1</source>
<translation>%1</translation>
</message>
<message>
<location line="-187"/>
<location line="-219"/>
<source>Failed to join room: %1</source>
<translation type="unfinished"></translation>
</message>
@ -254,6 +294,43 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>EventStore</name>
<message>
<location filename="../../src/timeline/EventStore.cpp" line="+418"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+19"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed as %1.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+10"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>-- Replay attack! This message index was reused! --</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>-- Message by unverified device! --</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -367,6 +444,7 @@ Example: https://server.my:8787</source>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+66"/>
<location line="+6"/>
<source>redacted</source>
<translation type="unfinished"></translation>
</message>
@ -400,6 +478,36 @@ Example: https://server.my:8787</source>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a video call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>%1 placed a call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+6"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Placeholder</name>
@ -488,7 +596,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+984"/>
<location filename="../../src/Cache.cpp" line="+1443"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -612,13 +720,13 @@ Example: https://server.my:8787</source>
<context>
<name>TextInputWidget</name>
<message>
<location filename="../../src/TextInputWidget.cpp" line="+460"/>
<location filename="../../src/TextInputWidget.cpp" line="+574"/>
<source>Send a file</source>
<translation></translation>
</message>
<message>
<location line="+13"/>
<location filename="../../src/TextInputWidget.h" line="+145"/>
<location filename="../../src/TextInputWidget.h" line="+160"/>
<source>Write a message...</source>
<translation>...</translation>
</message>
@ -633,7 +741,7 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
<message>
<location line="+86"/>
<location line="+94"/>
<source>Select a file</source>
<translation></translation>
</message>
@ -642,6 +750,16 @@ Example: https://server.my:8787</source>
<source>All Files (*)</source>
<translation>*</translation>
</message>
<message>
<location line="+64"/>
<source>Place a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/TextInputWidget.h" line="-5"/>
<source>Connection lost. Nheko is trying to re-connect...</source>
@ -651,30 +769,20 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+891"/>
<source>-- Decryption Error (failed to communicate with DB) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed when trying to lookup the session.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+20"/>
<source>-- Decryption Error (failed to retrieve megolm keys from db) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted, because the DB access failed.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>-- Decryption Error (%1) --</source>
<comment>Placeholder, when the message can&apos;t be decrypted. In this case, the Olm decrytion returned an error, which is passed ad %1.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+99"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+805"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished">%1</translation>
</message>
<message>
<location line="+488"/>
<location line="+114"/>
<location line="+17"/>
<location line="+101"/>
<location line="+5"/>
<source>Failed to encrypt event, sending aborted!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+195"/>
<source>Save image</source>
<translation type="unfinished"></translation>
</message>
@ -693,20 +801,8 @@ Example: https://server.my:8787</source>
<source>Save file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-643"/>
<source>-- Encrypted Event (No keys found for decryption) --</source>
<comment>Placeholder, when the message was not decrypted yet or can&apos;t be decrypted.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+82"/>
<source>-- Encrypted Event (Unknown event type) --</source>
<comment>Placeholder, when the message was decrypted, but we couldn&apos;t parse it, because Nheko/mtxclient don&apos;t support that event type yet.</comment>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+693"/>
<location line="+129"/>
<source>%1 and %2 are typing.</source>
<comment>Multiple users are typing. First argument is a comma separated list of potentially multiple users. Second argument is the last user of that list. (If only one user is typing, %1 is empty. You should still use it in your string though to silence Qt warnings.)</comment>
<translation type="unfinished">
@ -759,7 +855,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+48"/>
<location line="+33"/>
<source>%1 was invited.</source>
<translation type="unfinished"></translation>
</message>
@ -824,12 +920,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-1281"/>
<location line="-943"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1283"/>
<location line="+945"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -853,12 +949,12 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+91"/>
<location filename="../qml/TimelineRow.qml" line="+94"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -871,7 +967,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+54"/>
<location filename="../qml/TimelineView.qml" line="+61"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
@ -911,49 +1007,52 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<location line="+12"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+271"/>
<location line="+53"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+15"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+28"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Invite users</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Members</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Leave room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+253"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TopRoomBar</name>
<message>
<location filename="../../src/TopRoomBar.cpp" line="+86"/>
<source>Room options</source>
<translation></translation>
</message>
<message>
<location line="+5"/>
<source>Mentions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>Invite users</source>
<translation></translation>
</message>
<message>
<location line="+6"/>
<source>Members</source>
<translation></translation>
</message>
<message>
<location line="+5"/>
<source>Leave room</source>
<translation></translation>
</message>
<message>
<location line="+5"/>
<source>Settings</source>
<translation></translation>
</message>
</context>
<context>
<name>TrayIcon</name>
<message>
@ -1013,7 +1112,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+535"/>
<location filename="../../src/UserSettingsPage.cpp" line="+566"/>
<source>Minimize to tray</source>
<translation></translation>
</message>
@ -1033,7 +1132,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-5"/>
<location line="-63"/>
<source>CALLS</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Keep the application running in the background after closing the client window.</source>
<translation type="unfinished"></translation>
</message>
@ -1196,7 +1300,17 @@ This usually causes the application icon in the task bar to animate in some fash
<translation></translation>
</message>
<message>
<location line="+3"/>
<location line="+4"/>
<source>Allow fallback call assist server</source>
<translation type="unfinished"></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>
</message>
<message>
<location line="+4"/>
<source>Device ID</source>
<translation> ID</translation>
</message>
@ -1206,7 +1320,7 @@ This usually causes the application icon in the task bar to animate in some fash
<translation></translation>
</message>
<message>
<location line="-113"/>
<location line="-120"/>
<source>Session Keys</source>
<translation></translation>
</message>
@ -1226,22 +1340,22 @@ This usually causes the application icon in the task bar to animate in some fash
<translation></translation>
</message>
<message>
<location line="-71"/>
<location line="-78"/>
<source>GENERAL</source>
<translation></translation>
</message>
<message>
<location line="+29"/>
<location line="+30"/>
<source>INTERFACE</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+166"/>
<location line="+172"/>
<source>Emoji Font Family</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+179"/>
<location line="+191"/>
<source>Open Sessions File</source>
<translation></translation>
</message>
@ -1313,11 +1427,24 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+147"/>
<location filename="../../src/Utils.cpp" line="+146"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::AcceptCall</name>
<message>
<location filename="../../src/dialogs/AcceptCall.cpp" line="+89"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Reject</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::CreateRoom</name>
<message>
@ -1441,6 +1568,19 @@ This usually causes the application icon in the task bar to animate in some fash
<translation></translation>
</message>
</context>
<context>
<name>dialogs::PlaceCall</name>
<message>
<location filename="../../src/dialogs/PlaceCall.cpp" line="+60"/>
<source>Voice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::PreviewUploadOverlay</name>
<message>
@ -1640,7 +1780,7 @@ Media size: %2
<context>
<name>dialogs::UserProfile</name>
<message>
<location filename="../../src/dialogs/UserProfile.cpp" line="+63"/>
<location filename="../../src/dialogs/UserProfile.cpp" line="+64"/>
<source>Ban the user from the room</source>
<translation></translation>
</message>
@ -1660,7 +1800,17 @@ Media size: %2
<translation></translation>
</message>
<message>
<location line="+61"/>
<location line="+14"/>
<source>Confirm DM</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Do you really want to invite %1 (%2) to a direct chat?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+54"/>
<source>Devices</source>
<translation></translation>
</message>
@ -1719,7 +1869,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+103"/>
<location filename="../../src/Utils.h" line="+106"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</message>
@ -1798,6 +1948,36 @@ Media size: %2
<source>%1 sent an encrypted message</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 placed a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 answered a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>You ended a call</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
<source>%1 ended a call</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>popups::UserMentions</name>

View File

@ -16,7 +16,7 @@ Rectangle {
Label {
anchors.fill: parent
text: chat.model.escapeEmoji(String.fromCodePoint(displayName.codePointAt(0)))
text: TimelineManager.escapeEmoji(String.fromCodePoint(displayName.codePointAt(0)))
textFormat: Text.RichText
font.pixelSize: avatar.height/2
verticalAlignment: Text.AlignVCenter
@ -52,6 +52,8 @@ Rectangle {
anchors.bottom: avatar.bottom
anchors.right: avatar.right
visible: !!userid
height: avatar.height / 6
width: height
radius: Settings.avatarCircles ? height / 2 : height / 4

View File

@ -147,6 +147,130 @@ Page {
z: 3
}
ColumnLayout {
anchors.fill: parent
Rectangle {
id: topBar
Layout.fillWidth: true
implicitHeight: topLayout.height + 16
z: 3
color: colors.base
MouseArea {
anchors.fill: parent
onClicked: TimelineManager.openRoomSettings();
}
GridLayout {
id: topLayout
anchors.left: parent.left
anchors.right: parent.right
anchors.margins: 8
anchors.verticalCenter: parent.verticalCenter
//Layout.margins: 8
ImageButton {
id: backToRoomsButton
Layout.column: 0
Layout.row: 0
Layout.rowSpan: 2
Layout.alignment: Qt.AlignVCenter
visible: TimelineManager.isNarrowView
image: ":/icons/icons/ui/angle-pointing-to-left.png"
ToolTip.visible: hovered
ToolTip.text: qsTr("Back to room list")
onClicked: TimelineManager.backToRooms()
}
Avatar {
Layout.column: 1
Layout.row: 0
Layout.rowSpan: 2
Layout.alignment: Qt.AlignVCenter
width: avatarSize
height: avatarSize
url: chat.model ? chat.model.roomAvatarUrl.replace("mxc://", "image://MxcImage/") : ""
displayName: chat.model ? chat.model.roomName : qsTr("No room selected")
MouseArea {
anchors.fill: parent
onClicked: TimelineManager.openRoomSettings();
}
}
Label {
Layout.fillWidth: true
Layout.column: 2
Layout.row: 0
font.pointSize: fontMetrics.font.pointSize * 1.1
text: chat.model ? chat.model.roomName : qsTr("No room selected")
MouseArea {
anchors.fill: parent
onClicked: TimelineManager.openRoomSettings();
}
}
MatrixText {
Layout.fillWidth: true
Layout.column: 2
Layout.row: 1
Layout.maximumHeight: fontMetrics.lineSpacing * 2 // show 2 lines
clip: true
text: chat.model ? chat.model.roomTopic : ""
}
ImageButton {
id: roomOptionsButton
Layout.column: 3
Layout.row: 0
Layout.rowSpan: 2
Layout.alignment: Qt.AlignVCenter
image: ":/icons/icons/ui/vertical-ellipsis.png"
ToolTip.visible: hovered
ToolTip.text: qsTr("Room options")
onClicked: roomOptionsMenu.popup(roomOptionsButton)
Menu {
id: roomOptionsMenu
MenuItem {
text: qsTr("Invite users")
onTriggered: TimelineManager.openInviteUsersDialog();
}
MenuItem {
text: qsTr("Members")
onTriggered: TimelineManager.openMemberListDialog();
}
MenuItem {
text: qsTr("Leave room")
onTriggered: TimelineManager.openLeaveRoomDialog();
}
MenuItem {
text: qsTr("Settings")
onTriggered: TimelineManager.openRoomSettings();
}
}
}
}
}
ListView {
id: chat
@ -154,13 +278,8 @@ Page {
cacheBuffer: 400
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
anchors.bottom: chatFooter.top
width: parent.width
anchors.leftMargin: 4
anchors.rightMargin: scrollbar.width
Layout.fillWidth: true
Layout.fillHeight: true
model: TimelineManager.timeline
@ -199,10 +318,6 @@ Page {
ScrollBar.vertical: ScrollBar {
id: scrollbar
parent: chat.parent
anchors.top: chat.top
anchors.right: chat.right
anchors.bottom: chat.bottom
}
spacing: 4
@ -210,9 +325,9 @@ Page {
onCountChanged: if (atYEnd) model.currentIndex = 0 // Mark last event as read, since we are at the bottom
property int delegateMaxWidth: (Settings.timelineMaxWidth > 100 && (parent.width - Settings.timelineMaxWidth) > 32) ? Settings.timelineMaxWidth : (parent.width - 32)
property int delegateMaxWidth: (Settings.timelineMaxWidth > 100 && (parent.width - Settings.timelineMaxWidth) > scrollbar.width*2) ? Settings.timelineMaxWidth : (parent.width - scrollbar.width*2)
delegate: Rectangle {
delegate: Item {
// This would normally be previousSection, but our model's order is inverted.
property bool sectionBoundary: (ListView.nextSection != "" && ListView.nextSection !== ListView.section) || model.index === chat.count - 1
@ -221,7 +336,6 @@ Page {
anchors.horizontalCenter: parent ? parent.horizontalCenter : undefined
width: chat.delegateMaxWidth
height: section ? section.height + timelinerow.height : timelinerow.height
color: "transparent"
TimelineRow {
id: timelinerow
@ -314,7 +428,7 @@ Page {
Label {
id: userName
text: chat.model.escapeEmoji(modelData.userName)
text: TimelineManager.escapeEmoji(modelData.userName)
color: TimelineManager.userColor(modelData.userId, colors.window)
textFormat: Text.RichText
@ -339,33 +453,35 @@ Page {
}
}
Rectangle {
Item {
id: chatFooter
height: Math.max(fontMetrics.height * 1.2, footerContent.height)
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
implicitHeight: Math.max(fontMetrics.height * 1.2, footerContent.height)
Layout.fillWidth: true
z: 3
color: "transparent"
Column {
id: footerContent
anchors.left: parent.left
anchors.right: parent.right
Label {
id: typingDisplay
anchors.left: parent.left
anchors.right: parent.right
anchors.leftMargin: 10
anchors.rightMargin: 10
color: colors.text
text: chat.model ? chat.model.formatTypingUsers(chat.model.typingUsers, colors.window) : ""
textFormat: Text.RichText
}
anchors.bottom: parent.bottom
Rectangle {
id: typingRect
anchors.left: parent.left
anchors.right: parent.right
color: (chat.model && chat.model.typingUsers.length > 0) ? colors.window : "transparent"
height: typingDisplay.height
Label {
id: typingDisplay
anchors.left: parent.left
anchors.leftMargin: 10
anchors.right: parent.right
anchors.rightMargin: 10
color: colors.text
text: chat.model ? chat.model.formatTypingUsers(chat.model.typingUsers, colors.window) : ""
textFormat: Text.RichText
}
}
Rectangle {
anchors.left: parent.left
@ -412,4 +528,5 @@ Page {
}
}
}
}
}

View File

@ -41,7 +41,7 @@ Item {
Text {
id: filename
Layout.fillWidth: true
text: model.data.body
text: model.data.filename
textFormat: Text.PlainText
elide: Text.ElideRight
color: colors.text

View File

@ -36,7 +36,7 @@ Item {
DelegateChoice {
roleValue: MtxEvent.EmoteMessage
NoticeMessage {
formatted: chat.model.escapeEmoji(modelData.userName) + " " + model.data.formattedBody
formatted: TimelineManager.escapeEmoji(modelData.userName) + " " + model.data.formattedBody
color: TimelineManager.userColor(modelData.userId, colors.window)
}
}
@ -99,7 +99,11 @@ Item {
DelegateChoice {
roleValue: MtxEvent.CallInvite
NoticeMessage {
text: qsTr("%1 placed a %2 call.").arg(model.data.userName).arg(model.data.callType)
text: switch(model.data.callType) {
case "voice": return qsTr("%1 placed a voice call.").arg(model.data.userName)
case "video": return qsTr("%1 placed a video call.").arg(model.data.userName)
default: return qsTr("%1 placed a call.").arg(model.data.userName)
}
}
}
DelegateChoice {

View File

@ -39,7 +39,7 @@ Item {
Text {
id: userName
text: chat.model ? chat.model.escapeEmoji(reply.modelData.userName) : ""
text: TimelineManager.escapeEmoji(reply.modelData.userName)
color: replyComponent.userColor
textFormat: Text.RichText

View File

@ -34,10 +34,12 @@ resolve(const QString &avatarUrl, int size, QObject *receiver, AvatarCallback ca
{
const auto cacheKey = QString("%1_size_%2").arg(avatarUrl).arg(size);
if (avatarUrl.isEmpty())
return;
QPixmap pixmap;
if (avatarUrl.isEmpty()) {
callback(pixmap);
return;
}
if (avatar_cache.find(cacheKey, &pixmap)) {
callback(pixmap);
return;
@ -75,11 +77,10 @@ resolve(const QString &avatarUrl, int size, QObject *receiver, AvatarCallback ca
opts.mxc_url,
mtx::errors::to_string(err->matrix_error.errcode),
err->matrix_error.error);
return;
} else {
cache::saveImage(cacheKey.toStdString(), res);
}
cache::saveImage(cacheKey.toStdString(), res);
emit proxy->avatarDownloaded(QByteArray(res.data(), res.size()));
});
}

View File

@ -96,8 +96,10 @@ namespace {
std::unique_ptr<Cache> instance_ = nullptr;
}
static bool
isHiddenEvent(mtx::events::collections::TimelineEvents e, const std::string &room_id)
bool
Cache::isHiddenEvent(lmdb::txn &txn,
mtx::events::collections::TimelineEvents e,
const std::string &room_id)
{
using namespace mtx::events;
if (auto encryptedEvent = std::get_if<EncryptedEvent<msg::Encrypted>>(&e)) {
@ -111,13 +113,27 @@ isHiddenEvent(mtx::events::collections::TimelineEvents e, const std::string &roo
e = result.event.value();
}
static constexpr std::initializer_list<EventType> hiddenEvents = {
mtx::events::account_data::nheko_extensions::HiddenEvents hiddenEvents;
hiddenEvents.hidden_event_types = {
EventType::Reaction, EventType::CallCandidates, EventType::Unsupported};
if (auto temp = getAccountData(txn, mtx::events::EventType::NhekoHiddenEvents, ""))
hiddenEvents = std::move(
std::get<
mtx::events::Event<mtx::events::account_data::nheko_extensions::HiddenEvents>>(
*temp)
.content);
if (auto temp = getAccountData(txn, mtx::events::EventType::NhekoHiddenEvents, room_id))
hiddenEvents = std::move(
std::get<
mtx::events::Event<mtx::events::account_data::nheko_extensions::HiddenEvents>>(
*temp)
.content);
return std::visit(
[](const auto &ev) {
return std::any_of(hiddenEvents.begin(),
hiddenEvents.end(),
[hiddenEvents](const auto &ev) {
return std::any_of(hiddenEvents.hidden_event_types.begin(),
hiddenEvents.hidden_event_types.end(),
[ev](EventType type) { return type == ev.type; });
},
e);
@ -646,6 +662,7 @@ Cache::removeRoom(lmdb::txn &txn, const std::string &roomid)
{
lmdb::dbi_del(txn, roomsDb_, lmdb::val(roomid), nullptr);
lmdb::dbi_drop(txn, getStatesDb(txn, roomid), true);
lmdb::dbi_drop(txn, getAccountDataDb(txn, roomid), true);
lmdb::dbi_drop(txn, getMembersDb(txn, roomid), true);
}
@ -1004,6 +1021,19 @@ Cache::saveState(const mtx::responses::Sync &res)
setNextBatchToken(txn, res.next_batch);
if (!res.account_data.events.empty()) {
auto accountDataDb = getAccountDataDb(txn, "");
for (const auto &ev : res.account_data.events)
std::visit(
[&txn, &accountDataDb](const auto &event) {
lmdb::dbi_put(txn,
accountDataDb,
lmdb::val(to_string(event.type)),
lmdb::val(json(event).dump()));
},
ev);
}
// Save joined rooms
for (const auto &room : res.rooms.join) {
auto statesdb = getStatesDb(txn, room.first);
@ -1023,30 +1053,43 @@ Cache::saveState(const mtx::responses::Sync &res)
updatedInfo.version = getRoomVersion(txn, statesdb).toStdString();
// Process the account_data associated with this room
bool has_new_tags = false;
for (const auto &evt : room.second.account_data.events) {
// for now only fetch tag events
if (std::holds_alternative<Event<account_data::Tags>>(evt)) {
auto tags_evt = std::get<Event<account_data::Tags>>(evt);
has_new_tags = true;
for (const auto &tag : tags_evt.content.tags) {
updatedInfo.tags.push_back(tag.first);
if (!room.second.account_data.events.empty()) {
auto accountDataDb = getAccountDataDb(txn, room.first);
bool has_new_tags = false;
for (const auto &evt : room.second.account_data.events) {
std::visit(
[&txn, &accountDataDb](const auto &event) {
lmdb::dbi_put(txn,
accountDataDb,
lmdb::val(to_string(event.type)),
lmdb::val(json(event).dump()));
},
evt);
// for tag events
if (std::holds_alternative<Event<account_data::Tags>>(evt)) {
auto tags_evt = std::get<Event<account_data::Tags>>(evt);
has_new_tags = true;
for (const auto &tag : tags_evt.content.tags) {
updatedInfo.tags.push_back(tag.first);
}
}
}
}
if (!has_new_tags) {
// retrieve the old tags, they haven't changed
lmdb::val data;
if (lmdb::dbi_get(txn, roomsDb_, lmdb::val(room.first), data)) {
try {
RoomInfo tmp =
json::parse(std::string_view(data.data(), data.size()));
updatedInfo.tags = tmp.tags;
} catch (const json::exception &e) {
nhlog::db()->warn(
"failed to parse room info: room_id ({}), {}",
room.first,
std::string(data.data(), data.size()));
if (!has_new_tags) {
// retrieve the old tags, they haven't changed
lmdb::val data;
if (lmdb::dbi_get(txn, roomsDb_, lmdb::val(room.first), data)) {
try {
RoomInfo tmp = json::parse(
std::string_view(data.data(), data.size()));
updatedInfo.tags = tmp.tags;
} catch (const json::exception &e) {
nhlog::db()->warn(
"failed to parse room info: room_id ({}), {}",
room.first,
std::string(data.data(), data.size()));
}
}
}
}
@ -2463,7 +2506,7 @@ Cache::saveTimelineMessages(lmdb::txn &txn,
lmdb::dbi_put(txn, evToOrderDb, event_id, lmdb::val(&index, sizeof(index)));
// TODO(Nico): Allow blacklisting more event types in UI
if (!isHiddenEvent(e, room_id)) {
if (!isHiddenEvent(txn, e, room_id)) {
++msgIndex;
lmdb::cursor_put(msgCursor.handle(),
lmdb::val(&msgIndex, sizeof(msgIndex)),
@ -2546,7 +2589,7 @@ Cache::saveOldMessages(const std::string &room_id, const mtx::responses::Message
lmdb::dbi_put(txn, evToOrderDb, event_id, lmdb::val(&index, sizeof(index)));
// TODO(Nico): Allow blacklisting more event types in UI
if (!isHiddenEvent(e, room_id)) {
if (!isHiddenEvent(txn, e, room_id)) {
--msgIndex;
lmdb::dbi_put(
txn, order2msgDb, lmdb::val(&msgIndex, sizeof(msgIndex)), event_id);
@ -2864,6 +2907,24 @@ Cache::deleteOldData() noexcept
}
}
std::optional<mtx::events::collections::RoomAccountDataEvents>
Cache::getAccountData(lmdb::txn &txn, mtx::events::EventType type, const std::string &room_id)
{
try {
auto db = getAccountDataDb(txn, room_id);
lmdb::val data;
if (lmdb::dbi_get(txn, db, lmdb::val(to_string(type)), data)) {
mtx::responses::utils::RoomAccountDataEvents events;
mtx::responses::utils::parse_room_account_data_events(
std::string_view(data.data(), data.size()), events);
return events.front();
}
} catch (...) {
}
return std::nullopt;
}
bool
Cache::hasEnoughPowerLevel(const std::vector<mtx::events::EventType> &eventTypes,
const std::string &room_id,

View File

@ -301,6 +301,14 @@ private:
const std::string &room_id,
const mtx::responses::Timeline &res);
//! retrieve a specific event from account data
//! pass empty room_id for global account data
std::optional<mtx::events::collections::RoomAccountDataEvents>
getAccountData(lmdb::txn &txn, mtx::events::EventType type, const std::string &room_id);
bool isHiddenEvent(lmdb::txn &txn,
mtx::events::collections::TimelineEvents e,
const std::string &room_id);
//! Remove a room from the cache.
// void removeLeftRoom(lmdb::txn &txn, const std::string &room_id);
template<class T>
@ -510,6 +518,12 @@ private:
return lmdb::dbi::open(txn, std::string(room_id + "/state").c_str(), MDB_CREATE);
}
lmdb::dbi getAccountDataDb(lmdb::txn &txn, const std::string &room_id)
{
return lmdb::dbi::open(
txn, std::string(room_id + "/account_data").c_str(), MDB_CREATE);
}
lmdb::dbi getMembersDb(lmdb::txn &txn, const std::string &room_id)
{
return lmdb::dbi::open(txn, std::string(room_id + "/members").c_str(), MDB_CREATE);

View File

@ -38,7 +38,6 @@
#include "SideBarActions.h"
#include "Splitter.h"
#include "TextInputWidget.h"
#include "TopRoomBar.h"
#include "UserInfoWidget.h"
#include "UserSettingsPage.h"
#include "Utils.h"
@ -127,10 +126,8 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
contentLayout_->setSpacing(0);
contentLayout_->setMargin(0);
top_bar_ = new TopRoomBar(this);
view_manager_ = new TimelineViewManager(userSettings_, &callManager_, this);
contentLayout_->addWidget(top_bar_);
contentLayout_->addWidget(view_manager_->getWidget());
activeCallBar_ = new ActiveCallBar(this);
@ -182,30 +179,6 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
room_list_->previousRoom();
});
connect(top_bar_, &TopRoomBar::mentionsClicked, this, [this](const QPoint &mentionsPos) {
if (user_mentions_popup_->isVisible()) {
user_mentions_popup_->hide();
} else {
showNotificationsDialog(mentionsPos);
http::client()->notifications(
1000,
"",
"highlight",
[this, mentionsPos](const mtx::responses::Notifications &res,
mtx::http::RequestErr err) {
if (err) {
nhlog::net()->warn(
"failed to retrieve notifications: {} ({})",
err->matrix_error.error,
static_cast<int>(err->status_code));
return;
}
emit highlightedNotifsRetrieved(std::move(res), mentionsPos);
});
}
});
connectivityTimer_.setInterval(CHECK_CONNECTIVITY_INTERVAL);
connect(&connectivityTimer_, &QTimer::timeout, this, [=]() {
if (http::client()->access_token().empty()) {
@ -227,8 +200,9 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
connect(this, &ChatPage::loggedOut, this, &ChatPage::logout);
connect(top_bar_, &TopRoomBar::showRoomList, splitter, &Splitter::showFullRoomList);
connect(top_bar_, &TopRoomBar::inviteUsers, this, [this](QStringList users) {
connect(
view_manager_, &TimelineViewManager::showRoomList, splitter, &Splitter::showFullRoomList);
connect(view_manager_, &TimelineViewManager::inviteUsers, this, [this](QStringList users) {
const auto room_id = current_room_.toStdString();
for (int ii = 0; ii < users.size(); ++ii) {
@ -252,8 +226,10 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
}
});
connect(room_list_, &RoomList::roomChanged, this, [this](QString room_id) {
this->current_room_ = room_id;
});
connect(room_list_, &RoomList::roomChanged, text_input_, &TextInputWidget::stopTyping);
connect(room_list_, &RoomList::roomChanged, this, &ChatPage::changeTopRoomInfo);
connect(room_list_, &RoomList::roomChanged, splitter, &Splitter::showChatView);
connect(room_list_, &RoomList::roomChanged, text_input_, &TextInputWidget::focusLineEdit);
connect(
@ -488,8 +464,6 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
}
});
connect(room_list_, &RoomList::roomAvatarChanged, this, &ChatPage::updateTopBarAvatar);
connect(
this, &ChatPage::updateGroupsInfo, communitiesList_, &CommunitiesList::setCommunities);
@ -589,11 +563,6 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
});
connect(this, &ChatPage::syncRoomlist, room_list_, &RoomList::sync);
connect(this, &ChatPage::syncTags, communitiesList_, &CommunitiesList::syncTags);
connect(
this, &ChatPage::syncTopBar, this, [this](const std::map<QString, RoomInfo> &updates) {
if (updates.find(currentRoom()) != updates.end())
changeTopRoomInfo(currentRoom());
});
// Callbacks to update the user info (top left corner of the page).
connect(this, &ChatPage::setUserAvatar, user_info_widget_, &UserInfoWidget::setAvatar);
@ -658,7 +627,6 @@ void
ChatPage::resetUI()
{
room_list_->clear();
top_bar_->reset();
user_info_widget_->reset();
view_manager_->clearAll();
@ -787,46 +755,6 @@ ChatPage::bootstrap(QString userid, QString homeserver, QString token)
tryInitialSync();
}
void
ChatPage::updateTopBarAvatar(const QString &roomid, const QString &img)
{
if (current_room_ != roomid)
return;
top_bar_->updateRoomAvatar(img);
}
void
ChatPage::changeTopRoomInfo(const QString &room_id)
{
if (room_id.isEmpty()) {
nhlog::ui()->warn("cannot switch to empty room_id");
return;
}
try {
auto room_info = cache::getRoomInfo({room_id.toStdString()});
if (room_info.find(room_id) == room_info.end())
return;
const auto name = QString::fromStdString(room_info[room_id].name);
const auto avatar_url = QString::fromStdString(room_info[room_id].avatar_url);
top_bar_->updateRoomName(name);
top_bar_->updateRoomTopic(QString::fromStdString(room_info[room_id].topic));
top_bar_->updateRoomAvatarFromName(name);
if (!avatar_url.isEmpty())
top_bar_->updateRoomAvatar(avatar_url);
} catch (const lmdb::error &e) {
nhlog::ui()->error("failed to change top bar room info: {}", e.what());
}
current_room_ = room_id;
}
void
ChatPage::showUnreadMessageNotification(int count)
{
@ -968,14 +896,22 @@ ChatPage::sendNotifications(const mtx::responses::Notifications &res)
}
if (userSettings_->hasDesktopNotifications()) {
notificationsManager.postNotification(
room_id,
QString::fromStdString(event_id),
QString::fromStdString(
cache::singleRoomInfo(item.room_id).name),
cache::displayName(room_id, user_id),
utils::event_body(item.event),
cache::getRoomAvatar(room_id));
auto info = cache::singleRoomInfo(item.room_id);
AvatarProvider::resolve(
QString::fromStdString(info.avatar_url),
96,
this,
[this, room_id, event_id, item, user_id, info](
QPixmap image) {
notificationsManager.postNotification(
room_id,
QString::fromStdString(event_id),
QString::fromStdString(info.name),
cache::displayName(room_id, user_id),
utils::event_body(item.event),
image.toImage());
});
}
}
} catch (const lmdb::error &e) {
@ -1071,7 +1007,6 @@ ChatPage::handleSyncResponse(mtx::responses::Sync res)
auto updates = cache::roomUpdates(res);
emit syncTopBar(updates);
emit syncRoomlist(updates);
emit syncUI(res.rooms);
@ -1482,9 +1417,12 @@ ChatPage::getProfileInfo()
void
ChatPage::hideSideBars()
{
communitiesList_->hide();
sideBar_->hide();
top_bar_->enableBackButton();
// Don't hide side bar, if we are currently only showing the side bar!
if (view_manager_->getWidget()->isVisible()) {
communitiesList_->hide();
sideBar_->hide();
}
view_manager_->enableBackButton();
}
void
@ -1494,23 +1432,19 @@ ChatPage::showSideBars()
communitiesList_->show();
sideBar_->show();
top_bar_->disableBackButton();
view_manager_->disableBackButton();
content_->show();
}
uint64_t
ChatPage::timelineWidth()
{
int sidebarWidth = sideBar_->size().width();
sidebarWidth += communitiesList_->size().width();
int sidebarWidth = sideBar_->minimumSize().width();
sidebarWidth += communitiesList_->minimumSize().width();
nhlog::ui()->info("timelineWidth: {}", size().width() - sidebarWidth);
return size().width() - sidebarWidth;
}
bool
ChatPage::isSideBarExpanded()
{
const auto sz = splitter::calculateSidebarSizes(QFont{});
return sideBar_->size().width() > sz.normal;
}
void
ChatPage::initiateLogout()

View File

@ -50,7 +50,6 @@ class SideBarActions;
class Splitter;
class TextInputWidget;
class TimelineViewManager;
class TopRoomBar;
class UserInfoWidget;
class UserSettings;
class NotificationsManager;
@ -85,7 +84,6 @@ public:
//! Calculate the width of the message timeline.
uint64_t timelineWidth();
bool isSideBarExpanded();
//! Hide the room & group list (if it was visible).
void hideSideBars();
//! Show the room/group list (if it was visible).
@ -156,7 +154,6 @@ signals:
void syncUI(const mtx::responses::Rooms &rooms);
void syncRoomlist(const std::map<QString, RoomInfo> &updates);
void syncTags(const std::map<QString, RoomInfo> &updates);
void syncTopBar(const std::map<QString, RoomInfo> &updates);
void dropToLoginPageCb(const QString &msg);
void notifyMessage(const QString &roomid,
@ -191,8 +188,6 @@ signals:
private slots:
void showUnreadMessageNotification(int count);
void updateTopBarAvatar(const QString &roomid, const QString &img);
void changeTopRoomInfo(const QString &room_id);
void logout();
void removeRoom(const QString &room_id);
void dropToLoginPage(const QString &msg);
@ -263,7 +258,6 @@ private:
TimelineViewManager *view_manager_;
SideBarActions *sidebarActions_;
TopRoomBar *top_bar_;
TextInputWidget *text_input_;
ActiveCallBar *activeCallBar_;

View File

@ -200,7 +200,8 @@ MainWindow::adjustSideBars()
const uint64_t timelineWidth = chat_page_->timelineWidth();
const uint64_t minAvailableWidth = sz.collapsePoint + sz.groups;
if (timelineWidth < minAvailableWidth && !chat_page_->isSideBarExpanded()) {
nhlog::ui()->info("timelineWidth: {}, min {}", timelineWidth, minAvailableWidth);
if (timelineWidth < minAvailableWidth) {
chat_page_->hideSideBars();
} else {
chat_page_->showSideBars();
@ -330,9 +331,7 @@ MainWindow::hasActiveUser()
void
MainWindow::openRoomSettings(const QString &room_id)
{
const auto roomToSearch = room_id.isEmpty() ? chat_page_->currentRoom() : "";
auto dialog = new dialogs::RoomSettings(roomToSearch, this);
auto dialog = new dialogs::RoomSettings(room_id, this);
showDialog(dialog);
}
@ -340,8 +339,7 @@ MainWindow::openRoomSettings(const QString &room_id)
void
MainWindow::openMemberListDialog(const QString &room_id)
{
const auto roomToSearch = room_id.isEmpty() ? chat_page_->currentRoom() : "";
auto dialog = new dialogs::MemberList(roomToSearch, this);
auto dialog = new dialogs::MemberList(room_id, this);
showDialog(dialog);
}
@ -349,11 +347,9 @@ MainWindow::openMemberListDialog(const QString &room_id)
void
MainWindow::openLeaveRoomDialog(const QString &room_id)
{
auto roomToLeave = room_id.isEmpty() ? chat_page_->currentRoom() : room_id;
auto dialog = new dialogs::LeaveRoom(this);
connect(dialog, &dialogs::LeaveRoom::leaving, this, [this, roomToLeave]() {
chat_page_->leaveRoom(roomToLeave);
connect(dialog, &dialogs::LeaveRoom::leaving, this, [this, room_id]() {
chat_page_->leaveRoom(room_id);
});
showDialog(dialog);

View File

@ -67,14 +67,14 @@ public:
static MainWindow *instance() { return instance_; };
void saveCurrentWindowSize();
void openLeaveRoomDialog(const QString &room_id = "");
void openLeaveRoomDialog(const QString &room_id);
void openInviteUsersDialog(std::function<void(const QStringList &invitees)> callback);
void openCreateRoomDialog(
std::function<void(const mtx::requests::CreateRoom &request)> callback);
void openJoinRoomDialog(std::function<void(const QString &room_id)> callback);
void openLogoutDialog();
void openRoomSettings(const QString &room_id = "");
void openMemberListDialog(const QString &room_id = "");
void openRoomSettings(const QString &room_id);
void openMemberListDialog(const QString &room_id);
void openReadReceiptsDialog(const QString &event_id);
void hideOverlay();

View File

@ -17,13 +17,16 @@ MxcImageResponse::run()
auto data = cache::image(fileName);
if (!data.isNull()) {
m_image = utils::readImage(&data);
m_image = m_image.scaled(
m_requestedSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
m_image.setText("mxc url", "mxc://" + m_id);
if (!m_image.isNull()) {
emit finished();
return;
m_image = m_image.scaled(
m_requestedSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
m_image.setText("mxc url", "mxc://" + m_id);
if (!m_image.isNull()) {
emit finished();
return;
}
}
}
@ -34,7 +37,7 @@ MxcImageResponse::run()
opts.method = "crop";
http::client()->get_thumbnail(
opts, [this, fileName](const std::string &res, mtx::http::RequestErr err) {
if (err) {
if (err || res.empty()) {
nhlog::net()->error("Failed to download image {}",
m_id.toStdString());
m_error = "Failed download";
@ -46,6 +49,10 @@ MxcImageResponse::run()
auto data = QByteArray(res.data(), res.size());
cache::saveImage(fileName, data);
m_image = utils::readImage(&data);
if (!m_image.isNull()) {
m_image = m_image.scaled(
m_requestedSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
}
m_image.setText("mxc url", "mxc://" + m_id);
emit finished();

View File

@ -246,7 +246,8 @@ FilteredTextEdit::keyPressEvent(QKeyEvent *event)
}
case Qt::Key_Colon: {
QTextEdit::keyPressEvent(event);
trigger_pos_ = textCursor().position() - 1;
trigger_pos_ = textCursor().position() - 1;
emoji_completion_model_->setFilterRegExp("");
emoji_popup_open_ = true;
break;
}

View File

@ -1,229 +0,0 @@
/*
* nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <QAction>
#include <QIcon>
#include <QLabel>
#include <QPaintEvent>
#include <QPainter>
#include <QPen>
#include <QPoint>
#include <QStyle>
#include <QStyleOption>
#include <QVBoxLayout>
#include "Config.h"
#include "MainWindow.h"
#include "TopRoomBar.h"
#include "Utils.h"
#include "ui/Avatar.h"
#include "ui/FlatButton.h"
#include "ui/Menu.h"
#include "ui/OverlayModal.h"
#include "ui/TextLabel.h"
TopRoomBar::TopRoomBar(QWidget *parent)
: QWidget(parent)
, buttonSize_{32}
{
QFont f;
f.setPointSizeF(f.pointSizeF());
const int fontHeight = QFontMetrics(f).height();
const int widgetMargin = fontHeight / 3;
const int contentHeight = fontHeight * 3;
setFixedHeight(contentHeight + widgetMargin);
topLayout_ = new QHBoxLayout(this);
topLayout_->setSpacing(widgetMargin);
topLayout_->setContentsMargins(
2 * widgetMargin, widgetMargin, 2 * widgetMargin, widgetMargin);
avatar_ = new Avatar(this, fontHeight * 2);
avatar_->setLetter("");
textLayout_ = new QVBoxLayout();
textLayout_->setSpacing(0);
textLayout_->setMargin(0);
QFont roomFont;
roomFont.setPointSizeF(roomFont.pointSizeF() * 1.1);
roomFont.setWeight(QFont::Medium);
nameLabel_ = new QLabel(this);
nameLabel_->setFont(roomFont);
nameLabel_->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
QFont descriptionFont;
topicLabel_ = new TextLabel(this);
topicLabel_->setLineWrapMode(QTextEdit::NoWrap);
topicLabel_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
topicLabel_->setFont(descriptionFont);
topicLabel_->setTextInteractionFlags(Qt::TextBrowserInteraction);
topicLabel_->setOpenExternalLinks(true);
topicLabel_->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
textLayout_->addWidget(nameLabel_);
textLayout_->addWidget(topicLabel_);
settingsBtn_ = new FlatButton(this);
settingsBtn_->setToolTip(tr("Room options"));
settingsBtn_->setFixedSize(buttonSize_, buttonSize_);
settingsBtn_->setCornerRadius(buttonSize_ / 2);
mentionsBtn_ = new FlatButton(this);
mentionsBtn_->setToolTip(tr("Mentions"));
mentionsBtn_->setFixedSize(buttonSize_, buttonSize_);
mentionsBtn_->setCornerRadius(buttonSize_ / 2);
QIcon settings_icon;
settings_icon.addFile(":/icons/icons/ui/vertical-ellipsis.png");
settingsBtn_->setIcon(settings_icon);
settingsBtn_->setIconSize(QSize(buttonSize_ / 2, buttonSize_ / 2));
QIcon mentions_icon;
mentions_icon.addFile(":/icons/icons/ui/at-solid.svg");
mentionsBtn_->setIcon(mentions_icon);
mentionsBtn_->setIconSize(QSize(buttonSize_ / 2, buttonSize_ / 2));
backBtn_ = new FlatButton(this);
backBtn_->setFixedSize(buttonSize_, buttonSize_);
backBtn_->setCornerRadius(buttonSize_ / 2);
QIcon backIcon;
backIcon.addFile(":/icons/icons/ui/angle-pointing-to-left.png");
backBtn_->setIcon(backIcon);
backBtn_->setIconSize(QSize(buttonSize_ / 2, buttonSize_ / 2));
backBtn_->hide();
connect(backBtn_, &QPushButton::clicked, this, &TopRoomBar::showRoomList);
topLayout_->addWidget(avatar_);
topLayout_->addWidget(backBtn_);
topLayout_->addLayout(textLayout_, 1);
topLayout_->addWidget(mentionsBtn_, 0, Qt::AlignRight);
topLayout_->addWidget(settingsBtn_, 0, Qt::AlignRight);
menu_ = new Menu(this);
inviteUsers_ = new QAction(tr("Invite users"), this);
connect(inviteUsers_, &QAction::triggered, this, [this]() {
MainWindow::instance()->openInviteUsersDialog(
[this](const QStringList &invitees) { emit inviteUsers(invitees); });
});
roomMembers_ = new QAction(tr("Members"), this);
connect(roomMembers_, &QAction::triggered, this, []() {
MainWindow::instance()->openMemberListDialog();
});
leaveRoom_ = new QAction(tr("Leave room"), this);
connect(leaveRoom_, &QAction::triggered, this, []() {
MainWindow::instance()->openLeaveRoomDialog();
});
roomSettings_ = new QAction(tr("Settings"), this);
connect(roomSettings_, &QAction::triggered, this, []() {
MainWindow::instance()->openRoomSettings();
});
menu_->addAction(inviteUsers_);
menu_->addAction(roomMembers_);
menu_->addAction(leaveRoom_);
menu_->addAction(roomSettings_);
connect(settingsBtn_, &QPushButton::clicked, this, [this]() {
auto pos = mapToGlobal(settingsBtn_->pos());
menu_->popup(
QPoint(pos.x() + buttonSize_ - menu_->sizeHint().width(), pos.y() + buttonSize_));
});
connect(mentionsBtn_, &QPushButton::clicked, this, [this]() {
auto pos = mapToGlobal(mentionsBtn_->pos());
emit mentionsClicked(pos);
});
}
void
TopRoomBar::enableBackButton()
{
avatar_->hide();
backBtn_->show();
}
void
TopRoomBar::disableBackButton()
{
avatar_->show();
backBtn_->hide();
}
void
TopRoomBar::updateRoomAvatarFromName(const QString &name)
{
avatar_->setLetter(utils::firstChar(name));
update();
}
void
TopRoomBar::reset()
{
nameLabel_->setText("");
topicLabel_->setText("");
avatar_->setLetter("");
}
void
TopRoomBar::updateRoomAvatar(const QString &avatar_image)
{
avatar_->setImage(avatar_image);
update();
}
void
TopRoomBar::updateRoomName(const QString &name)
{
nameLabel_->setText(name);
update();
}
void
TopRoomBar::updateRoomTopic(QString topic)
{
topic.replace(conf::strings::url_regex, conf::strings::url_html);
topicLabel_->clearLinks();
topicLabel_->setHtml(topic);
update();
}
void
TopRoomBar::mousePressEvent(QMouseEvent *)
{
if (roomSettings_ != nullptr)
roomSettings_->trigger();
}
void
TopRoomBar::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}

View File

@ -1,90 +0,0 @@
/*
* nheko Copyright (C) 2017 Konstantinos Sideris <siderisk@auth.gr>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <QColor>
#include <QStringList>
#include <QWidget>
class Avatar;
class FlatButton;
class Menu;
class TextLabel;
class OverlayModal;
class QLabel;
class QHBoxLayout;
class QVBoxLayout;
class TopRoomBar : public QWidget
{
Q_OBJECT
Q_PROPERTY(QColor borderColor READ borderColor WRITE setBorderColor)
public:
TopRoomBar(QWidget *parent = nullptr);
void updateRoomAvatar(const QString &avatar_image);
void updateRoomName(const QString &name);
void updateRoomTopic(QString topic);
void updateRoomAvatarFromName(const QString &name);
void reset();
QColor borderColor() const { return borderColor_; }
void setBorderColor(QColor &color) { borderColor_ = color; }
public slots:
//! Add a "back-arrow" button that can switch to roomlist only view.
void enableBackButton();
//! Replace the "back-arrow" button with the avatar of the room.
void disableBackButton();
signals:
void inviteUsers(QStringList users);
void showRoomList();
void mentionsClicked(const QPoint &pos);
protected:
void mousePressEvent(QMouseEvent *) override;
void paintEvent(QPaintEvent *) override;
private:
QHBoxLayout *topLayout_ = nullptr;
QVBoxLayout *textLayout_ = nullptr;
QLabel *nameLabel_ = nullptr;
TextLabel *topicLabel_ = nullptr;
Menu *menu_;
QAction *leaveRoom_ = nullptr;
QAction *roomMembers_ = nullptr;
QAction *roomSettings_ = nullptr;
QAction *inviteUsers_ = nullptr;
FlatButton *settingsBtn_;
FlatButton *mentionsBtn_;
FlatButton *backBtn_;
Avatar *avatar_;
int buttonSize_;
QColor borderColor_;
};

View File

@ -513,9 +513,6 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
callsLabel->setFont(font);
useStunServer_ = new Toggle{this};
defaultAudioSourceValue_ = new QLabel(this);
defaultAudioSourceValue_->setFont(font);
auto encryptionLabel_ = new QLabel{tr("ENCRYPTION"), this};
encryptionLabel_->setFixedHeight(encryptionLabel_->minimumHeight() + LayoutTopMargin);
encryptionLabel_->setAlignment(Qt::AlignBottom);
@ -652,7 +649,6 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
boxWrap(tr("Allow fallback call assist server"),
useStunServer_,
tr("Will use turn.matrix.org as assist when your home server does not offer one."));
boxWrap(tr("Default audio source device"), defaultAudioSourceValue_);
formLayout_->addRow(encryptionLabel_);
formLayout_->addRow(new HorizontalLine{this});
@ -813,7 +809,6 @@ UserSettingsPage::showEvent(QShowEvent *)
deviceIdValue_->setText(QString::fromStdString(http::client()->device_id()));
timelineMaxWidthSpin_->setValue(settings_->timelineMaxWidth());
useStunServer_->setState(!settings_->useStunServer());
defaultAudioSourceValue_->setText(settings_->defaultAudioSource());
deviceFingerprintValue_->setText(
utils::humanReadableFingerprint(olm::client()->identity_keys().ed25519));

View File

@ -250,7 +250,6 @@ private:
Toggle *decryptSidebar_;
QLabel *deviceFingerprintValue_;
QLabel *deviceIdValue_;
QLabel *defaultAudioSourceValue_;
QComboBox *themeCombo_;
QComboBox *scaleFactorCombo_;

View File

@ -21,6 +21,7 @@ WebRTCSession::WebRTCSession()
{
qRegisterMetaType<WebRTCSession::State>();
connect(this, &WebRTCSession::stateChanged, this, &WebRTCSession::setState);
init();
}
bool
@ -78,7 +79,11 @@ WebRTCSession::init(std::string *errorMessage)
gst_object_unref(plugin);
}
if (!initialised_) {
if (initialised_) {
#if GST_CHECK_VERSION(1, 18, 0)
startDeviceMonitor();
#endif
} else {
nhlog::ui()->error(strError);
if (errorMessage)
*errorMessage = strError;
@ -95,12 +100,65 @@ namespace {
bool isoffering_;
std::string localsdp_;
std::vector<mtx::events::msg::CallCandidates::Candidate> localcandidates_;
std::vector<std::pair<std::string, GstDevice *>> audioSources_;
void
addDevice(GstDevice *device)
{
if (device) {
gchar *name = gst_device_get_display_name(device);
nhlog::ui()->debug("WebRTC: device added: {}", name);
audioSources_.push_back({name, device});
g_free(name);
}
}
#if GST_CHECK_VERSION(1, 18, 0)
void
removeDevice(GstDevice *device, bool changed)
{
if (device) {
if (auto it = std::find_if(audioSources_.begin(),
audioSources_.end(),
[device](const auto &s) { return s.second == device; });
it != audioSources_.end()) {
nhlog::ui()->debug(std::string("WebRTC: device ") +
(changed ? "changed: " : "removed: ") + "{}",
it->first);
gst_object_unref(device);
audioSources_.erase(it);
}
}
}
#endif
gboolean
newBusMessage(GstBus *bus G_GNUC_UNUSED, GstMessage *msg, gpointer user_data)
{
WebRTCSession *session = static_cast<WebRTCSession *>(user_data);
switch (GST_MESSAGE_TYPE(msg)) {
#if GST_CHECK_VERSION(1, 18, 0)
case GST_MESSAGE_DEVICE_ADDED: {
GstDevice *device;
gst_message_parse_device_added(msg, &device);
addDevice(device);
break;
}
case GST_MESSAGE_DEVICE_REMOVED: {
GstDevice *device;
gst_message_parse_device_removed(msg, &device);
removeDevice(device, false);
break;
}
case GST_MESSAGE_DEVICE_CHANGED: {
GstDevice *device;
GstDevice *oldDevice;
gst_message_parse_device_changed(msg, &device, &oldDevice);
removeDevice(oldDevice, true);
addDevice(device);
break;
}
#endif
case GST_MESSAGE_EOS:
nhlog::ui()->error("WebRTC: end of stream");
session->end();
@ -176,7 +234,7 @@ createAnswer(GstPromise *promise, gpointer webrtc)
g_signal_emit_by_name(webrtc, "create-answer", nullptr, promise);
}
#if GST_CHECK_VERSION(1, 17, 0)
#if GST_CHECK_VERSION(1, 18, 0)
void
iceGatheringStateChanged(GstElement *webrtc,
GParamSpec *pspec G_GNUC_UNUSED,
@ -223,7 +281,7 @@ addLocalICECandidate(GstElement *webrtc G_GNUC_UNUSED,
{
nhlog::ui()->debug("WebRTC: local candidate: (m-line:{}):{}", mlineIndex, candidate);
#if GST_CHECK_VERSION(1, 17, 0)
#if GST_CHECK_VERSION(1, 18, 0)
localcandidates_.push_back({"audio", (uint16_t)mlineIndex, candidate});
return;
#else
@ -233,8 +291,10 @@ addLocalICECandidate(GstElement *webrtc G_GNUC_UNUSED,
return;
}
localcandidates_.push_back({"audio", (uint16_t)mlineIndex, candidate});
// GStreamer v1.16: webrtcbin's notify::ice-gathering-state triggers
// GST_WEBRTC_ICE_GATHERING_STATE_COMPLETE too early. Fixed in v1.17.
// GST_WEBRTC_ICE_GATHERING_STATE_COMPLETE too early. Fixed in v1.18.
// Use a 100ms timeout in the meantime
static guint timerid = 0;
if (timerid)
@ -423,8 +483,12 @@ WebRTCSession::acceptICECandidates(
for (const auto &c : candidates) {
nhlog::ui()->debug(
"WebRTC: remote candidate: (m-line:{}):{}", c.sdpMLineIndex, c.candidate);
g_signal_emit_by_name(
webrtc_, "add-ice-candidate", c.sdpMLineIndex, c.candidate.c_str());
if (!c.candidate.empty()) {
g_signal_emit_by_name(webrtc_,
"add-ice-candidate",
c.sdpMLineIndex,
c.candidate.c_str());
}
}
}
}
@ -471,7 +535,7 @@ WebRTCSession::startPipeline(int opusPayloadType)
gst_element_set_state(pipe_, GST_STATE_READY);
g_signal_connect(webrtc_, "pad-added", G_CALLBACK(addDecodeBin), pipe_);
#if GST_CHECK_VERSION(1, 17, 0)
#if GST_CHECK_VERSION(1, 18, 0)
// capture ICE gathering completion
g_signal_connect(
webrtc_, "notify::ice-gathering-state", G_CALLBACK(iceGatheringStateChanged), nullptr);
@ -488,7 +552,7 @@ WebRTCSession::startPipeline(int opusPayloadType)
}
GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(pipe_));
gst_bus_add_watch(bus, newBusMessage, this);
busWatchId_ = gst_bus_add_watch(bus, newBusMessage, this);
gst_object_unref(bus);
emit stateChanged(State::INITIATED);
return true;
@ -497,19 +561,18 @@ WebRTCSession::startPipeline(int opusPayloadType)
bool
WebRTCSession::createPipeline(int opusPayloadType)
{
int nSources = audioSources_ ? g_list_length(audioSources_) : 0;
if (nSources == 0) {
if (audioSources_.empty()) {
nhlog::ui()->error("WebRTC: no audio sources");
return false;
}
if (audioSourceIndex_ < 0 || audioSourceIndex_ >= nSources) {
if (audioSourceIndex_ < 0 || (size_t)audioSourceIndex_ >= audioSources_.size()) {
nhlog::ui()->error("WebRTC: invalid audio source index");
return false;
}
GstElement *source = gst_device_create_element(
GST_DEVICE_CAST(g_list_nth_data(audioSources_, audioSourceIndex_)), nullptr);
GstElement *source =
gst_device_create_element(audioSources_[audioSourceIndex_].second, nullptr);
GstElement *volume = gst_element_factory_make("volume", "srclevel");
GstElement *convert = gst_element_factory_make("audioconvert", nullptr);
GstElement *resample = gst_element_factory_make("audioresample", nullptr);
@ -594,12 +657,40 @@ WebRTCSession::end()
gst_element_set_state(pipe_, GST_STATE_NULL);
gst_object_unref(pipe_);
pipe_ = nullptr;
g_source_remove(busWatchId_);
busWatchId_ = 0;
}
webrtc_ = nullptr;
if (state_ != State::DISCONNECTED)
emit stateChanged(State::DISCONNECTED);
}
#if GST_CHECK_VERSION(1, 18, 0)
void
WebRTCSession::startDeviceMonitor()
{
if (!initialised_)
return;
static GstDeviceMonitor *monitor = nullptr;
if (!monitor) {
monitor = gst_device_monitor_new();
GstCaps *caps = gst_caps_new_empty_simple("audio/x-raw");
gst_device_monitor_add_filter(monitor, "Audio/Source", caps);
gst_caps_unref(caps);
GstBus *bus = gst_device_monitor_get_bus(monitor);
gst_bus_add_watch(bus, newBusMessage, nullptr);
gst_object_unref(bus);
if (!gst_device_monitor_start(monitor)) {
nhlog::ui()->error("WebRTC: failed to start device monitor");
return;
}
}
}
#else
void
WebRTCSession::refreshDevices()
{
@ -613,31 +704,42 @@ WebRTCSession::refreshDevices()
gst_device_monitor_add_filter(monitor, "Audio/Source", caps);
gst_caps_unref(caps);
}
g_list_free_full(audioSources_, g_object_unref);
audioSources_ = gst_device_monitor_get_devices(monitor);
std::for_each(audioSources_.begin(), audioSources_.end(), [](const auto &s) {
gst_object_unref(s.second);
});
audioSources_.clear();
GList *devices = gst_device_monitor_get_devices(monitor);
if (devices) {
audioSources_.reserve(g_list_length(devices));
for (GList *l = devices; l != nullptr; l = l->next)
addDevice(GST_DEVICE_CAST(l->data));
g_list_free(devices);
}
}
#endif
std::vector<std::string>
WebRTCSession::getAudioSourceNames(const std::string &defaultDevice)
{
if (!initialised_)
return {};
#if !GST_CHECK_VERSION(1, 18, 0)
refreshDevices();
#endif
// move default device to top of the list
if (auto it = std::find_if(audioSources_.begin(),
audioSources_.end(),
[&](const auto &s) { return s.first == defaultDevice; });
it != audioSources_.end())
std::swap(audioSources_.front(), *it);
std::vector<std::string> ret;
ret.reserve(g_list_length(audioSources_));
for (GList *l = audioSources_; l != nullptr; l = l->next) {
gchar *name = gst_device_get_display_name(GST_DEVICE_CAST(l->data));
ret.emplace_back(name);
g_free(name);
if (ret.back() == defaultDevice) {
// move default device to top of the list
std::swap(audioSources_->data, l->data);
std::swap(ret.front(), ret.back());
}
}
ret.reserve(audioSources_.size());
std::for_each(audioSources_.cbegin(), audioSources_.cend(), [&](const auto &s) {
ret.push_back(s.first);
});
return ret;
}
#else
bool
@ -688,6 +790,10 @@ void
WebRTCSession::refreshDevices()
{}
void
WebRTCSession::startDeviceMonitor()
{}
std::vector<std::string>
WebRTCSession::getAudioSourceNames(const std::string &)
{

View File

@ -7,7 +7,6 @@
#include "mtx/events/voip.hpp"
typedef struct _GList GList;
typedef struct _GstElement GstElement;
class WebRTCSession : public QObject
@ -64,18 +63,19 @@ private slots:
private:
WebRTCSession();
bool initialised_ = false;
State state_ = State::DISCONNECTED;
GstElement *pipe_ = nullptr;
GstElement *webrtc_ = nullptr;
bool initialised_ = false;
State state_ = State::DISCONNECTED;
GstElement *pipe_ = nullptr;
GstElement *webrtc_ = nullptr;
unsigned int busWatchId_ = 0;
std::string stunServer_;
std::vector<std::string> turnServers_;
GList *audioSources_ = nullptr;
int audioSourceIndex_ = -1;
bool startPipeline(int opusPayloadType);
bool createPipeline(int opusPayloadType);
void refreshDevices();
void startDeviceMonitor();
public:
WebRTCSession(WebRTCSession const &) = delete;

View File

@ -573,7 +573,7 @@ EventStore::decryptEvent(const IdIndex &idx,
room_id_,
index.sender_key);
dummy.content.body =
tr("-- Reply attack! This message index was reused! --").toStdString();
tr("-- Replay attack! This message index was reused! --").toStdString();
break;
case olm::DecryptionErrorCode::UnknownFingerprint:
// TODO: don't fail, just show in UI.

View File

@ -565,6 +565,25 @@ TimelineModel::fetchMore(const QModelIndex &)
events.fetchMore();
}
void
TimelineModel::syncState(const mtx::responses::State &s)
{
using namespace mtx::events;
for (const auto &e : s.events) {
if (std::holds_alternative<StateEvent<state::Avatar>>(e))
emit roomAvatarUrlChanged();
else if (std::holds_alternative<StateEvent<state::Name>>(e))
emit roomNameChanged();
else if (std::holds_alternative<StateEvent<state::Topic>>(e))
emit roomTopicChanged();
else if (std::holds_alternative<StateEvent<state::Member>>(e)) {
emit roomAvatarUrlChanged();
emit roomNameChanged();
}
}
}
void
TimelineModel::addEvents(const mtx::responses::Timeline &timeline)
{
@ -574,6 +593,7 @@ TimelineModel::addEvents(const mtx::responses::Timeline &timeline)
events.handleSync(timeline);
using namespace mtx::events;
for (auto e : timeline.events) {
if (auto encryptedEvent = std::get_if<EncryptedEvent<msg::Encrypted>>(&e)) {
MegolmSessionIndex index;
@ -597,6 +617,16 @@ TimelineModel::addEvents(const mtx::responses::Timeline &timeline)
emit newCallEvent(event);
},
e);
else if (std::holds_alternative<StateEvent<state::Avatar>>(e))
emit roomAvatarUrlChanged();
else if (std::holds_alternative<StateEvent<state::Name>>(e))
emit roomNameChanged();
else if (std::holds_alternative<StateEvent<state::Topic>>(e))
emit roomTopicChanged();
else if (std::holds_alternative<StateEvent<state::Member>>(e)) {
emit roomAvatarUrlChanged();
emit roomNameChanged();
}
}
updateLastMessage();
}
@ -737,12 +767,6 @@ TimelineModel::formatDateSeparator(QDate date) const
return date.toString(fmt);
}
QString
TimelineModel::escapeEmoji(QString str) const
{
return utils::replaceEmoji(str);
}
void
TimelineModel::viewRawMessage(QString id) const
{
@ -1440,7 +1464,7 @@ TimelineModel::formatTypingUsers(const std::vector<QString> &users, QColor bg)
QStringList uidWithoutLast;
auto formatUser = [this, bg](const QString &user_id) -> QString {
auto uncoloredUsername = escapeEmoji(displayName(user_id));
auto uncoloredUsername = utils::replaceEmoji(displayName(user_id));
QString prefix =
QString("<font color=\"%1\">").arg(manager_->userColor(user_id, bg).name());
@ -1490,7 +1514,7 @@ TimelineModel::formatJoinRuleEvent(QString id)
return "";
QString user = QString::fromStdString(event->sender);
QString name = escapeEmoji(displayName(user));
QString name = utils::replaceEmoji(displayName(user));
switch (event->content.join_rule) {
case mtx::events::state::JoinRule::Public:
@ -1515,7 +1539,7 @@ TimelineModel::formatGuestAccessEvent(QString id)
return "";
QString user = QString::fromStdString(event->sender);
QString name = escapeEmoji(displayName(user));
QString name = utils::replaceEmoji(displayName(user));
switch (event->content.guest_access) {
case mtx::events::state::AccessState::CanJoin:
@ -1540,7 +1564,7 @@ TimelineModel::formatHistoryVisibilityEvent(QString id)
return "";
QString user = QString::fromStdString(event->sender);
QString name = escapeEmoji(displayName(user));
QString name = utils::replaceEmoji(displayName(user));
switch (event->content.history_visibility) {
case mtx::events::state::Visibility::WorldReadable:
@ -1573,7 +1597,7 @@ TimelineModel::formatPowerLevelEvent(QString id)
return "";
QString user = QString::fromStdString(event->sender);
QString name = escapeEmoji(displayName(user));
QString name = utils::replaceEmoji(displayName(user));
// TODO: power levels rendering is actually a bit complex. work on this later.
return tr("%1 has changed the room's permissions.").arg(name);
@ -1602,7 +1626,7 @@ TimelineModel::formatMemberEvent(QString id)
}
QString user = QString::fromStdString(event->state_key);
QString name = escapeEmoji(displayName(user));
QString name = utils::replaceEmoji(displayName(user));
QString rendered;
// see table https://matrix.org/docs/spec/client_server/latest#m-room-member
@ -1675,3 +1699,37 @@ TimelineModel::formatMemberEvent(QString id)
return rendered;
}
QString
TimelineModel::roomName() const
{
auto info = cache::getRoomInfo({room_id_.toStdString()});
if (!info.count(room_id_))
return "";
else
return QString::fromStdString(info[room_id_].name);
}
QString
TimelineModel::roomAvatarUrl() const
{
auto info = cache::getRoomInfo({room_id_.toStdString()});
if (!info.count(room_id_))
return "";
else
return QString::fromStdString(info[room_id_].avatar_url);
}
QString
TimelineModel::roomTopic() const
{
auto info = cache::getRoomInfo({room_id_.toStdString()});
if (!info.count(room_id_))
return "";
else
return utils::replaceEmoji(utils::linkifyMessage(
utils::escapeBlacklistedHtml(QString::fromStdString(info[room_id_].topic))));
}

View File

@ -146,6 +146,9 @@ class TimelineModel : public QAbstractListModel
Q_PROPERTY(QString reply READ reply WRITE setReply NOTIFY replyChanged RESET resetReply)
Q_PROPERTY(
bool paginationInProgress READ paginationInProgress NOTIFY paginationInProgressChanged)
Q_PROPERTY(QString roomName READ roomName NOTIFY roomNameChanged)
Q_PROPERTY(QString roomAvatarUrl READ roomAvatarUrl NOTIFY roomAvatarUrlChanged)
Q_PROPERTY(QString roomTopic READ roomTopic NOTIFY roomTopicChanged)
public:
explicit TimelineModel(TimelineViewManager *manager,
@ -203,7 +206,6 @@ public:
Q_INVOKABLE QString formatGuestAccessEvent(QString id);
Q_INVOKABLE QString formatPowerLevelEvent(QString id);
Q_INVOKABLE QString escapeEmoji(QString str) const;
Q_INVOKABLE void viewRawMessage(QString id) const;
Q_INVOKABLE void viewDecryptedRawMessage(QString id) const;
Q_INVOKABLE void openUserProfile(QString userid);
@ -226,6 +228,7 @@ public:
void updateLastMessage();
void addEvents(const mtx::responses::Timeline &events);
void syncState(const mtx::responses::State &state);
template<class T>
void sendMessageEvent(const T &content, mtx::events::EventType eventType);
RelatedInfo relatedInfo(QString id);
@ -262,6 +265,11 @@ public slots:
void setDecryptDescription(bool decrypt) { decryptDescription = decrypt; }
void clearTimeline() { events.clearTimeline(); }
QString roomName() const;
QString roomTopic() const;
QString roomAvatarUrl() const;
QString roomId() const { return room_id_; }
private slots:
void addPendingMessage(mtx::events::collections::TimelineEvents event);
@ -282,6 +290,10 @@ signals:
void addPendingMessageToStore(mtx::events::collections::TimelineEvents event);
void updateFlowEventId(std::string event_id);
void roomNameChanged();
void roomTopicChanged();
void roomAvatarUrlChanged();
private:
template<typename T>
void sendEncryptedMessage(mtx::events::RoomEvent<T> msg, mtx::events::EventType eventType);

View File

@ -13,6 +13,7 @@
#include "ColorImageProvider.h"
#include "DelegateChooser.h"
#include "Logging.h"
#include "MainWindow.h"
#include "MatrixClient.h"
#include "MxcImageProvider.h"
#include "UserSettingsPage.h"
@ -102,7 +103,7 @@ TimelineViewManager::userStatus(QString id) const
TimelineViewManager::TimelineViewManager(QSharedPointer<UserSettings> userSettings,
CallManager *callManager,
QWidget *parent)
ChatPage *parent)
: imgProvider(new MxcImageProvider())
, colorImgProvider(new ColorImageProvider())
, blurhashProvider(new BlurhashProvider())
@ -189,11 +190,8 @@ TimelineViewManager::TimelineViewManager(QSharedPointer<UserSettings> userSettin
view->engine()->addImageProvider("blurhash", blurhashProvider);
view->setSource(QUrl("qrc:///qml/TimelineView.qml"));
connect(dynamic_cast<ChatPage *>(parent),
&ChatPage::themeChanged,
this,
&TimelineViewManager::updateColorPalette);
connect(dynamic_cast<ChatPage *>(parent),
connect(parent, &ChatPage::themeChanged, this, &TimelineViewManager::updateColorPalette);
connect(parent,
&ChatPage::decryptSidebarChanged,
this,
&TimelineViewManager::updateEncryptedDescriptions);
@ -295,7 +293,7 @@ TimelineViewManager::TimelineViewManager(QSharedPointer<UserSettings> userSettin
}
}
});
connect(dynamic_cast<ChatPage *>(parent), &ChatPage::loggedOut, this, [this]() {
connect(parent, &ChatPage::loggedOut, this, [this]() {
isInitialSync_ = true;
emit initialSyncChanged(true);
});
@ -313,6 +311,7 @@ TimelineViewManager::sync(const mtx::responses::Rooms &rooms)
&TimelineModel::newCallEvent,
callManager_,
&CallManager::syncEvent);
room_model->syncState(room.state);
room_model->addEvents(room.timeline);
if (!isInitialSync_)
disconnect(room_model.data(),
@ -363,6 +362,12 @@ TimelineViewManager::setHistoryView(const QString &room_id)
}
}
QString
TimelineViewManager::escapeEmoji(QString str) const
{
return utils::replaceEmoji(str);
}
void
TimelineViewManager::openImageOverlay(QString mxcUrl, QString eventId) const
{
@ -401,6 +406,28 @@ TimelineViewManager::openLink(QString link) const
QDesktopServices::openUrl(link);
}
void
TimelineViewManager::openInviteUsersDialog()
{
MainWindow::instance()->openInviteUsersDialog(
[this](const QStringList &invitees) { emit inviteUsers(invitees); });
}
void
TimelineViewManager::openMemberListDialog() const
{
MainWindow::instance()->openMemberListDialog(timeline_->roomId());
}
void
TimelineViewManager::openLeaveRoomDialog() const
{
MainWindow::instance()->openLeaveRoomDialog(timeline_->roomId());
}
void
TimelineViewManager::openRoomSettings() const
{
MainWindow::instance()->openRoomSettings(timeline_->roomId());
}
void
TimelineViewManager::updateReadReceipts(const QString &room_id,
const std::vector<QString> &event_ids)

View File

@ -22,6 +22,7 @@ class BlurhashProvider;
class CallManager;
class ColorImageProvider;
class UserSettings;
class ChatPage;
class DeviceVerificationList : public QObject
{
@ -45,11 +46,13 @@ class TimelineViewManager : public QObject
TimelineModel *timeline MEMBER timeline_ READ activeTimeline NOTIFY activeTimelineChanged)
Q_PROPERTY(
bool isInitialSync MEMBER isInitialSync_ READ isInitialSync NOTIFY initialSyncChanged)
Q_PROPERTY(
bool isNarrowView MEMBER isNarrowView_ READ isNarrowView NOTIFY narrowViewChanged)
public:
TimelineViewManager(QSharedPointer<UserSettings> userSettings,
CallManager *callManager,
QWidget *parent = nullptr);
ChatPage *parent = nullptr);
QWidget *getWidget() const { return container; }
void sync(const mtx::responses::Rooms &rooms);
@ -59,14 +62,21 @@ public:
Q_INVOKABLE TimelineModel *activeTimeline() const { return timeline_; }
Q_INVOKABLE bool isInitialSync() const { return isInitialSync_; }
bool isNarrowView() const { return isNarrowView_; }
Q_INVOKABLE void openImageOverlay(QString mxcUrl, QString eventId) const;
Q_INVOKABLE QColor userColor(QString id, QColor background);
Q_INVOKABLE QString escapeEmoji(QString str) const;
Q_INVOKABLE QString userPresence(QString id) const;
Q_INVOKABLE QString userStatus(QString id) const;
Q_INVOKABLE void openLink(QString link) const;
Q_INVOKABLE void openInviteUsersDialog();
Q_INVOKABLE void openMemberListDialog() const;
Q_INVOKABLE void openLeaveRoomDialog() const;
Q_INVOKABLE void openRoomSettings() const;
signals:
void clearRoomMessageCount(QString roomid);
void updateRoomsLastMessage(QString roomid, const DescInfo &info);
@ -79,6 +89,9 @@ signals:
QString userId,
QString deviceId,
bool isRequest = false);
void inviteUsers(QStringList users);
void showRoomList();
void narrowViewChanged();
public slots:
void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids);
@ -128,6 +141,23 @@ public slots:
timeline_->clearTimeline();
}
void enableBackButton()
{
if (isNarrowView_)
return;
isNarrowView_ = true;
emit narrowViewChanged();
}
void disableBackButton()
{
if (!isNarrowView_)
return;
isNarrowView_ = false;
emit narrowViewChanged();
}
void backToRooms() { emit showRoomList(); }
private:
#ifdef USE_QUICK_VIEW
QQuickView *view;
@ -145,6 +175,7 @@ private:
CallManager *callManager_ = nullptr;
bool isInitialSync_ = true;
bool isNarrowView_ = false;
QSharedPointer<UserSettings> settings;
QHash<QString, QColor> userColors;

View File

@ -260,6 +260,7 @@ decode(std::string_view blurhash, size_t width, size_t height, size_t bytesPerPi
Components components{};
std::vector<Color> values;
values.reserve(blurhash.size() / 2);
try {
components = unpackComponents(decode83(blurhash.substr(0, 1)));
@ -277,7 +278,7 @@ decode(std::string_view blurhash, size_t width, size_t height, size_t bytesPerPi
return {};
}
i.image.reserve(height * width * 3);
i.image.reserve(height * width * bytesPerPixel);
for (size_t y = 0; y < height; y++) {
for (size_t x = 0; x < width; x++) {
@ -344,7 +345,7 @@ encode(unsigned char *image, size_t width, size_t height, int components_x, int
}
int quantisedMaximumValue = encodeMaxAC(actualMaximumValue);
maximumValue = ((float)quantisedMaximumValue + 1) / 166;
maximumValue = ((float)quantisedMaximumValue + 1) / 166;
h += leftPad(encode83(quantisedMaximumValue), 1);
} else {
maximumValue = 1;
@ -406,7 +407,7 @@ TEST_CASE("AC")
{
auto h = "00%#MwS|WCWEM{R*bbWBbH"sv;
for (size_t i = 0; i < h.size(); i += 2) {
auto s = h.substr(i, 2);
auto s = h.substr(i, 2);
const auto maxAC = 0.289157f;
CHECK(leftPad(encode83(encodeAC(decodeAC(decode83(s), maxAC), maxAC)), 2) == s);
}