summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--README.md1
-rw-r--r--io.github.NhekoReborn.Nheko.json2
-rw-r--r--resources/langs/nheko_cs.ts460
-rw-r--r--resources/langs/nheko_de.ts460
-rw-r--r--resources/langs/nheko_el.ts460
-rw-r--r--resources/langs/nheko_en.ts460
-rw-r--r--resources/langs/nheko_eo.ts468
-rw-r--r--resources/langs/nheko_et.ts474
-rw-r--r--resources/langs/nheko_fi.ts460
-rw-r--r--resources/langs/nheko_fr.ts554
-rw-r--r--resources/langs/nheko_it.ts460
-rw-r--r--resources/langs/nheko_ja.ts460
-rw-r--r--resources/langs/nheko_nl.ts460
-rw-r--r--resources/langs/nheko_pl.ts460
-rw-r--r--resources/langs/nheko_pt_PT.ts460
-rw-r--r--resources/langs/nheko_ro.ts460
-rw-r--r--resources/langs/nheko_ru.ts460
-rw-r--r--resources/langs/nheko_si.ts460
-rw-r--r--resources/langs/nheko_zh_CN.ts460
-rw-r--r--resources/qml/ActiveCallBar.qml2
-rw-r--r--resources/qml/Avatar.qml2
-rw-r--r--resources/qml/MatrixText.qml4
-rw-r--r--resources/qml/MessageInput.qml90
-rw-r--r--resources/qml/MessageView.qml202
-rw-r--r--resources/qml/Reactions.qml2
-rw-r--r--resources/qml/ReplyPopup.qml47
-rw-r--r--resources/qml/TimelineRow.qml2
-rw-r--r--resources/qml/TimelineView.qml454
-rw-r--r--resources/qml/TopBar.qml127
-rw-r--r--resources/qml/TypingIndicator.qml35
-rw-r--r--resources/qml/delegates/FileMessage.qml2
-rw-r--r--resources/qml/delegates/ImageMessage.qml33
-rw-r--r--resources/qml/delegates/NoticeMessage.qml2
-rw-r--r--resources/qml/delegates/Pill.qml2
-rw-r--r--resources/qml/delegates/PlayableMediaMessage.qml2
-rw-r--r--resources/qml/delegates/TextMessage.qml2
-rw-r--r--resources/qml/emoji/EmojiPicker.qml5
-rw-r--r--resources/res.qrc5
-rw-r--r--resources/styles/nheko-dark.qss5
-rw-r--r--resources/styles/nheko.qss6
-rw-r--r--resources/styles/system.qss4
-rw-r--r--src/Cache.cpp275
-rw-r--r--src/Cache.h19
-rw-r--r--src/CacheCryptoStructs.h10
-rw-r--r--src/Cache_p.h44
-rw-r--r--src/ChatPage.cpp30
-rw-r--r--src/ChatPage.h5
-rw-r--r--src/MainWindow.cpp20
-rw-r--r--src/MainWindow.h6
-rw-r--r--src/Olm.cpp523
-rw-r--r--src/Olm.h17
-rw-r--r--src/RoomInfoListItem.cpp8
-rw-r--r--src/RoomInfoListItem.h7
-rw-r--r--src/RoomList.cpp16
-rw-r--r--src/RoomList.h1
-rw-r--r--src/TextInputWidget.cpp3
-rw-r--r--src/UserSettingsPage.cpp126
-rw-r--r--src/UserSettingsPage.h20
-rw-r--r--src/main.cpp41
-rw-r--r--src/timeline/EventStore.cpp60
-rw-r--r--src/timeline/EventStore.h9
-rw-r--r--src/timeline/TimelineModel.cpp222
-rw-r--r--src/timeline/TimelineModel.h10
-rw-r--r--src/timeline/TimelineViewManager.cpp32
-rw-r--r--src/timeline/TimelineViewManager.h6
66 files changed, 7983 insertions, 2503 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt

index 2f83a865..2fa839be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -340,7 +340,7 @@ if(USE_BUNDLED_MTXCLIENT) FetchContent_Declare( MatrixClient GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git - GIT_TAG ad5575bc24089dc385e97d9ace026414b618775c + GIT_TAG 6432e89a3465e58ed838dd2abdcb0f91bd4f05b0 ) FetchContent_MakeAvailable(MatrixClient) else() diff --git a/README.md b/README.md
index 92b55460..ee42cb0c 100644 --- a/README.md +++ b/README.md
@@ -41,6 +41,7 @@ Specifically there is support for: - Basic communities support. - Room switcher (ctrl-K). - Light, Dark & System themes. +- Creating separate profiles (command line only, use `--profile=name`). ## Installation diff --git a/io.github.NhekoReborn.Nheko.json b/io.github.NhekoReborn.Nheko.json
index 59f4fa46..c461ceaa 100644 --- a/io.github.NhekoReborn.Nheko.json +++ b/io.github.NhekoReborn.Nheko.json
@@ -146,7 +146,7 @@ "name": "mtxclient", "sources": [ { - "commit": "ad5575bc24089dc385e97d9ace026414b618775c", + "commit": "6432e89a3465e58ed838dd2abdcb0f91bd4f05b0", "type": "git", "url": "https://github.com/Nheko-Reborn/mtxclient.git" } diff --git a/resources/langs/nheko_cs.ts b/resources/langs/nheko_cs.ts
index 38443412..318ceb64 100644 --- a/resources/langs/nheko_cs.ts +++ b/resources/langs/nheko_cs.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="cs"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <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="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation type="unfinished"></translation> </message> @@ -108,12 +154,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -128,7 +174,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation type="unfinished"></translation> </message> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation type="unfinished"></translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation type="unfinished"></translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -443,18 +571,18 @@ Example: https://server.my:8787</source> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -464,7 +592,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -474,42 +602,93 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+19"/> + <location line="+29"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> <message> - <location line="-12"/> + <location line="-18"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -518,6 +697,24 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -594,9 +791,17 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -656,7 +861,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation type="unfinished"></translation> </message> @@ -697,30 +902,48 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation type="unfinished"></translation> </message> @@ -741,7 +964,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation type="unfinished"></translation> </message> @@ -751,7 +974,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation type="unfinished"></translation> </message> @@ -769,20 +992,19 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation type="unfinished"></translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation type="unfinished"></translation> </message> @@ -922,12 +1144,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation type="unfinished"></translation> </message> @@ -951,17 +1173,17 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation type="unfinished"></translation> </message> @@ -969,63 +1191,74 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1035,25 +1268,20 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <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> @@ -1112,9 +1340,32 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation type="unfinished"></translation> </message> @@ -1134,12 +1385,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation type="unfinished"></translation> </message> @@ -1277,7 +1533,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation type="unfinished"></translation> </message> @@ -1322,7 +1588,7 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation type="unfinished"></translation> </message> @@ -1342,22 +1608,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation type="unfinished"></translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation type="unfinished"></translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation type="unfinished"></translation> </message> @@ -1404,6 +1680,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_de.ts b/resources/langs/nheko_de.ts
index 0958017f..7afd8c51 100644 --- a/resources/langs/nheko_de.ts +++ b/resources/langs/nheko_de.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="de"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished">Abbrechen</translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation>Du bist dem Raum beigetreten.</translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation>Nutzer konnte nicht eingeladen werden: %1</translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation>Eingeladener Benutzer: %1</translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source> <translation>Das Migrieren des Caches auf die aktuelle Version ist fehlgeschlagen. Das kann verschiedene Gründe als Ursache haben. Bitte melde den Fehler und verwende in der Zwischenzeit eine ältere Version. Alternativ kannst du das Cache manuell löschen.</translation> </message> <message> - <location line="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation>Raum %1 erzeugt.</translation> </message> @@ -108,12 +154,12 @@ <translation>Verbannung von %1 wurde aufgehoben.</translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation>Medienupload fehlgeschlagen. Bitte versuche es erneut.</translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation>Cache migration fehlgeschlagen!</translation> </message> @@ -128,7 +174,7 @@ <translation>Der Cache auf der Festplatte wurde mit einer neueren Nheko - Version angelegt. Bitte aktualisiere Nheko oder entferne den Cache.</translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation>Wiederherstellung des OLM Accounts fehlgeschlagen. Bitte logge dich erneut ein.</translation> </message> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation>Bitte melde dich erneut an: %1</translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation>Konnte Raum nicht betreten: %1</translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation>Suche</translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation>Leute</translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation>Verschlüsselt</translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished">Schließen</translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -447,18 +575,18 @@ Beispiel: https://mein.server:8787</translation> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation>gelöscht</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation>Verschlüsselung aktiviert</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation>Raumname wurde gändert auf: %1</translation> </message> @@ -468,7 +596,7 @@ Beispiel: https://mein.server:8787</translation> <translation>Raumname wurde entfernt</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation>Raumthema wurde geändert auf: %1</translation> </message> @@ -478,42 +606,93 @@ Beispiel: https://mein.server:8787</translation> <translation>Raumthema wurde entfernt.</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation>%1 hat den Raum erstellt: %2</translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+11"/> <source>%1 answered the call.</source> <translation>%1 hat den Anruf angenommen.</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation>%1 hat den Anruf beendet.</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished">Schreibe eine Nachricht…</translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished">Abbrechen</translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished">Akzeptieren</translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -522,6 +701,24 @@ Beispiel: https://mein.server:8787</translation> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -598,9 +795,17 @@ Beispiel: https://mein.server:8787</translation> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished">Schließen</translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation>keine Version gespeichert</translation> </message> @@ -660,7 +865,7 @@ Beispiel: https://mein.server:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation>Akzeptieren</translation> </message> @@ -701,30 +906,48 @@ Beispiel: https://mein.server:8787</translation> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation>Fehlgeschlagen</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation>Gesendet</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation>Empfangen</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation>Gelesen</translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished">Schließen</translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation>Versende Datei</translation> </message> @@ -745,7 +968,7 @@ Beispiel: https://mein.server:8787</translation> <translation>Emoji</translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation>Datei auswählen</translation> </message> @@ -755,7 +978,7 @@ Beispiel: https://mein.server:8787</translation> <translation>Alle Dateien (*)</translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation type="unfinished"></translation> </message> @@ -773,20 +996,19 @@ Beispiel: https://mein.server:8787</translation> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation>Nachricht zurückziehen fehlgeschlagen: %1</translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation type="unfinished"></translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation>Bild speichern</translation> </message> @@ -925,12 +1147,12 @@ Beispiel: https://mein.server:8787</translation> <translation>%1 hat das Anklopfen zurückgezogen.</translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation>Du bist dem Raum beigetreten.</translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation>Hat das Anklopfen von %1 abgewiesen.</translation> </message> @@ -954,17 +1176,17 @@ Beispiel: https://mein.server:8787</translation> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation>Antworten</translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation>Optionen</translation> </message> @@ -972,63 +1194,74 @@ Beispiel: https://mein.server:8787</translation> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation>Antworten</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation>Lesebestätigungen</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation>Als gelesen markieren</translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation>Zeige rohen Nachrichteninhalt</translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation>Zeige rohen, entschlüsselten Nachrichteninhalt</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation>Nachricht löschen</translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation>Speichern unter...</translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation>Kein Raum geöffnet</translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation type="unfinished">Raumoptionen</translation> </message> @@ -1038,25 +1271,20 @@ Beispiel: https://mein.server:8787</translation> <translation type="unfinished">Benutzer einladen</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> <translation type="unfinished">Teilnehmer</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> <translation type="unfinished">Raum verlassen</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Settings</source> <translation type="unfinished">Einstellungen</translation> </message> - <message> - <location line="+253"/> - <source>Close</source> - <translation>Schließen</translation> - </message> </context> <context> <name>TrayIcon</name> @@ -1115,9 +1343,32 @@ Beispiel: https://mein.server:8787</translation> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation>Ins Benachrichtigungsfeld minimieren</translation> </message> @@ -1137,12 +1388,17 @@ Beispiel: https://mein.server:8787</translation> <translation>Runde Profilbilder</translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation type="unfinished"></translation> </message> @@ -1280,7 +1536,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation>Skalierungsfaktor</translation> </message> @@ -1325,7 +1591,7 @@ This usually causes the application icon in the task bar to animate in some fash <translation>Gerätefingerabdruck</translation> </message> <message> - <location line="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation>Sitzungsschlüssel</translation> </message> @@ -1345,22 +1611,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation>VERSCHLÜSSELUNG</translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation>ALLGEMEINES</translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation>OBERFLÄCHE</translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation>Emojischriftart</translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation>Öffne Sessions Datei</translation> </message> @@ -1407,6 +1683,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished">Abbrechen</translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_el.ts b/resources/langs/nheko_el.ts
index d0a46653..d943c6f1 100644 --- a/resources/langs/nheko_el.ts +++ b/resources/langs/nheko_el.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="el"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished">Άκυρο</translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <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="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation type="unfinished"></translation> </message> @@ -108,12 +154,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -128,7 +174,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation type="unfinished"></translation> </message> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation type="unfinished"></translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation type="unfinished"></translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -443,18 +571,18 @@ Example: https://server.my:8787</source> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -464,7 +592,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -474,42 +602,93 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+11"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished">Γράψε ένα μήνυμα...</translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished">Άκυρο</translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished">Αποδοχή</translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -518,6 +697,24 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -594,9 +791,17 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -656,7 +861,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation>Αποδοχή</translation> </message> @@ -697,30 +902,48 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation type="unfinished"></translation> </message> @@ -741,7 +964,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation>Διάλεξε ένα αρχείο</translation> </message> @@ -751,7 +974,7 @@ Example: https://server.my:8787</source> <translation>Όλα τα αρχεία (*)</translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation type="unfinished"></translation> </message> @@ -769,20 +992,19 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation type="unfinished"></translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation type="unfinished">Αποθήκευση Εικόνας</translation> </message> @@ -921,12 +1143,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation type="unfinished"></translation> </message> @@ -950,17 +1172,17 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation type="unfinished"></translation> </message> @@ -968,63 +1190,74 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1034,25 +1267,20 @@ Example: https://server.my:8787</source> <translation type="unfinished">Προσκάλεσε χρήστες</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> <translation type="unfinished">Μέλη</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> <translation type="unfinished">Βγές</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <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> @@ -1111,9 +1339,32 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation>Ελαχιστοποίηση</translation> </message> @@ -1133,12 +1384,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation type="unfinished"></translation> </message> @@ -1276,7 +1532,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation type="unfinished"></translation> </message> @@ -1321,7 +1587,7 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation type="unfinished"></translation> </message> @@ -1341,22 +1607,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation>ΓΕΝΙΚΑ</translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation type="unfinished"></translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation type="unfinished"></translation> </message> @@ -1403,6 +1679,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished">Άκυρο</translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_en.ts b/resources/langs/nheko_en.ts
index bfbbd987..12e030b1 100644 --- a/resources/langs/nheko_en.ts +++ b/resources/langs/nheko_en.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="en"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation>Initiating…</translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation>Calling…</translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation>Connecting…</translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation>Unmute Mic</translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation>Mute Mic</translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation>Awaiting Confirmation</translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation>Waiting for other side to complete verification.</translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation>Cancel</translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation>You joined this room.</translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation>Failed to invite user: %1</translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation>Invited user: %1</translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <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="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation>Room %1 created.</translation> </message> @@ -108,12 +154,12 @@ <translation>Unbanned user: %1</translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation>Failed to upload media. Please try again.</translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation>Cache migration failed!</translation> </message> @@ -128,7 +174,7 @@ <translation>The cache on your disk is newer than this version of Nheko supports. Please update or clear your cache.</translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation>Failed to restore OLM account. Please login again.</translation> </message> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation>Please try to login again: %1</translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation>Failed to join room: %1</translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation>Verification Code</translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation>They do not match!</translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation>They match!</translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation>Search</translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation>People</translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation>Verification Code</translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation>They do not match!</translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation>They match!</translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation>Encrypted</translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation>Verification failed</translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation>Other client does not support our verification protocol.</translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation>Key mismatch detected!</translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation>Device verification timed out.</translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation>Other party canceled the verification.</translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation>Close</translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -447,18 +575,18 @@ Example: https://server.my:8787</translation> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation>redacted</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation>Encryption enabled</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation>room name changed to: %1</translation> </message> @@ -468,7 +596,7 @@ Example: https://server.my:8787</translation> <translation>removed room name</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation>topic changed to: %1</translation> </message> @@ -478,42 +606,93 @@ Example: https://server.my:8787</translation> <translation>removed topic</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation>%1 created and configured room: %2</translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation>%1 placed a voice call.</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation>%1 placed a video call.</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation>%1 placed a call.</translation> </message> <message> - <location line="+19"/> + <location line="+29"/> <source>Negotiating call...</source> <translation>Negotiating call…</translation> </message> <message> - <location line="-12"/> + <location line="-18"/> <source>%1 answered the call.</source> <translation>%1 answered the call.</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation>%1 ended the call.</translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation>Write a message…</translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation>Send Device Verification Request</translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation>Received Device Verification Request</translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation>The device was requested to be verified.</translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation>Cancel</translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation>Deny</translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation>Start verification</translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation>Accept</translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -522,6 +701,24 @@ Example: https://server.my:8787</translation> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation>profile</translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation>profile name</translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -598,9 +795,17 @@ Example: https://server.my:8787</translation> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation>Close</translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation>no version stored</translation> </message> @@ -660,7 +865,7 @@ Example: https://server.my:8787</translation> <translation>Tag:</translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation>Accept</translation> </message> @@ -701,30 +906,48 @@ Example: https://server.my:8787</translation> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation>Failed</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation>Sent</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation>Received</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation>Read</translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation>Successful Verification</translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation>Verification successful! Both sides verified their devices!</translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation>Close</translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation>Send a file</translation> </message> @@ -745,7 +968,7 @@ Example: https://server.my:8787</translation> <translation>Emoji</translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation>Select a file</translation> </message> @@ -755,7 +978,7 @@ Example: https://server.my:8787</translation> <translation>All Files (*)</translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation>Place a call</translation> </message> @@ -773,20 +996,19 @@ Example: https://server.my:8787</translation> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation>Message redaction failed: %1</translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation>Failed to encrypt event, sending aborted!</translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation>Save image</translation> </message> @@ -925,12 +1147,12 @@ Example: https://server.my:8787</translation> <translation>%1 redacted their knock.</translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation>You joined this room.</translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation>Rejected the knock from %1.</translation> </message> @@ -954,17 +1176,17 @@ Example: https://server.my:8787</translation> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation>React</translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation>Reply</translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation>Options</translation> </message> @@ -972,63 +1194,74 @@ Example: https://server.my:8787</translation> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation>React</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation>Reply</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation>Read receipts</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation>Mark as read</translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation>View raw message</translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation>View decrypted raw message</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation>Redact message</translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation>Save as</translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation>No room open</translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation>No shared room with this user found. Create an encrypted room with this user and try again.</translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation>Back to room list</translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation>No room selected</translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation>Room options</translation> </message> @@ -1038,25 +1271,20 @@ Example: https://server.my:8787</translation> <translation>Invite users</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> <translation>Members</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> <translation>Leave room</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Settings</source> <translation>Settings</translation> </message> - <message> - <location line="+253"/> - <source>Close</source> - <translation>Close</translation> - </message> </context> <context> <name>TrayIcon</name> @@ -1115,9 +1343,32 @@ Example: https://server.my:8787</translation> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation>Verify</translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation>Ban the user</translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation>Start a private chat</translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation>Kick the user</translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation>Minimize to tray</translation> </message> @@ -1137,12 +1388,17 @@ Example: https://server.my:8787</translation> <translation>Circular Avatars</translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation>profile: %1</translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation>CALLS</translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation>Keep the application running in the background after closing the client window.</translation> </message> @@ -1288,7 +1544,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation>Make font size larger if messages with only a few emojis are displayed.</translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation>Mobile mode</translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation>Will prevent text selection in the timeline to make scrolling easier.</translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation>Scale factor</translation> </message> @@ -1333,7 +1599,7 @@ This usually causes the application icon in the task bar to animate in some fash <translation>Device Fingerprint</translation> </message> <message> - <location line="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation>Session Keys</translation> </message> @@ -1353,22 +1619,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation>ENCRYPTION</translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation>GENERAL</translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation>INTERFACE</translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation>Emoji Font Family</translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation>Share keys with trusted users</translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation>Automatically replies to key requests from other users, if they are verified.</translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation>Open Sessions File</translation> </message> @@ -1415,6 +1691,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation>Waiting for other party…</translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation>Waiting for other side to accept the verification request…</translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation>Waiting for other side to continue the verification request…</translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation>Waiting for other side to complete the verification request…</translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation>Cancel</translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_eo.ts b/resources/langs/nheko_eo.ts
index fafddab8..4e5a9bc4 100644 --- a/resources/langs/nheko_eo.ts +++ b/resources/langs/nheko_eo.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="eo"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation>Vi aliĝis ĉi tiun ĉambron.</translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <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="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translatorcomment>I believe that the -at ending is correct here.</translatorcomment> <translation>Ĉambro %1 farit.</translation> @@ -109,12 +155,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -129,7 +175,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation type="unfinished"></translation> </message> @@ -145,12 +191,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation type="unfinished"></translation> </message> @@ -211,6 +257,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -236,13 +305,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation>Trovu</translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation>Homoj</translation> </message> @@ -283,9 +352,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation type="unfinished"></translation> </message> @@ -298,25 +390,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -333,6 +427,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -448,18 +576,18 @@ Ekzemplo: https://servisto.mia:8787</translation> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation>Nomo da ĉambro ŝanĝiĝis al: %1</translation> </message> @@ -469,7 +597,7 @@ Ekzemplo: https://servisto.mia:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -479,42 +607,93 @@ Ekzemplo: https://servisto.mia:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+11"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished">Skribu mesaĝon...</translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -523,6 +702,24 @@ Ekzemplo: https://servisto.mia:8787</translation> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -570,7 +767,7 @@ Ekzemplo: https://servisto.mia:8787</translation> <message> <location line="+17"/> <source>REGISTER</source> - <translation type="unfinished"></translation> + <translation type="unfinished">REGISTRU</translation> </message> <message> <location line="+55"/> @@ -599,9 +796,17 @@ Ekzemplo: https://servisto.mia:8787</translation> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -662,7 +867,7 @@ Ekzemplo: https://servisto.mia:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation type="unfinished"></translation> </message> @@ -704,31 +909,49 @@ Ekzemplo: https://servisto.mia:8787</translation> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation>Estas malsukcesa</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation>Estas sendita</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation>Estas ricevita</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translatorcomment>Could this simply be &quot;lega&quot;?</translatorcomment> <translation>Estas lega</translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation>Sendu dosieron</translation> </message> @@ -749,7 +972,7 @@ Ekzemplo: https://servisto.mia:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation type="unfinished"></translation> </message> @@ -759,7 +982,7 @@ Ekzemplo: https://servisto.mia:8787</translation> <translation>Ĉiuj dosieroj (*)</translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation type="unfinished"></translation> </message> @@ -777,20 +1000,19 @@ Ekzemplo: https://servisto.mia:8787</translation> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation type="unfinished"></translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation type="unfinished"></translation> </message> @@ -931,12 +1153,12 @@ Ekzemplo: https://servisto.mia:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation>Vi aliĝis ĉi tiun ĉambron.</translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation type="unfinished"></translation> </message> @@ -960,17 +1182,17 @@ Ekzemplo: https://servisto.mia:8787</translation> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation>Reagu</translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation>Respondu</translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation>Ebloj</translation> </message> @@ -978,63 +1200,74 @@ Ekzemplo: https://servisto.mia:8787</translation> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation>Reagu</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation>Respondu</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1044,24 +1277,19 @@ Ekzemplo: https://servisto.mia:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> - <translation>Membroj</translation> + <translation type="unfinished">Membroj</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> - <translation>Forlasu la ĉambron</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> + <location line="+5"/> + <source>Settings</source> + <translation type="unfinished">Agordoj</translation> </message> </context> <context> @@ -1121,9 +1349,32 @@ Ekzemplo: https://servisto.mia:8787</translation> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation type="unfinished"></translation> </message> @@ -1143,12 +1394,17 @@ Ekzemplo: https://servisto.mia:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation type="unfinished"></translation> </message> @@ -1286,7 +1542,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation type="unfinished"></translation> </message> @@ -1331,7 +1597,7 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation type="unfinished"></translation> </message> @@ -1351,22 +1617,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation type="unfinished"></translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation type="unfinished"></translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation type="unfinished"></translation> </message> @@ -1413,6 +1689,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_et.ts b/resources/langs/nheko_et.ts
index f3a51bb9..b1f20985 100644 --- a/resources/langs/nheko_et.ts +++ b/resources/langs/nheko_et.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="et"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation>Sa liitusid selle jututoaga.</translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation>Kutse saatmine kasutajale ei õnnestunud: %1</translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation>Kutsutud kasutaja: %1</translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source> <translation>Puhverdatud andmete muutmine sobivaks rakenduse praeguse versiooniga ei õnnestunud. Sellel võib olla erinevaid põhjuseid. Palun saada meile veateade ja seni kasuta vanemat rakenduse versiooni. Aga kui sa soovid proovida, siis kustuta puhverdatud andmed käsitsi.</translation> </message> <message> - <location line="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation>%1 jututuba on loodud.</translation> </message> @@ -108,12 +154,12 @@ <translation>Suhtluskeeld eemaldatud: %1</translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation>Meediafailide üleslaadimine ei õnnestunud. Palun proovi uuesti.</translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation>Puhvri versiooniuuendus ebaõnnestus!</translation> </message> @@ -128,7 +174,7 @@ <translation>Sinu andmekandjale salvestatud puhvri versioon on uuem, kui käesolev Nheko versioon kasutada oskab. Palun tee Nheko uuendus või kustuta puhverdatud andmed.</translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation>OLM konto taastamine ei õnnestunud. Palun logi uuesti sisse.</translation> </message> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation>Palun proovi uuesti sisse logida: %1</translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation>Jututoaga liitumine ei õnnestunud: %1</translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation>Otsi</translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation>Inimesed</translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation>Krüptitud</translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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>-- Krüptitud sündmus (Dekrüptimisvõtmeid ei leidunud) --</translation> </message> <message> - <location line="+19"/> + <location line="+32"/> + <location line="+62"/> <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>-- Dekrüptimise viga (megolm&apos;i võtmete laadimine andmebaasist ei õnnestunud) --</translation> </message> <message> - <location line="+14"/> + <location line="-48"/> + <location line="+61"/> <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>-- Dekrüptimise viga (%1) --</translation> </message> <message> - <location line="+10"/> + <location line="-51"/> <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>-- Krüptitud sündmus (Tundmatu sündmuse tüüp) --</translation> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation>Sulge</translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -447,18 +575,18 @@ Näiteks: https://server.minu:8787</translation> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation>muudetud</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation>Krüptimine on kasutusel</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation>jututoa uus nimi on: %1</translation> </message> @@ -468,7 +596,7 @@ Näiteks: https://server.minu:8787</translation> <translation>eemaldas jututoa nime</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation>jututoa uus teema on: %1</translation> </message> @@ -478,42 +606,93 @@ Näiteks: https://server.minu:8787</translation> <translation>teema on eemaldatud</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation>%1 lõi ja seadistas jututoa: %2</translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation>%1 helistas.</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation>%1 alustas videokõnet.</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation>%1 helistas.</translation> </message> <message> - <location line="+19"/> + <location line="+29"/> <source>Negotiating call...</source> <translation>Ühendan kõnet…</translation> </message> <message> - <location line="-12"/> + <location line="-18"/> <source>%1 answered the call.</source> <translation>%1 vastas kõnele.</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation>%1 lõpetas kõne.</translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished">Kirjuta sõnum…</translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation>Nõustu</translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -522,6 +701,24 @@ Näiteks: https://server.minu:8787</translation> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -598,9 +795,17 @@ Näiteks: https://server.minu:8787</translation> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished">Sulge</translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation>salvestatud versiooni ei leidu</translation> </message> @@ -660,7 +865,7 @@ Näiteks: https://server.minu:8787</translation> <translation>Silt:</translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation>Nõustu</translation> </message> @@ -701,30 +906,48 @@ Näiteks: https://server.minu:8787</translation> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation>Ebaõnnestus</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation>Saadetud</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation>Vastuvõetud</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation>Loetud</translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation>Sulge</translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation>Saada fail</translation> </message> @@ -745,7 +968,7 @@ Näiteks: https://server.minu:8787</translation> <translation>Emoji</translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation>Vali fail</translation> </message> @@ -755,7 +978,7 @@ Näiteks: https://server.minu:8787</translation> <translation>Kõik failid (*)</translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation>Helista</translation> </message> @@ -773,20 +996,19 @@ Näiteks: https://server.minu:8787</translation> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation>Sõnumi ümbersõnastamine ebaõnnestus: %1</translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation>Sündmuse krüptimine ei õnnestunud, katkestame saatmise!</translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation>Salvesta pilt</translation> </message> @@ -925,12 +1147,12 @@ Näiteks: https://server.minu:8787</translation> <translation>%1 muutis oma koputust jututoa uksele.</translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation>Sa liitusid jututoaga.</translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation>Lükkas tagasi %1 koputuse jututoa uksele.</translation> </message> @@ -954,17 +1176,17 @@ Näiteks: https://server.minu:8787</translation> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation>Reageeri</translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation>Vasta</translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation>Valikud</translation> </message> @@ -972,90 +1194,96 @@ Näiteks: https://server.minu:8787</translation> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation>Reageeri</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation>Vasta</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation>Lugemisteatised</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation>Märgi loetuks</translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation>Näita sõnumi lähtekoodi</translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation>Näita sõnumi dekrüptitud lähtekoodi</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation>Muuda sõnumit</translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation>Salvesta kui</translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation>Ühtegi jututuba pole avatud</translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> - <translation>Tagasi jututubade loendisse</translation> + <translation type="unfinished">Tagasi jututubade loendisse</translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> - <translation>Jututuba on valimata</translation> + <translation type="unfinished">Jututuba on valimata</translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> - <translation>Jututoa valikud</translation> + <translation type="unfinished">Jututoa valikud</translation> </message> <message> <location line="+7"/> <source>Invite users</source> - <translation>Kutsu kasutajaid</translation> + <translation type="unfinished">Kutsu kasutajaid</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> - <translation>Liikmed</translation> + <translation type="unfinished">Liikmed</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> - <translation>Lahku jututoast</translation> + <translation type="unfinished">Lahku jututoast</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Settings</source> - <translation>Seadistused</translation> - </message> - <message> - <location line="+253"/> - <source>Close</source> - <translation>Sulge</translation> + <translation type="unfinished">Seadistused</translation> </message> </context> <context> @@ -1115,9 +1343,32 @@ Näiteks: https://server.minu:8787</translation> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation>Vähenda tegumiribale</translation> </message> @@ -1137,12 +1388,17 @@ Näiteks: https://server.minu:8787</translation> <translation>Ümmargused tunnuspildid</translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation>KÕNED</translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation>Peale akna sulgemist jäta rakendus taustal tööle.</translation> </message> @@ -1288,7 +1544,17 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim <translation>Tee sõnumi font suuremaks, kui sõnumis on vaid mõned emojid.</translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation>Mastaabitegur</translation> </message> @@ -1333,7 +1599,7 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim <translation>Seadme sõrmejälg</translation> </message> <message> - <location line="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation>Sessioonivõtmed</translation> </message> @@ -1353,22 +1619,32 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim <translation>KRÜPTIMINE</translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation>ÜLDISED SEADISTUSED</translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation>LIIDES</translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation>Fondiperekond emojide jaoks</translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation>Ava sessioonide fail</translation> </message> @@ -1415,6 +1691,34 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation>Tühista</translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_fi.ts b/resources/langs/nheko_fi.ts
index 192c07b2..bc44634c 100644 --- a/resources/langs/nheko_fi.ts +++ b/resources/langs/nheko_fi.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="fi"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished">Peruuta</translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <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="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation type="unfinished"></translation> </message> @@ -108,12 +154,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -128,7 +174,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <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> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation>Ole hyvä ja yritä kirjautua sisään uudelleen: %1</translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation type="unfinished"></translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation type="unfinished"></translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished">Sulje</translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -443,18 +571,18 @@ Example: https://server.my:8787</source> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -464,7 +592,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -474,42 +602,93 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+11"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished">Kirjoita viesti…</translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished">Peruuta</translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished">Hyväksy</translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -518,6 +697,24 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -594,9 +791,17 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished">Sulje</translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation>ei tallennettua versiota</translation> </message> @@ -656,7 +861,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation>Hyväksy</translation> </message> @@ -697,30 +902,48 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished">Sulje</translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation>Lähetä tiedosto</translation> </message> @@ -741,7 +964,7 @@ Example: https://server.my:8787</source> <translation>Emoji</translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation>Valitse tiedosto</translation> </message> @@ -751,7 +974,7 @@ Example: https://server.my:8787</source> <translation>Kaikki tiedostot (*)</translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation type="unfinished"></translation> </message> @@ -769,20 +992,19 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation type="unfinished">Viestin poisto epäonnistui: %1</translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation type="unfinished"></translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation type="unfinished">Tallenna kuva</translation> </message> @@ -921,12 +1143,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation type="unfinished"></translation> </message> @@ -950,17 +1172,17 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation type="unfinished"></translation> </message> @@ -968,63 +1190,74 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation type="unfinished">Lukukuittaukset</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation type="unfinished">Huonevaihtoehdot</translation> </message> @@ -1034,25 +1267,20 @@ Example: https://server.my:8787</source> <translation type="unfinished">Kutsu käyttäjiä</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> <translation type="unfinished">Jäsenet</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> <translation type="unfinished">Poistu huoneesta</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <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>TrayIcon</name> @@ -1111,9 +1339,32 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation>Pienennä ilmoitusalueelle</translation> </message> @@ -1133,12 +1384,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation type="unfinished"></translation> </message> @@ -1276,7 +1532,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation>Mittakerroin</translation> </message> @@ -1321,7 +1587,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="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation>Istunnon avaimet</translation> </message> @@ -1341,22 +1607,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation>SALAUS</translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation>YLEISET ASETUKSET</translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation type="unfinished"></translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation>Avaa Istuntoavaintiedosto</translation> </message> @@ -1403,6 +1679,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished">Peruuta</translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_fr.ts b/resources/langs/nheko_fr.ts
index 48047e32..f8f8380b 100644 --- a/resources/langs/nheko_fr.ts +++ b/resources/langs/nheko_fr.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="fr"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished">Annuler</translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation>Vous avez rejoint ce salon.</translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation>Échec lors de l&apos;invitation de %1</translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation>%1 a été invité(e)</translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <source>Migrating the cache to the current version failed. This can have different reasons. Please open an issue and try to use an older version in the mean time. Alternatively you can try deleting the cache manually.</source> <translation>La migration du cache vers la version actuelle a échoué. Cela peut arriver pour différentes raisons. Signalez le problème et essayez d&apos;utiliser une ancienne version en attendant. Vous pouvez également supprimer le cache manuellement.</translation> </message> <message> - <location line="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation>Salon %1 créé.</translation> </message> @@ -40,12 +86,12 @@ <message> <location line="+1"/> <source>Do you really want to invite %1 (%2)?</source> - <translation>Voulez-vous vraiment inviter %1 (%2) ?</translation> + <translation>Voulez-vous vraiment inviter %1 (%2)&#x202f;?</translation> </message> <message> <location line="+11"/> <source>Failed to invite %1 to %2: %3</source> - <translation>Échec de l&apos;invitation de %1 dans %2 : %3</translation> + <translation>Échec de l&apos;invitation de %1 dans %2&#xa0;: %3</translation> </message> <message> <location line="+15"/> @@ -55,7 +101,7 @@ <message> <location line="+1"/> <source>Do you really want to kick %1 (%2)?</source> - <translation>Voulez-vous vraiment expulser %1 (%2) ?</translation> + <translation>Voulez-vous vraiment expulser %1 (%2)&#x202f;?</translation> </message> <message> <location line="+11"/> @@ -75,7 +121,7 @@ <message> <location line="+1"/> <source>Do you really want to ban %1 (%2)?</source> - <translation>Voulez-vous vraiment bannir %1 (%2) ?</translation> + <translation>Voulez-vous vraiment bannir %1 (%2)&#x202f;?</translation> </message> <message> <location line="+11"/> @@ -95,12 +141,12 @@ <message> <location line="+1"/> <source>Do you really want to unban %1 (%2)?</source> - <translation>Voulez-vous vraiment annuler le bannissement de %1 (%2) ?</translation> + <translation>Voulez-vous vraiment annuler le bannissement de %1 (%2)&#x202f;?</translation> </message> <message> <location line="+11"/> <source>Failed to unban %1 in %2: %3</source> - <translation>Échec de l&apos;annulation du bannissement de %1 dans %2 : %3</translation> + <translation>Échec de l&apos;annulation du bannissement de %1 dans %2&#xa0;: %3</translation> </message> <message> <location line="+5"/> @@ -108,14 +154,14 @@ <translation>%1 n&apos;est plus banni(e)</translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation>Échec de l&apos;envoi du média. Veuillez réessayer.</translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> - <translation>Échec de la migration du cache !</translation> + <translation>Échec de la migration du cache&#x202f;!</translation> </message> <message> <location line="+13"/> @@ -128,7 +174,7 @@ <translation>Le cache sur votre disque est plus récent que cette version de Nheko ne supporte. Veuillez mettre à jour ou supprimer votre cache.</translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation>Échec de la restauration du compte OLM. Veuillez vous reconnecter.</translation> </message> @@ -140,18 +186,18 @@ <message> <location line="+165"/> <source>Failed to setup encryption keys. Server response: %1 %2. Please try again later.</source> - <translation>Échec de la configuration des clés de chiffrement. Réponse du serveur : %1 %2. Veuillez réessayer plus tard.</translation> + <translation>Échec de la configuration des clés de chiffrement. Réponse du serveur&#xa0;: %1 %2. Veuillez réessayer plus tard.</translation> </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> - <translation>Veuillez vous reconnecter : %1</translation> + <translation>Veuillez vous reconnecter&#xa0;: %1</translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> - <translation>Impossible de rejoindre le salon : %1</translation> + <translation>Impossible de rejoindre le salon&#xa0;: %1</translation> </message> <message> <location line="+5"/> @@ -161,17 +207,17 @@ <message> <location line="+6"/> <source>Failed to remove invite: %1</source> - <translation>Impossible de supprimer l&apos;invitation : %1</translation> + <translation>Impossible de supprimer l&apos;invitation&#x202f;: %1</translation> </message> <message> <location line="+19"/> <source>Room creation failed: %1</source> - <translation>Échec de la création du salon : %1</translation> + <translation>Échec de la création du salon&#xa0;: %1</translation> </message> <message> <location line="+16"/> <source>Failed to leave room: %1</source> - <translation>Impossible de quitter le salon : %1</translation> + <translation>Impossible de quitter le salon&#xa0;: %1</translation> </message> </context> <context> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation>Chercher</translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation>Personnes</translation> </message> @@ -282,40 +351,65 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation>Chiffré</translation> </message> <message> <location line="+2"/> <source>This message is not encrypted!</source> - <translation>Ce message n&apos;est pas chiffré !</translation> + <translation>Ce message n&apos;est pas chiffré&#x202f;!</translation> </message> </context> <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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>-- Évènement chiffré (pas de clé trouvé pour le déchiffrement) --</translation> </message> <message> - <location line="+19"/> + <location line="+32"/> + <location line="+62"/> <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>-- Échec du déchiffrement (échec de la récupération des clés megolm depuis la base de données) --</translation> </message> <message> - <location line="+14"/> + <location line="-48"/> + <location line="+61"/> <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>-- Erreur de déchiffrement (%1) --</translation> </message> <message> - <location line="+10"/> + <location line="-51"/> <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>-- Évènement chiffré (type d&apos;évènement inconnu) --</translation> @@ -323,12 +417,46 @@ <message> <location line="+13"/> <source>-- Replay attack! This message index was reused! --</source> - <translation>-- Attaque par rejeu (replay attack) ! Cet index de message a été réutilisé ! --</translation> + <translation>-- Attaque par rejeu (replay attack)&#x202f;! Cet index de message a été réutilisé&#x202f;! --</translation> </message> <message> <location line="+7"/> <source>-- Message by unverified device! --</source> - <translation>-- Message d&apos;un appareil non vérifié  --</translation> + <translation>-- Message d&apos;un appareil non vérifié&#x202f; --</translation> + </message> +</context> +<context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished">Fermer</translation> </message> </context> <context> @@ -357,9 +485,9 @@ You can also put your homeserver address there, if your server doesn&apos;t support .well-known lookup. Example: @user:server.my If Nheko fails to discover your homeserver, it will show you a field to enter the server manually.</source> - <translation>Votre nom de connexion. Un mxid doit commencer par un « @ » suivi de l&apos;identifiant. L&apos;identifiant doit être suivi du nom de serveur, séparé de celui-ci par « : ». + <translation>Votre nom de connexion. Un mxid doit commencer par un «&#x202f;@&#x202f;» suivi de l&apos;identifiant. L&apos;identifiant doit être suivi du nom de serveur, séparé de celui-ci par «&#x202f;:&#x202f;». Vous pouvez également spécifier l&apos;adresse de votre serveur ici, si votre serveur ne supporte pas l&apos;identification .well-known. -Exemple : @utilisateur :monserveur.example.com +Exemple&#x202f;: @utilisateur&#x202f;:monserveur.example.com Si Nheko n&apos;arrive pas à trouver votre serveur, il vous proposera de l&apos;indiquer manuellement.</translation> </message> <message> @@ -382,7 +510,7 @@ Si Nheko n&apos;arrive pas à trouver votre serveur, il vous proposera de l&apos <source>The address that can be used to contact you homeservers client API. Example: https://server.my:8787</source> <translation>L&apos;adresse qui peut être utilisée pour joindre l&apos;API client de votre serveur. -Exemple : https ://monserveur.example.com :8787</translation> +Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> </message> <message> <location line="+16"/> @@ -447,20 +575,20 @@ Exemple : https ://monserveur.example.com :8787</translation> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation>effacé</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation>Chiffrement activé</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> - <translation>nom du salon changé en : %1</translation> + <translation>nom du salon changé en&#xa0;: %1</translation> </message> <message> <location line="+0"/> @@ -468,9 +596,9 @@ Exemple : https ://monserveur.example.com :8787</translation> <translation>nom du salon retiré</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> - <translation>sujet changé pour : %1</translation> + <translation>sujet changé pour&#xa0;: %1</translation> </message> <message> <location line="+0"/> @@ -478,47 +606,116 @@ Exemple : https ://monserveur.example.com :8787</translation> <translation>sujet retiré</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> - <translation>%1 a créé et configuré le salon : %2</translation> + <translation>%1 a créé et configuré le salon&#xa0;: %2</translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation>%1 a effectué un appel vocal.</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation>%1 a effectué un appel vidéo.</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation>%1 a appelé.</translation> </message> <message> - <location line="+7"/> + <location line="+11"/> <source>%1 answered the call.</source> <translation>%1 a répondu à l&apos;appel.</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation>1% a terminé l&apos;appel.</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Negotiating call...</source> <translation>Négociation de l&apos;appel…</translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished">Écrivez un message…</translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished">Annuler</translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished">Accepter</translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> <source>unimplemented event: </source> - <translation>Évènement non implémenté : </translation> + <translation>Évènement non implémenté&#xa0;: </translation> + </message> +</context> +<context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -539,7 +736,7 @@ Exemple : https ://monserveur.example.com :8787</translation> <message> <location line="+3"/> <source>The username must not be empty, and must contain only the characters a-z, 0-9, ., _, =, -, and /.</source> - <translation>Le nom d&apos;utilisateur ne doit pas être vide, et ne peut contenir que les caractères a à z, 0 à 9, et « . _ = - / ».</translation> + <translation>Le nom d&apos;utilisateur ne doit pas être vide, et ne peut contenir que les caractères a à z, 0 à 9, et «&#x202f;. _ = - /&#x202f;».</translation> </message> <message> <location line="+4"/> @@ -574,7 +771,7 @@ Exemple : https ://monserveur.example.com :8787</translation> <message> <location line="+55"/> <source>No supported registration flows!</source> - <translation>Pas de méthode d&apos;inscription supportée !</translation> + <translation>Pas de méthode d&apos;inscription supportée&#xa0;!</translation> </message> <message> <location line="+135"/> @@ -598,9 +795,17 @@ Exemple : https ://monserveur.example.com :8787</translation> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished">Fermer</translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation>pas de version enregistrée</translation> </message> @@ -615,7 +820,7 @@ Exemple : https ://monserveur.example.com :8787</translation> <message> <location line="+7"/> <source>Tag room as:</source> - <translation>Étiqueter le salon comme :</translation> + <translation>Étiqueter le salon comme&#xa0;:</translation> </message> <message> <location line="+18"/> @@ -657,10 +862,10 @@ Exemple : https ://monserveur.example.com :8787</translation> <location line="+1"/> <source>Tag:</source> <comment>Tag name prompt</comment> - <translation>Étiquette :</translation> + <translation>Étiquette&#xa0;:</translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation>Accepter</translation> </message> @@ -701,30 +906,48 @@ Exemple : https ://monserveur.example.com :8787</translation> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation>Échec</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation>Envoyé</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation>Reçu</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation>Lu</translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished">Fermer</translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation>Envoyer un fichier</translation> </message> @@ -745,7 +968,7 @@ Exemple : https ://monserveur.example.com :8787</translation> <translation>Emoji</translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation>Sélectionnez un fichier</translation> </message> @@ -755,7 +978,7 @@ Exemple : https ://monserveur.example.com :8787</translation> <translation>Tous les types de fichiers (*)</translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation>Appeler</translation> </message> @@ -773,20 +996,19 @@ Exemple : https ://monserveur.example.com :8787</translation> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> - <translation>Échec de la suppression du message : %1</translation> + <translation>Échec de la suppression du message&#xa0;: %1</translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> - <translation>Échec du chiffrement de l&apos;évènement, envoi abandonné !</translation> + <translation>Échec du chiffrement de l&apos;évènement, envoi abandonné&#x202f;!</translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation>Enregistrer l&apos;image</translation> </message> @@ -925,12 +1147,12 @@ Exemple : https ://monserveur.example.com :8787</translation> <translation>%1 ne frappe plus au salon.</translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation>Vous avez rejoint ce salon.</translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation>%1 a été rejeté après avoir frappé au salon.</translation> </message> @@ -938,12 +1160,12 @@ Exemple : https ://monserveur.example.com :8787</translation> <location line="+2"/> <source>%1 left after having already left!</source> <comment>This is a leave event after the user already left and shouldn&apos;t happen apart from state resets</comment> - <translation>%1 a quitté le salon après l&apos;avoir déjà quitté !</translation> + <translation>%1 a quitté le salon après l&apos;avoir déjà quitté&#x202f;!</translation> </message> <message> <location line="+15"/> <source> Reason: %1</source> - <translation>Raison : %1</translation> + <translation>Raison&#xa0;: %1</translation> </message> <message> <location line="-5"/> @@ -954,17 +1176,17 @@ Exemple : https ://monserveur.example.com :8787</translation> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation>Réagir</translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation>Répondre</translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation>Options</translation> </message> @@ -972,90 +1194,96 @@ Exemple : https ://monserveur.example.com :8787</translation> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation>Réagir</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation>Réponse</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation>Accusés de lecture</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation>Marquer comme lu</translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation>Voir le message brut</translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation>Voir le message déchiffré brut</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation>Effacer le message</translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation>Enregistrer sous</translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation>Aucun salon ouvert</translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> - <translation>Revenir à la liste des salons</translation> + <translation type="unfinished">Revenir à la liste des salons</translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> - <translation>Pas de salon sélectionné</translation> + <translation type="unfinished">Pas de salon sélectionné</translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> - <translation>Options du salon</translation> + <translation type="unfinished">Options du salon</translation> </message> <message> <location line="+7"/> <source>Invite users</source> - <translation>Inviter des utilisateurs</translation> + <translation type="unfinished">Inviter des utilisateurs</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> - <translation>Membres</translation> + <translation type="unfinished">Membres</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> - <translation>Quitter le salon</translation> + <translation type="unfinished">Quitter le salon</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Settings</source> - <translation>Paramètres</translation> - </message> - <message> - <location line="+253"/> - <source>Close</source> - <translation>Fermer</translation> + <translation type="unfinished">Paramètres</translation> </message> </context> <context> @@ -1091,7 +1319,7 @@ Exemple : https ://monserveur.example.com :8787</translation> <message> <location line="+1"/> <source>Status:</source> - <translation>Statut :</translation> + <translation>Statut&#xa0;:</translation> </message> <message> <location line="+9"/> @@ -1115,9 +1343,32 @@ Exemple : https ://monserveur.example.com :8787</translation> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation>Réduire à la barre des tâches</translation> </message> @@ -1137,12 +1388,17 @@ Exemple : https ://monserveur.example.com :8787</translation> <translation>Avatars circulaires</translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation>APPELS</translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation>Conserver l&apos;application en arrière plan après la fermeture de la fenêtre du client.</translation> </message> @@ -1289,7 +1545,17 @@ Cela met l&apos;application en évidence dans la barre des tâches.</translation <translation>Augmente la taille de la police lors de l&apos;affichage de messages contenant uniquement quelques emojis.</translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation>Facteur d&apos;échelle</translation> </message> @@ -1334,7 +1600,7 @@ Cela met l&apos;application en évidence dans la barre des tâches.</translation <translation>Empreinte de l&apos;appareil</translation> </message> <message> - <location line="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation>Clés de session</translation> </message> @@ -1354,22 +1620,32 @@ Cela met l&apos;application en évidence dans la barre des tâches.</translation <translation>CHIFFREMENT</translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation>GÉNÉRAL</translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation>INTERFACE</translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation>Nom de Police Emoji</translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation>Ouvrir fichier de sessions</translation> </message> @@ -1396,7 +1672,7 @@ Cela met l&apos;application en évidence dans la barre des tâches.</translation <message> <location line="-31"/> <source>Enter the passphrase to decrypt the file:</source> - <translation>Entrez la clé secrète pour déchiffrer le fichier  :</translation> + <translation>Entrez la clé secrète pour déchiffrer le fichier&#xa0;&#xa0;:</translation> </message> <message> <location line="+8"/> @@ -1407,7 +1683,7 @@ Cela met l&apos;application en évidence dans la barre des tâches.</translation <message> <location line="-8"/> <source>Enter passphrase to encrypt your session keys:</source> - <translation>Entrez une clé secrète pour chiffrer vos clés de session  :</translation> + <translation>Entrez une clé secrète pour chiffrer vos clés de session&#xa0;&#xa0;:</translation> </message> <message> <location line="+15"/> @@ -1416,6 +1692,34 @@ Cela met l&apos;application en évidence dans la barre des tâches.</translation </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished">Annuler</translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> @@ -1765,7 +2069,7 @@ attendant que la vérification des appareils soit opérationnelle.</translation> <message> <location line="+140"/> <source>Failed to enable encryption: %1</source> - <translation>Échec de l&apos;activation du chiffrement  : %1</translation> + <translation>Échec de l&apos;activation du chiffrement&#xa0;&#xa0;: %1</translation> </message> <message> <location line="+147"/> @@ -1785,13 +2089,13 @@ attendant que la vérification des appareils soit opérationnelle.</translation> <message> <location line="+5"/> <source>Error while reading file: %1</source> - <translation>Erreur lors de la lecture du fichier  : %1</translation> + <translation>Erreur lors de la lecture du fichier&#xa0;&#xa0;: %1</translation> </message> <message> <location line="+35"/> <location line="+20"/> <source>Failed to upload image: %s</source> - <translation>Échec de l&apos;envoi de l&apos;image  : %s</translation> + <translation>Échec de l&apos;envoi de l&apos;image&#xa0;&#xa0;: %s</translation> </message> </context> <context> @@ -1824,7 +2128,7 @@ attendant que la vérification des appareils soit opérationnelle.</translation> <message> <location line="+1"/> <source>Do you really want to invite %1 (%2) to a direct chat?</source> - <translation>Voulez-vous vraiment inviter %1 (%2) dans un chat privé  ?</translation> + <translation>Voulez-vous vraiment inviter %1 (%2) dans un chat privé&#x202f;&#x202f;?</translation> </message> <message> <location line="+54"/> @@ -1940,12 +2244,12 @@ attendant que la vérification des appareils soit opérationnelle.</translation> <message> <location line="+5"/> <source>You: %1</source> - <translation>Vous  : %1</translation> + <translation>Vous&#xa0;&#xa0;: %1</translation> </message> <message> <location line="+3"/> <source>%1: %2</source> - <translation>%1  : %2</translation> + <translation>%1&#xa0;&#xa0;: %2</translation> </message> <message> <location line="+7"/> diff --git a/resources/langs/nheko_it.ts b/resources/langs/nheko_it.ts
index 4b9c32d4..b8efa774 100644 --- a/resources/langs/nheko_it.ts +++ b/resources/langs/nheko_it.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="it"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished">Annulla</translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation>Sei entrato in questa stanza.</translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation>Impossibile invitare l&apos;utente: %1</translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation>Invitato utente: %1</translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <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="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation>Stanza %1 creata.</translation> </message> @@ -108,12 +154,12 @@ <translation>Rimosso il ban dall&apos;utente: %1</translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation>Impossibile inviare il file multimediale. Per favore riprova.</translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation>Migrazione della cache fallita!</translation> </message> @@ -128,7 +174,7 @@ <translation>La cache sul tuo disco è più nuova di quella supportata da questa versione di Nheko. Per favore aggiorna o pulisci la tua cache.</translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation>Impossibile ripristinare l&apos;account OLM. Per favore accedi nuovamente.</translation> </message> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation>Per favore prova ad accedere nuovamente: %1</translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation>Impossibile accedere alla stanza: %1</translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation>Criptato</translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished">Chiudi</translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -447,18 +575,18 @@ Esempio: https://server.mio:8787</translation> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation>oscurato</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation>Crittografia abilitata</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation>nome della stanza cambiato in: %1</translation> </message> @@ -468,7 +596,7 @@ Esempio: https://server.mio:8787</translation> <translation>nome della stanza rimosso</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation>argomento cambiato in: %1</translation> </message> @@ -478,42 +606,93 @@ Esempio: https://server.mio:8787</translation> <translation>argomento rimosso</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation>%1 creato e configurata stanza: %2</translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+11"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished">Scrivi un messaggio…</translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished">Annulla</translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished">Accetta</translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -522,6 +701,24 @@ Esempio: https://server.mio:8787</translation> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -598,9 +795,17 @@ Esempio: https://server.mio:8787</translation> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished">Chiudi</translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation>nessuna versione memorizzata</translation> </message> @@ -660,7 +865,7 @@ Esempio: https://server.mio:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation>Accetta</translation> </message> @@ -701,30 +906,48 @@ Esempio: https://server.mio:8787</translation> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation>Fallito</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation>Inviato</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation>Ricevuto</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation>Letto</translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished">Chiudi</translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation>Invia un file</translation> </message> @@ -745,7 +968,7 @@ Esempio: https://server.mio:8787</translation> <translation>Emoji</translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation>Seleziona un file</translation> </message> @@ -755,7 +978,7 @@ Esempio: https://server.mio:8787</translation> <translation>Tutti i file (*)</translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation type="unfinished"></translation> </message> @@ -773,20 +996,19 @@ Esempio: https://server.mio:8787</translation> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation>Oscuramento del messaggio fallito: %1</translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation type="unfinished"></translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation>Salva immagine</translation> </message> @@ -925,12 +1147,12 @@ Esempio: https://server.mio:8787</translation> <translation>%1 ha oscurato la sua bussata.</translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation>Sei entrato in questa stanza.</translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation>Rifiutata la bussata di %1.</translation> </message> @@ -954,17 +1176,17 @@ Esempio: https://server.mio:8787</translation> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation>Rispondi</translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation>Opzioni</translation> </message> @@ -972,63 +1194,74 @@ Esempio: https://server.mio:8787</translation> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation>Risposta</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation>Leggi le ricevute</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation>Segna come letto</translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation>Mostra il messaggio grezzo</translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation>Mostra il messaggio grezzo decriptato</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation>Oscura messaggio</translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation>Salva come</translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation>Nessuna stanza aperta</translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation type="unfinished">Opzioni della stanza</translation> </message> @@ -1038,25 +1271,20 @@ Esempio: https://server.mio:8787</translation> <translation type="unfinished">Invita utenti</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> <translation type="unfinished">Membri</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> <translation type="unfinished">Lascia la stanza</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Settings</source> <translation type="unfinished">Impostazioni</translation> </message> - <message> - <location line="+253"/> - <source>Close</source> - <translation>Chiudi</translation> - </message> </context> <context> <name>TrayIcon</name> @@ -1115,9 +1343,32 @@ Esempio: https://server.mio:8787</translation> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation>Minimizza nella tray</translation> </message> @@ -1137,12 +1388,17 @@ Esempio: https://server.mio:8787</translation> <translation>Avatar Circolari</translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation type="unfinished"></translation> </message> @@ -1280,7 +1536,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation>Fattore di scala</translation> </message> @@ -1325,7 +1591,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="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation>Chiavi di Sessione</translation> </message> @@ -1345,22 +1611,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation>CRITTOGRAFIA</translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation>GENERALE</translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation>INTERFACCIA</translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation>Famiglia dei caratteri delle Emoji</translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation>Apri File delle Sessioni</translation> </message> @@ -1407,6 +1683,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished">Annulla</translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_ja.ts b/resources/langs/nheko_ja.ts
index 79fdd9a4..26d6188c 100644 --- a/resources/langs/nheko_ja.ts +++ b/resources/langs/nheko_ja.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="ja_JP"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished">キャンセル</translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation>ユーザーを招待できませんでした: %1</translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation>招待されたユーザー: %1</translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <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="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation type="unfinished"></translation> </message> @@ -108,12 +154,12 @@ <translation>永久追放を解除されたユーザー: %1</translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation>メディアをアップロードできませんでした。やり直して下さい。</translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -128,7 +174,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation>OLMアカウントを復元できませんでした。もう一度ログインして下さい。</translation> </message> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation>もう一度ログインしてみて下さい: %1</translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation>部屋に参加できませんでした: %1</translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation>暗号化されています</translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished">閉じる</translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -443,18 +571,18 @@ Example: https://server.my:8787</source> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation>編集済み</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation>暗号化が有効です</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation>部屋名が変更されました: %1</translation> </message> @@ -464,7 +592,7 @@ Example: https://server.my:8787</source> <translation>部屋名が削除されました</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation>話題が変更されました: %1</translation> </message> @@ -474,42 +602,93 @@ Example: https://server.my:8787</source> <translation>話題が削除されました</translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+11"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished">メッセージを書く...</translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished">キャンセル</translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished">容認</translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -518,6 +697,24 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -594,9 +791,17 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished">閉じる</translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation>バージョンが保存されていません</translation> </message> @@ -656,7 +861,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation>容認</translation> </message> @@ -697,30 +902,48 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation>失敗</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation>送信済み</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation>受信済み</translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation>既読</translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished">閉じる</translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation>ファイルを送信</translation> </message> @@ -741,7 +964,7 @@ Example: https://server.my:8787</source> <translation>絵文字</translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation>ファイルを選択</translation> </message> @@ -751,7 +974,7 @@ Example: https://server.my:8787</source> <translation>全てのファイル (*)</translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation type="unfinished"></translation> </message> @@ -769,20 +992,19 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation>メッセージを編集できませんでした: %1</translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation type="unfinished"></translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation>画像を保存</translation> </message> @@ -920,12 +1142,12 @@ Example: https://server.my:8787</source> <translation>%1がノックを編集しました。</translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation>%1からのノックを拒否しました。</translation> </message> @@ -949,17 +1171,17 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation>返信</translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation>オプション</translation> </message> @@ -967,63 +1189,74 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation type="unfinished">返信</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation>開封確認</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation>既読にする</translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation>ソースを見る</translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation>メッセージを編集</translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation>名前を付けて保存</translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation>部屋が開いていません</translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation type="unfinished">部屋のオプション</translation> </message> @@ -1033,25 +1266,20 @@ Example: https://server.my:8787</source> <translation type="unfinished">ユーザーを招待</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> <translation type="unfinished">メンバー</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> <translation type="unfinished">部屋を出る</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Settings</source> <translation type="unfinished">設定</translation> </message> - <message> - <location line="+253"/> - <source>Close</source> - <translation>閉じる</translation> - </message> </context> <context> <name>TrayIcon</name> @@ -1110,9 +1338,32 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation>トレイへ最小化</translation> </message> @@ -1132,12 +1383,17 @@ Example: https://server.my:8787</source> <translation>円形アバター</translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation type="unfinished"></translation> </message> @@ -1275,7 +1531,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation>尺度係数</translation> </message> @@ -1320,7 +1586,7 @@ This usually causes the application icon in the task bar to animate in some fash <translation>デバイスの指紋</translation> </message> <message> - <location line="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation>セッション鍵</translation> </message> @@ -1340,22 +1606,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation>暗号化</translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation>全般</translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation type="unfinished"></translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation>セッションファイルを開く</translation> </message> @@ -1402,6 +1678,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished">キャンセル</translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_nl.ts b/resources/langs/nheko_nl.ts
index e957c578..d6d91c3e 100644 --- a/resources/langs/nheko_nl.ts +++ b/resources/langs/nheko_nl.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="nl_NL"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished">Annuleren</translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <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="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation type="unfinished"></translation> </message> @@ -108,12 +154,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -128,7 +174,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation type="unfinished"></translation> </message> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation type="unfinished"></translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation type="unfinished"></translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -443,18 +571,18 @@ Example: https://server.my:8787</source> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -464,7 +592,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -474,42 +602,93 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+11"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished">Typ een bericht...</translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished">Annuleren</translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished">Accepteren</translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -518,6 +697,24 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -594,9 +791,17 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -656,7 +861,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation>Accepteren</translation> </message> @@ -697,30 +902,48 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation type="unfinished"></translation> </message> @@ -741,7 +964,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation>Kies een bestand</translation> </message> @@ -751,7 +974,7 @@ Example: https://server.my:8787</source> <translation>Alle bestanden (*)</translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation type="unfinished"></translation> </message> @@ -769,20 +992,19 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation type="unfinished"></translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation type="unfinished">Afbeelding opslaan</translation> </message> @@ -921,12 +1143,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation type="unfinished"></translation> </message> @@ -950,17 +1172,17 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation type="unfinished"></translation> </message> @@ -968,63 +1190,74 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation type="unfinished">Leesbevestigingen</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1034,25 +1267,20 @@ Example: https://server.my:8787</source> <translation type="unfinished">Gebruikers uitnodigen</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> <translation type="unfinished">Leden</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> <translation type="unfinished">Kamer verlaten</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Settings</source> <translation type="unfinished">Instellingen</translation> </message> - <message> - <location line="+253"/> - <source>Close</source> - <translation type="unfinished"></translation> - </message> </context> <context> <name>TrayIcon</name> @@ -1111,9 +1339,32 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation>Minimaliseren naar systeemvak</translation> </message> @@ -1133,12 +1384,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation type="unfinished"></translation> </message> @@ -1276,7 +1532,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation type="unfinished"></translation> </message> @@ -1321,7 +1587,7 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation type="unfinished"></translation> </message> @@ -1341,22 +1607,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation>ALGEMEEN</translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation type="unfinished"></translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation type="unfinished"></translation> </message> @@ -1403,6 +1679,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished">Annuleren</translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_pl.ts b/resources/langs/nheko_pl.ts
index fd4657d7..2479268e 100644 --- a/resources/langs/nheko_pl.ts +++ b/resources/langs/nheko_pl.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="pl"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished">Anuluj</translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <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="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation type="unfinished"></translation> </message> @@ -108,12 +154,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -128,7 +174,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <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> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation>Spróbuj zalogować się ponownie: %1</translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation type="unfinished"></translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation type="unfinished"></translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -443,18 +571,18 @@ Example: https://server.my:8787</source> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -464,7 +592,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -474,42 +602,93 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+11"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished">Napisz wiadomość…</translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished">Anuluj</translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished">Akceptuj</translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -518,6 +697,24 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -594,9 +791,17 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -656,7 +861,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation>Akceptuj</translation> </message> @@ -697,30 +902,48 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation>Wyślij plik</translation> </message> @@ -741,7 +964,7 @@ Example: https://server.my:8787</source> <translation>Emoji</translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation>Wybierz plik</translation> </message> @@ -751,7 +974,7 @@ Example: https://server.my:8787</source> <translation>Wszystkie pliki (*)</translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation type="unfinished"></translation> </message> @@ -769,20 +992,19 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation type="unfinished"></translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation type="unfinished">Zapisz obraz</translation> </message> @@ -922,12 +1144,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation type="unfinished"></translation> </message> @@ -951,17 +1173,17 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation type="unfinished"></translation> </message> @@ -969,63 +1191,74 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation type="unfinished">Potwierdzenia przeczytania</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation type="unfinished">Ustawienia pokoju</translation> </message> @@ -1035,25 +1268,20 @@ Example: https://server.my:8787</source> <translation type="unfinished">Zaproś użytkowników</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> <translation type="unfinished">Członkowie</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> <translation type="unfinished">Opuść pokój</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Settings</source> <translation type="unfinished">Ustawienia</translation> </message> - <message> - <location line="+253"/> - <source>Close</source> - <translation type="unfinished"></translation> - </message> </context> <context> <name>TrayIcon</name> @@ -1112,9 +1340,32 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation>Zminimalizuj do paska zadań</translation> </message> @@ -1134,12 +1385,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation type="unfinished"></translation> </message> @@ -1277,7 +1533,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation type="unfinished"></translation> </message> @@ -1322,7 +1588,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="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation type="unfinished"></translation> </message> @@ -1342,22 +1608,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation>SZYFROWANIE</translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation>OGÓLNE</translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation type="unfinished"></translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation type="unfinished"></translation> </message> @@ -1404,6 +1680,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished">Anuluj</translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_pt_PT.ts b/resources/langs/nheko_pt_PT.ts
index 66e07bb4..70921b70 100644 --- a/resources/langs/nheko_pt_PT.ts +++ b/resources/langs/nheko_pt_PT.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="pt_PT"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <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="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation type="unfinished"></translation> </message> @@ -108,12 +154,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -128,7 +174,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation type="unfinished"></translation> </message> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation type="unfinished"></translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation type="unfinished"></translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -443,18 +571,18 @@ Example: https://server.my:8787</source> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -464,7 +592,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -474,42 +602,93 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+19"/> + <location line="+29"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> <message> - <location line="-12"/> + <location line="-18"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -518,6 +697,24 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -594,9 +791,17 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -656,7 +861,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation type="unfinished"></translation> </message> @@ -697,30 +902,48 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation type="unfinished"></translation> </message> @@ -741,7 +964,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation type="unfinished"></translation> </message> @@ -751,7 +974,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation type="unfinished"></translation> </message> @@ -769,20 +992,19 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation type="unfinished"></translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation type="unfinished"></translation> </message> @@ -921,12 +1143,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation type="unfinished"></translation> </message> @@ -950,17 +1172,17 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation type="unfinished"></translation> </message> @@ -968,63 +1190,74 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1034,25 +1267,20 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <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> @@ -1111,9 +1339,32 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation type="unfinished"></translation> </message> @@ -1133,12 +1384,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation type="unfinished"></translation> </message> @@ -1276,7 +1532,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation type="unfinished"></translation> </message> @@ -1321,7 +1587,7 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation type="unfinished"></translation> </message> @@ -1341,22 +1607,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation type="unfinished"></translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation type="unfinished"></translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation type="unfinished"></translation> </message> @@ -1403,6 +1679,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_ro.ts b/resources/langs/nheko_ro.ts
index 9468bb28..3ee30c1f 100644 --- a/resources/langs/nheko_ro.ts +++ b/resources/langs/nheko_ro.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="ro"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <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="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation type="unfinished"></translation> </message> @@ -108,12 +154,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -128,7 +174,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation type="unfinished"></translation> </message> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation type="unfinished"></translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation type="unfinished"></translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -443,18 +571,18 @@ Example: https://server.my:8787</source> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -464,7 +592,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -474,42 +602,93 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+11"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -518,6 +697,24 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -594,9 +791,17 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -656,7 +861,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation type="unfinished"></translation> </message> @@ -697,30 +902,48 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation type="unfinished"></translation> </message> @@ -741,7 +964,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation type="unfinished"></translation> </message> @@ -751,7 +974,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation type="unfinished"></translation> </message> @@ -769,20 +992,19 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation type="unfinished"></translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation type="unfinished"></translation> </message> @@ -922,12 +1144,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation type="unfinished"></translation> </message> @@ -951,17 +1173,17 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation type="unfinished"></translation> </message> @@ -969,63 +1191,74 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1035,25 +1268,20 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <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> @@ -1112,9 +1340,32 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation type="unfinished"></translation> </message> @@ -1134,12 +1385,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation type="unfinished"></translation> </message> @@ -1277,7 +1533,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation type="unfinished"></translation> </message> @@ -1322,7 +1588,7 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation type="unfinished"></translation> </message> @@ -1342,22 +1608,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation type="unfinished"></translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation type="unfinished"></translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation type="unfinished"></translation> </message> @@ -1404,6 +1680,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_ru.ts b/resources/langs/nheko_ru.ts
index 95cef767..bc349646 100644 --- a/resources/langs/nheko_ru.ts +++ b/resources/langs/nheko_ru.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="ru"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <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="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation type="unfinished"></translation> </message> @@ -108,12 +154,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -128,7 +174,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation>Не удалось восстановить учетную запись OLM. Пожалуйста, войдите снова.</translation> </message> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation>Повторите попытку входа: %1</translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation type="unfinished"></translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation type="unfinished"></translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished">Закрыть</translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -443,18 +571,18 @@ Example: https://server.my:8787</source> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -464,7 +592,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -474,42 +602,93 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+11"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished">Написать сообщение...</translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished">Принять</translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -518,6 +697,24 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -594,9 +791,17 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished">Закрыть</translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -656,7 +861,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation>Принять</translation> </message> @@ -697,30 +902,48 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished">Закрыть</translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation>Отправить файл</translation> </message> @@ -741,7 +964,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation>Выберите файл</translation> </message> @@ -751,7 +974,7 @@ Example: https://server.my:8787</source> <translation>Все файлы (*)</translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation type="unfinished"></translation> </message> @@ -769,20 +992,19 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation type="unfinished">Ошибка редактирования сообщения: %1</translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation type="unfinished"></translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation type="unfinished">Сохранить изображение</translation> </message> @@ -922,12 +1144,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation type="unfinished"></translation> </message> @@ -951,17 +1173,17 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation type="unfinished"></translation> </message> @@ -969,63 +1191,74 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation type="unfinished">Подтверждать прочтение</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation type="unfinished">Настройки комнаты</translation> </message> @@ -1035,25 +1268,20 @@ Example: https://server.my:8787</source> <translation type="unfinished">Пригласить пользователей</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> <translation type="unfinished">Участники</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> <translation type="unfinished">Покинуть комнату</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <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> @@ -1112,9 +1340,32 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation>Сворачивать в системную панель</translation> </message> @@ -1134,12 +1385,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation type="unfinished"></translation> </message> @@ -1277,7 +1533,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation>Масштаб</translation> </message> @@ -1322,7 +1588,7 @@ This usually causes the application icon in the task bar to animate in some fash <translation>Отпечаток устройства</translation> </message> <message> - <location line="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation>Ключи сеанса</translation> </message> @@ -1342,22 +1608,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation>ШИФРОВАНИЕ</translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation>ГЛАВНОЕ</translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation type="unfinished"></translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation>Открыть файл сеансов</translation> </message> @@ -1405,6 +1681,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_si.ts b/resources/langs/nheko_si.ts
index d490b4d1..c63e58e3 100644 --- a/resources/langs/nheko_si.ts +++ b/resources/langs/nheko_si.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="si"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <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="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation type="unfinished"></translation> </message> @@ -108,12 +154,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -128,7 +174,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation type="unfinished"></translation> </message> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation type="unfinished"></translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation type="unfinished"></translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -443,18 +571,18 @@ Example: https://server.my:8787</source> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -464,7 +592,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -474,42 +602,93 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+11"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -518,6 +697,24 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -594,9 +791,17 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -656,7 +861,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation type="unfinished"></translation> </message> @@ -697,30 +902,48 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation type="unfinished"></translation> </message> @@ -741,7 +964,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation type="unfinished"></translation> </message> @@ -751,7 +974,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation type="unfinished"></translation> </message> @@ -769,20 +992,19 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation type="unfinished"></translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation type="unfinished"></translation> </message> @@ -921,12 +1143,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation type="unfinished"></translation> </message> @@ -950,17 +1172,17 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation type="unfinished"></translation> </message> @@ -968,63 +1190,74 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1034,25 +1267,20 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <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> @@ -1111,9 +1339,32 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation type="unfinished"></translation> </message> @@ -1133,12 +1384,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation type="unfinished"></translation> </message> @@ -1276,7 +1532,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation type="unfinished"></translation> </message> @@ -1321,7 +1587,7 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation type="unfinished"></translation> </message> @@ -1341,22 +1607,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation type="unfinished"></translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation type="unfinished"></translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation type="unfinished"></translation> </message> @@ -1403,6 +1679,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/langs/nheko_zh_CN.ts b/resources/langs/nheko_zh_CN.ts
index e4927ff6..eee53d95 100644 --- a/resources/langs/nheko_zh_CN.ts +++ b/resources/langs/nheko_zh_CN.ts
@@ -2,9 +2,55 @@ <!DOCTYPE TS> <TS version="2.1" language="zh_CN"> <context> + <name>ActiveCallBar</name> + <message> + <location filename="../qml/ActiveCallBar.qml" line="+49"/> + <source>Initiating...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Calling...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+3"/> + <source>Connecting...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+48"/> + <source>Unmute Mic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Mute Mic</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AwaitingVerificationConfirmation</name> + <message> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+7"/> + <source>Awaiting Confirmation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Waiting for other side to complete verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Cancel</source> + <translation type="unfinished">取消</translation> + </message> +</context> +<context> <name>Cache</name> <message> - <location filename="../../src/Cache.cpp" line="+1658"/> + <location filename="../../src/Cache.cpp" line="+1843"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> @@ -12,23 +58,23 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+218"/> + <location filename="../../src/ChatPage.cpp" line="+217"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> <message> <location line="+4"/> - <location line="+947"/> + <location line="+931"/> <source>Invited user: %1</source> <translation type="unfinished"></translation> </message> <message> - <location line="-458"/> + <location line="-444"/> <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="+415"/> + <location line="+401"/> <source>Room %1 created.</source> <translation type="unfinished"></translation> </message> @@ -108,12 +154,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="-874"/> + <location line="-858"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+334"/> + <location line="+332"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -128,7 +174,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+67"/> + <location line="+53"/> <source>Failed to restore OLM account. Please login again.</source> <translation>恢复 OLM 账户失败。请重新登录。</translation> </message> @@ -144,12 +190,12 @@ </message> <message> <location line="+99"/> - <location line="+251"/> + <location line="+257"/> <source>Please try to login again: %1</source> <translation>请尝试再次登录:%1</translation> </message> <message> - <location line="-219"/> + <location line="-225"/> <source>Failed to join room: %1</source> <translation type="unfinished"></translation> </message> @@ -210,6 +256,29 @@ </message> </context> <context> + <name>DigitVerification</name> + <message> + <location filename="../qml/device-verification/DigitVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following digits. You should see the same numbers on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+31"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EditModal</name> <message> <location filename="../../src/dialogs/RoomSettings.cpp" line="+72"/> @@ -235,13 +304,13 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+117"/> - <location line="+139"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+113"/> + <location line="+181"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="-42"/> + <location line="-66"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -282,9 +351,32 @@ </message> </context> <context> + <name>EmojiVerification</name> + <message> + <location filename="../qml/device-verification/EmojiVerification.qml" line="+7"/> + <source>Verification Code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press &apos;They do not match!&apos; to abort verification!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+376"/> + <source>They do not match!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>They match!</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>EncryptionIndicator</name> <message> - <location filename="../qml/EncryptionIndicator.qml" line="+36"/> + <location filename="../qml/EncryptionIndicator.qml" line="+19"/> <source>Encrypted</source> <translation type="unfinished"></translation> </message> @@ -297,25 +389,27 @@ <context> <name>EventStore</name> <message> - <location filename="../../src/timeline/EventStore.cpp" line="+418"/> + <location filename="../../src/timeline/EventStore.cpp" line="+519"/> <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"/> + <location line="+32"/> + <location line="+62"/> <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"/> + <location line="-48"/> + <location line="+61"/> <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"/> + <location line="-51"/> <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> @@ -332,6 +426,40 @@ </message> </context> <context> + <name>Failed</name> + <message> + <location filename="../qml/device-verification/Failed.qml" line="+7"/> + <source>Verification failed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Other client does not support our verification protocol.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+4"/> + <source>Key mismatch detected!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <location line="+4"/> + <source>Device verification timed out.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="-2"/> + <source>Other party canceled the verification.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+18"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>InviteeItem</name> <message> <location filename="../../src/InviteeItem.cpp" line="+18"/> @@ -443,18 +571,18 @@ Example: https://server.my:8787</source> <context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+66"/> - <location line="+6"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+105"/> + <location line="+9"/> <source>redacted</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -464,7 +592,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -474,42 +602,93 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+12"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a video call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>%1 placed a call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+7"/> + <location line="+11"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+9"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>MessageInput</name> + <message> + <location filename="../qml/MessageInput.qml" line="+47"/> + <source>Write a message...</source> + <translation type="unfinished">写一条消息...</translation> + </message> +</context> +<context> + <name>NewVerificationRequest</name> + <message> + <location filename="../qml/device-verification/NewVerificationRequest.qml" line="+7"/> + <source>Send Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Recieved Device Verification Request</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+10"/> + <source>To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>The device was requested to be verified</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Cancel</source> + <translation type="unfinished">取消</translation> + </message> + <message> + <location line="+0"/> + <source>Deny</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+13"/> + <source>Start verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>Accept</source> + <translation type="unfinished">接受</translation> + </message> +</context> +<context> <name>Placeholder</name> <message> <location filename="../qml/delegates/Placeholder.qml" line="+4"/> @@ -518,6 +697,24 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>QCoreApplication</name> + <message> + <location filename="../../src/main.cpp" line="+172"/> + <source>Create a unique profile, which allows you to log into several accounts at the same time and start multiple instances of nheko.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+1"/> + <source>profile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+0"/> + <source>profile name</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QuickSwitcher</name> <message> <location filename="../../src/QuickSwitcher.cpp" line="+74"/> @@ -594,9 +791,17 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>ReplyPopup</name> + <message> + <location filename="../qml/ReplyPopup.qml" line="+43"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+1443"/> + <location filename="../../src/Cache.cpp" line="+1780"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -656,7 +861,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+173"/> + <location line="+169"/> <source>Accept</source> <translation>接受</translation> </message> @@ -697,30 +902,48 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+14"/> + <location filename="../qml/StatusIndicator.qml" line="+17"/> <source>Failed</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Sent</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Received</source> <translation type="unfinished"></translation> </message> <message> - <location line="+1"/> + <location line="+2"/> <source>Read</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>Success</name> + <message> + <location filename="../qml/device-verification/Success.qml" line="+6"/> + <source>Successful Verification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Verification successful! Both sides verified their devices!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+12"/> + <source>Close</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>TextInputWidget</name> <message> - <location filename="../../src/TextInputWidget.cpp" line="+574"/> + <location filename="../../src/TextInputWidget.cpp" line="+577"/> <source>Send a file</source> <translation>发送一个文件</translation> </message> @@ -741,7 +964,7 @@ Example: https://server.my:8787</source> <translation></translation> </message> <message> - <location line="+94"/> + <location line="+96"/> <source>Select a file</source> <translation>选择一个文件</translation> </message> @@ -751,7 +974,7 @@ Example: https://server.my:8787</source> <translation>所有文件(*)</translation> </message> <message> - <location line="+64"/> + <location line="+63"/> <source>Place a call</source> <translation type="unfinished"></translation> </message> @@ -769,20 +992,19 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+805"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+853"/> <source>Message redaction failed: %1</source> <translation type="unfinished">删除消息失败:%1</translation> </message> <message> - <location line="+114"/> - <location line="+17"/> - <location line="+101"/> + <location line="+130"/> + <location line="+8"/> <location line="+5"/> <source>Failed to encrypt event, sending aborted!</source> <translation type="unfinished"></translation> </message> <message> - <location line="+195"/> + <location line="+156"/> <source>Save image</source> <translation type="unfinished">保存图像</translation> </message> @@ -920,12 +1142,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-943"/> + <location line="-810"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+945"/> + <location line="+812"/> <source>Rejected the knock from %1.</source> <translation type="unfinished"></translation> </message> @@ -949,17 +1171,17 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+94"/> + <location filename="../qml/TimelineRow.qml" line="+95"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+16"/> + <location line="+15"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+14"/> <source>Options</source> <translation type="unfinished"></translation> </message> @@ -967,63 +1189,74 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+61"/> + <location filename="../qml/TimelineView.qml" line="+75"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Reply</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Read receipts</source> <translation type="unfinished">阅读回执</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Mark as read</source> <translation type="unfinished"></translation> </message> <message> - <location line="+3"/> + <location line="+4"/> <source>View raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>View decrypted raw message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Redact message</source> <translation type="unfinished"></translation> </message> <message> - <location line="+6"/> + <location line="+7"/> <source>Save as</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+43"/> <source>No room open</source> <translation type="unfinished"></translation> </message> +</context> +<context> + <name>TimelineViewManager</name> <message> - <location line="+53"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+410"/> + <source>No share room with this user found. Create an encrypted room with this user and try again.</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TopBar</name> + <message> + <location filename="../qml/TopBar.qml" line="+41"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+12"/> <location line="+15"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+28"/> + <location line="+27"/> <source>Room options</source> <translation type="unfinished">聊天室选项</translation> </message> @@ -1033,25 +1266,20 @@ Example: https://server.my:8787</source> <translation type="unfinished">邀请用户</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Members</source> <translation type="unfinished">成员</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <source>Leave room</source> <translation type="unfinished">离开聊天室</translation> </message> <message> - <location line="+4"/> + <location line="+5"/> <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> @@ -1110,9 +1338,32 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>UserProfile</name> + <message> + <location filename="../qml/UserProfile.qml" line="+60"/> + <source>Verify</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Ban the user</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+20"/> + <source>Start a private chat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+8"/> + <source>Kick the user</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>UserSettingsPage</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+566"/> + <location filename="../../src/UserSettingsPage.cpp" line="+595"/> <source>Minimize to tray</source> <translation>最小化至托盘</translation> </message> @@ -1132,12 +1383,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-63"/> + <location line="-149"/> + <source>profile: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+87"/> <source>CALLS</source> <translation type="unfinished"></translation> </message> <message> - <location line="+58"/> + <location line="+57"/> <source>Keep the application running in the background after closing the client window.</source> <translation type="unfinished"></translation> </message> @@ -1275,7 +1531,17 @@ This usually causes the application icon in the task bar to animate in some fash <translation type="unfinished"></translation> </message> <message> - <location line="+5"/> + <location line="+4"/> + <source>Mobile mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Will prevent text selection in the timeline to make scrolling easier.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> <source>Scale factor</source> <translation type="unfinished"></translation> </message> @@ -1320,7 +1586,7 @@ This usually causes the application icon in the task bar to animate in some fash <translation>设备指纹</translation> </message> <message> - <location line="-120"/> + <location line="-123"/> <source>Session Keys</source> <translation>会话密钥</translation> </message> @@ -1340,22 +1606,32 @@ This usually causes the application icon in the task bar to animate in some fash <translation>加密</translation> </message> <message> - <location line="-78"/> + <location line="-75"/> <source>GENERAL</source> <translation>通用</translation> </message> <message> - <location line="+30"/> + <location line="+32"/> <source>INTERFACE</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+170"/> <source>Emoji Font Family</source> <translation type="unfinished"></translation> </message> <message> - <location line="+191"/> + <location line="+18"/> + <source>Share keys with trusted users</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Automatically replies to key requests from other users, if they are verified.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+185"/> <source>Open Sessions File</source> <translation>打开会话文件</translation> </message> @@ -1402,6 +1678,34 @@ This usually causes the application icon in the task bar to animate in some fash </message> </context> <context> + <name>Waiting</name> + <message> + <location filename="../qml/device-verification/Waiting.qml" line="+7"/> + <source>Waiting for other party</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Waiting for other side to accept the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to continue the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+2"/> + <source>Waiting for other side to complete the verification request.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+15"/> + <source>Cancel</source> + <translation type="unfinished">取消</translation> + </message> +</context> +<context> <name>WelcomePage</name> <message> <location filename="../../src/WelcomePage.cpp" line="+47"/> diff --git a/resources/qml/ActiveCallBar.qml b/resources/qml/ActiveCallBar.qml
index 49b5d059..7137197b 100644 --- a/resources/qml/ActiveCallBar.qml +++ b/resources/qml/ActiveCallBar.qml
@@ -8,7 +8,7 @@ Rectangle { visible: TimelineManager.callState != WebRTCState.DISCONNECTED color: "#2ECC71" - implicitHeight: rowLayout.height + 8 + implicitHeight: visible ? rowLayout.height + 8 : 0 MouseArea { anchors.fill: parent diff --git a/resources/qml/Avatar.qml b/resources/qml/Avatar.qml
index a247bffe..34b029a6 100644 --- a/resources/qml/Avatar.qml +++ b/resources/qml/Avatar.qml
@@ -13,7 +13,7 @@ Rectangle { width: 48 height: 48 radius: Settings.avatarCircles ? height / 2 : 3 - color: colors.base + color: colors.alternateBase Label { anchors.fill: parent diff --git a/resources/qml/MatrixText.qml b/resources/qml/MatrixText.qml
index 6c96a539..a5781c73 100644 --- a/resources/qml/MatrixText.qml +++ b/resources/qml/MatrixText.qml
@@ -6,8 +6,7 @@ TextEdit { textFormat: TextEdit.RichText readOnly: true wrapMode: Text.Wrap - selectByMouse: true - activeFocusOnPress: false + selectByMouse: !Settings.mobileMode color: colors.text onLinkActivated: { if (/^https:\/\/matrix.to\/#\/(@.*)$/.test(link)) { @@ -29,7 +28,6 @@ TextEdit { id: ma anchors.fill: parent - propagateComposedEvents: true acceptedButtons: Qt.NoButton cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor } diff --git a/resources/qml/MessageInput.qml b/resources/qml/MessageInput.qml new file mode 100644
index 00000000..71da9cae --- /dev/null +++ b/resources/qml/MessageInput.qml
@@ -0,0 +1,90 @@ +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.2 +import QtQuick.Window 2.2 + +Rectangle { + color: colors.window + Layout.fillWidth: true + Layout.preferredHeight: textInput.height + Layout.minimumHeight: 40 + + RowLayout { + id: inputBar + + anchors.fill: parent + spacing: 16 + + ImageButton { + Layout.alignment: Qt.AlignBottom + hoverEnabled: true + width: 22 + height: 22 + image: ":/icons/icons/ui/place-call.png" + Layout.topMargin: 8 + Layout.bottomMargin: 8 + Layout.leftMargin: 16 + } + + ImageButton { + Layout.alignment: Qt.AlignBottom + hoverEnabled: true + width: 22 + height: 22 + image: ":/icons/icons/ui/paper-clip-outline.png" + Layout.topMargin: 8 + Layout.bottomMargin: 8 + } + + ScrollView { + id: textInput + + Layout.alignment: Qt.AlignBottom + Layout.maximumHeight: Window.height / 4 + Layout.fillWidth: true + + TextArea { + placeholderText: qsTr("Write a message...") + placeholderTextColor: colors.buttonText + color: colors.text + wrapMode: TextEdit.Wrap + + MouseArea { + // workaround for wrong cursor shape on some platforms + anchors.fill: parent + acceptedButtons: Qt.NoButton + cursorShape: Qt.IBeamCursor + } + + background: Rectangle { + color: colors.window + } + + } + + } + + ImageButton { + Layout.alignment: Qt.AlignRight | Qt.AlignBottom + hoverEnabled: true + width: 22 + height: 22 + image: ":/icons/icons/ui/smile.png" + Layout.topMargin: 8 + Layout.bottomMargin: 8 + } + + ImageButton { + Layout.alignment: Qt.AlignRight | Qt.AlignBottom + hoverEnabled: true + width: 22 + height: 22 + image: ":/icons/icons/ui/cursor.png" + Layout.topMargin: 8 + Layout.bottomMargin: 8 + Layout.rightMargin: 16 + } + + } + +} diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml new file mode 100644
index 00000000..09220a71 --- /dev/null +++ b/resources/qml/MessageView.qml
@@ -0,0 +1,202 @@ +import "./delegates" +import QtGraphicalEffects 1.0 +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.2 +import QtQuick.Window 2.2 +import im.nheko 1.0 + +ListView { + id: chat + + property int delegateMaxWidth: (Settings.timelineMaxWidth > 100 && (parent.width - Settings.timelineMaxWidth) > scrollbar.width * 2) ? Settings.timelineMaxWidth : (parent.width - scrollbar.width * 2) + + Layout.fillWidth: true + Layout.fillHeight: true + cacheBuffer: 400 + model: TimelineManager.timeline + boundsBehavior: Flickable.StopAtBounds + pixelAligned: true + spacing: 4 + verticalLayoutDirection: ListView.BottomToTop + onCountChanged: { + if (atYEnd) + model.currentIndex = 0; + + } // Mark last event as read, since we are at the bottom + + ScrollHelper { + flickable: parent + anchors.fill: parent + } + + Shortcut { + sequence: StandardKey.MoveToPreviousPage + onActivated: { + chat.contentY = chat.contentY - chat.height / 2; + chat.returnToBounds(); + } + } + + Shortcut { + sequence: StandardKey.MoveToNextPage + onActivated: { + chat.contentY = chat.contentY + chat.height / 2; + chat.returnToBounds(); + } + } + + Shortcut { + sequence: StandardKey.Cancel + onActivated: chat.model.reply = undefined + } + + Shortcut { + sequence: "Alt+Up" + onActivated: chat.model.reply = chat.model.indexToId(chat.model.reply ? chat.model.idToIndex(chat.model.reply) + 1 : 0) + } + + Shortcut { + sequence: "Alt+Down" + onActivated: { + var idx = chat.model.reply ? chat.model.idToIndex(chat.model.reply) - 1 : -1; + chat.model.reply = idx >= 0 ? chat.model.indexToId(idx) : undefined; + } + } + + section { + property: "section" + } + + Component { + id: sectionHeader + + Column { + property var modelData + property string section + property string nextSection + + topPadding: 4 + bottomPadding: 4 + spacing: 8 + visible: !!modelData + width: parent.width + height: (section.includes(" ") ? dateBubble.height + 8 + userName.height : userName.height) + 8 + + Label { + id: dateBubble + + anchors.horizontalCenter: parent ? parent.horizontalCenter : undefined + visible: section.includes(" ") + text: chat.model.formatDateSeparator(modelData.timestamp) + color: colors.text + height: fontMetrics.height * 1.4 + width: contentWidth * 1.2 + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + + background: Rectangle { + radius: parent.height / 2 + color: colors.window + } + + } + + Row { + height: userName.height + spacing: 8 + + Avatar { + width: avatarSize + height: avatarSize + url: chat.model.avatarUrl(modelData.userId).replace("mxc://", "image://MxcImage/") + displayName: modelData.userName + userid: modelData.userId + + MouseArea { + anchors.fill: parent + onClicked: chat.model.openUserProfile(modelData.userId) + cursorShape: Qt.PointingHandCursor + propagateComposedEvents: true + } + + } + + Label { + id: userName + + text: TimelineManager.escapeEmoji(modelData.userName) + color: TimelineManager.userColor(modelData.userId, colors.window) + textFormat: Text.RichText + + MouseArea { + anchors.fill: parent + Layout.alignment: Qt.AlignHCenter + onClicked: chat.model.openUserProfile(modelData.userId) + cursorShape: Qt.PointingHandCursor + propagateComposedEvents: true + } + + } + + } + + } + + } + + ScrollBar.vertical: ScrollBar { + id: scrollbar + } + + delegate: Item { + id: wrapper + + // 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 + property Item section + + anchors.horizontalCenter: parent ? parent.horizontalCenter : undefined + width: chat.delegateMaxWidth + height: section ? section.height + timelinerow.height : timelinerow.height + onSectionBoundaryChanged: { + if (sectionBoundary) { + var properties = { + "modelData": model.dump, + "section": ListView.section, + "nextSection": ListView.nextSection + }; + section = sectionHeader.createObject(wrapper, properties); + } else { + section.destroy(); + section = null; + } + } + + TimelineRow { + id: timelinerow + + y: section ? section.y + section.height : 0 + } + + Connections { + function onMovementEnded() { + if (y + height + 2 * chat.spacing > chat.contentY + chat.height && y < chat.contentY + chat.height) + chat.model.currentIndex = index; + + } + + target: chat + } + + } + + footer: BusyIndicator { + anchors.horizontalCenter: parent.horizontalCenter + running: chat.model && chat.model.paginationInProgress + height: 50 + width: 50 + z: 3 + } + +} diff --git a/resources/qml/Reactions.qml b/resources/qml/Reactions.qml
index 6487f512..836087ef 100644 --- a/resources/qml/Reactions.qml +++ b/resources/qml/Reactions.qml
@@ -83,7 +83,7 @@ Flow { implicitWidth: reaction.implicitWidth implicitHeight: reaction.implicitHeight border.color: (reaction.hovered || modelData.selfReactedEvent !== '') ? colors.highlight : colors.text - color: modelData.selfReactedEvent !== '' ? Qt.hsla(highlightHue, highlightSat, highlightLight, 0.2) : colors.base + color: modelData.selfReactedEvent !== '' ? Qt.hsla(highlightHue, highlightSat, highlightLight, 0.2) : colors.window border.width: 1 radius: reaction.height / 2 } diff --git a/resources/qml/ReplyPopup.qml b/resources/qml/ReplyPopup.qml new file mode 100644
index 00000000..4659e075 --- /dev/null +++ b/resources/qml/ReplyPopup.qml
@@ -0,0 +1,47 @@ +import "./delegates/" +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.2 +import im.nheko 1.0 + +Rectangle { + id: replyPopup + + property var room: TimelineManager.timeline + + Layout.fillWidth: true + visible: room && room.reply + // Height of child, plus margins, plus border + implicitHeight: replyPreview.height + 10 + color: colors.window + z: 3 + + Reply { + id: replyPreview + + anchors.left: parent.left + anchors.leftMargin: 2 * 22 + 3 * 16 + anchors.right: closeReplyButton.left + anchors.rightMargin: 2 * 22 + 3 * 16 + anchors.bottom: parent.bottom + modelData: room ? room.getDump(room.reply, room.id) : { + } + userColor: TimelineManager.userColor(modelData.userId, colors.window) + } + + ImageButton { + id: closeReplyButton + + anchors.right: parent.right + anchors.rightMargin: 15 + anchors.top: replyPreview.top + hoverEnabled: true + width: 16 + height: 16 + image: ":/icons/icons/ui/remove-symbol.png" + ToolTip.visible: closeReplyButton.hovered + ToolTip.text: qsTr("Close") + onClicked: room.reply = undefined + } + +} diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml
index 38597673..57fded90 100644 --- a/resources/qml/TimelineRow.qml +++ b/resources/qml/TimelineRow.qml
@@ -48,7 +48,7 @@ Item { Reply { visible: model.replyTo modelData: chat.model.getDump(model.replyTo, model.id) - userColor: TimelineManager.userColor(modelData.userId, colors.window) + userColor: TimelineManager.userColor(modelData.userId, colors.base) } // actual message content diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index d69d5568..9d00442c 100644 --- a/resources/qml/TimelineView.qml +++ b/resources/qml/TimelineView.qml
@@ -43,6 +43,14 @@ Page { } + Component { + id: userProfileComponent + + UserProfile { + } + + } + Menu { id: messageContextMenu @@ -69,12 +77,12 @@ Page { MenuItem { text: qsTr("Reply") - onClicked: chat.model.replyAction(messageContextMenu.eventId) + onClicked: TimelineManager.timeline.replyAction(messageContextMenu.eventId) } MenuItem { text: qsTr("Read receipts") - onTriggered: chat.model.readReceiptsAction(messageContextMenu.eventId) + onTriggered: TimelineManager.timeline.readReceiptsAction(messageContextMenu.eventId) } MenuItem { @@ -83,19 +91,19 @@ Page { MenuItem { text: qsTr("View raw message") - onTriggered: chat.model.viewRawMessage(messageContextMenu.eventId) + onTriggered: TimelineManager.timeline.viewRawMessage(messageContextMenu.eventId) } MenuItem { visible: messageContextMenu.isEncrypted height: visible ? implicitHeight : 0 text: qsTr("View decrypted raw message") - onTriggered: chat.model.viewDecryptedRawMessage(messageContextMenu.eventId) + onTriggered: TimelineManager.timeline.viewDecryptedRawMessage(messageContextMenu.eventId) } MenuItem { text: qsTr("Redact message") - onTriggered: chat.model.redactEvent(messageContextMenu.eventId) + onTriggered: TimelineManager.timeline.redactEvent(messageContextMenu.eventId) } MenuItem { @@ -159,436 +167,76 @@ Page { } ColumnLayout { + visible: TimelineManager.timeline != null anchors.fill: parent + spacing: 0 - Rectangle { - id: topBar + TopBar { + } + Rectangle { Layout.fillWidth: true - implicitHeight: topLayout.height + 16 + height: 1 z: 3 - color: colors.base - - MouseArea { - anchors.fill: parent - onClicked: TimelineManager.openRoomSettings() - } - - GridLayout { - //Layout.margins: 8 - - id: topLayout - - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: 8 - anchors.verticalCenter: parent.verticalCenter - - 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 - color: colors.text - 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() - } - - } - - } - - } - + color: colors.mid } - StackLayout { - id: stackLayout - currentIndex: 0 - - Connections { - target: TimelineManager - function onActiveTimelineChanged() { - stackLayout.currentIndex = 0; - } - } - - ListView { - id: chat - - property int delegateMaxWidth: (Settings.timelineMaxWidth > 100 && (parent.width - Settings.timelineMaxWidth) > scrollbar.width * 2) ? Settings.timelineMaxWidth : (parent.width - scrollbar.width * 2) - - visible: TimelineManager.timeline != null - cacheBuffer: 400 - Layout.fillWidth: true - Layout.fillHeight: true - model: TimelineManager.timeline - boundsBehavior: Flickable.StopAtBounds - pixelAligned: true - spacing: 4 - verticalLayoutDirection: ListView.BottomToTop - onCountChanged: { - if (atYEnd) - model.currentIndex = 0; - - } // Mark last event as read, since we are at the bottom - - ScrollHelper { - flickable: parent - anchors.fill: parent - } - - Shortcut { - sequence: StandardKey.MoveToPreviousPage - onActivated: { - chat.contentY = chat.contentY - chat.height / 2; - chat.returnToBounds(); - } - } - - Shortcut { - sequence: StandardKey.MoveToNextPage - onActivated: { - chat.contentY = chat.contentY + chat.height / 2; - chat.returnToBounds(); - } - } - - Shortcut { - sequence: StandardKey.Cancel - onActivated: chat.model.reply = undefined - } - - Shortcut { - sequence: "Alt+Up" - onActivated: chat.model.reply = chat.model.indexToId(chat.model.reply ? chat.model.idToIndex(chat.model.reply) + 1 : 0) - } - - Shortcut { - sequence: "Alt+Down" - onActivated: { - var idx = chat.model.reply ? chat.model.idToIndex(chat.model.reply) - 1 : -1; - chat.model.reply = idx >= 0 ? chat.model.indexToId(idx) : undefined; - } - } - - Component { - id: userProfileComponent - - UserProfile { - } - - } - - section { - property: "section" - } - - Component { - id: sectionHeader - - Column { - property var modelData - property string section - property string nextSection - - topPadding: 4 - bottomPadding: 4 - spacing: 8 - visible: !!modelData - width: parent.width - height: (section.includes(" ") ? dateBubble.height + 8 + userName.height : userName.height) + 8 - - Label { - id: dateBubble - - anchors.horizontalCenter: parent ? parent.horizontalCenter : undefined - visible: section.includes(" ") - text: chat.model.formatDateSeparator(modelData.timestamp) - color: colors.text - height: fontMetrics.height * 1.4 - width: contentWidth * 1.2 - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - - background: Rectangle { - radius: parent.height / 2 - color: colors.base - } - - } - - Row { - height: userName.height - spacing: 8 - - Avatar { - width: avatarSize - height: avatarSize - url: chat.model.avatarUrl(modelData.userId).replace("mxc://", "image://MxcImage/") - displayName: modelData.userName - userid: modelData.userId - - MouseArea { - anchors.fill: parent - onClicked: chat.model.openUserProfile(modelData.userId) - cursorShape: Qt.PointingHandCursor - propagateComposedEvents: true - } - - } - - Label { - id: userName - - text: TimelineManager.escapeEmoji(modelData.userName) - color: TimelineManager.userColor(modelData.userId, colors.window) - textFormat: Text.RichText + Rectangle { + Layout.fillWidth: true + Layout.fillHeight: true + color: colors.base - MouseArea { - anchors.fill: parent - Layout.alignment: Qt.AlignHCenter - onClicked: chat.model.openUserProfile(modelData.userId) - cursorShape: Qt.PointingHandCursor - propagateComposedEvents: true - } + ColumnLayout { + anchors.fill: parent + spacing: 0 - } + StackLayout { + id: stackLayout + currentIndex: 0 + Connections { + target: TimelineManager + function onActiveTimelineChanged() { + stackLayout.currentIndex = 0; } - } - } - - ScrollBar.vertical: ScrollBar { - id: scrollbar - } - - delegate: Item { - id: wrapper - - // 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 - property Item section - - anchors.horizontalCenter: parent ? parent.horizontalCenter : undefined - width: chat.delegateMaxWidth - height: section ? section.height + timelinerow.height : timelinerow.height - onSectionBoundaryChanged: { - if (sectionBoundary) { - var properties = { - "modelData": model.dump, - "section": ListView.section, - "nextSection": ListView.nextSection - }; - section = sectionHeader.createObject(wrapper, properties); - } else { - section.destroy(); - section = null; - } + MessageView { + Layout.fillWidth: true + Layout.fillHeight: true } - TimelineRow { - id: timelinerow - - y: section ? section.y + section.height : 0 + Loader { + source: TimelineManager.onVideoCall ? "VideoCall.qml" : "" + onLoaded: TimelineManager.setVideoCallItem() } - - Connections { - function onMovementEnded() { - if (y + height + 2 * chat.spacing > chat.contentY + chat.height && y < chat.contentY + chat.height) - chat.model.currentIndex = index; - - } - - target: chat - } - } - footer: BusyIndicator { - anchors.horizontalCenter: parent.horizontalCenter - running: chat.model && chat.model.paginationInProgress - height: 50 - width: 50 - z: 3 + TypingIndicator { } } - Loader { - id: videoCallLoader - source: TimelineManager.onVideoCall ? "VideoCall.qml" : "" - onLoaded: TimelineManager.setVideoCallItem() - } } - Item { - id: chatFooter - - implicitHeight: Math.max(fontMetrics.height * 1.2, footerContent.height) + ActiveCallBar { Layout.fillWidth: true z: 3 - - Column { - id: footerContent - - anchors.left: parent.left - anchors.right: parent.right - 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 { - id: replyPopup - - anchors.left: parent.left - anchors.right: parent.right - visible: chat.model && chat.model.reply - // Height of child, plus margins, plus border - height: replyPreview.height + 10 - color: colors.base - - Reply { - id: replyPreview - - anchors.left: parent.left - anchors.leftMargin: 10 - anchors.right: closeReplyButton.left - anchors.rightMargin: 20 - anchors.bottom: parent.bottom - modelData: chat.model ? chat.model.getDump(chat.model.reply, chat.model.id) : { - } - userColor: TimelineManager.userColor(modelData.userId, colors.window) - } - - ImageButton { - id: closeReplyButton - - anchors.right: parent.right - anchors.rightMargin: 15 - anchors.top: replyPreview.top - hoverEnabled: true - width: 16 - height: 16 - image: ":/icons/icons/ui/remove-symbol.png" - ToolTip.visible: closeReplyButton.hovered - ToolTip.text: qsTr("Close") - onClicked: chat.model.reply = undefined - } - - } - - } - } - ActiveCallBar { + Rectangle { Layout.fillWidth: true z: 3 + height: 1 + color: colors.mid } + ReplyPopup { + } + + //MessageInput { + //} + } } diff --git a/resources/qml/TopBar.qml b/resources/qml/TopBar.qml new file mode 100644
index 00000000..181b9ba4 --- /dev/null +++ b/resources/qml/TopBar.qml
@@ -0,0 +1,127 @@ +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.2 +import im.nheko 1.0 + +Rectangle { + id: topBar + + property var room: TimelineManager.timeline + + Layout.fillWidth: true + implicitHeight: topLayout.height + 16 + z: 3 + color: colors.window + + MouseArea { + anchors.fill: parent + onClicked: TimelineManager.openRoomSettings() + } + + GridLayout { + //Layout.margins: 8 + + id: topLayout + + anchors.left: parent.left + anchors.right: parent.right + anchors.margins: 8 + anchors.verticalCenter: parent.verticalCenter + + 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: room ? room.roomAvatarUrl.replace("mxc://", "image://MxcImage/") : "" + displayName: room ? room.roomName : qsTr("No room selected") + + MouseArea { + anchors.fill: parent + onClicked: TimelineManager.openRoomSettings() + } + + } + + Label { + Layout.fillWidth: true + Layout.column: 2 + Layout.row: 0 + color: colors.text + font.pointSize: fontMetrics.font.pointSize * 1.1 + text: room ? room.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: room ? room.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() + } + + } + + } + + } + +} diff --git a/resources/qml/TypingIndicator.qml b/resources/qml/TypingIndicator.qml new file mode 100644
index 00000000..239fd662 --- /dev/null +++ b/resources/qml/TypingIndicator.qml
@@ -0,0 +1,35 @@ +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.2 +import im.nheko 1.0 + +Item { + property var room: TimelineManager.timeline + + implicitHeight: Math.max(fontMetrics.height * 1.2, typingDisplay.height) + Layout.fillWidth: true + + Rectangle { + id: typingRect + + visible: (room && room.typingUsers.length > 0) + color: colors.base + anchors.fill: parent + z: 3 + + Label { + id: typingDisplay + + anchors.left: parent.left + anchors.leftMargin: 10 + anchors.right: parent.right + anchors.rightMargin: 10 + anchors.bottom: parent.bottom + color: colors.text + text: room ? room.formatTypingUsers(room.typingUsers, colors.base) : "" + textFormat: Text.RichText + } + + } + +} diff --git a/resources/qml/delegates/FileMessage.qml b/resources/qml/delegates/FileMessage.qml
index c6f213ee..ffd1e82b 100644 --- a/resources/qml/delegates/FileMessage.qml +++ b/resources/qml/delegates/FileMessage.qml
@@ -65,7 +65,7 @@ Item { } Rectangle { - color: colors.dark + color: colors.alternateBase z: -1 radius: 10 height: row.height + 24 diff --git a/resources/qml/delegates/ImageMessage.qml b/resources/qml/delegates/ImageMessage.qml
index e2c78fbe..5c3dac95 100644 --- a/resources/qml/delegates/ImageMessage.qml +++ b/resources/qml/delegates/ImageMessage.qml
@@ -31,11 +31,44 @@ Item { fillMode: Image.PreserveAspectFit MouseArea { + id: mouseArea + enabled: model.data.type == MtxEvent.ImageMessage && img.status == Image.Ready + hoverEnabled: true anchors.fill: parent onClicked: TimelineManager.openImageOverlay(model.data.url, model.data.id) } + Item { + id: overlay + + anchors.fill: parent + visible: mouseArea.containsMouse + + Rectangle { + id: container + + width: parent.width + implicitHeight: imgcaption.implicitHeight + anchors.bottom: overlay.bottom + color: colors.window + opacity: 0.75 + } + + Text { + id: imgcaption + + anchors.fill: container + elide: Text.ElideMiddle + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + // See this MSC: https://github.com/matrix-org/matrix-doc/pull/2530 + text: model.data.filename ? model.data.filename : model.data.body + color: colors.text + } + + } + } } diff --git a/resources/qml/delegates/NoticeMessage.qml b/resources/qml/delegates/NoticeMessage.qml
index d9a7a3e7..67a69055 100644 --- a/resources/qml/delegates/NoticeMessage.qml +++ b/resources/qml/delegates/NoticeMessage.qml
@@ -2,5 +2,5 @@ TextMessage { font.italic: true color: colors.buttonText height: isReply ? Math.min(chat.height / 8, implicitHeight) : undefined - clip: true + clip: isReply } diff --git a/resources/qml/delegates/Pill.qml b/resources/qml/delegates/Pill.qml
index 4acf2bef..88f6c7fd 100644 --- a/resources/qml/delegates/Pill.qml +++ b/resources/qml/delegates/Pill.qml
@@ -9,7 +9,7 @@ Label { background: Rectangle { radius: parent.height / 2 - color: colors.dark + color: colors.alternateBase } } diff --git a/resources/qml/delegates/PlayableMediaMessage.qml b/resources/qml/delegates/PlayableMediaMessage.qml
index 9ad115c7..be22687f 100644 --- a/resources/qml/delegates/PlayableMediaMessage.qml +++ b/resources/qml/delegates/PlayableMediaMessage.qml
@@ -8,7 +8,7 @@ Rectangle { id: bg radius: 10 - color: colors.dark + color: colors.alternateBase height: Math.round(content.height + 24) width: parent ? parent.width : undefined diff --git a/resources/qml/delegates/TextMessage.qml b/resources/qml/delegates/TextMessage.qml
index 69f2f0e3..8a1c116e 100644 --- a/resources/qml/delegates/TextMessage.qml +++ b/resources/qml/delegates/TextMessage.qml
@@ -7,6 +7,6 @@ MatrixText { text: "<style type=\"text/css\">a { color:" + colors.link + ";}</style>" + formatted.replace("<pre>", "<pre style='white-space: pre-wrap'>") width: parent ? parent.width : undefined height: isReply ? Math.round(Math.min(timelineRoot.height / 8, implicitHeight)) : undefined - clip: true + clip: isReply font.pointSize: (Settings.enlargeEmojiOnlyMessages && model.data.isOnlyEmoji > 0 && model.data.isOnlyEmoji < 4) ? Settings.fontSize * 3 : Settings.fontSize } diff --git a/resources/qml/emoji/EmojiPicker.qml b/resources/qml/emoji/EmojiPicker.qml
index 3a5ee57a..afe16350 100644 --- a/resources/qml/emoji/EmojiPicker.qml +++ b/resources/qml/emoji/EmojiPicker.qml
@@ -59,6 +59,7 @@ Popup { cellHeight: 52 boundsBehavior: Flickable.StopAtBounds clip: true + currentIndex: -1 // prevent sorting from stealing focus // Individual emoji delegate: AbstractButton { @@ -160,7 +161,7 @@ Popup { Rectangle { Layout.fillWidth: true Layout.preferredHeight: 1 - color: emojiPopup.colors.dark + color: emojiPopup.colors.alternateBase } // Category picker row @@ -280,7 +281,7 @@ Popup { Layout.preferredWidth: 1 implicitWidth: 1 height: parent.height - color: emojiPopup.colors.dark + color: emojiPopup.colors.alternateBase } // Search Button is special diff --git a/resources/res.qrc b/resources/res.qrc
index dc5c9969..4eba0bca 100644 --- a/resources/res.qrc +++ b/resources/res.qrc
@@ -122,6 +122,11 @@ <file>qtquickcontrols2.conf</file> <file>qml/TimelineView.qml</file> + <file>qml/TopBar.qml</file> + <file>qml/MessageView.qml</file> + <file>qml/MessageInput.qml</file> + <file>qml/TypingIndicator.qml</file> + <file>qml/ReplyPopup.qml</file> <file>qml/ActiveCallBar.qml</file> <file>qml/Avatar.qml</file> <file>qml/ImageButton.qml</file> diff --git a/resources/styles/nheko-dark.qss b/resources/styles/nheko-dark.qss
index 3676f874..547e4256 100644 --- a/resources/styles/nheko-dark.qss +++ b/resources/styles/nheko-dark.qss
@@ -205,9 +205,7 @@ TextField { qproperty-labelColor: #caccd1; } -SideBarActions, -TopRoomBar -{ +SideBarActions { border: none; border-top: 1px solid #202228; background-color: #2d3139; @@ -215,7 +213,6 @@ TopRoomBar TextInputWidget { border: none; - border-top: 1px solid #2d3139; } TextInputWidget, diff --git a/resources/styles/nheko.qss b/resources/styles/nheko.qss
index 8604ad30..81d97f65 100644 --- a/resources/styles/nheko.qss +++ b/resources/styles/nheko.qss
@@ -233,7 +233,6 @@ QLineEdit { TextInputWidget { border: none; - border-top: 1px solid #dcdcdc; } SideBarActions { @@ -241,11 +240,6 @@ SideBarActions { border-top: 1px solid #dcdcdc; } -TopRoomBar { - border: none; - border-bottom: 1px solid #dcdcdc; -} - Toggle { qproperty-activeColor: #38a3d8; qproperty-disabledColor: gray; diff --git a/resources/styles/system.qss b/resources/styles/system.qss
index 01951aff..d65c8baa 100644 --- a/resources/styles/system.qss +++ b/resources/styles/system.qss
@@ -28,11 +28,9 @@ UserMentionsWidget > TimelineItem { SideBarActions, TextInputWidget { border: none; - border-top: 1px solid palette(mid); } -UserInfoWidget, -TopRoomBar { +UserInfoWidget { border: none; border-bottom: 1px solid palette(mid); } diff --git a/src/Cache.cpp b/src/Cache.cpp
index 088b6fc6..993fbfe7 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp
@@ -40,7 +40,7 @@ //! Should be changed when a breaking change occurs in the cache format. //! This will reset client's data. -static const std::string CURRENT_CACHE_FORMAT_VERSION("2020.07.05"); +static const std::string CURRENT_CACHE_FORMAT_VERSION("2020.10.20"); static const std::string SECRET("secret"); static lmdb::val NEXT_BATCH_KEY("next_batch"); @@ -437,7 +437,9 @@ Cache::getOutboundMegolmSession(const std::string &room_id) // void -Cache::saveOlmSession(const std::string &curve25519, mtx::crypto::OlmSessionPtr session) +Cache::saveOlmSession(const std::string &curve25519, + mtx::crypto::OlmSessionPtr session, + uint64_t timestamp) { using namespace mtx::crypto; @@ -447,7 +449,11 @@ Cache::saveOlmSession(const std::string &curve25519, mtx::crypto::OlmSessionPtr const auto pickled = pickle<SessionObject>(session.get(), SECRET); const auto session_id = mtx::crypto::session_id(session.get()); - lmdb::dbi_put(txn, db, lmdb::val(session_id), lmdb::val(pickled)); + StoredOlmSession stored_session; + stored_session.pickled_session = pickled; + stored_session.last_message_ts = timestamp; + + lmdb::dbi_put(txn, db, lmdb::val(session_id), lmdb::val(json(stored_session).dump())); txn.commit(); } @@ -466,13 +472,44 @@ Cache::getOlmSession(const std::string &curve25519, const std::string &session_i txn.commit(); if (found) { - auto data = std::string(pickled.data(), pickled.size()); - return unpickle<SessionObject>(data, SECRET); + std::string_view raw(pickled.data(), pickled.size()); + auto data = json::parse(raw).get<StoredOlmSession>(); + return unpickle<SessionObject>(data.pickled_session, SECRET); } return std::nullopt; } +std::optional<mtx::crypto::OlmSessionPtr> +Cache::getLatestOlmSession(const std::string &curve25519) +{ + using namespace mtx::crypto; + + auto txn = lmdb::txn::begin(env_); + auto db = getOlmSessionsDb(txn, curve25519); + + std::string session_id, pickled_session; + std::vector<std::string> res; + + std::optional<StoredOlmSession> currentNewest; + + auto cursor = lmdb::cursor::open(txn, db); + while (cursor.get(session_id, pickled_session, MDB_NEXT)) { + auto data = + json::parse(std::string_view(pickled_session.data(), pickled_session.size())) + .get<StoredOlmSession>(); + if (!currentNewest || currentNewest->last_message_ts < data.last_message_ts) + currentNewest = data; + } + cursor.close(); + + txn.commit(); + + return currentNewest + ? std::optional(unpickle<SessionObject>(currentNewest->pickled_session, SECRET)) + : std::nullopt; +} + std::vector<std::string> Cache::getOlmSessions(const std::string &curve25519) { @@ -828,6 +865,80 @@ Cache::runMigrations() nhlog::db()->info("Successfully deleted pending receipts database."); return true; }}, + {"2020.10.20", + [this]() { + try { + using namespace mtx::crypto; + + auto txn = lmdb::txn::begin(env_); + + auto mainDb = lmdb::dbi::open(txn, nullptr); + + std::string dbName, ignored; + auto olmDbCursor = lmdb::cursor::open(txn, mainDb); + while (olmDbCursor.get(dbName, ignored, MDB_NEXT)) { + // skip every db but olm session dbs + nhlog::db()->debug("Db {}", dbName); + if (dbName.find("olm_sessions/") != 0) + continue; + + nhlog::db()->debug("Migrating {}", dbName); + + auto olmDb = lmdb::dbi::open(txn, dbName.c_str()); + + std::string session_id, session_value; + + std::vector<std::pair<std::string, StoredOlmSession>> sessions; + + auto cursor = lmdb::cursor::open(txn, olmDb); + while (cursor.get(session_id, session_value, MDB_NEXT)) { + nhlog::db()->debug("session_id {}, session_value {}", + session_id, + session_value); + StoredOlmSession session; + bool invalid = false; + for (auto c : session_value) + if (!isprint(c)) { + invalid = true; + break; + } + if (invalid) + continue; + + nhlog::db()->debug("Not skipped"); + + session.pickled_session = session_value; + sessions.emplace_back(session_id, session); + } + cursor.close(); + + olmDb.drop(txn, true); + + auto newDbName = dbName; + newDbName.erase(0, sizeof("olm_sessions") - 1); + newDbName = "olm_sessions.v2" + newDbName; + + auto newDb = lmdb::dbi::open(txn, newDbName.c_str(), MDB_CREATE); + + for (const auto &[key, value] : sessions) { + nhlog::db()->debug("{}\n{}", key, json(value).dump()); + lmdb::dbi_put(txn, + newDb, + lmdb::val(key), + lmdb::val(json(value).dump())); + } + } + olmDbCursor.close(); + + txn.commit(); + } catch (const lmdb::error &) { + nhlog::db()->critical("Failed to migrate olm sessions,"); + return false; + } + + nhlog::db()->info("Successfully migrated olm sessions."); + return true; + }}, }; nhlog::db()->info("Running migrations, this may take a while!"); @@ -1638,7 +1749,7 @@ Cache::getTimelineIndex(const std::string &room_id, std::string_view event_id) lmdb::dbi orderDb{0}; try { - orderDb = getOrderToMessageDb(txn, room_id); + orderDb = getMessageToOrderDb(txn, room_id); } catch (lmdb::runtime_error &e) { nhlog::db()->error("Can't open db for room '{}', probably doesn't exist yet. ({})", room_id, @@ -2169,34 +2280,22 @@ Cache::joinedRooms() return room_ids; } -void -Cache::populateMembers() +std::optional<MemberInfo> +Cache::getMember(const std::string &room_id, const std::string &user_id) { - auto rooms = joinedRooms(); - nhlog::db()->info("loading {} rooms", rooms.size()); - - auto txn = lmdb::txn::begin(env_); - - for (const auto &room : rooms) { - const auto roomid = QString::fromStdString(room); - - auto membersdb = getMembersDb(txn, room); - auto cursor = lmdb::cursor::open(txn, membersdb); - - std::string user_id, info; - while (cursor.get(user_id, info, MDB_NEXT)) { - MemberInfo m = json::parse(info); + try { + auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY); - const auto userid = QString::fromStdString(user_id); + auto membersdb = getMembersDb(txn, room_id); - insertDisplayName(roomid, userid, QString::fromStdString(m.name)); - insertAvatarUrl(roomid, userid, QString::fromStdString(m.avatar_url)); + lmdb::val info; + if (lmdb::dbi_get(txn, membersdb, lmdb::val(user_id), info)) { + MemberInfo m = json::parse(std::string_view(info.data(), info.size())); + return m; } - - cursor.close(); + } catch (...) { } - - txn.commit(); + return std::nullopt; } std::vector<RoomSearchResult> @@ -2613,8 +2712,19 @@ Cache::saveOldMessages(const std::string &room_id, const mtx::responses::Message } } - if (res.chunk.empty()) + if (res.chunk.empty()) { + if (lmdb::dbi_get(txn, orderDb, lmdb::val(&index, sizeof(index)), val)) { + auto orderEntry = json::parse(std::string_view(val.data(), val.size())); + orderEntry["prev_batch"] = res.end; + lmdb::dbi_put(txn, + orderDb, + lmdb::val(&index, sizeof(index)), + lmdb::val(orderEntry.dump())); + nhlog::db()->debug("saving '{}'", orderEntry.dump()); + txn.commit(); + } return index; + } std::string event_id_val; for (const auto &e : res.chunk) { @@ -3034,15 +3144,12 @@ Cache::roomMembers(const std::string &room_id) return members; } -QHash<QString, QString> Cache::DisplayNames; -QHash<QString, QString> Cache::AvatarUrls; - QString Cache::displayName(const QString &room_id, const QString &user_id) { - auto fmt = QString("%1 %2").arg(room_id).arg(user_id); - if (DisplayNames.contains(fmt)) - return DisplayNames[fmt]; + if (auto info = getMember(room_id.toStdString(), user_id.toStdString()); + info && !info->name.empty()) + return QString::fromStdString(info->name); return user_id; } @@ -3050,9 +3157,8 @@ Cache::displayName(const QString &room_id, const QString &user_id) std::string Cache::displayName(const std::string &room_id, const std::string &user_id) { - auto fmt = QString::fromStdString(room_id + " " + user_id); - if (DisplayNames.contains(fmt)) - return DisplayNames[fmt].toStdString(); + if (auto info = getMember(room_id, user_id); info && !info->name.empty()) + return info->name; return user_id; } @@ -3060,41 +3166,11 @@ Cache::displayName(const std::string &room_id, const std::string &user_id) QString Cache::avatarUrl(const QString &room_id, const QString &user_id) { - auto fmt = QString("%1 %2").arg(room_id).arg(user_id); - if (AvatarUrls.contains(fmt)) - return AvatarUrls[fmt]; - - return QString(); -} + if (auto info = getMember(room_id.toStdString(), user_id.toStdString()); + info && !info->avatar_url.empty()) + return QString::fromStdString(info->avatar_url); -void -Cache::insertDisplayName(const QString &room_id, - const QString &user_id, - const QString &display_name) -{ - auto fmt = QString("%1 %2").arg(room_id).arg(user_id); - DisplayNames.insert(fmt, display_name); -} - -void -Cache::removeDisplayName(const QString &room_id, const QString &user_id) -{ - auto fmt = QString("%1 %2").arg(room_id).arg(user_id); - DisplayNames.remove(fmt); -} - -void -Cache::insertAvatarUrl(const QString &room_id, const QString &user_id, const QString &avatar_url) -{ - auto fmt = QString("%1 %2").arg(room_id).arg(user_id); - AvatarUrls.insert(fmt, avatar_url); -} - -void -Cache::removeAvatarUrl(const QString &room_id, const QString &user_id) -{ - auto fmt = QString("%1 %2").arg(room_id).arg(user_id); - AvatarUrls.remove(fmt); + return ""; } mtx::presence::PresenceState @@ -3629,6 +3705,19 @@ from_json(const nlohmann::json &obj, MegolmSessionIndex &msg) msg.sender_key = obj.at("sender_key"); } +void +to_json(nlohmann::json &obj, const StoredOlmSession &msg) +{ + obj["ts"] = msg.last_message_ts; + obj["s"] = msg.pickled_session; +} +void +from_json(const nlohmann::json &obj, StoredOlmSession &msg) +{ + msg.last_message_ts = obj.at("ts").get<uint64_t>(); + msg.pickled_session = obj.at("s").get<std::string>(); +} + namespace cache { void init(const QString &user_id) @@ -3669,28 +3758,6 @@ avatarUrl(const QString &room_id, const QString &user_id) return instance_->avatarUrl(room_id, user_id); } -void -removeDisplayName(const QString &room_id, const QString &user_id) -{ - instance_->removeDisplayName(room_id, user_id); -} -void -removeAvatarUrl(const QString &room_id, const QString &user_id) -{ - instance_->removeAvatarUrl(room_id, user_id); -} - -void -insertDisplayName(const QString &room_id, const QString &user_id, const QString &display_name) -{ - instance_->insertDisplayName(room_id, user_id, display_name); -} -void -insertAvatarUrl(const QString &room_id, const QString &user_id, const QString &avatar_url) -{ - instance_->insertAvatarUrl(room_id, user_id, avatar_url); -} - mtx::presence::PresenceState presenceState(const std::string &user_id) { @@ -3702,13 +3769,6 @@ statusMessage(const std::string &user_id) return instance_->statusMessage(user_id); } -//! Load saved data for the display names & avatars. -void -populateMembers() -{ - instance_->populateMembers(); -} - // user cache stores user keys std::optional<UserKeyCache> userKeys(const std::string &user_id) @@ -4114,9 +4174,11 @@ inboundMegolmSessionExists(const MegolmSessionIndex &index) // Olm Sessions // void -saveOlmSession(const std::string &curve25519, mtx::crypto::OlmSessionPtr session) +saveOlmSession(const std::string &curve25519, + mtx::crypto::OlmSessionPtr session, + uint64_t timestamp) { - instance_->saveOlmSession(curve25519, std::move(session)); + instance_->saveOlmSession(curve25519, std::move(session), timestamp); } std::vector<std::string> getOlmSessions(const std::string &curve25519) @@ -4128,6 +4190,11 @@ getOlmSession(const std::string &curve25519, const std::string &session_id) { return instance_->getOlmSession(curve25519, session_id); } +std::optional<mtx::crypto::OlmSessionPtr> +getLatestOlmSession(const std::string &curve25519) +{ + return instance_->getLatestOlmSession(curve25519); +} void saveOlmAccount(const std::string &pickled) diff --git a/src/Cache.h b/src/Cache.h
index cd96708e..98e6cb75 100644 --- a/src/Cache.h +++ b/src/Cache.h
@@ -44,16 +44,6 @@ displayName(const QString &room_id, const QString &user_id); QString avatarUrl(const QString &room_id, const QString &user_id); -void -removeDisplayName(const QString &room_id, const QString &user_id); -void -removeAvatarUrl(const QString &room_id, const QString &user_id); - -void -insertDisplayName(const QString &room_id, const QString &user_id, const QString &display_name); -void -insertAvatarUrl(const QString &room_id, const QString &user_id, const QString &avatar_url); - // presence mtx::presence::PresenceState presenceState(const std::string &user_id); @@ -74,9 +64,6 @@ markDeviceVerified(const std::string &user_id, const std::string &device); void markDeviceUnverified(const std::string &user_id, const std::string &device); -//! Load saved data for the display names & avatars. -void -populateMembers(); std::vector<std::string> joinedRooms(); @@ -292,11 +279,15 @@ inboundMegolmSessionExists(const MegolmSessionIndex &index); // Olm Sessions // void -saveOlmSession(const std::string &curve25519, mtx::crypto::OlmSessionPtr session); +saveOlmSession(const std::string &curve25519, + mtx::crypto::OlmSessionPtr session, + uint64_t timestamp); std::vector<std::string> getOlmSessions(const std::string &curve25519); std::optional<mtx::crypto::OlmSessionPtr> getOlmSession(const std::string &curve25519, const std::string &session_id); +std::optional<mtx::crypto::OlmSessionPtr> +getLatestOlmSession(const std::string &curve25519); void saveOlmAccount(const std::string &pickled); diff --git a/src/CacheCryptoStructs.h b/src/CacheCryptoStructs.h
index 935d6493..a693e233 100644 --- a/src/CacheCryptoStructs.h +++ b/src/CacheCryptoStructs.h
@@ -66,6 +66,16 @@ struct OlmSessionStorage std::mutex group_inbound_mtx; }; +struct StoredOlmSession +{ + std::uint64_t last_message_ts = 0; + std::string pickled_session; +}; +void +to_json(nlohmann::json &obj, const StoredOlmSession &msg); +void +from_json(const nlohmann::json &obj, StoredOlmSession &msg); + //! Verification status of a single user struct VerificationStatus { diff --git a/src/Cache_p.h b/src/Cache_p.h
index b3f4c58c..a32793ea 100644 --- a/src/Cache_p.h +++ b/src/Cache_p.h
@@ -46,9 +46,9 @@ class Cache : public QObject public: Cache(const QString &userId, QObject *parent = nullptr); - static std::string displayName(const std::string &room_id, const std::string &user_id); - static QString displayName(const QString &room_id, const QString &user_id); - static QString avatarUrl(const QString &room_id, const QString &user_id); + std::string displayName(const std::string &room_id, const std::string &user_id); + QString displayName(const QString &room_id, const QString &user_id); + QString avatarUrl(const QString &room_id, const QString &user_id); // presence mtx::presence::PresenceState presenceState(const std::string &user_id); @@ -71,18 +71,6 @@ public: void markDeviceVerified(const std::string &user_id, const std::string &device); void markDeviceUnverified(const std::string &user_id, const std::string &device); - static void removeDisplayName(const QString &room_id, const QString &user_id); - static void removeAvatarUrl(const QString &room_id, const QString &user_id); - - static void insertDisplayName(const QString &room_id, - const QString &user_id, - const QString &display_name); - static void insertAvatarUrl(const QString &room_id, - const QString &user_id, - const QString &avatar_url); - - //! Load saved data for the display names & avatars. - void populateMembers(); std::vector<std::string> joinedRooms(); QMap<QString, RoomInfo> roomInfo(bool withInvites = true); @@ -266,10 +254,14 @@ public: // // Olm Sessions // - void saveOlmSession(const std::string &curve25519, mtx::crypto::OlmSessionPtr session); + void saveOlmSession(const std::string &curve25519, + mtx::crypto::OlmSessionPtr session, + uint64_t timestamp); std::vector<std::string> getOlmSessions(const std::string &curve25519); std::optional<mtx::crypto::OlmSessionPtr> getOlmSession(const std::string &curve25519, const std::string &session_id); + std::optional<mtx::crypto::OlmSessionPtr> getLatestOlmSession( + const std::string &curve25519); void saveOlmAccount(const std::string &pickled); std::string restoreOlmAccount(); @@ -304,6 +296,8 @@ private: QString getInviteRoomTopic(lmdb::txn &txn, lmdb::dbi &statesdb); QString getInviteRoomAvatarUrl(lmdb::txn &txn, lmdb::dbi &statesdb, lmdb::dbi &membersdb); + std::optional<MemberInfo> getMember(const std::string &room_id, const std::string &user_id); + std::string getLastEventId(lmdb::txn &txn, const std::string &room_id); DescInfo getLastMessageInfo(lmdb::txn &txn, const std::string &room_id); void saveTimelineMessages(lmdb::txn &txn, @@ -360,25 +354,12 @@ private: lmdb::val(e->state_key), lmdb::val(json(tmp).dump())); - insertDisplayName(QString::fromStdString(room_id), - QString::fromStdString(e->state_key), - QString::fromStdString(display_name)); - - insertAvatarUrl(QString::fromStdString(room_id), - QString::fromStdString(e->state_key), - QString::fromStdString(e->content.avatar_url)); - break; } default: { lmdb::dbi_del( txn, membersdb, lmdb::val(e->state_key), lmdb::val("")); - removeDisplayName(QString::fromStdString(room_id), - QString::fromStdString(e->state_key)); - removeAvatarUrl(QString::fromStdString(room_id), - QString::fromStdString(e->state_key)); - break; } } @@ -565,7 +546,7 @@ private: lmdb::dbi getOlmSessionsDb(lmdb::txn &txn, const std::string &curve25519_key) { return lmdb::dbi::open( - txn, std::string("olm_sessions/" + curve25519_key).c_str(), MDB_CREATE); + txn, std::string("olm_sessions.v2/" + curve25519_key).c_str(), MDB_CREATE); } QString getDisplayName(const mtx::events::StateEvent<mtx::events::state::Member> &event) @@ -598,9 +579,6 @@ private: QString localUserId_; QString cacheDirectory_; - static QHash<QString, QString> DisplayNames; - static QHash<QString, QString> AvatarUrls; - OlmSessionStorage session_storage; VerificationStorage verification_storage; }; diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index e0ac31ab..c86c6128 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp
@@ -73,6 +73,8 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent) { setObjectName("chatPage"); + instance_ = this; + qRegisterMetaType<std::optional<mtx::crypto::EncryptedFile>>(); qRegisterMetaType<std::optional<RelatedInfo>>(); qRegisterMetaType<mtx::presence::PresenceState>(); @@ -124,7 +126,7 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent) contentLayout_->setSpacing(0); contentLayout_->setMargin(0); - view_manager_ = new TimelineViewManager(userSettings_, &callManager_, this); + view_manager_ = new TimelineViewManager(&callManager_, this); contentLayout_->addWidget(view_manager_->getWidget()); @@ -270,7 +272,7 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent) connect(room_list_, SIGNAL(totalUnreadMessageCountUpdated(int)), this, - SLOT(showUnreadMessageNotification(int))); + SIGNAL(unreadMessages(int))); connect(text_input_, &TextInputWidget::sendTextMessage, @@ -593,8 +595,6 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent) connectCallMessage<mtx::events::msg::CallCandidates>(); connectCallMessage<mtx::events::msg::CallAnswer>(); connectCallMessage<mtx::events::msg::CallHangUp>(); - - instance_ = this; } void @@ -629,7 +629,7 @@ ChatPage::resetUI() user_info_widget_->reset(); view_manager_->clearAll(); - showUnreadMessageNotification(0); + emit unreadMessages(0); } void @@ -755,18 +755,6 @@ ChatPage::bootstrap(QString userid, QString homeserver, QString token) } void -ChatPage::showUnreadMessageNotification(int count) -{ - emit unreadMessages(count); - - // TODO: Make the default title a const. - if (count == 0) - emit changeWindowTitle("nheko"); - else - emit changeWindowTitle(QString("nheko (%1)").arg(count)); -} - -void ChatPage::loadStateFromCache() { emit contentLoaded(); @@ -777,8 +765,6 @@ ChatPage::loadStateFromCache() cache::restoreSessions(); olm::client()->load(cache::restoreOlmAccount(), STORAGE_SECRET_KEY); - cache::populateMembers(); - emit initializeEmptyViews(cache::roomMessages()); emit initializeRoomList(cache::roomInfo()); emit initializeMentions(cache::getTimelineMentions()); @@ -1253,6 +1239,12 @@ ChatPage::unbanUser(QString userid, QString reason) } void +ChatPage::receivedSessionKey(const std::string &room_id, const std::string &session_id) +{ + view_manager_->receivedSessionKey(room_id, session_id); +} + +void ChatPage::sendTypingNotifications() { if (!userSettings_->typingNotifications()) diff --git a/src/ChatPage.h b/src/ChatPage.h
index f0e12ab5..a29cea7b 100644 --- a/src/ChatPage.h +++ b/src/ChatPage.h
@@ -107,6 +107,8 @@ public slots: void banUser(QString userid, QString reason); void unbanUser(QString userid, QString reason); + void receivedSessionKey(const std::string &room_id, const std::string &session_id); + signals: void connectionLost(); void connectionRestored(); @@ -128,7 +130,7 @@ signals: void contentLoaded(); void closing(); - void changeWindowTitle(const QString &msg); + void changeWindowTitle(const int); void unreadMessages(int count); void showNotification(const QString &msg); void showLoginPage(const QString &msg); @@ -186,7 +188,6 @@ signals: void receivedDeviceVerificationDone(const mtx::events::msg::KeyVerificationDone &message); private slots: - void showUnreadMessageNotification(int count); void logout(); void removeRoom(const QString &room_id); void dropToLoginPage(const QString &msg); diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index b6ad8bbe..f7c9fbf0 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp
@@ -53,10 +53,11 @@ MainWindow *MainWindow::instance_ = nullptr; -MainWindow::MainWindow(QWidget *parent) +MainWindow::MainWindow(const QString profile, QWidget *parent) : QMainWindow(parent) + , profile_{profile} { - setWindowTitle("nheko"); + setWindowTitle(0); setObjectName("MainWindow"); modal_ = new OverlayModal(this); @@ -103,8 +104,7 @@ MainWindow::MainWindow(QWidget *parent) connect(chat_page_, &ChatPage::closing, this, &MainWindow::showWelcomePage); connect( chat_page_, &ChatPage::showOverlayProgressBar, this, &MainWindow::showOverlayProgressBar); - connect( - chat_page_, SIGNAL(changeWindowTitle(QString)), this, SLOT(setWindowTitle(QString))); + connect(chat_page_, &ChatPage::unreadMessages, this, &MainWindow::setWindowTitle); connect(chat_page_, SIGNAL(unreadMessages(int)), trayIcon_, SLOT(setUnreadCount(int))); connect(chat_page_, &ChatPage::showLoginPage, this, [this](const QString &msg) { login_page_->loginError(msg); @@ -179,6 +179,18 @@ MainWindow::MainWindow(QWidget *parent) } void +MainWindow::setWindowTitle(int notificationCount) +{ + QString name = "nheko"; + if (!profile_.isEmpty()) + name += " | " + profile_; + if (notificationCount > 0) { + name.append(QString{" (%1)"}.arg(notificationCount)); + } + QMainWindow::setWindowTitle(name); +} + +void MainWindow::showEvent(QShowEvent *event) { adjustSideBars(); diff --git a/src/MainWindow.h b/src/MainWindow.h
index e66f299f..2f9ff897 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h
@@ -62,7 +62,7 @@ class MainWindow : public QMainWindow Q_OBJECT public: - explicit MainWindow(QWidget *parent = nullptr); + explicit MainWindow(const QString name, QWidget *parent = nullptr); static MainWindow *instance() { return instance_; }; void saveCurrentWindowSize(); @@ -113,6 +113,8 @@ private slots: void showOverlayProgressBar(); void removeOverlayProgressBar(); + virtual void setWindowTitle(int notificationCount); + private: bool loadJdenticonPlugin(); @@ -147,4 +149,6 @@ private: LoadingIndicator *spinner_ = nullptr; JdenticonInterface *jdenticonInteface_ = nullptr; + + QString profile_; }; diff --git a/src/Olm.cpp b/src/Olm.cpp
index f4cb2209..6e68bd42 100644 --- a/src/Olm.cpp +++ b/src/Olm.cpp
@@ -1,14 +1,15 @@ +#include "Olm.h" + #include <QObject> #include <variant> -#include "Olm.h" - #include "Cache.h" #include "Cache_p.h" #include "ChatPage.h" #include "DeviceVerificationFlow.h" #include "Logging.h" #include "MatrixClient.h" +#include "UserSettingsPage.h" #include "Utils.h" static const std::string STORAGE_SECRET_KEY("secret"); @@ -46,7 +47,7 @@ handle_to_device_messages(const std::vector<mtx::events::collections::DeviceEven if (msg_type == to_string(mtx::events::EventType::RoomEncrypted)) { try { - OlmMessage olm_msg = j_msg; + olm::OlmMessage olm_msg = j_msg; handle_olm_message(std::move(olm_msg)); } catch (const nlohmann::json::exception &e) { nhlog::crypto()->warn( @@ -55,10 +56,6 @@ handle_to_device_messages(const std::vector<mtx::events::collections::DeviceEven nhlog::crypto()->warn("validation error for olm message: {} {}", e.what(), j_msg.dump(2)); - - nhlog::crypto()->warn("validation error for olm message: {} {}", - e.what(), - j_msg.dump(2)); } } else if (msg_type == to_string(mtx::events::EventType::RoomKeyRequest)) { @@ -249,7 +246,10 @@ handle_pre_key_olm_message(const std::string &sender, nhlog::crypto()->debug("decrypted message: \n {}", plaintext.dump(2)); try { - cache::saveOlmSession(sender_key, std::move(inbound_session)); + nhlog::crypto()->debug("New olm session: {}", + mtx::crypto::session_id(inbound_session.get())); + cache::saveOlmSession( + sender_key, std::move(inbound_session), QDateTime::currentMSecsSinceEpoch()); } catch (const lmdb::error &e) { nhlog::db()->warn( "failed to save inbound olm session from {}: {}", sender, e.what()); @@ -317,7 +317,10 @@ try_olm_decryption(const std::string &sender_key, const mtx::events::msg::OlmCip try { text = olm::client()->decrypt_message(session->get(), msg.type, msg.body); - cache::saveOlmSession(id, std::move(session.value())); + nhlog::crypto()->debug("Updated olm session: {}", + mtx::crypto::session_id(session->get())); + cache::saveOlmSession( + id, std::move(session.value()), QDateTime::currentMSecsSinceEpoch()); } catch (const mtx::crypto::olm_exception &e) { nhlog::crypto()->debug("failed to decrypt olm message ({}, {}) with {}: {}", msg.type, @@ -366,6 +369,8 @@ create_inbound_megolm_session(const mtx::events::DeviceEvent<mtx::events::msg::R nhlog::crypto()->info( "established inbound megolm session ({}, {})", roomKey.content.room_id, roomKey.sender); + + ChatPage::instance()->receivedSessionKey(index.room_id, index.session_id); } void @@ -389,9 +394,10 @@ import_inbound_megolm_session( return; } - // TODO(Nico): Reload messages encrypted with this key. nhlog::crypto()->info( "established inbound megolm session ({}, {})", roomKey.content.room_id, roomKey.sender); + + ChatPage::instance()->receivedSessionKey(index.room_id, index.session_id); } void @@ -402,48 +408,24 @@ mark_keys_as_published() } void -request_keys(const std::string &room_id, const std::string &event_id) -{ - nhlog::crypto()->info("requesting keys for event {} at {}", event_id, room_id); - - http::client()->get_event( - room_id, - event_id, - [event_id, room_id](const mtx::events::collections::TimelineEvents &res, - mtx::http::RequestErr err) { - using namespace mtx::events; - - if (err) { - nhlog::net()->warn( - "failed to retrieve event {} from {}", event_id, room_id); - return; - } - - if (!std::holds_alternative<EncryptedEvent<msg::Encrypted>>(res)) { - nhlog::net()->info( - "retrieved event is not encrypted: {} from {}", event_id, room_id); - return; - } - - olm::send_key_request_for(room_id, std::get<EncryptedEvent<msg::Encrypted>>(res)); - }); -} - -void -send_key_request_for(const std::string &room_id, - const mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> &e) +send_key_request_for(mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> e, + const std::string &request_id, + bool cancel) { using namespace mtx::events; - nhlog::crypto()->debug("sending key request: {}", json(e).dump(2)); + nhlog::crypto()->debug("sending key request: sender_key {}, session_id {}", + e.content.sender_key, + e.content.session_id); mtx::events::msg::KeyRequest request; - request.action = mtx::events::msg::RequestAction::Request; + request.action = !cancel ? mtx::events::msg::RequestAction::Request + : mtx::events::msg::RequestAction::Cancellation; request.algorithm = MEGOLM_ALGO; - request.room_id = room_id; + request.room_id = e.room_id; request.sender_key = e.content.sender_key; request.session_id = e.content.session_id; - request.request_id = "key_request." + http::client()->generate_txn_id(); + request.request_id = request_id; request.requesting_device_id = http::client()->device_id(); nhlog::crypto()->debug("m.room_key_request: {}", json(request).dump(2)); @@ -493,19 +475,18 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR nhlog::crypto()->warn("requested session not found in room: {}", req.content.room_id); - nhlog::crypto()->warn("requested session not found in room: {}", - req.content.room_id); - return; } // Check that the requested session_id and the one we have saved match. - const auto session = cache::getOutboundMegolmSession(req.content.room_id); - if (req.content.session_id != session.data.session_id) { - nhlog::crypto()->warn("session id of retrieved session doesn't match the request: " - "requested({}), ours({})", - req.content.session_id, - session.data.session_id); + MegolmSessionIndex index{}; + index.room_id = req.content.room_id; + index.session_id = req.content.session_id; + index.sender_key = olm::client()->identity_keys().curve25519; + + const auto session = cache::getInboundMegolmSession(index); + if (!session) { + nhlog::crypto()->warn("No session with id {} in db", req.content.session_id); return; } @@ -517,168 +498,56 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR return; } - if (!utils::respondsToKeyRequests(req.content.room_id)) { + // check if device is verified + auto verificationStatus = cache::verificationStatus(req.sender); + bool verifiedDevice = false; + if (verificationStatus && + ChatPage::instance()->userSettings()->shareKeysWithTrustedUsers()) { + for (const auto &dev : verificationStatus->verified_devices) { + if (dev == req.content.requesting_device_id) { + verifiedDevice = true; + nhlog::crypto()->debug("Verified device: {}", dev); + break; + } + } + } + + if (!utils::respondsToKeyRequests(req.content.room_id) && !verifiedDevice) { nhlog::crypto()->debug("ignoring all key requests for room {}", req.content.room_id); return; } + auto session_key = mtx::crypto::export_session(session); // // Prepare the m.room_key event. // - auto payload = json{{"algorithm", "m.megolm.v1.aes-sha2"}, - {"room_id", req.content.room_id}, - {"session_id", req.content.session_id}, - {"session_key", session.data.session_key}}; - - send_megolm_key_to_device(req.sender, req.content.requesting_device_id, payload); + mtx::events::msg::ForwardedRoomKey forward_key{}; + forward_key.algorithm = MEGOLM_ALGO; + forward_key.room_id = index.room_id; + forward_key.session_id = index.session_id; + forward_key.session_key = session_key; + forward_key.sender_key = index.sender_key; + + // TODO(Nico): Figure out if this is correct + forward_key.sender_claimed_ed25519_key = olm::client()->identity_keys().ed25519; + forward_key.forwarding_curve25519_key_chain = {}; + + send_megolm_key_to_device(req.sender, req.content.requesting_device_id, forward_key); } void send_megolm_key_to_device(const std::string &user_id, const std::string &device_id, - const json &payload) + const mtx::events::msg::ForwardedRoomKey &payload) { - mtx::requests::QueryKeys req; - req.device_keys[user_id] = {device_id}; - - http::client()->query_keys( - req, - [payload, user_id, device_id](const mtx::responses::QueryKeys &res, - mtx::http::RequestErr err) { - if (err) { - nhlog::net()->warn("failed to query device keys: {} {}", - err->matrix_error.error, - static_cast<int>(err->status_code)); - return; - } - - nhlog::net()->warn("retrieved device keys from {}, {}", user_id, device_id); - - if (res.device_keys.empty()) { - nhlog::net()->warn("no devices retrieved {}", user_id); - return; - } - - auto device = res.device_keys.begin()->second; - if (device.empty()) { - nhlog::net()->warn("no keys retrieved from user, device {}", user_id); - return; - } - - const auto device_keys = device.begin()->second.keys; - const auto curveKey = "curve25519:" + device_id; - const auto edKey = "ed25519:" + device_id; - - if ((device_keys.find(curveKey) == device_keys.end()) || - (device_keys.find(edKey) == device_keys.end())) { - nhlog::net()->debug("ignoring malformed keys for device {}", device_id); - return; - } + mtx::events::DeviceEvent<mtx::events::msg::ForwardedRoomKey> room_key; + room_key.content = payload; + room_key.type = mtx::events::EventType::ForwardedRoomKey; - DevicePublicKeys pks; - pks.ed25519 = device_keys.at(edKey); - pks.curve25519 = device_keys.at(curveKey); - - try { - if (!mtx::crypto::verify_identity_signature(json(device.begin()->second), - DeviceId(device_id), - UserId(user_id))) { - nhlog::crypto()->warn("failed to verify identity keys: {}", - json(device).dump(2)); - return; - } - } catch (const json::exception &e) { - nhlog::crypto()->warn("failed to parse device key json: {}", e.what()); - return; - } catch (const mtx::crypto::olm_exception &e) { - nhlog::crypto()->warn("failed to verify device key json: {}", e.what()); - return; - } - - auto room_key = olm::client() - ->create_room_key_event(UserId(user_id), pks.ed25519, payload) - .dump(); - - mtx::requests::ClaimKeys claim_keys; - claim_keys.one_time_keys[user_id][device_id] = mtx::crypto::SIGNED_CURVE25519; - - http::client()->claim_keys( - claim_keys, - [room_key, user_id, device_id, pks](const mtx::responses::ClaimKeys &res, - mtx::http::RequestErr err) { - if (err) { - nhlog::net()->warn("claim keys error: {} {} {}", - err->matrix_error.error, - err->parse_error, - static_cast<int>(err->status_code)); - return; - } - - nhlog::net()->info("claimed keys for {}", user_id); - - if (res.one_time_keys.size() == 0) { - nhlog::net()->info("no one-time keys found for user_id: {}", - user_id); - return; - } - - if (res.one_time_keys.find(user_id) == res.one_time_keys.end()) { - nhlog::net()->info("no one-time keys found for user_id: {}", - user_id); - return; - } - - auto retrieved_devices = res.one_time_keys.at(user_id); - if (retrieved_devices.empty()) { - nhlog::net()->info("claiming keys for {}: no retrieved devices", - device_id); - return; - } - - json body; - body["messages"][user_id] = json::object(); - - auto device = retrieved_devices.begin()->second; - nhlog::net()->debug("{} : \n {}", device_id, device.dump(2)); - - json device_msg; - - try { - auto olm_session = olm::client()->create_outbound_session( - pks.curve25519, device.begin()->at("key")); - - device_msg = olm::client()->create_olm_encrypted_content( - olm_session.get(), room_key, pks.curve25519); - - cache::saveOlmSession(pks.curve25519, std::move(olm_session)); - } catch (const json::exception &e) { - nhlog::crypto()->warn("creating outbound session: {}", - e.what()); - return; - } catch (const mtx::crypto::olm_exception &e) { - nhlog::crypto()->warn("creating outbound session: {}", - e.what()); - return; - } - - body["messages"][user_id][device_id] = device_msg; - - nhlog::net()->info( - "sending m.room_key event to {}:{}", user_id, device_id); - http::client()->send_to_device( - "m.room.encrypted", body, [user_id](mtx::http::RequestErr err) { - if (err) { - nhlog::net()->warn("failed to send " - "send_to_device " - "message: {}", - err->matrix_error.error); - } - - nhlog::net()->info("m.room_key send to {}", user_id); - }); - }); - }); + std::map<std::string, std::vector<std::string>> targets; + targets[user_id] = {device_id}; + send_encrypted_to_device_messages(targets, room_key); } DecryptionResult @@ -727,4 +596,258 @@ decryptEvent(const MegolmSessionIndex &index, return {std::nullopt, std::nullopt, std::move(te.data)}; } + +//! Send encrypted to device messages, targets is a map from userid to device ids or {} for all +//! devices +void +send_encrypted_to_device_messages(const std::map<std::string, std::vector<std::string>> targets, + const mtx::events::collections::DeviceEvents &event, + bool force_new_session) +{ + nlohmann::json ev_json = std::visit([](const auto &e) { return json(e); }, event); + + std::map<std::string, std::vector<std::string>> keysToQuery; + mtx::requests::ClaimKeys claims; + std::map<mtx::identifiers::User, std::map<std::string, mtx::events::msg::OlmEncrypted>> + messages; + std::map<std::string, std::map<std::string, DevicePublicKeys>> pks; + + for (const auto &[user, devices] : targets) { + auto deviceKeys = cache::client()->userKeys(user); + + // no keys for user, query them + if (!deviceKeys) { + keysToQuery[user] = devices; + continue; + } + + auto deviceTargets = devices; + if (devices.empty()) { + deviceTargets.clear(); + for (const auto &[device, keys] : deviceKeys->device_keys) { + (void)keys; + deviceTargets.push_back(device); + } + } + + for (const auto &device : deviceTargets) { + if (!deviceKeys->device_keys.count(device)) { + keysToQuery[user] = {}; + break; + } + + auto d = deviceKeys->device_keys.at(device); + + auto session = + cache::getLatestOlmSession(d.keys.at("curve25519:" + device)); + if (!session || force_new_session) { + claims.one_time_keys[user][device] = mtx::crypto::SIGNED_CURVE25519; + pks[user][device].ed25519 = d.keys.at("ed25519:" + device); + pks[user][device].curve25519 = d.keys.at("curve25519:" + device); + continue; + } + + messages[mtx::identifiers::parse<mtx::identifiers::User>(user)][device] = + olm::client() + ->create_olm_encrypted_content(session->get(), + ev_json, + UserId(user), + d.keys.at("ed25519:" + device), + d.keys.at("curve25519:" + device)) + .get<mtx::events::msg::OlmEncrypted>(); + + try { + nhlog::crypto()->debug("Updated olm session: {}", + mtx::crypto::session_id(session->get())); + cache::saveOlmSession(d.keys.at("curve25519:" + device), + std::move(*session), + QDateTime::currentMSecsSinceEpoch()); + } catch (const lmdb::error &e) { + nhlog::db()->critical("failed to save outbound olm session: {}", + e.what()); + } catch (const mtx::crypto::olm_exception &e) { + nhlog::crypto()->critical( + "failed to pickle outbound olm session: {}", e.what()); + } + } + } + + if (!messages.empty()) + http::client()->send_to_device<mtx::events::msg::OlmEncrypted>( + http::client()->generate_txn_id(), messages, [](mtx::http::RequestErr err) { + if (err) { + nhlog::net()->warn("failed to send " + "send_to_device " + "message: {}", + err->matrix_error.error); + } + }); + + auto BindPks = [ev_json](decltype(pks) pks_temp) { + return [pks = pks_temp, ev_json](const mtx::responses::ClaimKeys &res, + mtx::http::RequestErr) { + std::map<mtx::identifiers::User, + std::map<std::string, mtx::events::msg::OlmEncrypted>> + messages; + for (const auto &[user_id, retrieved_devices] : res.one_time_keys) { + nhlog::net()->debug("claimed keys for {}", user_id); + if (retrieved_devices.size() == 0) { + nhlog::net()->debug( + "no one-time keys found for user_id: {}", user_id); + continue; + } + + for (const auto &rd : retrieved_devices) { + const auto device_id = rd.first; + + nhlog::net()->debug( + "{} : \n {}", device_id, rd.second.dump(2)); + + if (rd.second.empty() || + !rd.second.begin()->contains("key")) { + nhlog::net()->warn( + "Skipping device {} as it has no key.", + device_id); + continue; + } + + // TODO: Verify signatures + auto otk = rd.second.begin()->at("key"); + + auto id_key = pks.at(user_id).at(device_id).curve25519; + auto session = + olm::client()->create_outbound_session(id_key, otk); + + messages[mtx::identifiers::parse<mtx::identifiers::User>( + user_id)][device_id] = + olm::client() + ->create_olm_encrypted_content( + session.get(), + ev_json, + UserId(user_id), + pks.at(user_id).at(device_id).ed25519, + id_key) + .get<mtx::events::msg::OlmEncrypted>(); + + try { + nhlog::crypto()->debug( + "Updated olm session: {}", + mtx::crypto::session_id(session.get())); + cache::saveOlmSession( + id_key, + std::move(session), + QDateTime::currentMSecsSinceEpoch()); + } catch (const lmdb::error &e) { + nhlog::db()->critical( + "failed to save outbound olm session: {}", + e.what()); + } catch (const mtx::crypto::olm_exception &e) { + nhlog::crypto()->critical( + "failed to pickle outbound olm session: {}", + e.what()); + } + } + nhlog::net()->info("send_to_device: {}", user_id); + } + + if (!messages.empty()) + http::client()->send_to_device<mtx::events::msg::OlmEncrypted>( + http::client()->generate_txn_id(), + messages, + [](mtx::http::RequestErr err) { + if (err) { + nhlog::net()->warn("failed to send " + "send_to_device " + "message: {}", + err->matrix_error.error); + } + }); + }; + }; + + http::client()->claim_keys(claims, BindPks(pks)); + + if (!keysToQuery.empty()) { + mtx::requests::QueryKeys req; + req.device_keys = keysToQuery; + http::client()->query_keys( + req, + [ev_json, BindPks](const mtx::responses::QueryKeys &res, + mtx::http::RequestErr err) { + if (err) { + nhlog::net()->warn("failed to query device keys: {} {}", + err->matrix_error.error, + static_cast<int>(err->status_code)); + return; + } + + nhlog::net()->info("queried keys"); + + cache::client()->updateUserKeys(cache::nextBatchToken(), res); + + mtx::requests::ClaimKeys claim_keys; + + std::map<std::string, std::map<std::string, DevicePublicKeys>> deviceKeys; + + for (const auto &user : res.device_keys) { + for (const auto &dev : user.second) { + const auto user_id = ::UserId(dev.second.user_id); + const auto device_id = DeviceId(dev.second.device_id); + + if (user_id.get() == + http::client()->user_id().to_string() && + device_id.get() == http::client()->device_id()) + continue; + + const auto device_keys = dev.second.keys; + const auto curveKey = "curve25519:" + device_id.get(); + const auto edKey = "ed25519:" + device_id.get(); + + if ((device_keys.find(curveKey) == device_keys.end()) || + (device_keys.find(edKey) == device_keys.end())) { + nhlog::net()->debug( + "ignoring malformed keys for device {}", + device_id.get()); + continue; + } + + DevicePublicKeys pks; + pks.ed25519 = device_keys.at(edKey); + pks.curve25519 = device_keys.at(curveKey); + + try { + if (!mtx::crypto::verify_identity_signature( + dev.second, device_id, user_id)) { + nhlog::crypto()->warn( + "failed to verify identity keys: {}", + json(dev.second).dump(2)); + continue; + } + } catch (const json::exception &e) { + nhlog::crypto()->warn( + "failed to parse device key json: {}", + e.what()); + continue; + } catch (const mtx::crypto::olm_exception &e) { + nhlog::crypto()->warn( + "failed to verify device key json: {}", + e.what()); + continue; + } + + deviceKeys[user_id].emplace(device_id, pks); + claim_keys.one_time_keys[user.first][device_id] = + mtx::crypto::SIGNED_CURVE25519; + + nhlog::net()->info("{}", device_id.get()); + nhlog::net()->info(" curve25519 {}", pks.curve25519); + nhlog::net()->info(" ed25519 {}", pks.ed25519); + } + } + + http::client()->claim_keys(claim_keys, BindPks(deviceKeys)); + }); + } +} + } // namespace olm diff --git a/src/Olm.h b/src/Olm.h
index 7b97039b..322affa1 100644 --- a/src/Olm.h +++ b/src/Olm.h
@@ -96,11 +96,9 @@ mark_keys_as_published(); //! Request the encryption keys from sender's device for the given event. void -request_keys(const std::string &room_id, const std::string &event_id); - -void -send_key_request_for(const std::string &room_id, - const mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> &); +send_key_request_for(mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> e, + const std::string &request_id, + bool cancel = false); void handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyRequest> &); @@ -108,6 +106,13 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR void send_megolm_key_to_device(const std::string &user_id, const std::string &device_id, - const json &payload); + const mtx::events::msg::ForwardedRoomKey &payload); + +//! Send encrypted to device messages, targets is a map from userid to device ids or {} for all +//! devices +void +send_encrypted_to_device_messages(const std::map<std::string, std::vector<std::string>> targets, + const mtx::events::collections::DeviceEvents &event, + bool force_new_session = false); } // namespace olm diff --git a/src/RoomInfoListItem.cpp b/src/RoomInfoListItem.cpp
index f234b59b..985ab1b9 100644 --- a/src/RoomInfoListItem.cpp +++ b/src/RoomInfoListItem.cpp
@@ -203,10 +203,7 @@ RoomInfoListItem::init(QWidget *parent) }); } -RoomInfoListItem::RoomInfoListItem(QString room_id, - const RoomInfo &info, - QSharedPointer<UserSettings> userSettings, - QWidget *parent) +RoomInfoListItem::RoomInfoListItem(QString room_id, const RoomInfo &info, QWidget *parent) : QWidget(parent) , roomType_{info.is_invite ? RoomType::Invited : RoomType::Joined} , roomId_(std::move(room_id)) @@ -214,7 +211,6 @@ RoomInfoListItem::RoomInfoListItem(QString room_id, , isPressed_(false) , unreadMsgCount_(0) , unreadHighlightedMsgCount_(0) - , settings(userSettings) { init(parent); } @@ -451,7 +447,7 @@ RoomInfoListItem::calculateImportance() const // returns ImportanceDisabled or Invite if (isInvite()) { return Invite; - } else if (!settings->sortByImportance()) { + } else if (!ChatPage::instance()->userSettings()->sortByImportance()) { return ImportanceDisabled; } else if (unreadHighlightedMsgCount_) { return NewMentions; diff --git a/src/RoomInfoListItem.h b/src/RoomInfoListItem.h
index e609f4d8..da5a1bc4 100644 --- a/src/RoomInfoListItem.h +++ b/src/RoomInfoListItem.h
@@ -64,10 +64,7 @@ class RoomInfoListItem : public QWidget Q_PROPERTY(QColor btnTextColor READ btnTextColor WRITE setBtnTextColor) public: - RoomInfoListItem(QString room_id, - const RoomInfo &info, - QSharedPointer<UserSettings> userSettings, - QWidget *parent = nullptr); + RoomInfoListItem(QString room_id, const RoomInfo &info, QWidget *parent = nullptr); void updateUnreadMessageCount(int count, int highlightedCount); void clearUnreadMessageCount() { updateUnreadMessageCount(0, 0); }; @@ -220,6 +217,4 @@ private: QColor bubbleBgColor_; QColor bubbleFgColor_; - - QSharedPointer<UserSettings> settings; }; diff --git a/src/RoomList.cpp b/src/RoomList.cpp
index b4c507b5..8c9e296f 100644 --- a/src/RoomList.cpp +++ b/src/RoomList.cpp
@@ -35,7 +35,6 @@ RoomList::RoomList(QSharedPointer<UserSettings> userSettings, QWidget *parent) : QWidget(parent) - , settings(userSettings) { topLayout_ = new QVBoxLayout(this); topLayout_->setSpacing(0); @@ -76,7 +75,7 @@ RoomList::RoomList(QSharedPointer<UserSettings> userSettings, QWidget *parent) void RoomList::addRoom(const QString &room_id, const RoomInfo &info) { - auto room_item = new RoomInfoListItem(room_id, info, settings, scrollArea_); + auto room_item = new RoomInfoListItem(room_id, info, scrollArea_); room_item->setRoomName(QString::fromStdString(std::move(info.name))); connect(room_item, &RoomInfoListItem::clicked, this, &RoomList::highlightSelectedRoom); @@ -84,7 +83,7 @@ RoomList::addRoom(const QString &room_id, const RoomInfo &info) MainWindow::instance()->openLeaveRoomDialog(room_id); }); - QSharedPointer<RoomInfoListItem> roomWidget(room_item); + QSharedPointer<RoomInfoListItem> roomWidget(room_item, &QObject::deleteLater); rooms_.emplace(room_id, roomWidget); rooms_sort_cache_.push_back(roomWidget); @@ -164,11 +163,6 @@ RoomList::initialize(const QMap<QString, RoomInfo> &info) // prevent flickering and save time sorting over and over again setUpdatesEnabled(false); - disconnect(settings.data(), - &UserSettings::roomSortingChanged, - this, - &RoomList::sortRoomsByLastMessage); - for (auto it = info.begin(); it != info.end(); it++) { if (it.value().is_invite) addInvitedRoom(it.key(), it.value()); @@ -179,10 +173,6 @@ RoomList::initialize(const QMap<QString, RoomInfo> &info) for (auto it = info.begin(); it != info.end(); it++) updateRoomDescription(it.key(), it.value().msgInfo); - connect(settings.data(), - &UserSettings::roomSortingChanged, - this, - &RoomList::sortRoomsByLastMessage); setUpdatesEnabled(true); if (rooms_.empty()) @@ -505,7 +495,7 @@ RoomList::updateRoom(const QString &room_id, const RoomInfo &info) void RoomList::addInvitedRoom(const QString &room_id, const RoomInfo &info) { - auto room_item = new RoomInfoListItem(room_id, info, settings, scrollArea_); + auto room_item = new RoomInfoListItem(room_id, info, scrollArea_); connect(room_item, &RoomInfoListItem::acceptInvite, this, &RoomList::acceptInvite); connect(room_item, &RoomInfoListItem::declineInvite, this, &RoomList::declineInvite); diff --git a/src/RoomList.h b/src/RoomList.h
index d3470666..d50c7de1 100644 --- a/src/RoomList.h +++ b/src/RoomList.h
@@ -104,5 +104,4 @@ private: QString selectedRoom_; bool isSortPending_ = false; - QSharedPointer<UserSettings> settings; }; diff --git a/src/TextInputWidget.cpp b/src/TextInputWidget.cpp
index 22e8aafc..e6a10f0a 100644 --- a/src/TextInputWidget.cpp +++ b/src/TextInputWidget.cpp
@@ -165,6 +165,9 @@ FilteredTextEdit::keyPressEvent(QKeyEvent *event) MacHelper::showEmojiWindow(); #endif + if (event->modifiers() == Qt::ControlModifier && event->key() == Qt::Key_U) + QTextEdit::setText(""); + if (!isModifier) { if (!typingTimer_->isActive()) emit startedTyping(); diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp
index f04193c9..308ec9a2 100644 --- a/src/UserSettingsPage.cpp +++ b/src/UserSettingsPage.cpp
@@ -17,7 +17,9 @@ #include <QApplication> #include <QComboBox> +#include <QCoreApplication> #include <QFileDialog> +#include <QFontComboBox> #include <QFormLayout> #include <QInputDialog> #include <QLabel> @@ -73,8 +75,11 @@ UserSettings::load() font_ = settings.value("user/font_family", "default").toString(); avatarCircles_ = settings.value("user/avatar_circles", true).toBool(); decryptSidebar_ = settings.value("user/decrypt_sidebar", true).toBool(); - emojiFont_ = settings.value("user/emoji_font_family", "default").toString(); - baseFontSize_ = settings.value("user/font_size", QFont().pointSizeF()).toDouble(); + shareKeysWithTrustedUsers_ = + settings.value("user/share_keys_with_trusted_users", true).toBool(); + mobileMode_ = settings.value("user/mobile_mode", false).toBool(); + emojiFont_ = settings.value("user/emoji_font_family", "default").toString(); + baseFontSize_ = settings.value("user/font_size", QFont().pointSizeF()).toDouble(); presence_ = settings.value("user/presence", QVariant::fromValue(Presence::AutomaticPresence)) .value<Presence>(); @@ -125,6 +130,16 @@ UserSettings::setStartInTray(bool state) } void +UserSettings::setMobileMode(bool state) +{ + if (state == mobileMode_) + return; + mobileMode_ = state; + emit mobileModeChanged(state); + save(); +} + +void UserSettings::setGroupView(bool state) { if (groupView_ != state) @@ -296,6 +311,17 @@ UserSettings::setUseStunServer(bool useStunServer) } void +UserSettings::setShareKeysWithTrustedUsers(bool shareKeys) +{ + if (shareKeys == shareKeysWithTrustedUsers_) + return; + + shareKeysWithTrustedUsers_ = shareKeys; + emit shareKeysWithTrustedUsersChanged(shareKeys); + save(); +} + +void UserSettings::setMicrophone(QString microphone) { if (microphone == microphone_) @@ -347,17 +373,18 @@ UserSettings::applyTheme() /*windowText*/ QColor("#333"), /*button*/ QColor("#333"), /*light*/ QColor(0xef, 0xef, 0xef), - /*dark*/ QColor(220, 220, 220), - /*mid*/ QColor(110, 110, 110), + /*dark*/ QColor(110, 110, 110), + /*mid*/ QColor(220, 220, 220), /*text*/ QColor("#333"), /*bright_text*/ QColor("#333"), - /*base*/ QColor("#eee"), + /*base*/ QColor("#fff"), /*window*/ QColor("white")); + lightActive.setColor(QPalette::AlternateBase, QColor("#eee")); lightActive.setColor(QPalette::Highlight, QColor("#38a3d8")); lightActive.setColor(QPalette::ToolTipBase, lightActive.base().color()); lightActive.setColor(QPalette::ToolTipText, lightActive.text().color()); lightActive.setColor(QPalette::Link, QColor("#0077b5")); - lightActive.setColor(QPalette::ButtonText, QColor(Qt::gray)); + lightActive.setColor(QPalette::ButtonText, QColor("#495057")); QApplication::setPalette(lightActive); } else if (this->theme() == "dark") { stylefile.setFileName(":/styles/styles/nheko-dark.qss"); @@ -365,17 +392,18 @@ UserSettings::applyTheme() /*windowText*/ QColor("#caccd1"), /*button*/ QColor(0xff, 0xff, 0xff), /*light*/ QColor("#caccd1"), - /*dark*/ QColor("#2d3139"), - /*mid*/ QColor(110, 110, 110), + /*dark*/ QColor(110, 110, 110), + /*mid*/ QColor("#202228"), /*text*/ QColor("#caccd1"), /*bright_text*/ QColor(0xff, 0xff, 0xff), - /*base*/ QColor("#2d3139"), - /*window*/ QColor("#202228")); + /*base*/ QColor("#202228"), + /*window*/ QColor("#2d3139")); + darkActive.setColor(QPalette::AlternateBase, QColor("#2d3139")); darkActive.setColor(QPalette::Highlight, QColor("#38a3d8")); darkActive.setColor(QPalette::ToolTipBase, darkActive.base().color()); darkActive.setColor(QPalette::ToolTipText, darkActive.text().color()); darkActive.setColor(QPalette::Link, QColor("#38a3d8")); - darkActive.setColor(QPalette::ButtonText, QColor(0x90, 0x90, 0x90)); + darkActive.setColor(QPalette::ButtonText, "#727274"); QApplication::setPalette(darkActive); } else { stylefile.setFileName(":/styles/styles/system.qss"); @@ -408,6 +436,8 @@ UserSettings::save() settings.setValue("avatar_circles", avatarCircles_); settings.setValue("decrypt_sidebar", decryptSidebar_); + settings.setValue("share_keys_with_trusted_users", shareKeysWithTrustedUsers_); + settings.setValue("mobile_mode", mobileMode_); settings.setValue("font_size", baseFontSize_); settings.setValue("typing_notifications", typingNotifications_); settings.setValue("minor_events", sortByImportance_); @@ -456,6 +486,9 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge font.setPointSizeF(font.pointSizeF() * 1.1); auto versionInfo = new QLabel(QString("%1 | %2").arg(nheko::version).arg(nheko::build_os)); + if (QCoreApplication::applicationName() != "nheko") + versionInfo->setText(versionInfo->text() + " | " + + tr("profile: %1").arg(QCoreApplication::applicationName())); versionInfo->setTextInteractionFlags(Qt::TextBrowserInteraction); topBarLayout_ = new QHBoxLayout; @@ -476,30 +509,32 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge general_->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed); general_->setFont(font); - trayToggle_ = new Toggle{this}; - startInTrayToggle_ = new Toggle{this}; - avatarCircles_ = new Toggle{this}; - decryptSidebar_ = new Toggle(this); - groupViewToggle_ = new Toggle{this}; - timelineButtonsToggle_ = new Toggle{this}; - typingNotifications_ = new Toggle{this}; - messageHoverHighlight_ = new Toggle{this}; - enlargeEmojiOnlyMessages_ = new Toggle{this}; - sortByImportance_ = new Toggle{this}; - readReceipts_ = new Toggle{this}; - markdown_ = new Toggle{this}; - desktopNotifications_ = new Toggle{this}; - alertOnNotification_ = new Toggle{this}; - useStunServer_ = new Toggle{this}; - scaleFactorCombo_ = new QComboBox{this}; - fontSizeCombo_ = new QComboBox{this}; - fontSelectionCombo_ = new QComboBox{this}; - emojiFontSelectionCombo_ = new QComboBox{this}; - microphoneCombo_ = new QComboBox{this}; - cameraCombo_ = new QComboBox{this}; - cameraResolutionCombo_ = new QComboBox{this}; - cameraFrameRateCombo_ = new QComboBox{this}; - timelineMaxWidthSpin_ = new QSpinBox{this}; + trayToggle_ = new Toggle{this}; + startInTrayToggle_ = new Toggle{this}; + avatarCircles_ = new Toggle{this}; + decryptSidebar_ = new Toggle(this); + shareKeysWithTrustedUsers_ = new Toggle(this); + groupViewToggle_ = new Toggle{this}; + timelineButtonsToggle_ = new Toggle{this}; + typingNotifications_ = new Toggle{this}; + messageHoverHighlight_ = new Toggle{this}; + enlargeEmojiOnlyMessages_ = new Toggle{this}; + sortByImportance_ = new Toggle{this}; + readReceipts_ = new Toggle{this}; + markdown_ = new Toggle{this}; + desktopNotifications_ = new Toggle{this}; + alertOnNotification_ = new Toggle{this}; + useStunServer_ = new Toggle{this}; + mobileMode_ = new Toggle{this}; + scaleFactorCombo_ = new QComboBox{this}; + fontSizeCombo_ = new QComboBox{this}; + fontSelectionCombo_ = new QFontComboBox{this}; + emojiFontSelectionCombo_ = new QComboBox{this}; + microphoneCombo_ = new QComboBox{this}; + cameraCombo_ = new QComboBox{this}; + cameraResolutionCombo_ = new QComboBox{this}; + cameraFrameRateCombo_ = new QComboBox{this}; + timelineMaxWidthSpin_ = new QSpinBox{this}; if (!settings_->tray()) startInTrayToggle_->setDisabled(true); @@ -517,10 +552,6 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge fontSizeCombo_->addItem(QString("%1 ").arg(QString::number(option))); QFontDatabase fontDb; - auto fontFamilies = fontDb.families(); - for (const auto &family : fontFamilies) { - fontSelectionCombo_->addItem(family); - } // TODO: Is there a way to limit to just emojis, rather than // all emoji fonts? @@ -666,6 +697,9 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge formLayout_->addRow(uiLabel_); formLayout_->addRow(new HorizontalLine{this}); + boxWrap(tr("Mobile mode"), + mobileMode_, + tr("Will prevent text selection in the timeline to make scrolling easier.")); #if !defined(Q_OS_MAC) boxWrap(tr("Scale factor"), scaleFactorCombo_, @@ -702,6 +736,10 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge formLayout_->addRow(new HorizontalLine{this}); boxWrap(tr("Device ID"), deviceIdValue_); boxWrap(tr("Device Fingerprint"), deviceFingerprintValue_); + boxWrap( + tr("Share keys with trusted users"), + shareKeysWithTrustedUsers_, + tr("Automatically replies to key requests from other users, if they are verified.")); formLayout_->addRow(new HorizontalLine{this}); formLayout_->addRow(sessionKeysLabel, sessionKeysLayout); @@ -793,6 +831,10 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge settings_->setStartInTray(!disabled); }); + connect(mobileMode_, &Toggle::toggled, this, [this](bool disabled) { + settings_->setMobileMode(!disabled); + }); + connect(groupViewToggle_, &Toggle::toggled, this, [this](bool disabled) { settings_->setGroupView(!disabled); }); @@ -802,6 +844,10 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge emit decryptSidebarChanged(); }); + connect(shareKeysWithTrustedUsers_, &Toggle::toggled, this, [this](bool disabled) { + settings_->setShareKeysWithTrustedUsers(!disabled); + }); + connect(avatarCircles_, &Toggle::toggled, this, [this](bool disabled) { settings_->setAvatarCircles(!disabled); }); @@ -876,10 +922,12 @@ UserSettingsPage::showEvent(QShowEvent *) startInTrayToggle_->setState(!settings_->startInTray()); groupViewToggle_->setState(!settings_->groupView()); decryptSidebar_->setState(!settings_->decryptSidebar()); + shareKeysWithTrustedUsers_->setState(!settings_->shareKeysWithTrustedUsers()); avatarCircles_->setState(!settings_->avatarCircles()); typingNotifications_->setState(!settings_->typingNotifications()); sortByImportance_->setState(!settings_->sortByImportance()); timelineButtonsToggle_->setState(!settings_->buttonsInTimeline()); + mobileMode_->setState(!settings_->mobileMode()); readReceipts_->setState(!settings_->readReceipts()); markdown_->setState(!settings_->markdown()); desktopNotifications_->setState(!settings_->hasDesktopNotifications()); diff --git a/src/UserSettingsPage.h b/src/UserSettingsPage.h
index 9d291303..0bd0ac84 100644 --- a/src/UserSettingsPage.h +++ b/src/UserSettingsPage.h
@@ -27,6 +27,7 @@ class Toggle; class QLabel; class QFormLayout; class QComboBox; +class QFontComboBox; class QSpinBox; class QHBoxLayout; class QVBoxLayout; @@ -66,19 +67,22 @@ class UserSettings : public QObject decryptSidebarChanged) Q_PROPERTY(int timelineMaxWidth READ timelineMaxWidth WRITE setTimelineMaxWidth NOTIFY timelineMaxWidthChanged) + Q_PROPERTY(bool mobileMode READ mobileMode WRITE setMobileMode NOTIFY mobileModeChanged) Q_PROPERTY(double fontSize READ fontSize WRITE setFontSize NOTIFY fontSizeChanged) Q_PROPERTY(QString font READ font WRITE setFontFamily NOTIFY fontChanged) Q_PROPERTY( QString emojiFont READ emojiFont WRITE setEmojiFontFamily NOTIFY emojiFontChanged) Q_PROPERTY(Presence presence READ presence WRITE setPresence NOTIFY presenceChanged) - Q_PROPERTY( - bool useStunServer READ useStunServer WRITE setUseStunServer NOTIFY useStunServerChanged) Q_PROPERTY(QString microphone READ microphone WRITE setMicrophone NOTIFY microphoneChanged) Q_PROPERTY(QString camera READ camera WRITE setCamera NOTIFY cameraChanged) Q_PROPERTY(QString cameraResolution READ cameraResolution WRITE setCameraResolution NOTIFY cameraResolutionChanged) Q_PROPERTY(QString cameraFrameRate READ cameraFrameRate WRITE setCameraFrameRate NOTIFY cameraFrameRateChanged) + Q_PROPERTY( + bool useStunServer READ useStunServer WRITE setUseStunServer NOTIFY useStunServerChanged) + Q_PROPERTY(bool shareKeysWithTrustedUsers READ shareKeysWithTrustedUsers WRITE + setShareKeysWithTrustedUsers NOTIFY shareKeysWithTrustedUsersChanged) public: UserSettings(); @@ -100,6 +104,7 @@ public: void setEnlargeEmojiOnlyMessages(bool state); void setTray(bool state); void setStartInTray(bool state); + void setMobileMode(bool mode); void setFontSize(double size); void setFontFamily(QString family); void setEmojiFontFamily(QString family); @@ -120,6 +125,7 @@ public: void setCameraResolution(QString resolution); void setCameraFrameRate(QString frameRate); void setUseStunServer(bool state); + void setShareKeysWithTrustedUsers(bool state); QString theme() const { return !theme_.isEmpty() ? theme_ : defaultTheme_; } bool messageHoverHighlight() const { return messageHoverHighlight_; } @@ -133,6 +139,7 @@ public: bool typingNotifications() const { return typingNotifications_; } bool sortByImportance() const { return sortByImportance_; } bool buttonsInTimeline() const { return buttonsInTimeline_; } + bool mobileMode() const { return mobileMode_; } bool readReceipts() const { return readReceipts_; } bool hasDesktopNotifications() const { return hasDesktopNotifications_; } bool hasAlertOnNotification() const { return hasAlertOnNotification_; } @@ -150,6 +157,7 @@ public: QString cameraResolution() const { return cameraResolution_; } QString cameraFrameRate() const { return cameraFrameRate_; } bool useStunServer() const { return useStunServer_; } + bool shareKeysWithTrustedUsers() const { return shareKeysWithTrustedUsers_; } signals: void groupViewStateChanged(bool state); @@ -168,6 +176,7 @@ signals: void avatarCirclesChanged(bool state); void decryptSidebarChanged(bool state); void timelineMaxWidthChanged(int state); + void mobileModeChanged(bool mode); void fontSizeChanged(double state); void fontChanged(QString state); void emojiFontChanged(QString state); @@ -177,6 +186,7 @@ signals: void cameraResolutionChanged(QString resolution); void cameraFrameRateChanged(QString frameRate); void useStunServerChanged(bool state); + void shareKeysWithTrustedUsersChanged(bool state); private: // Default to system theme if QT_QPA_PLATFORMTHEME var is set. @@ -199,6 +209,8 @@ private: bool hasAlertOnNotification_; bool avatarCircles_; bool decryptSidebar_; + bool shareKeysWithTrustedUsers_; + bool mobileMode_; int timelineMaxWidth_; double baseFontSize_; QString font_; @@ -264,13 +276,15 @@ private: Toggle *avatarCircles_; Toggle *useStunServer_; Toggle *decryptSidebar_; + Toggle *shareKeysWithTrustedUsers_; + Toggle *mobileMode_; QLabel *deviceFingerprintValue_; QLabel *deviceIdValue_; QComboBox *themeCombo_; QComboBox *scaleFactorCombo_; QComboBox *fontSizeCombo_; - QComboBox *fontSelectionCombo_; + QFontComboBox *fontSelectionCombo_; QComboBox *emojiFontSelectionCombo_; QComboBox *microphoneCombo_; QComboBox *cameraCombo_; diff --git a/src/main.cpp b/src/main.cpp
index e02ffa36..6fbccf5c 100644 --- a/src/main.cpp +++ b/src/main.cpp
@@ -104,10 +104,32 @@ createCacheDirectory() int main(int argc, char *argv[]) { - // needed for settings so need to register before any settings are read to prevent warings + // needed for settings so need to register before any settings are read to prevent warnings qRegisterMetaType<UserSettings::Presence>(); - QCoreApplication::setApplicationName("nheko"); + // This is some hacky programming, but it's necessary (AFAIK?) to get the unique config name + // parsed before the app name is set. + QString appName{"nheko"}; + for (int i = 0; i < argc; ++i) { + if (QString{argv[i]}.startsWith("--profile=")) { + QString q{argv[i]}; + q.remove("--profile="); + appName += "-" + q; + } else if (QString{argv[i]}.startsWith("--p=")) { + QString q{argv[i]}; + q.remove("-p="); + appName += "-" + q; + } else if (QString{argv[i]} == "--profile" || QString{argv[i]} == "-p") { + if (i < argc - 1) // if i is less than argc - 1, we still have a parameter + // left to process as the name + { + ++i; // the next arg is the name, so increment + appName += "-" + QString{argv[i]}; + } + } + } + + QCoreApplication::setApplicationName(appName); QCoreApplication::setApplicationVersion(nheko::version); QCoreApplication::setOrganizationName("nheko"); QCoreApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); @@ -137,6 +159,19 @@ main(int argc, char *argv[]) parser.addVersionOption(); QCommandLineOption debugOption("debug", "Enable debug output"); parser.addOption(debugOption); + + // This option is not actually parsed via Qt due to the need to parse it before the app + // name is set. It only exists to keep Qt from complaining about the --profile/-p + // option and thereby crashing the app. + QCommandLineOption configName( + QStringList() << "p" + << "profile", + QCoreApplication::tr("Create a unique profile, which allows you to log into several " + "accounts at the same time and start multiple instances of nheko."), + QCoreApplication::tr("profile"), + QCoreApplication::tr("profile name")); + parser.addOption(configName); + parser.process(app); app.setWindowIcon(QIcon(":/logos/nheko.png")); @@ -181,7 +216,7 @@ main(int argc, char *argv[]) appTranslator.load(QLocale(), "nheko", "_", ":/translations"); app.installTranslator(&appTranslator); - MainWindow w; + MainWindow w{(appName == "nheko" ? "" : appName.remove("nheko-"))}; // Move the MainWindow to the center w.move(screenCenter(w.width(), w.height())); diff --git a/src/timeline/EventStore.cpp b/src/timeline/EventStore.cpp
index d3c5c3fa..38292f49 100644 --- a/src/timeline/EventStore.cpp +++ b/src/timeline/EventStore.cpp
@@ -54,6 +54,12 @@ EventStore::EventStore(std::string room_id, QObject *) &EventStore::oldMessagesRetrieved, this, [this](const mtx::responses::Messages &res) { + if (cache::client()->previousBatchToken(room_id_) == res.end) { + noMoreMessages = true; + emit fetchedMore(); + return; + } + uint64_t newFirst = cache::client()->saveOldMessages(room_id_, res); if (newFirst == first) fetchMore(); @@ -210,6 +216,28 @@ EventStore::clearTimeline() } void +EventStore::receivedSessionKey(const std::string &session_id) +{ + if (!pending_key_requests.count(session_id)) + return; + + auto request = pending_key_requests.at(session_id); + pending_key_requests.erase(session_id); + + olm::send_key_request_for(request.events.front(), request.request_id, true); + + for (const auto &e : request.events) { + auto idx = idToIndex(e.event_id); + if (idx) { + decryptedEvents_.remove({room_id_, e.event_id}); + events_by_id_.remove({room_id_, e.event_id}); + events_.remove({room_id_, toInternalIdx(*idx)}); + emit dataChanged(*idx, *idx); + } + } +} + +void EventStore::handleSync(const mtx::responses::Timeline &events) { if (this->thread() != QThread::currentThread()) @@ -291,18 +319,6 @@ EventStore::handleSync(const mtx::responses::Timeline &events) *d_event)) { handle_room_verification(*d_event); } - // else { - // // only the key.verification.ready sent by localuser's other - // device - // // is of significance as it is used for detecting accepted request - // if (std::get_if<mtx::events::RoomEvent< - // mtx::events::msg::KeyVerificationReady>>(d_event)) { - // auto msg = std::get_if<mtx::events::RoomEvent< - // mtx::events::msg::KeyVerificationReady>>(d_event); - // ChatPage::instance()->receivedDeviceVerificationReady( - // msg->content); - // } - //} } } } @@ -498,7 +514,7 @@ EventStore::decryptEvent(const IdIndex &idx, if (decryptionResult.error) { switch (*decryptionResult.error) { - case olm::DecryptionErrorCode::MissingSession: + case olm::DecryptionErrorCode::MissingSession: { dummy.content.body = tr("-- Encrypted Event (No keys found for decryption) --", "Placeholder, when the message was not decrypted yet or can't be " @@ -509,8 +525,21 @@ EventStore::decryptEvent(const IdIndex &idx, index.session_id, e.sender); // TODO: Check if this actually works and look in key backup - olm::send_key_request_for(room_id_, e); + auto copy = e; + copy.room_id = room_id_; + if (pending_key_requests.count(e.content.session_id)) { + pending_key_requests.at(e.content.session_id) + .events.push_back(copy); + } else { + PendingKeyRequests request; + request.request_id = + "key_request." + http::client()->generate_txn_id(); + request.events.push_back(copy); + olm::send_key_request_for(copy, request.request_id); + pending_key_requests[e.content.session_id] = request; + } break; + } case olm::DecryptionErrorCode::DbError: nhlog::db()->critical( "failed to retrieve megolm session with index ({}, {}, {})", @@ -687,6 +716,9 @@ EventStore::get(std::string_view id, std::string_view related_to, bool decrypt) void EventStore::fetchMore() { + if (noMoreMessages) + return; + mtx::http::MessagesOpts opts; opts.room_id = room_id_; opts.from = cache::client()->previousBatchToken(room_id_); diff --git a/src/timeline/EventStore.h b/src/timeline/EventStore.h
index 954e271c..2d5fb1be 100644 --- a/src/timeline/EventStore.h +++ b/src/timeline/EventStore.h
@@ -104,6 +104,7 @@ signals: public slots: void addPending(mtx::events::collections::TimelineEvents event); + void receivedSessionKey(const std::string &session_id); void clearTimeline(); private: @@ -121,6 +122,14 @@ private: static QCache<Index, mtx::events::collections::TimelineEvents> events_; static QCache<IdIndex, mtx::events::collections::TimelineEvents> events_by_id_; + struct PendingKeyRequests + { + std::string request_id; + std::vector<mtx::events::EncryptedEvent<mtx::events::msg::Encrypted>> events; + }; + std::map<std::string, PendingKeyRequests> pending_key_requests; + std::string current_txn; int current_txn_error_count = 0; + bool noMoreMessages = false; }; diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 359e95bc..8b80ea51 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp
@@ -930,11 +930,12 @@ TimelineModel::sendEncryptedMessage(mtx::events::RoomEvent<T> msg, mtx::events:: const auto session_id = mtx::crypto::session_id(outbound_session.get()); const auto session_key = mtx::crypto::session_key(outbound_session.get()); - // TODO: needs to be moved in the lib. - auto megolm_payload = json{{"algorithm", "m.megolm.v1.aes-sha2"}, - {"room_id", room_id}, - {"session_id", session_id}, - {"session_key", session_key}}; + mtx::events::DeviceEvent<mtx::events::msg::RoomKey> megolm_payload; + megolm_payload.content.algorithm = "m.megolm.v1.aes-sha2"; + megolm_payload.content.room_id = room_id; + megolm_payload.content.session_id = session_id; + megolm_payload.content.session_key = session_key; + megolm_payload.type = mtx::events::EventType::RoomKey; // Saving the new megolm session. // TODO: Maybe it's too early to save. @@ -958,122 +959,29 @@ TimelineModel::sendEncryptedMessage(mtx::events::RoomEvent<T> msg, mtx::events:: const auto members = cache::roomMembers(room_id); nhlog::ui()->info("retrieved {} members for {}", members.size(), room_id); - auto keeper = - std::make_shared<StateKeeper>([room_id, doc, txn_id = msg.event_id, this]() { - try { - mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> event; - event.content = olm::encrypt_group_message( - room_id, http::client()->device_id(), doc); - event.event_id = txn_id; - event.room_id = room_id; - event.sender = http::client()->user_id().to_string(); - event.type = mtx::events::EventType::RoomEncrypted; - event.origin_server_ts = QDateTime::currentMSecsSinceEpoch(); - - emit this->addPendingMessageToStore(event); - } catch (const lmdb::error &e) { - nhlog::db()->critical( - "failed to save megolm outbound session: {}", e.what()); - emit ChatPage::instance()->showNotification( - tr("Failed to encrypt event, sending aborted!")); - } - }); - - mtx::requests::QueryKeys req; + std::map<std::string, std::vector<std::string>> targets; for (const auto &member : members) - req.device_keys[member] = {}; + targets[member] = {}; - http::client()->query_keys( - req, - [keeper = std::move(keeper), megolm_payload, txn_id = msg.event_id, this]( - const mtx::responses::QueryKeys &res, mtx::http::RequestErr err) { - if (err) { - nhlog::net()->warn("failed to query device keys: {} {}", - err->matrix_error.error, - static_cast<int>(err->status_code)); - emit ChatPage::instance()->showNotification( - tr("Failed to encrypt event, sending aborted!")); - return; - } + olm::send_encrypted_to_device_messages(targets, megolm_payload); - mtx::requests::ClaimKeys claim_keys; - - // Mapping from user id to a device_id with valid identity keys to the - // generated room_key event used for sharing the megolm session. - std::map<std::string, std::map<std::string, std::string>> room_key_msgs; - std::map<std::string, std::map<std::string, DevicePublicKeys>> deviceKeys; - - for (const auto &user : res.device_keys) { - for (const auto &dev : user.second) { - const auto user_id = ::UserId(dev.second.user_id); - const auto device_id = DeviceId(dev.second.device_id); - - if (user_id.get() == - http::client()->user_id().to_string() && - device_id.get() == http::client()->device_id()) - continue; - - const auto device_keys = dev.second.keys; - const auto curveKey = "curve25519:" + device_id.get(); - const auto edKey = "ed25519:" + device_id.get(); - - if ((device_keys.find(curveKey) == device_keys.end()) || - (device_keys.find(edKey) == device_keys.end())) { - nhlog::net()->debug( - "ignoring malformed keys for device {}", - device_id.get()); - continue; - } - - DevicePublicKeys pks; - pks.ed25519 = device_keys.at(edKey); - pks.curve25519 = device_keys.at(curveKey); - - try { - if (!mtx::crypto::verify_identity_signature( - dev.second, device_id, user_id)) { - nhlog::crypto()->warn( - "failed to verify identity keys: {}", - json(dev.second).dump(2)); - continue; - } - } catch (const json::exception &e) { - nhlog::crypto()->warn( - "failed to parse device key json: {}", - e.what()); - continue; - } catch (const mtx::crypto::olm_exception &e) { - nhlog::crypto()->warn( - "failed to verify device key json: {}", - e.what()); - continue; - } - - auto room_key = olm::client() - ->create_room_key_event( - user_id, pks.ed25519, megolm_payload) - .dump(); - - room_key_msgs[user_id].emplace(device_id, room_key); - deviceKeys[user_id].emplace(device_id, pks); - claim_keys.one_time_keys[user.first][device_id] = - mtx::crypto::SIGNED_CURVE25519; - - nhlog::net()->info("{}", device_id.get()); - nhlog::net()->info(" curve25519 {}", pks.curve25519); - nhlog::net()->info(" ed25519 {}", pks.ed25519); - } - } + try { + mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> event; + event.content = + olm::encrypt_group_message(room_id, http::client()->device_id(), doc); + event.event_id = msg.event_id; + event.room_id = room_id; + event.sender = http::client()->user_id().to_string(); + event.type = mtx::events::EventType::RoomEncrypted; + event.origin_server_ts = QDateTime::currentMSecsSinceEpoch(); - http::client()->claim_keys(claim_keys, - std::bind(&TimelineModel::handleClaimedKeys, - this, - keeper, - room_key_msgs, - deviceKeys, - std::placeholders::_1, - std::placeholders::_2)); - }); + emit this->addPendingMessageToStore(event); + } catch (const lmdb::error &e) { + nhlog::db()->critical("failed to save megolm outbound session: {}", + e.what()); + emit ChatPage::instance()->showNotification( + tr("Failed to encrypt event, sending aborted!")); + } // TODO: Let the user know about the errors. } catch (const lmdb::error &e) { @@ -1089,86 +997,6 @@ TimelineModel::sendEncryptedMessage(mtx::events::RoomEvent<T> msg, mtx::events:: } } -void -TimelineModel::handleClaimedKeys( - std::shared_ptr<StateKeeper> keeper, - const std::map<std::string, std::map<std::string, std::string>> &room_keys, - const std::map<std::string, std::map<std::string, DevicePublicKeys>> &pks, - const mtx::responses::ClaimKeys &res, - mtx::http::RequestErr err) -{ - if (err) { - nhlog::net()->warn("claim keys error: {} {} {}", - err->matrix_error.error, - err->parse_error, - static_cast<int>(err->status_code)); - return; - } - - // Payload with all the to_device message to be sent. - nlohmann::json body; - - for (const auto &[user_id, retrieved_devices] : res.one_time_keys) { - nhlog::net()->debug("claimed keys for {}", user_id); - if (retrieved_devices.size() == 0) { - nhlog::net()->debug("no one-time keys found for user_id: {}", user_id); - return; - } - - for (const auto &rd : retrieved_devices) { - const auto device_id = rd.first; - - nhlog::net()->debug("{} : \n {}", device_id, rd.second.dump(2)); - - if (rd.second.empty() || !rd.second.begin()->contains("key")) { - nhlog::net()->warn("Skipping device {} as it has no key.", - device_id); - continue; - } - - // TODO: Verify signatures - auto otk = rd.second.begin()->at("key"); - - auto id_key = pks.at(user_id).at(device_id).curve25519; - auto s = olm::client()->create_outbound_session(id_key, otk); - - auto device_msg = olm::client()->create_olm_encrypted_content( - s.get(), - room_keys.at(user_id).at(device_id), - pks.at(user_id).at(device_id).curve25519); - - try { - cache::saveOlmSession(id_key, std::move(s)); - } catch (const lmdb::error &e) { - nhlog::db()->critical("failed to save outbound olm session: {}", - e.what()); - } catch (const mtx::crypto::olm_exception &e) { - nhlog::crypto()->critical( - "failed to pickle outbound olm session: {}", e.what()); - } - - body["messages"][user_id][device_id] = device_msg; - } - - nhlog::net()->info("send_to_device: {}", user_id); - } - - http::client()->send_to_device( - mtx::events::to_string(mtx::events::EventType::RoomEncrypted), - http::client()->generate_txn_id(), - body, - [keeper](mtx::http::RequestErr err) { - if (err) { - nhlog::net()->warn("failed to send " - "send_to_device " - "message: {}", - err->matrix_error.error); - } - - (void)keeper; - }); -} - struct SendMessageVisitor { explicit SendMessageVisitor(TimelineModel *model) diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index 3234a20c..e1fb9196 100644 --- a/src/timeline/TimelineModel.h +++ b/src/timeline/TimelineModel.h
@@ -264,6 +264,10 @@ public slots: } void setDecryptDescription(bool decrypt) { decryptDescription = decrypt; } void clearTimeline() { events.clearTimeline(); } + void receivedSessionKey(const std::string &session_key) + { + events.receivedSessionKey(session_key); + } QString roomName() const; QString roomTopic() const; @@ -297,12 +301,6 @@ signals: private: template<typename T> void sendEncryptedMessage(mtx::events::RoomEvent<T> msg, mtx::events::EventType eventType); - void handleClaimedKeys( - std::shared_ptr<StateKeeper> keeper, - const std::map<std::string, std::map<std::string, std::string>> &room_keys, - const std::map<std::string, std::map<std::string, DevicePublicKeys>> &pks, - const mtx::responses::ClaimKeys &res, - mtx::http::RequestErr err); void readEvent(const std::string &id); void setPaginationInProgress(const bool paginationInProgress); diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index 353f7065..598af31e 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp
@@ -30,7 +30,7 @@ namespace msgs = mtx::events::msg; void TimelineViewManager::updateEncryptedDescriptions() { - auto decrypt = settings->decryptSidebar(); + auto decrypt = ChatPage::instance()->userSettings()->decryptSidebar(); QHash<QString, QSharedPointer<TimelineModel>>::iterator i; for (i = models.begin(); i != models.end(); ++i) { auto ptr = i.value(); @@ -47,10 +47,10 @@ TimelineViewManager::updateColorPalette() { userColors.clear(); - if (settings->theme() == "light") { + if (ChatPage::instance()->userSettings()->theme() == "light") { view->rootContext()->setContextProperty("currentActivePalette", QPalette()); view->rootContext()->setContextProperty("currentInactivePalette", QPalette()); - } else if (settings->theme() == "dark") { + } else if (ChatPage::instance()->userSettings()->theme() == "dark") { view->rootContext()->setContextProperty("currentActivePalette", QPalette()); view->rootContext()->setContextProperty("currentInactivePalette", QPalette()); } else { @@ -84,14 +84,11 @@ TimelineViewManager::userStatus(QString id) const return QString::fromStdString(cache::statusMessage(id.toStdString())); } -TimelineViewManager::TimelineViewManager(QSharedPointer<UserSettings> userSettings, - CallManager *callManager, - ChatPage *parent) +TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *parent) : imgProvider(new MxcImageProvider()) , colorImgProvider(new ColorImageProvider()) , blurhashProvider(new BlurhashProvider()) , callManager_(callManager) - , settings(userSettings) { qRegisterMetaType<mtx::events::msg::KeyVerificationAccept>(); qRegisterMetaType<mtx::events::msg::KeyVerificationCancel>(); @@ -133,7 +130,7 @@ TimelineViewManager::TimelineViewManager(QSharedPointer<UserSettings> userSettin }); qmlRegisterSingletonType<UserSettings>( "im.nheko", 1, 0, "Settings", [](QQmlEngine *, QJSEngine *) -> QObject * { - return self->settings.data(); + return ChatPage::instance()->userSettings().data(); }); qRegisterMetaType<mtx::events::collections::TimelineEvents>(); @@ -295,7 +292,8 @@ TimelineViewManager::addRoom(const QString &room_id) { if (!models.contains(room_id)) { QSharedPointer<TimelineModel> newRoom(new TimelineModel(this, room_id)); - newRoom->setDecryptDescription(settings->decryptSidebar()); + newRoom->setDecryptDescription( + ChatPage::instance()->userSettings()->decryptSidebar()); connect(newRoom.data(), &TimelineModel::newEncryptedImage, @@ -454,6 +452,15 @@ TimelineViewManager::updateReadReceipts(const QString &room_id, } void +TimelineViewManager::receivedSessionKey(const std::string &room_id, const std::string &session_id) +{ + auto room = models.find(QString::fromStdString(room_id)); + if (room != models.end()) { + room.value()->receivedSessionKey(session_id); + } +} + +void TimelineViewManager::initWithMessages(const std::map<QString, mtx::responses::Timeline> &msgs) { for (const auto &e : msgs) { @@ -472,7 +479,7 @@ TimelineViewManager::queueTextMessage(const QString &msg) mtx::events::msg::Text text = {}; text.body = msg.trimmed().toStdString(); - if (settings->markdown()) { + if (ChatPage::instance()->userSettings()->markdown()) { text.formatted_body = utils::markdownToHtml(msg).toStdString(); // Don't send formatted_body, when we don't need to @@ -500,7 +507,7 @@ TimelineViewManager::queueTextMessage(const QString &msg) // NOTE(Nico): rich replies always need a formatted_body! text.format = "org.matrix.custom.html"; - if (settings->markdown()) + if (ChatPage::instance()->userSettings()->markdown()) text.formatted_body = utils::getFormattedQuoteBody(related, utils::markdownToHtml(msg)) .toStdString(); @@ -523,7 +530,8 @@ TimelineViewManager::queueEmoteMessage(const QString &msg) mtx::events::msg::Emote emote; emote.body = msg.trimmed().toStdString(); - if (html != msg.trimmed().toHtmlEscaped() && settings->markdown()) { + if (html != msg.trimmed().toHtmlEscaped() && + ChatPage::instance()->userSettings()->markdown()) { emote.formatted_body = html.toStdString(); emote.format = "org.matrix.custom.html"; } diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h
index 1a2d4c4e..895c4b39 100644 --- a/src/timeline/TimelineViewManager.h +++ b/src/timeline/TimelineViewManager.h
@@ -42,9 +42,7 @@ class TimelineViewManager : public QObject Q_PROPERTY(bool isMicMuted READ isMicMuted NOTIFY micMuteChanged) public: - TimelineViewManager(QSharedPointer<UserSettings> userSettings, - CallManager *callManager, - ChatPage *parent = nullptr); + TimelineViewManager(CallManager *callManager, ChatPage *parent = nullptr); QWidget *getWidget() const { return container; } void sync(const mtx::responses::Rooms &rooms); @@ -98,6 +96,7 @@ signals: public slots: void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids); + void receivedSessionKey(const std::string &room_id, const std::string &session_id); void initWithMessages(const std::map<QString, mtx::responses::Timeline> &msgs); void setHistoryView(const QString &room_id); @@ -180,7 +179,6 @@ private: bool isInitialSync_ = true; bool isNarrowView_ = false; - QSharedPointer<UserSettings> settings; QHash<QString, QColor> userColors; QHash<QString, QSharedPointer<DeviceVerificationFlow>> dvList;