Merge remote-tracking branch 'upstream/master' into webrtc-video

This commit is contained in:
trilene 2020-10-27 15:29:53 -04:00
commit d9ca5309ac
66 changed files with 7987 additions and 2507 deletions

View file

@ -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()

View file

@ -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

View file

@ -146,7 +146,7 @@
"name": "mtxclient",
"sources": [
{
"commit": "ad5575bc24089dc385e97d9ace026414b618775c",
"commit": "6432e89a3465e58ed838dd2abdcb0f91bd4f05b0",
"type": "git",
"url": "https://github.com/Nheko-Reborn/mtxclient.git"
}

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation type="unfinished"></translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation type="unfinished"></translation>
</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>
@ -331,6 +425,40 @@
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +602,92 @@ 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>
@ -517,6 +696,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -593,10 +790,18 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -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>
@ -1111,10 +1339,33 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -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>
@ -1403,6 +1679,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation> (community)</translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation type="unfinished">Flaggen</translation>
</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>
@ -331,6 +425,40 @@
<translation type="unfinished"></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">Schließen</translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +606,92 @@ 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>
@ -521,6 +700,24 @@ Beispiel: https://mein.server:8787</translation>
<translation>Unimplementiertes Event: </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>
@ -597,10 +794,18 @@ Beispiel: https://mein.server:8787</translation>
<translation>Ungültiger Servername</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>
@ -1114,10 +1342,33 @@ Beispiel: https://mein.server:8787</translation>
<translation type="unfinished"></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>
@ -1406,6 +1682,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Datei zum Speichern der zu exportierenden Sitzungsschlüssel</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">Abbrechen</translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation type="unfinished"></translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation type="unfinished">Σημαίες</translation>
</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>
@ -331,6 +425,40 @@
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +602,92 @@ 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>
@ -517,6 +696,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -593,10 +790,18 @@ Example: https://server.my:8787</source>
<translation>Λανθασμένο όνομα διακομιστή</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>
@ -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>
@ -1110,10 +1338,33 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>Ελαχιστοποίηση</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>
@ -1402,6 +1678,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></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">Άκυρο</translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation> (community)</translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation>Flags</translation>
</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>
@ -331,6 +425,40 @@
<translation>-- Message by unverified device! --</translation>
</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>
@ -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,41 +606,92 @@ 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>
@ -521,6 +700,24 @@ Example: https://server.my:8787</translation>
<translation>unimplemented event: </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>
@ -597,10 +794,18 @@ Example: https://server.my:8787</translation>
<translation>Invalid server name</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>
@ -1114,10 +1342,33 @@ Example: https://server.my:8787</translation>
<translation>Offline</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>
@ -1414,6 +1690,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>File to save the exported session keys</translation>
</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>

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -210,6 +256,29 @@
<translation type="unfinished"></translation>
</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>
@ -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>
@ -282,10 +351,33 @@
<translation>Flagoj</translation>
</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>
@ -332,6 +426,40 @@
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +607,92 @@ 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>
@ -522,6 +701,24 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished"></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>
@ -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"/>
@ -598,10 +795,18 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished"></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>
<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>
<translation type="unfinished">Agordoj</translation>
</message>
</context>
<context>
@ -1120,10 +1348,33 @@ Ekzemplo: https://servisto.mia:8787</translation>
<translation type="unfinished"></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>
@ -1412,6 +1688,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation> (kogukond)</translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation>Lipud</translation>
</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>
@ -331,6 +425,40 @@
<translation>-- Sõnum verifitseerimata seadmest! --</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>Sulge</translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +606,92 @@ 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>
@ -521,6 +700,24 @@ Näiteks: https://server.minu:8787</translation>
<translation>implementeerimata sündmus: </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>
@ -597,10 +794,18 @@ Näiteks: https://server.minu:8787</translation>
<translation>Vigane koduserveri nimi</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>
@ -1114,10 +1342,33 @@ Näiteks: https://server.minu:8787</translation>
<translation>Pole võrgus</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>
@ -1414,6 +1690,34 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim
<translation>Fail, kuhu salvestad eksporditavad sessiooni krüptovõtmed</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>Tühista</translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation> (community)</translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation type="unfinished">Liput</translation>
</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>
@ -331,6 +425,40 @@
<translation type="unfinished"></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">Sulje</translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +602,92 @@ 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>
@ -517,6 +696,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -593,10 +790,18 @@ Example: https://server.my:8787</source>
<translation>Epäkelpo palvelimen nimi</translation>
</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>
@ -1110,10 +1338,33 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>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>
@ -1402,6 +1678,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Tiedosto, johon viedyt istuntoavaimet tallennetaan</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">Peruuta</translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

File diff suppressed because it is too large Load diff

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation> (comunità)</translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation type="unfinished">Bandiere</translation>
</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>
@ -331,6 +425,40 @@
<translation type="unfinished"></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">Chiudi</translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +606,92 @@ 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>
@ -521,6 +700,24 @@ Esempio: https://server.mio:8787</translation>
<translation> event non implementato:</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>
@ -597,10 +794,18 @@ Esempio: https://server.mio:8787</translation>
<translation>Nome del server non valido</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>
@ -1114,10 +1342,33 @@ Esempio: https://server.mio:8787</translation>
<translation type="unfinished"></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>
@ -1406,6 +1682,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>File ove salvare le chiavi di sessione esportate</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">Annulla</translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation> ()</translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation type="unfinished"></translation>
</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>
@ -331,6 +425,40 @@
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +602,92 @@ 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>
@ -517,6 +696,24 @@ Example: https://server.my:8787</source>
<translation>: </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>
@ -593,10 +790,18 @@ Example: https://server.my:8787</source>
<translation></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></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>
@ -1109,10 +1337,33 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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></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>
@ -1401,6 +1677,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation></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"></translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation type="unfinished"></translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation type="unfinished">Vlaggen</translation>
</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>
@ -331,6 +425,40 @@
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +602,92 @@ 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>
@ -517,6 +696,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -593,10 +790,18 @@ Example: https://server.my:8787</source>
<translation>Ongeldige servernaam</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>
@ -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>
@ -1110,10 +1338,33 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>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>
@ -1402,6 +1678,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></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">Annuleren</translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation type="unfinished"></translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation type="unfinished">Flagi</translation>
</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>
@ -331,6 +425,40 @@
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +602,92 @@ 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>
@ -517,6 +696,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -593,10 +790,18 @@ Example: https://server.my:8787</source>
<translation>Nieprawidłowa nazwa serwera</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>
@ -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>
@ -1111,10 +1339,33 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>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>
@ -1403,6 +1679,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></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">Anuluj</translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation type="unfinished"></translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation type="unfinished"></translation>
</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>
@ -331,6 +425,40 @@
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +602,92 @@ 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>
@ -517,6 +696,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -593,10 +790,18 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -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>
@ -1110,10 +1338,33 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -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>
@ -1402,6 +1678,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation type="unfinished"></translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation type="unfinished"></translation>
</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>
@ -331,6 +425,40 @@
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +602,92 @@ 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>
@ -517,6 +696,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -593,10 +790,18 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -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>
@ -1111,10 +1339,33 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -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>
@ -1403,6 +1679,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation> (сообщество)</translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation type="unfinished"></translation>
</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>
@ -331,6 +425,40 @@
<translation type="unfinished"></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">Закрыть</translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +602,92 @@ 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>
@ -517,6 +696,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -593,10 +790,18 @@ Example: https://server.my:8787</source>
<translation>Неверное имя сервера</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>
@ -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>
@ -1111,10 +1339,33 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>Сворачивать в системную панель</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>
@ -1404,6 +1680,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Файл для сохранения экспортированных ключей сеанса</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"></translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation type="unfinished"></translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation type="unfinished"></translation>
</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>
@ -331,6 +425,40 @@
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +602,92 @@ 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>
@ -517,6 +696,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -593,10 +790,18 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -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>
@ -1110,10 +1338,33 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -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>
@ -1402,6 +1678,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

View file

@ -1,10 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!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>
@ -209,6 +255,29 @@
<translation type="unfinished"></translation>
</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>
@ -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>
@ -281,10 +350,33 @@
<translation type="unfinished">Flags</translation>
</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>
@ -331,6 +425,40 @@
<translation type="unfinished"></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"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<message>
@ -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,41 +602,92 @@ 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>
@ -517,6 +696,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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>
@ -593,10 +790,18 @@ Example: https://server.my:8787</source>
<translation></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>
@ -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>
@ -1109,10 +1337,33 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></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></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>
@ -1401,6 +1677,34 @@ This usually causes the application icon in the task bar to animate in some fash
<translation></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"></translation>
</message>
</context>
<context>
<name>WelcomePage</name>
<message>

View file

@ -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

View file

@ -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

View file

@ -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
}

View file

@ -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
}
}
}

View file

@ -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
}
}

View file

@ -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
}

View file

@ -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
}
}

View file

@ -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

View file

@ -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,425 +167,52 @@ Page {
}
ColumnLayout {
visible: TimelineManager.timeline != null
anchors.fill: parent
spacing: 0
TopBar {
}
Rectangle {
id: topBar
Layout.fillWidth: true
implicitHeight: topLayout.height + 16
height: 1
z: 3
color: colors.mid
}
Rectangle {
Layout.fillWidth: true
Layout.fillHeight: true
color: colors.base
MouseArea {
ColumnLayout {
anchors.fill: parent
onClicked: TimelineManager.openRoomSettings()
}
spacing: 0
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()
}
}
}
}
}
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
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
}
StackLayout {
id: stackLayout
currentIndex: 0
Connections {
function onMovementEnded() {
if (y + height + 2 * chat.spacing > chat.contentY + chat.height && y < chat.contentY + chat.height)
chat.model.currentIndex = index;
target: TimelineManager
function onActiveTimelineChanged() {
stackLayout.currentIndex = 0;
}
target: chat
}
MessageView {
Layout.fillWidth: true
Layout.fillHeight: true
}
Loader {
source: TimelineManager.onVideoCall ? "VideoCall.qml" : ""
onLoaded: TimelineManager.setVideoCallItem()
}
}
footer: BusyIndicator {
anchors.horizontalCenter: parent.horizontalCenter
running: chat.model && chat.model.paginationInProgress
height: 50
width: 50
z: 3
}
}
Loader {
id: videoCallLoader
source: TimelineManager.onVideoCall ? "VideoCall.qml" : ""
onLoaded: TimelineManager.setVideoCallItem()
}
}
Item {
id: chatFooter
implicitHeight: Math.max(fontMetrics.height * 1.2, footerContent.height)
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
}
TypingIndicator {
}
}
@ -589,6 +224,19 @@ Page {
z: 3
}
Rectangle {
Layout.fillWidth: true
z: 3
height: 1
color: colors.mid
}
ReplyPopup {
}
//MessageInput {
//}
}
}

127
resources/qml/TopBar.qml Normal file
View file

@ -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()
}
}
}
}
}

View file

@ -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
}
}
}

View file

@ -65,7 +65,7 @@ Item {
}
Rectangle {
color: colors.dark
color: colors.alternateBase
z: -1
radius: 10
height: row.height + 24

View file

@ -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
}
}
}
}

View file

@ -2,5 +2,5 @@ TextMessage {
font.italic: true
color: colors.buttonText
height: isReply ? Math.min(chat.height / 8, implicitHeight) : undefined
clip: true
clip: isReply
}

View file

@ -9,7 +9,7 @@ Label {
background: Rectangle {
radius: parent.height / 2
color: colors.dark
color: colors.alternateBase
}
}

View file

@ -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

View file

@ -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
}

View file

@ -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

View file

@ -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>

View file

@ -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,

View file

@ -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;

View file

@ -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);
}

View file

@ -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());
try {
auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
auto txn = lmdb::txn::begin(env_);
auto membersdb = getMembersDb(txn, room_id);
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);
const auto userid = QString::fromStdString(user_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];
if (auto info = getMember(room_id.toStdString(), user_id.toStdString());
info && !info->avatar_url.empty())
return QString::fromStdString(info->avatar_url);
return QString();
}
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)

View file

@ -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);

View file

@ -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
{

View file

@ -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;
};

View file

@ -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
@ -754,18 +754,6 @@ ChatPage::bootstrap(QString userid, QString homeserver, QString token)
tryInitialSync();
}
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()
{
@ -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());
@ -1252,6 +1238,12 @@ ChatPage::unbanUser(QString userid, QString reason)
reason.trimmed().toStdString());
}
void
ChatPage::receivedSessionKey(const std::string &room_id, const std::string &session_id)
{
view_manager_->receivedSessionKey(room_id, session_id);
}
void
ChatPage::sendTypingNotifications()
{

View file

@ -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);

View file

@ -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);
@ -178,6 +178,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)
{

View file

@ -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_;
};

View file

@ -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}};
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;
send_megolm_key_to_device(req.sender, req.content.requesting_device_id, payload);
// 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};
mtx::events::DeviceEvent<mtx::events::msg::ForwardedRoomKey> room_key;
room_key.content = payload;
room_key.type = mtx::events::EventType::ForwardedRoomKey;
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;
}
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

View file

@ -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

View file

@ -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;

View file

@ -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;
};

View file

@ -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);

View file

@ -104,5 +104,4 @@ private:
QString selectedRoom_;
bool isSortPending_ = false;
QSharedPointer<UserSettings> settings;
};

View file

@ -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();

View file

@ -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>();
@ -124,6 +129,16 @@ UserSettings::setStartInTray(bool state)
save();
}
void
UserSettings::setMobileMode(bool state)
{
if (state == mobileMode_)
return;
mobileMode_ = state;
emit mobileModeChanged(state);
save();
}
void
UserSettings::setGroupView(bool state)
{
@ -295,6 +310,17 @@ UserSettings::setUseStunServer(bool useStunServer)
save();
}
void
UserSettings::setShareKeysWithTrustedUsers(bool shareKeys)
{
if (shareKeys == shareKeysWithTrustedUsers_)
return;
shareKeysWithTrustedUsers_ = shareKeys;
emit shareKeysWithTrustedUsersChanged(shareKeys);
save();
}
void
UserSettings::setMicrophone(QString 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());

View file

@ -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_;

View file

@ -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()));

View file

@ -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();
@ -209,6 +215,28 @@ EventStore::clearTimeline()
emit endResetModel();
}
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)
{
@ -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_);

View file

@ -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;
};

View file

@ -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;
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();
// 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);
}
}
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)

View file

@ -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);

View file

@ -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,
@ -453,6 +451,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)
{
@ -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";
}

View file

@ -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;