Merge origin/master and fix conflicts

This commit is contained in:
Joseph Donofry 2021-08-10 19:29:58 -04:00
commit c91e771d53
No known key found for this signature in database
GPG key ID: E8A1D78EF044B0CB
124 changed files with 8437 additions and 4464 deletions

View file

@ -14,17 +14,4 @@ do
clang-format -i "$f"
done;
QMLFORMAT_PATH=$(command -v qmlformat || true)
if [ -n "$QMLFORMAT_PATH" ]; then
QML_FILES=$(find resources -type f -iname "*.qml")
for f in $QML_FILES
do
$QMLFORMAT_PATH -i "$f"
done;
else
echo "qmlformat not found; skipping qml formatting"
fi
git diff --exit-code

View file

@ -52,14 +52,14 @@ build-macos:
stage: build
tags: [macos]
before_script:
- brew update
- brew reinstall --force python3
- brew bundle --file=./.ci/macos/Brewfile --force --cleanup
#- brew update
#- brew reinstall --force python3
#- brew bundle --file=./.ci/macos/Brewfile --force --cleanup
- pip3 install dmgbuild
- rm -rf ../.hunter && mv .hunter ../.hunter || true
script:
- export PATH=/usr/local/opt/qt/bin/:${PATH}
- export CMAKE_PREFIX_PATH=/usr/local/opt/qt5
- export PATH=/usr/local/opt/qt@5/bin/:${PATH}
- export CMAKE_PREFIX_PATH=/usr/local/opt/qt@5
- cmake -GNinja -H. -Bbuild
-DCMAKE_BUILD_TYPE=RelWithDebInfo
-DCMAKE_INSTALL_PREFIX=.deps/usr
@ -91,7 +91,9 @@ build-flatpak-amd64:
#image: 'registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:master'
tags: [docker]
before_script:
- apt-get update && apt-get -y install flatpak-builder git python curl python3-aiohttp python3-tenacity gir1.2-ostree-1.0
# need flatpak 1.11.1 at least
- apt-get update && apt-get install -y software-properties-common
- add-apt-repository ppa:alexlarsson/flatpak && apt-get update && apt-get -y install flatpak-builder git python curl python3-aiohttp python3-tenacity gir1.2-ostree-1.0
- flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
- flatpak --noninteractive install --user flathub org.kde.Platform//5.15
- flatpak --noninteractive install --user flathub org.kde.Sdk//5.15
@ -119,7 +121,9 @@ build-flatpak-arm64:
#image: 'registry.gitlab.gnome.org/gnome/gnome-runtime-images/gnome:master'
tags: [docker-arm64]
before_script:
- apt-get update && apt-get -y install flatpak-builder git python curl python3-aiohttp python3-tenacity gir1.2-ostree-1.0
# need flatpak 1.11.1 at least
- apt-get update && apt-get install -y software-properties-common
- add-apt-repository ppa:alexlarsson/flatpak && apt-get update && apt-get -y install flatpak-builder git python curl python3-aiohttp python3-tenacity gir1.2-ostree-1.0
- flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
- flatpak --noninteractive install --user flathub org.kde.Platform//5.15
- flatpak --noninteractive install --user flathub org.kde.Sdk//5.15

View file

@ -281,14 +281,11 @@ 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
# Emoji
src/emoji/EmojiModel.cpp
@ -307,7 +304,6 @@ set(SRC_FILES
src/timeline/RoomlistModel.cpp
# UI components
src/ui/Avatar.cpp
src/ui/Badge.cpp
src/ui/DropShadow.cpp
src/ui/FlatButton.cpp
@ -346,16 +342,20 @@ 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/ReadReceiptsModel.cpp
src/RegisterPage.cpp
src/SSOHandler.cpp
src/ImagePackModel.cpp
src/CombinedImagePackModel.cpp
src/SingleImagePackModel.cpp
src/ImagePackListModel.cpp
src/TrayIcon.cpp
src/UserSettingsPage.cpp
src/UsersModel.cpp
@ -381,7 +381,7 @@ if(USE_BUNDLED_MTXCLIENT)
FetchContent_Declare(
MatrixClient
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
GIT_TAG 1c277e9ac69aafdaf6888ce595b21dc86e970f28
GIT_TAG bcf363cb5e6c423f40c96123e227bc8c5f6d6f80
)
set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
@ -492,15 +492,11 @@ 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
src/dialogs/ReadReceipts.h
# Emoji
src/emoji/EmojiModel.h
@ -518,7 +514,6 @@ qt5_wrap_cpp(MOC_HEADERS
src/timeline/RoomlistModel.h
# UI components
src/ui/Avatar.h
src/ui/Badge.h
src/ui/FlatButton.h
src/ui/FloatingButton.h
@ -546,28 +541,33 @@ qt5_wrap_cpp(MOC_HEADERS
src/AvatarProvider.h
src/BlurhashProvider.h
src/Cache_p.h
src/CacheCryptoStructs.h
src/Cache_p.h
src/CallDevices.h
src/CallManager.h
src/ChatPage.h
src/Clipboard.h
src/CombinedImagePackModel.h
src/CompletionProxyModel.h
src/DeviceVerificationFlow.h
src/InviteeItem.h
src/ImagePackListModel.h
src/InviteesModel.h
src/LoginPage.h
src/MainWindow.h
src/MemberList.h
src/MxcImageProvider.h
src/Olm.h
src/RegisterPage.h
src/RoomsModel.h
src/SSOHandler.h
src/ImagePackModel.h
src/SingleImagePackModel.h
src/TrayIcon.h
src/UserSettingsPage.h
src/UsersModel.h
src/RoomsModel.h
src/WebRTCSession.h
src/WelcomePage.h
)
src/ReadReceiptsModel.h
)
#
# Bundle translations.

View file

@ -19,6 +19,8 @@ finish-args:
- --talk-name=org.freedesktop.secrets
- --talk-name=org.freedesktop.StatusNotifierItem
- --talk-name=org.kde.*
# needed for SingleApplication to work
- --allow=per-app-dev-shm
cleanup:
- /include
- /bin/mdb*
@ -161,7 +163,7 @@ modules:
buildsystem: cmake-ninja
name: mtxclient
sources:
- commit: 1c277e9ac69aafdaf6888ce595b21dc86e970f28
- commit: bcf363cb5e6c423f40c96123e227bc8c5f6d6f80
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

@ -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="+286"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<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 +655,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 +804,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 +822,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 +832,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 +857,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 +881,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 +902,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 +924,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 +944,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1152,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 +1272,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 +1285,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="+4180"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1293,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>
@ -1246,6 +1302,16 @@ Example: https://server.my:8787</source>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1277,17 +1343,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 +1393,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1406,19 +1485,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1433,12 +1515,7 @@ Example: https://server.my:8787</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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1469,6 +1546,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 +1621,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 +1641,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 +1670,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1681,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 +1816,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1747,7 +1850,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 +1858,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 +1891,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="+527"/>
<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 +1899,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 +1950,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 +1960,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 +2009,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 +2018,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 +2464,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 +2515,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="+184"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2469,19 +2586,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>
@ -2593,7 +2697,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</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="+286"/>
<source>Confirm invite</source>
<translation>Einladung bestätigen</translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<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="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation>Nachricht weiterleiten</translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished">Schließen</translation>
</message>
</context>
<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 +655,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 +808,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 +822,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 +832,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 +842,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 +867,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 +885,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 +906,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 +928,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 +948,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Optionen</translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation>&amp;Kopieren</translation>
</message>
@ -1100,7 +1156,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 +1276,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 +1289,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="+4180"/>
<source>no version stored</source>
<translation>keine Version gespeichert</translation>
</message>
@ -1241,7 +1297,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>
@ -1250,6 +1306,16 @@ Beispiel: https://mein.server:8787</translation>
<source>Enter the tag you want to use:</source>
<translation>Gib den Tag, den du verwenden willst, ein:</translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1281,17 +1347,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 +1397,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="+55"/>
<source>SETTINGS</source>
<translation>EINSTELLUNGEN</translation>
</message>
@ -1410,19 +1488,22 @@ Beispiel: https://mein.server:8787</translation>
<translation>Verschlüsselung ist derzeit experimentell und könnte unerwartete Probleme verursachen.&lt;br&gt;Bitte beachte, dass dies später nicht mehr deaktiviert werden kann.</translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<translation>Auf Schlüsselanfragen antworten</translation>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<translation>Soll der Client automatisch mit den Sitzungsschlüsseln auf Anfragen antworten oder nicht? Bitte mit Vorsicht benutzen, dies ist eine vorübergehende Maßnahme, um die Ende-zu-Ende-Implementierung zu testen, bis die Geräteverifizierung abgeschlossen ist.</translation>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation>INFO</translation>
</message>
@ -1437,12 +1518,7 @@ Beispiel: https://mein.server:8787</translation>
<translation>Raumversion</translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation>Aktivierung der Verschlüsselung fehlgeschlagen: %1</translation>
</message>
@ -1473,6 +1549,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 +1624,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 +1644,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 +1673,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation>Nachricht zurückziehen fehlgeschlagen: %1</translation>
</message>
@ -1582,7 +1684,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 +1818,12 @@ Beispiel: https://mein.server:8787</translation>
<translation>%1 hat das Anklopfen zurückgezogen.</translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation>Du bist dem Raum beigetreten.</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<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 +1852,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 +1860,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 +1893,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="+527"/>
<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 +1901,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 +1952,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 +1962,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 +2011,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 +2020,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 +2476,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 +2527,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="+184"/>
<source>Yesterday</source>
<translation>Gestern</translation>
</message>
@ -2482,19 +2598,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>
@ -2608,7 +2711,7 @@ Medien-Größe: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation>Du hast eine Audiodatei gesendet</translation>
</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="+286"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<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 +655,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 +804,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 +818,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 +828,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 +838,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 +863,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 +881,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 +902,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 +924,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 +944,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1152,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 +1272,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 +1285,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="+4180"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1293,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>
@ -1246,6 +1302,16 @@ Example: https://server.my:8787</source>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1277,17 +1343,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 +1393,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1406,19 +1484,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1433,12 +1514,7 @@ Example: https://server.my:8787</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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1469,6 +1545,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 +1620,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 +1640,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 +1669,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1680,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 +1814,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1848,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 +1856,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 +1889,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="+527"/>
<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 +1897,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 +1948,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 +1958,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 +2007,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 +2016,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 +2462,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 +2513,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="+184"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2468,19 +2584,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>
@ -2592,7 +2695,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</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="+286"/>
<source>Confirm invite</source>
<translation>Confirm invite</translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<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="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation>Forward Message</translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished">Close</translation>
</message>
</context>
<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 +655,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 +808,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 +826,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 +836,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 +861,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 +885,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 +906,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 +928,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 +948,7 @@ Example: https://server.my:8787</translation>
<translation>Options</translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation>&amp;Copy</translation>
</message>
@ -1100,7 +1156,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 +1276,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 +1289,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="+4180"/>
<source>no version stored</source>
<translation>no version stored</translation>
</message>
@ -1241,7 +1297,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>
@ -1250,6 +1306,16 @@ Example: https://server.my:8787</translation>
<source>Enter the tag you want to use:</source>
<translation>Enter the tag you want to use:</translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1281,17 +1347,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 +1397,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="+55"/>
<source>SETTINGS</source>
<translation>SETTINGS</translation>
</message>
@ -1410,21 +1488,22 @@ Example: https://server.my:8787</translation>
<translation>Encryption is currently experimental and things might break unexpectedly.&lt;br&gt;Please take note that it can&apos;t be disabled afterwards.</translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<translation>Respond to key requests</translation>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<translation>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</translation>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation>INFO</translation>
</message>
@ -1439,12 +1518,7 @@ E2E implementation until device verification is completed.</translation>
<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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation>Failed to enable encryption: %1</translation>
</message>
@ -1475,6 +1549,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 +1624,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 +1644,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 +1673,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation>Message redaction failed: %1</translation>
</message>
@ -1584,7 +1684,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 +1818,12 @@ E2E implementation until device verification is completed.</translation>
<translation>%1 redacted their knock.</translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation>You joined this room.</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<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 +1852,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 +1860,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 +1893,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="+527"/>
<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 +1901,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 +1952,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 +1962,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 +2011,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 +2020,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 +2477,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 +2528,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="+184"/>
<source>Yesterday</source>
<translation>Yesterday</translation>
</message>
@ -2485,19 +2599,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>
@ -2611,7 +2712,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation>You sent an audio clip</translation>
</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="+286"/>
<source>Confirm invite</source>
<translation>Konfirmu inviton</translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<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="-727"/>
<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="+189"/>
<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>
@ -605,10 +605,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished">Fermi</translation>
</message>
</context>
<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 +656,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 +811,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 +825,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 +835,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 +845,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 +870,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 +888,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 +909,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 +931,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 +951,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation>Elektebloj</translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1103,7 +1159,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 +1279,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 +1292,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="+4180"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1244,7 +1300,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>
@ -1253,6 +1309,16 @@ Ekzemplo: https://servilo.mia:8787</translation>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1284,17 +1350,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 +1400,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="+55"/>
<source>SETTINGS</source>
<translation>AGORDOJ</translation>
</message>
@ -1413,19 +1491,22 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation>Ĉifrado nun estas eksperimenta kaj povus rompiĝi neatendite.&lt;br&gt;Bonvole sciu, ke ne eblas ĝin malŝalti poste.</translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<translation>Respondi al petoj de ŝlosiloj</translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation>INFORMOJ</translation>
</message>
@ -1440,12 +1521,7 @@ Ekzemplo: https://servilo.mia:8787</translation>
<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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation>Malsukcesis ŝalti ĉifradon: %1</translation>
</message>
@ -1476,6 +1552,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 +1627,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 +1648,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 +1677,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1586,7 +1688,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 +1824,12 @@ Ekzemplo: https://servilo.mia:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation>Vi aliĝis ĉi tiun ĉambron.</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1756,7 +1858,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 +1866,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 +1899,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="+527"/>
<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 +1907,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 +1958,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 +1968,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 +2017,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 +2026,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 +2489,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 +2541,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="+184"/>
<source>Yesterday</source>
<translation>Hieraŭ</translation>
</message>
@ -2496,19 +2612,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>
@ -2620,7 +2723,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</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="+286"/>
<source>Confirm invite</source>
<translation>Confirmar invitación</translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<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 +655,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 +804,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 +822,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 +832,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 +857,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 +881,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 +902,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 +924,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 +944,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1152,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 +1272,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 +1285,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="+4180"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1293,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>
@ -1246,6 +1302,16 @@ Example: https://server.my:8787</source>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1277,17 +1343,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 +1393,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1406,19 +1484,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1433,12 +1514,7 @@ Example: https://server.my:8787</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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1469,6 +1545,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 +1620,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 +1640,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 +1669,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1680,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 +1824,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation type="unfinished">Te has unido a esta sala.</translation>
</message>
<message>
<location line="+885"/>
<location line="+886"/>
<source>Rejected the knock from %1.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1848,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 +1856,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 +1889,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="+527"/>
<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 +1897,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 +1948,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 +1958,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 +2007,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 +2016,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 +2462,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 +2513,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="+184"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2468,19 +2584,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>
@ -2592,7 +2695,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</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="+286"/>
<source>Confirm invite</source>
<translation>Kinnita kutse</translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<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="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation>Suuna sõnum edasi</translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished">Sulge</translation>
</message>
</context>
<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 +655,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 +808,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 +826,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 +836,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 +861,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 +885,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 +906,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 +928,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 +948,7 @@ Näiteks: https://server.minu:8787</translation>
<translation>Valikud</translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation>&amp;Kopeeri</translation>
</message>
@ -1100,7 +1156,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 +1276,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 +1289,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="+4180"/>
<source>no version stored</source>
<translation>salvestatud versiooni ei leidu</translation>
</message>
@ -1241,7 +1297,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>
@ -1250,6 +1306,16 @@ Näiteks: https://server.minu:8787</translation>
<source>Enter the tag you want to use:</source>
<translation>Kirjuta silt, mida soovid kasutada:</translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1281,17 +1347,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 +1397,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="+55"/>
<source>SETTINGS</source>
<translation>SEADISTUSED</translation>
</message>
@ -1410,21 +1488,22 @@ Näiteks: https://server.minu:8787</translation>
<translation>Krüptimine on nhekos hetkel veel katseline ning nii mõndagi võib ootamatult katki minna. &lt;br&gt;Palun arvesta, et krüptimist ei saa hiljem enam välja lülitada.</translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<translation>Vasta krüptovõtmete päringutele</translation>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<translation>Kas klient peaks automaatselt vastama või mitte vastama sessioonivõtmete päringule.
Kasuta seda võimalust ettevaatlikult. Tegemist on ajutise lahendusega läbiva krüptimise
testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.</translation>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation>TEAVE</translation>
</message>
@ -1439,12 +1518,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation>Krüptimise kasutuselevõtmine ei õnnestunud: %1</translation>
</message>
@ -1475,6 +1549,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 +1624,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 +1644,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 +1673,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation>Sõnumi ümbersõnastamine ebaõnnestus: %1</translation>
</message>
@ -1584,7 +1684,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 +1818,12 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.<
<translation>%1 muutis oma koputust jututoa uksele.</translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation>Sa liitusid jututoaga.</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<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 +1852,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 +1860,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 +1893,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="+527"/>
<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 +1901,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 +1952,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 +1962,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 +2011,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 +2020,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 +2477,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 +2528,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="+184"/>
<source>Yesterday</source>
<translation>Eile</translation>
</message>
@ -2485,19 +2599,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>
@ -2611,7 +2712,7 @@ Meedia suurus: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation>Sa saatsid helifaili</translation>
</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="+286"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation>Välitä viesti</translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished">Sulje</translation>
</message>
</context>
<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 +655,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 +804,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 +818,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 +828,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 +838,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 +863,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 +881,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 +902,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 +924,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 +944,7 @@ Example: https://server.my:8787</source>
<translation>Asetukset</translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1152,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 +1272,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 +1285,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="+4180"/>
<source>no version stored</source>
<translation>ei tallennettua versiota</translation>
</message>
@ -1237,7 +1293,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>
@ -1246,6 +1302,16 @@ Example: https://server.my:8787</source>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1277,17 +1343,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 +1393,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1406,19 +1484,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1433,12 +1514,7 @@ Example: https://server.my:8787</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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation>Salauksen aktivointi epäonnistui: %1</translation>
</message>
@ -1469,6 +1545,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 +1620,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 +1640,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 +1669,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation>Viestin muokkaus epäonnistui: %1</translation>
</message>
@ -1578,7 +1680,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 +1814,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation>Sinä liityit tähän huoneeseen.</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1848,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 +1856,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 +1889,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="+527"/>
<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 +1897,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 +1948,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 +1958,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 +2007,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 +2016,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 +2462,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 +2513,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="+184"/>
<source>Yesterday</source>
<translation>Eilen</translation>
</message>
@ -2468,19 +2584,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>
@ -2594,7 +2697,7 @@ Median koko: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation>Lähetit äänileikkeen</translation>
</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="+286"/>
<source>Confirm invite</source>
<translation>Confirmer l&apos;invitation</translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<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="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished">Fermer</translation>
</message>
</context>
<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 +655,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 +808,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 +822,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 +832,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 +842,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 +867,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 +885,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 +906,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 +928,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 +948,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Options</translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1100,7 +1156,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 +1276,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 +1289,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="+4180"/>
<source>no version stored</source>
<translation>pas de version enregistrée</translation>
</message>
@ -1241,7 +1297,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>
@ -1250,6 +1306,16 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1281,17 +1347,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 +1397,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="+55"/>
<source>SETTINGS</source>
<translation>CONFIGURATION</translation>
</message>
@ -1410,21 +1488,22 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation>
<translation>Le chiffrement actuellement expérimental et des comportements inattendus peuvent être rencontrés. &lt;br&gt;Veuillez noter qu&apos;il n&apos;est pas possible de le désactiver par la suite.</translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<translation>Répondre aux demandes de clé</translation>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<translation>Si le client doit répondre automatiquement avec les clés de session lorsqu&apos;elles sont
demandées. Utiliser précautionneusement, il s&apos;agit d&apos;une mesure temporaire afin de
tester le chiffrement de bout en bout tant que la vérification des appareils n&apos;est pas au point.</translation>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation>INFO</translation>
</message>
@ -1439,12 +1518,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n&
<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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation>Échec de l&apos;activation du chiffrement&#xa0;&#xa0;: %1</translation>
</message>
@ -1475,6 +1549,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 +1624,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 +1644,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 +1673,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation>Échec de la suppression du message&#xa0;: %1</translation>
</message>
@ -1584,7 +1684,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 +1818,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="-884"/>
<source>You joined this room.</source>
<translation>Vous avez rejoint ce salon.</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1752,7 +1852,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 +1860,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 +1893,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="+527"/>
<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 +1901,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 +1952,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 +1962,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 +2011,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 +2020,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 +2479,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 +2530,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="+184"/>
<source>Yesterday</source>
<translation>Hier</translation>
</message>
@ -2487,19 +2601,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>
@ -2613,7 +2714,7 @@ Taille du média : %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation>Vous avez envoyé un message audio</translation>
</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="+286"/>
<source>Confirm invite</source>
<translation>Meghívás megerősítése</translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<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="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished">Bezárás</translation>
</message>
</context>
<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 +655,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 +808,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 +826,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 +836,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 +861,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 +885,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 +906,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 +928,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 +948,7 @@ Példa: https://szerver.em:8787</translation>
<translation>Műveletek</translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1100,7 +1156,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 +1276,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 +1289,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="+4180"/>
<source>no version stored</source>
<translation>nincs tárolva verzió</translation>
</message>
@ -1241,7 +1297,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>
@ -1250,6 +1306,16 @@ Példa: https://szerver.em:8787</translation>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1281,17 +1347,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 +1397,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="+55"/>
<source>SETTINGS</source>
<translation>BEÁLLÍTÁSOK</translation>
</message>
@ -1410,21 +1487,22 @@ Példa: https://szerver.em:8787</translation>
<translation>A titkosítás jelenleg kísérleti stádiumú és váratlan furcsaságok történhetnek.&lt;br&gt;Kérlek, vedd vigyelembe, hogy ha egyszer aktiváltad, nem lehet utána kikapcsolni.</translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<translation>Válasz kulcskérelmekre</translation>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<translation>Válaszoljon-e kérés esetén a kliens munkamenetkulcsokkal automatikusan.
Óvatosan használandó, mivel ez csak egy átmeneti megoldás a végponttól
végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközhitelesítés.</translation>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation>INFÓ</translation>
</message>
@ -1439,12 +1517,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh
<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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation>Nem sikerült a titkosítás aktiválása: %1</translation>
</message>
@ -1475,6 +1548,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 +1623,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 +1643,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 +1672,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation>Az üzenet visszavonása nem sikerült: %1</translation>
</message>
@ -1584,7 +1683,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 +1816,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="-884"/>
<source>You joined this room.</source>
<translation>Csatlakoztál ehhez a szobához.</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1751,7 +1850,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 +1858,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 +1891,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="+527"/>
<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 +1899,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 +1950,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 +1960,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 +2009,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 +2018,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 +2476,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 +2527,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="+184"/>
<source>Yesterday</source>
<translation>Tegnap</translation>
</message>
@ -2485,19 +2598,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>
@ -2611,7 +2711,7 @@ Média mérete: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation>Küldtél egy hangfájlt</translation>
</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="+286"/>
<source>Confirm invite</source>
<translation>Conferma Invito</translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<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="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation>Inoltra Messaggio</translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished">Chiudi</translation>
</message>
</context>
<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 +655,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 +808,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 +822,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 +832,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 +842,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 +867,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 +885,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 +906,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 +928,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 +948,7 @@ Esempio: https://server.mio:8787</translation>
<translation type="unfinished">Opzioni</translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1101,7 +1157,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 +1277,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 +1290,7 @@ Verificare %1 adesso?</translation>
<context>
<name>RoomInfo</name>
<message>
<location filename="../../src/Cache.cpp" line="+4009"/>
<location filename="../../src/Cache.cpp" line="+4180"/>
<source>no version stored</source>
<translation>nessuna versione memorizzata</translation>
</message>
@ -1242,7 +1298,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>
@ -1251,6 +1307,16 @@ Verificare %1 adesso?</translation>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1282,17 +1348,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 +1398,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1411,19 +1489,22 @@ Verificare %1 adesso?</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1438,12 +1519,7 @@ Verificare %1 adesso?</translation>
<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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished">Impossibile abilitare la crittografia: %1</translation>
</message>
@ -1474,6 +1550,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 +1625,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 +1645,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 +1674,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation>Oscuramento del messaggio fallito: %1</translation>
</message>
@ -1583,7 +1685,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 +1819,12 @@ Verificare %1 adesso?</translation>
<translation>%1 ha oscurato la sua bussata.</translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation>Sei entrato in questa stanza.</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1751,7 +1853,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 +1861,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 +1894,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="+527"/>
<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 +1902,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 +1953,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 +1963,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 +2012,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 +2021,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 +2467,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 +2518,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="+184"/>
<source>Yesterday</source>
<translation>Ieri</translation>
</message>
@ -2473,19 +2589,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>
@ -2599,7 +2702,7 @@ Peso media: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation>Hai inviato una clip audio</translation>
</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="+286"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<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 +655,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 +804,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 +818,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 +828,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 +838,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 +863,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 +881,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 +902,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 +924,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 +944,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1152,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 +1272,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 +1285,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="+4180"/>
<source>no version stored</source>
<translation></translation>
</message>
@ -1237,7 +1293,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>
@ -1246,6 +1302,16 @@ Example: https://server.my:8787</source>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1277,17 +1343,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 +1393,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1406,19 +1483,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1433,12 +1513,7 @@ Example: https://server.my:8787</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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished">: %1</translation>
</message>
@ -1469,6 +1544,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 +1619,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 +1639,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 +1668,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation>: %1</translation>
</message>
@ -1578,7 +1679,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 +1812,12 @@ Example: https://server.my:8787</source>
<translation>%1</translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1745,7 +1846,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 +1854,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 +1887,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="+527"/>
<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 +1895,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 +1946,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 +1956,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 +2005,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 +2014,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 +2460,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 +2511,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="+184"/>
<source>Yesterday</source>
<translation></translation>
</message>
@ -2467,19 +2582,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>
@ -2593,7 +2695,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation></translation>
</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="+286"/>
<source>Confirm invite</source>
<translation> </translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<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 +655,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 +804,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 +822,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 +832,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 +857,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 +881,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 +902,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 +924,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 +944,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1152,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 +1272,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 +1285,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="+4180"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1293,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>
@ -1246,6 +1302,16 @@ Example: https://server.my:8787</source>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1277,17 +1343,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 +1393,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1406,19 +1484,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1433,12 +1514,7 @@ Example: https://server.my:8787</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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1469,6 +1545,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 +1620,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 +1640,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 +1669,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1680,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 +1814,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation type="unfinished">ി ിി .</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1848,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 +1856,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 +1889,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="+527"/>
<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 +1897,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 +1948,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 +1958,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 +2007,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 +2016,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 +2462,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 +2513,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="+184"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2468,19 +2584,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>
@ -2592,7 +2695,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</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="+286"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<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 +655,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 +804,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 +818,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 +828,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 +838,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 +863,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 +881,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 +902,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 +924,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 +944,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1152,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 +1272,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 +1285,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="+4180"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1293,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>
@ -1246,6 +1302,16 @@ Example: https://server.my:8787</source>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1277,17 +1343,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 +1393,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1406,19 +1484,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1433,12 +1514,7 @@ Example: https://server.my:8787</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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1469,6 +1545,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 +1620,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 +1640,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 +1669,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1680,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 +1814,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation type="unfinished">Je bent lid geworden van deze kamer.</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1848,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 +1856,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 +1889,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="+527"/>
<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 +1897,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 +1948,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 +1958,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 +2007,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 +2016,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 +2462,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 +2513,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="+184"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2468,19 +2584,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>
@ -2594,7 +2697,7 @@ Mediagrootte: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</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="+286"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished">Zamknij</translation>
</message>
</context>
<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 +655,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 +806,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 +820,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 +830,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 +840,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 +865,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 +883,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 +904,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 +926,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 +946,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1098,7 +1154,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 +1274,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 +1287,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="+4180"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1239,7 +1295,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>
@ -1248,6 +1304,16 @@ Example: https://server.my:8787</source>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1279,17 +1345,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 +1395,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1408,19 +1487,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1435,12 +1517,7 @@ Example: https://server.my:8787</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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished">Nie udało się włączyć szyfrowania: %1</translation>
</message>
@ -1471,6 +1548,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 +1623,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 +1643,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 +1672,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation>
</message>
@ -1580,7 +1683,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 +1818,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation type="unfinished">Dołączyłeś(-ł) do tego pokoju.</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1749,7 +1852,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 +1860,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 +1893,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="+527"/>
<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 +1901,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 +1952,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 +1962,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 +2011,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 +2020,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 +2466,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 +2517,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="+184"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2471,19 +2588,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>
@ -2597,7 +2701,7 @@ Rozmiar multimediów: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</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="+286"/>
<source>Confirm invite</source>
<translation>Confirmar convite</translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<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 +655,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 +804,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 +822,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 +832,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 +857,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 +881,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 +902,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 +924,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 +944,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1152,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 +1272,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 +1285,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="+4180"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1293,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>
@ -1246,6 +1302,16 @@ Example: https://server.my:8787</source>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1277,17 +1343,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 +1393,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1406,19 +1484,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1433,12 +1514,7 @@ Example: https://server.my:8787</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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1469,6 +1545,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 +1620,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 +1640,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 +1669,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1680,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 +1814,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation type="unfinished">Você entrou nessa sala.</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1848,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 +1856,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 +1889,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="+527"/>
<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 +1897,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 +1948,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 +1958,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 +2007,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 +2016,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 +2462,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 +2513,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="+184"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2468,19 +2584,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>
@ -2592,7 +2695,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</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="+286"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<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 +655,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 +804,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 +822,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 +832,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 +857,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 +881,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 +902,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 +924,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 +944,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1152,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 +1272,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 +1285,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="+4180"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1293,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>
@ -1246,6 +1302,16 @@ Example: https://server.my:8787</source>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1277,17 +1343,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 +1393,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1406,19 +1484,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1433,12 +1514,7 @@ Example: https://server.my:8787</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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1469,6 +1545,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 +1620,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 +1640,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 +1669,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1680,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 +1814,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1848,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 +1856,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 +1889,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="+527"/>
<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 +1897,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 +1948,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 +1958,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 +2007,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 +2016,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 +2462,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 +2513,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="+184"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2468,19 +2584,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>
@ -2592,7 +2695,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</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="+286"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished">Închide</translation>
</message>
</context>
<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 +655,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 +808,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 +822,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 +832,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 +842,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 +867,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 +885,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 +906,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 +928,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 +948,7 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished">Opțiuni</translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1100,7 +1156,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 +1276,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 +1289,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="+4180"/>
<source>no version stored</source>
<translation>nicio versiune stocată</translation>
</message>
@ -1241,7 +1297,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>
@ -1250,6 +1306,16 @@ Exemplu: https://serverul.meu:8787</translation>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1281,17 +1347,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 +1397,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1410,19 +1489,22 @@ Exemplu: https://serverul.meu:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1437,12 +1519,7 @@ Exemplu: https://serverul.meu:8787</translation>
<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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished">Nu s-a putut activa criptarea: %1</translation>
</message>
@ -1473,6 +1550,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 +1625,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 +1645,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 +1674,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation>Redactare mesaj eșuată: %1</translation>
</message>
@ -1582,7 +1685,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 +1820,12 @@ Exemplu: https://serverul.meu:8787</translation>
<translation>%1 și-a redactat ciocănitul.</translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation>Te-ai alăturat camerei.</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1751,7 +1854,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 +1862,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 +1895,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="+527"/>
<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 +1903,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 +1954,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 +1964,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 +2013,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 +2022,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 +2468,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 +2519,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="+184"/>
<source>Yesterday</source>
<translation>Ieri</translation>
</message>
@ -2473,19 +2590,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>
@ -2599,7 +2703,7 @@ Dimensiune media: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation>Ai trimis un clip audio</translation>
</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="+286"/>
<source>Confirm invite</source>
<translation>Подтвердите приглашение</translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation>Вы действительно хотите начать личную переписку с %1?</translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation>Переслать Сообщение</translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished">Закрыть</translation>
</message>
</context>
<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 +655,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 +808,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 +822,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 +832,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 +842,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 +867,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 +885,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 +906,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 +928,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 +948,7 @@ Example: https://server.my:8787</source>
<translation>Опции</translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1100,7 +1156,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 +1276,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 +1289,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="+4180"/>
<source>no version stored</source>
<translation>нет сохраненной версии</translation>
</message>
@ -1241,7 +1297,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>
@ -1250,6 +1306,16 @@ Example: https://server.my:8787</source>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1281,17 +1347,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 +1397,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="+55"/>
<source>SETTINGS</source>
<translation>НАЙСТРОЙКИ</translation>
</message>
@ -1410,19 +1489,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<translation>Отвечать на запрос ключей</translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation>ИНФОРМАЦИЯ</translation>
</message>
@ -1437,12 +1519,7 @@ Example: https://server.my:8787</source>
<translation>Версия Комнаты</translation>
</message>
<message>
<location line="+13"/>
<source>OK</source>
<translation>ОК</translation>
</message>
<message>
<location filename="../../src/ui/RoomSettings.cpp" line="+268"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation>Не удалось включить шифрование: %1</translation>
</message>
@ -1473,6 +1550,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 +1625,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 +1645,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 +1674,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation>Ошибка редактирования сообщения: %1</translation>
</message>
@ -1582,7 +1685,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 +1820,12 @@ Example: https://server.my:8787</source>
<translation>%1 отредактировал его &quot;стук&quot;.</translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation>Вы присоединились к этой комнате.</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1751,7 +1854,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 +1862,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 +1895,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="+527"/>
<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 +1903,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 +1954,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 +1964,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 +2013,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 +2022,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 +2474,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 +2525,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="+184"/>
<source>Yesterday</source>
<translation>Вчера</translation>
</message>
@ -2479,19 +2596,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>
@ -2605,7 +2709,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation>Вы отправили аудио запись</translation>
</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="+286"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<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 +655,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 +804,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 +818,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 +828,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 +838,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 +863,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 +881,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 +902,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 +924,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 +944,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1152,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 +1272,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 +1285,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="+4180"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1293,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>
@ -1246,6 +1302,16 @@ Example: https://server.my:8787</source>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1277,17 +1343,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 +1393,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1406,19 +1484,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1433,12 +1514,7 @@ Example: https://server.my:8787</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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1469,6 +1545,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 +1620,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 +1640,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 +1669,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished"></translation>
</message>
@ -1578,7 +1680,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 +1814,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1746,7 +1848,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 +1856,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 +1889,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="+527"/>
<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 +1897,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 +1948,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 +1958,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 +2007,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 +2016,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 +2462,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 +2513,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="+184"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2468,19 +2584,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>
@ -2592,7 +2695,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</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="+286"/>
<source>Confirm invite</source>
<translation>Bekräfta inbjudan</translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished">Stäng</translation>
</message>
</context>
<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 +655,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 +808,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 +826,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 +836,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 +861,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 +885,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 +906,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 +928,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 +948,7 @@ Exempel: https://server.my:8787</translation>
<translation type="unfinished">Alternativ</translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1100,7 +1156,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 +1276,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 +1289,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="+4180"/>
<source>no version stored</source>
<translation>ingen version lagrad</translation>
</message>
@ -1241,7 +1297,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>
@ -1250,6 +1306,16 @@ Exempel: https://server.my:8787</translation>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1281,17 +1347,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 +1397,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1410,19 +1488,22 @@ Exempel: https://server.my:8787</translation>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1437,12 +1518,7 @@ Exempel: https://server.my:8787</translation>
<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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished">Kunde inte aktivera kryptering: %1</translation>
</message>
@ -1473,6 +1549,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 +1624,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 +1644,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 +1673,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation>Kunde inte maskera meddelande: %1</translation>
</message>
@ -1582,7 +1684,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 +1818,12 @@ Exempel: https://server.my:8787</translation>
<translation>%1 maskerade sin knackning.</translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation>Du gick med i detta rum.</translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1750,7 +1852,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 +1860,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 +1893,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="+527"/>
<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 +1901,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 +1952,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 +1962,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 +2011,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 +2020,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 +2474,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 +2525,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="+184"/>
<source>Yesterday</source>
<translation>Igår</translation>
</message>
@ -2480,19 +2596,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>
@ -2606,7 +2709,7 @@ Mediastorlek: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation>Du skickade ett ljudklipp</translation>
</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="+286"/>
<source>Confirm invite</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-279"/>
<location line="-285"/>
<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="+189"/>
<source>Do you really want to start a private chat with %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-721"/>
<location line="-727"/>
<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="+189"/>
<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>
@ -604,10 +604,48 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ImagePackSettingsDialog</name>
<message>
<location filename="../qml/dialogs/ImagePackSettingsDialog.qml" line="+22"/>
<source>Image pack settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+151"/>
<source>Private pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Pack from this room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+2"/>
<source>Globally enabled pack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+59"/>
<source>Enable globally</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+4"/>
<source>Enables this pack to be used in all rooms</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+62"/>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
</context>
<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 +655,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 +804,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 +818,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 +828,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 +838,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 +863,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 +881,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 +902,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 +924,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 +944,7 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+329"/>
<location line="+405"/>
<source>&amp;Copy</source>
<translation type="unfinished"></translation>
</message>
@ -1096,7 +1152,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 +1272,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 +1285,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="+4180"/>
<source>no version stored</source>
<translation type="unfinished"></translation>
</message>
@ -1237,7 +1293,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>
@ -1246,6 +1302,16 @@ Example: https://server.my:8787</source>
<source>Enter the tag you want to use:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+9"/>
<source>Leave Room</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
<source>Are you sure you want to leave this room?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+7"/>
<source>Leave room</source>
@ -1277,17 +1343,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 +1393,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="+55"/>
<source>SETTINGS</source>
<translation type="unfinished"></translation>
</message>
@ -1406,19 +1483,22 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+17"/>
<source>Respond to key requests</source>
<location line="+16"/>
<source>Sticker &amp; Emote Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+5"/>
<source>Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.</source>
<location line="+4"/>
<source>Change</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+21"/>
<location line="+1"/>
<source>Change what packs are enabled, remove packs or create new ones</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+16"/>
<source>INFO</source>
<translation type="unfinished"></translation>
</message>
@ -1433,12 +1513,7 @@ Example: https://server.my:8787</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"/>
<location filename="../../src/ui/RoomSettings.cpp" line="+255"/>
<source>Failed to enable encryption: %1</source>
<translation type="unfinished">%1</translation>
</message>
@ -1469,6 +1544,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 +1619,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 +1639,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 +1668,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="+1107"/>
<source>Message redaction failed: %1</source>
<translation type="unfinished">%1</translation>
</message>
@ -1578,7 +1679,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 +1812,12 @@ Example: https://server.my:8787</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-883"/>
<location line="-884"/>
<source>You joined this room.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+849"/>
<location line="+850"/>
<source>%1 has changed their avatar and changed their display name to %2.</source>
<translation type="unfinished"></translation>
</message>
@ -1745,7 +1846,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 +1854,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 +1887,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="+527"/>
<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 +1895,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 +1946,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 +1956,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 +2005,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 +2014,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 +2460,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 +2511,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="+184"/>
<source>Yesterday</source>
<translation type="unfinished"></translation>
</message>
@ -2467,19 +2582,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>
@ -2593,7 +2695,7 @@ Media size: %2
<context>
<name>message-description sent:</name>
<message>
<location filename="../../src/Utils.h" line="+124"/>
<location filename="../../src/Utils.h" line="+115"/>
<source>You sent an audio clip</source>
<translation type="unfinished"></translation>
</message>

View file

@ -11,10 +11,11 @@ import im.nheko 1.0
Rectangle {
id: avatar
property alias url: img.source
property string url
property string userid
property string displayName
property alias textColor: label.color
property bool crop: true
signal clicked(var mouse)
@ -44,12 +45,13 @@ Rectangle {
anchors.fill: parent
asynchronous: true
fillMode: Image.PreserveAspectCrop
fillMode: avatar.crop ? Image.PreserveAspectCrop : Image.PreserveAspectFit
mipmap: true
smooth: true
sourceSize.width: avatar.width
sourceSize.height: avatar.height
layer.enabled: true
source: avatar.url + ((avatar.crop || !avatar.url) ? "" : "?scale")
MouseArea {
id: mouseArea

View file

@ -56,6 +56,7 @@ Rectangle {
RoomList {
id: roomlist
implicitHeight: chatPage.height
collapsed: parent.collapsed
}

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

@ -109,15 +109,17 @@ Popup {
}
Connections {
onCompletionSelected: {
function onCompletionSelected(id) {
room.forwardMessage(messageContextMenu.eventId, id);
forwardMessagePopup.close();
}
onCountChanged: {
function onCountChanged() {
if (completerPopup.count > 0 && (completerPopup.currentIndex < 0 || completerPopup.currentIndex >= completerPopup.count))
completerPopup.currentIndex = 0;
}
target: completerPopup
}

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)
height: 380
width: 340
palette: Nheko.colors
color: Nheko.colors.window
flags: Qt.Dialog | Qt.WindowCloseButtonHint
Component.onCompleted: Nheko.reparent(inviteDialogRoot)
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

@ -18,8 +18,8 @@ TextEdit {
//enabled: selectByMouse
color: Nheko.colors.text
onLinkActivated: Nheko.openLink(link)
ToolTip.visible: hoveredLink
ToolTip.text: hoveredLink
ToolTip.visible: hoveredLink || false
ToolTip.text: hoveredLink || ""
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

@ -7,7 +7,7 @@ import "./voip"
import QtQuick 2.12
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.2
import QtQuick.Window 2.2
import QtQuick.Window 2.13
import im.nheko 1.0
Rectangle {
@ -261,18 +261,24 @@ Rectangle {
background: null
Connections {
onRoomChanged: {
function onRoomChanged() {
messageInput.clear();
messageInput.append(room.input.text());
if (room)
messageInput.append(room.input.text());
messageInput.completerTriggeredAt = -1;
popup.completerName = "";
messageInput.forceActiveFocus();
}
target: timelineView
}
Connections {
onCompletionClicked: messageInput.insertCompletion(completion)
function onCompletionClicked(completion) {
messageInput.insertCompletion(completion);
}
target: popup
}
@ -284,28 +290,39 @@ Rectangle {
}
Connections {
ignoreUnknownSignals: true
onInsertText: {
function onInsertText(text) {
messageInput.remove(messageInput.selectionStart, messageInput.selectionEnd);
messageInput.insert(messageInput.cursorPosition, text);
}
onTextChanged: {
function onTextChanged(newText) {
messageInput.text = newText;
messageInput.cursorPosition = newText.length;
}
ignoreUnknownSignals: true
target: room ? room.input : null
}
Connections {
function onReplyChanged() {
messageInput.forceActiveFocus();
}
function onEditChanged() {
messageInput.forceActiveFocus();
}
ignoreUnknownSignals: true
onReplyChanged: messageInput.forceActiveFocus()
onEditChanged: messageInput.forceActiveFocus()
target: room
}
Connections {
function onFocusInput() {
messageInput.forceActiveFocus();
}
target: TimelineManager
onFocusInput: messageInput.forceActiveFocus()
}
MouseArea {
@ -331,7 +348,7 @@ Rectangle {
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) {
onClicked: stickerPopup.visible ? stickerPopup.close() : stickerPopup.show(stickerButton, room.roomId, function(row) {
room.input.sticker(stickerPopup.model.sourceModel, row);
TimelineManager.focusMessageInput();
})
@ -355,7 +372,7 @@ Rectangle {
image: ":/icons/icons/ui/smile.png"
ToolTip.visible: hovered
ToolTip.text: qsTr("Emoji")
onClicked: emojiPopup.visible ? emojiPopup.close() : emojiPopup.show(function(emoji) {
onClicked: emojiPopup.visible ? emojiPopup.close() : emojiPopup.show(emojiButton, function(emoji) {
messageInput.insert(messageInput.cursorPosition, emoji);
TimelineManager.focusMessageInput();
})

View file

@ -10,7 +10,7 @@ import QtGraphicalEffects 1.0
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.2
import QtQuick.Window 2.2
import QtQuick.Window 2.13
import im.nheko 1.0
ScrollView {
@ -200,15 +200,22 @@ ScrollView {
}
Connections {
function onFocusChanged() {
readTimer.running = TimelineManager.isWindowFocused;
}
target: TimelineManager
onFocusChanged: readTimer.running = TimelineManager.isWindowFocused
}
Timer {
id: readTimer
// force current read index to update
onTriggered: chat.model.setCurrentIndex(chat.model.currentIndex)
onTriggered: {
if (chat.model)
chat.model.setCurrentIndex(chat.model.currentIndex);
}
interval: 1000
}
@ -265,11 +272,15 @@ ScrollView {
}
Connections {
target: chat.model
onRoomAvatarUrlChanged: {
function onRoomAvatarUrlChanged() {
messageUserAvatar.url = chat.model.avatarUrl(userId).replace("mxc://", "image://MxcImage/");
}
onScrollToIndex: chat.positionViewAtIndex(index, ListView.Visible)
function onScrollToIndex(index) {
chat.positionViewAtIndex(index, ListView.Visible);
}
target: chat.model
}
Label {
@ -338,9 +349,11 @@ ScrollView {
required property string callType
required property var reactions
required property int trustlevel
required property int encryptionError
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
@ -444,8 +457,10 @@ ScrollView {
callType: wrapper.callType
reactions: wrapper.reactions
trustlevel: wrapper.trustlevel
encryptionError: wrapper.encryptionError
timestamp: wrapper.timestamp
status: wrapper.status
relatedEventCacheBuster: wrapper.relatedEventCacheBuster
y: section.visible && section.active ? section.y + section.height : 0
HoverHandler {
@ -465,22 +480,34 @@ ScrollView {
}
Connections {
target: chat
onMovementEnded: {
function onMovementEnded() {
if (y + height + 2 * chat.spacing > chat.contentY + chat.height && y < chat.contentY + chat.height)
chat.model.currentIndex = index;
}
target: chat
}
}
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
}
}
}
@ -555,7 +582,7 @@ ScrollView {
Platform.MenuItem {
text: qsTr("Read receip&ts")
onTriggered: room.readReceiptsAction(messageContextMenu.eventId)
onTriggered: room.showReadReceipts(messageContextMenu.eventId)
}
Platform.MenuItem {

View file

@ -13,8 +13,7 @@ Item {
property int screenTimeout
Connections {
target: TimelineManager
onFocusChanged: {
function onFocusChanged() {
if (TimelineManager.isWindowFocused) {
screenSaverTimer.stop();
screenSaver.state = "Invisible";
@ -24,6 +23,8 @@ Item {
}
}
target: TimelineManager
}
Timer {

View file

@ -71,15 +71,17 @@ Popup {
}
Connections {
onCompletionSelected: {
function onCompletionSelected(id) {
Rooms.setCurrentRoom(id);
quickSwitcher.close();
}
onCountChanged: {
function onCountChanged() {
if (completerPopup.count > 0 && (completerPopup.currentIndex < 0 || completerPopup.currentIndex >= completerPopup.count))
completerPopup.currentIndex = 0;
}
target: completerPopup
}

View file

@ -0,0 +1,52 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import QtQuick 2.15
import QtQuick.Controls 2.15
import im.nheko 1.0
ApplicationWindow {
id: rawMessageRoot
property alias rawMessage: rawMessageView.text
height: 420
width: 420
palette: Nheko.colors
color: Nheko.colors.window
flags: Qt.Tool | Qt.WindowStaysOnTopHint | Qt.WindowCloseButtonHint
Component.onCompleted: Nheko.reparent(rawMessageRoot)
Shortcut {
sequence: StandardKey.Cancel
onActivated: rawMessageRoot.close()
}
ScrollView {
anchors.margins: Nheko.paddingMedium
anchors.fill: parent
palette: Nheko.colors
padding: Nheko.paddingMedium
TextArea {
id: rawMessageView
font: Nheko.monospaceFont()
color: Nheko.colors.text
readOnly: true
background: Rectangle {
color: Nheko.colors.base
}
}
}
footer: DialogButtonBox {
standardButtons: DialogButtonBox.Ok
onAccepted: rawMessageRoot.close()
}
}

View file

@ -0,0 +1,130 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import im.nheko 1.0
ApplicationWindow {
id: readReceiptsRoot
property ReadReceiptsProxy readReceipts
property Room room
height: 380
width: 340
minimumHeight: 380
minimumWidth: headerTitle.width + 2 * Nheko.paddingMedium
palette: Nheko.colors
color: Nheko.colors.window
flags: Qt.Dialog | Qt.WindowCloseButtonHint
Component.onCompleted: Nheko.reparent(readReceiptsRoot)
Shortcut {
sequence: StandardKey.Cancel
onActivated: readReceiptsRoot.close()
}
ColumnLayout {
anchors.fill: parent
anchors.margins: Nheko.paddingMedium
spacing: Nheko.paddingMedium
Label {
id: headerTitle
color: Nheko.colors.text
Layout.alignment: Qt.AlignCenter
text: qsTr("Read receipts")
font.pointSize: fontMetrics.font.pointSize * 1.5
}
ScrollView {
palette: Nheko.colors
padding: Nheko.paddingMedium
ScrollBar.horizontal.visible: false
Layout.fillHeight: true
Layout.minimumHeight: 200
Layout.fillWidth: true
ListView {
id: readReceiptsList
clip: true
spacing: Nheko.paddingMedium
boundsBehavior: Flickable.StopAtBounds
model: readReceipts
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: room.openUserProfile(model.mxid)
ToolTip.visible: avatarHover.hovered
ToolTip.text: model.mxid
HoverHandler {
id: avatarHover
}
}
ColumnLayout {
spacing: Nheko.paddingSmall
Label {
text: model.displayName
color: TimelineManager.userColor(model ? model.mxid : "", Nheko.colors.window)
font.pointSize: fontMetrics.font.pointSize
ToolTip.visible: displayNameHover.hovered
ToolTip.text: model.mxid
TapHandler {
onSingleTapped: room.openUserProfile(userId)
}
CursorShape {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
}
HoverHandler {
id: displayNameHover
}
}
Label {
text: model.timestamp
color: Nheko.colors.buttonText
font.pointSize: fontMetrics.font.pointSize * 0.9
}
Item {
Layout.fillHeight: true
Layout.fillWidth: true
}
}
}
}
}
}
footer: DialogButtonBox {
standardButtons: DialogButtonBox.Ok
onAccepted: readReceiptsRoot.close()
}
}

View file

@ -32,11 +32,12 @@ Page {
}
Connections {
onActiveTimelineChanged: {
roomlist.positionViewAtIndex(Rooms.roomidToIndex(Rooms.currentRoom.roomId()), ListView.Contain);
console.log("Test" + Rooms.currentRoom.roomId() + " " + Rooms.roomidToIndex(Rooms.currentRoom.roomId()));
function onCurrentRoomChanged() {
roomlist.positionViewAtIndex(Rooms.roomidToIndex(Rooms.currentRoom.roomId), ListView.Contain);
console.log("Test" + Rooms.currentRoom.roomId + " " + Rooms.roomidToIndex(Rooms.currentRoom.roomId));
}
target: TimelineManager
target: Rooms
}
Platform.Menu {
@ -61,9 +62,19 @@ Page {
}
}
Platform.MessageDialog {
id: leaveRoomDialog
title: qsTr("Leave Room")
text: qsTr("Are you sure you want to leave this room?")
modality: Qt.ApplicationModal
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 +144,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 +158,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
@ -161,31 +172,38 @@ Page {
}
]
TapHandler {
margin: -Nheko.paddingSmall
acceptedButtons: Qt.RightButton
onSingleTapped: {
if (!TimelineManager.isInvite)
roomContextMenu.show(roomId, tags);
// NOTE(Nico): We want to prevent the touch areas from overlapping. For some reason we need to add 1px of padding for that...
Item {
anchors.fill: parent
anchors.margins: 1
TapHandler {
acceptedButtons: Qt.RightButton
onSingleTapped: {
if (!TimelineManager.isInvite)
roomContextMenu.show(roomId, tags);
}
gesturePolicy: TapHandler.ReleaseWithinBounds
acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus | PointerDevice.TouchPad
}
gesturePolicy: TapHandler.ReleaseWithinBounds
}
TapHandler {
margin: -Nheko.paddingSmall
onSingleTapped: Rooms.setCurrentRoom(roomId)
onLongPressed: {
if (!isInvite)
roomContextMenu.show(roomId, tags);
TapHandler {
margin: -Nheko.paddingSmall
onSingleTapped: Rooms.setCurrentRoom(roomId)
onLongPressed: {
if (!isInvite)
roomContextMenu.show(roomId, tags);
}
}
}
HoverHandler {
id: hovered
HoverHandler {
id: hovered
acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus | PointerDevice.TouchPad
}
margin: -Nheko.paddingSmall
}
RowLayout {
@ -421,6 +439,7 @@ Page {
url: (userInfoGrid.profile ? userInfoGrid.profile.avatarUrl : "").replace("mxc://", "image://MxcImage/")
displayName: userInfoGrid.profile ? userInfoGrid.profile.displayName : ""
userid: userInfoGrid.profile ? userInfoGrid.profile.userid : ""
enabled: false
}
ColumnLayout {

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.13
import im.nheko 1.0
ApplicationWindow {
id: roomMembersRoot
property MemberList members
title: qsTr("Members of %1").arg(members.roomName)
height: 650
width: 420
minimumHeight: 420
palette: Nheko.colors
color: Nheko.colors.window
flags: Qt.Dialog | Qt.WindowCloseButtonHint
Component.onCompleted: Nheko.reparent(roomMembersRoot)
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,10 +4,10 @@
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
import QtQuick.Window 2.13
import im.nheko 1.0
ApplicationWindow {
@ -15,14 +15,13 @@ ApplicationWindow {
property var roomSettings
x: MainWindow.x + (MainWindow.width / 2) - (width / 2)
y: MainWindow.y + (MainWindow.height / 2) - (height / 2)
minimumWidth: 420
minimumHeight: 650
palette: Nheko.colors
color: Nheko.colors.window
modality: Qt.NonModal
flags: Qt.Dialog
flags: Qt.Dialog | Qt.WindowCloseButtonHint
Component.onCompleted: Nheko.reparent(roomSettingsDialog)
title: qsTr("Room Settings")
Shortcut {
@ -98,13 +97,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
}
}
}
@ -145,7 +154,7 @@ ApplicationWindow {
GridLayout {
columns: 2
rowSpacing: 10
rowSpacing: Nheko.paddingLarge
MatrixText {
text: qsTr("SETTINGS")
@ -171,7 +180,7 @@ ApplicationWindow {
}
MatrixText {
text: "Room access"
text: qsTr("Room access")
Layout.fillWidth: true
}
@ -209,7 +218,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 ;
@ -223,19 +232,13 @@ ApplicationWindow {
}
MatrixText {
visible: roomSettings.isEncryptionEnabled
text: qsTr("Respond to key requests")
text: qsTr("Sticker & Emote Settings")
}
ToggleButton {
visible: roomSettings.isEncryptionEnabled
ToolTip.text: qsTr("Whether or not the client should respond automatically with the session keys
upon request. Use with caution, this is a temporary measure to test the
E2E implementation until device verification is completed.")
checked: roomSettings.respondsToKeyRequests
onClicked: {
roomSettings.changeKeyRequestsPreference(checked);
}
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
}
@ -264,7 +267,7 @@ ApplicationWindow {
MatrixText {
text: roomSettings.roomId
font.pixelSize: 14
font.pixelSize: fontMetrics.font.pixelSize * 1.2
Layout.alignment: Qt.AlignRight
}
@ -274,16 +277,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,14 +4,15 @@
import "./delegates"
import "./device-verification"
import "./dialogs"
import "./emoji"
import "./voip"
import Qt.labs.platform 1.1 as Platform
import QtGraphicalEffects 1.0
import QtQuick 2.9
import QtQuick.Controls 2.5
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.3
import QtQuick.Window 2.2
import QtQuick.Window 2.15
import im.nheko 1.0
import im.nheko.EmojiModel 1.0
@ -47,6 +48,14 @@ Page {
}
Component {
id: roomMembersComponent
RoomMembers {
}
}
Component {
id: mobileCallInviteDialog
@ -63,6 +72,46 @@ Page {
}
Component {
id: deviceVerificationDialog
DeviceVerification {
}
}
Component {
id: inviteDialog
InviteDialog {
}
}
Component {
id: packSettingsComponent
ImagePackSettingsDialog {
}
}
Component {
id: readReceiptsDialog
ReadReceipts {
}
}
Component {
id: rawMessageDialog
RawMessageDialog {
}
}
Shortcut {
sequence: "Ctrl+K"
onActivated: {
@ -82,38 +131,64 @@ Page {
onActivated: Rooms.previousRoom()
}
Component {
id: deviceVerificationDialog
DeviceVerification {
}
}
Connections {
target: TimelineManager
onNewDeviceVerificationRequest: {
function onNewDeviceVerificationRequest(flow) {
var dialog = deviceVerificationDialog.createObject(timelineRoot, {
"flow": flow
});
dialog.show();
}
onOpenProfile: {
function onOpenProfile(profile) {
var userProfile = userProfileComponent.createObject(timelineRoot, {
"profile": profile
});
userProfile.show();
}
function onShowImagePackSettings(packlist) {
var packSet = packSettingsComponent.createObject(timelineRoot, {
"packlist": packlist
});
packSet.show();
}
function onOpenRoomMembersDialog(members) {
var membersDialog = roomMembersComponent.createObject(timelineRoot, {
"members": members,
"roomName": Rooms.currentRoom.roomName
});
membersDialog.show();
}
function onOpenRoomSettingsDialog(settings) {
var roomSettings = roomSettingsComponent.createObject(timelineRoot, {
"roomSettings": settings
});
roomSettings.show();
}
function onOpenInviteUsersDialog(invitees) {
var dialog = inviteDialog.createObject(timelineRoot, {
"roomId": Rooms.currentRoom.roomId,
"plainRoomName": Rooms.currentRoom.plainRoomName,
"invitees": invitees
});
dialog.show();
}
target: TimelineManager
}
Connections {
target: CallManager
onNewInviteState: {
function onNewInviteState() {
if (CallManager.haveCallInvite && Settings.mobileMode) {
var dialog = mobileCallInviteDialog.createObject(msgView);
dialog.open();
}
}
target: CallManager
}
ChatPage {

View file

@ -23,6 +23,9 @@ MouseArea {
// console.warn("Delta: ", wheel.pixelDelta.y);
// console.warn("Old position: ", flickable.contentY);
// console.warn("New position: ", newPos);
// breaks ListView's with headers...
//if (typeof (flickableItem.headerItem) !== "undefined" && flickableItem.headerItem)
// minYExtent += flickableItem.headerItem.height;
id: root
@ -55,9 +58,6 @@ MouseArea {
var minYExtent = flickableItem.originY + flickableItem.topMargin;
var maxYExtent = (flickableItem.contentHeight + flickableItem.bottomMargin + flickableItem.originY) - flickableItem.height;
if (typeof (flickableItem.headerItem) !== "undefined" && flickableItem.headerItem)
minYExtent += flickableItem.headerItem.height;
//Avoid overscrolling
return Math.max(minYExtent, Math.min(maxYExtent, flickableItem.contentY - pixelDelta));
}

View file

@ -34,7 +34,7 @@ ImageButton {
}
onClicked: {
if (status == MtxEvent.Read)
room.readReceiptsAction(eventId);
room.showReadReceipts(eventId);
}
image: {

View file

@ -7,7 +7,7 @@ import "./emoji"
import QtQuick 2.12
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.2
import QtQuick.Window 2.2
import QtQuick.Window 2.13
import im.nheko 1.0
Item {
@ -38,8 +38,10 @@ Item {
required property string callType
required property var reactions
required property int trustlevel
required property int encryptionError
required property var timestamp
required property int status
required property int relatedEventCacheBuster
anchors.left: parent.left
anchors.right: parent.right
@ -90,25 +92,27 @@ Item {
}
visible: replyTo
userColor: replyTo, TimelineManager.userColor(userId, Nheko.colors.base)
blurhash: replyTo, fromModel(Room.Blurhash) ?? ""
body: replyTo, fromModel(Room.Body) ?? ""
formattedBody: replyTo, 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: replyTo, fromModel(Room.Filename) ?? ""
filesize: replyTo, fromModel(Room.Filesize) ?? ""
proportionalHeight: replyTo, fromModel(Room.ProportionalHeight) ?? 1
type: replyTo, fromModel(Room.Type) ?? MtxEvent.UnknownMessage
typeString: replyTo, fromModel(Room.TypeString) ?? ""
url: replyTo, fromModel(Room.Url) ?? ""
originalWidth: replyTo, fromModel(Room.OriginalWidth) ?? 0
isOnlyEmoji: replyTo, fromModel(Room.IsOnlyEmoji) ?? false
userId: replyTo, fromModel(Room.UserId) ?? ""
userName: replyTo, fromModel(Room.UserName) ?? ""
thumbnailUrl: replyTo, fromModel(Room.ThumbnailUrl) ?? ""
roomTopic: replyTo, fromModel(Room.RoomTopic) ?? ""
roomName: replyTo, fromModel(Room.RoomName) ?? ""
callType: replyTo, 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) ?? ""
encryptionError: r.relatedEventCacheBuster, fromModel(Room.EncryptionError) ?? ""
relatedEventCacheBuster: r.relatedEventCacheBuster, fromModel(Room.RelatedEventCacheBuster) ?? 0
}
// actual message content
@ -134,6 +138,8 @@ Item {
roomTopic: r.roomTopic
roomName: r.roomName
callType: r.callType
encryptionError: r.encryptionError
relatedEventCacheBuster: r.relatedEventCacheBuster
isReply: false
}

View file

@ -13,7 +13,7 @@ import QtGraphicalEffects 1.0
import QtQuick 2.9
import QtQuick.Controls 2.5
import QtQuick.Layouts 1.3
import QtQuick.Window 2.2
import QtQuick.Window 2.13
import im.nheko 1.0
import im.nheko.EmojiModel 1.0
@ -246,17 +246,26 @@ Item {
NhekoDropArea {
anchors.fill: parent
roomid: room ? room.roomId() : ""
roomid: room ? room.roomId : ""
}
Connections {
target: room
onOpenRoomSettingsDialog: {
var roomSettings = roomSettingsComponent.createObject(timelineRoot, {
"roomSettings": settings
function onOpenReadReceiptsDialog(rr) {
var dialog = readReceiptsDialog.createObject(timelineRoot, {
"readReceipts": rr,
"room": room
});
roomSettings.show();
dialog.show();
}
function onShowRawMessageDialog(rawMessage) {
var dialog = rawMessageDialog.createObject(timelineRoot, {
"rawMessage": rawMessage
});
dialog.show();
}
target: room
}
}

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

@ -4,19 +4,20 @@
import "./device-verification"
import "./ui"
import QtQuick 2.9
import QtQuick.Controls 2.3
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.2
import QtQuick.Window 2.3
import QtQuick.Window 2.13
import im.nheko 1.0
ApplicationWindow {
// this does not work in ApplicationWindow, just in Window
//transientParent: Nheko.mainwindow()
id: userProfileDialog
property var profile
x: MainWindow.x + (MainWindow.width / 2) - (width / 2)
y: MainWindow.y + (MainWindow.height / 2) - (height / 2)
height: 650
width: 420
minimumHeight: 420
@ -24,7 +25,8 @@ ApplicationWindow {
color: Nheko.colors.window
title: profile.isGlobalUserProfile ? qsTr("Global User Profile") : qsTr("Room User Profile")
modality: Qt.NonModal
flags: Qt.Dialog
flags: Qt.Dialog | Qt.WindowCloseButtonHint
Component.onCompleted: Nheko.reparent(userProfileDialog)
Shortcut {
sequence: StandardKey.Cancel
@ -83,12 +85,13 @@ ApplicationWindow {
}
Connections {
target: profile
onDisplayError: {
function onDisplayError(errorMessage) {
errorText.text = errorMessage;
errorText.opacity = 1;
hideErrorAnimation.restart();
}
target: profile
}
TextInput {

View file

@ -0,0 +1,133 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import ".."
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import im.nheko 1.0
Rectangle {
id: tile
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
property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 2.3)
required property string avatarUrl
required property string title
required property string subtitle
required property int index
required property int selectedIndex
property bool crop: true
color: background
height: avatarSize + 2 * Nheko.paddingMedium
width: ListView.view.width
state: "normal"
states: [
State {
name: "highlight"
when: hovered.hovered && !(index == selectedIndex)
PropertyChanges {
target: tile
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 == selectedIndex
PropertyChanges {
target: tile
background: Nheko.colors.highlight
importantText: Nheko.colors.highlightedText
unimportantText: Nheko.colors.highlightedText
bubbleBackground: Nheko.colors.highlightedText
bubbleText: Nheko.colors.highlight
}
}
]
HoverHandler {
id: hovered
}
RowLayout {
spacing: Nheko.paddingMedium
anchors.fill: parent
anchors.margins: Nheko.paddingMedium
Avatar {
id: avatar
enabled: false
Layout.alignment: Qt.AlignVCenter
height: avatarSize
width: avatarSize
url: tile.avatarUrl.replace("mxc://", "image://MxcImage/")
displayName: title
crop: tile.crop
}
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: tile.importantText
elideWidth: textContent.width - Nheko.paddingMedium
fullText: title
textFormat: Text.PlainText
}
Item {
Layout.fillWidth: true
}
}
RowLayout {
Layout.fillWidth: true
spacing: 0
ElidedLabel {
color: tile.unimportantText
font.pixelSize: fontMetrics.font.pixelSize * 0.9
elideWidth: textContent.width - Nheko.paddingSmall
fullText: subtitle
textFormat: Text.PlainText
}
Item {
Layout.fillWidth: true
}
}
}
}
}

View file

@ -0,0 +1,48 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import ".."
import QtQuick.Controls 2.1
import QtQuick.Layouts 1.2
import im.nheko 1.0
ColumnLayout {
id: r
required property int encryptionError
required property string eventId
width: parent ? parent.width : undefined
MatrixText {
text: {
switch (encryptionError) {
case Olm.MissingSession:
return qsTr("There is no key to unlock this message. We requested the key automatically, but you can try requesting it again if you are impatient.");
case Olm.MissingSessionIndex:
return qsTr("This message couldn't be decrypted, because we only have a key for newer messages. You can try requesting access to this message.");
case Olm.DbError:
return qsTr("There was an internal error reading the decryption key from the database.");
case Olm.DecryptionFailed:
return qsTr("There was an error decrypting this message.");
case Olm.ParsingFailed:
return qsTr("The message couldn't be parsed.");
case Olm.ReplayAttack:
return qsTr("The encryption key was reused! Someone is possibly trying to insert false messages into this chat!");
default:
return qsTr("Unknown decryption error");
}
}
color: Nheko.colors.buttonText
width: r ? r.width : undefined
}
Button {
palette: Nheko.colors
visible: encryptionError == Olm.MissingSession || encryptionError == Olm.MissingSessionIndex
text: qsTr("Request key")
onClicked: room.requestKeyForEvent(eventId)
}
}

View file

@ -29,6 +29,8 @@ Item {
required property string roomTopic
required property string roomName
required property string callType
required property int encryptionError
required property int relatedEventCacheBuster
height: chooser.childrenRect.height
@ -188,6 +190,16 @@ Item {
}
DelegateChoice {
roleValue: MtxEvent.Encrypted
Encrypted {
encryptionError: d.encryptionError
eventId: d.eventId
}
}
DelegateChoice {
roleValue: MtxEvent.Name
@ -231,7 +243,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 +313,7 @@ Item {
body: formatted
isOnlyEmoji: false
isReply: d.isReply
formatted: room.formatPowerLevelEvent(d.eventId)
formatted: d.relatedEventCacheBuster, room.formatPowerLevelEvent(d.eventId)
}
}
@ -313,7 +325,7 @@ Item {
body: formatted
isOnlyEmoji: false
isReply: d.isReply
formatted: room.formatJoinRuleEvent(d.eventId)
formatted: d.relatedEventCacheBuster, room.formatJoinRuleEvent(d.eventId)
}
}
@ -325,7 +337,7 @@ Item {
body: formatted
isOnlyEmoji: false
isReply: d.isReply
formatted: room.formatHistoryVisibilityEvent(d.eventId)
formatted: d.relatedEventCacheBuster, room.formatHistoryVisibilityEvent(d.eventId)
}
}
@ -337,7 +349,7 @@ Item {
body: formatted
isOnlyEmoji: false
isReply: d.isReply
formatted: room.formatGuestAccessEvent(d.eventId)
formatted: d.relatedEventCacheBuster, room.formatGuestAccessEvent(d.eventId)
}
}
@ -349,7 +361,7 @@ Item {
body: formatted
isOnlyEmoji: false
isReply: d.isReply
formatted: room.formatMemberEvent(d.eventId)
formatted: d.relatedEventCacheBuster, room.formatMemberEvent(d.eventId)
}
}

View file

@ -52,7 +52,7 @@ ColumnLayout {
id: mediaCachedObserver
target: room
onMediaCached: {
function onMediaCached(mxcUrl, cacheUrl) {
if (mxcUrl == url) {
mediaCached = true
media.source = "file://" + cacheUrl

View file

@ -5,7 +5,7 @@
import QtQuick 2.12
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.2
import QtQuick.Window 2.2
import QtQuick.Window 2.13
import im.nheko 1.0
Item {
@ -30,6 +30,8 @@ Item {
property string roomTopic
property string roomName
property string callType
property int encryptionError
property int relatedEventCacheBuster
width: parent.width
height: replyContainer.height
@ -95,6 +97,8 @@ Item {
roomTopic: r.roomTopic
roomName: r.roomName
callType: r.callType
relatedEventCacheBuster: r.relatedEventCacheBuster
encryptionError: r.encryptionError
enabled: false
width: parent.width
isReply: true

View file

@ -4,7 +4,7 @@
import QtQuick 2.10
import QtQuick.Controls 2.3
import QtQuick.Window 2.10
import QtQuick.Window 2.13
import im.nheko 1.0
ApplicationWindow {
@ -14,13 +14,12 @@ ApplicationWindow {
onClosing: TimelineManager.removeVerificationFlow(flow)
title: stack.currentItem.title
flags: Qt.Dialog
modality: Qt.NonModal
palette: Nheko.colors
height: stack.implicitHeight
width: stack.implicitWidth
x: MainWindow.x + (MainWindow.width / 2) - (width / 2)
y: MainWindow.y + (MainWindow.height / 2) - (height / 2)
flags: Qt.Dialog | Qt.WindowCloseButtonHint
Component.onCompleted: Nheko.reparent(dialog)
StackView {
id: stack

View file

@ -0,0 +1,301 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
import ".."
import "../components"
import Qt.labs.platform 1.1
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import im.nheko 1.0
ApplicationWindow {
//Component.onCompleted: Nheko.reparent(win)
id: win
property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 2.3)
property SingleImagePackModel imagePack
property int currentImageIndex: -1
readonly property int stickerDim: 128
readonly property int stickerDimPad: 128 + Nheko.paddingSmall
title: qsTr("Editing image pack")
height: 600
width: 600
palette: Nheko.colors
color: Nheko.colors.base
modality: Qt.WindowModal
flags: Qt.Dialog | Qt.WindowCloseButtonHint
AdaptiveLayout {
id: adaptiveView
anchors.fill: parent
singlePageMode: false
pageIndex: 0
AdaptiveLayoutElement {
id: packlistC
visible: Settings.groupView
minimumWidth: 200
collapsedWidth: 200
preferredWidth: 300
maximumWidth: 300
clip: true
ListView {
//required property bool isEmote
//required property bool isSticker
model: imagePack
ScrollHelper {
flickable: parent
anchors.fill: parent
enabled: !Settings.mobileMode
}
header: AvatarListTile {
title: imagePack.packname
avatarUrl: imagePack.avatarUrl
subtitle: imagePack.statekey
index: -1
selectedIndex: currentImageIndex
TapHandler {
onSingleTapped: currentImageIndex = -1
}
Rectangle {
anchors.left: parent.left
anchors.verticalCenter: parent.verticalCenter
height: parent.height - Nheko.paddingSmall * 2
width: 3
color: Nheko.colors.highlight
}
}
footer: Button {
palette: Nheko.colors
onClicked: addFilesDialog.open()
width: ListView.view.width
text: qsTr("Add images")
FileDialog {
id: addFilesDialog
folder: StandardPaths.writableLocation(StandardPaths.PicturesLocation)
fileMode: FileDialog.OpenFiles
nameFilters: [qsTr("Stickers (*.png *.webp)")]
onAccepted: imagePack.addStickers(files)
}
}
delegate: AvatarListTile {
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 shortCode
required property string url
required property string body
title: shortCode
subtitle: body
avatarUrl: url
selectedIndex: currentImageIndex
crop: false
TapHandler {
onSingleTapped: currentImageIndex = index
}
}
}
}
AdaptiveLayoutElement {
id: packinfoC
Rectangle {
color: Nheko.colors.window
GridLayout {
anchors.fill: parent
anchors.margins: Nheko.paddingMedium
visible: currentImageIndex == -1
enabled: visible
columns: 2
rowSpacing: Nheko.paddingLarge
Avatar {
Layout.columnSpan: 2
url: imagePack.avatarUrl.replace("mxc://", "image://MxcImage/")
displayName: imagePack.packname
height: 130
width: 130
crop: false
Layout.alignment: Qt.AlignHCenter
}
MatrixText {
visible: imagePack.roomid
text: qsTr("State key")
}
MatrixTextField {
visible: imagePack.roomid
Layout.fillWidth: true
text: imagePack.statekey
onTextEdited: imagePack.statekey = text
}
MatrixText {
text: qsTr("Packname")
}
MatrixTextField {
Layout.fillWidth: true
text: imagePack.packname
onTextEdited: imagePack.packname = text
}
MatrixText {
text: qsTr("Attrbution")
}
MatrixTextField {
Layout.fillWidth: true
text: imagePack.attribution
onTextEdited: imagePack.attribution = text
}
MatrixText {
text: qsTr("Use as Emoji")
}
ToggleButton {
checked: imagePack.isEmotePack
onClicked: imagePack.isEmotePack = checked
Layout.alignment: Qt.AlignRight
}
MatrixText {
text: qsTr("Use as Sticker")
}
ToggleButton {
checked: imagePack.isStickerPack
onClicked: imagePack.isStickerPack = checked
Layout.alignment: Qt.AlignRight
}
Item {
Layout.columnSpan: 2
Layout.fillHeight: true
}
}
GridLayout {
anchors.fill: parent
anchors.margins: Nheko.paddingMedium
visible: currentImageIndex >= 0
enabled: visible
columns: 2
rowSpacing: Nheko.paddingLarge
Avatar {
Layout.columnSpan: 2
url: imagePack.data(imagePack.index(currentImageIndex, 0), SingleImagePackModel.Url).replace("mxc://", "image://MxcImage/")
displayName: imagePack.data(imagePack.index(currentImageIndex, 0), SingleImagePackModel.ShortCode)
height: 130
width: 130
crop: false
Layout.alignment: Qt.AlignHCenter
}
MatrixText {
text: qsTr("Shortcode")
}
MatrixTextField {
Layout.fillWidth: true
text: imagePack.data(imagePack.index(currentImageIndex, 0), SingleImagePackModel.ShortCode)
onTextEdited: imagePack.setData(imagePack.index(currentImageIndex, 0), text, SingleImagePackModel.ShortCode)
}
MatrixText {
text: qsTr("Body")
}
MatrixTextField {
Layout.fillWidth: true
text: imagePack.data(imagePack.index(currentImageIndex, 0), SingleImagePackModel.Body)
onTextEdited: imagePack.setData(imagePack.index(currentImageIndex, 0), text, SingleImagePackModel.Body)
}
MatrixText {
text: qsTr("Use as Emoji")
}
ToggleButton {
checked: imagePack.data(imagePack.index(currentImageIndex, 0), SingleImagePackModel.IsEmote)
onClicked: imagePack.setData(imagePack.index(currentImageIndex, 0), checked, SingleImagePackModel.IsEmote)
Layout.alignment: Qt.AlignRight
}
MatrixText {
text: qsTr("Use as Sticker")
}
ToggleButton {
checked: imagePack.data(imagePack.index(currentImageIndex, 0), SingleImagePackModel.IsSticker)
onClicked: imagePack.setData(imagePack.index(currentImageIndex, 0), checked, SingleImagePackModel.IsSticker)
Layout.alignment: Qt.AlignRight
}
Item {
Layout.columnSpan: 2
Layout.fillHeight: true
}
}
}
}
}
footer: DialogButtonBox {
id: buttons
Button {
text: qsTr("Cancel")
DialogButtonBox.buttonRole: DialogButtonBox.DestructiveRole
onClicked: win.close()
}
Button {
text: qsTr("Save")
DialogButtonBox.buttonRole: DialogButtonBox.ApplyRole
onClicked: {
imagePack.save();
win.close();
}
}
}
}

View file

@ -0,0 +1,260 @@
// 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")
height: 600
width: 800
palette: Nheko.colors
color: Nheko.colors.base
modality: Qt.NonModal
flags: Qt.Dialog | Qt.WindowCloseButtonHint
Component.onCompleted: Nheko.reparent(win)
Component {
id: packEditor
ImagePackEditorDialog {
}
}
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
}
footer: ColumnLayout {
Button {
palette: Nheko.colors
onClicked: {
var dialog = packEditor.createObject(timelineRoot, {
"imagePack": packlist.newPack(false)
});
dialog.show();
}
width: packlist.width
visible: !packlist.containsAccountPack
text: qsTr("Create account pack")
}
Button {
palette: Nheko.colors
onClicked: {
var dialog = packEditor.createObject(timelineRoot, {
"imagePack": packlist.newPack(true)
});
dialog.show();
}
width: packlist.width
text: qsTr("New room pack")
}
}
delegate: AvatarListTile {
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 bool fromAccountData
required property bool fromCurrentRoom
title: displayName
subtitle: {
if (fromAccountData)
return qsTr("Private pack");
else if (fromCurrentRoom)
return qsTr("Pack from this room");
else
return qsTr("Globally enabled pack");
}
selectedIndex: currentPackIndex
TapHandler {
onSingleTapped: currentPackIndex = index
}
}
}
}
AdaptiveLayoutElement {
id: packinfoC
Rectangle {
color: Nheko.colors.window
ColumnLayout {
id: packinfo
property string packName: currentPack ? currentPack.packname : ""
property string attribution: currentPack ? currentPack.attribution : ""
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: Math.ceil(fontMetrics.pixelSize * 1.1)
horizontalAlignment: TextEdit.AlignHCenter
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: packinfoC.width - Nheko.paddingLarge * 2
}
MatrixText {
text: packinfo.attribution
wrapMode: TextEdit.Wrap
horizontalAlignment: TextEdit.AlignHCenter
Layout.alignment: Qt.AlignHCenter
Layout.preferredWidth: packinfoC.width - Nheko.paddingLarge * 2
}
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
}
}
Button {
Layout.alignment: Qt.AlignHCenter
text: qsTr("Edit")
enabled: currentPack.canEdit
onClicked: {
var dialog = packEditor.createObject(timelineRoot, {
"imagePack": currentPack
});
dialog.show();
}
}
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

@ -16,6 +16,7 @@ ApplicationWindow {
modality: Qt.NonModal
flags: Qt.Dialog
Component.onCompleted: Nheko.reparent(inputDialog)
width: 350
height: fontMetrics.lineSpacing * 7

View file

@ -122,7 +122,6 @@ Menu {
id: gridView
model: roomid ? TimelineManager.completerFor("stickers", roomid) : null
Layout.preferredHeight: cellHeight * 3.5
Layout.preferredWidth: stickersPerRow * stickerDimPad + 20
Layout.leftMargin: 4

View file

@ -23,12 +23,13 @@ Popup {
}
Connections {
target: CallManager
onNewInviteState: {
function onNewInviteState() {
if (!CallManager.haveCallInvite)
close();
}
target: CallManager
}
ColumnLayout {

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

@ -10,7 +10,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>
@ -56,22 +55,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>
@ -79,7 +73,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>
@ -100,16 +93,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>
@ -124,7 +113,6 @@
</qresource>
<qresource prefix="/">
<file>qtquickcontrols2.conf</file>
<file>qml/Root.qml</file>
<file>qml/ChatPage.qml</file>
<file>qml/CommunitiesList.qml</file>
@ -156,14 +144,15 @@
<file>qml/emoji/StickerPicker.qml</file>
<file>qml/UserProfile.qml</file>
<file>qml/delegates/MessageDelegate.qml</file>
<file>qml/delegates/TextMessage.qml</file>
<file>qml/delegates/NoticeMessage.qml</file>
<file>qml/delegates/ImageMessage.qml</file>
<file>qml/delegates/PlayableMediaMessage.qml</file>
<file>qml/delegates/Encrypted.qml</file>
<file>qml/delegates/FileMessage.qml</file>
<file>qml/delegates/ImageMessage.qml</file>
<file>qml/delegates/NoticeMessage.qml</file>
<file>qml/delegates/Pill.qml</file>
<file>qml/delegates/Placeholder.qml</file>
<file>qml/delegates/PlayableMediaMessage.qml</file>
<file>qml/delegates/Reply.qml</file>
<file>qml/delegates/TextMessage.qml</file>
<file>qml/device-verification/Waiting.qml</file>
<file>qml/device-verification/DeviceVerification.qml</file>
<file>qml/device-verification/DigitVerification.qml</file>
@ -172,6 +161,8 @@
<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/dialogs/ImagePackEditorDialog.qml</file>
<file>qml/ui/Ripple.qml</file>
<file>qml/ui/Spinner.qml</file>
<file>qml/ui/animations/BlinkAnimation.qml</file>
@ -185,7 +176,12 @@
<file>qml/voip/VideoCall.qml</file>
<file>qml/components/AdaptiveLayout.qml</file>
<file>qml/components/AdaptiveLayoutElement.qml</file>
<file>qml/components/AvatarListTile.qml</file>
<file>qml/components/FlatButton.qml</file>
<file>qml/RoomMembers.qml</file>
<file>qml/InviteDialog.qml</file>
<file>qml/ReadReceipts.qml</file>
<file>qml/RawMessageDialog.qml</file>
</qresource>
<qresource prefix="/media">
<file>media/ring.ogg</file>

View file

@ -125,7 +125,7 @@ template<class T>
bool
containsStateUpdates(const T &e)
{
return std::visit([](const auto &ev) { return Cache::isStateEvent(ev); }, e);
return std::visit([](const auto &ev) { return Cache::isStateEvent_<decltype(ev)>; }, e);
}
bool
@ -158,7 +158,7 @@ Cache::isHiddenEvent(lmdb::txn &txn,
index.session_id = encryptedEvent->content.session_id;
index.sender_key = encryptedEvent->content.sender_key;
auto result = olm::decryptEvent(index, *encryptedEvent);
auto result = olm::decryptEvent(index, *encryptedEvent, true);
if (!result.error)
e = result.event.value();
}
@ -288,6 +288,9 @@ Cache::setup()
outboundMegolmSessionDb_ = lmdb::dbi::open(txn, OUTBOUND_MEGOLM_SESSIONS_DB, MDB_CREATE);
megolmSessionDataDb_ = lmdb::dbi::open(txn, MEGOLM_SESSIONS_DATA_DB, MDB_CREATE);
// What rooms are encrypted
encryptedRooms_ = lmdb::dbi::open(txn, ENCRYPTED_ROOMS_DB, MDB_CREATE);
txn.commit();
databaseReady_ = true;
@ -298,8 +301,7 @@ Cache::setEncryptedRoom(lmdb::txn &txn, const std::string &room_id)
{
nhlog::db()->info("mark room {} as encrypted", room_id);
auto db = lmdb::dbi::open(txn, ENCRYPTED_ROOMS_DB, MDB_CREATE);
db.put(txn, room_id, "0");
encryptedRooms_.put(txn, room_id, "0");
}
bool
@ -308,8 +310,7 @@ Cache::isRoomEncrypted(const std::string &room_id)
std::string_view unused;
auto txn = ro_txn(env_);
auto db = lmdb::dbi::open(txn, ENCRYPTED_ROOMS_DB, MDB_CREATE);
auto res = db.get(txn, room_id, unused);
auto res = encryptedRooms_.get(txn, room_id, unused);
return res;
}
@ -715,32 +716,29 @@ Cache::restoreOlmAccount()
}
void
Cache::storeSecret(const std::string &name, const std::string &secret)
Cache::storeSecret(const std::string name, const std::string secret)
{
auto settings = UserSettings::instance();
QKeychain::WritePasswordJob job(QCoreApplication::applicationName());
job.setAutoDelete(false);
job.setInsecureFallback(true);
job.setKey("matrix." +
QString(QCryptographicHash::hash(settings->profile().toUtf8(),
QCryptographicHash::Sha256)) +
"." + name.c_str());
job.setTextData(QString::fromStdString(secret));
QEventLoop loop;
job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit);
job.start();
loop.exec();
if (job.error()) {
nhlog::db()->warn(
"Storing secret '{}' failed: {}", name, job.errorString().toStdString());
} else {
emit secretChanged(name);
}
auto job = new QKeychain::WritePasswordJob(QCoreApplication::applicationName());
job->setInsecureFallback(true);
job->setKey("matrix." +
QString(QCryptographicHash::hash(settings->profile().toUtf8(),
QCryptographicHash::Sha256)) +
"." + name.c_str());
job->setTextData(QString::fromStdString(secret));
QObject::connect(job, &QKeychain::Job::finished, job, [name, this](QKeychain::Job *job) {
if (job->error()) {
nhlog::db()->warn(
"Storing secret '{}' failed: {}", name, job->errorString().toStdString());
} else {
emit secretChanged(name);
}
});
job->start();
}
void
Cache::deleteSecret(const std::string &name)
Cache::deleteSecret(const std::string name)
{
auto settings = UserSettings::instance();
QKeychain::DeletePasswordJob job(QCoreApplication::applicationName());
@ -750,6 +748,8 @@ Cache::deleteSecret(const std::string &name)
QString(QCryptographicHash::hash(settings->profile().toUtf8(),
QCryptographicHash::Sha256)) +
"." + name.c_str());
// FIXME(Nico): Nested event loops are dangerous. Some other slots may resume in the mean
// time!
QEventLoop loop;
job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit);
job.start();
@ -759,7 +759,7 @@ Cache::deleteSecret(const std::string &name)
}
std::optional<std::string>
Cache::secret(const std::string &name)
Cache::secret(const std::string name)
{
auto settings = UserSettings::instance();
QKeychain::ReadPasswordJob job(QCoreApplication::applicationName());
@ -769,6 +769,8 @@ Cache::secret(const std::string &name)
QString(QCryptographicHash::hash(settings->profile().toUtf8(),
QCryptographicHash::Sha256)) +
"." + name.c_str());
// FIXME(Nico): Nested event loops are dangerous. Some other slots may resume in the mean
// time!
QEventLoop loop;
job.connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit);
job.start();
@ -3383,26 +3385,30 @@ Cache::getChildRoomIds(const std::string &room_id)
}
std::vector<ImagePackInfo>
Cache::getImagePacks(const std::string &room_id, bool stickers)
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) {
if (!pack.pack || (stickers ? pack.pack->is_sticker() : pack.pack->is_emoji())) {
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;
if (pack.pack)
info.packname = pack.pack->display_name;
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() &&
if (stickers.has_value() && img.second.overrides_usage() &&
(stickers ? !img.second.is_sticker() : !img.second.is_emoji()))
continue;
info.images.insert(img);
info.pack.images.insert(img);
}
if (!info.images.empty())
if (!info.pack.images.empty())
infos.push_back(std::move(info));
}
};
@ -3414,7 +3420,7 @@ Cache::getImagePacks(const std::string &room_id, bool stickers)
std::get_if<mtx::events::EphemeralEvent<mtx::events::msc2545::ImagePack>>(
&*accountpack);
if (tmp)
addPack(tmp->content);
addPack(tmp->content, "", "");
}
// packs from rooms, that were enabled globally
@ -3433,7 +3439,7 @@ Cache::getImagePacks(const std::string &room_id, bool stickers)
if (auto pack =
getStateEvent<mtx::events::msc2545::ImagePack>(
txn, room_id2, state_id))
addPack(pack->content);
addPack(pack->content, room_id2, state_id);
}
}
}
@ -3441,16 +3447,23 @@ Cache::getImagePacks(const std::string &room_id, bool stickers)
// packs from current room
if (auto pack = getStateEvent<mtx::events::msc2545::ImagePack>(txn, room_id)) {
addPack(pack->content);
addPack(pack->content, room_id, "");
}
for (const auto &pack :
getStateEventsWithType<mtx::events::msc2545::ImagePack>(txn, room_id)) {
addPack(pack.content);
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)
{
@ -3529,7 +3542,7 @@ Cache::roomMembers(const std::string &room_id)
}
std::map<std::string, std::optional<UserKeyCache>>
Cache::getMembersWithKeys(const std::string &room_id)
Cache::getMembersWithKeys(const std::string &room_id, bool verified_only)
{
std::string_view keys;
@ -3546,10 +3559,51 @@ Cache::getMembersWithKeys(const std::string &room_id)
auto res = keysDb.get(txn, user_id, keys);
if (res) {
members[std::string(user_id)] =
json::parse(keys).get<UserKeyCache>();
auto k = json::parse(keys).get<UserKeyCache>();
if (verified_only) {
auto verif = verificationStatus(std::string(user_id));
if (verif.user_verified == crypto::Trust::Verified ||
!verif.verified_devices.empty()) {
auto keyCopy = k;
keyCopy.device_keys.clear();
std::copy_if(
k.device_keys.begin(),
k.device_keys.end(),
std::inserter(keyCopy.device_keys,
keyCopy.device_keys.end()),
[&verif](const auto &key) {
auto curve25519 = key.second.keys.find(
"curve25519:" + key.first);
if (curve25519 == key.second.keys.end())
return false;
if (auto t =
verif.verified_device_keys.find(
curve25519->second);
t ==
verif.verified_device_keys.end() ||
t->second != crypto::Trust::Verified)
return false;
return key.first ==
key.second.device_id &&
std::find(
verif.verified_devices.begin(),
verif.verified_devices.end(),
key.first) !=
verif.verified_devices.end();
});
if (!keyCopy.device_keys.empty())
members[std::string(user_id)] =
std::move(keyCopy);
}
} else {
members[std::string(user_id)] = std::move(k);
}
} else {
members[std::string(user_id)] = {};
if (!verified_only)
members[std::string(user_id)] = {};
}
}
cursor.close();
@ -4240,6 +4294,8 @@ to_json(nlohmann::json &obj, const GroupSessionData &msg)
obj["forwarding_curve25519_key_chain"] = msg.forwarding_curve25519_key_chain;
obj["currently"] = msg.currently;
obj["indices"] = msg.indices;
}
void
@ -4253,6 +4309,8 @@ from_json(const nlohmann::json &obj, GroupSessionData &msg)
obj.value("forwarding_curve25519_key_chain", std::vector<std::string>{});
msg.currently = obj.value("currently", SharedWithUsers{});
msg.indices = obj.value("indices", std::map<uint32_t, std::string>());
}
void

View file

@ -50,6 +50,9 @@ struct GroupSessionData
std::string sender_claimed_ed25519_key;
std::vector<std::string> forwarding_curve25519_key_chain;
//! map from index to event_id to check for replay attacks
std::map<uint32_t, std::string> indices;
// who has access to this session.
// Rotate, when a user leaves the room and share, when a user gets added.
SharedWithUsers currently;

View file

@ -113,6 +113,7 @@ struct RoomSearchResult
struct ImagePackInfo
{
std::string packname;
std::map<std::string, mtx::events::msc2545::PackImage> images;
mtx::events::msc2545::ImagePack pack;
std::string source_room;
std::string state_key;
};

View file

@ -48,7 +48,8 @@ public:
// user cache stores user keys
std::optional<UserKeyCache> userKeys(const std::string &user_id);
std::map<std::string, std::optional<UserKeyCache>> getMembersWithKeys(
const std::string &room_id);
const std::string &room_id,
bool verified_only);
void updateUserKeys(const std::string &sync_token,
const mtx::responses::QueryKeys &keyQuery);
void markUserKeysOutOfDate(lmdb::txn &txn,
@ -97,6 +98,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,7 +232,8 @@ 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, bool stickers);
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);
@ -278,20 +286,14 @@ public:
void saveOlmAccount(const std::string &pickled);
std::string restoreOlmAccount();
void storeSecret(const std::string &name, const std::string &secret);
void deleteSecret(const std::string &name);
std::optional<std::string> secret(const std::string &name);
void storeSecret(const std::string name, const std::string secret);
void deleteSecret(const std::string name);
std::optional<std::string> secret(const std::string name);
template<class T>
static constexpr bool isStateEvent(const mtx::events::StateEvent<T> &)
{
return true;
}
template<class T>
static constexpr bool isStateEvent(const mtx::events::Event<T> &)
{
return false;
}
constexpr static bool isStateEvent_ =
std::is_same_v<std::remove_cv_t<std::remove_reference_t<T>>,
mtx::events::StateEvent<decltype(std::declval<T>().content)>>;
static int compare_state_key(const MDB_val *a, const MDB_val *b)
{
@ -408,11 +410,27 @@ private:
}
std::visit(
[&txn, &statesdb, &stateskeydb, &eventsDb](auto e) {
if constexpr (isStateEvent(e)) {
[&txn, &statesdb, &stateskeydb, &eventsDb, &membersdb](const auto &e) {
if constexpr (isStateEvent_<decltype(e)>) {
eventsDb.put(txn, e.event_id, json(e).dump());
if (e.type != EventType::Unsupported) {
if (std::is_same_v<
std::remove_cv_t<std::remove_reference_t<decltype(e)>>,
StateEvent<mtx::events::msg::Redacted>>) {
if (e.type == EventType::RoomMember)
membersdb.del(txn, e.state_key, "");
else if (e.state_key.empty())
statesdb.del(txn, to_string(e.type));
else
stateskeydb.del(
txn,
to_string(e.type),
json::object({
{"key", e.state_key},
{"id", e.event_id},
})
.dump());
} else if (e.type != EventType::Unsupported) {
if (e.state_key.empty())
statesdb.put(
txn, to_string(e.type), json(e).dump());
@ -682,6 +700,8 @@ private:
lmdb::dbi outboundMegolmSessionDb_;
lmdb::dbi megolmSessionDataDb_;
lmdb::dbi encryptedRooms_;
QString localUserId_;
QString cacheDirectory_;

View file

@ -31,7 +31,6 @@
#include "notifications/Manager.h"
#include "dialogs/ReadReceipts.h"
#include "timeline/TimelineViewManager.h"
#include "blurhash.hpp"
@ -116,29 +115,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,31 +928,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),
static_cast<int>(err->error_code));
nhlog::crypto()->info(
"uploading {} {} keys", nkeys, mtx::crypto::SIGNED_CURVE25519);
olm::client()->generate_one_time_keys(nkeys);
if (err->status_code < 400 || err->status_code >= 500)
return;
}
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));
// mark as published anyway, otherwise we may end up in a loop.
olm::mark_keys_as_published();
});
}
if (err->status_code < 400 || err->status_code >= 500)
return;
}
// mark as published anyway, otherwise we may end up in a loop.
olm::mark_keys_as_published();
});
}
}
@ -1024,8 +1027,15 @@ ChatPage::decryptDownloadedSecrets(mtx::secret_storage::AesHmacSha2KeyDescriptio
auto decryptionKey = mtx::crypto::key_from_recoverykey(text.toStdString(), keyDesc);
if (!decryptionKey)
decryptionKey = mtx::crypto::key_from_passphrase(text.toStdString(), keyDesc);
if (!decryptionKey && keyDesc.passphrase) {
try {
decryptionKey =
mtx::crypto::key_from_passphrase(text.toStdString(), keyDesc);
} catch (std::exception &e) {
nhlog::crypto()->error("Failed to derive secret key from passphrase: {}",
e.what());
}
}
if (!decryptionKey) {
QMessageBox::information(

View file

@ -2,21 +2,24 @@
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "ImagePackModel.h"
#include "CombinedImagePackModel.h"
#include "Cache_p.h"
#include "CompletionModelRoles.h"
ImagePackModel::ImagePackModel(const std::string &roomId, bool stickers, QObject *parent)
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 = QString::fromStdString(pack.packname);
QString packname =
pack.pack.pack ? QString::fromStdString(pack.pack.pack->display_name) : "";
for (const auto &img : pack.images) {
for (const auto &img : pack.pack.images) {
ImageDesc i{};
i.shortcode = QString::fromStdString(img.first);
i.packname = packname;
@ -27,13 +30,13 @@ ImagePackModel::ImagePackModel(const std::string &roomId, bool stickers, QObject
}
int
ImagePackModel::rowCount(const QModelIndex &) const
CombinedImagePackModel::rowCount(const QModelIndex &) const
{
return (int)images.size();
}
QHash<int, QByteArray>
ImagePackModel::roleNames() const
CombinedImagePackModel::roleNames() const
{
return {
{CompletionModel::CompletionRole, "completionRole"},
@ -48,7 +51,7 @@ ImagePackModel::roleNames() const
}
QVariant
ImagePackModel::data(const QModelIndex &index, int role) const
CombinedImagePackModel::data(const QModelIndex &index, int role) const
{
if (hasIndex(index.row(), index.column(), index.parent())) {
switch (role) {

View file

@ -8,7 +8,7 @@
#include <mtx/events/mscs/image_packs.hpp>
class ImagePackModel : public QAbstractListModel
class CombinedImagePackModel : public QAbstractListModel
{
Q_OBJECT
public:
@ -21,7 +21,7 @@ public:
OriginalRow,
};
ImagePackModel(const std::string &roomId, bool stickers, QObject *parent = nullptr);
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;

View file

@ -0,0 +1,94 @@
// 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;
}
SingleImagePackModel *
ImagePackListModel::newPack(bool inRoom)
{
ImagePackInfo info{};
if (inRoom)
info.source_room = room_id;
return new SingleImagePackModel(info);
}
bool
ImagePackListModel::containsAccountPack() const
{
for (const auto &p : packs)
if (p->roomid().isEmpty())
return true;
return false;
}

41
src/ImagePackListModel.h Normal file
View file

@ -0,0 +1,41 @@
// 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
Q_PROPERTY(bool containsAccountPack READ containsAccountPack CONSTANT)
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);
Q_INVOKABLE SingleImagePackModel *newPack(bool inRoom);
bool containsAccountPack() const;
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

@ -30,19 +30,11 @@ qmlMessageHandler(QtMsgType type, const QMessageLogContext &context, const QStri
const char *function = context.function ? context.function : "";
if (
// Surpress binding wrning for now, as we can't set restore mode to keep compat with
// qt 5.10
msg.contains(QStringLiteral(
"QML Binding: Not restoring previous value because restoreMode has not been set.")) ||
// The default style has the point size set. If you use pixel size anywhere, you get
// that warning, which is useless, since sometimes you need the pixel size to match the
// text to the size of the outer element for example. This is done in the avatar and
// without that you get one warning for every Avatar displayed, which is stupid!
msg.endsWith(QStringLiteral("Both point size and pixel size set. Using pixel size.")) ||
// The new syntax breaks rebinding on Qt < 5.15. Until we can drop that, we still need it.
msg.endsWith(QStringLiteral(
"QML Connections: Implicitly defined onFoo properties in Connections are "
"deprecated. Use this syntax instead: function onFoo(<arguments>) { ... }")))
msg.endsWith(QStringLiteral("Both point size and pixel size set. Using pixel size.")))
return;
switch (type) {

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,12 +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 +308,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 +331,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)
{
@ -419,27 +397,6 @@ MainWindow::openLogoutDialog()
showDialog(dialog);
}
void
MainWindow::openReadReceiptsDialog(const QString &event_id)
{
auto dialog = new dialogs::ReadReceipts(this);
const auto room_id = chat_page_->currentRoom();
try {
dialog->addUsers(cache::readReceipts(event_id, room_id));
} catch (const lmdb::error &) {
nhlog::db()->warn("failed to retrieve read receipts for {} {}",
event_id.toStdString(),
chat_page_->currentRoom().toStdString());
dialog->deleteLater();
return;
}
showDialog(dialog);
}
bool
MainWindow::hasActiveDialogs() const
{

View file

@ -65,8 +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();
void showSolidOverlayModal(QWidget *content,

100
src/MemberList.cpp Normal file
View file

@ -0,0 +1,100 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "MemberList.h"
#include "Cache.h"
#include "ChatPage.h"
#include "Config.h"
#include "Logging.h"
#include "Utils.h"
#include "timeline/TimelineViewManager.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();
}

67
src/MemberList.h Normal file
View file

@ -0,0 +1,67 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QAbstractListModel>
#include "CacheStructs.h"
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

@ -22,7 +22,14 @@ QHash<QString, mtx::crypto::EncryptedFile> infos;
QQuickImageResponse *
MxcImageProvider::requestImageResponse(const QString &id, const QSize &requestedSize)
{
MxcImageResponse *response = new MxcImageResponse(id, requestedSize);
auto id_ = id;
bool crop = true;
if (id.endsWith("?scale")) {
crop = false;
id_.remove("?scale");
}
MxcImageResponse *response = new MxcImageResponse(id_, crop, requestedSize);
pool.start(response);
return response;
}
@ -36,20 +43,24 @@ void
MxcImageResponse::run()
{
MxcImageProvider::download(
m_id, m_requestedSize, [this](QString, QSize, QImage image, QString) {
m_id,
m_requestedSize,
[this](QString, QSize, QImage image, QString) {
if (image.isNull()) {
m_error = "Failed to download image.";
} else {
m_image = image;
}
emit finished();
});
},
m_crop);
}
void
MxcImageProvider::download(const QString &id,
const QSize &requestedSize,
std::function<void(QString, QSize, QImage, QString)> then)
std::function<void(QString, QSize, QImage, QString)> then,
bool crop)
{
std::optional<mtx::crypto::EncryptedFile> encryptionInfo;
auto temp = infos.find("mxc://" + id);
@ -58,11 +69,12 @@ MxcImageProvider::download(const QString &id,
if (requestedSize.isValid() && !encryptionInfo) {
QString fileName =
QString("%1_%2x%3_crop")
QString("%1_%2x%3_%4")
.arg(QString::fromUtf8(id.toUtf8().toBase64(QByteArray::Base64UrlEncoding |
QByteArray::OmitTrailingEquals)))
.arg(requestedSize.width())
.arg(requestedSize.height());
.arg(requestedSize.height())
.arg(crop ? "crop" : "scale");
QFileInfo fileInfo(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) +
"/media_cache",
fileName);
@ -85,7 +97,7 @@ MxcImageProvider::download(const QString &id,
opts.mxc_url = "mxc://" + id.toStdString();
opts.width = requestedSize.width() > 0 ? requestedSize.width() : -1;
opts.height = requestedSize.height() > 0 ? requestedSize.height() : -1;
opts.method = "crop";
opts.method = crop ? "crop" : "scale";
http::client()->get_thumbnail(
opts,
[fileInfo, requestedSize, then, id](const std::string &res,
@ -196,7 +208,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

@ -19,9 +19,10 @@ class MxcImageResponse
, public QRunnable
{
public:
MxcImageResponse(const QString &id, const QSize &requestedSize)
MxcImageResponse(const QString &id, bool crop, const QSize &requestedSize)
: m_id(id)
, m_requestedSize(requestedSize)
, m_crop(crop)
{
setAutoDelete(false);
}
@ -37,6 +38,7 @@ public:
QString m_id, m_error;
QSize m_requestedSize;
QImage m_image;
bool m_crop;
};
class MxcImageProvider
@ -51,7 +53,8 @@ public slots:
static void addEncryptionInfo(mtx::crypto::EncryptedFile info);
static void download(const QString &id,
const QSize &requestedSize,
std::function<void(QString, QSize, QImage, QString)> then);
std::function<void(QString, QSize, QImage, QString)> then,
bool crop = true);
private:
QThreadPool pool;

View file

@ -212,14 +212,21 @@ handle_olm_message(const OlmMessage &msg, const UserKeyCache &otherUserDeviceKey
nhlog::crypto()->info("sender : {}", msg.sender);
nhlog::crypto()->info("sender_key: {}", msg.sender_key);
if (msg.sender_key == olm::client()->identity_keys().ed25519) {
nhlog::crypto()->warn("Ignoring olm message from ourselves!");
return;
}
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) {
nhlog::crypto()->debug(
"Skipping message for {} since we are {}.", cipher.first, my_key);
return;
continue;
}
const auto type = cipher.second.type;
@ -234,6 +241,7 @@ handle_olm_message(const OlmMessage &msg, const UserKeyCache &otherUserDeviceKey
msg.sender, msg.sender_key, cipher.second);
} else {
nhlog::crypto()->error("Undecryptable olm message!");
failed_decryption = true;
continue;
}
}
@ -278,11 +286,17 @@ handle_olm_message(const OlmMessage &msg, const UserKeyCache &otherUserDeviceKey
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;
}
auto c_key = key.keys.find("curve25519:" + device_id);
auto e_key = key.keys.find("ed25519:" + device_id);
if (c_key == key.keys.end() || e_key == key.keys.end()) {
nhlog::crypto()->warn(
"Skipping device {} as we have no keys for it.",
device_id);
} else if (c_key->second == msg.sender_key &&
e_key->second == sender_ed25519) {
from_their_device = true;
break;
}
}
if (!from_their_device) {
@ -423,22 +437,28 @@ handle_olm_message(const OlmMessage &msg, const UserKeyCache &otherUserDeviceKey
}
return;
} else {
failed_decryption = true;
}
}
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 (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);
}
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());
}
}
}
@ -504,7 +524,8 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id,
auto own_user_id = http::client()->user_id().to_string();
auto members = cache::client()->getMembersWithKeys(room_id);
auto members = cache::client()->getMembersWithKeys(
room_id, UserSettings::instance()->onlyShareKeysWithVerifiedUsers());
std::map<std::string, std::vector<std::string>> sendSessionTo;
mtx::crypto::OutboundGroupSessionPtr session = nullptr;
@ -955,13 +976,12 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR
}
}
if (!verifiedDevice && !shouldSeeKeys &&
!utils::respondsToKeyRequests(req.content.room_id)) {
if (!verifiedDevice && !shouldSeeKeys) {
nhlog::crypto()->debug("ignoring key request for room {}", req.content.room_id);
return;
}
if (verifiedDevice || utils::respondsToKeyRequests(req.content.room_id)) {
if (verifiedDevice) {
// share the minimum index we have
minimumIndex = -1;
}
@ -1008,7 +1028,8 @@ send_megolm_key_to_device(const std::string &user_id,
DecryptionResult
decryptEvent(const MegolmSessionIndex &index,
const mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> &event)
const mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> &event,
bool dont_write_db)
{
try {
if (!cache::client()->inboundMegolmSessionExists(index)) {
@ -1023,10 +1044,26 @@ decryptEvent(const MegolmSessionIndex &index,
std::string msg_str;
try {
auto session = cache::client()->getInboundMegolmSession(index);
auto sessionData =
cache::client()->getMegolmSessionData(index).value_or(GroupSessionData{});
auto res =
olm::client()->decrypt_group_message(session.get(), event.content.ciphertext);
msg_str = std::string((char *)res.data.data(), res.data.size());
if (!event.event_id.empty() && event.event_id[0] == '$') {
auto oldIdx = sessionData.indices.find(res.message_index);
if (oldIdx != sessionData.indices.end()) {
if (oldIdx->second != event.event_id)
return {DecryptionErrorCode::ReplayAttack,
std::nullopt,
std::nullopt};
} else if (!dont_write_db) {
sessionData.indices[res.message_index] = event.event_id;
cache::client()->saveInboundMegolmSession(
index, std::move(session), sessionData);
}
}
} catch (const lmdb::error &e) {
return {DecryptionErrorCode::DbError, e.what(), std::nullopt};
} catch (const mtx::crypto::olm_exception &e) {
@ -1035,24 +1072,24 @@ decryptEvent(const MegolmSessionIndex &index,
return {DecryptionErrorCode::DecryptionFailed, e.what(), std::nullopt};
}
// Add missing fields for the event.
json body = json::parse(msg_str);
body["event_id"] = event.event_id;
body["sender"] = event.sender;
body["origin_server_ts"] = event.origin_server_ts;
body["unsigned"] = event.unsigned_data;
// relations are unencrypted in content...
mtx::common::add_relations(body["content"], event.content.relations);
mtx::events::collections::TimelineEvent te;
try {
// Add missing fields for the event.
json body = json::parse(msg_str);
body["event_id"] = event.event_id;
body["sender"] = event.sender;
body["origin_server_ts"] = event.origin_server_ts;
body["unsigned"] = event.unsigned_data;
// relations are unencrypted in content...
mtx::common::add_relations(body["content"], event.content.relations);
mtx::events::collections::TimelineEvent te;
mtx::events::collections::from_json(body, te);
return {DecryptionErrorCode::NoError, std::nullopt, std::move(te.data)};
} catch (std::exception &e) {
return {DecryptionErrorCode::ParsingFailed, e.what(), std::nullopt};
}
return {std::nullopt, std::nullopt, std::move(te.data)};
}
crypto::Trust
@ -1081,6 +1118,8 @@ send_encrypted_to_device_messages(const std::map<std::string, std::vector<std::s
messages;
std::map<std::string, std::map<std::string, DevicePublicKeys>> pks;
auto our_curve = olm::client()->identity_keys().curve25519;
for (const auto &[user, devices] : targets) {
auto deviceKeys = cache::client()->userKeys(user);
@ -1114,12 +1153,32 @@ send_encrypted_to_device_messages(const std::map<std::string, std::vector<std::s
continue;
}
auto session =
cache::getLatestOlmSession(d.keys.at("curve25519:" + device));
auto device_curve = d.keys.at("curve25519:" + device);
if (device_curve == our_curve) {
nhlog::crypto()->warn("Skipping our own device, since sending "
"ourselves olm messages makes no sense.");
continue;
}
auto session = cache::getLatestOlmSession(device_curve);
if (!session || force_new_session) {
claims.one_time_keys[user][device] = mtx::crypto::SIGNED_CURVE25519;
pks[user][device].ed25519 = d.keys.at("ed25519:" + device);
pks[user][device].curve25519 = d.keys.at("curve25519:" + device);
static QMap<QPair<std::string, std::string>, qint64> rateLimit;
auto currentTime = QDateTime::currentSecsSinceEpoch();
if (rateLimit.value(QPair(user, device)) + 60 * 60 * 10 <
currentTime) {
claims.one_time_keys[user][device] =
mtx::crypto::SIGNED_CURVE25519;
pks[user][device].ed25519 = d.keys.at("ed25519:" + device);
pks[user][device].curve25519 =
d.keys.at("curve25519:" + device);
rateLimit.insert(QPair(user, device), currentTime);
} else {
nhlog::crypto()->warn("Not creating new session with {}:{} "
"because of rate limit",
user,
device);
}
continue;
}
@ -1129,7 +1188,7 @@ send_encrypted_to_device_messages(const std::map<std::string, std::vector<std::s
ev_json,
UserId(user),
d.keys.at("ed25519:" + device),
d.keys.at("curve25519:" + device))
device_curve)
.get<mtx::events::msg::OlmEncrypted>();
try {
@ -1187,22 +1246,40 @@ send_encrypted_to_device_messages(const std::map<std::string, std::vector<std::s
continue;
}
// TODO: Verify signatures
auto otk = rd.second.begin()->at("key");
auto id_key = pks.at(user_id).at(device_id).curve25519;
auto sign_key = pks.at(user_id).at(device_id).ed25519;
auto id_key = pks.at(user_id).at(device_id).curve25519;
// Verify signature
{
auto signedKey = *rd.second.begin();
std::string signature =
signedKey["signatures"][user_id].value(
"ed25519:" + device_id, "");
if (signature.empty() ||
!mtx::crypto::ed25519_verify_signature(
sign_key, signedKey, signature)) {
nhlog::net()->warn(
"Skipping device {} as its one time key "
"has an invalid signature.",
device_id);
continue;
}
}
auto session =
olm::client()->create_outbound_session(id_key, otk);
messages[mtx::identifiers::parse<mtx::identifiers::User>(
user_id)][device_id] =
olm::client()
->create_olm_encrypted_content(
session.get(),
ev_json,
UserId(user_id),
pks.at(user_id).at(device_id).ed25519,
id_key)
->create_olm_encrypted_content(session.get(),
ev_json,
UserId(user_id),
sign_key,
id_key)
.get<mtx::events::msg::OlmEncrypted>();
try {
@ -1248,8 +1325,8 @@ send_encrypted_to_device_messages(const std::map<std::string, std::vector<std::s
req.device_keys = keysToQuery;
http::client()->query_keys(
req,
[ev_json, BindPks](const mtx::responses::QueryKeys &res,
mtx::http::RequestErr err) {
[ev_json, BindPks, our_curve](const mtx::responses::QueryKeys &res,
mtx::http::RequestErr err) {
if (err) {
nhlog::net()->warn("failed to query device keys: {} {}",
err->matrix_error.error,
@ -1291,6 +1368,13 @@ send_encrypted_to_device_messages(const std::map<std::string, std::vector<std::s
pks.ed25519 = device_keys.at(edKey);
pks.curve25519 = device_keys.at(curveKey);
if (pks.curve25519 == our_curve) {
nhlog::crypto()->warn(
"Skipping our own device, since sending "
"ourselves olm messages makes no sense.");
continue;
}
try {
if (!mtx::crypto::verify_identity_signature(
dev.second, device_id, user_id)) {
@ -1360,9 +1444,12 @@ request_cross_signing_keys()
body,
[request_id = secretRequest.request_id, secretName](mtx::http::RequestErr err) {
if (err) {
request_id_to_secret_name.erase(request_id);
nhlog::net()->error("Failed to send request for secrect '{}'",
secretName);
// Cancel request on UI thread
QTimer::singleShot(1, cache::client(), [request_id]() {
request_id_to_secret_name.erase(request_id);
});
return;
}
});

View file

@ -14,9 +14,11 @@
constexpr auto OLM_ALGO = "m.olm.v1.curve25519-aes-sha2";
namespace olm {
Q_NAMESPACE
enum class DecryptionErrorCode
enum DecryptionErrorCode
{
NoError,
MissingSession, // Session was not found, retrieve from backup or request from other devices
// and try again
MissingSessionIndex, // Session was found, but it does not reach back enough to this index,
@ -25,14 +27,13 @@ enum class DecryptionErrorCode
DecryptionFailed, // libolm error
ParsingFailed, // Failed to parse the actual event
ReplayAttack, // Megolm index reused
UnknownFingerprint, // Unknown device Fingerprint
};
Q_ENUM_NS(DecryptionErrorCode)
struct DecryptionResult
{
std::optional<DecryptionErrorCode> error;
DecryptionErrorCode error;
std::optional<std::string> error_message;
std::optional<mtx::events::collections::TimelineEvents> event;
};
@ -80,9 +81,11 @@ encrypt_group_message(const std::string &room_id,
const std::string &device_id,
nlohmann::json body);
//! Decrypt an event. Use dont_write_db to prevent db writes when already in a write transaction.
DecryptionResult
decryptEvent(const MegolmSessionIndex &index,
const mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> &event);
const mtx::events::EncryptedEvent<mtx::events::msg::Encrypted> &event,
bool dont_write_db = false);
crypto::Trust
calculate_trust(const std::string &user_id, const std::string &curve25519);

131
src/ReadReceiptsModel.cpp Normal file
View file

@ -0,0 +1,131 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "ReadReceiptsModel.h"
#include <QLocale>
#include "Cache.h"
#include "Cache_p.h"
#include "Logging.h"
#include "Utils.h"
ReadReceiptsModel::ReadReceiptsModel(QString event_id, QString room_id, QObject *parent)
: QAbstractListModel{parent}
, event_id_{event_id}
, room_id_{room_id}
{
try {
addUsers(cache::readReceipts(event_id_, room_id_));
} catch (const lmdb::error &) {
nhlog::db()->warn("failed to retrieve read receipts for {} {}",
event_id_.toStdString(),
room_id_.toStdString());
return;
}
connect(cache::client(), &Cache::newReadReceipts, this, &ReadReceiptsModel::update);
}
void
ReadReceiptsModel::update()
{
try {
addUsers(cache::readReceipts(event_id_, room_id_));
} catch (const lmdb::error &) {
nhlog::db()->warn("failed to retrieve read receipts for {} {}",
event_id_.toStdString(),
room_id_.toStdString());
return;
}
}
QHash<int, QByteArray>
ReadReceiptsModel::roleNames() const
{
// Note: RawTimestamp is purposely not included here
return {
{Mxid, "mxid"},
{DisplayName, "displayName"},
{AvatarUrl, "avatarUrl"},
{Timestamp, "timestamp"},
};
}
QVariant
ReadReceiptsModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid() || index.row() >= (int)readReceipts_.size() || index.row() < 0)
return {};
switch (role) {
case Mxid:
return readReceipts_[index.row()].first;
case DisplayName:
return cache::displayName(room_id_, readReceipts_[index.row()].first);
case AvatarUrl:
return cache::avatarUrl(room_id_, readReceipts_[index.row()].first);
case Timestamp:
return dateFormat(readReceipts_[index.row()].second);
case RawTimestamp:
return readReceipts_[index.row()].second;
default:
return {};
}
}
void
ReadReceiptsModel::addUsers(
const std::multimap<uint64_t, std::string, std::greater<uint64_t>> &users)
{
auto newReceipts = users.size() - readReceipts_.size();
if (newReceipts > 0) {
beginInsertRows(
QModelIndex{}, readReceipts_.size(), readReceipts_.size() + newReceipts - 1);
for (const auto &user : users) {
QPair<QString, QDateTime> item = {
QString::fromStdString(user.second),
QDateTime::fromMSecsSinceEpoch(user.first)};
if (!readReceipts_.contains(item))
readReceipts_.push_back(item);
}
endInsertRows();
}
}
QString
ReadReceiptsModel::dateFormat(const QDateTime &then) const
{
auto now = QDateTime::currentDateTime();
auto days = then.daysTo(now);
if (days == 0)
return QLocale::system().toString(then.time(), QLocale::ShortFormat);
else if (days < 2)
return tr("Yesterday, %1")
.arg(QLocale::system().toString(then.time(), QLocale::ShortFormat));
else if (days < 7)
//: %1 is the name of the current day, %2 is the time the read receipt was read. The
//: result may look like this: Monday, 7:15
return QString("%1, %2")
.arg(then.toString("dddd"))
.arg(QLocale::system().toString(then.time(), QLocale::ShortFormat));
return QLocale::system().toString(then.time(), QLocale::ShortFormat);
}
ReadReceiptsProxy::ReadReceiptsProxy(QString event_id, QString room_id, QObject *parent)
: QSortFilterProxyModel{parent}
, model_{event_id, room_id, this}
{
setSourceModel(&model_);
setSortRole(ReadReceiptsModel::RawTimestamp);
sort(0, Qt::DescendingOrder);
setDynamicSortFilter(true);
}

73
src/ReadReceiptsModel.h Normal file
View file

@ -0,0 +1,73 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#ifndef READRECEIPTSMODEL_H
#define READRECEIPTSMODEL_H
#include <QAbstractListModel>
#include <QDateTime>
#include <QObject>
#include <QSortFilterProxyModel>
#include <QString>
class ReadReceiptsModel : public QAbstractListModel
{
Q_OBJECT
public:
enum Roles
{
Mxid,
DisplayName,
AvatarUrl,
Timestamp,
RawTimestamp,
};
explicit ReadReceiptsModel(QString event_id, QString room_id, QObject *parent = nullptr);
QString eventId() const { return event_id_; }
QString roomId() const { return room_id_; }
QHash<int, QByteArray> roleNames() const override;
int rowCount(const QModelIndex &parent) const override
{
Q_UNUSED(parent)
return readReceipts_.size();
}
QVariant data(const QModelIndex &index, int role) const override;
public slots:
void addUsers(const std::multimap<uint64_t, std::string, std::greater<uint64_t>> &users);
void update();
private:
QString dateFormat(const QDateTime &then) const;
QString event_id_;
QString room_id_;
QVector<QPair<QString, QDateTime>> readReceipts_;
};
class ReadReceiptsProxy : public QSortFilterProxyModel
{
Q_OBJECT
Q_PROPERTY(QString eventId READ eventId CONSTANT)
Q_PROPERTY(QString roomId READ roomId CONSTANT)
public:
explicit ReadReceiptsProxy(QString event_id, QString room_id, QObject *parent = nullptr);
QString eventId() const { return event_id_; }
QString roomId() const { return room_id_; }
private:
QString event_id_;
QString room_id_;
ReadReceiptsModel model_;
};
#endif // READRECEIPTSMODEL_H

View file

@ -12,6 +12,7 @@
#include <mtx/responses/register.hpp>
#include <mtx/responses/well-known.hpp>
#include <mtxclient/http/client.hpp>
#include "Config.h"
#include "Logging.h"
@ -93,6 +94,7 @@ RegisterPage::RegisterPage(QWidget *parent)
server_input_ = new TextField();
server_input_->setLabel(tr("Homeserver"));
server_input_->setRegexp(QRegularExpression(".+"));
server_input_->setToolTip(
tr("A server that allows registration. Since matrix is decentralized, you need to first "
"find a server you can register on or host your own."));
@ -145,178 +147,39 @@ RegisterPage::RegisterPage(QWidget *parent)
top_layout_->addLayout(button_layout_);
top_layout_->addWidget(error_label_, 0, Qt::AlignHCenter);
top_layout_->addStretch(1);
connect(
this,
&RegisterPage::versionErrorCb,
this,
[this](const QString &msg) {
error_server_label_->show();
server_input_->setValid(false);
showError(error_server_label_, msg);
},
Qt::QueuedConnection);
setLayout(top_layout_);
connect(back_button_, SIGNAL(clicked()), this, SLOT(onBackButtonClicked()));
connect(register_button_, SIGNAL(clicked()), this, SLOT(onRegisterButtonClicked()));
connect(username_input_, SIGNAL(returnPressed()), register_button_, SLOT(click()));
connect(username_input_, &TextField::editingFinished, this, &RegisterPage::checkFields);
connect(username_input_, &TextField::editingFinished, this, &RegisterPage::checkUsername);
connect(password_input_, SIGNAL(returnPressed()), register_button_, SLOT(click()));
connect(password_input_, &TextField::editingFinished, this, &RegisterPage::checkFields);
connect(password_input_, &TextField::editingFinished, this, &RegisterPage::checkPassword);
connect(password_confirmation_, SIGNAL(returnPressed()), register_button_, SLOT(click()));
connect(
password_confirmation_, &TextField::editingFinished, this, &RegisterPage::checkFields);
connect(password_confirmation_,
&TextField::editingFinished,
this,
&RegisterPage::checkPasswordConfirmation);
connect(server_input_, SIGNAL(returnPressed()), register_button_, SLOT(click()));
connect(server_input_, &TextField::editingFinished, this, &RegisterPage::checkFields);
connect(this, &RegisterPage::registerErrorCb, this, [this](const QString &msg) {
showError(msg);
});
connect(
this,
&RegisterPage::registrationFlow,
this,
[this](const std::string &user,
const std::string &pass,
const mtx::user_interactive::Unauthorized &unauthorized) {
auto completed_stages = unauthorized.completed;
auto flows = unauthorized.flows;
auto session = unauthorized.session.empty() ? http::client()->generate_txn_id()
: unauthorized.session;
nhlog::ui()->info("Completed stages: {}", completed_stages.size());
if (!completed_stages.empty())
flows.erase(std::remove_if(
flows.begin(),
flows.end(),
[completed_stages](auto flow) {
if (completed_stages.size() > flow.stages.size())
return true;
for (size_t f = 0; f < completed_stages.size(); f++)
if (completed_stages[f] != flow.stages[f])
return true;
return false;
}),
flows.end());
if (flows.empty()) {
nhlog::net()->error("No available registration flows!");
emit registerErrorCb(tr("No supported registration flows!"));
return;
}
auto current_stage = flows.front().stages.at(completed_stages.size());
if (current_stage == mtx::user_interactive::auth_types::recaptcha) {
auto captchaDialog =
new dialogs::ReCaptcha(QString::fromStdString(session), this);
connect(captchaDialog,
&dialogs::ReCaptcha::confirmation,
this,
[this, user, pass, session, captchaDialog]() {
captchaDialog->close();
captchaDialog->deleteLater();
emit registerAuth(
user,
pass,
mtx::user_interactive::Auth{
session, mtx::user_interactive::auth::Fallback{}});
});
connect(captchaDialog,
&dialogs::ReCaptcha::cancel,
this,
&RegisterPage::errorOccurred);
QTimer::singleShot(
1000, this, [captchaDialog]() { captchaDialog->show(); });
} else if (current_stage == mtx::user_interactive::auth_types::dummy) {
emit registerAuth(user,
pass,
mtx::user_interactive::Auth{
session, mtx::user_interactive::auth::Dummy{}});
} else {
// use fallback
auto dialog =
new dialogs::FallbackAuth(QString::fromStdString(current_stage),
QString::fromStdString(session),
this);
connect(dialog,
&dialogs::FallbackAuth::confirmation,
this,
[this, user, pass, session, dialog]() {
dialog->close();
dialog->deleteLater();
emit registerAuth(
user,
pass,
mtx::user_interactive::Auth{
session, mtx::user_interactive::auth::Fallback{}});
});
connect(dialog,
&dialogs::FallbackAuth::cancel,
this,
&RegisterPage::errorOccurred);
dialog->show();
}
});
connect(server_input_, &TextField::editingFinished, this, &RegisterPage::checkServer);
connect(
this,
&RegisterPage::registerAuth,
&RegisterPage::serverError,
this,
[this](const std::string &user,
const std::string &pass,
const mtx::user_interactive::Auth &auth) {
http::client()->registration(
user,
pass,
auth,
[this, user, pass](const mtx::responses::Register &res,
mtx::http::RequestErr err) {
if (!err) {
http::client()->set_user(res.user_id);
http::client()->set_access_token(res.access_token);
http::client()->set_device_id(res.device_id);
[this](const QString &msg) {
server_input_->setValid(false);
showError(error_server_label_, msg);
},
Qt::QueuedConnection);
emit registerOk();
return;
}
// The server requires registration flows.
if (err->status_code == 401) {
if (err->matrix_error.unauthorized.flows.empty()) {
nhlog::net()->warn(
"failed to retrieve registration flows: ({}) "
"{}",
static_cast<int>(err->status_code),
err->matrix_error.error);
emit registerErrorCb(
QString::fromStdString(err->matrix_error.error));
return;
}
emit registrationFlow(
user, pass, err->matrix_error.unauthorized);
return;
}
nhlog::net()->warn("failed to register: status_code ({}), "
"matrix_error: ({}), parser error ({})",
static_cast<int>(err->status_code),
err->matrix_error.error,
err->parse_error);
emit registerErrorCb(QString::fromStdString(err->matrix_error.error));
});
});
setLayout(top_layout_);
connect(this, &RegisterPage::wellKnownLookup, this, &RegisterPage::doWellKnownLookup);
connect(this, &RegisterPage::versionsCheck, this, &RegisterPage::doVersionsCheck);
connect(this, &RegisterPage::registration, this, &RegisterPage::doRegistration);
connect(this, &RegisterPage::UIA, this, &RegisterPage::doUIA);
connect(
this, &RegisterPage::registrationWithAuth, this, &RegisterPage::doRegistrationWithAuth);
}
void
@ -345,191 +208,298 @@ RegisterPage::showError(QLabel *label, const QString &msg)
int height = rect.height();
label->setFixedHeight((int)qCeil(width / 200.0) * height);
label->setText(msg);
label->show();
}
bool
RegisterPage::checkOneField(QLabel *label, const TextField *t_field, const QString &msg)
{
if (t_field->isValid()) {
label->setText("");
label->hide();
return true;
} else {
label->show();
showError(label, msg);
return false;
}
}
bool
RegisterPage::checkFields()
RegisterPage::checkUsername()
{
error_label_->setText("");
error_username_label_->setText("");
error_password_label_->setText("");
error_password_confirmation_label_->setText("");
error_server_label_->setText("");
return checkOneField(error_username_label_,
username_input_,
tr("The username must not be empty, and must contain only the "
"characters a-z, 0-9, ., _, =, -, and /."));
}
error_username_label_->hide();
error_password_label_->hide();
error_password_confirmation_label_->hide();
error_server_label_->hide();
bool
RegisterPage::checkPassword()
{
return checkOneField(
error_password_label_, password_input_, tr("Password is not long enough (min 8 chars)"));
}
password_confirmation_->setValid(true);
server_input_->setValid(true);
bool all_fields_good = true;
if (username_input_->isModified() &&
!checkOneField(error_username_label_,
username_input_,
tr("The username must not be empty, and must contain only the "
"characters a-z, 0-9, ., _, =, -, and /."))) {
all_fields_good = false;
} else if (password_input_->isModified() &&
!checkOneField(error_password_label_,
password_input_,
tr("Password is not long enough (min 8 chars)"))) {
all_fields_good = false;
} else if (password_confirmation_->isModified() &&
password_input_->text() != password_confirmation_->text()) {
error_password_confirmation_label_->show();
bool
RegisterPage::checkPasswordConfirmation()
{
if (password_input_->text() == password_confirmation_->text()) {
error_password_confirmation_label_->hide();
password_confirmation_->setValid(true);
return true;
} else {
showError(error_password_confirmation_label_, tr("Passwords don't match"));
password_confirmation_->setValid(false);
all_fields_good = false;
} else if (server_input_->isModified() &&
(!server_input_->hasAcceptableInput() || server_input_->text().isEmpty())) {
error_server_label_->show();
showError(error_server_label_, tr("Invalid server name"));
server_input_->setValid(false);
all_fields_good = false;
return false;
}
if (!username_input_->isModified() || !password_input_->isModified() ||
!password_confirmation_->isModified() || !server_input_->isModified()) {
all_fields_good = false;
}
return all_fields_good;
}
bool
RegisterPage::checkServer()
{
// This doesn't check that the server is reachable,
// just that the input is not obviously wrong.
return checkOneField(error_server_label_, server_input_, tr("Invalid server name"));
}
void
RegisterPage::onRegisterButtonClicked()
{
if (!checkFields()) {
showError(error_label_,
tr("One or more fields have invalid inputs. Please correct those issues "
"and try again."));
return;
} else {
auto username = username_input_->text().toStdString();
auto password = password_input_->text().toStdString();
auto server = server_input_->text().toStdString();
if (checkUsername() && checkPassword() && checkPasswordConfirmation() && checkServer()) {
auto server = server_input_->text().toStdString();
http::client()->set_server(server);
http::client()->verify_certificates(
!UserSettings::instance()->disableCertificateValidation());
http::client()->well_known(
[this, username, password](const mtx::responses::WellKnown &res,
mtx::http::RequestErr err) {
if (err) {
if (err->status_code == 404) {
nhlog::net()->info("Autodiscovery: No .well-known.");
checkVersionAndRegister(username, password);
return;
}
// This starts a chain of `emit`s which ends up doing the
// registration. Signals are used rather than normal function
// calls so that the dialogs used in UIA work correctly.
//
// The sequence of events looks something like this:
//
// dowellKnownLookup
// v
// doVersionsCheck
// v
// doRegistration
// v
// doUIA <-----------------+
// v | More auth required
// doRegistrationWithAuth -+
// | Success
// v
// registering
if (!err->parse_error.empty()) {
emit versionErrorCb(tr(
"Autodiscovery failed. Received malformed response."));
nhlog::net()->error(
"Autodiscovery failed. Received malformed response.");
return;
}
emit versionErrorCb(tr("Autodiscovery failed. Unknown error when "
"requesting .well-known."));
nhlog::net()->error("Autodiscovery failed. Unknown error when "
"requesting .well-known. {} {}",
err->status_code,
err->error_code);
return;
}
nhlog::net()->info("Autodiscovery: Discovered '" +
res.homeserver.base_url + "'");
http::client()->set_server(res.homeserver.base_url);
checkVersionAndRegister(username, password);
});
emit wellKnownLookup();
emit registering();
}
}
void
RegisterPage::checkVersionAndRegister(const std::string &username, const std::string &password)
RegisterPage::doWellKnownLookup()
{
http::client()->versions(
[this, username, password](const mtx::responses::Versions &, mtx::http::RequestErr err) {
http::client()->well_known(
[this](const mtx::responses::WellKnown &res, mtx::http::RequestErr err) {
if (err) {
if (err->status_code == 404) {
emit versionErrorCb(tr("The required endpoints were not found. "
"Possibly not a Matrix server."));
nhlog::net()->info("Autodiscovery: No .well-known.");
// Check that the homeserver can be reached
emit versionsCheck();
return;
}
if (!err->parse_error.empty()) {
emit versionErrorCb(tr("Received malformed response. Make sure "
"the homeserver domain is valid."));
emit serverError(
tr("Autodiscovery failed. Received malformed response."));
nhlog::net()->error(
"Autodiscovery failed. Received malformed response.");
return;
}
emit versionErrorCb(tr(
"An unknown error occured. Make sure the homeserver domain is valid."));
emit serverError(tr("Autodiscovery failed. Unknown error when "
"requesting .well-known."));
nhlog::net()->error("Autodiscovery failed. Unknown error when "
"requesting .well-known. {} {}",
err->status_code,
err->error_code);
return;
}
http::client()->registration(
username,
password,
[this, username, password](const mtx::responses::Register &res,
mtx::http::RequestErr err) {
if (!err) {
http::client()->set_user(res.user_id);
http::client()->set_access_token(res.access_token);
emit registerOk();
return;
}
// The server requires registration flows.
if (err->status_code == 401) {
if (err->matrix_error.unauthorized.flows.empty()) {
nhlog::net()->warn(
"failed to retrieve registration flows1: ({}) "
"{}",
static_cast<int>(err->status_code),
err->matrix_error.error);
emit errorOccurred();
emit registerErrorCb(
QString::fromStdString(err->matrix_error.error));
return;
}
emit registrationFlow(
username, password, err->matrix_error.unauthorized);
return;
}
nhlog::net()->error(
"failed to register: status_code ({}), matrix_error({})",
static_cast<int>(err->status_code),
err->matrix_error.error);
emit registerErrorCb(QString::fromStdString(err->matrix_error.error));
emit errorOccurred();
});
nhlog::net()->info("Autodiscovery: Discovered '" + res.homeserver.base_url + "'");
http::client()->set_server(res.homeserver.base_url);
// Check that the homeserver can be reached
emit versionsCheck();
});
}
void
RegisterPage::doVersionsCheck()
{
// Make a request to /_matrix/client/versions to check the address
// given is a Matrix homeserver.
http::client()->versions(
[this](const mtx::responses::Versions &, mtx::http::RequestErr err) {
if (err) {
if (err->status_code == 404) {
emit serverError(
tr("The required endpoints were not found. Possibly "
"not a Matrix server."));
return;
}
if (!err->parse_error.empty()) {
emit serverError(
tr("Received malformed response. Make sure the homeserver "
"domain is valid."));
return;
}
emit serverError(tr("An unknown error occured. Make sure the "
"homeserver domain is valid."));
return;
}
// Attempt registration without an `auth` dict
emit registration();
});
}
void
RegisterPage::doRegistration()
{
// These inputs should still be alright, but check just in case
if (checkUsername() && checkPassword() && checkPasswordConfirmation()) {
auto username = username_input_->text().toStdString();
auto password = password_input_->text().toStdString();
http::client()->registration(username, password, registrationCb());
}
}
void
RegisterPage::doRegistrationWithAuth(const mtx::user_interactive::Auth &auth)
{
// These inputs should still be alright, but check just in case
if (checkUsername() && checkPassword() && checkPasswordConfirmation()) {
auto username = username_input_->text().toStdString();
auto password = password_input_->text().toStdString();
http::client()->registration(username, password, auth, registrationCb());
}
}
mtx::http::Callback<mtx::responses::Register>
RegisterPage::registrationCb()
{
// Return a function to be used as the callback when an attempt at
// registration is made.
return [this](const mtx::responses::Register &res, mtx::http::RequestErr err) {
if (!err) {
http::client()->set_user(res.user_id);
http::client()->set_access_token(res.access_token);
emit registerOk();
return;
}
// The server requires registration flows.
if (err->status_code == 401) {
if (err->matrix_error.unauthorized.flows.empty()) {
nhlog::net()->warn("failed to retrieve registration flows: "
"status_code({}), matrix_error({}) ",
static_cast<int>(err->status_code),
err->matrix_error.error);
showError(QString::fromStdString(err->matrix_error.error));
return;
}
// Attempt to complete a UIA stage
emit UIA(err->matrix_error.unauthorized);
return;
}
nhlog::net()->error("failed to register: status_code ({}), matrix_error({})",
static_cast<int>(err->status_code),
err->matrix_error.error);
showError(QString::fromStdString(err->matrix_error.error));
};
}
void
RegisterPage::doUIA(const mtx::user_interactive::Unauthorized &unauthorized)
{
auto completed_stages = unauthorized.completed;
auto flows = unauthorized.flows;
auto session =
unauthorized.session.empty() ? http::client()->generate_txn_id() : unauthorized.session;
nhlog::ui()->info("Completed stages: {}", completed_stages.size());
if (!completed_stages.empty()) {
// Get rid of all flows which don't start with the sequence of
// stages that have already been completed.
flows.erase(
std::remove_if(flows.begin(),
flows.end(),
[completed_stages](auto flow) {
if (completed_stages.size() > flow.stages.size())
return true;
for (size_t f = 0; f < completed_stages.size(); f++)
if (completed_stages[f] != flow.stages[f])
return true;
return false;
}),
flows.end());
}
if (flows.empty()) {
nhlog::ui()->error("No available registration flows!");
showError(tr("No supported registration flows!"));
return;
}
auto current_stage = flows.front().stages.at(completed_stages.size());
if (current_stage == mtx::user_interactive::auth_types::recaptcha) {
auto captchaDialog = new dialogs::ReCaptcha(QString::fromStdString(session), this);
connect(captchaDialog,
&dialogs::ReCaptcha::confirmation,
this,
[this, session, captchaDialog]() {
captchaDialog->close();
captchaDialog->deleteLater();
doRegistrationWithAuth(mtx::user_interactive::Auth{
session, mtx::user_interactive::auth::Fallback{}});
});
connect(
captchaDialog, &dialogs::ReCaptcha::cancel, this, &RegisterPage::errorOccurred);
QTimer::singleShot(1000, this, [captchaDialog]() { captchaDialog->show(); });
} else if (current_stage == mtx::user_interactive::auth_types::dummy) {
doRegistrationWithAuth(
mtx::user_interactive::Auth{session, mtx::user_interactive::auth::Dummy{}});
} else {
// use fallback
auto dialog = new dialogs::FallbackAuth(
QString::fromStdString(current_stage), QString::fromStdString(session), this);
connect(
dialog, &dialogs::FallbackAuth::confirmation, this, [this, session, dialog]() {
dialog->close();
dialog->deleteLater();
emit registrationWithAuth(mtx::user_interactive::Auth{
session, mtx::user_interactive::auth::Fallback{}});
});
connect(dialog, &dialogs::FallbackAuth::cancel, this, &RegisterPage::errorOccurred);
dialog->show();
}
}
void
RegisterPage::paintEvent(QPaintEvent *)
{

View file

@ -10,6 +10,7 @@
#include <memory>
#include <mtx/user_interactive.hpp>
#include <mtxclient/http/client.hpp>
class FlatButton;
class RaisedButton;
@ -33,17 +34,16 @@ signals:
void errorOccurred();
//! Used to trigger the corresponding slot outside of the main thread.
void versionErrorCb(const QString &err);
void serverError(const QString &err);
void wellKnownLookup();
void versionsCheck();
void registration();
void UIA(const mtx::user_interactive::Unauthorized &unauthorized);
void registrationWithAuth(const mtx::user_interactive::Auth &auth);
void registering();
void registerOk();
void registerErrorCb(const QString &msg);
void registrationFlow(const std::string &user,
const std::string &pass,
const mtx::user_interactive::Unauthorized &unauthorized);
void registerAuth(const std::string &user,
const std::string &pass,
const mtx::user_interactive::Auth &auth);
private slots:
void onBackButtonClicked();
@ -51,12 +51,22 @@ private slots:
// function for showing different errors
void showError(const QString &msg);
void showError(QLabel *label, const QString &msg);
bool checkOneField(QLabel *label, const TextField *t_field, const QString &msg);
bool checkUsername();
bool checkPassword();
bool checkPasswordConfirmation();
bool checkServer();
void doWellKnownLookup();
void doVersionsCheck();
void doRegistration();
void doUIA(const mtx::user_interactive::Unauthorized &unauthorized);
void doRegistrationWithAuth(const mtx::user_interactive::Auth &auth);
mtx::http::Callback<mtx::responses::Register> registrationCb();
private:
bool checkOneField(QLabel *label, const TextField *t_field, const QString &msg);
bool checkFields();
void showError(QLabel *label, const QString &msg);
void checkVersionAndRegister(const std::string &username, const std::string &password);
QVBoxLayout *top_layout_;
QHBoxLayout *back_layout_;
@ -69,6 +79,7 @@ private:
QLabel *error_password_label_;
QLabel *error_password_confirmation_label_;
QLabel *error_server_label_;
QLabel *error_registration_token_label_;
FlatButton *back_button_;
RaisedButton *register_button_;
@ -81,4 +92,5 @@ private:
TextField *password_input_;
TextField *password_confirmation_;
TextField *server_input_;
TextField *registration_token_input_;
};

View file

@ -0,0 +1,350 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "SingleImagePackModel.h"
#include <QFile>
#include <QMimeDatabase>
#include "Cache_p.h"
#include "ChatPage.h"
#include "Logging.h"
#include "MatrixClient.h"
#include "Utils.h"
#include "timeline/Permissions.h"
#include "timeline/TimelineModel.h"
Q_DECLARE_METATYPE(mtx::common::ImageInfo)
SingleImagePackModel::SingleImagePackModel(ImagePackInfo pack_, QObject *parent)
: QAbstractListModel(parent)
, roomid_(std::move(pack_.source_room))
, statekey_(std::move(pack_.state_key))
, old_statekey_(statekey_)
, pack(std::move(pack_.pack))
{
[[maybe_unused]] static auto imageInfoType = qRegisterMetaType<mtx::common::ImageInfo>();
if (!pack.pack)
pack.pack = mtx::events::msc2545::ImagePack::PackDescription{};
for (const auto &e : pack.images)
shortcodes.push_back(e.first);
connect(this, &SingleImagePackModel::addImage, this, &SingleImagePackModel::addImageCb);
}
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::setData(const QModelIndex &index, const QVariant &value, int role)
{
using mtx::events::msc2545::PackUsage;
if (hasIndex(index.row(), index.column(), index.parent())) {
auto &img = pack.images.at(shortcodes.at(index.row()));
switch (role) {
case ShortCode: {
auto newCode = value.toString().toStdString();
// otherwise we delete this by accident
if (pack.images.count(newCode))
return false;
auto tmp = img;
auto oldCode = shortcodes.at(index.row());
pack.images.erase(oldCode);
shortcodes[index.row()] = newCode;
pack.images.insert({newCode, tmp});
emit dataChanged(
this->index(index.row()), this->index(index.row()), {Roles::ShortCode});
return true;
}
case Body:
img.body = value.toString().toStdString();
emit dataChanged(
this->index(index.row()), this->index(index.row()), {Roles::Body});
return true;
case IsEmote: {
bool isEmote = value.toBool();
bool isSticker =
img.overrides_usage() ? img.is_sticker() : pack.pack->is_sticker();
img.usage.set(PackUsage::Emoji, isEmote);
img.usage.set(PackUsage::Sticker, isSticker);
if (img.usage == pack.pack->usage)
img.usage.reset();
emit dataChanged(
this->index(index.row()), this->index(index.row()), {Roles::IsEmote});
return true;
}
case IsSticker: {
bool isEmote =
img.overrides_usage() ? img.is_emoji() : pack.pack->is_emoji();
bool isSticker = value.toBool();
img.usage.set(PackUsage::Emoji, isEmote);
img.usage.set(PackUsage::Sticker, isSticker);
if (img.usage == pack.pack->usage)
img.usage.reset();
emit dataChanged(
this->index(index.row()), this->index(index.row()), {Roles::IsSticker});
return true;
}
}
}
return false;
}
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();
});
}
bool
SingleImagePackModel::canEdit() const
{
if (roomid_.empty())
return true;
else
return Permissions(QString::fromStdString(roomid_))
.canChange(qml_mtx_events::ImagePackInRoom);
}
void
SingleImagePackModel::setPackname(QString val)
{
auto val_ = val.toStdString();
if (val_ != this->pack.pack->display_name) {
this->pack.pack->display_name = val_;
emit packnameChanged();
}
}
void
SingleImagePackModel::setAttribution(QString val)
{
auto val_ = val.toStdString();
if (val_ != this->pack.pack->attribution) {
this->pack.pack->attribution = val_;
emit attributionChanged();
}
}
void
SingleImagePackModel::setAvatarUrl(QString val)
{
auto val_ = val.toStdString();
if (val_ != this->pack.pack->avatar_url) {
this->pack.pack->avatar_url = val_;
emit avatarUrlChanged();
}
}
void
SingleImagePackModel::setStatekey(QString val)
{
auto val_ = val.toStdString();
if (val_ != statekey_) {
statekey_ = val_;
emit statekeyChanged();
}
}
void
SingleImagePackModel::setIsStickerPack(bool val)
{
using mtx::events::msc2545::PackUsage;
if (val != pack.pack->is_sticker()) {
pack.pack->usage.set(PackUsage::Sticker, val);
emit isStickerPackChanged();
}
}
void
SingleImagePackModel::setIsEmotePack(bool val)
{
using mtx::events::msc2545::PackUsage;
if (val != pack.pack->is_emoji()) {
pack.pack->usage.set(PackUsage::Emoji, val);
emit isEmotePackChanged();
}
}
void
SingleImagePackModel::save()
{
if (roomid_.empty()) {
http::client()->put_account_data(pack, [](mtx::http::RequestErr e) {
if (e)
ChatPage::instance()->showNotification(
tr("Failed to update image pack: {}")
.arg(QString::fromStdString(e->matrix_error.error)));
});
} else {
if (old_statekey_ != statekey_) {
http::client()->send_state_event(
roomid_,
to_string(mtx::events::EventType::ImagePackInRoom),
old_statekey_,
nlohmann::json::object(),
[](const mtx::responses::EventId &, mtx::http::RequestErr e) {
if (e)
ChatPage::instance()->showNotification(
tr("Failed to delete old image pack: {}")
.arg(QString::fromStdString(e->matrix_error.error)));
});
}
http::client()->send_state_event(
roomid_,
statekey_,
pack,
[this](const mtx::responses::EventId &, mtx::http::RequestErr e) {
if (e)
ChatPage::instance()->showNotification(
tr("Failed to update image pack: {}")
.arg(QString::fromStdString(e->matrix_error.error)));
nhlog::net()->info("Uploaded image pack: {}", statekey_);
});
}
}
void
SingleImagePackModel::addStickers(QList<QUrl> files)
{
for (const auto &f : files) {
auto file = QFile(f.toLocalFile());
if (!file.open(QFile::ReadOnly)) {
ChatPage::instance()->showNotification(
tr("Failed to open image: {}").arg(f.toLocalFile()));
return;
}
auto bytes = file.readAll();
auto img = utils::readImage(bytes);
mtx::common::ImageInfo info{};
auto sz = img.size() / 2;
if (sz.width() > 512 || sz.height() > 512) {
sz.scale(512, 512, Qt::AspectRatioMode::KeepAspectRatio);
}
info.h = sz.height();
info.w = sz.width();
info.size = bytes.size();
auto filename = f.fileName().toStdString();
http::client()->upload(
bytes.toStdString(),
QMimeDatabase().mimeTypeForFile(f.toLocalFile()).name().toStdString(),
filename,
[this, filename, info](const mtx::responses::ContentURI &uri,
mtx::http::RequestErr e) {
if (e) {
ChatPage::instance()->showNotification(
tr("Failed to upload image: {}")
.arg(QString::fromStdString(e->matrix_error.error)));
return;
}
emit addImage(uri.content_uri, filename, info);
});
}
}
void
SingleImagePackModel::addImageCb(std::string uri, std::string filename, mtx::common::ImageInfo info)
{
mtx::events::msc2545::PackImage img{};
img.url = uri;
img.info = info;
beginInsertRows(
QModelIndex(), static_cast<int>(shortcodes.size()), static_cast<int>(shortcodes.size()));
pack.images[filename] = img;
shortcodes.push_back(filename);
endInsertRows();
}

View file

@ -0,0 +1,93 @@
// SPDX-FileCopyrightText: 2021 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QAbstractListModel>
#include <QList>
#include <QUrl>
#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 WRITE setStatekey NOTIFY statekeyChanged)
Q_PROPERTY(
QString attribution READ attribution WRITE setAttribution NOTIFY attributionChanged)
Q_PROPERTY(QString packname READ packname WRITE setPackname NOTIFY packnameChanged)
Q_PROPERTY(QString avatarUrl READ avatarUrl WRITE setAvatarUrl NOTIFY avatarUrlChanged)
Q_PROPERTY(
bool isStickerPack READ isStickerPack WRITE setIsStickerPack NOTIFY isStickerPackChanged)
Q_PROPERTY(bool isEmotePack READ isEmotePack WRITE setIsEmotePack NOTIFY isEmotePackChanged)
Q_PROPERTY(bool isGloballyEnabled READ isGloballyEnabled WRITE setGloballyEnabled NOTIFY
globallyEnabledChanged)
Q_PROPERTY(bool canEdit READ canEdit CONSTANT)
public:
enum Roles
{
Url = Qt::UserRole,
ShortCode,
Body,
IsEmote,
IsSticker,
};
Q_ENUM(Roles);
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;
bool setData(const QModelIndex &index,
const QVariant &value,
int role = Qt::EditRole) 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;
bool canEdit() const;
void setGloballyEnabled(bool enabled);
void setPackname(QString val);
void setAttribution(QString val);
void setAvatarUrl(QString val);
void setStatekey(QString val);
void setIsStickerPack(bool val);
void setIsEmotePack(bool val);
Q_INVOKABLE void save();
Q_INVOKABLE void addStickers(QList<QUrl> files);
signals:
void globallyEnabledChanged();
void statekeyChanged();
void attributionChanged();
void packnameChanged();
void avatarUrlChanged();
void isEmotePackChanged();
void isStickerPackChanged();
void addImage(std::string uri, std::string filename, mtx::common::ImageInfo info);
private slots:
void addImageCb(std::string uri, std::string filename, mtx::common::ImageInfo info);
private:
std::string roomid_;
std::string statekey_, old_statekey_;
mtx::events::msc2545::ImagePack pack;
std::vector<std::string> shortcodes;
};

View file

@ -90,13 +90,11 @@ UserSettings::load(std::optional<QString> profile)
decryptSidebar_ = settings.value("user/decrypt_sidebar", true).toBool();
privacyScreen_ = settings.value("user/privacy_screen", false).toBool();
privacyScreenTimeout_ = settings.value("user/privacy_screen_timeout", 0).toInt();
shareKeysWithTrustedUsers_ =
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();
auto tempPresence = settings.value("user/presence", "").toString().toStdString();
auto presenceValue = QMetaEnum::fromType<Presence>().keyToValue(tempPresence.c_str());
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();
auto tempPresence = settings.value("user/presence", "").toString().toStdString();
auto presenceValue = QMetaEnum::fromType<Presence>().keyToValue(tempPresence.c_str());
if (presenceValue < 0)
presenceValue = 0;
presence_ = static_cast<Presence>(presenceValue);
@ -123,6 +121,12 @@ UserSettings::load(std::optional<QString> profile)
userId_ = settings.value(prefix + "auth/user_id", "").toString();
deviceId_ = settings.value(prefix + "auth/device_id", "").toString();
shareKeysWithTrustedUsers_ =
settings.value(prefix + "user/automatically_share_keys_with_trusted_users", false)
.toBool();
onlyShareKeysWithVerifiedUsers_ =
settings.value(prefix + "user/only_share_keys_with_verified_users", false).toBool();
disableCertificateValidation_ =
settings.value("disable_certificate_validation", false).toBool();
@ -401,6 +405,17 @@ UserSettings::setUseStunServer(bool useStunServer)
save();
}
void
UserSettings::setOnlyShareKeysWithVerifiedUsers(bool shareKeys)
{
if (shareKeys == onlyShareKeysWithVerifiedUsers_)
return;
onlyShareKeysWithVerifiedUsers_ = shareKeys;
emit onlyShareKeysWithVerifiedUsersChanged(shareKeys);
save();
}
void
UserSettings::setShareKeysWithTrustedUsers(bool shareKeys)
{
@ -610,8 +625,6 @@ UserSettings::save()
settings.setValue("decrypt_sidebar", decryptSidebar_);
settings.setValue("privacy_screen", privacyScreen_);
settings.setValue("privacy_screen_timeout", privacyScreenTimeout_);
settings.setValue("automatically_share_keys_with_trusted_users",
shareKeysWithTrustedUsers_);
settings.setValue("mobile_mode", mobileMode_);
settings.setValue("font_size", baseFontSize_);
settings.setValue("typing_notifications", typingNotifications_);
@ -650,6 +663,11 @@ UserSettings::save()
settings.setValue(prefix + "auth/user_id", userId_);
settings.setValue(prefix + "auth/device_id", deviceId_);
settings.setValue(prefix + "user/automatically_share_keys_with_trusted_users",
shareKeysWithTrustedUsers_);
settings.setValue(prefix + "user/only_share_keys_with_verified_users",
onlyShareKeysWithVerifiedUsers_);
settings.setValue("disable_certificate_validation", disableCertificateValidation_);
settings.sync();
@ -703,41 +721,43 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
general_->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
general_->setFont(font);
trayToggle_ = new Toggle{this};
startInTrayToggle_ = new Toggle{this};
avatarCircles_ = new Toggle{this};
decryptSidebar_ = new Toggle(this);
privacyScreen_ = new Toggle{this};
shareKeysWithTrustedUsers_ = new Toggle(this);
groupViewToggle_ = new Toggle{this};
timelineButtonsToggle_ = new Toggle{this};
typingNotifications_ = new Toggle{this};
messageHoverHighlight_ = new Toggle{this};
enlargeEmojiOnlyMessages_ = new Toggle{this};
sortByImportance_ = new Toggle{this};
readReceipts_ = new Toggle{this};
markdown_ = new Toggle{this};
desktopNotifications_ = new Toggle{this};
alertOnNotification_ = new Toggle{this};
useStunServer_ = new Toggle{this};
mobileMode_ = new Toggle{this};
scaleFactorCombo_ = new QComboBox{this};
fontSizeCombo_ = new QComboBox{this};
fontSelectionCombo_ = new QFontComboBox{this};
emojiFontSelectionCombo_ = new QComboBox{this};
ringtoneCombo_ = new QComboBox{this};
microphoneCombo_ = new QComboBox{this};
cameraCombo_ = new QComboBox{this};
cameraResolutionCombo_ = new QComboBox{this};
cameraFrameRateCombo_ = new QComboBox{this};
timelineMaxWidthSpin_ = new QSpinBox{this};
privacyScreenTimeout_ = new QSpinBox{this};
trayToggle_ = new Toggle{this};
startInTrayToggle_ = new Toggle{this};
avatarCircles_ = new Toggle{this};
decryptSidebar_ = new Toggle(this);
privacyScreen_ = new Toggle{this};
onlyShareKeysWithVerifiedUsers_ = new Toggle(this);
shareKeysWithTrustedUsers_ = new Toggle(this);
groupViewToggle_ = new Toggle{this};
timelineButtonsToggle_ = new Toggle{this};
typingNotifications_ = new Toggle{this};
messageHoverHighlight_ = new Toggle{this};
enlargeEmojiOnlyMessages_ = new Toggle{this};
sortByImportance_ = new Toggle{this};
readReceipts_ = new Toggle{this};
markdown_ = new Toggle{this};
desktopNotifications_ = new Toggle{this};
alertOnNotification_ = new Toggle{this};
useStunServer_ = new Toggle{this};
mobileMode_ = new Toggle{this};
scaleFactorCombo_ = new QComboBox{this};
fontSizeCombo_ = new QComboBox{this};
fontSelectionCombo_ = new QFontComboBox{this};
emojiFontSelectionCombo_ = new QComboBox{this};
ringtoneCombo_ = new QComboBox{this};
microphoneCombo_ = new QComboBox{this};
cameraCombo_ = new QComboBox{this};
cameraResolutionCombo_ = new QComboBox{this};
cameraFrameRateCombo_ = new QComboBox{this};
timelineMaxWidthSpin_ = new QSpinBox{this};
privacyScreenTimeout_ = new QSpinBox{this};
trayToggle_->setChecked(settings_->tray());
startInTrayToggle_->setChecked(settings_->startInTray());
avatarCircles_->setChecked(settings_->avatarCircles());
decryptSidebar_->setChecked(settings_->decryptSidebar());
privacyScreen_->setChecked(settings_->privacyScreen());
onlyShareKeysWithVerifiedUsers_->setChecked(settings_->onlyShareKeysWithVerifiedUsers());
shareKeysWithTrustedUsers_->setChecked(settings_->shareKeysWithTrustedUsers());
groupViewToggle_->setChecked(settings_->groupView());
timelineButtonsToggle_->setChecked(settings_->buttonsInTimeline());
@ -1008,10 +1028,14 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
formLayout_->addRow(new HorizontalLine{this});
boxWrap(tr("Device ID"), deviceIdValue_);
boxWrap(tr("Device Fingerprint"), deviceFingerprintValue_);
boxWrap(
tr("Share keys with verified users and devices"),
shareKeysWithTrustedUsers_,
tr("Automatically replies to key requests from other users, if they are verified."));
boxWrap(tr("Send encrypted messages to verified users only"),
onlyShareKeysWithVerifiedUsers_,
tr("Requires a user to be verified to send encrypted messages to them. This "
"improves safety but makes E2EE more tedious."));
boxWrap(tr("Share keys with verified users and devices"),
shareKeysWithTrustedUsers_,
tr("Automatically replies to key requests from other users, if they are verified, "
"even if that device shouldn't have access to those keys otherwise."));
formLayout_->addRow(new HorizontalLine{this});
formLayout_->addRow(sessionKeysLabel, sessionKeysLayout);
formLayout_->addRow(crossSigningKeysLabel, crossSigningKeysLayout);
@ -1179,6 +1203,10 @@ UserSettingsPage::UserSettingsPage(QSharedPointer<UserSettings> settings, QWidge
}
});
connect(onlyShareKeysWithVerifiedUsers_, &Toggle::toggled, this, [this](bool enabled) {
settings_->setOnlyShareKeysWithVerifiedUsers(enabled);
});
connect(shareKeysWithTrustedUsers_, &Toggle::toggled, this, [this](bool enabled) {
settings_->setShareKeysWithTrustedUsers(enabled);
});
@ -1271,6 +1299,7 @@ UserSettingsPage::showEvent(QShowEvent *)
groupViewToggle_->setState(settings_->groupView());
decryptSidebar_->setState(settings_->decryptSidebar());
privacyScreen_->setState(settings_->privacyScreen());
onlyShareKeysWithVerifiedUsers_->setState(settings_->onlyShareKeysWithVerifiedUsers());
shareKeysWithTrustedUsers_->setState(settings_->shareKeysWithTrustedUsers());
avatarCircles_->setState(settings_->avatarCircles());
typingNotifications_->setState(settings_->typingNotifications());
@ -1399,7 +1428,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

@ -88,6 +88,8 @@ class UserSettings : public QObject
setScreenShareHideCursor NOTIFY screenShareHideCursorChanged)
Q_PROPERTY(
bool useStunServer READ useStunServer WRITE setUseStunServer NOTIFY useStunServerChanged)
Q_PROPERTY(bool onlyShareKeysWithVerifiedUsers READ onlyShareKeysWithVerifiedUsers WRITE
setOnlyShareKeysWithVerifiedUsers NOTIFY onlyShareKeysWithVerifiedUsersChanged)
Q_PROPERTY(bool shareKeysWithTrustedUsers READ shareKeysWithTrustedUsers WRITE
setShareKeysWithTrustedUsers NOTIFY shareKeysWithTrustedUsersChanged)
Q_PROPERTY(QString profile READ profile WRITE setProfile NOTIFY profileChanged)
@ -152,6 +154,7 @@ public:
void setScreenShareRemoteVideo(bool state);
void setScreenShareHideCursor(bool state);
void setUseStunServer(bool state);
void setOnlyShareKeysWithVerifiedUsers(bool state);
void setShareKeysWithTrustedUsers(bool state);
void setProfile(QString profile);
void setUserId(QString userId);
@ -208,6 +211,7 @@ public:
bool screenShareHideCursor() const { return screenShareHideCursor_; }
bool useStunServer() const { return useStunServer_; }
bool shareKeysWithTrustedUsers() const { return shareKeysWithTrustedUsers_; }
bool onlyShareKeysWithVerifiedUsers() const { return onlyShareKeysWithVerifiedUsers_; }
QString profile() const { return profile_; }
QString userId() const { return userId_; }
QString accessToken() const { return accessToken_; }
@ -252,6 +256,7 @@ signals:
void screenShareRemoteVideoChanged(bool state);
void screenShareHideCursorChanged(bool state);
void useStunServerChanged(bool state);
void onlyShareKeysWithVerifiedUsersChanged(bool state);
void shareKeysWithTrustedUsersChanged(bool state);
void profileChanged(QString profile);
void userIdChanged(QString userId);
@ -284,6 +289,7 @@ private:
bool privacyScreen_;
int privacyScreenTimeout_;
bool shareKeysWithTrustedUsers_;
bool onlyShareKeysWithVerifiedUsers_;
bool mobileMode_;
int timelineMaxWidth_;
int roomListWidth_;
@ -372,6 +378,7 @@ private:
Toggle *privacyScreen_;
QSpinBox *privacyScreenTimeout_;
Toggle *shareKeysWithTrustedUsers_;
Toggle *onlyShareKeysWithVerifiedUsers_;
Toggle *mobileMode_;
QLabel *deviceFingerprintValue_;
QLabel *deviceIdValue_;

View file

@ -172,32 +172,6 @@ utils::scaleFactor()
return settings.value("settings/scale_factor", -1).toFloat();
}
bool
utils::respondsToKeyRequests(const std::string &roomId)
{
return respondsToKeyRequests(QString::fromStdString(roomId));
}
bool
utils::respondsToKeyRequests(const QString &roomId)
{
if (roomId.isEmpty())
return false;
QSettings settings;
return settings.value("rooms/respond_to_key_requests/" + roomId, false).toBool();
}
void
utils::setKeyRequestsPreference(QString roomId, bool value)
{
if (roomId.isEmpty())
return;
QSettings settings;
settings.setValue("rooms/respond_to_key_requests/" + roomId, value);
}
QString
utils::descriptiveTime(const QDateTime &then)
{
@ -556,7 +530,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

@ -67,15 +67,6 @@ scaleFactor();
void
setScaleFactor(float factor);
//! Whether or not we should respond to key requests for the given room.
bool
respondsToKeyRequests(const QString &roomId);
bool
respondsToKeyRequests(const std::string &roomId);
void
setKeyRequestsPreference(QString roomId, bool value);
//! Human friendly timestamp representation.
QString
descriptiveTime(const QDateTime &then);

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

Some files were not shown because too many files have changed in this diff Show more