Merge master and fix conflicts

This commit is contained in:
Joe 2021-07-24 18:26:25 -04:00
commit 3f567a8da7
87 changed files with 5667 additions and 2989 deletions

View file

@ -281,11 +281,9 @@ set(SRC_FILES
src/dialogs/CreateRoom.cpp
src/dialogs/FallbackAuth.cpp
src/dialogs/ImageOverlay.cpp
src/dialogs/InviteUsers.cpp
src/dialogs/JoinRoom.cpp
src/dialogs/LeaveRoom.cpp
src/dialogs/Logout.cpp
src/dialogs/MemberList.cpp
src/dialogs/PreviewUploadOverlay.cpp
src/dialogs/ReCaptcha.cpp
src/dialogs/ReadReceipts.cpp
@ -346,15 +344,19 @@ set(SRC_FILES
src/CompletionProxyModel.cpp
src/DeviceVerificationFlow.cpp
src/EventAccessors.cpp
src/InviteeItem.cpp
src/InviteesModel.cpp
src/Logging.cpp
src/LoginPage.cpp
src/MainWindow.cpp
src/MatrixClient.cpp
src/MemberList.cpp
src/MxcImageProvider.cpp
src/Olm.cpp
src/RegisterPage.cpp
src/SSOHandler.cpp
src/CombinedImagePackModel.cpp
src/SingleImagePackModel.cpp
src/ImagePackListModel.cpp
src/TrayIcon.cpp
src/UserSettingsPage.cpp
src/UsersModel.cpp
@ -380,7 +382,7 @@ if(USE_BUNDLED_MTXCLIENT)
FetchContent_Declare(
MatrixClient
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
GIT_TAG 1c277e9ac69aafdaf6888ce595b21dc86e970f28
GIT_TAG 316a4040785ee2eabac7ef5ce7b4acb71c48f6eb
)
set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
@ -491,11 +493,9 @@ qt5_wrap_cpp(MOC_HEADERS
src/dialogs/CreateRoom.h
src/dialogs/FallbackAuth.h
src/dialogs/ImageOverlay.h
src/dialogs/InviteUsers.h
src/dialogs/JoinRoom.h
src/dialogs/LeaveRoom.h
src/dialogs/Logout.h
src/dialogs/MemberList.h
src/dialogs/PreviewUploadOverlay.h
src/dialogs/RawMessage.h
src/dialogs/ReCaptcha.h
@ -553,12 +553,16 @@ qt5_wrap_cpp(MOC_HEADERS
src/Clipboard.h
src/CompletionProxyModel.h
src/DeviceVerificationFlow.h
src/InviteeItem.h
src/InviteesModel.h
src/LoginPage.h
src/MainWindow.h
src/MemberList.h
src/MxcImageProvider.h
src/RegisterPage.h
src/SSOHandler.h
src/CombinedImagePackModel.h
src/SingleImagePackModel.h
src/ImagePackListModel.h
src/TrayIcon.h
src/UserSettingsPage.h
src/UsersModel.h

View file

@ -161,7 +161,7 @@ modules:
buildsystem: cmake-ninja
name: mtxclient
sources:
- commit: 1c277e9ac69aafdaf6888ce595b21dc86e970f28
- commit: 316a4040785ee2eabac7ef5ce7b4acb71c48f6eb
type: git
url: https://github.com/Nheko-Reborn/mtxclient.git
- config-opts:

View file

@ -3,6 +3,7 @@ Title=Nheko Nightly
Name=io.github.NhekoReborn.Nheko
Branch=master
Url=https://flatpak.neko.dev/repo/nightly
SuggestRemoteName=nheko-nightlies
Homepage=https://nheko-reborn.github.io/
Icon=https://nheko.im/nheko-reborn/nheko/-/raw/master/resources/nheko.svg
RuntimeRepo=https://dl.flathub.org/repo/flathub.flatpakrepo

View file

@ -1,6 +1,7 @@
[Flatpak Repo]
Title=Nheko Nightly
Url=https://flatpak.neko.dev/repo/nightly
SuggestRemoteName=nheko-nightlies
Homepage=https://nheko.im/
Comment=Nheko nightly release repository
Description=Nheko nightly release repository

View file

@ -0,0 +1 @@
<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="sticky-note" class="svg-inline--fa fa-sticky-note fa-w-14" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M312 320h136V56c0-13.3-10.7-24-24-24H24C10.7 32 0 42.7 0 56v400c0 13.3 10.7 24 24 24h264V344c0-13.2 10.8-24 24-24zm129 55l-98 98c-4.5 4.5-10.6 7-17 7h-6V352h128v6.1c0 6.3-2.5 12.4-7 16.9z"></path></svg>

After

Width:  |  Height:  |  Size: 429 B

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +48,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -227,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation type="unfinished"></translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -617,16 +617,42 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -740,28 +766,15 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+128"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+187"/>
<source>Encryption enabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -771,7 +784,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -781,17 +794,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
@ -806,23 +819,23 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+29"/>
<location line="+38"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-18"/>
<location line="-24"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-80"/>
<location line="-99"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+80"/>
<location line="+102"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
@ -830,7 +843,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
@ -851,6 +864,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -868,17 +886,17 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -888,7 +906,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1337,20 +1345,43 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1432,11 +1463,6 @@ Example: https://server.my:8787</source>
<source>Room Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1469,6 +1495,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1526,7 +1570,7 @@ Example: https://server.my:8787</source>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
@ -1546,6 +1590,14 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1567,7 +1619,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1630,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation type="unfinished"></translation>
</message>
@ -1713,12 +1765,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1747,7 +1799,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation type="unfinished"></translation>
</message>
@ -1755,17 +1807,32 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1773,7 +1840,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1781,18 +1848,17 @@ Example: https://server.my:8787</source>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
@ -1833,7 +1899,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1843,7 +1909,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1892,7 +1958,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1901,7 +1967,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>
@ -2347,7 +2413,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2398,7 +2464,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2469,19 +2535,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation>Auf Bestätigung warten</translation>
</message>
@ -48,7 +48,7 @@
<translation>Wartet darauf, dass die andere Seite die Verifizierung abschließt.</translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>Nutzer konnte nicht eingeladen werden: %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation>Einladung bestätigen</translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Nutzer %1 (%2) wirklich einladen?</translation>
</message>
@ -227,12 +227,12 @@
<translation>Verbannung aufgehoben: %1</translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation>Möchtest du wirklich eine private Konversation mit %1 beginnen?</translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation>Migration des Caches fehlgeschlagen!</translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation>Geheimnisse entschlüsseln</translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation>Suche</translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation>Leute</translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation>Datei auswählen</translation>
</message>
@ -617,17 +617,43 @@
<translation>Alle Dateien (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation>Medienupload fehlgeschlagen. Bitte versuche es erneut.</translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation>Löschen</translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation>Lade Benutzer in %1 ein</translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation>Benutzer-ID, die eingeladen werden soll</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation>@joe:matrix.org</translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation>Hinzufügen</translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation>Einladen</translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
</context>
<context>
@ -744,23 +770,10 @@ Beispiel: https://mein.server:8787</translation>
<translation>SSO Anmeldung fehlgeschlagen</translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation>Teilnehmerliste</translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation>OK</translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+110"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+169"/>
<location line="+9"/>
<source>removed</source>
<translation>entfernt</translation>
@ -771,7 +784,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Verschlüsselung aktiviert</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation>Raumname wurde gändert auf: %1</translation>
</message>
@ -781,7 +794,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Raumname wurde entfernt</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation>Raumthema wurde geändert auf: %1</translation>
</message>
@ -791,17 +804,17 @@ Beispiel: https://mein.server:8787</translation>
<translation>Thema wurde entfernt</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation>%1 hat dem Raumavatar geändert</translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation>%1 hat den Raum erstellt: %2</translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation>%1 hat einen Sprachanruf gestartet.</translation>
</message>
@ -816,17 +829,17 @@ Beispiel: https://mein.server:8787</translation>
<translation>%1 hat angerufen.</translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>%1 answered the call.</source>
<translation>%1 hat den Anruf angenommen.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 ended the call.</source>
<translation>%1 hat den Anruf beendet.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>Negotiating call...</source>
<translation>Wählt</translation>
</message>
@ -834,7 +847,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation>Auflegen</translation>
</message>
@ -855,6 +868,11 @@ Beispiel: https://mein.server:8787</translation>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation>Sticker</translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation>Emoji</translation>
</message>
@ -872,17 +890,17 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation>Bearbeiten</translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation>Reaktion senden</translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation>Antworten</translation>
</message>
@ -892,7 +910,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Optionen</translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation>&amp;Kopieren</translation>
</message>
@ -1100,7 +1118,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation>Unimplementiertes Event: </translation>
</message>
@ -1220,7 +1238,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation>Schließen</translation>
</message>
@ -1233,7 +1251,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation>keine Version gespeichert</translation>
</message>
@ -1241,7 +1259,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation>Neuer Tag</translation>
</message>
@ -1281,17 +1299,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Neuen Tag erstellen...</translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation>Akzeptieren</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation>Ablehnen</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation>Statusnachricht</translation>
</message>
@ -1341,20 +1349,42 @@ Beispiel: https://mein.server:8787</translation>
<translation>Benutzereinstellungen</translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation>Teilnehmer in %1</translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation>
<numerusform>%n Person in %1</numerusform>
<numerusform>%n Personen in %1</numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation>Lade mehr Leute ein</translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation>Raumeinstellungen</translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation>%1 Teilnehmer</translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation>EINSTELLUNGEN</translation>
</message>
@ -1436,11 +1466,6 @@ Beispiel: https://mein.server:8787</translation>
<source>Room Version</source>
<translation>Raumversion</translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1473,6 +1498,24 @@ Beispiel: https://mein.server:8787</translation>
<translation>Hochladen des Bildes fehlgeschlagen: %s</translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation>Offene Einladung.</translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation>Vorschau dieses Raums</translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation>Keine Vorschau verfügbar</translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1530,7 +1573,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation>Fehlgeschlagen</translation>
</message>
@ -1550,6 +1593,14 @@ Beispiel: https://mein.server:8787</translation>
<translation>Gelesen</translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation>Suche</translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1571,7 +1622,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation>Nachricht zurückziehen fehlgeschlagen: %1</translation>
</message>
@ -1582,7 +1633,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Event konnte nicht verschlüsselt werden, senden wurde abgebrochen!</translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation>Bild speichern</translation>
</message>
@ -1716,12 +1767,12 @@ Beispiel: https://mein.server:8787</translation>
<translation>%1 hat das Anklopfen zurückgezogen.</translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation>Du bist dem Raum beigetreten.</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation>%1 hat den eigenen Avatar und Namen geändert zu %2.</translation>
</message>
@ -1750,7 +1801,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation>Bearbeitet</translation>
</message>
@ -1758,17 +1809,32 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation>Kein Raum geöffnet</translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation>%1 Teilnehmer</translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation>An der Unterhaltung teilnehmen</translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation>Einladung annehmen</translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation>Einladung ablehnen</translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation>Zurück zur Raumliste</translation>
</message>
@ -1776,7 +1842,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation>Keinen verschlüsselten Chat mit diesem User gefunden. Erstelle einen verschlüsselten 1:1 Chat mit diesem Nutzer und versuche es erneut.</translation>
</message>
@ -1784,18 +1850,17 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation>Zurück zur Raumliste</translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation>Kein Raum ausgewählt</translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation>Raumoptionen</translation>
</message>
@ -1836,7 +1901,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation>Globales Nutzerprofil</translation>
</message>
@ -1846,7 +1911,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Raumspezifisches Nutzerprofil</translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation>Verifizieren</translation>
@ -1895,7 +1960,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation>Standard</translation>
@ -1904,7 +1969,7 @@ Beispiel: https://mein.server:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation>Ins Benachrichtigungsfeld minimieren</translation>
</message>
@ -2360,7 +2425,7 @@ Normalerweise animiert das den Taskbaricon oder färbt das Fenster orange ein.</
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation>Auf Gegenseite warten</translation>
</message>
@ -2411,7 +2476,7 @@ Normalerweise animiert das den Taskbaricon oder färbt das Fenster orange ein.</
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation>Gestern</translation>
</message>
@ -2482,19 +2547,6 @@ Normalerweise animiert das den Taskbaricon oder färbt das Fenster orange ein.</
<translation>Öffne das Fallback, folge den Anweisungen und bestätige nach Abschluss via &quot;Bestätigen&quot;.</translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation>Abbrechen</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation>Benutzer-ID, die eingeladen werden soll</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +48,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation type="unfinished">Άκυρο</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -227,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation type="unfinished"></translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation type="unfinished">Διάλεξε ένα αρχείο</translation>
</message>
@ -617,18 +617,44 @@
<translation type="unfinished">Όλα τα αρχεία (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished">Όνομα χρήστη</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished">Άκυρο</translation>
</message>
</context>
<context>
<name>LoginPage</name>
@ -740,23 +766,10 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation>Μέλη</translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+110"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+169"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
@ -767,7 +780,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -777,7 +790,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -787,17 +800,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
@ -812,17 +825,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
@ -830,7 +843,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
@ -851,6 +864,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -868,17 +886,17 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -888,7 +906,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Αποδοχή</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Απόρριψη</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1337,20 +1345,42 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1432,11 +1462,6 @@ Example: https://server.my:8787</source>
<source>Room Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1469,6 +1494,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
@ -1546,6 +1589,14 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation type="unfinished">Αποθήκευση Εικόνας</translation>
</message>
@ -1712,12 +1763,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation type="unfinished"></translation>
</message>
@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation>Ελαχιστοποίηση</translation>
</message>
@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2468,19 +2533,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation type="unfinished">Άκυρο</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation>Όνομα χρήστη</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation>Awaiting Confirmation</translation>
</message>
@ -48,7 +48,7 @@
<translation>Waiting for other side to complete verification.</translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation>Cancel</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>Failed to invite user: %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation>Confirm invite</translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Do you really want to invite %1 (%2)?</translation>
</message>
@ -227,12 +227,12 @@
<translation>Unbanned user: %1</translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation>Do you really want to start a private chat with %1?</translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation>Cache migration failed!</translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation>Decrypt secrets</translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation>Search</translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation>People</translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation>Select a file</translation>
</message>
@ -617,17 +617,43 @@
<translation>All Files (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation>Failed to upload media. Please try again.</translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation>Remove</translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation>Invite users to %1</translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation>User ID to invite</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation>@joe:matrix.org</translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation>Add</translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation>Invite</translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation>Cancel</translation>
</message>
</context>
<context>
@ -744,28 +770,15 @@ Example: https://server.my:8787</translation>
<translation>SSO login failed</translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation>Room members</translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation>OK</translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+128"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+187"/>
<source>Encryption enabled</source>
<translation>Encryption enabled</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation>room name changed to: %1</translation>
</message>
@ -775,7 +788,7 @@ Example: https://server.my:8787</translation>
<translation>removed room name</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation>topic changed to: %1</translation>
</message>
@ -785,17 +798,17 @@ Example: https://server.my:8787</translation>
<translation>removed topic</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation>%1 changed the room avatar</translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation>%1 created and configured room: %2</translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation>%1 placed a voice call.</translation>
</message>
@ -810,23 +823,23 @@ Example: https://server.my:8787</translation>
<translation>%1 placed a call.</translation>
</message>
<message>
<location line="+29"/>
<location line="+38"/>
<source>Negotiating call...</source>
<translation>Negotiating call</translation>
</message>
<message>
<location line="-18"/>
<location line="-24"/>
<source>%1 answered the call.</source>
<translation>%1 answered the call.</translation>
</message>
<message>
<location line="-80"/>
<location line="-99"/>
<location line="+9"/>
<source>removed</source>
<translation>removed</translation>
</message>
<message>
<location line="+80"/>
<location line="+102"/>
<source>%1 ended the call.</source>
<translation>%1 ended the call.</translation>
</message>
@ -834,7 +847,7 @@ Example: https://server.my:8787</translation>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation>Hang up</translation>
</message>
@ -855,6 +868,11 @@ Example: https://server.my:8787</translation>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation>Stickers</translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation>Emoji</translation>
</message>
@ -872,17 +890,17 @@ Example: https://server.my:8787</translation>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation>Edit</translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation>React</translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation>Reply</translation>
</message>
@ -892,7 +910,7 @@ Example: https://server.my:8787</translation>
<translation>Options</translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation>&amp;Copy</translation>
</message>
@ -1100,7 +1118,7 @@ Example: https://server.my:8787</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation>unimplemented event: </translation>
</message>
@ -1220,7 +1238,7 @@ Example: https://server.my:8787</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation>Close</translation>
</message>
@ -1233,7 +1251,7 @@ Example: https://server.my:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation>no version stored</translation>
</message>
@ -1241,7 +1259,7 @@ Example: https://server.my:8787</translation>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation>New tag</translation>
</message>
@ -1281,17 +1299,7 @@ Example: https://server.my:8787</translation>
<translation>Create new tag...</translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation>Accept</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation>Decline</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation>Status Message</translation>
</message>
@ -1341,20 +1349,42 @@ Example: https://server.my:8787</translation>
<translation>User settings</translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation>Members of %1</translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation>
<numerusform>%n person in %1</numerusform>
<numerusform>%n people in %1</numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation>Invite more people</translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation>Room Settings</translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation>%1 member(s)</translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation>SETTINGS</translation>
</message>
@ -1438,11 +1468,6 @@ E2E implementation until device verification is completed.</translation>
<source>Room Version</source>
<translation>Room Version</translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1475,6 +1500,24 @@ E2E implementation until device verification is completed.</translation>
<translation>Failed to upload image: %s</translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation>Pending invite.</translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation>Previewing this room</translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation>No preview available</translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1532,7 +1575,7 @@ E2E implementation until device verification is completed.</translation>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation>Failed</translation>
</message>
@ -1552,6 +1595,14 @@ E2E implementation until device verification is completed.</translation>
<translation>Read</translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation>Search</translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1573,7 +1624,7 @@ E2E implementation until device verification is completed.</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation>Message redaction failed: %1</translation>
</message>
@ -1584,7 +1635,7 @@ E2E implementation until device verification is completed.</translation>
<translation>Failed to encrypt event, sending aborted!</translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation>Save image</translation>
</message>
@ -1718,12 +1769,12 @@ E2E implementation until device verification is completed.</translation>
<translation>%1 redacted their knock.</translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation>You joined this room.</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation>%1 has changed their avatar and changed their display name to %2.</translation>
</message>
@ -1752,7 +1803,7 @@ E2E implementation until device verification is completed.</translation>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation>Edited</translation>
</message>
@ -1760,17 +1811,32 @@ E2E implementation until device verification is completed.</translation>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation>No room open</translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation>%1 member(s)</translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation>join the conversation</translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation>accept invite</translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation>decline invite</translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation>Back to room list</translation>
</message>
@ -1778,7 +1844,7 @@ E2E implementation until device verification is completed.</translation>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</translation>
</message>
@ -1786,18 +1852,17 @@ E2E implementation until device verification is completed.</translation>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation>Back to room list</translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation>No room selected</translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation>Room options</translation>
</message>
@ -1838,7 +1903,7 @@ E2E implementation until device verification is completed.</translation>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation>Global User Profile</translation>
</message>
@ -1848,7 +1913,7 @@ E2E implementation until device verification is completed.</translation>
<translation>Room User Profile</translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation>Verify</translation>
@ -1897,7 +1962,7 @@ E2E implementation until device verification is completed.</translation>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation>Default</translation>
@ -1906,7 +1971,7 @@ E2E implementation until device verification is completed.</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation>Minimize to tray</translation>
</message>
@ -2363,7 +2428,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation>Waiting for other party</translation>
</message>
@ -2414,7 +2479,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation>Yesterday</translation>
</message>
@ -2485,19 +2550,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Open the fallback, follow the steps and confirm after completing them.</translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation>Cancel</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation>User ID to invite</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation>Atendante konfirmon</translation>
</message>
@ -48,7 +48,7 @@
<translation>Atendante kontrolon venontan de la alia flanko.</translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation>Nuligi</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>Malsukcesis inviti uzanton: %1</translation>
</message>
@ -158,12 +158,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation>Konfirmu inviton</translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Ĉu vi certe volas inviti uzanton %1 (%2)?</translation>
</message>
@ -228,12 +228,12 @@
<translation>Malforbaris uzanton: %1</translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation>Ĉu vi certe volas komenci privatan babilon kun %1?</translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation>Malsukcesis migrado de kaŝmemoro!</translation>
</message>
@ -353,7 +353,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation>Malĉifri sekretojn</translation>
</message>
@ -427,12 +427,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation>Serĉu</translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation>Homoj</translation>
</message>
@ -608,7 +608,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation type="unfinished">Elektu dosieron</translation>
</message>
@ -618,17 +618,43 @@
<translation>Ĉiuj dosieroj (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation>Malsukcesis alŝuti vidaŭdaĵojn. Bonvolu reprovi.</translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation>Forigi</translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished">Nuligi</translation>
</message>
</context>
<context>
@ -747,23 +773,10 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation>Malsukcesis ununura saluto</translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation>Membroj de la ĉambro</translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation>Bone</translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+110"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+169"/>
<location line="+9"/>
<source>removed</source>
<translation>forigita</translation>
@ -774,7 +787,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation>Nomo da ĉambro ŝanĝiĝis al: %1</translation>
</message>
@ -784,7 +797,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -794,17 +807,17 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation>%1 metis voĉvokon.</translation>
</message>
@ -819,17 +832,17 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation>%1 metis vokon.</translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>%1 answered the call.</source>
<translation>%1 respondis la vokon.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 ended the call.</source>
<translation>%1 finis la vokon.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>Negotiating call...</source>
<translation>Traktante vokon</translation>
</message>
@ -837,7 +850,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
@ -858,6 +871,11 @@ Ekzemplo: https://servilo.mia:8787</translation>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation>Bildosignoj</translation>
</message>
@ -875,17 +893,17 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation>Redakti</translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation>Reagi</translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation>Respondi</translation>
</message>
@ -895,7 +913,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation>Elektebloj</translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1103,7 +1121,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation>neprogramita okazo: </translation>
</message>
@ -1223,7 +1241,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation>Fermi</translation>
</message>
@ -1236,7 +1254,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1244,7 +1262,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1284,17 +1302,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Akcepti</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Rifuzi</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1344,20 +1352,42 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation type="unfinished">Agordoj de uzanto</translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation>Agordoj de ĉambro</translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation>%1 ĉambrano(j)</translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation>AGORDOJ</translation>
</message>
@ -1439,11 +1469,6 @@ Ekzemplo: https://servilo.mia:8787</translation>
<source>Room Version</source>
<translation>Versio de ĉambro</translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation>Bone</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1476,6 +1501,24 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation>Malsukcesis alŝuti bildon: %s</translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1533,7 +1576,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation>Estas malsukcesa</translation>
</message>
@ -1554,6 +1597,14 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation>Estas legita</translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished">Serĉu</translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1575,7 +1626,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1586,7 +1637,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation>Konservi bildon</translation>
</message>
@ -1722,12 +1773,12 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation>Vi aliĝis ĉi tiun ĉambron.</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1756,7 +1807,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation>Redaktita</translation>
</message>
@ -1764,17 +1815,32 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished">%1 ĉambrano(j)</translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1782,7 +1848,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1790,18 +1856,17 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
@ -1842,7 +1907,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1852,7 +1917,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1901,7 +1966,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1910,7 +1975,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>
@ -2373,7 +2438,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2425,7 +2490,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation>Hieraŭ</translation>
</message>
@ -2496,19 +2561,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation type="unfinished">Nuligi</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation>Esperando confirmación</translation>
</message>
@ -48,7 +48,7 @@
<translation>Esperando a que la otra parte complete la verificación.</translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>No se pudo invitar al usuario: %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation>Confirmar invitación</translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -227,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation type="unfinished"></translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -617,18 +617,44 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
</context>
<context>
<name>LoginPage</name>
@ -740,28 +766,15 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+128"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+187"/>
<source>Encryption enabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -771,7 +784,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -781,17 +794,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
@ -806,23 +819,23 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+29"/>
<location line="+38"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-18"/>
<location line="-24"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-80"/>
<location line="-99"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+80"/>
<location line="+102"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
@ -830,7 +843,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
@ -851,6 +864,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -868,17 +886,17 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -888,7 +906,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Aceptar</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Rechazar</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1337,20 +1345,42 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1432,11 +1462,6 @@ Example: https://server.my:8787</source>
<source>Room Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1469,6 +1494,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
@ -1546,6 +1589,14 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation type="unfinished"></translation>
</message>
@ -1722,12 +1773,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation type="unfinished">Te has unido a esta sala.</translation>
</message>
<message>
<location line="+885"/>
<location line="+911"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation type="unfinished"></translation>
</message>
@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>
@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2468,19 +2533,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation>Ootan kinnitust</translation>
</message>
@ -48,7 +48,7 @@
<translation>Ootan et teine osapool lõpetaks verifitseerimise.</translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation>Katkesta</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>Kutse saatmine kasutajale ei õnnestunud: %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation>Kinnita kutse</translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Kas sa tõesti soovid saata kutset kasutajale %1 (%2)?</translation>
</message>
@ -227,12 +227,12 @@
<translation>Suhtluskeeld eemaldatud: %1</translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation>Kas sa kindlasti soovid alustada otsevestlust kasutajaga %1?</translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation>Puhvri versiooniuuendus ebaõnnestus!</translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation>Dekrüpti andmed</translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation>Otsi</translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation>Inimesed</translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation>Vali fail</translation>
</message>
@ -617,17 +617,43 @@
<translation>Kõik failid (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation>Meediafailide üleslaadimine ei õnnestunud. Palun proovi uuesti.</translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation>Eemalda</translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished">Kasutajatunnus, kellele soovid kutset saata</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -744,28 +770,15 @@ Näiteks: https://server.minu:8787</translation>
<translation>Ühekordne sisselogimine ei õnnestunud</translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation>Jututoa liikmed</translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation>Sobib</translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+128"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+187"/>
<source>Encryption enabled</source>
<translation>Krüptimine on kasutusel</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation>jututoa uus nimi on: %1</translation>
</message>
@ -775,7 +788,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>eemaldas jututoa nime</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation>jututoa uus teema on: %1</translation>
</message>
@ -785,17 +798,17 @@ Näiteks: https://server.minu:8787</translation>
<translation>teema on eemaldatud</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation>%1 muutis jututoa tunnuspilti</translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation>%1 lõi ja seadistas jututoa: %2</translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation>%1 helistas.</translation>
</message>
@ -810,23 +823,23 @@ Näiteks: https://server.minu:8787</translation>
<translation>%1 helistas.</translation>
</message>
<message>
<location line="+29"/>
<location line="+38"/>
<source>Negotiating call...</source>
<translation>Ühendan kõnet</translation>
</message>
<message>
<location line="-18"/>
<location line="-24"/>
<source>%1 answered the call.</source>
<translation>%1 vastas kõnele.</translation>
</message>
<message>
<location line="-80"/>
<location line="-99"/>
<location line="+9"/>
<source>removed</source>
<translation>eemaldatud</translation>
</message>
<message>
<location line="+80"/>
<location line="+102"/>
<source>%1 ended the call.</source>
<translation>%1 lõpetas kõne.</translation>
</message>
@ -834,7 +847,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation>Lõpeta kõne</translation>
</message>
@ -855,6 +868,11 @@ Näiteks: https://server.minu:8787</translation>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation>Emoji</translation>
</message>
@ -872,17 +890,17 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation>Muuda</translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation>Reageeri</translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation>Vasta</translation>
</message>
@ -892,7 +910,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>Valikud</translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation>&amp;Kopeeri</translation>
</message>
@ -1100,7 +1118,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation>implementeerimata sündmus: </translation>
</message>
@ -1220,7 +1238,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation>Sulge</translation>
</message>
@ -1233,7 +1251,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation>salvestatud versiooni ei leidu</translation>
</message>
@ -1241,7 +1259,7 @@ Näiteks: https://server.minu:8787</translation>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation>Uus silt</translation>
</message>
@ -1281,17 +1299,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>Loo uus silt...</translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation>Nõustu</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation>Keeldu</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation>Olekuteade</translation>
</message>
@ -1341,20 +1349,42 @@ Näiteks: https://server.minu:8787</translation>
<translation>Kasutaja seadistused</translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation>Jututoa seadistused</translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation>%1 liige(t)</translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation>SEADISTUSED</translation>
</message>
@ -1438,11 +1468,6 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<source>Room Version</source>
<translation>Jututoa versioon</translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation>Sobib</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1475,6 +1500,24 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<translation>Viga faili üleslaadimisel: %1</translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1532,7 +1575,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation>Ebaõnnestus</translation>
</message>
@ -1552,6 +1595,14 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<translation>Loetud</translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished">Otsi</translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1573,7 +1624,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation>Sõnumi ümbersõnastamine ebaõnnestus: %1</translation>
</message>
@ -1584,7 +1635,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<translation>Sündmuse krüptimine ei õnnestunud, katkestame saatmise!</translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation>Salvesta pilt</translation>
</message>
@ -1718,12 +1769,12 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<translation>%1 muutis oma koputust jututoa uksele.</translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation>Sa liitusid jututoaga.</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation>%1 muutis oma tunnuspilti ja seadistas uueks kuvatavaks nimeks %2.</translation>
</message>
@ -1752,7 +1803,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation>Muudetud</translation>
</message>
@ -1760,17 +1811,32 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation>Ühtegi jututuba pole avatud</translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation>%1 liige(t)</translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation>Tagasi jututubade loendisse</translation>
</message>
@ -1778,7 +1844,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation>Ühtegi krüptitud vestlust selle kasutajaga ei leidunud. Palun loo temaga krüptitud vestlus ja proovi uuesti.</translation>
</message>
@ -1786,18 +1852,17 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation>Tagasi jututubade loendisse</translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation>Jututuba on valimata</translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation>Jututoa valikud</translation>
</message>
@ -1838,7 +1903,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation>Üldine kasutajaprofiil</translation>
</message>
@ -1848,7 +1913,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<translation>Kasutajaprofiil jututoas</translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation>Verifitseeri</translation>
@ -1897,7 +1962,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation>Vaikimisi</translation>
@ -1906,7 +1971,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation>Vähenda tegumiribale</translation>
</message>
@ -2363,7 +2428,7 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation>Ootan teise osapoole tegevust</translation>
</message>
@ -2414,7 +2479,7 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation>Eile</translation>
</message>
@ -2485,19 +2550,6 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim
<translation>Ava kasutaja registreerimise tagavaravariant, läbi kõik sammud ja kinnita seda, kui kõik valmis on.</translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation>Tühista</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation>Kasutajatunnus, kellele soovid kutset saata</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation>Odotetaan vahvistusta</translation>
</message>
@ -48,7 +48,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation>Peruuta</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -227,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation>Hae</translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation>Ihmiset</translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation>Valitse tiedosto</translation>
</message>
@ -617,17 +617,43 @@
<translation>Kaikki Tiedostot (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation>Poista</translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished">Käyttäjätunnus kutsuttavaksi</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished">Peruuta</translation>
</message>
</context>
<context>
@ -740,23 +766,10 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation>Huoneen jäsenet</translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation>OK</translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+110"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+169"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
@ -767,7 +780,7 @@ Example: https://server.my:8787</source>
<translation>Salaus on käytössä</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation>huoneen nimi muutettu: %1</translation>
</message>
@ -777,7 +790,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -787,17 +800,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
@ -812,17 +825,17 @@ Example: https://server.my:8787</source>
<translation>%1 soitti puhelun.</translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>%1 answered the call.</source>
<translation>%1 vastasi puheluun.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
@ -830,7 +843,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
@ -851,6 +864,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation>Emoji</translation>
</message>
@ -868,17 +886,17 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation>Muokkaa</translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation>Reagoi</translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation>Vastaa</translation>
</message>
@ -888,7 +906,7 @@ Example: https://server.my:8787</source>
<translation>Asetukset</translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation>Sulje</translation>
</message>
@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation>ei tallennettua versiota</translation>
</message>
@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation>Hyväksy</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation>Hylkää</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1337,20 +1345,42 @@ Example: https://server.my:8787</source>
<translation>Käyttäjäasetukset</translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1432,11 +1462,6 @@ Example: https://server.my:8787</source>
<source>Room Version</source>
<translation>Huoneen versio</translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1469,6 +1494,24 @@ Example: https://server.my:8787</source>
<translation>Kuvan lähetys epäonnistui: %s</translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
@ -1546,6 +1589,14 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished">Hae</translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation>Viestin muokkaus epäonnistui: %1</translation>
</message>
@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation>Tallenna kuva</translation>
</message>
@ -1712,12 +1763,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation>Sinä liityit tähän huoneeseen.</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation>Muokattu</translation>
</message>
@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation>Huoneen asetukset</translation>
</message>
@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation>Pienennä ilmoitusalueelle</translation>
</message>
@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation>Eilen</translation>
</message>
@ -2468,19 +2533,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation>Peruuta</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation>Käyttäjätunnus kutsuttavaksi</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation>Attente de confirmation</translation>
</message>
@ -48,7 +48,7 @@
<translation>Attente de la vérification par le correspondant.</translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation>Annuler</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>Échec lors de l&apos;invitation de %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation>Confirmer l&apos;invitation</translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Voulez-vous vraiment inviter %1 (%2)&#x202f;?</translation>
</message>
@ -227,12 +227,12 @@
<translation>%1 n&apos;est plus banni(e)</translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation>Voulez-vous vraimer commencer une discussion privée avec %1 ?</translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation>Échec de la migration du cache&#x202f;!</translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation>Déchiffrer les secrets</translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation>Chercher</translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation>Personnes</translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation>Sélectionnez un fichier</translation>
</message>
@ -617,17 +617,43 @@
<translation>Tous les types de fichiers (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation>Échec de l&apos;envoi du média. Veuillez réessayer.</translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation>Retirer</translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished">Identifiant d&apos;utilisateur à inviter</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished">Annuler</translation>
</message>
</context>
<context>
@ -744,23 +770,10 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Échec de la connexion SSO</translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation>Membres du salon</translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation>OK</translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+110"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+169"/>
<location line="+9"/>
<source>removed</source>
<translation>retiré</translation>
@ -771,7 +784,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Chiffrement activé</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation>nom du salon changé en&#xa0;: %1</translation>
</message>
@ -781,7 +794,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>nom du salon retiré</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation>sujet changé pour&#xa0;: %1</translation>
</message>
@ -791,17 +804,17 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>sujet retiré</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation>%1 a créé et configuré le salon&#xa0;: %2</translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation>%1 a effectué un appel vocal.</translation>
</message>
@ -816,17 +829,17 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>%1 a appelé.</translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>%1 answered the call.</source>
<translation>%1 a répondu à l&apos;appel.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 ended the call.</source>
<translation>%1 a terminé l&apos;appel.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>Negotiating call...</source>
<translation>Négociation de l&apos;appel</translation>
</message>
@ -834,7 +847,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation>Raccrocher</translation>
</message>
@ -855,6 +868,11 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation>Émoji</translation>
</message>
@ -872,17 +890,17 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation>Modifier</translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation>Réagir</translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation>Répondre</translation>
</message>
@ -892,7 +910,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Options</translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1100,7 +1118,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation>Évènement non implémenté&#xa0;: </translation>
</message>
@ -1220,7 +1238,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation>Fermer</translation>
</message>
@ -1233,7 +1251,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation>pas de version enregistrée</translation>
</message>
@ -1241,7 +1259,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1281,17 +1299,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1341,20 +1349,42 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation type="unfinished">Paramètres utilisateur</translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation>Configuration du salon</translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation>%1 membre(s)</translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation>CONFIGURATION</translation>
</message>
@ -1438,11 +1468,6 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<source>Room Version</source>
<translation>Version du salon</translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1475,6 +1500,24 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<translation type="unfinished">Échec de l&apos;envoi de l&apos;image&#xa0;&#xa0;: %s</translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1532,7 +1575,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation>Échec</translation>
</message>
@ -1552,6 +1595,14 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<translation>Lu</translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished">Chercher</translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1573,7 +1624,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation>Échec de la suppression du message&#xa0;: %1</translation>
</message>
@ -1584,7 +1635,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<translation>Échec du chiffrement de l&apos;évènement, envoi abandonné&#x202f;!</translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation>Enregistrer l&apos;image</translation>
</message>
@ -1718,12 +1769,12 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<translation>%1 ne frappe plus au salon.</translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation>Vous avez rejoint ce salon.</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1752,7 +1803,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation>Modifié</translation>
</message>
@ -1760,17 +1811,32 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation>Aucun salon ouvert</translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished">%1 membre(s)</translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished">Revenir à la liste des salons</translation>
</message>
@ -1778,7 +1844,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation>Pas de discussion privée et chiffrée trouvée avec cet utilisateur. Créez-en une et réessayez.</translation>
</message>
@ -1786,18 +1852,17 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation>Revenir à la liste des salons</translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation>Pas de salon sélectionné</translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation>Options du salon</translation>
</message>
@ -1838,7 +1903,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation>Profil général de l&apos;utilisateur</translation>
</message>
@ -1848,7 +1913,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<translation>Profil utilisateur spécifique au salon</translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation>Vérifier</translation>
@ -1897,7 +1962,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation>Défaut</translation>
@ -1906,7 +1971,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation>Réduire à la barre des tâches</translation>
</message>
@ -2365,7 +2430,7 @@ Cela met l&apos;application en évidence dans la barre des tâches.</translation
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation>Attente du correspondant</translation>
</message>
@ -2416,7 +2481,7 @@ Cela met l&apos;application en évidence dans la barre des tâches.</translation
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation>Hier</translation>
</message>
@ -2487,19 +2552,6 @@ Cela met l&apos;application en évidence dans la barre des tâches.</translation
<translation>Ouvrez la solution de repli, suivez les étapes et confirmez après les avoir terminées.</translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation>Annuler</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation>Identifiant d&apos;utilisateur à inviter</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation>Várakozás megerősítésre</translation>
</message>
@ -48,7 +48,7 @@
<translation>Várakozás a másik oldalra a hitelesítés befejezéséhez.</translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation>Mégse</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>Nem sikerült meghívni a felhasználót: %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation>Meghívás megerősítése</translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Biztos, hogy meg akarod hívni a következő felhasználót: %1 (%2)?</translation>
</message>
@ -227,12 +227,12 @@
<translation>Kitiltás feloldva a felhasználónak: %1</translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation>Biztosan privát csevegést akarsz indítani %1 felhasználóval?</translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation>Gyorsítótár migráció nem sikerült!</translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation>Titkos tároló feloldása</translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation>Keresés</translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation>Emberek</translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation>Fájl kiválasztása</translation>
</message>
@ -617,17 +617,43 @@
<translation>Minden fájl (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation>Nem sikerült feltölteni a médiafájlt. Kérlek, próbáld újra!</translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation>Eltávolítás</translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished">Meghívandó felhasználó azonosítója</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished">Mégse</translation>
</message>
</context>
<context>
@ -744,28 +770,15 @@ Példa: https://szerver.em:8787</translation>
<translation>SSO bejelentkezés nem sikerült</translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation>Szobatagok</translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation>OK</translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+128"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+187"/>
<source>Encryption enabled</source>
<translation>Titkosítás bekapcsolva</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation>a szoba neve megváltoztatva erre: %1</translation>
</message>
@ -775,7 +788,7 @@ Példa: https://szerver.em:8787</translation>
<translation>szobanév eltávolítva</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation>a téma megváltoztatva erre: %1</translation>
</message>
@ -785,17 +798,17 @@ Példa: https://szerver.em:8787</translation>
<translation>téma eltávolítva</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation>%1 létrehozta és beállította a következő szobát: %2</translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation>%1 hanghívást kezdeményezett.</translation>
</message>
@ -810,23 +823,23 @@ Példa: https://szerver.em:8787</translation>
<translation>%1 hívást kezdeményezett.</translation>
</message>
<message>
<location line="+29"/>
<location line="+38"/>
<source>Negotiating call...</source>
<translation>Hívás előkészítése</translation>
</message>
<message>
<location line="-18"/>
<location line="-24"/>
<source>%1 answered the call.</source>
<translation>%1 fogadta a hívást.</translation>
</message>
<message>
<location line="-80"/>
<location line="-99"/>
<location line="+9"/>
<source>removed</source>
<translation>eltávolítva</translation>
</message>
<message>
<location line="+80"/>
<location line="+102"/>
<source>%1 ended the call.</source>
<translation>%1 befejezte a hívást.</translation>
</message>
@ -834,7 +847,7 @@ Példa: https://szerver.em:8787</translation>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation>Hívás befejezése</translation>
</message>
@ -855,6 +868,11 @@ Példa: https://szerver.em:8787</translation>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation>Hangulatjelek</translation>
</message>
@ -872,17 +890,17 @@ Példa: https://szerver.em:8787</translation>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation>Szerkesztés</translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation>Reakció</translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation>Válasz</translation>
</message>
@ -892,7 +910,7 @@ Példa: https://szerver.em:8787</translation>
<translation>Műveletek</translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1100,7 +1118,7 @@ Példa: https://szerver.em:8787</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation>nem implementált esemény: </translation>
</message>
@ -1220,7 +1238,7 @@ Példa: https://szerver.em:8787</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation>Bezárás</translation>
</message>
@ -1233,7 +1251,7 @@ Példa: https://szerver.em:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation>nincs tárolva verzió</translation>
</message>
@ -1241,7 +1259,7 @@ Példa: https://szerver.em:8787</translation>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1281,17 +1299,7 @@ Példa: https://szerver.em:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Elfogadás</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Elutasítás</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1341,20 +1349,41 @@ Példa: https://szerver.em:8787</translation>
<translation type="unfinished">Felhasználói beállítások</translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation>Szobabeállítások</translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation>%1 tag</translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation>BEÁLLÍTÁSOK</translation>
</message>
@ -1438,11 +1467,6 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<source>Room Version</source>
<translation>Szoba verziója</translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1475,6 +1499,24 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<translation>Nem sikerült a kép feltöltése: %s</translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1532,7 +1574,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation>Sikertelen</translation>
</message>
@ -1552,6 +1594,14 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<translation>Elolvasva</translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished">Keresés</translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1573,7 +1623,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation>Az üzenet visszavonása nem sikerült: %1</translation>
</message>
@ -1584,7 +1634,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<translation>Nem sikerült titkosítani az eseményt, küldés megszakítva!</translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation>Kép mentése</translation>
</message>
@ -1717,12 +1767,12 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<translation>%1 visszavonta a kopogását.</translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation>Csatlakoztál ehhez a szobához.</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1751,7 +1801,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation>Szerkesztve</translation>
</message>
@ -1759,17 +1809,32 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation>Nincs nyitott szoba</translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished">%1 tag</translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished">Vissza a szobák listájára</translation>
</message>
@ -1777,7 +1842,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation>Nem található titkosított privát csevegés ezzel a felhasználóval. Hozz létre egy titkosított privát csevegést vele, és próbáld újra!</translation>
</message>
@ -1785,18 +1850,17 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation>Vissza a szobák listájára</translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation>Nincs kiválasztva szoba</translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation>Szoba beállításai</translation>
</message>
@ -1837,7 +1901,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation>Globális felhasználói profil</translation>
</message>
@ -1847,7 +1911,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<translation>Szobai felhasználói profil</translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation>Hitelesítés</translation>
@ -1896,7 +1960,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation>Alapértelmezett</translation>
@ -1905,7 +1969,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation>Kicsinyítés a tálcára</translation>
</message>
@ -2363,7 +2427,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation>Várakozás a másik félre</translation>
</message>
@ -2414,7 +2478,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation>Tegnap</translation>
</message>
@ -2485,19 +2549,6 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő
<translation>Nyisd meg a fallback-ket, kövesd az utasításokat, és erősítsd meg, ha végeztél velük!</translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation>Mégse</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation>Meghívandó felhasználó azonosítója</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation>In attesa di conferma</translation>
</message>
@ -48,7 +48,7 @@
<translation>In attesa della conferma dall&apos;altra parte per la verifica.</translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation>Annulla</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>Impossibile invitare l&apos;utente: %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation>Conferma Invito</translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Vuoi davvero inviare %1 (%2)?</translation>
</message>
@ -227,12 +227,12 @@
<translation>Rimosso il ban dall&apos;utente: %1</translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation>Sei sicuro di voler avviare una chat privata con %1?</translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation>Migrazione della cache fallita!</translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation>Decifra i segreti</translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation>Cerca</translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation>Membri</translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation type="unfinished">Seleziona un file</translation>
</message>
@ -617,17 +617,43 @@
<translation type="unfinished">Tutti i File (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished">Impossibile inviare il file multimediale. Per favore riprova.</translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation>Rimuovi</translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished">ID utente da invitare</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished">Annulla</translation>
</message>
</context>
<context>
@ -744,23 +770,10 @@ Esempio: https://server.mio:8787</translation>
<translation>Accesso SSO fallito</translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation>Membri della stanza</translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation>OK</translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+110"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+169"/>
<location line="+9"/>
<source>removed</source>
<translation>rimosso</translation>
@ -771,7 +784,7 @@ Esempio: https://server.mio:8787</translation>
<translation>Crittografia abilitata</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation>nome della stanza cambiato in: %1</translation>
</message>
@ -781,7 +794,7 @@ Esempio: https://server.mio:8787</translation>
<translation>nome della stanza rimosso</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation>argomento cambiato in: %1</translation>
</message>
@ -791,17 +804,17 @@ Esempio: https://server.mio:8787</translation>
<translation>argomento rimosso</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation>%1 creato e configurata stanza: %2</translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation>%1 ha avviato una chiamata audio.</translation>
</message>
@ -816,17 +829,17 @@ Esempio: https://server.mio:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>%1 answered the call.</source>
<translation>%1 ha risposto alla chiamata.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 ended the call.</source>
<translation>%1 ha terminato la chiamata.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
@ -834,7 +847,7 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation>Termina</translation>
</message>
@ -855,6 +868,11 @@ Esempio: https://server.mio:8787</translation>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation type="unfinished">Emoji</translation>
</message>
@ -872,17 +890,17 @@ Esempio: https://server.mio:8787</translation>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation>Modifica</translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation>Reagisci</translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished">Risposta</translation>
</message>
@ -892,7 +910,7 @@ Esempio: https://server.mio:8787</translation>
<translation type="unfinished">Opzioni</translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1101,7 +1119,7 @@ Verificare %1 adesso?</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation>evento non implementato: </translation>
</message>
@ -1221,7 +1239,7 @@ Verificare %1 adesso?</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation>Chiudi</translation>
</message>
@ -1234,7 +1252,7 @@ Verificare %1 adesso?</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation>nessuna versione memorizzata</translation>
</message>
@ -1242,7 +1260,7 @@ Verificare %1 adesso?</translation>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1282,17 +1300,7 @@ Verificare %1 adesso?</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Accetta</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Rifiuta</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1342,20 +1350,42 @@ Verificare %1 adesso?</translation>
<translation type="unfinished">Impostazioni utente</translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1437,11 +1467,6 @@ Verificare %1 adesso?</translation>
<source>Room Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation type="unfinished">OK</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1474,6 +1499,24 @@ Verificare %1 adesso?</translation>
<translation type="unfinished">Impossibile fare l&apos;upload dell&apos;immagine: %s</translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1531,7 +1574,7 @@ Verificare %1 adesso?</translation>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation>Fallito</translation>
</message>
@ -1551,6 +1594,14 @@ Verificare %1 adesso?</translation>
<translation>Letto</translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished">Cerca</translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1572,7 +1623,7 @@ Verificare %1 adesso?</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation>Oscuramento del messaggio fallito: %1</translation>
</message>
@ -1583,7 +1634,7 @@ Verificare %1 adesso?</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation>Salva immagine</translation>
</message>
@ -1717,12 +1768,12 @@ Verificare %1 adesso?</translation>
<translation>%1 ha oscurato la sua bussata.</translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation>Sei entrato in questa stanza.</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1751,7 +1802,7 @@ Verificare %1 adesso?</translation>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation type="unfinished"></translation>
</message>
@ -1759,17 +1810,32 @@ Verificare %1 adesso?</translation>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation>Nessuna stanza aperta</translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1777,7 +1843,7 @@ Verificare %1 adesso?</translation>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1785,18 +1851,17 @@ Verificare %1 adesso?</translation>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation type="unfinished">Opzioni della stanza</translation>
</message>
@ -1837,7 +1902,7 @@ Verificare %1 adesso?</translation>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1847,7 +1912,7 @@ Verificare %1 adesso?</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1896,7 +1961,7 @@ Verificare %1 adesso?</translation>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1905,7 +1970,7 @@ Verificare %1 adesso?</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation>Minimizza nella tray</translation>
</message>
@ -2351,7 +2416,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2402,7 +2467,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation>Ieri</translation>
</message>
@ -2473,19 +2538,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Apri il ripiego, segui i passaggi e conferma dopo averli completati.</translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation>Annulla</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation>ID utente da invitare</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +48,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>: %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -227,12 +227,12 @@
<translation>: %1</translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation type="unfinished"></translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -617,17 +617,43 @@
<translation type="unfinished"> (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation></translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished">ID</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -740,23 +766,10 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation></translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation>OK</translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+110"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+169"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
@ -767,7 +780,7 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation>: %1</translation>
</message>
@ -777,7 +790,7 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation>: %1</translation>
</message>
@ -787,17 +800,17 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
@ -812,17 +825,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
@ -830,7 +843,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
@ -851,6 +864,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -868,17 +886,17 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -888,7 +906,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation>: </translation>
</message>
@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation></translation>
</message>
@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1337,20 +1345,41 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1432,11 +1461,6 @@ Example: https://server.my:8787</source>
<source>Room Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation type="unfinished">OK</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1469,6 +1493,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished">: %s</translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1526,7 +1568,7 @@ Example: https://server.my:8787</source>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation></translation>
</message>
@ -1546,6 +1588,14 @@ Example: https://server.my:8787</source>
<translation></translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1567,7 +1617,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation>: %1</translation>
</message>
@ -1578,7 +1628,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation></translation>
</message>
@ -1711,12 +1761,12 @@ Example: https://server.my:8787</source>
<translation>%1</translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1745,7 +1795,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation type="unfinished"></translation>
</message>
@ -1753,17 +1803,32 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation></translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1771,7 +1836,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1779,18 +1844,17 @@ Example: https://server.my:8787</source>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
@ -1831,7 +1895,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1841,7 +1905,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1890,7 +1954,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1899,7 +1963,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation></translation>
</message>
@ -2345,7 +2409,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2396,7 +2460,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation></translation>
</message>
@ -2467,19 +2531,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation></translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation>ID</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation>ിിി ിി</translation>
</message>
@ -48,7 +48,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation></translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>ി ിി : %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation> </translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -227,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation>ി</translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation></translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation> ി</translation>
</message>
@ -617,17 +617,43 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation></translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -740,28 +766,15 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation>ി</translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+128"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+187"/>
<source>Encryption enabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -771,7 +784,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -781,17 +794,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
@ -806,23 +819,23 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+29"/>
<location line="+38"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-18"/>
<location line="-24"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-80"/>
<location line="-99"/>
<location line="+9"/>
<source>removed</source>
<translation></translation>
</message>
<message>
<location line="+80"/>
<location line="+102"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
@ -830,7 +843,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
@ -851,6 +864,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation>ി</translation>
</message>
@ -868,17 +886,17 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -888,7 +906,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">ിി</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1337,20 +1345,42 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1432,11 +1462,6 @@ Example: https://server.my:8787</source>
<source>Room Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation type="unfinished">ി</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1469,6 +1494,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
@ -1546,6 +1589,14 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished">ി</translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation type="unfinished"></translation>
</message>
@ -1712,12 +1763,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation type="unfinished">ി ിി .</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation type="unfinished"></translation>
</message>
@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>
@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2468,19 +2533,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +48,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation type="unfinished">Annuleren</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>Gebruiker uitnodigen mislukt: %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -227,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation type="unfinished"></translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation type="unfinished">Kies een bestand</translation>
</message>
@ -617,18 +617,44 @@
<translation type="unfinished">Alle bestanden (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished">Uit te nodigen gebruikers-id</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished">Annuleren</translation>
</message>
</context>
<context>
<name>LoginPage</name>
@ -740,23 +766,10 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation>Kamerleden</translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+110"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+169"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
@ -767,7 +780,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -777,7 +790,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -787,17 +800,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
@ -812,17 +825,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
@ -830,7 +843,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
@ -851,6 +864,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -868,17 +886,17 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -888,7 +906,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Accepteren</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Afwijzen</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1337,20 +1345,42 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1432,11 +1462,6 @@ Example: https://server.my:8787</source>
<source>Room Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1469,6 +1494,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
@ -1546,6 +1589,14 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation type="unfinished">Afbeelding opslaan</translation>
</message>
@ -1712,12 +1763,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation type="unfinished">Je bent lid geworden van deze kamer.</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation type="unfinished"></translation>
</message>
@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation>Minimaliseren naar systeemvak</translation>
</message>
@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2468,19 +2533,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation type="unfinished">Annuleren</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation>Uit te nodigen gebruikers-id</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation>Oczekiwanie na potwierdzenie</translation>
</message>
@ -48,7 +48,7 @@
<translation>Oczekiwanie na dokończenie weryfikacji przez drugą stronę.</translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation>Anuluj</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>Nie udało się zaprosić użytkownika: %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Czy na pewno chcesz zaprosić %1 (%2)?</translation>
</message>
@ -227,12 +227,12 @@
<translation>Odblokowano użytkownika: %1</translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation>Nie udało się przenieść pamięci podręcznej!</translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation>Szukaj</translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation>Ludzie</translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation type="unfinished">Wybierz plik</translation>
</message>
@ -617,17 +617,43 @@
<translation type="unfinished">Wszystkie pliki (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation>Usuń</translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished">ID użytkownika do zaproszenia</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished">Anuluj</translation>
</message>
</context>
<context>
@ -742,23 +768,10 @@ Example: https://server.my:8787</source>
<translation>Logowanie SSO zakończone niepowodzeniem</translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation>Członkowie pokoju</translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation>OK</translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+110"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+169"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
@ -769,7 +782,7 @@ Example: https://server.my:8787</source>
<translation>Szyfrowanie włączone</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation>Nazwa pokoju zmieniona na: %1</translation>
</message>
@ -779,7 +792,7 @@ Example: https://server.my:8787</source>
<translation>usunięto nazwę pokoju</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation>temat zmieniono na: %1</translation>
</message>
@ -789,17 +802,17 @@ Example: https://server.my:8787</source>
<translation>usunięto temat</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation>%1 utworzył i skonfigurował pokój: %2</translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation>%1 rozpoczął(-ęła) połączenie głosowe.</translation>
</message>
@ -814,17 +827,17 @@ Example: https://server.my:8787</source>
<translation>%1 rozpoczął(-ęła) połączenie.</translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>%1 answered the call.</source>
<translation>%1 odebrał(a) połączenie.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 ended the call.</source>
<translation>%1 zakończył(a) połączenie.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>Negotiating call...</source>
<translation>Negocjowanie połączenia</translation>
</message>
@ -832,7 +845,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
@ -853,6 +866,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation type="unfinished">Emoji</translation>
</message>
@ -870,17 +888,17 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -890,7 +908,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1098,7 +1116,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation>Niezaimplementowane wydarzenie: </translation>
</message>
@ -1218,7 +1236,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation>Zamknij</translation>
</message>
@ -1231,7 +1249,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1239,7 +1257,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1279,17 +1297,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Akceptuj</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Odrzuć</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1339,20 +1347,43 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Ustawienia użytkownika</translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1434,11 +1465,6 @@ Example: https://server.my:8787</source>
<source>Room Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation type="unfinished">OK</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1471,6 +1497,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Nie udało się wysłać obrazu: %s</translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1528,7 +1572,7 @@ Example: https://server.my:8787</source>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
@ -1548,6 +1592,14 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished">Szukaj</translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1569,7 +1621,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation>
</message>
@ -1580,7 +1632,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation type="unfinished">Zapisz obraz</translation>
</message>
@ -1715,12 +1767,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation type="unfinished">Dołączyłeś(-ł) do tego pokoju.</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1749,7 +1801,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation type="unfinished"></translation>
</message>
@ -1757,17 +1809,32 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1775,7 +1842,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1783,18 +1850,17 @@ Example: https://server.my:8787</source>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation type="unfinished">Ustawienia pokoju</translation>
</message>
@ -1835,7 +1901,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1845,7 +1911,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1894,7 +1960,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1903,7 +1969,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation>Zminimalizuj do paska zadań</translation>
</message>
@ -2349,7 +2415,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2400,7 +2466,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2471,19 +2537,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation>Anuluj</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation>ID użytkownika do zaproszenia</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +48,7 @@
<translation>Esperando o outro lado completar a verificação.</translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation>Cancelar</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>Falha ao convidar usuário: %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation>Confirmar convite</translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -227,12 +227,12 @@
<translation>Usuário desbanido: %1</translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation>Migração do cache falhou!</translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation type="unfinished"></translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -617,18 +617,44 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
</context>
<context>
<name>LoginPage</name>
@ -740,28 +766,15 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+128"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+187"/>
<source>Encryption enabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -771,7 +784,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -781,17 +794,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
@ -806,23 +819,23 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+29"/>
<location line="+38"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-18"/>
<location line="-24"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-80"/>
<location line="-99"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+80"/>
<location line="+102"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
@ -830,7 +843,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
@ -851,6 +864,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -868,17 +886,17 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -888,7 +906,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Aceitar</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Rejeitar</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1337,20 +1345,42 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1432,11 +1462,6 @@ Example: https://server.my:8787</source>
<source>Room Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1469,6 +1494,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
@ -1546,6 +1589,14 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation type="unfinished"></translation>
</message>
@ -1712,12 +1763,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation type="unfinished">Você entrou nessa sala.</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation type="unfinished"></translation>
</message>
@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>
@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2468,19 +2533,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +48,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -227,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation type="unfinished"></translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -617,16 +617,42 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -740,28 +766,15 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+128"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+187"/>
<source>Encryption enabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -771,7 +784,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -781,17 +794,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
@ -806,23 +819,23 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+29"/>
<location line="+38"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-18"/>
<location line="-24"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-80"/>
<location line="-99"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+80"/>
<location line="+102"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
@ -830,7 +843,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
@ -851,6 +864,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -868,17 +886,17 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -888,7 +906,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1337,20 +1345,42 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1432,11 +1462,6 @@ Example: https://server.my:8787</source>
<source>Room Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1469,6 +1494,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
@ -1546,6 +1589,14 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation type="unfinished"></translation>
</message>
@ -1712,12 +1763,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation type="unfinished"></translation>
</message>
@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>
@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2468,19 +2533,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +48,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>Nu s-a putut invita utilizatorul: %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -227,12 +227,12 @@
<translation>Utilizator dezinterzis: %1</translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation>Nu s-a putut migra cache-ul!</translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation type="unfinished"></translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -617,17 +617,43 @@
<translation type="unfinished">Toate fișierele (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation>Ștergere</translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished">IDul utilizatorului de invitat</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -744,23 +770,10 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>Conectarea SSO a eșuat</translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation>Membrii camerei</translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation>OK</translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+110"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+169"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
@ -771,7 +784,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>Criptare activată</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation>numele camerei schimbat la: %1</translation>
</message>
@ -781,7 +794,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>numele camerei șters</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation>subiect schimbat la: %1</translation>
</message>
@ -791,17 +804,17 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>subiect șters</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation>%1 a creat și configurat camera: %2</translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
@ -816,17 +829,17 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>%1 answered the call.</source>
<translation>%1 a răspuns apelului.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 ended the call.</source>
<translation>%1 a închis apelul.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
@ -834,7 +847,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
@ -855,6 +868,11 @@ Exemplu: https://serverul.meu:8787</translation>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -872,17 +890,17 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished">Răspuns</translation>
</message>
@ -892,7 +910,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished">Opțiuni</translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1100,7 +1118,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation>eveniment neimplementat: </translation>
</message>
@ -1220,7 +1238,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation type="unfinished">Închide</translation>
</message>
@ -1233,7 +1251,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation>nicio versiune stocată</translation>
</message>
@ -1241,7 +1259,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1281,17 +1299,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Acceptare</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Refuzare</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1341,20 +1349,43 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished">Setări utilizator</translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1436,11 +1467,6 @@ Exemplu: https://serverul.meu:8787</translation>
<source>Room Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation type="unfinished">OK</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1473,6 +1499,24 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished">Nu s-a putut încărca imaginea: %s</translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1530,7 +1574,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation>Eșuat</translation>
</message>
@ -1550,6 +1594,14 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>Citit</translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1571,7 +1623,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation>Redactare mesaj eșuată: %1</translation>
</message>
@ -1582,7 +1634,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation>Salvați imaginea</translation>
</message>
@ -1717,12 +1769,12 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>%1 și-a redactat ciocănitul.</translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation>Te-ai alăturat camerei.</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1751,7 +1803,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation type="unfinished"></translation>
</message>
@ -1759,17 +1811,32 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation>Nicio cameră deschisă</translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1777,7 +1844,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1785,18 +1852,17 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
@ -1837,7 +1903,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1847,7 +1913,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1896,7 +1962,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1905,7 +1971,7 @@ Exemplu: https://serverul.meu:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation>Minimizează în bara de notificări</translation>
</message>
@ -2351,7 +2417,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2402,7 +2468,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation>Ieri</translation>
</message>
@ -2473,19 +2539,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Deschideți fallback, urmăriți pașii și confirmați după ce i-ați completat.</translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation>Anulare</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation>IDul utilizatorului de invitat</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation>Ожидание Подтверждения</translation>
</message>
@ -48,7 +48,7 @@
<translation>Ожидание подтверждения у собеседника.</translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation>Отмена</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>Не удалось пригласить пользователя: %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation>Подтвердите приглашение</translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Вы точно хотите пригласить %1 (%2)?</translation>
</message>
@ -227,12 +227,12 @@
<translation>Разблокированный пользователь: %1</translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation>Вы действительно хотите начать личную переписку с %1?</translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation>Миграция кэша не удалась!</translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation>Расшифровать секреты</translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation>Поиск</translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation>Люди</translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation>Выберите файл</translation>
</message>
@ -617,17 +617,43 @@
<translation>Все файлы (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation>Не удалось загрузить медиа. Пожалуйста попробуйте ещё раз</translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation>Удалить</translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished">Идентификатор пользователя</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -744,23 +770,10 @@ Example: https://server.my:8787</source>
<translation>SSO вход не удался</translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation>Участники комнаты</translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation>ОК</translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+110"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+169"/>
<location line="+9"/>
<source>removed</source>
<translation>убрано</translation>
@ -771,7 +784,7 @@ Example: https://server.my:8787</source>
<translation>Шифрование включено</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation>имя комнаты изменено на: %1</translation>
</message>
@ -781,7 +794,7 @@ Example: https://server.my:8787</source>
<translation>название комнаты убрано</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation>тема изменена на: %1</translation>
</message>
@ -791,17 +804,17 @@ Example: https://server.my:8787</source>
<translation>тема убрана</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation>%1 создал и настроил комнату: %2</translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation>%1 начал голосовой звонок.</translation>
</message>
@ -816,17 +829,17 @@ Example: https://server.my:8787</source>
<translation>%1 начал вызов.</translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>%1 answered the call.</source>
<translation>%1 ответил на звонок.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 ended the call.</source>
<translation>%1 завершил вызов.</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>Negotiating call...</source>
<translation>Совершение звонка...</translation>
</message>
@ -834,7 +847,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation>Завершить звонок</translation>
</message>
@ -855,6 +868,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation>Эмоджи</translation>
</message>
@ -872,17 +890,17 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation>Редактировать</translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation>Реакция</translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation>Ответить</translation>
</message>
@ -892,7 +910,7 @@ Example: https://server.my:8787</source>
<translation>Опции</translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1100,7 +1118,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation>не реализованное событие</translation>
</message>
@ -1220,7 +1238,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation>Закрыть</translation>
</message>
@ -1233,7 +1251,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation>нет сохраненной версии</translation>
</message>
@ -1241,7 +1259,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1281,17 +1299,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Принять</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished">Отказаться</translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1341,20 +1349,43 @@ Example: https://server.my:8787</source>
<translation type="unfinished">Пользовательские настройки</translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation>Настройки комнаты</translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation>%1 участник(ов)</translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation>НАЙСТРОЙКИ</translation>
</message>
@ -1436,11 +1467,6 @@ Example: https://server.my:8787</source>
<source>Room Version</source>
<translation>Версия Комнаты</translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation>ОК</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1473,6 +1499,24 @@ Example: https://server.my:8787</source>
<translation>Не удалось загрузить изображение: %s</translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1530,7 +1574,7 @@ Example: https://server.my:8787</source>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation>Не удало</translation>
</message>
@ -1550,6 +1594,14 @@ Example: https://server.my:8787</source>
<translation>Прочитано</translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished">Поиск</translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1571,7 +1623,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation>Ошибка редактирования сообщения: %1</translation>
</message>
@ -1582,7 +1634,7 @@ Example: https://server.my:8787</source>
<translation>Не удалось зашифровать сообщение, отправка отменена!</translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation>Сохранить изображение</translation>
</message>
@ -1717,12 +1769,12 @@ Example: https://server.my:8787</source>
<translation>%1 отредактировал его &quot;стук&quot;.</translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation>Вы присоединились к этой комнате.</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1751,7 +1803,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation>Изменено</translation>
</message>
@ -1759,17 +1811,32 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation>Комната не выбрана</translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished">%1 участник(ов)</translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished">Вернуться к списку комнат</translation>
</message>
@ -1777,7 +1844,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation>Не найдено личного чата с этим пользователем. Создайте зашифрованный личный чат с этим пользователем и попытайтесь еще раз.</translation>
</message>
@ -1785,18 +1852,17 @@ Example: https://server.my:8787</source>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation>Вернуться к списку комнат</translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation>Комнаты не выбраны</translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation>Настройки комнаты</translation>
</message>
@ -1837,7 +1903,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation>Глобальный Пользовательский Профиль</translation>
</message>
@ -1847,7 +1913,7 @@ Example: https://server.my:8787</source>
<translation>Поользовательский Профиль в Комнате</translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation>Верифицировать</translation>
@ -1896,7 +1962,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation>По умолчанию</translation>
@ -1905,7 +1971,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation>Сворачивать в системную панель</translation>
</message>
@ -2357,7 +2423,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2408,7 +2474,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation>Вчера</translation>
</message>
@ -2479,19 +2545,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation>Запустите резервный вариант, пройдите его шаги и подтвердите завершение.</translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation>Отмена</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation>Идентификатор пользователя</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +48,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation type="unfinished"></translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -227,12 +227,12 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation type="unfinished"></translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation type="unfinished"></translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -617,16 +617,42 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -740,23 +766,10 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+110"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+169"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
@ -767,7 +780,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -777,7 +790,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -787,17 +800,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
@ -812,17 +825,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
@ -830,7 +843,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
@ -851,6 +864,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -868,17 +886,17 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -888,7 +906,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1337,20 +1345,42 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1432,11 +1462,6 @@ Example: https://server.my:8787</source>
<source>Room Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1469,6 +1494,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
@ -1546,6 +1589,14 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation type="unfinished"></translation>
</message>
@ -1712,12 +1763,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation type="unfinished"></translation>
</message>
@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation type="unfinished"></translation>
</message>
@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2468,19 +2533,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation>Inväntar Bekräftelse</translation>
</message>
@ -48,7 +48,7 @@
<translation>Väntar att motparten ska slutföra verifikationen.</translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation>Avbryt</translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>Kunde inte bjuda in användare: %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation>Bekräfta inbjudan</translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation>Är du säker att du vill bjuda in %1 (%2)?</translation>
</message>
@ -227,12 +227,12 @@
<translation>Hävde bannlysningen av användare: %1</translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation>Cache-migration misslyckades!</translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation>Dekryptera hemliga nycklar</translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation>Sök</translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation>Personer</translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation>Välj en fil</translation>
</message>
@ -617,17 +617,43 @@
<translation>Alla Filer (*)</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation>Kunde inte ladda upp media. Vänligen försök igen.</translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation>Ta bort</translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished">Användar-ID att bjuda in</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished">Avbryt</translation>
</message>
</context>
<context>
@ -744,28 +770,15 @@ Exempel: https://server.my:8787</translation>
<translation>SSO-inloggning misslyckades</translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation>Rumsmedlemmar</translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation>OK</translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+128"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+187"/>
<source>Encryption enabled</source>
<translation>Kryptering aktiverad</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation>rummets namn ändrat till: %1</translation>
</message>
@ -775,7 +788,7 @@ Exempel: https://server.my:8787</translation>
<translation>tog bort rummets namn</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation>ämne ändrat till: %1</translation>
</message>
@ -785,17 +798,17 @@ Exempel: https://server.my:8787</translation>
<translation>tog bort ämne</translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation>%1 skapade och konfigurerade rum: %2</translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation>%1 påbörjade ett röstsamtal.</translation>
</message>
@ -810,23 +823,23 @@ Exempel: https://server.my:8787</translation>
<translation>%1 påbörjade ett samtal.</translation>
</message>
<message>
<location line="+29"/>
<location line="+38"/>
<source>Negotiating call...</source>
<translation>Förhandlar samtal</translation>
</message>
<message>
<location line="-18"/>
<location line="-24"/>
<source>%1 answered the call.</source>
<translation>%1 besvarade samtalet.</translation>
</message>
<message>
<location line="-80"/>
<location line="-99"/>
<location line="+9"/>
<source>removed</source>
<translation>borttagen</translation>
</message>
<message>
<location line="+80"/>
<location line="+102"/>
<source>%1 ended the call.</source>
<translation>%1 avslutade samtalet.</translation>
</message>
@ -834,7 +847,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation>Lägg </translation>
</message>
@ -855,6 +868,11 @@ Exempel: https://server.my:8787</translation>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation>Emoji</translation>
</message>
@ -872,17 +890,17 @@ Exempel: https://server.my:8787</translation>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation type="unfinished">Reagera</translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished">Svara</translation>
</message>
@ -892,7 +910,7 @@ Exempel: https://server.my:8787</translation>
<translation type="unfinished">Alternativ</translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1100,7 +1118,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation>ej implementerat event: </translation>
</message>
@ -1220,7 +1238,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation>Stäng</translation>
</message>
@ -1233,7 +1251,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation>ingen version lagrad</translation>
</message>
@ -1241,7 +1259,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1281,17 +1299,7 @@ Exempel: https://server.my:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished">Godkänn</translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1341,20 +1349,42 @@ Exempel: https://server.my:8787</translation>
<translation type="unfinished">Användarinställningar</translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1436,11 +1466,6 @@ Exempel: https://server.my:8787</translation>
<source>Room Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation type="unfinished">OK</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1473,6 +1498,24 @@ Exempel: https://server.my:8787</translation>
<translation type="unfinished">Kunde inte ladda upp bilden: %s</translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1530,7 +1573,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation>Misslyckat</translation>
</message>
@ -1550,6 +1593,14 @@ Exempel: https://server.my:8787</translation>
<translation>Läst</translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished">Sök</translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1571,7 +1622,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation>Kunde inte maskera meddelande: %1</translation>
</message>
@ -1582,7 +1633,7 @@ Exempel: https://server.my:8787</translation>
<translation>Kunde inte kryptera event, sändning avbruten!</translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation>Spara bild</translation>
</message>
@ -1716,12 +1767,12 @@ Exempel: https://server.my:8787</translation>
<translation>%1 maskerade sin knackning.</translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation>Du gick med i detta rum.</translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1750,7 +1801,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation type="unfinished"></translation>
</message>
@ -1758,17 +1809,32 @@ Exempel: https://server.my:8787</translation>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation>Inget rum öppet</translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished">Tillbaka till rumlista</translation>
</message>
@ -1776,7 +1842,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation>Ingen krypterad privat chatt med denna användare kunde hittas. Skapa en krypterad privat chatt med användaren och försök igen.</translation>
</message>
@ -1784,18 +1850,17 @@ Exempel: https://server.my:8787</translation>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation>Tillbaka till rumlista</translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation>Inget rum markerat</translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation>Alternativ för rum</translation>
</message>
@ -1836,7 +1901,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1846,7 +1911,7 @@ Exempel: https://server.my:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation>Bekräfta</translation>
@ -1895,7 +1960,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1904,7 +1969,7 @@ Exempel: https://server.my:8787</translation>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation>Minimera till systemtråg</translation>
</message>
@ -2358,7 +2423,7 @@ Detta gör vanligtvis att ikonen i aktivitetsfältet animeras på något sätt.<
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation>Väntar motparten</translation>
</message>
@ -2409,7 +2474,7 @@ Detta gör vanligtvis att ikonen i aktivitetsfältet animeras på något sätt.<
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation>Igår</translation>
</message>
@ -2480,19 +2545,6 @@ Detta gör vanligtvis att ikonen i aktivitetsfältet animeras på något sätt.<
<translation>Öppna reserven, följ stegen och bekräfta när du slutfört dem.</translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation>Avbryt</translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation>Användar-ID att bjuda in</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -38,7 +38,7 @@
<context>
<name>AwaitingVerificationConfirmation</name>
<message>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/>
<location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/>
<source>Awaiting Confirmation</source>
<translation type="unfinished"></translation>
</message>
@ -48,7 +48,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+13"/>
<source>Cancel</source>
<translation></translation>
</message>
@ -125,7 +125,7 @@
<context>
<name>ChatPage</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+133"/>
<location filename="../../src/ChatPage.cpp" line="+135"/>
<source>Failed to invite user: %1</source>
<translation>: %1</translation>
</message>
@ -157,12 +157,12 @@
</message>
<message>
<location line="+34"/>
<location line="+280"/>
<location line="+284"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-283"/>
<source>Do you really want to invite %1 (%2)?</source>
<translation type="unfinished"></translation>
</message>
@ -227,12 +227,12 @@
<translation>: %1</translation>
</message>
<message>
<location line="+183"/>
<location line="+187"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-725"/>
<source>Cache migration failed!</source>
<translation></translation>
</message>
@ -352,7 +352,7 @@
<context>
<name>CrossSigningSecrets</name>
<message>
<location filename="../../src/ChatPage.cpp" line="+183"/>
<location filename="../../src/ChatPage.cpp" line="+187"/>
<source>Decrypt secrets</source>
<translation type="unfinished"></translation>
</message>
@ -426,12 +426,12 @@
<context>
<name>EmojiPicker</name>
<message>
<location filename="../qml/emoji/EmojiPicker.qml" line="+59"/>
<location filename="../qml/emoji/EmojiPicker.qml" line="+68"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+172"/>
<location line="+186"/>
<source>People</source>
<translation type="unfinished"></translation>
</message>
@ -607,7 +607,7 @@
<context>
<name>InputBar</name>
<message>
<location filename="../../src/timeline/InputBar.cpp" line="+233"/>
<location filename="../../src/timeline/InputBar.cpp" line="+234"/>
<source>Select a file</source>
<translation type="unfinished"></translation>
</message>
@ -617,17 +617,43 @@
<translation type="unfinished">*</translation>
</message>
<message>
<location line="+417"/>
<location line="+442"/>
<source>Failed to upload media. Please try again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>InviteeItem</name>
<name>InviteDialog</name>
<message>
<location filename="../../src/InviteeItem.cpp" line="+22"/>
<source>Remove</source>
<translation></translation>
<location filename="../qml/InviteDialog.qml" line="+32"/>
<source>Invite users to %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>User ID to invite</source>
<translation type="unfinished"> ID</translation>
</message>
<message>
<location line="+14"/>
<source>@joe:matrix.org</source>
<comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+58"/>
<source>Invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -740,23 +766,10 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MemberList</name>
<message>
<location filename="../../src/dialogs/MemberList.cpp" line="+94"/>
<source>Room members</source>
<translation></translation>
</message>
<message>
<location line="+4"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MessageDelegate</name>
<message>
<location filename="../qml/delegates/MessageDelegate.qml" line="+110"/>
<location filename="../qml/delegates/MessageDelegate.qml" line="+169"/>
<location line="+9"/>
<source>removed</source>
<translation type="unfinished"></translation>
@ -767,7 +780,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>room name changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -777,7 +790,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>topic changed to: %1</source>
<translation type="unfinished"></translation>
</message>
@ -787,17 +800,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 changed the room avatar</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+8"/>
<location line="+12"/>
<source>%1 created and configured room: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+15"/>
<source>%1 placed a voice call.</source>
<translation type="unfinished"></translation>
</message>
@ -812,17 +825,17 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+11"/>
<location line="+14"/>
<source>%1 answered the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>%1 ended the call.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<location line="+12"/>
<source>Negotiating call...</source>
<translation type="unfinished"></translation>
</message>
@ -830,7 +843,7 @@ Example: https://server.my:8787</source>
<context>
<name>MessageInput</name>
<message>
<location filename="../qml/MessageInput.qml" line="+43"/>
<location filename="../qml/MessageInput.qml" line="+44"/>
<source>Hang up</source>
<translation type="unfinished"></translation>
</message>
@ -851,6 +864,11 @@ Example: https://server.my:8787</source>
</message>
<message>
<location line="+214"/>
<source>Stickers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<source>Emoji</source>
<translation type="unfinished"></translation>
</message>
@ -868,17 +886,17 @@ Example: https://server.my:8787</source>
<context>
<name>MessageView</name>
<message>
<location filename="../qml/MessageView.qml" line="+83"/>
<location filename="../qml/MessageView.qml" line="+87"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+15"/>
<location line="+16"/>
<source>React</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<location line="+16"/>
<source>Reply</source>
<translation type="unfinished"></translation>
</message>
@ -888,7 +906,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+394"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source>
<context>
<name>Placeholder</name>
<message>
<location filename="../qml/delegates/Placeholder.qml" line="+9"/>
<location filename="../qml/delegates/Placeholder.qml" line="+11"/>
<source>unimplemented event: </source>
<translation type="unfinished"></translation>
</message>
@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source>
<context>
<name>ReplyPopup</name>
<message>
<location filename="../qml/ReplyPopup.qml" line="+47"/>
<location filename="../qml/ReplyPopup.qml" line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4169"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source>
<context>
<name>RoomList</name>
<message>
<location filename="../qml/RoomList.qml" line="+56"/>
<location filename="../qml/RoomList.qml" line="+57"/>
<source>New tag</source>
<translation type="unfinished"></translation>
</message>
@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+222"/>
<source>Accept</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<source>Decline</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+68"/>
<location line="+268"/>
<source>Status Message</source>
<translation type="unfinished"></translation>
</message>
@ -1337,20 +1345,41 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomMembers</name>
<message>
<location filename="../qml/RoomMembers.qml" line="+17"/>
<source>Members of %1</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location line="+32"/>
<source>%n people in %1</source>
<comment>Summary above list of members</comment>
<translation type="unfinished">
<numerusform></numerusform>
</translation>
</message>
<message>
<location line="+10"/>
<source>Invite more people</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RoomSettings</name>
<message>
<location filename="../qml/RoomSettings.qml" line="+25"/>
<location filename="../qml/RoomSettings.qml" line="+26"/>
<source>Room Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+79"/>
<location line="+80"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+43"/>
<location line="+45"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1432,11 +1461,6 @@ Example: https://server.my:8787</source>
<source>Room Version</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<source>Failed to enable encryption: %1</source>
@ -1469,6 +1493,24 @@ Example: https://server.my:8787</source>
<translation type="unfinished">%s</translation>
</message>
</context>
<context>
<name>RoomlistModel</name>
<message>
<location filename="../../src/timeline/RoomlistModel.cpp" line="+143"/>
<source>Pending invite.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+30"/>
<source>Previewing this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+34"/>
<source>No preview available</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScreenShare</name>
<message>
@ -1526,7 +1568,7 @@ Example: https://server.my:8787</source>
<context>
<name>StatusIndicator</name>
<message>
<location filename="../qml/StatusIndicator.qml" line="+21"/>
<location filename="../qml/StatusIndicator.qml" line="+24"/>
<source>Failed</source>
<translation type="unfinished"></translation>
</message>
@ -1546,6 +1588,14 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StickerPicker</name>
<message>
<location filename="../qml/emoji/StickerPicker.qml" line="+70"/>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Success</name>
<message>
@ -1567,7 +1617,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineModel</name>
<message>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/>
<location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished">%1</translation>
</message>
@ -1578,7 +1628,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+164"/>
<location line="+173"/>
<source>Save image</source>
<translation type="unfinished"></translation>
</message>
@ -1711,12 +1761,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-909"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+849"/>
<location line="+875"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1745,7 +1795,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineRow</name>
<message>
<location filename="../qml/TimelineRow.qml" line="+106"/>
<location filename="../qml/TimelineRow.qml" line="+180"/>
<source>Edited</source>
<translation type="unfinished"></translation>
</message>
@ -1753,17 +1803,32 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineView</name>
<message>
<location filename="../qml/TimelineView.qml" line="+27"/>
<location filename="../qml/TimelineView.qml" line="+30"/>
<source>No room open</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+127"/>
<location line="+139"/>
<source>%1 member(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+46"/>
<location line="+33"/>
<source>join the conversation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>accept invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>decline invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+27"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
@ -1771,7 +1836,7 @@ Example: https://server.my:8787</source>
<context>
<name>TimelineViewManager</name>
<message>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/>
<location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/>
<source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source>
<translation type="unfinished"></translation>
</message>
@ -1779,18 +1844,17 @@ Example: https://server.my:8787</source>
<context>
<name>TopBar</name>
<message>
<location filename="../qml/TopBar.qml" line="+51"/>
<location filename="../qml/TopBar.qml" line="+54"/>
<source>Back to room list</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+12"/>
<location line="+10"/>
<location line="-39"/>
<source>No room selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+24"/>
<location line="+90"/>
<source>Room options</source>
<translation type="unfinished"></translation>
</message>
@ -1831,7 +1895,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserProfile</name>
<message>
<location filename="../qml/UserProfile.qml" line="+24"/>
<location filename="../qml/UserProfile.qml" line="+25"/>
<source>Global User Profile</source>
<translation type="unfinished"></translation>
</message>
@ -1841,7 +1905,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+114"/>
<location line="+115"/>
<location line="+107"/>
<source>Verify</source>
<translation type="unfinished"></translation>
@ -1890,7 +1954,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettings</name>
<message>
<location filename="../../src/UserSettingsPage.cpp" line="+362"/>
<location filename="../../src/UserSettingsPage.cpp" line="+363"/>
<location filename="../../src/UserSettingsPage.h" line="+194"/>
<source>Default</source>
<translation type="unfinished"></translation>
@ -1899,7 +1963,7 @@ Example: https://server.my:8787</source>
<context>
<name>UserSettingsPage</name>
<message>
<location line="+524"/>
<location line="+525"/>
<source>Minimize to tray</source>
<translation></translation>
</message>
@ -2345,7 +2409,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>Waiting</name>
<message>
<location filename="../qml/device-verification/Waiting.qml" line="+11"/>
<location filename="../qml/device-verification/Waiting.qml" line="+12"/>
<source>Waiting for other party</source>
<translation type="unfinished"></translation>
</message>
@ -2396,7 +2460,7 @@ This usually causes the application icon in the task bar to animate in some fash
<context>
<name>descriptiveTime</name>
<message>
<location filename="../../src/Utils.cpp" line="+207"/>
<location filename="../../src/Utils.cpp" line="+210"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2467,19 +2531,6 @@ This usually causes the application icon in the task bar to animate in some fash
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>dialogs::InviteUsers</name>
<message>
<location filename="../../src/dialogs/InviteUsers.cpp" line="+46"/>
<source>Cancel</source>
<translation></translation>
</message>
<message>
<location line="+8"/>
<source>User ID to invite</source>
<translation> ID</translation>
</message>
</context>
<context>
<name>dialogs::JoinRoom</name>
<message>

View file

@ -70,7 +70,7 @@ Popup {
onCompleterNameChanged: {
if (completerName) {
if (completerName == "user")
completer = TimelineManager.completerFor(completerName, room.roomId());
completer = TimelineManager.completerFor(completerName, room.roomId);
else
completer = TimelineManager.completerFor(completerName);
completer.setSearchString("");

View file

@ -0,0 +1,159 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import im.nheko 1.0
ApplicationWindow {
id: inviteDialogRoot
property string roomId
property string plainRoomName
property InviteesModel invitees
function addInvite() {
if (inviteeEntry.isValidMxid) {
invitees.addUser(inviteeEntry.text);
inviteeEntry.clear();
}
}
function cleanUpAndClose() {
if (inviteeEntry.isValidMxid)
addInvite();
invitees.accept();
close();
}
title: qsTr("Invite users to %1").arg(plainRoomName)
x: MainWindow.x + (MainWindow.width / 2) - (width / 2)
y: MainWindow.y + (MainWindow.height / 2) - (height / 2)
height: 380
width: 340
palette: Nheko.colors
color: Nheko.colors.window
Shortcut {
sequence: "Ctrl+Enter"
onActivated: cleanUpAndClose()
}
Shortcut {
sequence: StandardKey.Cancel
onActivated: inviteDialogRoot.close()
}
ColumnLayout {
anchors.fill: parent
anchors.margins: Nheko.paddingMedium
spacing: Nheko.paddingMedium
Label {
text: qsTr("User ID to invite")
Layout.fillWidth: true
color: Nheko.colors.text
}
RowLayout {
spacing: Nheko.paddingMedium
MatrixTextField {
id: inviteeEntry
property bool isValidMxid: text.match("@.+?:.{3,}")
backgroundColor: Nheko.colors.window
placeholderText: qsTr("@joe:matrix.org", "Example user id. The name 'joe' can be localized however you want.")
Layout.fillWidth: true
onAccepted: {
if (isValidMxid)
addInvite();
}
Component.onCompleted: forceActiveFocus()
Keys.onShortcutOverride: event.accepted = ((event.key === Qt.Key_Return || event.key === Qt.Key_Enter) && (event.modifiers & Qt.ControlModifier))
Keys.onPressed: {
if ((event.key === Qt.Key_Return || event.key === Qt.Key_Enter) && (event.modifiers === Qt.ControlModifier))
cleanUpAndClose();
}
}
Button {
text: qsTr("Add")
enabled: inviteeEntry.isValidMxid
onClicked: addInvite()
}
}
ListView {
id: inviteesList
Layout.fillWidth: true
Layout.fillHeight: true
model: invitees
delegate: RowLayout {
spacing: Nheko.paddingMedium
Avatar {
width: Nheko.avatarSize
height: Nheko.avatarSize
userid: model.mxid
url: model.avatarUrl.replace("mxc://", "image://MxcImage/")
displayName: model.displayName
onClicked: TimelineManager.openGlobalUserProfile(model.mxid)
}
ColumnLayout {
spacing: Nheko.paddingSmall
Label {
text: model.displayName
color: TimelineManager.userColor(model ? model.mxid : "", Nheko.colors.window)
font.pointSize: fontMetrics.font.pointSize
}
Label {
text: model.mxid
color: Nheko.colors.buttonText
font.pointSize: fontMetrics.font.pointSize * 0.9
}
Item {
Layout.fillHeight: true
Layout.fillWidth: true
}
}
}
}
}
footer: DialogButtonBox {
id: buttons
Button {
text: qsTr("Invite")
DialogButtonBox.buttonRole: DialogButtonBox.AcceptRole
enabled: invitees.count > 0
onClicked: cleanUpAndClose()
}
Button {
text: qsTr("Cancel")
DialogButtonBox.buttonRole: DialogButtonBox.DestructiveRole
onClicked: inviteDialogRoot.close()
}
}
}

View file

@ -8,6 +8,7 @@ import im.nheko 1.0
TextEdit {
id: r
textFormat: TextEdit.RichText
readOnly: true
focus: false
@ -19,14 +20,13 @@ TextEdit {
onLinkActivated: Nheko.openLink(link)
ToolTip.visible: hoveredLink
ToolTip.text: hoveredLink
Component.onCompleted: {
TimelineManager.fixImageRendering(r.textDocument, r);
}
CursorShape {
anchors.fill: parent
cursorShape: hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
}
Component.onCompleted: {
TimelineManager.fixImageRendering(r.textDocument, r)
}
}

View file

@ -10,6 +10,8 @@ import im.nheko 1.0
TextField {
id: input
property alias backgroundColor: backgroundRect.color
palette: Nheko.colors
color: Nheko.colors.text
@ -62,6 +64,8 @@ TextField {
}
background: Rectangle {
id: backgroundRect
color: Nheko.colors.base
}

View file

@ -2,6 +2,7 @@
//
// SPDX-License-Identifier: GPL-3.0-or-later
import "./emoji"
import "./voip"
import QtQuick 2.12
import QtQuick.Controls 2.3
@ -87,7 +88,7 @@ Rectangle {
Layout.alignment: Qt.AlignBottom // | Qt.AlignHCenter
Layout.maximumHeight: Window.height / 4
Layout.minimumHeight: Settings.fontSize
implicitWidth: inputBar.width - 4 * (22 + 16) - 24
implicitWidth: inputBar.width - 5 * (22 + 16) - 24
TextArea {
id: messageInput
@ -319,6 +320,30 @@ Rectangle {
}
ImageButton {
id: stickerButton
Layout.alignment: Qt.AlignRight | Qt.AlignBottom
Layout.margins: 8
hoverEnabled: true
width: 22
height: 22
image: ":/icons/icons/ui/sticky-note-solid.svg"
ToolTip.visible: hovered
ToolTip.text: qsTr("Stickers")
onClicked: stickerPopup.visible ? stickerPopup.close() : stickerPopup.show(stickerButton, room.roomId, function(row) {
room.input.sticker(stickerPopup.model.sourceModel, row);
TimelineManager.focusMessageInput();
})
StickerPicker {
id: stickerPopup
colors: Nheko.colors
}
}
ImageButton {
id: emojiButton

View file

@ -92,16 +92,20 @@ ScrollView {
}
}
EmojiButton {
ImageButton {
id: reactButton
visible: chat.model ? chat.model.permissions.canSend(MtxEvent.Reaction) : false
width: 16
hoverEnabled: true
image: ":/icons/icons/ui/smile.png"
ToolTip.visible: hovered
ToolTip.text: qsTr("React")
emojiPicker: emojiPopup
event_id: row.model ? row.model.eventId : ""
onClicked: emojiPopup.visible ? emojiPopup.close() : emojiPopup.show(reactButton, function(emoji) {
var event_id = row.model ? row.model.eventId : "";
room.input.reaction(event_id, emoji);
TimelineManager.focusMessageInput();
})
}
ImageButton {
@ -337,6 +341,7 @@ ScrollView {
required property var timestamp
required property int status
required property int index
required property int relatedEventCacheBuster
required property string previousMessageUserId
required property string day
required property string previousMessageDay
@ -442,6 +447,7 @@ ScrollView {
trustlevel: wrapper.trustlevel
timestamp: wrapper.timestamp
status: wrapper.status
relatedEventCacheBuster: wrapper.relatedEventCacheBuster
y: section.visible && section.active ? section.y + section.height : 0
HoverHandler {
@ -471,12 +477,23 @@ ScrollView {
}
footer: Spinner {
footer: Item {
anchors.horizontalCenter: parent.horizontalCenter
running: chat.model && chat.model.paginationInProgress
foreground: Nheko.colors.mid
anchors.margins: Nheko.paddingLarge
visible: chat.model && chat.model.paginationInProgress
z: 3
// hacky, but works
height: loadingSpinner.height + 2 * Nheko.paddingLarge
Spinner {
id: loadingSpinner
anchors.centerIn: parent
anchors.margins: Nheko.paddingLarge
running: chat.model && chat.model.paginationInProgress
foreground: Nheko.colors.mid
z: 3
}
}
}

View file

@ -33,8 +33,8 @@ Page {
Connections {
onActiveTimelineChanged: {
roomlist.positionViewAtIndex(Rooms.roomidToIndex(Rooms.currentRoom.roomId()), ListView.Contain);
console.log("Test" + Rooms.currentRoom.roomId() + " " + Rooms.roomidToIndex(Rooms.currentRoom.roomId()));
roomlist.positionViewAtIndex(Rooms.roomidToIndex(Rooms.currentRoom.roomId), ListView.Contain);
console.log("Test" + Rooms.currentRoom.roomId + " " + Rooms.roomidToIndex(Rooms.currentRoom.roomId));
}
target: TimelineManager
}
@ -61,9 +61,19 @@ Page {
}
}
Platform.MessageDialog {
id: leaveRoomDialog
title: qsTr("Leave Room")
text: qsTr("Are you sure you want to leave this room?")
modality: Qt.Modal
onAccepted: Rooms.leave(roomContextMenu.roomid)
buttons: Dialog.Ok | Dialog.Cancel
}
Platform.MenuItem {
text: qsTr("Leave room")
onTriggered: Rooms.leave(roomContextMenu.roomid)
onTriggered: leaveRoomDialog.open()
}
Platform.MenuSeparator {
@ -133,7 +143,7 @@ Page {
states: [
State {
name: "highlight"
when: hovered.hovered && !((Rooms.currentRoom && roomId == Rooms.currentRoom.roomId()) || Rooms.currentRoomPreview.roomid == roomId)
when: hovered.hovered && !((Rooms.currentRoom && roomId == Rooms.currentRoom.roomId) || Rooms.currentRoomPreview.roomid == roomId)
PropertyChanges {
target: roomItem
@ -147,7 +157,7 @@ Page {
},
State {
name: "selected"
when: (Rooms.currentRoom && roomId == Rooms.currentRoom.roomId()) || Rooms.currentRoomPreview.roomid == roomId
when: (Rooms.currentRoom && roomId == Rooms.currentRoom.roomId) || Rooms.currentRoomPreview.roomid == roomId
PropertyChanges {
target: roomItem

View file

@ -0,0 +1,148 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import "./ui"
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import QtQuick.Window 2.12
import im.nheko 1.0
ApplicationWindow {
id: roomMembersRoot
property MemberList members
title: qsTr("Members of %1").arg(members.roomName)
x: MainWindow.x + (MainWindow.width / 2) - (width / 2)
y: MainWindow.y + (MainWindow.height / 2) - (height / 2)
height: 650
width: 420
minimumHeight: 420
palette: Nheko.colors
color: Nheko.colors.window
Shortcut {
sequence: StandardKey.Cancel
onActivated: roomMembersRoot.close()
}
ColumnLayout {
anchors.fill: parent
anchors.margins: Nheko.paddingMedium
spacing: Nheko.paddingMedium
Avatar {
id: roomAvatar
width: 130
height: width
displayName: members.roomName
Layout.alignment: Qt.AlignHCenter
url: members.avatarUrl.replace("mxc://", "image://MxcImage/")
onClicked: TimelineManager.openRoomSettings(members.roomId)
}
ElidedLabel {
font.pixelSize: fontMetrics.font.pixelSize * 2
fullText: qsTr("%n people in %1", "Summary above list of members", members.memberCount).arg(members.roomName)
Layout.alignment: Qt.AlignHCenter
elideWidth: parent.width - Nheko.paddingMedium
}
ImageButton {
Layout.alignment: Qt.AlignHCenter
image: ":/icons/icons/ui/add-square-button.png"
hoverEnabled: true
ToolTip.visible: hovered
ToolTip.text: qsTr("Invite more people")
onClicked: TimelineManager.openInviteUsers(members.roomId)
}
ScrollView {
palette: Nheko.colors
padding: Nheko.paddingMedium
ScrollBar.horizontal.visible: false
Layout.fillHeight: true
Layout.minimumHeight: 200
Layout.fillWidth: true
ListView {
id: memberList
clip: true
spacing: Nheko.paddingMedium
boundsBehavior: Flickable.StopAtBounds
model: members
ScrollHelper {
flickable: parent
anchors.fill: parent
enabled: !Settings.mobileMode
}
delegate: RowLayout {
spacing: Nheko.paddingMedium
Avatar {
width: Nheko.avatarSize
height: Nheko.avatarSize
userid: model.mxid
url: model.avatarUrl.replace("mxc://", "image://MxcImage/")
displayName: model.displayName
onClicked: Rooms.currentRoom.openUserProfile(model.mxid)
}
ColumnLayout {
spacing: Nheko.paddingSmall
Label {
text: model.displayName
color: TimelineManager.userColor(model ? model.mxid : "", Nheko.colors.window)
font.pointSize: fontMetrics.font.pointSize
}
Label {
text: model.mxid
color: Nheko.colors.buttonText
font.pointSize: fontMetrics.font.pointSize * 0.9
}
Item {
Layout.fillHeight: true
Layout.fillWidth: true
}
}
}
footer: Item {
width: parent.width
visible: (members.numUsersLoaded < members.memberCount) && members.loadingMoreMembers
// use the default height if it's visible, otherwise no height at all
height: membersLoadingSpinner.height
anchors.margins: Nheko.paddingMedium
Spinner {
id: membersLoadingSpinner
anchors.centerIn: parent
height: visible ? 35 : 0
}
}
}
}
}
footer: DialogButtonBox {
standardButtons: DialogButtonBox.Ok
onAccepted: roomMembersRoot.close()
}
}

View file

@ -4,7 +4,7 @@
import "./ui"
import Qt.labs.platform 1.1 as Platform
import QtQuick 2.9
import QtQuick 2.15
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.2
import QtQuick.Window 2.3
@ -98,13 +98,23 @@ ApplicationWindow {
MatrixText {
text: roomSettings.roomName
font.pixelSize: 24
font.pixelSize: fontMetrics.font.pixelSize * 2
Layout.alignment: Qt.AlignHCenter
}
MatrixText {
text: qsTr("%1 member(s)").arg(roomSettings.memberCount)
Layout.alignment: Qt.AlignHCenter
TapHandler {
onTapped: TimelineManager.openRoomMembers(roomSettings.roomId)
}
CursorShape {
cursorShape: Qt.PointingHandCursor
anchors.fill: parent
}
}
}
@ -209,7 +219,7 @@ ApplicationWindow {
title: qsTr("End-to-End Encryption")
text: qsTr("Encryption is currently experimental and things might break unexpectedly. <br>
Please take note that it can't be disabled afterwards.")
modality: Qt.NonModal
modality: Qt.Modal
onAccepted: {
if (roomSettings.isEncryptionEnabled)
return ;
@ -222,6 +232,17 @@ ApplicationWindow {
buttons: Dialog.Ok | Dialog.Cancel
}
MatrixText {
text: qsTr("Sticker & Emote Settings")
}
Button {
text: qsTr("Change")
ToolTip.text: qsTr("Change what packs are enabled, remove packs or create new ones")
onClicked: TimelineManager.openImagePackSettings(roomSettings.roomId)
Layout.alignment: Qt.AlignRight
}
Item {
// for adding extra space between sections
Layout.fillWidth: true
@ -247,7 +268,7 @@ ApplicationWindow {
MatrixText {
text: roomSettings.roomId
font.pixelSize: 14
font.pixelSize: fontMetrics.font.pixelSize * 1.2
Layout.alignment: Qt.AlignRight
}
@ -257,16 +278,16 @@ ApplicationWindow {
MatrixText {
text: roomSettings.roomVersion
font.pixelSize: 14
font.pixelSize: fontMetrics.font.pixelSize * 1.2
Layout.alignment: Qt.AlignRight
}
}
Button {
Layout.alignment: Qt.AlignRight
text: qsTr("OK")
onClicked: close()
DialogButtonBox {
Layout.fillWidth: true
standardButtons: DialogButtonBox.Ok
onAccepted: close()
}
}

View file

@ -4,6 +4,7 @@
import "./delegates"
import "./device-verification"
import "./dialogs"
import "./emoji"
import "./voip"
import Qt.labs.platform 1.1 as Platform
@ -47,6 +48,14 @@ Page {
}
Component {
id: roomMembersComponent
RoomMembers {
}
}
Component {
id: mobileCallInviteDialog
@ -63,6 +72,30 @@ Page {
}
Component {
id: deviceVerificationDialog
DeviceVerification {
}
}
Component {
id: inviteDialog
InviteDialog {
}
}
Component {
id: packSettingsComponent
ImagePackSettingsDialog {
}
}
Shortcut {
sequence: "Ctrl+K"
onActivated: {
@ -82,14 +115,6 @@ Page {
onActivated: Rooms.previousRoom()
}
Component {
id: deviceVerificationDialog
DeviceVerification {
}
}
Connections {
target: TimelineManager
onNewDeviceVerificationRequest: {
@ -104,6 +129,12 @@ Page {
});
userProfile.show();
}
onShowImagePackSettings: {
var packSet = packSettingsComponent.createObject(timelineRoot, {
"packlist": packlist
});
packSet.show();
}
}
Connections {
@ -116,6 +147,31 @@ Page {
}
}
Connections {
target: TimelineManager
onOpenRoomMembersDialog: {
var membersDialog = roomMembersComponent.createObject(timelineRoot, {
"members": members,
"roomName": Rooms.currentRoom.roomName
});
membersDialog.show();
}
onOpenRoomSettingsDialog: {
var roomSettings = roomSettingsComponent.createObject(timelineRoot, {
"roomSettings": settings
});
roomSettings.show();
}
onOpenInviteUsersDialog: {
var dialog = inviteDialog.createObject(timelineRoot, {
"roomId": Rooms.currentRoom.roomId,
"plainRoomName": Rooms.currentRoom.plainRoomName,
"invitees": invitees
});
dialog.show();
}
}
ChatPage {
anchors.fill: parent
}

View file

@ -40,6 +40,7 @@ Item {
required property int trustlevel
required property var timestamp
required property int status
required property int relatedEventCacheBuster
anchors.left: parent.left
anchors.right: parent.right
@ -86,29 +87,30 @@ Item {
// fancy reply, if this is a reply
Reply {
function fromModel(role) {
return replyTo != "" ? room.dataById(replyTo, role) : null;
return replyTo != "" ? room.dataById(replyTo, role, r.eventId) : null;
}
visible: replyTo
userColor: TimelineManager.userColor(userId, Nheko.colors.base)
blurhash: fromModel(Room.Blurhash) ?? ""
body: fromModel(Room.Body) ?? ""
formattedBody: fromModel(Room.FormattedBody) ?? ""
userColor: r.relatedEventCacheBuster, TimelineManager.userColor(userId, Nheko.colors.base)
blurhash: r.relatedEventCacheBuster, fromModel(Room.Blurhash) ?? ""
body: r.relatedEventCacheBuster, fromModel(Room.Body) ?? ""
formattedBody: r.relatedEventCacheBuster, fromModel(Room.FormattedBody) ?? ""
eventId: fromModel(Room.EventId) ?? ""
filename: fromModel(Room.Filename) ?? ""
filesize: fromModel(Room.Filesize) ?? ""
proportionalHeight: fromModel(Room.ProportionalHeight) ?? 1
type: fromModel(Room.Type) ?? MtxEvent.UnknownMessage
typeString: fromModel(Room.TypeString) ?? ""
url: fromModel(Room.Url) ?? ""
originalWidth: fromModel(Room.OriginalWidth) ?? 0
isOnlyEmoji: fromModel(Room.IsOnlyEmoji) ?? false
userId: fromModel(Room.UserId) ?? ""
userName: fromModel(Room.UserName) ?? ""
thumbnailUrl: fromModel(Room.ThumbnailUrl) ?? ""
roomTopic: fromModel(Room.RoomTopic) ?? ""
roomName: fromModel(Room.RoomName) ?? ""
callType: fromModel(Room.CallType) ?? ""
filename: r.relatedEventCacheBuster, fromModel(Room.Filename) ?? ""
filesize: r.relatedEventCacheBuster, fromModel(Room.Filesize) ?? ""
proportionalHeight: r.relatedEventCacheBuster, fromModel(Room.ProportionalHeight) ?? 1
type: r.relatedEventCacheBuster, fromModel(Room.Type) ?? MtxEvent.UnknownMessage
typeString: r.relatedEventCacheBuster, fromModel(Room.TypeString) ?? ""
url: r.relatedEventCacheBuster, fromModel(Room.Url) ?? ""
originalWidth: r.relatedEventCacheBuster, fromModel(Room.OriginalWidth) ?? 0
isOnlyEmoji: r.relatedEventCacheBuster, fromModel(Room.IsOnlyEmoji) ?? false
userId: r.relatedEventCacheBuster, fromModel(Room.UserId) ?? ""
userName: r.relatedEventCacheBuster, fromModel(Room.UserName) ?? ""
thumbnailUrl: r.relatedEventCacheBuster, fromModel(Room.ThumbnailUrl) ?? ""
roomTopic: r.relatedEventCacheBuster, fromModel(Room.RoomTopic) ?? ""
roomName: r.relatedEventCacheBuster, fromModel(Room.RoomName) ?? ""
callType: r.relatedEventCacheBuster, fromModel(Room.CallType) ?? ""
relatedEventCacheBuster: r.relatedEventCacheBuster, fromModel(Room.RelatedEventCacheBuster) ?? 0
}
// actual message content
@ -134,6 +136,7 @@ Item {
roomTopic: r.roomTopic
roomName: r.roomName
callType: r.callType
relatedEventCacheBuster: r.relatedEventCacheBuster
isReply: false
}

View file

@ -246,17 +246,7 @@ Item {
NhekoDropArea {
anchors.fill: parent
roomid: room ? room.roomId() : ""
}
Connections {
target: room
onOpenRoomSettingsDialog: {
var roomSettings = roomSettingsComponent.createObject(timelineRoot, {
"roomSettings": settings
});
roomSettings.show();
}
roomid: room ? room.roomId : ""
}
}

View file

@ -24,7 +24,7 @@ Rectangle {
TapHandler {
onSingleTapped: {
if (room)
room.openRoomSettings();
TimelineManager.openRoomSettings(room.roomId);
eventPoint.accepted = true;
}
@ -66,7 +66,7 @@ Rectangle {
displayName: roomName
onClicked: {
if (room)
room.openRoomSettings();
TimelineManager.openRoomSettings(room.roomId);
}
}
@ -111,22 +111,22 @@ Rectangle {
Platform.MenuItem {
visible: room ? room.permissions.canInvite() : false
text: qsTr("Invite users")
onTriggered: TimelineManager.openInviteUsersDialog()
onTriggered: TimelineManager.openInviteUsers(room.roomId)
}
Platform.MenuItem {
text: qsTr("Members")
onTriggered: TimelineManager.openMemberListDialog(room.roomId())
onTriggered: TimelineManager.openRoomMembers(room.roomId)
}
Platform.MenuItem {
text: qsTr("Leave room")
onTriggered: TimelineManager.openLeaveRoomDialog(room.roomId())
onTriggered: TimelineManager.openLeaveRoomDialog(room.roomId)
}
Platform.MenuItem {
text: qsTr("Settings")
onTriggered: room.openRoomSettings()
onTriggered: TimelineManager.openRoomSettings(room.roomId)
}
}

View file

@ -29,6 +29,7 @@ Item {
required property string roomTopic
required property string roomName
required property string callType
required property int relatedEventCacheBuster
height: chooser.childrenRect.height
@ -231,7 +232,7 @@ Item {
body: formatted
isOnlyEmoji: false
isReply: d.isReply
formatted: qsTr("%1 created and configured room: %2").arg(d.userName).arg(room.roomId())
formatted: qsTr("%1 created and configured room: %2").arg(d.userName).arg(room.roomId)
}
}
@ -301,7 +302,7 @@ Item {
body: formatted
isOnlyEmoji: false
isReply: d.isReply
formatted: room.formatPowerLevelEvent(d.eventId)
formatted: d.relatedEventCacheBuster, room.formatPowerLevelEvent(d.eventId)
}
}
@ -313,7 +314,7 @@ Item {
body: formatted
isOnlyEmoji: false
isReply: d.isReply
formatted: room.formatJoinRuleEvent(d.eventId)
formatted: d.relatedEventCacheBuster, room.formatJoinRuleEvent(d.eventId)
}
}
@ -325,7 +326,7 @@ Item {
body: formatted
isOnlyEmoji: false
isReply: d.isReply
formatted: room.formatHistoryVisibilityEvent(d.eventId)
formatted: d.relatedEventCacheBuster, room.formatHistoryVisibilityEvent(d.eventId)
}
}
@ -337,7 +338,7 @@ Item {
body: formatted
isOnlyEmoji: false
isReply: d.isReply
formatted: room.formatGuestAccessEvent(d.eventId)
formatted: d.relatedEventCacheBuster, room.formatGuestAccessEvent(d.eventId)
}
}
@ -349,7 +350,7 @@ Item {
body: formatted
isOnlyEmoji: false
isReply: d.isReply
formatted: room.formatMemberEvent(d.eventId)
formatted: d.relatedEventCacheBuster, room.formatMemberEvent(d.eventId)
}
}

View file

@ -30,6 +30,7 @@ Item {
property string roomTopic
property string roomName
property string callType
property int relatedEventCacheBuster
width: parent.width
height: replyContainer.height
@ -95,6 +96,7 @@ Item {
roomTopic: r.roomTopic
roomName: r.roomName
callType: r.callType
relatedEventCacheBuster: r.relatedEventCacheBuster
enabled: false
width: parent.width
isReply: true

View file

@ -0,0 +1,309 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import ".."
import "../components"
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import im.nheko 1.0
ApplicationWindow {
id: win
property ImagePackListModel packlist
property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 2.3)
property SingleImagePackModel currentPack: packlist.packAt(currentPackIndex)
property int currentPackIndex: 0
readonly property int stickerDim: 128
readonly property int stickerDimPad: 128 + Nheko.paddingSmall
title: qsTr("Image pack settings")
x: MainWindow.x + (MainWindow.width / 2) - (width / 2)
y: MainWindow.y + (MainWindow.height / 2) - (height / 2)
height: 400
width: 600
palette: Nheko.colors
color: Nheko.colors.base
modality: Qt.NonModal
flags: Qt.Dialog
AdaptiveLayout {
id: adaptiveView
anchors.fill: parent
singlePageMode: false
pageIndex: 0
AdaptiveLayoutElement {
id: packlistC
visible: Settings.groupView
minimumWidth: 200
collapsedWidth: 200
preferredWidth: 300
maximumWidth: 300
ListView {
model: packlist
clip: true
ScrollHelper {
flickable: parent
anchors.fill: parent
enabled: !Settings.mobileMode
}
delegate: Rectangle {
id: packItem
property color background: Nheko.colors.window
property color importantText: Nheko.colors.text
property color unimportantText: Nheko.colors.buttonText
property color bubbleBackground: Nheko.colors.highlight
property color bubbleText: Nheko.colors.highlightedText
required property string displayName
required property string avatarUrl
required property bool fromAccountData
required property bool fromCurrentRoom
required property int index
color: background
height: avatarSize + 2 * Nheko.paddingMedium
width: ListView.view.width
state: "normal"
states: [
State {
name: "highlight"
when: hovered.hovered && !(index == currentPackIndex)
PropertyChanges {
target: packItem
background: Nheko.colors.dark
importantText: Nheko.colors.brightText
unimportantText: Nheko.colors.brightText
bubbleBackground: Nheko.colors.highlight
bubbleText: Nheko.colors.highlightedText
}
},
State {
name: "selected"
when: index == currentPackIndex
PropertyChanges {
target: packItem
background: Nheko.colors.highlight
importantText: Nheko.colors.highlightedText
unimportantText: Nheko.colors.highlightedText
bubbleBackground: Nheko.colors.highlightedText
bubbleText: Nheko.colors.highlight
}
}
]
TapHandler {
margin: -Nheko.paddingSmall
onSingleTapped: currentPackIndex = index
}
HoverHandler {
id: hovered
}
RowLayout {
spacing: Nheko.paddingMedium
anchors.fill: parent
anchors.margins: Nheko.paddingMedium
Avatar {
// In the future we could show an online indicator by setting the userid for the avatar
//userid: Nheko.currentUser.userid
id: avatar
enabled: false
Layout.alignment: Qt.AlignVCenter
height: avatarSize
width: avatarSize
url: avatarUrl.replace("mxc://", "image://MxcImage/")
displayName: packItem.displayName
}
ColumnLayout {
id: textContent
Layout.alignment: Qt.AlignLeft
Layout.fillWidth: true
Layout.minimumWidth: 100
width: parent.width - avatar.width
Layout.preferredWidth: parent.width - avatar.width
spacing: Nheko.paddingSmall
RowLayout {
Layout.fillWidth: true
spacing: 0
ElidedLabel {
Layout.alignment: Qt.AlignBottom
color: packItem.importantText
elideWidth: textContent.width - Nheko.paddingMedium
fullText: displayName
textFormat: Text.PlainText
}
Item {
Layout.fillWidth: true
}
}
RowLayout {
Layout.fillWidth: true
spacing: 0
ElidedLabel {
color: packItem.unimportantText
font.pixelSize: fontMetrics.font.pixelSize * 0.9
elideWidth: textContent.width - Nheko.paddingSmall
fullText: {
if (fromAccountData)
return qsTr("Private pack");
else if (fromCurrentRoom)
return qsTr("Pack from this room");
else
return qsTr("Globally enabled pack");
}
textFormat: Text.PlainText
}
Item {
Layout.fillWidth: true
}
}
}
}
}
}
}
AdaptiveLayoutElement {
id: packinfoC
Rectangle {
color: Nheko.colors.window
ColumnLayout {
id: packinfo
property string packName: currentPack ? currentPack.packname : ""
property string avatarUrl: currentPack ? currentPack.avatarUrl : ""
anchors.fill: parent
anchors.margins: Nheko.paddingLarge
spacing: Nheko.paddingLarge
Avatar {
url: packinfo.avatarUrl.replace("mxc://", "image://MxcImage/")
displayName: packinfo.packName
height: 100
width: 100
Layout.alignment: Qt.AlignHCenter
enabled: false
}
MatrixText {
text: packinfo.packName
font.pixelSize: 24
Layout.alignment: Qt.AlignHCenter
}
GridLayout {
Layout.alignment: Qt.AlignHCenter
visible: currentPack && currentPack.roomid != ""
columns: 2
rowSpacing: Nheko.paddingMedium
MatrixText {
text: qsTr("Enable globally")
}
ToggleButton {
ToolTip.text: qsTr("Enables this pack to be used in all rooms")
checked: currentPack ? currentPack.isGloballyEnabled : false
onClicked: currentPack.isGloballyEnabled = !currentPack.isGloballyEnabled
Layout.alignment: Qt.AlignRight
}
}
GridView {
Layout.fillHeight: true
Layout.fillWidth: true
model: currentPack
cellWidth: stickerDimPad
cellHeight: stickerDimPad
boundsBehavior: Flickable.StopAtBounds
clip: true
currentIndex: -1 // prevent sorting from stealing focus
cacheBuffer: 500
ScrollHelper {
flickable: parent
anchors.fill: parent
enabled: !Settings.mobileMode
}
// Individual emoji
delegate: AbstractButton {
width: stickerDim
height: stickerDim
hoverEnabled: true
ToolTip.text: ":" + model.shortcode + ": - " + model.body
ToolTip.visible: hovered
contentItem: Image {
height: stickerDim
width: stickerDim
source: model.url.replace("mxc://", "image://MxcImage/")
fillMode: Image.PreserveAspectFit
}
background: Rectangle {
anchors.fill: parent
color: hovered ? Nheko.colors.highlight : 'transparent'
radius: 5
}
}
}
}
}
}
}
footer: DialogButtonBox {
id: buttons
Button {
text: qsTr("Close")
DialogButtonBox.buttonRole: DialogButtonBox.AcceptRole
onClicked: win.close()
}
}
}

View file

@ -1,23 +0,0 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import "../"
import QtQuick 2.10
import QtQuick.Controls 2.1
import im.nheko 1.0
import im.nheko.EmojiModel 1.0
ImageButton {
id: emojiButton
property var colors: currentActivePalette
property var emojiPicker
property string event_id
image: ":/icons/icons/ui/smile.png"
onClicked: emojiPicker.visible ? emojiPicker.close() : emojiPicker.show(emojiButton, function(emoji) {
room.input.reaction(event_id, emoji);
TimelineManager.focusMessageInput();
})
}

View file

@ -130,6 +130,7 @@ Menu {
boundsBehavior: Flickable.StopAtBounds
clip: true
currentIndex: -1 // prevent sorting from stealing focus
cacheBuffer: 500
// Individual emoji
delegate: AbstractButton {

View file

@ -0,0 +1,180 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import "../"
import QtGraphicalEffects 1.0
import QtQuick 2.9
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
import im.nheko 1.0
import im.nheko.EmojiModel 1.0
Menu {
id: stickerPopup
property var callback
property var colors
property string roomid
property alias model: gridView.model
property var textArea
property real highlightHue: Nheko.colors.highlight.hslHue
property real highlightSat: Nheko.colors.highlight.hslSaturation
property real highlightLight: Nheko.colors.highlight.hslLightness
readonly property int stickerDim: 128
readonly property int stickerDimPad: 128 + Nheko.paddingSmall
readonly property int stickersPerRow: 3
function show(showAt, roomid_, callback) {
console.debug("Showing sticker picker");
roomid = roomid_;
stickerPopup.callback = callback;
popup(showAt ? showAt : null);
}
margins: 0
bottomPadding: 1
leftPadding: 1
rightPadding: 1
modal: true
focus: true
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
width: stickersPerRow * stickerDimPad + 20
Rectangle {
color: Nheko.colors.window
height: columnView.implicitHeight + 4
width: stickersPerRow * stickerDimPad + 20
ColumnLayout {
id: columnView
spacing: 0
anchors.leftMargin: 3
anchors.rightMargin: 3
anchors.bottom: parent.bottom
anchors.left: parent.left
anchors.right: parent.right
anchors.topMargin: 2
// Search field
TextField {
id: emojiSearch
Layout.topMargin: 3
Layout.preferredWidth: stickersPerRow * stickerDimPad + 20 - 6
palette: Nheko.colors
background: null
placeholderTextColor: Nheko.colors.buttonText
color: Nheko.colors.text
placeholderText: qsTr("Search")
selectByMouse: true
rightPadding: clearSearch.width
onTextChanged: searchTimer.restart()
onVisibleChanged: {
if (visible)
forceActiveFocus();
}
Timer {
id: searchTimer
interval: 350 // tweak as needed?
onTriggered: stickerPopup.model.searchString = emojiSearch.text
}
ToolButton {
id: clearSearch
visible: emojiSearch.text !== ''
icon.source: "image://colorimage/:/icons/icons/ui/round-remove-button.png?" + (clearSearch.hovered ? Nheko.colors.highlight : Nheko.colors.buttonText)
focusPolicy: Qt.NoFocus
onClicked: emojiSearch.clear()
hoverEnabled: true
background: null
anchors {
verticalCenter: parent.verticalCenter
right: parent.right
}
// clear the default hover effects.
Image {
height: parent.height - 2 * Nheko.paddingSmall
width: height
source: "image://colorimage/:/icons/icons/ui/round-remove-button.png?" + (clearSearch.hovered ? Nheko.colors.highlight : Nheko.colors.buttonText)
anchors {
verticalCenter: parent.verticalCenter
right: parent.right
margins: Nheko.paddingSmall
}
}
}
}
// emoji grid
GridView {
id: gridView
model: roomid ? TimelineManager.completerFor("stickers", roomid) : null
Layout.preferredHeight: cellHeight * 3.5
Layout.preferredWidth: stickersPerRow * stickerDimPad + 20
Layout.leftMargin: 4
cellWidth: stickerDimPad
cellHeight: stickerDimPad
boundsBehavior: Flickable.StopAtBounds
clip: true
currentIndex: -1 // prevent sorting from stealing focus
cacheBuffer: 500
ScrollHelper {
flickable: parent
anchors.fill: parent
enabled: !Settings.mobileMode
}
// Individual emoji
delegate: AbstractButton {
width: stickerDim
height: stickerDim
hoverEnabled: true
ToolTip.text: ":" + model.shortcode + ": - " + model.body
ToolTip.visible: hovered
// TODO: maybe add favorites at some point?
onClicked: {
console.debug("Picked " + model.shortcode);
stickerPopup.close();
callback(model.originalRow);
}
contentItem: Image {
height: stickerDim
width: stickerDim
source: model.url.replace("mxc://", "image://MxcImage/")
fillMode: Image.PreserveAspectFit
}
background: Rectangle {
anchors.fill: parent
color: hovered ? Nheko.colors.highlight : 'transparent'
radius: 5
}
}
ScrollBar.vertical: ScrollBar {
id: emojiScroll
}
}
}
}
}

View file

@ -88,7 +88,7 @@ Popup {
onClicked: {
if (buttonLayout.validateMic()) {
Settings.microphone = micCombo.currentText;
CallManager.sendInvite(room.roomId(), CallType.VOICE);
CallManager.sendInvite(room.roomId, CallType.VOICE);
close();
}
}
@ -102,7 +102,7 @@ Popup {
if (buttonLayout.validateMic()) {
Settings.microphone = micCombo.currentText;
Settings.camera = cameraCombo.currentText;
CallManager.sendInvite(room.roomId(), CallType.VIDEO);
CallManager.sendInvite(room.roomId, CallType.VIDEO);
close();
}
}

View file

@ -136,7 +136,7 @@ Popup {
Settings.screenSharePiP = pipCheckBox.checked;
Settings.screenShareRemoteVideo = remoteVideoCheckBox.checked;
Settings.screenShareHideCursor = hideCursorCheckBox.checked;
CallManager.sendInvite(room.roomId(), CallType.SCREEN, windowCombo.currentIndex);
CallManager.sendInvite(room.roomId, CallType.SCREEN, windowCombo.currentIndex);
close();
}
}

View file

@ -9,7 +9,6 @@
<file>icons/ui/do-not-disturb-rounded-sign@2x.png</file>
<file>icons/ui/round-remove-button.png</file>
<file>icons/ui/round-remove-button@2x.png</file>
<file>icons/ui/double-tick-indicator.png</file>
<file>icons/ui/double-tick-indicator@2x.png</file>
<file>icons/ui/lock.png</file>
@ -26,6 +25,7 @@
<file>icons/ui/search@2x.png</file>
<file>icons/ui/settings.png</file>
<file>icons/ui/settings@2x.png</file>
<file>icons/ui/sticky-note-solid.svg</file>
<file>icons/ui/smile.png</file>
<file>icons/ui/smile@2x.png</file>
<file>icons/ui/speech-bubbles-comment-option.png</file>
@ -54,22 +54,17 @@
<file>icons/ui/pause-symbol@2x.png</file>
<file>icons/ui/remove-symbol.png</file>
<file>icons/ui/remove-symbol@2x.png</file>
<file>icons/ui/world.png</file>
<file>icons/ui/world@2x.png</file>
<file>icons/ui/tag.png</file>
<file>icons/ui/tag@2x.png</file>
<file>icons/ui/star.png</file>
<file>icons/ui/star@2x.png</file>
<file>icons/ui/lowprio.png</file>
<file>icons/ui/lowprio@2x.png</file>
<file>icons/ui/edit.png</file>
<file>icons/ui/edit@2x.png</file>
<file>icons/ui/mail-reply.png</file>
<file>icons/ui/place-call.png</file>
<file>icons/ui/end-call.png</file>
<file>icons/ui/microphone-mute.png</file>
@ -77,7 +72,6 @@
<file>icons/ui/screen-share.png</file>
<file>icons/ui/toggle-camera-view.png</file>
<file>icons/ui/video-call.png</file>
<file>icons/emoji-categories/people.png</file>
<file>icons/emoji-categories/people@2x.png</file>
<file>icons/emoji-categories/nature.png</file>
@ -98,16 +92,12 @@
<qresource prefix="/logos">
<file>nheko.png</file>
<file>nheko.svg</file>
<file>splash.png</file>
<file>splash@2x.png</file>
<file>register.png</file>
<file>register@2x.png</file>
<file>login.png</file>
<file>login@2x.png</file>
<file>nheko-512.png</file>
<file>nheko-256.png</file>
<file>nheko-128.png</file>
@ -150,8 +140,8 @@
<file>qml/ForwardCompleter.qml</file>
<file>qml/TypingIndicator.qml</file>
<file>qml/RoomSettings.qml</file>
<file>qml/emoji/EmojiButton.qml</file>
<file>qml/emoji/EmojiPicker.qml</file>
<file>qml/emoji/StickerPicker.qml</file>
<file>qml/UserProfile.qml</file>
<file>qml/delegates/MessageDelegate.qml</file>
<file>qml/delegates/TextMessage.qml</file>
@ -170,6 +160,7 @@
<file>qml/device-verification/Failed.qml</file>
<file>qml/device-verification/Success.qml</file>
<file>qml/dialogs/InputDialog.qml</file>
<file>qml/dialogs/ImagePackSettingsDialog.qml</file>
<file>qml/ui/Ripple.qml</file>
<file>qml/ui/Spinner.qml</file>
<file>qml/ui/animations/BlinkAnimation.qml</file>
@ -184,6 +175,8 @@
<file>qml/components/AdaptiveLayout.qml</file>
<file>qml/components/AdaptiveLayoutElement.qml</file>
<file>qml/components/FlatButton.qml</file>
<file>qml/RoomMembers.qml</file>
<file>qml/InviteDialog.qml</file>
</qresource>
<qresource prefix="/media">
<file>media/ring.ogg</file>

View file

@ -78,6 +78,8 @@ constexpr auto ENCRYPTED_ROOMS_DB("encrypted_rooms");
constexpr auto INBOUND_MEGOLM_SESSIONS_DB("inbound_megolm_sessions");
//! MegolmSessionIndex -> pickled OlmOutboundGroupSession
constexpr auto OUTBOUND_MEGOLM_SESSIONS_DB("outbound_megolm_sessions");
//! MegolmSessionIndex -> session data about which devices have access to this
constexpr auto MEGOLM_SESSIONS_DATA_DB("megolm_sessions_data_db");
using CachedReceipts = std::multimap<uint64_t, std::string, std::greater<uint64_t>>;
using Receipts = std::map<std::string, std::map<std::string, uint64_t>>;
@ -284,6 +286,7 @@ Cache::setup()
// Session management
inboundMegolmSessionDb_ = lmdb::dbi::open(txn, INBOUND_MEGOLM_SESSIONS_DB, MDB_CREATE);
outboundMegolmSessionDb_ = lmdb::dbi::open(txn, OUTBOUND_MEGOLM_SESSIONS_DB, MDB_CREATE);
megolmSessionDataDb_ = lmdb::dbi::open(txn, MEGOLM_SESSIONS_DATA_DB, MDB_CREATE);
txn.commit();
@ -387,9 +390,14 @@ Cache::importSessionKeys(const mtx::crypto::ExportedSessionKeys &keys)
index.session_id = s.session_id;
index.sender_key = s.sender_key;
GroupSessionData data{};
data.forwarding_curve25519_key_chain = s.forwarding_curve25519_key_chain;
if (s.sender_claimed_keys.count("ed25519"))
data.sender_claimed_ed25519_key = s.sender_claimed_keys.at("ed25519");
auto exported_session = mtx::crypto::import_session(s.session_key);
saveInboundMegolmSession(index, std::move(exported_session));
saveInboundMegolmSession(index, std::move(exported_session), data);
ChatPage::instance()->receivedSessionKey(index.room_id, index.session_id);
}
}
@ -400,7 +408,8 @@ Cache::importSessionKeys(const mtx::crypto::ExportedSessionKeys &keys)
void
Cache::saveInboundMegolmSession(const MegolmSessionIndex &index,
mtx::crypto::InboundGroupSessionPtr session)
mtx::crypto::InboundGroupSessionPtr session,
const GroupSessionData &data)
{
using namespace mtx::crypto;
const auto key = json(index).dump();
@ -420,6 +429,7 @@ Cache::saveInboundMegolmSession(const MegolmSessionIndex &index,
}
inboundMegolmSessionDb_.put(txn, key, pickled);
megolmSessionDataDb_.put(txn, key, json(data).dump());
txn.commit();
}
@ -464,7 +474,7 @@ Cache::inboundMegolmSessionExists(const MegolmSessionIndex &index)
void
Cache::updateOutboundMegolmSession(const std::string &room_id,
const OutboundGroupSessionData &data_,
const GroupSessionData &data_,
mtx::crypto::OutboundGroupSessionPtr &ptr)
{
using namespace mtx::crypto;
@ -472,18 +482,20 @@ Cache::updateOutboundMegolmSession(const std::string &room_id,
if (!outboundMegolmSessionExists(room_id))
return;
OutboundGroupSessionData data = data_;
data.message_index = olm_outbound_group_session_message_index(ptr.get());
data.session_id = mtx::crypto::session_id(ptr.get());
data.session_key = mtx::crypto::session_key(ptr.get());
GroupSessionData data = data_;
data.message_index = olm_outbound_group_session_message_index(ptr.get());
MegolmSessionIndex index;
index.room_id = room_id;
index.sender_key = olm::client()->identity_keys().ed25519;
index.session_id = mtx::crypto::session_id(ptr.get());
// Save the updated pickled data for the session.
json j;
j["data"] = data;
j["session"] = pickle<OutboundSessionObject>(ptr.get(), SECRET);
auto txn = lmdb::txn::begin(env_);
outboundMegolmSessionDb_.put(txn, room_id, j.dump());
megolmSessionDataDb_.put(txn, json(index).dump(), json(data).dump());
txn.commit();
}
@ -498,24 +510,32 @@ Cache::dropOutboundMegolmSession(const std::string &room_id)
{
auto txn = lmdb::txn::begin(env_);
outboundMegolmSessionDb_.del(txn, room_id);
// don't delete session data, so that we can still share the session.
txn.commit();
}
}
void
Cache::saveOutboundMegolmSession(const std::string &room_id,
const OutboundGroupSessionData &data,
const GroupSessionData &data_,
mtx::crypto::OutboundGroupSessionPtr &session)
{
using namespace mtx::crypto;
const auto pickled = pickle<OutboundSessionObject>(session.get(), SECRET);
GroupSessionData data = data_;
data.message_index = olm_outbound_group_session_message_index(session.get());
MegolmSessionIndex index;
index.room_id = room_id;
index.sender_key = olm::client()->identity_keys().ed25519;
index.session_id = mtx::crypto::session_id(session.get());
json j;
j["data"] = data;
j["session"] = pickled;
auto txn = lmdb::txn::begin(env_);
outboundMegolmSessionDb_.put(txn, room_id, j.dump());
megolmSessionDataDb_.put(txn, json(index).dump(), json(data).dump());
txn.commit();
}
@ -544,8 +564,17 @@ Cache::getOutboundMegolmSession(const std::string &room_id)
auto obj = json::parse(value);
OutboundGroupSessionDataRef ref{};
ref.data = obj.at("data").get<OutboundGroupSessionData>();
ref.session = unpickle<OutboundSessionObject>(obj.at("session"), SECRET);
MegolmSessionIndex index;
index.room_id = room_id;
index.sender_key = olm::client()->identity_keys().ed25519;
index.session_id = mtx::crypto::session_id(ref.session.get());
if (megolmSessionDataDb_.get(txn, json(index).dump(), value)) {
ref.data = nlohmann::json::parse(value).get<GroupSessionData>();
}
return ref;
} catch (std::exception &e) {
nhlog::db()->error("Failed to retrieve outbound Megolm Session: {}", e.what());
@ -553,6 +582,25 @@ Cache::getOutboundMegolmSession(const std::string &room_id)
}
}
std::optional<GroupSessionData>
Cache::getMegolmSessionData(const MegolmSessionIndex &index)
{
try {
using namespace mtx::crypto;
auto txn = ro_txn(env_);
std::string_view value;
if (megolmSessionDataDb_.get(txn, json(index).dump(), value)) {
return nlohmann::json::parse(value).get<GroupSessionData>();
}
return std::nullopt;
} catch (std::exception &e) {
nhlog::db()->error("Failed to retrieve Megolm Session Data: {}", e.what());
return std::nullopt;
}
}
//
// OLM sessions.
//
@ -829,6 +877,7 @@ Cache::deleteData()
lmdb::dbi_close(env_, inboundMegolmSessionDb_);
lmdb::dbi_close(env_, outboundMegolmSessionDb_);
lmdb::dbi_close(env_, megolmSessionDataDb_);
env_.close();
@ -3333,6 +3382,86 @@ Cache::getChildRoomIds(const std::string &room_id)
return roomids;
}
std::vector<ImagePackInfo>
Cache::getImagePacks(const std::string &room_id, std::optional<bool> stickers)
{
auto txn = ro_txn(env_);
std::vector<ImagePackInfo> infos;
auto addPack = [&infos, stickers](const mtx::events::msc2545::ImagePack &pack,
const std::string &source_room,
const std::string &state_key) {
if (!pack.pack || !stickers.has_value() ||
(stickers.value() ? pack.pack->is_sticker() : pack.pack->is_emoji())) {
ImagePackInfo info;
info.source_room = source_room;
info.state_key = state_key;
info.pack.pack = pack.pack;
for (const auto &img : pack.images) {
if (img.second.overrides_usage() &&
(stickers ? !img.second.is_sticker() : !img.second.is_emoji()))
continue;
info.pack.images.insert(img);
}
if (!info.pack.images.empty())
infos.push_back(std::move(info));
}
};
// packs from account data
if (auto accountpack =
getAccountData(txn, mtx::events::EventType::ImagePackInAccountData, "")) {
auto tmp =
std::get_if<mtx::events::EphemeralEvent<mtx::events::msc2545::ImagePack>>(
&*accountpack);
if (tmp)
addPack(tmp->content, "", "");
}
// packs from rooms, that were enabled globally
if (auto roomPacks = getAccountData(txn, mtx::events::EventType::ImagePackRooms, "")) {
auto tmp =
std::get_if<mtx::events::EphemeralEvent<mtx::events::msc2545::ImagePackRooms>>(
&*roomPacks);
if (tmp) {
for (const auto &[room_id2, state_to_d] : tmp->content.rooms) {
// don't add stickers from this room twice
if (room_id2 == room_id)
continue;
for (const auto &[state_id, d] : state_to_d) {
(void)d;
if (auto pack =
getStateEvent<mtx::events::msc2545::ImagePack>(
txn, room_id2, state_id))
addPack(pack->content, room_id2, state_id);
}
}
}
}
// packs from current room
if (auto pack = getStateEvent<mtx::events::msc2545::ImagePack>(txn, room_id)) {
addPack(pack->content, room_id, "");
}
for (const auto &pack :
getStateEventsWithType<mtx::events::msc2545::ImagePack>(txn, room_id)) {
addPack(pack.content, room_id, pack.state_key);
}
return infos;
}
std::optional<mtx::events::collections::RoomAccountDataEvents>
Cache::getAccountData(mtx::events::EventType type, const std::string &room_id)
{
auto txn = ro_txn(env_);
return getAccountData(txn, type, room_id);
}
std::optional<mtx::events::collections::RoomAccountDataEvents>
Cache::getAccountData(lmdb::txn &txn, mtx::events::EventType type, const std::string &room_id)
{
@ -3525,6 +3654,7 @@ to_json(json &j, const UserKeyCache &info)
{
j["device_keys"] = info.device_keys;
j["seen_device_keys"] = info.seen_device_keys;
j["seen_device_ids"] = info.seen_device_ids;
j["master_keys"] = info.master_keys;
j["master_key_changed"] = info.master_key_changed;
j["user_signing_keys"] = info.user_signing_keys;
@ -3538,6 +3668,7 @@ from_json(const json &j, UserKeyCache &info)
{
info.device_keys = j.value("device_keys", std::map<std::string, mtx::crypto::DeviceKeys>{});
info.seen_device_keys = j.value("seen_device_keys", std::set<std::string>{});
info.seen_device_ids = j.value("seen_device_ids", std::set<std::string>{});
info.master_keys = j.value("master_keys", mtx::crypto::CrossSigningKeys{});
info.master_key_changed = j.value("master_key_changed", false);
info.user_signing_keys = j.value("user_signing_keys", mtx::crypto::CrossSigningKeys{});
@ -3634,6 +3765,15 @@ Cache::updateUserKeys(const std::string &sync_token, const mtx::responses::Query
keyReused = true;
break;
}
if (updateToWrite.seen_device_ids.count(
device_id)) {
nhlog::crypto()->warn(
"device_id '{}' reused by ({})",
device_id,
user);
keyReused = true;
break;
}
}
if (!keyReused && !oldDeviceKeys.count(device_id))
@ -3644,6 +3784,7 @@ Cache::updateUserKeys(const std::string &sync_token, const mtx::responses::Query
(void)key_id;
updateToWrite.seen_device_keys.insert(key);
}
updateToWrite.seen_device_ids.insert(device_id);
}
}
db.put(txn, user, json(updateToWrite).dump());
@ -4077,17 +4218,15 @@ from_json(const json &j, MemberInfo &info)
}
void
to_json(nlohmann::json &obj, const DeviceAndMasterKeys &msg)
to_json(nlohmann::json &obj, const DeviceKeysToMsgIndex &msg)
{
obj["devices"] = msg.devices;
obj["master_keys"] = msg.master_keys;
obj["deviceids"] = msg.deviceids;
}
void
from_json(const nlohmann::json &obj, DeviceAndMasterKeys &msg)
from_json(const nlohmann::json &obj, DeviceKeysToMsgIndex &msg)
{
msg.devices = obj.at("devices").get<decltype(msg.devices)>();
msg.master_keys = obj.at("master_keys").get<decltype(msg.master_keys)>();
msg.deviceids = obj.at("deviceids").get<decltype(msg.deviceids)>();
}
void
@ -4099,30 +4238,31 @@ to_json(nlohmann::json &obj, const SharedWithUsers &msg)
void
from_json(const nlohmann::json &obj, SharedWithUsers &msg)
{
msg.keys = obj.at("keys").get<std::map<std::string, DeviceAndMasterKeys>>();
msg.keys = obj.at("keys").get<std::map<std::string, DeviceKeysToMsgIndex>>();
}
void
to_json(nlohmann::json &obj, const OutboundGroupSessionData &msg)
to_json(nlohmann::json &obj, const GroupSessionData &msg)
{
obj["session_id"] = msg.session_id;
obj["session_key"] = msg.session_key;
obj["message_index"] = msg.message_index;
obj["ts"] = msg.timestamp;
obj["initially"] = msg.initially;
obj["sender_claimed_ed25519_key"] = msg.sender_claimed_ed25519_key;
obj["forwarding_curve25519_key_chain"] = msg.forwarding_curve25519_key_chain;
obj["currently"] = msg.currently;
}
void
from_json(const nlohmann::json &obj, OutboundGroupSessionData &msg)
from_json(const nlohmann::json &obj, GroupSessionData &msg)
{
msg.session_id = obj.at("session_id");
msg.session_key = obj.at("session_key");
msg.message_index = obj.at("message_index");
msg.timestamp = obj.value("ts", 0ULL);
msg.initially = obj.value("initially", SharedWithUsers{});
msg.sender_claimed_ed25519_key = obj.value("sender_claimed_ed25519_key", "");
msg.forwarding_curve25519_key_chain =
obj.value("forwarding_curve25519_key_chain", std::vector<std::string>{});
msg.currently = obj.value("currently", SharedWithUsers{});
}
@ -4522,7 +4662,7 @@ isRoomMember(const std::string &user_id, const std::string &room_id)
//
void
saveOutboundMegolmSession(const std::string &room_id,
const OutboundGroupSessionData &data,
const GroupSessionData &data,
mtx::crypto::OutboundGroupSessionPtr &session)
{
instance_->saveOutboundMegolmSession(room_id, data, session);
@ -4539,7 +4679,7 @@ outboundMegolmSessionExists(const std::string &room_id) noexcept
}
void
updateOutboundMegolmSession(const std::string &room_id,
const OutboundGroupSessionData &data,
const GroupSessionData &data,
mtx::crypto::OutboundGroupSessionPtr &session)
{
instance_->updateOutboundMegolmSession(room_id, data, session);
@ -4566,9 +4706,10 @@ exportSessionKeys()
//
void
saveInboundMegolmSession(const MegolmSessionIndex &index,
mtx::crypto::InboundGroupSessionPtr session)
mtx::crypto::InboundGroupSessionPtr session,
const GroupSessionData &data)
{
instance_->saveInboundMegolmSession(index, std::move(session));
instance_->saveInboundMegolmSession(index, std::move(session), data);
}
mtx::crypto::InboundGroupSessionPtr
getInboundMegolmSession(const MegolmSessionIndex &index)
@ -4580,6 +4721,11 @@ inboundMegolmSessionExists(const MegolmSessionIndex &index)
{
return instance_->inboundMegolmSessionExists(index);
}
std::optional<GroupSessionData>
getMegolmSessionData(const MegolmSessionIndex &index)
{
return instance_->getMegolmSessionData(index);
}
//
// Olm Sessions

View file

@ -200,7 +200,7 @@ isRoomMember(const std::string &user_id, const std::string &room_id);
//
void
saveOutboundMegolmSession(const std::string &room_id,
const OutboundGroupSessionData &data,
const GroupSessionData &data,
mtx::crypto::OutboundGroupSessionPtr &session);
OutboundGroupSessionDataRef
getOutboundMegolmSession(const std::string &room_id);
@ -208,7 +208,7 @@ bool
outboundMegolmSessionExists(const std::string &room_id) noexcept;
void
updateOutboundMegolmSession(const std::string &room_id,
const OutboundGroupSessionData &data,
const GroupSessionData &data,
mtx::crypto::OutboundGroupSessionPtr &session);
void
dropOutboundMegolmSession(const std::string &room_id);
@ -223,11 +223,14 @@ exportSessionKeys();
//
void
saveInboundMegolmSession(const MegolmSessionIndex &index,
mtx::crypto::InboundGroupSessionPtr session);
mtx::crypto::InboundGroupSessionPtr session,
const GroupSessionData &data);
mtx::crypto::InboundGroupSessionPtr
getInboundMegolmSession(const MegolmSessionIndex &index);
bool
inboundMegolmSessionExists(const MegolmSessionIndex &index);
std::optional<GroupSessionData>
getMegolmSessionData(const MegolmSessionIndex &index);
//
// Olm Sessions

View file

@ -27,40 +27,43 @@ enum Trust
Q_ENUM_NS(Trust)
}
struct DeviceAndMasterKeys
struct DeviceKeysToMsgIndex
{
// map from device id or master key id to message_index
std::map<std::string, uint64_t> devices, master_keys;
// map from device key to message_index
// Using the device id is safe because we check for reuse on device list updates
// Using the device id makes our logic much easier to read.
std::map<std::string, uint64_t> deviceids;
};
struct SharedWithUsers
{
// userid to keys
std::map<std::string, DeviceAndMasterKeys> keys;
std::map<std::string, DeviceKeysToMsgIndex> keys;
};
// Extra information associated with an outbound megolm session.
struct OutboundGroupSessionData
struct GroupSessionData
{
std::string session_id;
std::string session_key;
uint64_t message_index = 0;
uint64_t timestamp = 0;
std::string sender_claimed_ed25519_key;
std::vector<std::string> forwarding_curve25519_key_chain;
// who has access to this session.
// Rotate, when a user leaves the room and share, when a user gets added.
SharedWithUsers initially, currently;
SharedWithUsers currently;
};
void
to_json(nlohmann::json &obj, const OutboundGroupSessionData &msg);
to_json(nlohmann::json &obj, const GroupSessionData &msg);
void
from_json(const nlohmann::json &obj, OutboundGroupSessionData &msg);
from_json(const nlohmann::json &obj, GroupSessionData &msg);
struct OutboundGroupSessionDataRef
{
mtx::crypto::OutboundGroupSessionPtr session;
OutboundGroupSessionData data;
GroupSessionData data;
};
struct DevicePublicKeys
@ -134,6 +137,8 @@ struct UserKeyCache
bool master_key_changed = false;
//! Device keys that were already used at least once
std::set<std::string> seen_device_keys;
//! Device ids that were already used at least once
std::set<std::string> seen_device_ids;
};
void

View file

@ -11,6 +11,7 @@
#include <string>
#include <mtx/events/join_rules.hpp>
#include <mtx/events/mscs/image_packs.hpp>
namespace cache {
enum class CacheVersion : int
@ -109,3 +110,10 @@ struct RoomSearchResult
std::string room_id;
RoomInfo info;
};
struct ImagePackInfo
{
mtx::events::msc2545::ImagePack pack;
std::string source_room;
std::string state_key;
};

View file

@ -97,6 +97,12 @@ public:
return getStateEvent<T>(txn, room_id, state_key);
}
//! retrieve a specific event from account data
//! pass empty room_id for global account data
std::optional<mtx::events::collections::RoomAccountDataEvents> getAccountData(
mtx::events::EventType type,
const std::string &room_id = "");
//! Retrieve member info from a room.
std::vector<RoomMember> getMembers(const std::string &room_id,
std::size_t startIndex = 0,
@ -225,6 +231,9 @@ public:
std::vector<std::string> getParentRoomIds(const std::string &room_id);
std::vector<std::string> getChildRoomIds(const std::string &room_id);
std::vector<ImagePackInfo> getImagePacks(const std::string &room_id,
std::optional<bool> stickers);
//! Mark a room that uses e2e encryption.
void setEncryptedRoom(lmdb::txn &txn, const std::string &room_id);
bool isRoomEncrypted(const std::string &room_id);
@ -238,12 +247,12 @@ public:
// Outbound Megolm Sessions
//
void saveOutboundMegolmSession(const std::string &room_id,
const OutboundGroupSessionData &data,
const GroupSessionData &data,
mtx::crypto::OutboundGroupSessionPtr &session);
OutboundGroupSessionDataRef getOutboundMegolmSession(const std::string &room_id);
bool outboundMegolmSessionExists(const std::string &room_id) noexcept;
void updateOutboundMegolmSession(const std::string &room_id,
const OutboundGroupSessionData &data,
const GroupSessionData &data,
mtx::crypto::OutboundGroupSessionPtr &session);
void dropOutboundMegolmSession(const std::string &room_id);
@ -254,10 +263,12 @@ public:
// Inbound Megolm Sessions
//
void saveInboundMegolmSession(const MegolmSessionIndex &index,
mtx::crypto::InboundGroupSessionPtr session);
mtx::crypto::InboundGroupSessionPtr session,
const GroupSessionData &data);
mtx::crypto::InboundGroupSessionPtr getInboundMegolmSession(
const MegolmSessionIndex &index);
bool inboundMegolmSessionExists(const MegolmSessionIndex &index);
std::optional<GroupSessionData> getMegolmSessionData(const MegolmSessionIndex &index);
//
// Olm Sessions
@ -676,6 +687,7 @@ private:
lmdb::dbi inboundMegolmSessionDb_;
lmdb::dbi outboundMegolmSessionDb_;
lmdb::dbi megolmSessionDataDb_;
QString localUserId_;
QString cacheDirectory_;

View file

@ -116,29 +116,31 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
connect(this, &ChatPage::loggedOut, this, &ChatPage::logout);
connect(view_manager_, &TimelineViewManager::inviteUsers, this, [this](QStringList users) {
const auto room_id = currentRoom().toStdString();
connect(
view_manager_,
&TimelineViewManager::inviteUsers,
this,
[this](QString roomId, QStringList users) {
for (int ii = 0; ii < users.size(); ++ii) {
QTimer::singleShot(ii * 500, this, [this, roomId, ii, users]() {
const auto user = users.at(ii);
for (int ii = 0; ii < users.size(); ++ii) {
QTimer::singleShot(ii * 500, this, [this, room_id, ii, users]() {
const auto user = users.at(ii);
http::client()->invite_user(
roomId.toStdString(),
user.toStdString(),
[this, user](const mtx::responses::RoomInvite &,
mtx::http::RequestErr err) {
if (err) {
emit showNotification(
tr("Failed to invite user: %1").arg(user));
return;
}
http::client()->invite_user(
room_id,
user.toStdString(),
[this, user](const mtx::responses::RoomInvite &,
mtx::http::RequestErr err) {
if (err) {
emit showNotification(
tr("Failed to invite user: %1").arg(user));
return;
}
emit showNotification(tr("Invited user: %1").arg(user));
});
});
}
});
emit showNotification(tr("Invited user: %1").arg(user));
});
});
}
});
connect(this, &ChatPage::leftRoom, this, &ChatPage::removeRoom);
connect(this, &ChatPage::newRoom, this, &ChatPage::changeRoom, Qt::QueuedConnection);
@ -927,27 +929,33 @@ ChatPage::currentPresence() const
void
ChatPage::ensureOneTimeKeyCount(const std::map<std::string, uint16_t> &counts)
{
for (const auto &entry : counts) {
if (entry.second < MAX_ONETIME_KEYS) {
const int nkeys = MAX_ONETIME_KEYS - entry.second;
uint16_t count = 0;
if (auto c = counts.find(mtx::crypto::SIGNED_CURVE25519); c != counts.end())
count = c->second;
nhlog::crypto()->info("uploading {} {} keys", nkeys, entry.first);
olm::client()->generate_one_time_keys(nkeys);
if (count < MAX_ONETIME_KEYS) {
const int nkeys = MAX_ONETIME_KEYS - count;
http::client()->upload_keys(
olm::client()->create_upload_keys_request(),
[](const mtx::responses::UploadKeys &, mtx::http::RequestErr err) {
if (err) {
nhlog::crypto()->warn(
"failed to update one-time keys: {} {}",
err->matrix_error.error,
static_cast<int>(err->status_code));
nhlog::crypto()->info(
"uploading {} {} keys", nkeys, mtx::crypto::SIGNED_CURVE25519);
olm::client()->generate_one_time_keys(nkeys);
http::client()->upload_keys(
olm::client()->create_upload_keys_request(),
[](const mtx::responses::UploadKeys &, mtx::http::RequestErr err) {
if (err) {
nhlog::crypto()->warn("failed to update one-time keys: {} {} {}",
err->matrix_error.error,
static_cast<int>(err->status_code),
static_cast<int>(err->error_code));
if (err->status_code < 400 || err->status_code >= 500)
return;
}
}
olm::mark_keys_as_published();
});
}
// mark as published anyway, otherwise we may end up in a loop.
olm::mark_keys_as_published();
});
}
}

View file

@ -0,0 +1,77 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "CombinedImagePackModel.h"
#include "Cache_p.h"
#include "CompletionModelRoles.h"
CombinedImagePackModel::CombinedImagePackModel(const std::string &roomId,
bool stickers,
QObject *parent)
: QAbstractListModel(parent)
, room_id(roomId)
{
auto packs = cache::client()->getImagePacks(room_id, stickers);
for (const auto &pack : packs) {
QString packname =
pack.pack.pack ? QString::fromStdString(pack.pack.pack->display_name) : "";
for (const auto &img : pack.pack.images) {
ImageDesc i{};
i.shortcode = QString::fromStdString(img.first);
i.packname = packname;
i.image = img.second;
images.push_back(std::move(i));
}
}
}
int
CombinedImagePackModel::rowCount(const QModelIndex &) const
{
return (int)images.size();
}
QHash<int, QByteArray>
CombinedImagePackModel::roleNames() const
{
return {
{CompletionModel::CompletionRole, "completionRole"},
{CompletionModel::SearchRole, "searchRole"},
{CompletionModel::SearchRole2, "searchRole2"},
{Roles::Url, "url"},
{Roles::ShortCode, "shortcode"},
{Roles::Body, "body"},
{Roles::PackName, "packname"},
{Roles::OriginalRow, "originalRow"},
};
}
QVariant
CombinedImagePackModel::data(const QModelIndex &index, int role) const
{
if (hasIndex(index.row(), index.column(), index.parent())) {
switch (role) {
case CompletionModel::CompletionRole:
return QString::fromStdString(images[index.row()].image.url);
case Roles::Url:
return QString::fromStdString(images[index.row()].image.url);
case CompletionModel::SearchRole:
case Roles::ShortCode:
return images[index.row()].shortcode;
case CompletionModel::SearchRole2:
case Roles::Body:
return QString::fromStdString(images[index.row()].image.body);
case Roles::PackName:
return images[index.row()].packname;
case Roles::OriginalRow:
return index.row();
default:
return {};
}
}
return {};
}

View file

@ -0,0 +1,48 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QAbstractListModel>
#include <mtx/events/mscs/image_packs.hpp>
class CombinedImagePackModel : public QAbstractListModel
{
Q_OBJECT
public:
enum Roles
{
Url = Qt::UserRole,
ShortCode,
Body,
PackName,
OriginalRow,
};
CombinedImagePackModel(const std::string &roomId, bool stickers, QObject *parent = nullptr);
QHash<int, QByteArray> roleNames() const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role) const override;
mtx::events::msc2545::PackImage imageAt(int row)
{
if (row < 0 || static_cast<size_t>(row) >= images.size())
return {};
return images.at(static_cast<size_t>(row)).image;
}
private:
std::string room_id;
struct ImageDesc
{
QString shortcode;
QString packname;
mtx::events::msc2545::PackImage image;
};
std::vector<ImageDesc> images;
};

View file

@ -0,0 +1,76 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "ImagePackListModel.h"
#include <QQmlEngine>
#include "Cache_p.h"
#include "SingleImagePackModel.h"
ImagePackListModel::ImagePackListModel(const std::string &roomId, QObject *parent)
: QAbstractListModel(parent)
, room_id(roomId)
{
auto packs_ = cache::client()->getImagePacks(room_id, std::nullopt);
for (const auto &pack : packs_) {
packs.push_back(
QSharedPointer<SingleImagePackModel>(new SingleImagePackModel(pack)));
}
}
int
ImagePackListModel::rowCount(const QModelIndex &) const
{
return (int)packs.size();
}
QHash<int, QByteArray>
ImagePackListModel::roleNames() const
{
return {
{Roles::DisplayName, "displayName"},
{Roles::AvatarUrl, "avatarUrl"},
{Roles::FromAccountData, "fromAccountData"},
{Roles::FromCurrentRoom, "fromCurrentRoom"},
{Roles::StateKey, "statekey"},
{Roles::RoomId, "roomid"},
};
}
QVariant
ImagePackListModel::data(const QModelIndex &index, int role) const
{
if (hasIndex(index.row(), index.column(), index.parent())) {
const auto &pack = packs.at(index.row());
switch (role) {
case Roles::DisplayName:
return pack->packname();
case Roles::AvatarUrl:
return pack->avatarUrl();
case Roles::FromAccountData:
return pack->roomid().isEmpty();
case Roles::FromCurrentRoom:
return pack->roomid().toStdString() == this->room_id;
case Roles::StateKey:
return pack->statekey();
case Roles::RoomId:
return pack->roomid();
default:
return {};
}
}
return {};
}
SingleImagePackModel *
ImagePackListModel::packAt(int row)
{
if (row < 0 || static_cast<size_t>(row) >= packs.size())
return {};
auto e = packs.at(row).get();
QQmlEngine::setObjectOwnership(e, QQmlEngine::CppOwnership);
return e;
}

37
src/ImagePackListModel.h Normal file
View file

@ -0,0 +1,37 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QAbstractListModel>
#include <QQmlEngine>
#include <QSharedPointer>
class SingleImagePackModel;
class ImagePackListModel : public QAbstractListModel
{
Q_OBJECT
public:
enum Roles
{
DisplayName = Qt::UserRole,
AvatarUrl,
FromAccountData,
FromCurrentRoom,
StateKey,
RoomId,
};
ImagePackListModel(const std::string &roomId, QObject *parent = nullptr);
QHash<int, QByteArray> roleNames() const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role) const override;
Q_INVOKABLE SingleImagePackModel *packAt(int row);
private:
std::string room_id;
std::vector<QSharedPointer<SingleImagePackModel>> packs;
};

View file

@ -1,28 +0,0 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include <QHBoxLayout>
#include <QLabel>
#include <QPushButton>
#include "InviteeItem.h"
constexpr int SidePadding = 10;
InviteeItem::InviteeItem(mtx::identifiers::User user, QWidget *parent)
: QWidget{parent}
, user_{QString::fromStdString(user.to_string())}
{
auto topLayout_ = new QHBoxLayout(this);
topLayout_->setSpacing(0);
topLayout_->setContentsMargins(SidePadding, 0, 3 * SidePadding, 0);
name_ = new QLabel(user_, this);
removeUserBtn_ = new QPushButton(tr("Remove"), this);
topLayout_->addWidget(name_);
topLayout_->addWidget(removeUserBtn_, 0, Qt::AlignRight);
connect(removeUserBtn_, &QPushButton::clicked, this, &InviteeItem::removeItem);
}

View file

@ -1,31 +0,0 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QWidget>
#include <mtx/identifiers.hpp>
class QPushButton;
class QLabel;
class InviteeItem : public QWidget
{
Q_OBJECT
public:
InviteeItem(mtx::identifiers::User user, QWidget *parent = nullptr);
QString userID() { return user_; }
signals:
void removeItem();
private:
QString user_;
QLabel *name_;
QPushButton *removeUserBtn_;
};

84
src/InviteesModel.cpp Normal file
View file

@ -0,0 +1,84 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "InviteesModel.h"
#include "Cache.h"
#include "Logging.h"
#include "MatrixClient.h"
#include "mtx/responses/profile.hpp"
InviteesModel::InviteesModel(QObject *parent)
: QAbstractListModel{parent}
{}
void
InviteesModel::addUser(QString mxid)
{
beginInsertRows(QModelIndex(), invitees_.count(), invitees_.count());
auto invitee = new Invitee{mxid, this};
auto indexOfInvitee = invitees_.count();
connect(invitee, &Invitee::userInfoLoaded, this, [this, indexOfInvitee]() {
emit dataChanged(index(indexOfInvitee), index(indexOfInvitee));
});
invitees_.push_back(invitee);
endInsertRows();
emit countChanged();
}
QHash<int, QByteArray>
InviteesModel::roleNames() const
{
return {{Mxid, "mxid"}, {DisplayName, "displayName"}, {AvatarUrl, "avatarUrl"}};
}
QVariant
InviteesModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.row() >= (int)invitees_.size() || index.row() < 0)
return {};
switch (role) {
case Mxid:
return invitees_[index.row()]->mxid_;
case DisplayName:
return invitees_[index.row()]->displayName_;
case AvatarUrl:
return invitees_[index.row()]->avatarUrl_;
default:
return {};
}
}
QStringList
InviteesModel::mxids()
{
QStringList mxidList;
for (int i = 0; i < invitees_.length(); ++i)
mxidList.push_back(invitees_[i]->mxid_);
return mxidList;
}
Invitee::Invitee(const QString &mxid, QObject *parent)
: QObject{parent}
, mxid_{mxid}
{
http::client()->get_profile(
mxid_.toStdString(),
[this](const mtx::responses::Profile &res, mtx::http::RequestErr err) {
if (err) {
nhlog::net()->warn("failed to retrieve profile info");
emit userInfoLoaded();
return;
}
displayName_ = QString::fromStdString(res.display_name);
avatarUrl_ = QString::fromStdString(res.avatar_url);
emit userInfoLoaded();
});
}

63
src/InviteesModel.h Normal file
View file

@ -0,0 +1,63 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#ifndef INVITEESMODEL_H
#define INVITEESMODEL_H
#include <QAbstractListModel>
#include <QVector>
class Invitee : public QObject
{
Q_OBJECT
public:
Invitee(const QString &mxid, QObject *parent = nullptr);
signals:
void userInfoLoaded();
private:
const QString mxid_;
QString displayName_;
QString avatarUrl_;
friend class InviteesModel;
};
class InviteesModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
public:
enum Roles
{
Mxid,
DisplayName,
AvatarUrl,
};
InviteesModel(QObject *parent = nullptr);
Q_INVOKABLE void addUser(QString mxid);
QHash<int, QByteArray> roleNames() const override;
int rowCount(const QModelIndex & = QModelIndex()) const override
{
return (int)invitees_.size();
}
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QStringList mxids();
signals:
void accept();
void countChanged();
private:
QVector<Invitee *> invitees_;
};
#endif // INVITEESMODEL_H

View file

@ -21,6 +21,7 @@
#include "LoginPage.h"
#include "MainWindow.h"
#include "MatrixClient.h"
#include "MemberList.h"
#include "RegisterPage.h"
#include "TrayIcon.h"
#include "UserSettingsPage.h"
@ -32,11 +33,9 @@
#include "ui/SnackBar.h"
#include "dialogs/CreateRoom.h"
#include "dialogs/InviteUsers.h"
#include "dialogs/JoinRoom.h"
#include "dialogs/LeaveRoom.h"
#include "dialogs/Logout.h"
#include "dialogs/MemberList.h"
#include "dialogs/ReadReceipts.h"
MainWindow *MainWindow::instance_ = nullptr;
@ -310,14 +309,6 @@ MainWindow::hasActiveUser()
settings.contains(prefix + "auth/user_id");
}
void
MainWindow::openMemberListDialog(const QString &room_id)
{
auto dialog = new dialogs::MemberList(room_id, this);
showDialog(dialog);
}
void
MainWindow::openLeaveRoomDialog(const QString &room_id)
{
@ -341,18 +332,6 @@ MainWindow::showOverlayProgressBar()
showSolidOverlayModal(spinner_);
}
void
MainWindow::openInviteUsersDialog(std::function<void(const QStringList &invitees)> callback)
{
auto dialog = new dialogs::InviteUsers(this);
connect(dialog, &dialogs::InviteUsers::sendInvites, this, [callback](QStringList invitees) {
if (!invitees.isEmpty())
callback(invitees);
});
showDialog(dialog);
}
void
MainWindow::openJoinRoomDialog(std::function<void(const QString &room_id)> callback)
{

View file

@ -65,7 +65,6 @@ public:
std::function<void(const mtx::requests::CreateRoom &request)> callback);
void openJoinRoomDialog(std::function<void(const QString &room_id)> callback);
void openLogoutDialog();
void openMemberListDialog(const QString &room_id);
void openReadReceiptsDialog(const QString &event_id);
void hideOverlay();

111
src/MemberList.cpp Normal file
View file

@ -0,0 +1,111 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include <QAbstractSlider>
#include <QLabel>
#include <QListWidgetItem>
#include <QPainter>
#include <QPushButton>
#include <QScrollBar>
#include <QShortcut>
#include <QStyleOption>
#include <QVBoxLayout>
#include "MemberList.h"
#include "Cache.h"
#include "ChatPage.h"
#include "Config.h"
#include "Logging.h"
#include "Utils.h"
#include "timeline/TimelineViewManager.h"
#include "ui/Avatar.h"
MemberList::MemberList(const QString &room_id, QObject *parent)
: QAbstractListModel{parent}
, room_id_{room_id}
{
try {
info_ = cache::singleRoomInfo(room_id_.toStdString());
} catch (const lmdb::error &) {
nhlog::db()->warn("failed to retrieve room info from cache: {}",
room_id_.toStdString());
}
try {
auto members = cache::getMembers(room_id_.toStdString());
addUsers(members);
numUsersLoaded_ = members.size();
} catch (const lmdb::error &e) {
nhlog::db()->critical("Failed to retrieve members from cache: {}", e.what());
}
}
void
MemberList::addUsers(const std::vector<RoomMember> &members)
{
beginInsertRows(
QModelIndex{}, m_memberList.count(), m_memberList.count() + members.size() - 1);
for (const auto &member : members)
m_memberList.push_back(
{member,
ChatPage::instance()->timelineManager()->rooms()->currentRoom()->avatarUrl(
member.user_id)});
endInsertRows();
}
QHash<int, QByteArray>
MemberList::roleNames() const
{
return {
{Mxid, "mxid"},
{DisplayName, "displayName"},
{AvatarUrl, "avatarUrl"},
};
}
QVariant
MemberList::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.row() >= (int)m_memberList.size() || index.row() < 0)
return {};
switch (role) {
case Mxid:
return m_memberList[index.row()].first.user_id;
case DisplayName:
return m_memberList[index.row()].first.display_name;
case AvatarUrl:
return m_memberList[index.row()].second;
default:
return {};
}
}
bool
MemberList::canFetchMore(const QModelIndex &) const
{
const size_t numMembers = rowCount();
if (numMembers > 1 && numMembers < info_.member_count)
return true;
else
return false;
}
void
MemberList::fetchMore(const QModelIndex &)
{
loadingMoreMembers_ = true;
emit loadingMoreMembersChanged();
auto members = cache::getMembers(room_id_.toStdString(), rowCount());
addUsers(members);
numUsersLoaded_ += members.size();
emit numUsersLoadedChanged();
loadingMoreMembers_ = false;
emit loadingMoreMembersChanged();
}

66
src/MemberList.h Normal file
View file

@ -0,0 +1,66 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include "CacheStructs.h"
#include <QAbstractListModel>
class MemberList : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(QString roomName READ roomName NOTIFY roomNameChanged)
Q_PROPERTY(int memberCount READ memberCount NOTIFY memberCountChanged)
Q_PROPERTY(QString avatarUrl READ avatarUrl NOTIFY avatarUrlChanged)
Q_PROPERTY(QString roomId READ roomId NOTIFY roomIdChanged)
Q_PROPERTY(int numUsersLoaded READ numUsersLoaded NOTIFY numUsersLoadedChanged)
Q_PROPERTY(bool loadingMoreMembers READ loadingMoreMembers NOTIFY loadingMoreMembersChanged)
public:
enum Roles
{
Mxid,
DisplayName,
AvatarUrl,
};
MemberList(const QString &room_id, QObject *parent = nullptr);
QHash<int, QByteArray> roleNames() const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override
{
Q_UNUSED(parent)
return static_cast<int>(m_memberList.size());
}
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QString roomName() const { return QString::fromStdString(info_.name); }
int memberCount() const { return info_.member_count; }
QString avatarUrl() const { return QString::fromStdString(info_.avatar_url); }
QString roomId() const { return room_id_; }
int numUsersLoaded() const { return numUsersLoaded_; }
bool loadingMoreMembers() const { return loadingMoreMembers_; }
signals:
void roomNameChanged();
void memberCountChanged();
void avatarUrlChanged();
void roomIdChanged();
void numUsersLoadedChanged();
void loadingMoreMembersChanged();
public slots:
void addUsers(const std::vector<RoomMember> &users);
protected:
bool canFetchMore(const QModelIndex &) const override;
void fetchMore(const QModelIndex &) override;
private:
QVector<QPair<RoomMember, QString>> m_memberList;
QString room_id_;
RoomInfo info_;
int numUsersLoaded_{0};
bool loadingMoreMembers_{false};
};

View file

@ -196,7 +196,6 @@ MxcImageProvider::download(const QString &id,
image.setText("original filename",
QString::fromStdString(originalFilename));
image.setText("mxc url", "mxc://" + id);
image.save(fileInfo.absoluteFilePath());
then(id, requestedSize, image, fileInfo.absoluteFilePath());
});
} catch (std::exception &e) {

View file

@ -123,7 +123,17 @@ handle_to_device_messages(const std::vector<mtx::events::collections::DeviceEven
if (msg_type == to_string(mtx::events::EventType::RoomEncrypted)) {
try {
olm::OlmMessage olm_msg = j_msg;
handle_olm_message(std::move(olm_msg));
cache::client()->query_keys(
olm_msg.sender,
[olm_msg](const UserKeyCache &userKeys, mtx::http::RequestErr e) {
if (e) {
nhlog::crypto()->error(
"Failed to query user keys, dropping olm "
"message");
return;
}
handle_olm_message(std::move(olm_msg), userKeys);
});
} catch (const nlohmann::json::exception &e) {
nhlog::crypto()->warn(
"parsing error for olm message: {} {}", e.what(), j_msg.dump(2));
@ -197,13 +207,15 @@ handle_to_device_messages(const std::vector<mtx::events::collections::DeviceEven
}
void
handle_olm_message(const OlmMessage &msg)
handle_olm_message(const OlmMessage &msg, const UserKeyCache &otherUserDeviceKeys)
{
nhlog::crypto()->info("sender : {}", msg.sender);
nhlog::crypto()->info("sender_key: {}", msg.sender_key);
const auto my_key = olm::client()->identity_keys().curve25519;
bool failed_decryption = false;
for (const auto &cipher : msg.ciphertext) {
// We skip messages not meant for the current device.
if (cipher.first != my_key) {
@ -224,6 +236,7 @@ handle_olm_message(const OlmMessage &msg)
msg.sender, msg.sender_key, cipher.second);
} else {
nhlog::crypto()->error("Undecryptable olm message!");
failed_decryption = true;
continue;
}
}
@ -231,6 +244,57 @@ handle_olm_message(const OlmMessage &msg)
if (!payload.is_null()) {
mtx::events::collections::DeviceEvents device_event;
// Other properties are included in order to prevent an attacker from
// publishing someone else's curve25519 keys as their own and subsequently
// claiming to have sent messages which they didn't. sender must correspond
// to the user who sent the event, recipient to the local user, and
// recipient_keys to the local ed25519 key.
std::string receiver_ed25519 = payload["recipient_keys"]["ed25519"];
if (receiver_ed25519.empty() ||
receiver_ed25519 != olm::client()->identity_keys().ed25519) {
nhlog::crypto()->warn(
"Decrypted event doesn't include our ed25519: {}",
payload.dump());
return;
}
std::string receiver = payload["recipient"];
if (receiver.empty() || receiver != http::client()->user_id().to_string()) {
nhlog::crypto()->warn(
"Decrypted event doesn't include our user_id: {}",
payload.dump());
return;
}
// Clients must confirm that the sender_key and the ed25519 field value
// under the keys property match the keys returned by /keys/query for the
// given user, and must also verify the signature of the payload. Without
// this check, a client cannot be sure that the sender device owns the
// private part of the ed25519 key it claims to have in the Olm payload.
// This is crucial when the ed25519 key corresponds to a verified device.
std::string sender_ed25519 = payload["keys"]["ed25519"];
if (sender_ed25519.empty()) {
nhlog::crypto()->warn(
"Decrypted event doesn't include sender ed25519: {}",
payload.dump());
return;
}
bool from_their_device = false;
for (auto [device_id, key] : otherUserDeviceKeys.device_keys) {
if (key.keys.at("curve25519:" + device_id) == msg.sender_key) {
if (key.keys.at("ed25519:" + device_id) == sender_ed25519) {
from_their_device = true;
break;
}
}
}
if (!from_their_device) {
nhlog::crypto()->warn("Decrypted event isn't sent from a device "
"listed by that user! {}",
payload.dump());
return;
}
{
std::string msg_type = payload["type"];
json event_array = json::array();
@ -242,7 +306,7 @@ handle_olm_message(const OlmMessage &msg)
if (temp_events.empty()) {
nhlog::crypto()->warn("Decrypted unknown event: {}",
payload.dump());
continue;
return;
}
device_event = temp_events.at(0);
}
@ -276,17 +340,20 @@ handle_olm_message(const OlmMessage &msg)
ChatPage::instance()->receivedDeviceVerificationDone(e8->content);
} else if (auto roomKey =
std::get_if<DeviceEvent<msg::RoomKey>>(&device_event)) {
create_inbound_megolm_session(*roomKey, msg.sender_key);
create_inbound_megolm_session(
*roomKey, msg.sender_key, sender_ed25519);
} else if (auto forwardedRoomKey =
std::get_if<DeviceEvent<msg::ForwardedRoomKey>>(
&device_event)) {
forwardedRoomKey->content.forwarding_curve25519_key_chain.push_back(
msg.sender_key);
import_inbound_megolm_session(*forwardedRoomKey);
} else if (auto e =
std::get_if<DeviceEvent<msg::SecretSend>>(&device_event)) {
auto local_user = http::client()->user_id();
if (msg.sender != local_user.to_string())
continue;
return;
auto secret_name =
request_id_to_secret_name.find(e->content.request_id);
@ -306,7 +373,7 @@ handle_olm_message(const OlmMessage &msg)
cache::verificationStatus(local_user.to_string());
if (!verificationStatus)
continue;
return;
auto deviceKeys = cache::userKeys(local_user.to_string());
std::string sender_device_id;
@ -344,7 +411,6 @@ handle_olm_message(const OlmMessage &msg)
"for secrect "
"'{}'",
name);
return;
}
});
@ -360,27 +426,28 @@ handle_olm_message(const OlmMessage &msg)
}
return;
} else {
failed_decryption = true;
}
}
try {
auto otherUserDeviceKeys = cache::userKeys(msg.sender);
if (failed_decryption) {
try {
std::map<std::string, std::vector<std::string>> targets;
for (auto [device_id, key] : otherUserDeviceKeys.device_keys) {
if (key.keys.at("curve25519:" + device_id) == msg.sender_key)
targets[msg.sender].push_back(device_id);
}
if (!otherUserDeviceKeys)
return;
std::map<std::string, std::vector<std::string>> targets;
for (auto [device_id, key] : otherUserDeviceKeys->device_keys) {
if (key.keys.at("curve25519:" + device_id) == msg.sender_key)
targets[msg.sender].push_back(device_id);
send_encrypted_to_device_messages(
targets, mtx::events::DeviceEvent<mtx::events::msg::Dummy>{}, true);
nhlog::crypto()->info("Recovering from broken olm channel with {}:{}",
msg.sender,
msg.sender_key);
} catch (std::exception &e) {
nhlog::crypto()->error("Failed to recover from broken olm sessions: {}",
e.what());
}
send_encrypted_to_device_messages(
targets, mtx::events::DeviceEvent<mtx::events::msg::Dummy>{}, true);
nhlog::crypto()->info(
"Recovering from broken olm channel with {}:{}", msg.sender, msg.sender_key);
} catch (std::exception &e) {
nhlog::crypto()->error("Failed to recover from broken olm sessions: {}", e.what());
}
}
@ -450,7 +517,7 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id,
std::map<std::string, std::vector<std::string>> sendSessionTo;
mtx::crypto::OutboundGroupSessionPtr session = nullptr;
OutboundGroupSessionData group_session_data;
GroupSessionData group_session_data;
if (cache::outboundMegolmSessionExists(room_id)) {
auto res = cache::getOutboundMegolmSession(room_id);
@ -519,7 +586,8 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id,
} else {
// compare devices
bool device_removed = false;
for (const auto &dev : session_member_it->second.devices) {
for (const auto &dev :
session_member_it->second.deviceids) {
if (!member_it->second ||
!member_it->second->device_keys.count(
dev.first)) {
@ -541,7 +609,7 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id,
if (member_it->second)
for (const auto &dev :
member_it->second->device_keys)
if (!session_member_it->second.devices
if (!session_member_it->second.deviceids
.count(dev.first) &&
(member_it->first != own_user_id ||
dev.first != device_id))
@ -571,32 +639,28 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id,
const auto session_key = mtx::crypto::session_key(session.get());
// Saving the new megolm session.
OutboundGroupSessionData session_data{};
session_data.session_id = mtx::crypto::session_id(session.get());
session_data.session_key = mtx::crypto::session_key(session.get());
session_data.message_index = 0;
session_data.timestamp = QDateTime::currentMSecsSinceEpoch();
GroupSessionData session_data{};
session_data.message_index = 0;
session_data.timestamp = QDateTime::currentMSecsSinceEpoch();
session_data.sender_claimed_ed25519_key = olm::client()->identity_keys().ed25519;
sendSessionTo.clear();
for (const auto &[user, devices] : members) {
sendSessionTo[user] = {};
session_data.initially.keys[user] = {};
session_data.currently.keys[user] = {};
if (devices) {
for (const auto &[device_id_, key] : devices->device_keys) {
(void)key;
if (device_id != device_id_ || user != own_user_id) {
sendSessionTo[user].push_back(device_id_);
session_data.initially.keys[user]
.devices[device_id_] = 0;
session_data.currently.keys[user]
.deviceids[device_id_] = 0;
}
}
}
}
cache::saveOutboundMegolmSession(room_id, session_data, session);
group_session_data = std::move(session_data);
{
MegolmSessionIndex index;
index.room_id = room_id;
@ -604,8 +668,12 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id,
index.sender_key = olm::client()->identity_keys().curve25519;
auto megolm_session =
olm::client()->init_inbound_group_session(session_key);
cache::saveInboundMegolmSession(index, std::move(megolm_session));
cache::saveInboundMegolmSession(
index, std::move(megolm_session), session_data);
}
cache::saveOutboundMegolmSession(room_id, session_data, session);
group_session_data = std::move(session_data);
}
mtx::events::DeviceEvent<mtx::events::msg::RoomKey> megolm_payload{};
@ -641,8 +709,8 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id,
group_session_data.currently.keys[user] = {};
for (const auto &device_id_ : devices) {
if (!group_session_data.currently.keys[user].devices.count(device_id_))
group_session_data.currently.keys[user].devices[device_id_] =
if (!group_session_data.currently.keys[user].deviceids.count(device_id_))
group_session_data.currently.keys[user].deviceids[device_id_] =
group_session_data.message_index;
}
}
@ -704,7 +772,8 @@ try_olm_decryption(const std::string &sender_key, const mtx::events::msg::OlmCip
void
create_inbound_megolm_session(const mtx::events::DeviceEvent<mtx::events::msg::RoomKey> &roomKey,
const std::string &sender_key)
const std::string &sender_key,
const std::string &sender_ed25519)
{
MegolmSessionIndex index;
index.room_id = roomKey.content.room_id;
@ -712,9 +781,13 @@ create_inbound_megolm_session(const mtx::events::DeviceEvent<mtx::events::msg::R
index.sender_key = sender_key;
try {
GroupSessionData data{};
data.forwarding_curve25519_key_chain = {sender_key};
data.sender_claimed_ed25519_key = sender_ed25519;
auto megolm_session =
olm::client()->init_inbound_group_session(roomKey.content.session_key);
cache::saveInboundMegolmSession(index, std::move(megolm_session));
cache::saveInboundMegolmSession(index, std::move(megolm_session), data);
} catch (const lmdb::error &e) {
nhlog::crypto()->critical("failed to save inbound megolm session: {}", e.what());
return;
@ -741,7 +814,13 @@ import_inbound_megolm_session(
try {
auto megolm_session =
olm::client()->import_inbound_group_session(roomKey.content.session_key);
cache::saveInboundMegolmSession(index, std::move(megolm_session));
GroupSessionData data{};
data.forwarding_curve25519_key_chain =
roomKey.content.forwarding_curve25519_key_chain;
data.sender_claimed_ed25519_key = roomKey.content.sender_claimed_ed25519_key;
cache::saveInboundMegolmSession(index, std::move(megolm_session), data);
} catch (const lmdb::error &e) {
nhlog::crypto()->critical("failed to save inbound megolm session: {}", e.what());
return;
@ -817,21 +896,16 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR
return;
}
// Check if we were the sender of the session being requested.
if (req.content.sender_key != olm::client()->identity_keys().curve25519) {
nhlog::crypto()->debug("ignoring key request {} because we were not the sender: "
"\nrequested({}) ours({})",
req.content.request_id,
req.content.sender_key,
olm::client()->identity_keys().curve25519);
return;
}
// Check if we have the keys for the requested session.
auto outboundSession = cache::getOutboundMegolmSession(req.content.room_id);
if (!outboundSession.session) {
nhlog::crypto()->warn("requested session not found in room: {}",
req.content.room_id);
// Check if we were the sender of the session being requested (unless it is actually us
// requesting the session).
if (req.sender != http::client()->user_id().to_string() &&
req.content.sender_key != olm::client()->identity_keys().curve25519) {
nhlog::crypto()->debug(
"ignoring key request {} because we did not create the requested session: "
"\nrequested({}) ours({})",
req.content.request_id,
req.content.sender_key,
olm::client()->identity_keys().curve25519);
return;
}
@ -839,7 +913,15 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR
MegolmSessionIndex index{};
index.room_id = req.content.room_id;
index.session_id = req.content.session_id;
index.sender_key = olm::client()->identity_keys().curve25519;
index.sender_key = req.content.sender_key;
// Check if we have the keys for the requested session.
auto sessionData = cache::getMegolmSessionData(index);
if (!sessionData) {
nhlog::crypto()->warn("requested session not found in room: {}",
req.content.room_id);
return;
}
const auto session = cache::getInboundMegolmSession(index);
if (!session) {
@ -873,12 +955,12 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR
bool shouldSeeKeys = false;
uint64_t minimumIndex = -1;
if (outboundSession.data.currently.keys.count(req.sender)) {
if (outboundSession.data.currently.keys.at(req.sender)
.devices.count(req.content.requesting_device_id)) {
if (sessionData->currently.keys.count(req.sender)) {
if (sessionData->currently.keys.at(req.sender)
.deviceids.count(req.content.requesting_device_id)) {
shouldSeeKeys = true;
minimumIndex = outboundSession.data.currently.keys.at(req.sender)
.devices.at(req.content.requesting_device_id);
minimumIndex = sessionData->currently.keys.at(req.sender)
.deviceids.at(req.content.requesting_device_id);
}
}
@ -906,8 +988,9 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR
forward_key.sender_key = index.sender_key;
// TODO(Nico): Figure out if this is correct
forward_key.sender_claimed_ed25519_key = olm::client()->identity_keys().ed25519;
forward_key.forwarding_curve25519_key_chain = {};
forward_key.sender_claimed_ed25519_key = sessionData->sender_claimed_ed25519_key;
forward_key.forwarding_curve25519_key_chain =
sessionData->forwarding_curve25519_key_chain;
send_megolm_key_to_device(
req.sender, req.content.requesting_device_id, forward_key);
@ -928,6 +1011,7 @@ send_megolm_key_to_device(const std::string &user_id,
std::map<std::string, std::vector<std::string>> targets;
targets[user_id] = {device_id};
send_encrypted_to_device_messages(targets, room_key);
nhlog::crypto()->debug("Forwarded key to {}:{}", user_id, device_id);
}
DecryptionResult

View file

@ -59,12 +59,13 @@ try_olm_decryption(const std::string &sender_key,
const mtx::events::msg::OlmCipherContent &content);
void
handle_olm_message(const OlmMessage &msg);
handle_olm_message(const OlmMessage &msg, const UserKeyCache &otherUserDeviceKeys);
//! Establish a new inbound megolm session with the decrypted payload from olm.
void
create_inbound_megolm_session(const mtx::events::DeviceEvent<mtx::events::msg::RoomKey> &roomKey,
const std::string &sender_key);
const std::string &sender_key,
const std::string &sender_ed25519);
void
import_inbound_megolm_session(
const mtx::events::DeviceEvent<mtx::events::msg::ForwardedRoomKey> &roomKey);

View file

@ -0,0 +1,100 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "SingleImagePackModel.h"
#include "Cache_p.h"
#include "MatrixClient.h"
SingleImagePackModel::SingleImagePackModel(ImagePackInfo pack_, QObject *parent)
: QAbstractListModel(parent)
, roomid_(std::move(pack_.source_room))
, statekey_(std::move(pack_.state_key))
, pack(std::move(pack_.pack))
{
if (!pack.pack)
pack.pack = mtx::events::msc2545::ImagePack::PackDescription{};
for (const auto &e : pack.images)
shortcodes.push_back(e.first);
}
int
SingleImagePackModel::rowCount(const QModelIndex &) const
{
return (int)shortcodes.size();
}
QHash<int, QByteArray>
SingleImagePackModel::roleNames() const
{
return {
{Roles::Url, "url"},
{Roles::ShortCode, "shortCode"},
{Roles::Body, "body"},
{Roles::IsEmote, "isEmote"},
{Roles::IsSticker, "isSticker"},
};
}
QVariant
SingleImagePackModel::data(const QModelIndex &index, int role) const
{
if (hasIndex(index.row(), index.column(), index.parent())) {
const auto &img = pack.images.at(shortcodes.at(index.row()));
switch (role) {
case Url:
return QString::fromStdString(img.url);
case ShortCode:
return QString::fromStdString(shortcodes.at(index.row()));
case Body:
return QString::fromStdString(img.body);
case IsEmote:
return img.overrides_usage() ? img.is_emoji() : pack.pack->is_emoji();
case IsSticker:
return img.overrides_usage() ? img.is_sticker() : pack.pack->is_sticker();
default:
return {};
}
}
return {};
}
bool
SingleImagePackModel::isGloballyEnabled() const
{
if (auto roomPacks =
cache::client()->getAccountData(mtx::events::EventType::ImagePackRooms)) {
if (auto tmp = std::get_if<
mtx::events::EphemeralEvent<mtx::events::msc2545::ImagePackRooms>>(
&*roomPacks)) {
if (tmp->content.rooms.count(roomid_) &&
tmp->content.rooms.at(roomid_).count(statekey_))
return true;
}
}
return false;
}
void
SingleImagePackModel::setGloballyEnabled(bool enabled)
{
mtx::events::msc2545::ImagePackRooms content{};
if (auto roomPacks =
cache::client()->getAccountData(mtx::events::EventType::ImagePackRooms)) {
if (auto tmp = std::get_if<
mtx::events::EphemeralEvent<mtx::events::msc2545::ImagePackRooms>>(
&*roomPacks)) {
content = tmp->content;
}
}
if (enabled)
content.rooms[roomid_][statekey_] = {};
else
content.rooms[roomid_].erase(statekey_);
http::client()->put_account_data(content, [](mtx::http::RequestErr) {
// emit this->globallyEnabledChanged();
});
}

View file

@ -0,0 +1,61 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QAbstractListModel>
#include <mtx/events/mscs/image_packs.hpp>
#include "CacheStructs.h"
class SingleImagePackModel : public QAbstractListModel
{
Q_OBJECT
Q_PROPERTY(QString roomid READ roomid CONSTANT)
Q_PROPERTY(QString statekey READ statekey CONSTANT)
Q_PROPERTY(QString attribution READ statekey CONSTANT)
Q_PROPERTY(QString packname READ packname CONSTANT)
Q_PROPERTY(QString avatarUrl READ avatarUrl CONSTANT)
Q_PROPERTY(bool isStickerPack READ isStickerPack CONSTANT)
Q_PROPERTY(bool isEmotePack READ isEmotePack CONSTANT)
Q_PROPERTY(bool isGloballyEnabled READ isGloballyEnabled WRITE setGloballyEnabled NOTIFY
globallyEnabledChanged)
public:
enum Roles
{
Url = Qt::UserRole,
ShortCode,
Body,
IsEmote,
IsSticker,
};
SingleImagePackModel(ImagePackInfo pack_, QObject *parent = nullptr);
QHash<int, QByteArray> roleNames() const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role) const override;
QString roomid() const { return QString::fromStdString(roomid_); }
QString statekey() const { return QString::fromStdString(statekey_); }
QString packname() const { return QString::fromStdString(pack.pack->display_name); }
QString attribution() const { return QString::fromStdString(pack.pack->attribution); }
QString avatarUrl() const { return QString::fromStdString(pack.pack->avatar_url); }
bool isStickerPack() const { return pack.pack->is_sticker(); }
bool isEmotePack() const { return pack.pack->is_emoji(); }
bool isGloballyEnabled() const;
void setGloballyEnabled(bool enabled);
signals:
void globallyEnabledChanged();
private:
std::string roomid_;
std::string statekey_;
mtx::events::msc2545::ImagePack pack;
std::vector<std::string> shortcodes;
};

View file

@ -91,7 +91,7 @@ UserSettings::load(std::optional<QString> profile)
privacyScreen_ = settings.value("user/privacy_screen", false).toBool();
privacyScreenTimeout_ = settings.value("user/privacy_screen_timeout", 0).toInt();
shareKeysWithTrustedUsers_ =
settings.value("user/share_keys_with_trusted_users", true).toBool();
settings.value("user/automatically_share_keys_with_trusted_users", false).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();
@ -610,7 +610,8 @@ UserSettings::save()
settings.setValue("decrypt_sidebar", decryptSidebar_);
settings.setValue("privacy_screen", privacyScreen_);
settings.setValue("privacy_screen_timeout", privacyScreenTimeout_);
settings.setValue("share_keys_with_trusted_users", shareKeysWithTrustedUsers_);
settings.setValue("automatically_share_keys_with_trusted_users",
shareKeysWithTrustedUsers_);
settings.setValue("mobile_mode", mobileMode_);
settings.setValue("font_size", baseFontSize_);
settings.setValue("typing_notifications", typingNotifications_);
@ -1398,7 +1399,7 @@ UserSettingsPage::exportSessionKeys()
QString suffix("-----END MEGOLM SESSION DATA-----");
QString newline("\n");
QTextStream out(&file);
out << prefix << newline << b64 << newline << suffix;
out << prefix << newline << b64 << newline << suffix << newline;
file.close();
} catch (const std::exception &e) {
QMessageBox::warning(this, tr("Error"), e.what());

View file

@ -540,7 +540,7 @@ utils::markdownToHtml(const QString &text, bool rainbowify)
// Use colors as described here:
// https://shark.comfsm.fm/~dleeling/cis/hsl_rainbow.html
auto color =
QColor::fromHslF((charIdx - 1.0) / textLen * (5. / 6.), 1.0, 0.5);
QColor::fromHslF((charIdx - 1.0) / textLen * (5. / 6.), 0.9, 0.5);
// format color for HTML
auto colorString = color.name(QColor::NameFormat::HexRgb);
// create HTML element for current char

View file

@ -1,158 +0,0 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include <QDebug>
#include <QIcon>
#include <QLabel>
#include <QListWidget>
#include <QListWidgetItem>
#include <QPushButton>
#include <QStyleOption>
#include <QTimer>
#include <QVBoxLayout>
#include "dialogs/InviteUsers.h"
#include "Config.h"
#include "InviteeItem.h"
#include "ui/TextField.h"
#include <mtx/identifiers.hpp>
using namespace dialogs;
InviteUsers::InviteUsers(QWidget *parent)
: QFrame(parent)
{
setAutoFillBackground(true);
setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint);
setWindowModality(Qt::WindowModal);
setAttribute(Qt::WA_DeleteOnClose, true);
setMinimumWidth(conf::window::minModalWidth);
setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
auto layout = new QVBoxLayout(this);
layout->setSpacing(conf::modals::WIDGET_SPACING);
layout->setMargin(conf::modals::WIDGET_MARGIN);
auto buttonLayout = new QHBoxLayout();
buttonLayout->setSpacing(0);
buttonLayout->setMargin(0);
confirmBtn_ = new QPushButton("Invite", this);
confirmBtn_->setDefault(true);
cancelBtn_ = new QPushButton(tr("Cancel"), this);
buttonLayout->addStretch(1);
buttonLayout->setSpacing(15);
buttonLayout->addWidget(cancelBtn_);
buttonLayout->addWidget(confirmBtn_);
inviteeInput_ = new TextField(this);
inviteeInput_->setLabel(tr("User ID to invite"));
inviteeList_ = new QListWidget;
inviteeList_->setFrameStyle(QFrame::NoFrame);
inviteeList_->setSelectionMode(QAbstractItemView::NoSelection);
inviteeList_->setAttribute(Qt::WA_MacShowFocusRect, 0);
inviteeList_->setSpacing(5);
errorLabel_ = new QLabel(this);
errorLabel_->setAlignment(Qt::AlignCenter);
layout->addWidget(inviteeInput_);
layout->addWidget(errorLabel_);
layout->addWidget(inviteeList_);
layout->addLayout(buttonLayout);
connect(inviteeInput_, &TextField::returnPressed, this, &InviteUsers::addUser);
connect(confirmBtn_, &QPushButton::clicked, [this]() {
if (!inviteeInput_->text().trimmed().isEmpty()) {
addUser();
}
emit sendInvites(invitedUsers());
inviteeInput_->clear();
inviteeList_->clear();
errorLabel_->hide();
emit close();
});
connect(cancelBtn_, &QPushButton::clicked, [this]() {
inviteeInput_->clear();
inviteeList_->clear();
errorLabel_->hide();
emit close();
});
}
void
InviteUsers::addUser()
{
auto user_id = inviteeInput_->text();
try {
namespace ids = mtx::identifiers;
auto user = ids::parse<ids::User>(user_id.toStdString());
auto item = new QListWidgetItem(inviteeList_);
auto invitee = new InviteeItem(user, this);
item->setSizeHint(invitee->minimumSizeHint());
item->setFlags(Qt::NoItemFlags);
item->setTextAlignment(Qt::AlignCenter);
inviteeList_->setItemWidget(item, invitee);
connect(invitee, &InviteeItem::removeItem, this, [this, item]() {
emit removeInvitee(item);
});
errorLabel_->hide();
inviteeInput_->clear();
} catch (std::exception &e) {
errorLabel_->setText(e.what());
errorLabel_->show();
}
}
void
InviteUsers::removeInvitee(QListWidgetItem *item)
{
int row = inviteeList_->row(item);
auto widget = inviteeList_->takeItem(row);
inviteeList_->removeItemWidget(widget);
}
QStringList
InviteUsers::invitedUsers() const
{
QStringList users;
for (int ii = 0; ii < inviteeList_->count(); ++ii) {
auto item = inviteeList_->item(ii);
auto widget = inviteeList_->itemWidget(item);
auto invitee = qobject_cast<InviteeItem *>(widget);
if (invitee)
users << invitee->userID();
else
qDebug() << "Cast InviteeItem failed";
}
return users;
}
void
InviteUsers::showEvent(QShowEvent *event)
{
inviteeInput_->setFocus();
QFrame::showEvent(event);
}

View file

@ -1,45 +0,0 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QFrame>
#include <QStringList>
class QPushButton;
class QLabel;
class TextField;
class QListWidget;
class QListWidgetItem;
namespace dialogs {
class InviteUsers : public QFrame
{
Q_OBJECT
public:
explicit InviteUsers(QWidget *parent = nullptr);
protected:
void showEvent(QShowEvent *event) override;
signals:
void sendInvites(QStringList invitees);
private slots:
void removeInvitee(QListWidgetItem *item);
private:
void addUser();
QStringList invitedUsers() const;
QPushButton *confirmBtn_;
QPushButton *cancelBtn_;
TextField *inviteeInput_;
QLabel *errorLabel_;
QListWidget *inviteeList_;
};
} // dialogs

View file

@ -1,146 +0,0 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include <QAbstractSlider>
#include <QLabel>
#include <QListWidgetItem>
#include <QPainter>
#include <QPushButton>
#include <QScrollBar>
#include <QShortcut>
#include <QStyleOption>
#include <QVBoxLayout>
#include "dialogs/MemberList.h"
#include "Cache.h"
#include "ChatPage.h"
#include "Config.h"
#include "Logging.h"
#include "Utils.h"
#include "ui/Avatar.h"
using namespace dialogs;
MemberItem::MemberItem(const RoomMember &member, QWidget *parent)
: QWidget(parent)
{
topLayout_ = new QHBoxLayout(this);
topLayout_->setMargin(0);
textLayout_ = new QVBoxLayout;
textLayout_->setMargin(0);
textLayout_->setSpacing(0);
avatar_ = new Avatar(this, 44);
avatar_->setLetter(utils::firstChar(member.display_name));
avatar_->setImage(ChatPage::instance()->currentRoom(), member.user_id);
QFont nameFont;
nameFont.setPointSizeF(nameFont.pointSizeF() * 1.1);
userId_ = new QLabel(member.user_id, this);
userName_ = new QLabel(member.display_name, this);
userName_->setFont(nameFont);
textLayout_->addWidget(userName_);
textLayout_->addWidget(userId_);
topLayout_->addWidget(avatar_);
topLayout_->addLayout(textLayout_, 1);
}
void
MemberItem::paintEvent(QPaintEvent *)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
MemberList::MemberList(const QString &room_id, QWidget *parent)
: QFrame(parent)
, room_id_{room_id}
{
setAutoFillBackground(true);
setWindowFlags(Qt::Tool | Qt::WindowStaysOnTopHint);
setWindowModality(Qt::WindowModal);
setAttribute(Qt::WA_DeleteOnClose, true);
auto layout = new QVBoxLayout(this);
layout->setSpacing(conf::modals::WIDGET_SPACING);
layout->setMargin(conf::modals::WIDGET_MARGIN);
list_ = new QListWidget;
list_->setFrameStyle(QFrame::NoFrame);
list_->setSelectionMode(QAbstractItemView::NoSelection);
list_->setSpacing(5);
QFont largeFont;
largeFont.setPointSizeF(largeFont.pointSizeF() * 1.5);
setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
setMinimumHeight(list_->sizeHint().height() * 2);
setMinimumWidth(std::max(list_->sizeHint().width() + 4 * conf::modals::WIDGET_MARGIN,
QFontMetrics(largeFont).averageCharWidth() * 30 -
2 * conf::modals::WIDGET_MARGIN));
QFont font;
font.setPointSizeF(font.pointSizeF() * conf::modals::LABEL_MEDIUM_SIZE_RATIO);
topLabel_ = new QLabel(tr("Room members"), this);
topLabel_->setAlignment(Qt::AlignCenter);
topLabel_->setFont(font);
auto okBtn = new QPushButton(tr("OK"), this);
auto buttonLayout = new QHBoxLayout();
buttonLayout->setSpacing(15);
buttonLayout->addStretch(1);
buttonLayout->addWidget(okBtn);
layout->addWidget(topLabel_);
layout->addWidget(list_);
layout->addLayout(buttonLayout);
list_->clear();
connect(list_->verticalScrollBar(), &QAbstractSlider::valueChanged, this, [this](int pos) {
if (pos != list_->verticalScrollBar()->maximum())
return;
const size_t numMembers = list_->count() - 1;
if (numMembers > 0)
addUsers(cache::getMembers(room_id_.toStdString(), numMembers));
});
try {
addUsers(cache::getMembers(room_id_.toStdString()));
} catch (const lmdb::error &e) {
nhlog::db()->critical("Failed to retrieve members from cache: {}", e.what());
}
auto closeShortcut = new QShortcut(QKeySequence(QKeySequence::Cancel), this);
connect(closeShortcut, &QShortcut::activated, this, &MemberList::close);
connect(okBtn, &QPushButton::clicked, this, &MemberList::close);
}
void
MemberList::addUsers(const std::vector<RoomMember> &members)
{
for (const auto &member : members) {
auto user = new MemberItem(member, this);
auto item = new QListWidgetItem;
item->setSizeHint(user->minimumSizeHint());
item->setFlags(Qt::NoItemFlags);
item->setTextAlignment(Qt::AlignCenter);
list_->insertItem(list_->count() - 1, item);
list_->setItemWidget(item, user);
}
}

View file

@ -1,57 +0,0 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QFrame>
#include <QListWidget>
class Avatar;
class QPushButton;
class QHBoxLayout;
class QLabel;
class QVBoxLayout;
struct RoomMember;
template<class T>
class QSharedPointer;
namespace dialogs {
class MemberItem : public QWidget
{
Q_OBJECT
public:
MemberItem(const RoomMember &member, QWidget *parent);
protected:
void paintEvent(QPaintEvent *) override;
private:
QHBoxLayout *topLayout_;
QVBoxLayout *textLayout_;
Avatar *avatar_;
QLabel *userName_;
QLabel *userId_;
};
class MemberList : public QFrame
{
Q_OBJECT
public:
MemberList(const QString &room_id, QWidget *parent = nullptr);
public slots:
void addUsers(const std::vector<RoomMember> &users);
private:
QString room_id_;
QLabel *topLabel_;
QListWidget *list_;
};
} // dialogs

View file

@ -19,6 +19,7 @@
#include "Cache.h"
#include "ChatPage.h"
#include "CombinedImagePackModel.h"
#include "CompletionProxyModel.h"
#include "Config.h"
#include "Logging.h"
@ -501,6 +502,31 @@ InputBar::video(const QString &filename,
room->sendMessageEvent(video, mtx::events::EventType::RoomMessage);
}
void
InputBar::sticker(CombinedImagePackModel *model, int row)
{
if (!model || row < 0)
return;
auto img = model->imageAt(row);
mtx::events::msg::StickerImage sticker{};
sticker.info = img.info.value_or(mtx::common::ImageInfo{});
sticker.url = img.url;
sticker.body = img.body;
if (!room->reply().isEmpty()) {
sticker.relations.relations.push_back(
{mtx::common::RelationType::InReplyTo, room->reply().toStdString()});
}
if (!room->edit().isEmpty()) {
sticker.relations.relations.push_back(
{mtx::common::RelationType::Replace, room->edit().toStdString()});
}
room->sendMessageEvent(sticker, mtx::events::EventType::Sticker);
}
void
InputBar::command(QString command, QString args)
{

View file

@ -12,6 +12,7 @@
#include <mtx/responses/messages.hpp>
class TimelineModel;
class CombinedImagePackModel;
class QMimeData;
class QDropEvent;
class QStringList;
@ -57,6 +58,7 @@ public slots:
MarkdownOverride useMarkdown = MarkdownOverride::NOT_SPECIFIED,
bool rainbowify = false);
void reaction(const QString &reactedEvent, const QString &reactionKey);
void sticker(CombinedImagePackModel *model, int row);
private slots:
void startTyping();

View file

@ -8,9 +8,9 @@
#include "MatrixClient.h"
#include "TimelineModel.h"
Permissions::Permissions(TimelineModel *parent)
Permissions::Permissions(QString roomId, QObject *parent)
: QObject(parent)
, room(parent)
, roomId_(roomId)
{
invalidate();
}
@ -19,7 +19,7 @@ void
Permissions::invalidate()
{
pl = cache::client()
->getStateEvent<mtx::events::state::PowerLevels>(room->roomId().toStdString())
->getStateEvent<mtx::events::state::PowerLevels>(roomId_.toStdString())
.value_or(mtx::events::StateEvent<mtx::events::state::PowerLevels>{})
.content;
}

View file

@ -15,7 +15,7 @@ class Permissions : public QObject
Q_OBJECT
public:
Permissions(TimelineModel *parent);
Permissions(QString roomId, QObject *parent = nullptr);
Q_INVOKABLE bool canInvite();
Q_INVOKABLE bool canBan();
@ -28,6 +28,6 @@ public:
void invalidate();
private:
TimelineModel *room;
QString roomId_;
mtx::events::state::PowerLevels pl;
};

View file

@ -25,6 +25,7 @@
#include "Logging.h"
#include "MainWindow.h"
#include "MatrixClient.h"
#include "MemberList.h"
#include "MxcImageProvider.h"
#include "Olm.h"
#include "TimelineViewManager.h"
@ -317,6 +318,7 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj
, events(room_id.toStdString(), this)
, room_id_(room_id)
, manager_(manager)
, permissions_{room_id}
{
lastMessage_.timestamp = 0;
@ -325,6 +327,10 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj
this->isSpace_ = create->content.type == mtx::events::state::room_type::space;
this->isEncrypted_ = cache::isRoomEncrypted(room_id_.toStdString());
// this connection will simplify adding the plainRoomNameChanged() signal everywhere that it
// needs to be
connect(this, &TimelineModel::roomNameChanged, this, &TimelineModel::plainRoomNameChanged);
connect(
this,
&TimelineModel::redactionFailed,
@ -344,6 +350,7 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj
&EventStore::dataChanged,
this,
[this](int from, int to) {
relatedEventCacheBuster++;
nhlog::ui()->debug(
"data changed {} to {}", events.size() - to - 1, events.size() - from - 1);
emit dataChanged(index(events.size() - to - 1, 0),
@ -443,6 +450,7 @@ TimelineModel::roleNames() const
{RoomTopic, "roomTopic"},
{CallType, "callType"},
{Dump, "dump"},
{RelatedEventCacheBuster, "relatedEventCacheBuster"},
};
}
int
@ -676,6 +684,8 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r
return QVariant(m);
}
case RelatedEventCacheBuster:
return relatedEventCacheBuster;
default:
return QVariant();
}
@ -710,6 +720,14 @@ TimelineModel::data(const QModelIndex &index, int role) const
return data(*event, role);
}
QVariant
TimelineModel::dataById(QString id, int role, QString relatedTo)
{
if (auto event = events.get(id.toStdString(), relatedTo.toStdString()))
return data(*event, role);
return QVariant();
}
bool
TimelineModel::canFetchMore(const QModelIndex &) const
{
@ -1048,14 +1066,6 @@ TimelineModel::openUserProfile(QString userid)
emit manager_->openProfile(userProfile);
}
void
TimelineModel::openRoomSettings()
{
RoomSettings *settings = new RoomSettings(roomId(), this);
connect(this, &TimelineModel::roomAvatarUrlChanged, settings, &RoomSettings::avatarChanged);
openRoomSettingsDialog(settings);
}
void
TimelineModel::replyAction(QString id)
{
@ -1292,6 +1302,14 @@ struct SendMessageVisitor
sendRoomEvent<mtx::events::msg::KeyVerificationCancel,
mtx::events::EventType::KeyVerificationCancel>(msg);
}
void operator()(mtx::events::Sticker msg)
{
msg.type = mtx::events::EventType::Sticker;
if (cache::isRoomEncrypted(model_->room_id_.toStdString())) {
model_->sendEncryptedMessage(msg, mtx::events::EventType::Sticker);
} else
emit model_->addPendingMessageToStore(msg);
}
TimelineModel *model_;
};
@ -1301,6 +1319,7 @@ TimelineModel::addPendingMessage(mtx::events::collections::TimelineEvents event)
{
std::visit(
[](auto &msg) {
// gets overwritten for reactions and stickers in SendMessageVisitor
msg.type = mtx::events::EventType::RoomMessage;
msg.event_id = "m" + http::client()->generate_txn_id();
msg.sender = http::client()->user_id().to_string();

View file

@ -17,6 +17,8 @@
#include "CacheStructs.h"
#include "EventStore.h"
#include "InputBar.h"
#include "InviteesModel.h"
#include "MemberList.h"
#include "Permissions.h"
#include "ui/RoomSettings.h"
#include "ui/UserProfile.h"
@ -158,7 +160,9 @@ class TimelineModel : public QAbstractListModel
Q_PROPERTY(QString edit READ edit WRITE setEdit NOTIFY editChanged RESET resetEdit)
Q_PROPERTY(
bool paginationInProgress READ paginationInProgress NOTIFY paginationInProgressChanged)
Q_PROPERTY(QString roomId READ roomId CONSTANT)
Q_PROPERTY(QString roomName READ roomName NOTIFY roomNameChanged)
Q_PROPERTY(QString plainRoomName READ plainRoomName NOTIFY plainRoomNameChanged)
Q_PROPERTY(QString roomAvatarUrl READ roomAvatarUrl NOTIFY roomAvatarUrlChanged)
Q_PROPERTY(QString roomTopic READ roomTopic NOTIFY roomTopicChanged)
Q_PROPERTY(int roomMemberCount READ roomMemberCount NOTIFY roomMemberCountChanged)
@ -208,6 +212,7 @@ public:
RoomTopic,
CallType,
Dump,
RelatedEventCacheBuster,
};
Q_ENUM(Roles);
@ -215,10 +220,7 @@ public:
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QVariant data(const mtx::events::collections::TimelineEvents &event, int role) const;
Q_INVOKABLE QVariant dataById(QString id, int role)
{
return data(index(idToIndex(id)), role);
}
Q_INVOKABLE QVariant dataById(QString id, int role, QString relatedTo);
bool canFetchMore(const QModelIndex &) const override;
void fetchMore(const QModelIndex &) override;
@ -237,7 +239,6 @@ public:
Q_INVOKABLE void forwardMessage(QString eventId, QString roomId);
Q_INVOKABLE void viewDecryptedRawMessage(QString id) const;
Q_INVOKABLE void openUserProfile(QString userid);
Q_INVOKABLE void openRoomSettings();
Q_INVOKABLE void editAction(QString id);
Q_INVOKABLE void replyAction(QString id);
Q_INVOKABLE void readReceiptsAction(QString id) const;
@ -354,14 +355,13 @@ signals:
void lastMessageChanged();
void notificationsChanged();
void openRoomSettingsDialog(RoomSettings *settings);
void newMessageToSend(mtx::events::collections::TimelineEvents event);
void addPendingMessageToStore(mtx::events::collections::TimelineEvents event);
void updateFlowEventId(std::string event_id);
void encryptionChanged();
void roomNameChanged();
void plainRoomNameChanged();
void roomTopicChanged();
void roomAvatarUrlChanged();
void roomMemberCountChanged();
@ -391,7 +391,7 @@ private:
TimelineViewManager *manager_;
InputBar input_{this};
Permissions permissions_{this};
Permissions permissions_;
QTimer showEventTimer{this};
QString eventIdToShow;
@ -403,6 +403,8 @@ private:
int notification_count = 0, highlight_count = 0;
unsigned int relatedEventCacheBuster = 0;
bool decryptDescription = true;
bool m_paginationInProgress = false;
bool isSpace_ = false;
@ -413,10 +415,17 @@ template<class T>
void
TimelineModel::sendMessageEvent(const T &content, mtx::events::EventType eventType)
{
mtx::events::RoomEvent<T> msgCopy = {};
msgCopy.content = content;
msgCopy.type = eventType;
emit newMessageToSend(msgCopy);
if constexpr (std::is_same_v<T, mtx::events::msg::StickerImage>) {
mtx::events::Sticker msgCopy = {};
msgCopy.content = content;
msgCopy.type = eventType;
emit newMessageToSend(msgCopy);
} else {
mtx::events::RoomEvent<T> msgCopy = {};
msgCopy.content = content;
msgCopy.type = eventType;
emit newMessageToSend(msgCopy);
}
resetReply();
resetEdit();
}

View file

@ -15,15 +15,19 @@
#include "ChatPage.h"
#include "Clipboard.h"
#include "ColorImageProvider.h"
#include "CombinedImagePackModel.h"
#include "CompletionProxyModel.h"
#include "DelegateChooser.h"
#include "DeviceVerificationFlow.h"
#include "EventAccessors.h"
#include "ImagePackListModel.h"
#include "InviteesModel.h"
#include "Logging.h"
#include "MainWindow.h"
#include "MatrixClient.h"
#include "MxcImageProvider.h"
#include "RoomsModel.h"
#include "SingleImagePackModel.h"
#include "UserSettingsPage.h"
#include "UsersModel.h"
#include "dialogs/ImageOverlay.h"
@ -144,6 +148,7 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par
qRegisterMetaType<mtx::events::msg::KeyVerificationReady>();
qRegisterMetaType<mtx::events::msg::KeyVerificationRequest>();
qRegisterMetaType<mtx::events::msg::KeyVerificationStart>();
qRegisterMetaType<CombinedImagePackModel *>();
qmlRegisterUncreatableMetaObject(qml_mtx_events::staticMetaObject,
"im.nheko",
@ -172,6 +177,8 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par
0,
"UserProfileModel",
"UserProfile needs to be instantiated on the C++ side");
qmlRegisterUncreatableType<MemberList>(
"im.nheko", 1, 0, "MemberList", "MemberList needs to be instantiated on the C++ side");
qmlRegisterUncreatableType<RoomSettings>(
"im.nheko",
1,
@ -180,6 +187,24 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par
"Room Settings needs to be instantiated on the C++ side");
qmlRegisterUncreatableType<TimelineModel>(
"im.nheko", 1, 0, "Room", "Room needs to be instantiated on the C++ side");
qmlRegisterUncreatableType<ImagePackListModel>(
"im.nheko",
1,
0,
"ImagePackListModel",
"ImagePackListModel needs to be instantiated on the C++ side");
qmlRegisterUncreatableType<SingleImagePackModel>(
"im.nheko",
1,
0,
"SingleImagePackModel",
"SingleImagePackModel needs to be instantiated on the C++ side");
qmlRegisterUncreatableType<InviteesModel>(
"im.nheko",
1,
0,
"InviteesModel",
"InviteesModel needs to be instantiated on the C++ side");
static auto self = this;
qmlRegisterSingletonType<MainWindow>(
@ -340,6 +365,41 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par
&TimelineViewManager::openImageOverlayInternal);
}
void
TimelineViewManager::openRoomMembers(QString room_id)
{
MemberList *memberList = new MemberList(room_id, this);
emit openRoomMembersDialog(memberList);
}
void
TimelineViewManager::openRoomSettings(QString room_id)
{
RoomSettings *settings = new RoomSettings(room_id, this);
connect(rooms_->getRoomById(room_id).data(),
&TimelineModel::roomAvatarUrlChanged,
settings,
&RoomSettings::avatarChanged);
emit openRoomSettingsDialog(settings);
}
void
TimelineViewManager::openInviteUsers(QString roomId)
{
InviteesModel *model = new InviteesModel{this};
connect(model, &InviteesModel::accept, this, [this, model, roomId]() {
emit inviteUsers(roomId, model->mxids());
});
emit openInviteUsersDialog(model);
}
void
TimelineViewManager::openGlobalUserProfile(QString userId)
{
UserProfile *profile = new UserProfile{QString{}, userId, this};
emit openProfile(profile);
}
void
TimelineViewManager::setVideoCallItem()
{
@ -397,6 +457,12 @@ TimelineViewManager::openImageOverlay(QString mxcUrl, QString eventId)
});
}
void
TimelineViewManager::openImagePackSettings(QString roomid)
{
emit showImagePackSettings(new ImagePackListModel(roomid.toStdString(), this));
}
void
TimelineViewManager::openImageOverlayInternal(QString eventId, QImage img)
{
@ -419,17 +485,6 @@ TimelineViewManager::openImageOverlayInternal(QString eventId, QImage img)
});
}
void
TimelineViewManager::openInviteUsersDialog()
{
MainWindow::instance()->openInviteUsersDialog(
[this](const QStringList &invitees) { emit inviteUsers(invitees); });
}
void
TimelineViewManager::openMemberListDialog(QString roomid) const
{
MainWindow::instance()->openMemberListDialog(roomid);
}
void
TimelineViewManager::openLeaveRoomDialog(QString roomid) const
{
@ -593,6 +648,11 @@ TimelineViewManager::completerFor(QString completerName, QString roomId)
auto proxy = new CompletionProxyModel(roomModel);
roomModel->setParent(proxy);
return proxy;
} else if (completerName == "stickers") {
auto stickerModel = new CombinedImagePackModel(roomId.toStdString(), true);
auto proxy = new CompletionProxyModel(stickerModel, 1, static_cast<size_t>(-1) / 4);
stickerModel->setParent(proxy);
return proxy;
}
return nullptr;
}

View file

@ -33,6 +33,7 @@ class ColorImageProvider;
class UserSettings;
class ChatPage;
class DeviceVerificationFlow;
class ImagePackListModel;
class TimelineViewManager : public QObject
{
@ -57,6 +58,7 @@ public:
Q_INVOKABLE bool isInitialSync() const { return isInitialSync_; }
bool isWindowFocused() const { return isWindowFocused_; }
Q_INVOKABLE void openImageOverlay(QString mxcUrl, QString eventId);
Q_INVOKABLE void openImagePackSettings(QString roomid);
Q_INVOKABLE QColor userColor(QString id, QColor background);
Q_INVOKABLE QString escapeEmoji(QString str) const;
Q_INVOKABLE QString htmlEscape(QString str) const { return str.toHtmlEscaped(); }
@ -64,9 +66,12 @@ public:
Q_INVOKABLE QString userPresence(QString id) const;
Q_INVOKABLE QString userStatus(QString id) const;
Q_INVOKABLE void openRoomMembers(QString room_id);
Q_INVOKABLE void openRoomSettings(QString room_id);
Q_INVOKABLE void openInviteUsers(QString roomId);
Q_INVOKABLE void openGlobalUserProfile(QString userId);
Q_INVOKABLE void focusMessageInput();
Q_INVOKABLE void openInviteUsersDialog();
Q_INVOKABLE void openMemberListDialog(QString roomid) const;
Q_INVOKABLE void openLeaveRoomDialog(QString roomid) const;
Q_INVOKABLE void removeVerificationFlow(DeviceVerificationFlow *flow);
@ -81,11 +86,17 @@ signals:
void replyingEventChanged(QString replyingEvent);
void replyClosed();
void newDeviceVerificationRequest(DeviceVerificationFlow *flow);
void inviteUsers(QStringList users);
void inviteUsers(QString roomId, QStringList users);
void showRoomList();
void narrowViewChanged();
void focusChanged();
void focusInput();
void openImageOverlayInternalCb(QString eventId, QImage img);
void openRoomMembersDialog(MemberList *members);
void openRoomSettingsDialog(RoomSettings *settings);
void openInviteUsersDialog(InviteesModel *invitees);
void openProfile(UserProfile *profile);
void showImagePackSettings(ImagePackListModel *packlist);
public slots:
void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids);

View file

@ -134,4 +134,4 @@ private:
RoomInfo info_;
int notifications_ = 0;
int accessRules_ = 0;
};
};