summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoe <rubberduckie3554@gmail.com>2021-07-24 18:26:25 -0400
committerJoe <rubberduckie3554@gmail.com>2021-07-24 18:26:25 -0400
commit3f567a8da7f41a2ce094f15340e39ea8aec55fb3 (patch)
tree42b6f59f0fa36ad738133198333cccf0c4100621
parentRemove 'respond to key requests' functionality (diff)
parentFix edge case that could lead to no new one time keys being uploaded (diff)
downloadnheko-3f567a8da7f41a2ce094f15340e39ea8aec55fb3.tar.xz
Merge master and fix conflicts
-rw-r--r--CMakeLists.txt18
-rw-r--r--io.github.NhekoReborn.Nheko.yaml2
-rw-r--r--nheko-nightly.flatpakref1
-rw-r--r--nheko-nightly.flatpakrepo1
-rw-r--r--resources/icons/ui/sticky-note-solid.svg1
-rw-r--r--resources/langs/nheko_cs.ts251
-rw-r--r--resources/langs/nheko_de.ts250
-rw-r--r--resources/langs/nheko_el.ts248
-rw-r--r--resources/langs/nheko_en.ts252
-rw-r--r--resources/langs/nheko_eo.ts250
-rw-r--r--resources/langs/nheko_es.ts250
-rw-r--r--resources/langs/nheko_et.ts252
-rw-r--r--resources/langs/nheko_fi.ts250
-rw-r--r--resources/langs/nheko_fr.ts250
-rw-r--r--resources/langs/nheko_hu.ts251
-rw-r--r--resources/langs/nheko_it.ts250
-rw-r--r--resources/langs/nheko_ja.ts249
-rw-r--r--resources/langs/nheko_ml.ts252
-rw-r--r--resources/langs/nheko_nl.ts248
-rw-r--r--resources/langs/nheko_pl.ts251
-rw-r--r--resources/langs/nheko_pt_BR.ts250
-rw-r--r--resources/langs/nheko_pt_PT.ts250
-rw-r--r--resources/langs/nheko_ro.ts251
-rw-r--r--resources/langs/nheko_ru.ts251
-rw-r--r--resources/langs/nheko_si.ts248
-rw-r--r--resources/langs/nheko_sv.ts252
-rw-r--r--resources/langs/nheko_zh_CN.ts249
-rw-r--r--resources/qml/Completer.qml2
-rw-r--r--resources/qml/InviteDialog.qml159
-rw-r--r--resources/qml/MatrixText.qml8
-rw-r--r--resources/qml/MatrixTextField.qml4
-rw-r--r--resources/qml/MessageInput.qml27
-rw-r--r--resources/qml/MessageView.qml31
-rw-r--r--resources/qml/RoomList.qml20
-rw-r--r--resources/qml/RoomMembers.qml148
-rw-r--r--resources/qml/RoomSettings.qml39
-rw-r--r--resources/qml/Root.qml72
-rw-r--r--resources/qml/TimelineRow.qml41
-rw-r--r--resources/qml/TimelineView.qml12
-rw-r--r--resources/qml/TopBar.qml12
-rw-r--r--resources/qml/delegates/MessageDelegate.qml13
-rw-r--r--resources/qml/delegates/Reply.qml2
-rw-r--r--resources/qml/dialogs/ImagePackSettingsDialog.qml309
-rw-r--r--resources/qml/emoji/EmojiButton.qml23
-rw-r--r--resources/qml/emoji/EmojiPicker.qml1
-rw-r--r--resources/qml/emoji/StickerPicker.qml180
-rw-r--r--resources/qml/voip/PlaceCall.qml4
-rw-r--r--resources/qml/voip/ScreenShare.qml2
-rw-r--r--resources/res.qrc17
-rw-r--r--src/Cache.cpp206
-rw-r--r--src/Cache.h9
-rw-r--r--src/CacheCryptoStructs.h27
-rw-r--r--src/CacheStructs.h8
-rw-r--r--src/Cache_p.h18
-rw-r--r--src/ChatPage.cpp84
-rw-r--r--src/CombinedImagePackModel.cpp77
-rw-r--r--src/CombinedImagePackModel.h48
-rw-r--r--src/ImagePackListModel.cpp76
-rw-r--r--src/ImagePackListModel.h37
-rw-r--r--src/InviteeItem.cpp28
-rw-r--r--src/InviteeItem.h31
-rw-r--r--src/InviteesModel.cpp84
-rw-r--r--src/InviteesModel.h63
-rw-r--r--src/MainWindow.cpp23
-rw-r--r--src/MainWindow.h1
-rw-r--r--src/MemberList.cpp111
-rw-r--r--src/MemberList.h66
-rw-r--r--src/MxcImageProvider.cpp1
-rw-r--r--src/Olm.cpp214
-rw-r--r--src/Olm.h5
-rw-r--r--src/SingleImagePackModel.cpp100
-rw-r--r--src/SingleImagePackModel.h61
-rw-r--r--src/UserSettingsPage.cpp7
-rw-r--r--src/Utils.cpp2
-rw-r--r--src/dialogs/InviteUsers.cpp158
-rw-r--r--src/dialogs/InviteUsers.h45
-rw-r--r--src/dialogs/MemberList.cpp146
-rw-r--r--src/dialogs/MemberList.h57
-rw-r--r--src/timeline/InputBar.cpp26
-rw-r--r--src/timeline/InputBar.h2
-rw-r--r--src/timeline/Permissions.cpp6
-rw-r--r--src/timeline/Permissions.h4
-rw-r--r--src/timeline/TimelineModel.cpp35
-rw-r--r--src/timeline/TimelineModel.h33
-rw-r--r--src/timeline/TimelineViewManager.cpp82
-rw-r--r--src/timeline/TimelineViewManager.h17
-rw-r--r--src/ui/RoomSettings.h2
87 files changed, 5666 insertions, 2988 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt

index 78900535..7b26602c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -281,11 +281,9 @@ set(SRC_FILES src/dialogs/CreateRoom.cpp src/dialogs/FallbackAuth.cpp src/dialogs/ImageOverlay.cpp - src/dialogs/InviteUsers.cpp src/dialogs/JoinRoom.cpp src/dialogs/LeaveRoom.cpp src/dialogs/Logout.cpp - src/dialogs/MemberList.cpp src/dialogs/PreviewUploadOverlay.cpp src/dialogs/ReCaptcha.cpp src/dialogs/ReadReceipts.cpp @@ -346,15 +344,19 @@ set(SRC_FILES src/CompletionProxyModel.cpp src/DeviceVerificationFlow.cpp src/EventAccessors.cpp - src/InviteeItem.cpp + src/InviteesModel.cpp src/Logging.cpp src/LoginPage.cpp src/MainWindow.cpp src/MatrixClient.cpp + src/MemberList.cpp src/MxcImageProvider.cpp src/Olm.cpp src/RegisterPage.cpp src/SSOHandler.cpp + src/CombinedImagePackModel.cpp + src/SingleImagePackModel.cpp + src/ImagePackListModel.cpp src/TrayIcon.cpp src/UserSettingsPage.cpp src/UsersModel.cpp @@ -380,7 +382,7 @@ if(USE_BUNDLED_MTXCLIENT) FetchContent_Declare( MatrixClient GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git - GIT_TAG 1c277e9ac69aafdaf6888ce595b21dc86e970f28 + GIT_TAG 316a4040785ee2eabac7ef5ce7b4acb71c48f6eb ) set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "") set(BUILD_LIB_TESTS OFF CACHE INTERNAL "") @@ -491,11 +493,9 @@ qt5_wrap_cpp(MOC_HEADERS src/dialogs/CreateRoom.h src/dialogs/FallbackAuth.h src/dialogs/ImageOverlay.h - src/dialogs/InviteUsers.h src/dialogs/JoinRoom.h src/dialogs/LeaveRoom.h src/dialogs/Logout.h - src/dialogs/MemberList.h src/dialogs/PreviewUploadOverlay.h src/dialogs/RawMessage.h src/dialogs/ReCaptcha.h @@ -553,12 +553,16 @@ qt5_wrap_cpp(MOC_HEADERS src/Clipboard.h src/CompletionProxyModel.h src/DeviceVerificationFlow.h - src/InviteeItem.h + src/InviteesModel.h src/LoginPage.h src/MainWindow.h + src/MemberList.h src/MxcImageProvider.h src/RegisterPage.h src/SSOHandler.h + src/CombinedImagePackModel.h + src/SingleImagePackModel.h + src/ImagePackListModel.h src/TrayIcon.h src/UserSettingsPage.h src/UsersModel.h diff --git a/io.github.NhekoReborn.Nheko.yaml b/io.github.NhekoReborn.Nheko.yaml
index b6f468db..0fa450b3 100644 --- a/io.github.NhekoReborn.Nheko.yaml +++ b/io.github.NhekoReborn.Nheko.yaml
@@ -161,7 +161,7 @@ modules: buildsystem: cmake-ninja name: mtxclient sources: - - commit: 1c277e9ac69aafdaf6888ce595b21dc86e970f28 + - commit: 316a4040785ee2eabac7ef5ce7b4acb71c48f6eb type: git url: https://github.com/Nheko-Reborn/mtxclient.git - config-opts: diff --git a/nheko-nightly.flatpakref b/nheko-nightly.flatpakref
index 7d27bdfe..74e47ecd 100644 --- a/nheko-nightly.flatpakref +++ b/nheko-nightly.flatpakref
@@ -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 diff --git a/nheko-nightly.flatpakrepo b/nheko-nightly.flatpakrepo
index 4fb1bc55..680558af 100644 --- a/nheko-nightly.flatpakrepo +++ b/nheko-nightly.flatpakrepo
@@ -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 diff --git a/resources/icons/ui/sticky-note-solid.svg b/resources/icons/ui/sticky-note-solid.svg new file mode 100644
index 00000000..bc36d474 --- /dev/null +++ b/resources/icons/ui/sticky-note-solid.svg
@@ -0,0 +1 @@ +<svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="sticky-note" class="svg-inline--fa fa-sticky-note fa-w-14" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path fill="currentColor" d="M312 320h136V56c0-13.3-10.7-24-24-24H24C10.7 32 0 42.7 0 56v400c0 13.3 10.7 24 24 24h264V344c0-13.2 10.8-24 24-24zm129 55l-98 98c-4.5 4.5-10.6 7-17 7h-6V352h128v6.1c0 6.3-2.5 12.4-7 16.9z"></path></svg> \ No newline at end of file diff --git a/resources/langs/nheko_cs.ts b/resources/langs/nheko_cs.ts
index c544bf6d..7c1134aa 100644 --- a/resources/langs/nheko_cs.ts +++ b/resources/langs/nheko_cs.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation type="unfinished"></translation> </message> @@ -48,7 +48,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation type="unfinished"></translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation type="unfinished"></translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation type="unfinished"></translation> </message> @@ -227,12 +227,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation type="unfinished"></translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation type="unfinished"></translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation type="unfinished"></translation> </message> @@ -617,16 +617,42 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> <message> - <location filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> + <location filename="../qml/InviteDialog.qml" line="+32"/> + <source>Invite users to %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> + <source>User ID to invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+14"/> + <source>@joe:matrix.org</source> + <comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+17"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+58"/> + <source>Invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>Cancel</source> <translation type="unfinished"></translation> </message> </context> @@ -741,27 +767,14 @@ Example: https://server.my:8787</source> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+128"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+187"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -771,7 +784,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -781,17 +794,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> @@ -806,23 +819,23 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+29"/> + <location line="+38"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> <message> - <location line="-18"/> + <location line="-24"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="-80"/> + <location line="-99"/> <location line="+9"/> <source>removed</source> <translation type="unfinished"></translation> </message> <message> - <location line="+80"/> + <location line="+102"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> @@ -830,7 +843,7 @@ Example: https://server.my:8787</source> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation type="unfinished"></translation> </message> @@ -851,6 +864,11 @@ Example: https://server.my:8787</source> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation type="unfinished"></translation> </message> @@ -868,17 +886,17 @@ Example: https://server.my:8787</source> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -888,7 +906,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation type="unfinished"></translation> </message> @@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation type="unfinished"></translation> </message> @@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1338,19 +1346,42 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1433,11 +1464,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation type="unfinished"></translation> @@ -1470,6 +1496,24 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1526,7 +1570,7 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation type="unfinished"></translation> </message> @@ -1547,6 +1591,14 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1567,7 +1619,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> @@ -1578,7 +1630,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation type="unfinished"></translation> </message> @@ -1713,12 +1765,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1747,7 +1799,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation type="unfinished"></translation> </message> @@ -1755,17 +1807,32 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation type="unfinished"></translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1773,7 +1840,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1781,18 +1848,17 @@ Example: https://server.my:8787</source> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1833,7 +1899,7 @@ Example: https://server.my:8787</source> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1843,7 +1909,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1892,7 +1958,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1901,7 +1967,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation type="unfinished"></translation> </message> @@ -2347,7 +2413,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2398,7 +2464,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -2470,19 +2536,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_de.ts b/resources/langs/nheko_de.ts
index 58c209a2..3cd35781 100644 --- a/resources/langs/nheko_de.ts +++ b/resources/langs/nheko_de.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation>Auf Bestätigung warten</translation> </message> @@ -48,7 +48,7 @@ <translation>Wartet darauf, dass die andere Seite die Verifizierung abschließt.</translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>Abbrechen</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>Nutzer konnte nicht eingeladen werden: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation>Einladung bestätigen</translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation>Nutzer %1 (%2) wirklich einladen?</translation> </message> @@ -227,12 +227,12 @@ <translation>Verbannung aufgehoben: %1</translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation>Möchtest du wirklich eine private Konversation mit %1 beginnen?</translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation>Migration des Caches fehlgeschlagen!</translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation>Geheimnisse entschlüsseln</translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation>Suche</translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation>Leute</translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation>Datei auswählen</translation> </message> @@ -617,17 +617,43 @@ <translation>Alle Dateien (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation>Medienupload fehlgeschlagen. Bitte versuche es erneut.</translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>Löschen</translation> + <location line="+58"/> + <source>Invite</source> + <translation>Einladen</translation> + </message> + <message> + <location line="+7"/> + <source>Cancel</source> + <translation>Abbrechen</translation> </message> </context> <context> @@ -745,22 +771,9 @@ Beispiel: https://mein.server:8787</translation> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>Teilnehmerliste</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation>OK</translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+110"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+169"/> <location line="+9"/> <source>removed</source> <translation>entfernt</translation> @@ -771,7 +784,7 @@ Beispiel: https://mein.server:8787</translation> <translation>Verschlüsselung aktiviert</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation>Raumname wurde gändert auf: %1</translation> </message> @@ -781,7 +794,7 @@ Beispiel: https://mein.server:8787</translation> <translation>Raumname wurde entfernt</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation>Raumthema wurde geändert auf: %1</translation> </message> @@ -791,17 +804,17 @@ Beispiel: https://mein.server:8787</translation> <translation>Thema wurde entfernt</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation>%1 hat dem Raumavatar geändert</translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation>%1 hat den Raum erstellt: %2</translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation>%1 hat einen Sprachanruf gestartet.</translation> </message> @@ -816,17 +829,17 @@ Beispiel: https://mein.server:8787</translation> <translation>%1 hat angerufen.</translation> </message> <message> - <location line="+11"/> + <location line="+14"/> <source>%1 answered the call.</source> <translation>%1 hat den Anruf angenommen.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 ended the call.</source> <translation>%1 hat den Anruf beendet.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>Negotiating call...</source> <translation>Wählt…</translation> </message> @@ -834,7 +847,7 @@ Beispiel: https://mein.server:8787</translation> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation>Auflegen</translation> </message> @@ -855,6 +868,11 @@ Beispiel: https://mein.server:8787</translation> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation>Sticker</translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation>Emoji</translation> </message> @@ -872,17 +890,17 @@ Beispiel: https://mein.server:8787</translation> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation>Bearbeiten</translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation>Reaktion senden</translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation>Antworten</translation> </message> @@ -892,7 +910,7 @@ Beispiel: https://mein.server:8787</translation> <translation>Optionen</translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation>&amp;Kopieren</translation> </message> @@ -1100,7 +1118,7 @@ Beispiel: https://mein.server:8787</translation> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation>Unimplementiertes Event: </translation> </message> @@ -1220,7 +1238,7 @@ Beispiel: https://mein.server:8787</translation> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation>Schließen</translation> </message> @@ -1233,7 +1251,7 @@ Beispiel: https://mein.server:8787</translation> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation>keine Version gespeichert</translation> </message> @@ -1241,7 +1259,7 @@ Beispiel: https://mein.server:8787</translation> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation>Neuer Tag</translation> </message> @@ -1281,17 +1299,7 @@ Beispiel: https://mein.server:8787</translation> <translation>Neuen Tag erstellen...</translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation>Akzeptieren</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation>Ablehnen</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation>Statusnachricht</translation> </message> @@ -1342,19 +1350,41 @@ Beispiel: https://mein.server:8787</translation> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation>Teilnehmer in %1</translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation> + <numerusform>%n Person in %1</numerusform> + <numerusform>%n Personen in %1</numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation>Lade mehr Leute ein</translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation>Raumeinstellungen</translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation>%1 Teilnehmer</translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation>EINSTELLUNGEN</translation> </message> @@ -1437,11 +1467,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation>Aktivierung der Verschlüsselung fehlgeschlagen: %1</translation> @@ -1474,6 +1499,24 @@ Beispiel: https://mein.server:8787</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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1530,7 +1573,7 @@ Beispiel: https://mein.server:8787</translation> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation>Fehlgeschlagen</translation> </message> @@ -1551,6 +1594,14 @@ Beispiel: https://mein.server:8787</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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1571,7 +1622,7 @@ Beispiel: https://mein.server:8787</translation> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation>Nachricht zurückziehen fehlgeschlagen: %1</translation> </message> @@ -1582,7 +1633,7 @@ Beispiel: https://mein.server:8787</translation> <translation>Event konnte nicht verschlüsselt werden, senden wurde abgebrochen!</translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation>Bild speichern</translation> </message> @@ -1716,12 +1767,12 @@ Beispiel: https://mein.server:8787</translation> <translation>%1 hat das Anklopfen zurückgezogen.</translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation>Du bist dem Raum beigetreten.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation>%1 hat den eigenen Avatar und Namen geändert zu %2.</translation> </message> @@ -1750,7 +1801,7 @@ Beispiel: https://mein.server:8787</translation> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation>Bearbeitet</translation> </message> @@ -1758,17 +1809,32 @@ Beispiel: https://mein.server:8787</translation> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation>Kein Raum geöffnet</translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation>%1 Teilnehmer</translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation>An der Unterhaltung teilnehmen</translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation>Einladung annehmen</translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation>Einladung ablehnen</translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation>Zurück zur Raumliste</translation> </message> @@ -1776,7 +1842,7 @@ Beispiel: https://mein.server:8787</translation> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation>Keinen verschlüsselten Chat mit diesem User gefunden. Erstelle einen verschlüsselten 1:1 Chat mit diesem Nutzer und versuche es erneut.</translation> </message> @@ -1784,18 +1850,17 @@ Beispiel: https://mein.server:8787</translation> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation>Zurück zur Raumliste</translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation>Kein Raum ausgewählt</translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation>Raumoptionen</translation> </message> @@ -1836,7 +1901,7 @@ Beispiel: https://mein.server:8787</translation> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation>Globales Nutzerprofil</translation> </message> @@ -1846,7 +1911,7 @@ Beispiel: https://mein.server:8787</translation> <translation>Raumspezifisches Nutzerprofil</translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation>Verifizieren</translation> @@ -1895,7 +1960,7 @@ Beispiel: https://mein.server:8787</translation> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation>Standard</translation> @@ -1904,7 +1969,7 @@ Beispiel: https://mein.server:8787</translation> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>Ins Benachrichtigungsfeld minimieren</translation> </message> @@ -2360,7 +2425,7 @@ Normalerweise animiert das den Taskbaricon oder färbt das Fenster orange ein.</ <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation>Auf Gegenseite warten…</translation> </message> @@ -2411,7 +2476,7 @@ Normalerweise animiert das den Taskbaricon oder färbt das Fenster orange ein.</ <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation>Gestern</translation> </message> @@ -2483,19 +2548,6 @@ Normalerweise animiert das den Taskbaricon oder färbt das Fenster orange ein.</ </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_el.ts b/resources/langs/nheko_el.ts
index d5d5f323..6df73f73 100644 --- a/resources/langs/nheko_el.ts +++ b/resources/langs/nheko_el.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation type="unfinished"></translation> </message> @@ -48,7 +48,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation type="unfinished">Άκυρο</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation type="unfinished"></translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation type="unfinished"></translation> </message> @@ -227,12 +227,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation type="unfinished"></translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation type="unfinished"></translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation type="unfinished">Διάλεξε ένα αρχείο</translation> </message> @@ -617,18 +617,44 @@ <translation type="unfinished">Όλα τα αρχεία (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> + <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> @@ -741,22 +767,9 @@ Example: https://server.my:8787</source> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>Μέλη</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+110"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+169"/> <location line="+9"/> <source>removed</source> <translation type="unfinished"></translation> @@ -767,7 +780,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -777,7 +790,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -787,17 +800,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> @@ -812,17 +825,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+11"/> + <location line="+14"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> @@ -830,7 +843,7 @@ Example: https://server.my:8787</source> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation type="unfinished"></translation> </message> @@ -851,6 +864,11 @@ Example: https://server.my:8787</source> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation type="unfinished"></translation> </message> @@ -868,17 +886,17 @@ Example: https://server.my:8787</source> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -888,7 +906,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation type="unfinished"></translation> </message> @@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation type="unfinished"></translation> </message> @@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished">Αποδοχή</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished">Απόρριψη</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1338,19 +1346,41 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1433,11 +1463,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation type="unfinished"></translation> @@ -1470,6 +1495,24 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation type="unfinished"></translation> </message> @@ -1547,6 +1590,14 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> @@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation type="unfinished">Αποθήκευση Εικόνας</translation> </message> @@ -1712,12 +1763,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation type="unfinished"></translation> </message> @@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation type="unfinished"></translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>Ελαχιστοποίηση</translation> </message> @@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -2469,19 +2534,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_en.ts b/resources/langs/nheko_en.ts
index 7d3f8276..97a67b06 100644 --- a/resources/langs/nheko_en.ts +++ b/resources/langs/nheko_en.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation>Awaiting Confirmation</translation> </message> @@ -48,7 +48,7 @@ <translation>Waiting for other side to complete verification.</translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>Cancel</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>Failed to invite user: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation>Confirm invite</translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation>Do you really want to invite %1 (%2)?</translation> </message> @@ -227,12 +227,12 @@ <translation>Unbanned user: %1</translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation>Do you really want to start a private chat with %1?</translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation>Cache migration failed!</translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation>Decrypt secrets</translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation>Search</translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation>People</translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation>Select a file</translation> </message> @@ -617,17 +617,43 @@ <translation>All Files (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation>Failed to upload media. Please try again.</translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>Remove</translation> + <location line="+58"/> + <source>Invite</source> + <translation>Invite</translation> + </message> + <message> + <location line="+7"/> + <source>Cancel</source> + <translation>Cancel</translation> </message> </context> <context> @@ -745,27 +771,14 @@ Example: https://server.my:8787</translation> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>Room members</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation>OK</translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+128"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+187"/> <source>Encryption enabled</source> <translation>Encryption enabled</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation>room name changed to: %1</translation> </message> @@ -775,7 +788,7 @@ Example: https://server.my:8787</translation> <translation>removed room name</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation>topic changed to: %1</translation> </message> @@ -785,17 +798,17 @@ Example: https://server.my:8787</translation> <translation>removed topic</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation>%1 changed the room avatar</translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation>%1 created and configured room: %2</translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation>%1 placed a voice call.</translation> </message> @@ -810,23 +823,23 @@ Example: https://server.my:8787</translation> <translation>%1 placed a call.</translation> </message> <message> - <location line="+29"/> + <location line="+38"/> <source>Negotiating call...</source> <translation>Negotiating call…</translation> </message> <message> - <location line="-18"/> + <location line="-24"/> <source>%1 answered the call.</source> <translation>%1 answered the call.</translation> </message> <message> - <location line="-80"/> + <location line="-99"/> <location line="+9"/> <source>removed</source> <translation>removed</translation> </message> <message> - <location line="+80"/> + <location line="+102"/> <source>%1 ended the call.</source> <translation>%1 ended the call.</translation> </message> @@ -834,7 +847,7 @@ Example: https://server.my:8787</translation> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation>Hang up</translation> </message> @@ -855,6 +868,11 @@ Example: https://server.my:8787</translation> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation>Stickers</translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation>Emoji</translation> </message> @@ -872,17 +890,17 @@ Example: https://server.my:8787</translation> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation>Edit</translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation>React</translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation>Reply</translation> </message> @@ -892,7 +910,7 @@ Example: https://server.my:8787</translation> <translation>Options</translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation>&amp;Copy</translation> </message> @@ -1100,7 +1118,7 @@ Example: https://server.my:8787</translation> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation>unimplemented event: </translation> </message> @@ -1220,7 +1238,7 @@ Example: https://server.my:8787</translation> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation>Close</translation> </message> @@ -1233,7 +1251,7 @@ Example: https://server.my:8787</translation> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation>no version stored</translation> </message> @@ -1241,7 +1259,7 @@ Example: https://server.my:8787</translation> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation>New tag</translation> </message> @@ -1281,17 +1299,7 @@ Example: https://server.my:8787</translation> <translation>Create new tag...</translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation>Accept</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation>Decline</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation>Status Message</translation> </message> @@ -1342,19 +1350,41 @@ Example: https://server.my:8787</translation> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation>Members of %1</translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation> + <numerusform>%n person in %1</numerusform> + <numerusform>%n people in %1</numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation>Invite more people</translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation>Room Settings</translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation>%1 member(s)</translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation>SETTINGS</translation> </message> @@ -1439,11 +1469,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation>Failed to enable encryption: %1</translation> @@ -1476,6 +1501,24 @@ E2E implementation until device verification is completed.</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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1532,7 +1575,7 @@ E2E implementation until device verification is completed.</translation> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation>Failed</translation> </message> @@ -1553,6 +1596,14 @@ E2E implementation until device verification is completed.</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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1573,7 +1624,7 @@ E2E implementation until device verification is completed.</translation> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation>Message redaction failed: %1</translation> </message> @@ -1584,7 +1635,7 @@ E2E implementation until device verification is completed.</translation> <translation>Failed to encrypt event, sending aborted!</translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation>Save image</translation> </message> @@ -1718,12 +1769,12 @@ E2E implementation until device verification is completed.</translation> <translation>%1 redacted their knock.</translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation>You joined this room.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation>%1 has changed their avatar and changed their display name to %2.</translation> </message> @@ -1752,7 +1803,7 @@ E2E implementation until device verification is completed.</translation> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation>Edited</translation> </message> @@ -1760,17 +1811,32 @@ E2E implementation until device verification is completed.</translation> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation>No room open</translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation>%1 member(s)</translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation>join the conversation</translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation>accept invite</translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation>decline invite</translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation>Back to room list</translation> </message> @@ -1778,7 +1844,7 @@ E2E implementation until device verification is completed.</translation> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</translation> </message> @@ -1786,18 +1852,17 @@ E2E implementation until device verification is completed.</translation> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation>Back to room list</translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation>No room selected</translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation>Room options</translation> </message> @@ -1838,7 +1903,7 @@ E2E implementation until device verification is completed.</translation> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation>Global User Profile</translation> </message> @@ -1848,7 +1913,7 @@ E2E implementation until device verification is completed.</translation> <translation>Room User Profile</translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation>Verify</translation> @@ -1897,7 +1962,7 @@ E2E implementation until device verification is completed.</translation> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation>Default</translation> @@ -1906,7 +1971,7 @@ E2E implementation until device verification is completed.</translation> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>Minimize to tray</translation> </message> @@ -2363,7 +2428,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation>Waiting for other party…</translation> </message> @@ -2414,7 +2479,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation>Yesterday</translation> </message> @@ -2486,19 +2551,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_eo.ts b/resources/langs/nheko_eo.ts
index 26a67d49..f3529f28 100644 --- a/resources/langs/nheko_eo.ts +++ b/resources/langs/nheko_eo.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation>Atendante konfirmon</translation> </message> @@ -48,7 +48,7 @@ <translation>Atendante kontrolon venontan de la alia flanko.</translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>Nuligi</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>Malsukcesis inviti uzanton: %1</translation> </message> @@ -158,12 +158,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation>Konfirmu inviton</translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation>Ĉu vi certe volas inviti uzanton %1 (%2)?</translation> </message> @@ -228,12 +228,12 @@ <translation>Malforbaris uzanton: %1</translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation>Ĉu vi certe volas komenci privatan babilon kun %1?</translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation>Malsukcesis migrado de kaŝmemoro!</translation> </message> @@ -353,7 +353,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation>Malĉifri sekretojn</translation> </message> @@ -427,12 +427,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation>Serĉu</translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation>Homoj</translation> </message> @@ -608,7 +608,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation type="unfinished">Elektu dosieron</translation> </message> @@ -618,17 +618,43 @@ <translation>Ĉiuj dosieroj (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation>Malsukcesis alŝuti vidaŭdaĵojn. Bonvolu reprovi.</translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>Forigi</translation> + <location line="+7"/> + <source>Cancel</source> + <translation type="unfinished">Nuligi</translation> </message> </context> <context> @@ -748,22 +774,9 @@ Ekzemplo: https://servilo.mia:8787</translation> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>Membroj de la ĉambro</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation>Bone</translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+110"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+169"/> <location line="+9"/> <source>removed</source> <translation>forigita</translation> @@ -774,7 +787,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation>Nomo da ĉambro ŝanĝiĝis al: %1</translation> </message> @@ -784,7 +797,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -794,17 +807,17 @@ Ekzemplo: https://servilo.mia:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation>%1 metis voĉvokon.</translation> </message> @@ -819,17 +832,17 @@ Ekzemplo: https://servilo.mia:8787</translation> <translation>%1 metis vokon.</translation> </message> <message> - <location line="+11"/> + <location line="+14"/> <source>%1 answered the call.</source> <translation>%1 respondis la vokon.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 ended the call.</source> <translation>%1 finis la vokon.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>Negotiating call...</source> <translation>Traktante vokon…</translation> </message> @@ -837,7 +850,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation type="unfinished"></translation> </message> @@ -858,6 +871,11 @@ Ekzemplo: https://servilo.mia:8787</translation> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation>Bildosignoj</translation> </message> @@ -875,17 +893,17 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation>Redakti</translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation>Reagi</translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation>Respondi</translation> </message> @@ -895,7 +913,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <translation>Elektebloj</translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1103,7 +1121,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation>neprogramita okazo: </translation> </message> @@ -1223,7 +1241,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation>Fermi</translation> </message> @@ -1236,7 +1254,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -1244,7 +1262,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1284,17 +1302,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished">Akcepti</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished">Rifuzi</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1345,19 +1353,41 @@ Ekzemplo: https://servilo.mia:8787</translation> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation>Agordoj de ĉambro</translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation>%1 ĉambrano(j)</translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation>AGORDOJ</translation> </message> @@ -1440,11 +1470,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation>Malsukcesis ŝalti ĉifradon: %1</translation> @@ -1477,6 +1502,24 @@ Ekzemplo: https://servilo.mia:8787</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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1533,7 +1576,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation>Estas malsukcesa</translation> </message> @@ -1555,6 +1598,14 @@ Ekzemplo: https://servilo.mia:8787</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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1575,7 +1626,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> @@ -1586,7 +1637,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation>Konservi bildon</translation> </message> @@ -1722,12 +1773,12 @@ Ekzemplo: https://servilo.mia:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation>Vi aliĝis ĉi tiun ĉambron.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1756,7 +1807,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation>Redaktita</translation> </message> @@ -1764,17 +1815,32 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation type="unfinished"></translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished">%1 ĉambrano(j)</translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1782,7 +1848,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1790,18 +1856,17 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1842,7 +1907,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1852,7 +1917,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1901,7 +1966,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1910,7 +1975,7 @@ Ekzemplo: https://servilo.mia:8787</translation> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation type="unfinished"></translation> </message> @@ -2373,7 +2438,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2425,7 +2490,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation>Hieraŭ</translation> </message> @@ -2497,19 +2562,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_es.ts b/resources/langs/nheko_es.ts
index 6318b9c4..8eb4675a 100644 --- a/resources/langs/nheko_es.ts +++ b/resources/langs/nheko_es.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation>Esperando confirmación</translation> </message> @@ -48,7 +48,7 @@ <translation>Esperando a que la otra parte complete la verificación.</translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>Cancelar</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>No se pudo invitar al usuario: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation>Confirmar invitación</translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation type="unfinished"></translation> </message> @@ -227,12 +227,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation type="unfinished"></translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation type="unfinished"></translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation type="unfinished"></translation> </message> @@ -617,18 +617,44 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> + <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> @@ -741,27 +767,14 @@ Example: https://server.my:8787</source> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+128"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+187"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -771,7 +784,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -781,17 +794,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> @@ -806,23 +819,23 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+29"/> + <location line="+38"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> <message> - <location line="-18"/> + <location line="-24"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="-80"/> + <location line="-99"/> <location line="+9"/> <source>removed</source> <translation type="unfinished"></translation> </message> <message> - <location line="+80"/> + <location line="+102"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> @@ -830,7 +843,7 @@ Example: https://server.my:8787</source> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation type="unfinished"></translation> </message> @@ -851,6 +864,11 @@ Example: https://server.my:8787</source> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation type="unfinished"></translation> </message> @@ -868,17 +886,17 @@ Example: https://server.my:8787</source> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -888,7 +906,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation type="unfinished"></translation> </message> @@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation type="unfinished"></translation> </message> @@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished">Aceptar</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished">Rechazar</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1338,19 +1346,41 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1433,11 +1463,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation type="unfinished"></translation> @@ -1470,6 +1495,24 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation type="unfinished"></translation> </message> @@ -1547,6 +1590,14 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> @@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation type="unfinished"></translation> </message> @@ -1722,12 +1773,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation type="unfinished">Te has unido a esta sala.</translation> </message> <message> - <location line="+885"/> + <location line="+911"/> <source>Rejected the knock from %1.</source> <translation type="unfinished"></translation> </message> @@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation type="unfinished"></translation> </message> @@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation type="unfinished"></translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation type="unfinished"></translation> </message> @@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -2469,19 +2534,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_et.ts b/resources/langs/nheko_et.ts
index 198ec332..20261395 100644 --- a/resources/langs/nheko_et.ts +++ b/resources/langs/nheko_et.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation>Ootan kinnitust</translation> </message> @@ -48,7 +48,7 @@ <translation>Ootan et teine osapool lõpetaks verifitseerimise.</translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>Katkesta</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>Kutse saatmine kasutajale ei õnnestunud: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation>Kinnita kutse</translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation>Kas sa tõesti soovid saata kutset kasutajale %1 (%2)?</translation> </message> @@ -227,12 +227,12 @@ <translation>Suhtluskeeld eemaldatud: %1</translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation>Kas sa kindlasti soovid alustada otsevestlust kasutajaga %1?</translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation>Puhvri versiooniuuendus ebaõnnestus!</translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation>Dekrüpti andmed</translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation>Otsi</translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation>Inimesed</translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation>Vali fail</translation> </message> @@ -617,17 +617,43 @@ <translation>Kõik failid (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation>Meediafailide üleslaadimine ei õnnestunud. Palun proovi uuesti.</translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>Eemalda</translation> + <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> @@ -745,27 +771,14 @@ Näiteks: https://server.minu:8787</translation> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>Jututoa liikmed</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation>Sobib</translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+128"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+187"/> <source>Encryption enabled</source> <translation>Krüptimine on kasutusel</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation>jututoa uus nimi on: %1</translation> </message> @@ -775,7 +788,7 @@ Näiteks: https://server.minu:8787</translation> <translation>eemaldas jututoa nime</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation>jututoa uus teema on: %1</translation> </message> @@ -785,17 +798,17 @@ Näiteks: https://server.minu:8787</translation> <translation>teema on eemaldatud</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation>%1 muutis jututoa tunnuspilti</translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation>%1 lõi ja seadistas jututoa: %2</translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation>%1 helistas.</translation> </message> @@ -810,23 +823,23 @@ Näiteks: https://server.minu:8787</translation> <translation>%1 helistas.</translation> </message> <message> - <location line="+29"/> + <location line="+38"/> <source>Negotiating call...</source> <translation>Ühendan kõnet…</translation> </message> <message> - <location line="-18"/> + <location line="-24"/> <source>%1 answered the call.</source> <translation>%1 vastas kõnele.</translation> </message> <message> - <location line="-80"/> + <location line="-99"/> <location line="+9"/> <source>removed</source> <translation>eemaldatud</translation> </message> <message> - <location line="+80"/> + <location line="+102"/> <source>%1 ended the call.</source> <translation>%1 lõpetas kõne.</translation> </message> @@ -834,7 +847,7 @@ Näiteks: https://server.minu:8787</translation> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation>Lõpeta kõne</translation> </message> @@ -855,6 +868,11 @@ Näiteks: https://server.minu:8787</translation> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation>Emoji</translation> </message> @@ -872,17 +890,17 @@ Näiteks: https://server.minu:8787</translation> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation>Muuda</translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation>Reageeri</translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation>Vasta</translation> </message> @@ -892,7 +910,7 @@ Näiteks: https://server.minu:8787</translation> <translation>Valikud</translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation>&amp;Kopeeri</translation> </message> @@ -1100,7 +1118,7 @@ Näiteks: https://server.minu:8787</translation> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation>implementeerimata sündmus: </translation> </message> @@ -1220,7 +1238,7 @@ Näiteks: https://server.minu:8787</translation> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation>Sulge</translation> </message> @@ -1233,7 +1251,7 @@ Näiteks: https://server.minu:8787</translation> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation>salvestatud versiooni ei leidu</translation> </message> @@ -1241,7 +1259,7 @@ Näiteks: https://server.minu:8787</translation> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation>Uus silt</translation> </message> @@ -1281,17 +1299,7 @@ Näiteks: https://server.minu:8787</translation> <translation>Loo uus silt...</translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation>Nõustu</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation>Keeldu</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation>Olekuteade</translation> </message> @@ -1342,19 +1350,41 @@ Näiteks: https://server.minu:8787</translation> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation>Jututoa seadistused</translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation>%1 liige(t)</translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation>SEADISTUSED</translation> </message> @@ -1439,11 +1469,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation>Krüptimise kasutuselevõtmine ei õnnestunud: %1</translation> @@ -1476,6 +1501,24 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.< </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1532,7 +1575,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.< <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation>Ebaõnnestus</translation> </message> @@ -1553,6 +1596,14 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.< </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1573,7 +1624,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.< <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation>Sõnumi ümbersõnastamine ebaõnnestus: %1</translation> </message> @@ -1584,7 +1635,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.< <translation>Sündmuse krüptimine ei õnnestunud, katkestame saatmise!</translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation>Salvesta pilt</translation> </message> @@ -1718,12 +1769,12 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.< <translation>%1 muutis oma koputust jututoa uksele.</translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation>Sa liitusid jututoaga.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation>%1 muutis oma tunnuspilti ja seadistas uueks kuvatavaks nimeks %2.</translation> </message> @@ -1752,7 +1803,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.< <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation>Muudetud</translation> </message> @@ -1760,17 +1811,32 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.< <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation>Ühtegi jututuba pole avatud</translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation>%1 liige(t)</translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation>Tagasi jututubade loendisse</translation> </message> @@ -1778,7 +1844,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.< <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation>Ühtegi krüptitud vestlust selle kasutajaga ei leidunud. Palun loo temaga krüptitud vestlus ja proovi uuesti.</translation> </message> @@ -1786,18 +1852,17 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.< <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation>Tagasi jututubade loendisse</translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation>Jututuba on valimata</translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation>Jututoa valikud</translation> </message> @@ -1838,7 +1903,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.< <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation>Üldine kasutajaprofiil</translation> </message> @@ -1848,7 +1913,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.< <translation>Kasutajaprofiil jututoas</translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation>Verifitseeri</translation> @@ -1897,7 +1962,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.< <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation>Vaikimisi</translation> @@ -1906,7 +1971,7 @@ testimiseks seni, kuni terviklik seadmete verifitseerimine on implementeeritud.< <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>Vähenda tegumiribale</translation> </message> @@ -2363,7 +2428,7 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation>Ootan teise osapoole tegevust…</translation> </message> @@ -2414,7 +2479,7 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation>Eile</translation> </message> @@ -2486,19 +2551,6 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_fi.ts b/resources/langs/nheko_fi.ts
index 9c48e98f..e884e0ac 100644 --- a/resources/langs/nheko_fi.ts +++ b/resources/langs/nheko_fi.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation>Odotetaan vahvistusta</translation> </message> @@ -48,7 +48,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>Peruuta</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation type="unfinished"></translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation type="unfinished"></translation> </message> @@ -227,12 +227,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation type="unfinished"></translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation type="unfinished"></translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation>Hae</translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation>Ihmiset</translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation>Valitse tiedosto</translation> </message> @@ -617,17 +617,43 @@ <translation>Kaikki Tiedostot (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>Poista</translation> + <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> @@ -741,22 +767,9 @@ Example: https://server.my:8787</source> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>Huoneen jäsenet</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation>OK</translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+110"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+169"/> <location line="+9"/> <source>removed</source> <translation type="unfinished"></translation> @@ -767,7 +780,7 @@ Example: https://server.my:8787</source> <translation>Salaus on käytössä</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation>huoneen nimi muutettu: %1</translation> </message> @@ -777,7 +790,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -787,17 +800,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> @@ -812,17 +825,17 @@ Example: https://server.my:8787</source> <translation>%1 soitti puhelun.</translation> </message> <message> - <location line="+11"/> + <location line="+14"/> <source>%1 answered the call.</source> <translation>%1 vastasi puheluun.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> @@ -830,7 +843,7 @@ Example: https://server.my:8787</source> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation type="unfinished"></translation> </message> @@ -851,6 +864,11 @@ Example: https://server.my:8787</source> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation>Emoji</translation> </message> @@ -868,17 +886,17 @@ Example: https://server.my:8787</source> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation>Muokkaa</translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation>Reagoi</translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation>Vastaa</translation> </message> @@ -888,7 +906,7 @@ Example: https://server.my:8787</source> <translation>Asetukset</translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation type="unfinished"></translation> </message> @@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation>Sulje</translation> </message> @@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation>ei tallennettua versiota</translation> </message> @@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation>Hyväksy</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation>Hylkää</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1338,19 +1346,41 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1433,11 +1463,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation>Salauksen aktivointi epäonnistui: %1</translation> @@ -1470,6 +1495,24 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation type="unfinished"></translation> </message> @@ -1547,6 +1590,14 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation>Viestin muokkaus epäonnistui: %1</translation> </message> @@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation>Tallenna kuva</translation> </message> @@ -1712,12 +1763,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation>Sinä liityit tähän huoneeseen.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation>Muokattu</translation> </message> @@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation type="unfinished"></translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation>Huoneen asetukset</translation> </message> @@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>Pienennä ilmoitusalueelle</translation> </message> @@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation>Eilen</translation> </message> @@ -2469,19 +2534,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_fr.ts b/resources/langs/nheko_fr.ts
index b6345d62..fb3c0e11 100644 --- a/resources/langs/nheko_fr.ts +++ b/resources/langs/nheko_fr.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation>Attente de confirmation</translation> </message> @@ -48,7 +48,7 @@ <translation>Attente de la vérification par le correspondant.</translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>Annuler</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>Échec lors de l&apos;invitation de %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation>Confirmer l&apos;invitation</translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation>Voulez-vous vraiment inviter %1 (%2)&#x202f;?</translation> </message> @@ -227,12 +227,12 @@ <translation>%1 n&apos;est plus banni(e)</translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation>Voulez-vous vraimer commencer une discussion privée avec %1 ?</translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation>Échec de la migration du cache&#x202f;!</translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation>Déchiffrer les secrets</translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation>Chercher</translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation>Personnes</translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation>Sélectionnez un fichier</translation> </message> @@ -617,17 +617,43 @@ <translation>Tous les types de fichiers (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation>Échec de l&apos;envoi du média. Veuillez réessayer.</translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>Retirer</translation> + <location line="+7"/> + <source>Cancel</source> + <translation type="unfinished">Annuler</translation> </message> </context> <context> @@ -745,22 +771,9 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>Membres du salon</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation>OK</translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+110"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+169"/> <location line="+9"/> <source>removed</source> <translation>retiré</translation> @@ -771,7 +784,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> <translation>Chiffrement activé</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation>nom du salon changé en&#xa0;: %1</translation> </message> @@ -781,7 +794,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> <translation>nom du salon retiré</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation>sujet changé pour&#xa0;: %1</translation> </message> @@ -791,17 +804,17 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> <translation>sujet retiré</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation>%1 a créé et configuré le salon&#xa0;: %2</translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation>%1 a effectué un appel vocal.</translation> </message> @@ -816,17 +829,17 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> <translation>%1 a appelé.</translation> </message> <message> - <location line="+11"/> + <location line="+14"/> <source>%1 answered the call.</source> <translation>%1 a répondu à l&apos;appel.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 ended the call.</source> <translation>%1 a terminé l&apos;appel.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>Negotiating call...</source> <translation>Négociation de l&apos;appel…</translation> </message> @@ -834,7 +847,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation>Raccrocher</translation> </message> @@ -855,6 +868,11 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation>Émoji</translation> </message> @@ -872,17 +890,17 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation>Modifier</translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation>Réagir</translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation>Répondre</translation> </message> @@ -892,7 +910,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> <translation>Options</translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1100,7 +1118,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation>Évènement non implémenté&#xa0;: </translation> </message> @@ -1220,7 +1238,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation>Fermer</translation> </message> @@ -1233,7 +1251,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation>pas de version enregistrée</translation> </message> @@ -1241,7 +1259,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1281,17 +1299,7 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1342,19 +1350,41 @@ Exemple&#xa0;: https&#x202f;://monserveur.example.com&#x202f;:8787</translation> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation>Configuration du salon</translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation>%1 membre(s)</translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation>CONFIGURATION</translation> </message> @@ -1439,11 +1469,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation>Échec de l&apos;activation du chiffrement&#xa0;&#xa0;: %1</translation> @@ -1476,6 +1501,24 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n& </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1532,7 +1575,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n& <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation>Échec</translation> </message> @@ -1553,6 +1596,14 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n& </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1573,7 +1624,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n& <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation>Échec de la suppression du message&#xa0;: %1</translation> </message> @@ -1584,7 +1635,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n& <translation>Échec du chiffrement de l&apos;évènement, envoi abandonné&#x202f;!</translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation>Enregistrer l&apos;image</translation> </message> @@ -1718,12 +1769,12 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n& <translation>%1 ne frappe plus au salon.</translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation>Vous avez rejoint ce salon.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1752,7 +1803,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n& <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation>Modifié</translation> </message> @@ -1760,17 +1811,32 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n& <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation>Aucun salon ouvert</translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished">%1 membre(s)</translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished">Revenir à la liste des salons</translation> </message> @@ -1778,7 +1844,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n& <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation>Pas de discussion privée et chiffrée trouvée avec cet utilisateur. Créez-en une et réessayez.</translation> </message> @@ -1786,18 +1852,17 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n& <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation>Revenir à la liste des salons</translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation>Pas de salon sélectionné</translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation>Options du salon</translation> </message> @@ -1838,7 +1903,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n& <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation>Profil général de l&apos;utilisateur</translation> </message> @@ -1848,7 +1913,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n& <translation>Profil utilisateur spécifique au salon</translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation>Vérifier</translation> @@ -1897,7 +1962,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n& <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation>Défaut</translation> @@ -1906,7 +1971,7 @@ tester le chiffrement de bout en bout tant que la vérification des appareils n& <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>Réduire à la barre des tâches</translation> </message> @@ -2365,7 +2430,7 @@ Cela met l&apos;application en évidence dans la barre des tâches.</translation <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation>Attente du correspondant…</translation> </message> @@ -2416,7 +2481,7 @@ Cela met l&apos;application en évidence dans la barre des tâches.</translation <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation>Hier</translation> </message> @@ -2488,19 +2553,6 @@ Cela met l&apos;application en évidence dans la barre des tâches.</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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_hu.ts b/resources/langs/nheko_hu.ts
index e989a6ce..a85f9ff3 100644 --- a/resources/langs/nheko_hu.ts +++ b/resources/langs/nheko_hu.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation>Várakozás megerősítésre</translation> </message> @@ -48,7 +48,7 @@ <translation>Várakozás a másik oldalra a hitelesítés befejezéséhez.</translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>Mégse</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>Nem sikerült meghívni a felhasználót: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation>Meghívás megerősítése</translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation>Biztos, hogy meg akarod hívni a következő felhasználót: %1 (%2)?</translation> </message> @@ -227,12 +227,12 @@ <translation>Kitiltás feloldva a felhasználónak: %1</translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation>Biztosan privát csevegést akarsz indítani %1 felhasználóval?</translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation>Gyorsítótár migráció nem sikerült!</translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation>Titkos tároló feloldása</translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation>Keresés</translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation>Emberek</translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation>Fájl kiválasztása</translation> </message> @@ -617,17 +617,43 @@ <translation>Minden fájl (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation>Nem sikerült feltölteni a médiafájlt. Kérlek, próbáld újra!</translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>Eltávolítás</translation> + <location line="+7"/> + <source>Cancel</source> + <translation type="unfinished">Mégse</translation> </message> </context> <context> @@ -745,27 +771,14 @@ Példa: https://szerver.em:8787</translation> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>Szobatagok</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation>OK</translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+128"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+187"/> <source>Encryption enabled</source> <translation>Titkosítás bekapcsolva</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation>a szoba neve megváltoztatva erre: %1</translation> </message> @@ -775,7 +788,7 @@ Példa: https://szerver.em:8787</translation> <translation>szobanév eltávolítva</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation>a téma megváltoztatva erre: %1</translation> </message> @@ -785,17 +798,17 @@ Példa: https://szerver.em:8787</translation> <translation>téma eltávolítva</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation>%1 létrehozta és beállította a következő szobát: %2</translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation>%1 hanghívást kezdeményezett.</translation> </message> @@ -810,23 +823,23 @@ Példa: https://szerver.em:8787</translation> <translation>%1 hívást kezdeményezett.</translation> </message> <message> - <location line="+29"/> + <location line="+38"/> <source>Negotiating call...</source> <translation>Hívás előkészítése…</translation> </message> <message> - <location line="-18"/> + <location line="-24"/> <source>%1 answered the call.</source> <translation>%1 fogadta a hívást.</translation> </message> <message> - <location line="-80"/> + <location line="-99"/> <location line="+9"/> <source>removed</source> <translation>eltávolítva</translation> </message> <message> - <location line="+80"/> + <location line="+102"/> <source>%1 ended the call.</source> <translation>%1 befejezte a hívást.</translation> </message> @@ -834,7 +847,7 @@ Példa: https://szerver.em:8787</translation> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation>Hívás befejezése</translation> </message> @@ -855,6 +868,11 @@ Példa: https://szerver.em:8787</translation> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation>Hangulatjelek</translation> </message> @@ -872,17 +890,17 @@ Példa: https://szerver.em:8787</translation> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation>Szerkesztés</translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation>Reakció</translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation>Válasz</translation> </message> @@ -892,7 +910,7 @@ Példa: https://szerver.em:8787</translation> <translation>Műveletek</translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1100,7 +1118,7 @@ Példa: https://szerver.em:8787</translation> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation>nem implementált esemény: </translation> </message> @@ -1220,7 +1238,7 @@ Példa: https://szerver.em:8787</translation> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation>Bezárás</translation> </message> @@ -1233,7 +1251,7 @@ Példa: https://szerver.em:8787</translation> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation>nincs tárolva verzió</translation> </message> @@ -1241,7 +1259,7 @@ Példa: https://szerver.em:8787</translation> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1281,17 +1299,7 @@ Példa: https://szerver.em:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished">Elfogadás</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished">Elutasítás</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1342,19 +1350,40 @@ Példa: https://szerver.em:8787</translation> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation>Szobabeállítások</translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation>%1 tag</translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation>BEÁLLÍTÁSOK</translation> </message> @@ -1439,11 +1468,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation>Nem sikerült a titkosítás aktiválása: %1</translation> @@ -1476,6 +1500,24 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1532,7 +1574,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation>Sikertelen</translation> </message> @@ -1553,6 +1595,14 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1573,7 +1623,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation>Az üzenet visszavonása nem sikerült: %1</translation> </message> @@ -1584,7 +1634,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh <translation>Nem sikerült titkosítani az eseményt, küldés megszakítva!</translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation>Kép mentése</translation> </message> @@ -1717,12 +1767,12 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh <translation>%1 visszavonta a kopogását.</translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation>Csatlakoztál ehhez a szobához.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1751,7 +1801,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation>Szerkesztve</translation> </message> @@ -1759,17 +1809,32 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation>Nincs nyitott szoba</translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished">%1 tag</translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished">Vissza a szobák listájára</translation> </message> @@ -1777,7 +1842,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation>Nem található titkosított privát csevegés ezzel a felhasználóval. Hozz létre egy titkosított privát csevegést vele, és próbáld újra!</translation> </message> @@ -1785,18 +1850,17 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation>Vissza a szobák listájára</translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation>Nincs kiválasztva szoba</translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation>Szoba beállításai</translation> </message> @@ -1837,7 +1901,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation>Globális felhasználói profil</translation> </message> @@ -1847,7 +1911,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh <translation>Szobai felhasználói profil</translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation>Hitelesítés</translation> @@ -1896,7 +1960,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation>Alapértelmezett</translation> @@ -1905,7 +1969,7 @@ végpontig (E2E) titkosítás tesztelésére, amíg be nincs fejezve az eszközh <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>Kicsinyítés a tálcára</translation> </message> @@ -2363,7 +2427,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation>Várakozás a másik félre…</translation> </message> @@ -2414,7 +2478,7 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation>Tegnap</translation> </message> @@ -2486,19 +2550,6 @@ Ettől általában animálttá válik az alkalmazásablakok listáján szereplő </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_it.ts b/resources/langs/nheko_it.ts
index b0b8ec48..6056b31a 100644 --- a/resources/langs/nheko_it.ts +++ b/resources/langs/nheko_it.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation>In attesa di conferma</translation> </message> @@ -48,7 +48,7 @@ <translation>In attesa della conferma dall&apos;altra parte per la verifica.</translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>Annulla</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>Impossibile invitare l&apos;utente: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation>Conferma Invito</translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation>Vuoi davvero inviare %1 (%2)?</translation> </message> @@ -227,12 +227,12 @@ <translation>Rimosso il ban dall&apos;utente: %1</translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation>Sei sicuro di voler avviare una chat privata con %1?</translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation>Migrazione della cache fallita!</translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation>Decifra i segreti</translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation>Cerca</translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation>Membri</translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation type="unfinished">Seleziona un file</translation> </message> @@ -617,17 +617,43 @@ <translation type="unfinished">Tutti i File (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished">Impossibile inviare il file multimediale. Per favore riprova.</translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>Rimuovi</translation> + <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> @@ -745,22 +771,9 @@ Esempio: https://server.mio:8787</translation> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>Membri della stanza</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation>OK</translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+110"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+169"/> <location line="+9"/> <source>removed</source> <translation>rimosso</translation> @@ -771,7 +784,7 @@ Esempio: https://server.mio:8787</translation> <translation>Crittografia abilitata</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation>nome della stanza cambiato in: %1</translation> </message> @@ -781,7 +794,7 @@ Esempio: https://server.mio:8787</translation> <translation>nome della stanza rimosso</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation>argomento cambiato in: %1</translation> </message> @@ -791,17 +804,17 @@ Esempio: https://server.mio:8787</translation> <translation>argomento rimosso</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation>%1 creato e configurata stanza: %2</translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation>%1 ha avviato una chiamata audio.</translation> </message> @@ -816,17 +829,17 @@ Esempio: https://server.mio:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+11"/> + <location line="+14"/> <source>%1 answered the call.</source> <translation>%1 ha risposto alla chiamata.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 ended the call.</source> <translation>%1 ha terminato la chiamata.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> @@ -834,7 +847,7 @@ Esempio: https://server.mio:8787</translation> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation>Termina</translation> </message> @@ -855,6 +868,11 @@ Esempio: https://server.mio:8787</translation> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation type="unfinished">Emoji</translation> </message> @@ -872,17 +890,17 @@ Esempio: https://server.mio:8787</translation> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation>Modifica</translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation>Reagisci</translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation type="unfinished">Risposta</translation> </message> @@ -892,7 +910,7 @@ Esempio: https://server.mio:8787</translation> <translation type="unfinished">Opzioni</translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1101,7 +1119,7 @@ Verificare %1 adesso?</translation> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation>evento non implementato: </translation> </message> @@ -1221,7 +1239,7 @@ Verificare %1 adesso?</translation> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation>Chiudi</translation> </message> @@ -1234,7 +1252,7 @@ Verificare %1 adesso?</translation> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation>nessuna versione memorizzata</translation> </message> @@ -1242,7 +1260,7 @@ Verificare %1 adesso?</translation> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1282,17 +1300,7 @@ Verificare %1 adesso?</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished">Accetta</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished">Rifiuta</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1343,19 +1351,41 @@ Verificare %1 adesso?</translation> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1438,11 +1468,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation type="unfinished">Impossibile abilitare la crittografia: %1</translation> @@ -1475,6 +1500,24 @@ Verificare %1 adesso?</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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1531,7 +1574,7 @@ Verificare %1 adesso?</translation> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation>Fallito</translation> </message> @@ -1552,6 +1595,14 @@ Verificare %1 adesso?</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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1572,7 +1623,7 @@ Verificare %1 adesso?</translation> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation>Oscuramento del messaggio fallito: %1</translation> </message> @@ -1583,7 +1634,7 @@ Verificare %1 adesso?</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation>Salva immagine</translation> </message> @@ -1717,12 +1768,12 @@ Verificare %1 adesso?</translation> <translation>%1 ha oscurato la sua bussata.</translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation>Sei entrato in questa stanza.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1751,7 +1802,7 @@ Verificare %1 adesso?</translation> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation type="unfinished"></translation> </message> @@ -1759,17 +1810,32 @@ Verificare %1 adesso?</translation> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation>Nessuna stanza aperta</translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1777,7 +1843,7 @@ Verificare %1 adesso?</translation> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1785,18 +1851,17 @@ Verificare %1 adesso?</translation> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation type="unfinished">Opzioni della stanza</translation> </message> @@ -1837,7 +1902,7 @@ Verificare %1 adesso?</translation> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1847,7 +1912,7 @@ Verificare %1 adesso?</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1896,7 +1961,7 @@ Verificare %1 adesso?</translation> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1905,7 +1970,7 @@ Verificare %1 adesso?</translation> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>Minimizza nella tray</translation> </message> @@ -2351,7 +2416,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2402,7 +2467,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation>Ieri</translation> </message> @@ -2474,19 +2539,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_ja.ts b/resources/langs/nheko_ja.ts
index c7872ce0..a8c18795 100644 --- a/resources/langs/nheko_ja.ts +++ b/resources/langs/nheko_ja.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation type="unfinished"></translation> </message> @@ -48,7 +48,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation type="unfinished">キャンセル</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>ユーザーを招待できませんでした: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation type="unfinished"></translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation type="unfinished"></translation> </message> @@ -227,12 +227,12 @@ <translation>永久追放を解除されたユーザー: %1</translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation type="unfinished"></translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation type="unfinished"></translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation type="unfinished">ファイルを選択</translation> </message> @@ -617,17 +617,43 @@ <translation type="unfinished">全てのファイル (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished">メディアをアップロードできませんでした。やり直して下さい。</translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>削除</translation> + <location line="+7"/> + <source>Cancel</source> + <translation type="unfinished">キャンセル</translation> </message> </context> <context> @@ -741,22 +767,9 @@ Example: https://server.my:8787</source> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>部屋の参加者</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation>OK</translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+110"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+169"/> <location line="+9"/> <source>removed</source> <translation type="unfinished"></translation> @@ -767,7 +780,7 @@ Example: https://server.my:8787</source> <translation>暗号化が有効です</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation>部屋名が変更されました: %1</translation> </message> @@ -777,7 +790,7 @@ Example: https://server.my:8787</source> <translation>部屋名が削除されました</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation>話題が変更されました: %1</translation> </message> @@ -787,17 +800,17 @@ Example: https://server.my:8787</source> <translation>話題が削除されました</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> @@ -812,17 +825,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+11"/> + <location line="+14"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> @@ -830,7 +843,7 @@ Example: https://server.my:8787</source> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation type="unfinished"></translation> </message> @@ -851,6 +864,11 @@ Example: https://server.my:8787</source> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation type="unfinished">絵文字</translation> </message> @@ -868,17 +886,17 @@ Example: https://server.my:8787</source> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation type="unfinished">返信</translation> </message> @@ -888,7 +906,7 @@ Example: https://server.my:8787</source> <translation type="unfinished">オプション</translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation>未実装のイベント: </translation> </message> @@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation type="unfinished">閉じる</translation> </message> @@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation>バージョンが保存されていません</translation> </message> @@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished">容認</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished">拒否</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1338,19 +1346,40 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1433,11 +1462,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation type="unfinished">暗号化を有効にできませんでした: %1</translation> @@ -1470,6 +1494,24 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1526,7 +1568,7 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation>失敗</translation> </message> @@ -1547,6 +1589,14 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1567,7 +1617,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation>メッセージを編集できませんでした: %1</translation> </message> @@ -1578,7 +1628,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation>画像を保存</translation> </message> @@ -1711,12 +1761,12 @@ Example: https://server.my:8787</source> <translation>%1がノックを編集しました。</translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1745,7 +1795,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation type="unfinished"></translation> </message> @@ -1753,17 +1803,32 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation>部屋が開いていません</translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1771,7 +1836,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1779,18 +1844,17 @@ Example: https://server.my:8787</source> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation type="unfinished">部屋のオプション</translation> </message> @@ -1831,7 +1895,7 @@ Example: https://server.my:8787</source> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1841,7 +1905,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1890,7 +1954,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1899,7 +1963,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>トレイへ最小化</translation> </message> @@ -2345,7 +2409,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2396,7 +2460,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation>昨日</translation> </message> @@ -2468,19 +2532,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_ml.ts b/resources/langs/nheko_ml.ts
index 0bdf3b63..aeb704eb 100644 --- a/resources/langs/nheko_ml.ts +++ b/resources/langs/nheko_ml.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation>സ്ഥിരീകരണത്തിനായി കാത്തിരിക്കുന്നു</translation> </message> @@ -48,7 +48,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>റദ്ദാക്കു</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>ഉപയോക്താവിനെ ക്ഷണിക്കുന്നതിൽ പരാജയപ്പെട്ടു: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation>ക്ഷണം ഉറപ്പാക്കു</translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation type="unfinished"></translation> </message> @@ -227,12 +227,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation type="unfinished"></translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation type="unfinished"></translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation>തിരയുക</translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation>ആളുകൾ</translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation>ഒരു ഫയൽ തിരഞ്ഞെടുക്കുക</translation> </message> @@ -617,17 +617,43 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>നീക്കംചെയ്യുക</translation> + <location line="+7"/> + <source>Cancel</source> + <translation type="unfinished">റദ്ദാക്കു</translation> </message> </context> <context> @@ -741,27 +767,14 @@ Example: https://server.my:8787</source> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation>ശരി</translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+128"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+187"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -771,7 +784,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -781,17 +794,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> @@ -806,23 +819,23 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+29"/> + <location line="+38"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> <message> - <location line="-18"/> + <location line="-24"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="-80"/> + <location line="-99"/> <location line="+9"/> <source>removed</source> <translation>നീക്കംചെയ്‌തു</translation> </message> <message> - <location line="+80"/> + <location line="+102"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> @@ -830,7 +843,7 @@ Example: https://server.my:8787</source> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation type="unfinished"></translation> </message> @@ -851,6 +864,11 @@ Example: https://server.my:8787</source> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation>ഇമോജി</translation> </message> @@ -868,17 +886,17 @@ Example: https://server.my:8787</source> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -888,7 +906,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation type="unfinished"></translation> </message> @@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation type="unfinished">അടയ്‌ക്കുക</translation> </message> @@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished">നിരസിക്കുക</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1338,19 +1346,41 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1433,11 +1463,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation type="unfinished"></translation> @@ -1470,6 +1495,24 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation type="unfinished"></translation> </message> @@ -1547,6 +1590,14 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> @@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation type="unfinished"></translation> </message> @@ -1712,12 +1763,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation type="unfinished">നിങ്ങൾ ഈ മുറിയിൽ ചേർന്നു.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation type="unfinished"></translation> </message> @@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation type="unfinished"></translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation type="unfinished"></translation> </message> @@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -2469,19 +2534,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_nl.ts b/resources/langs/nheko_nl.ts
index 3f2a147f..ba3ceec1 100644 --- a/resources/langs/nheko_nl.ts +++ b/resources/langs/nheko_nl.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation type="unfinished"></translation> </message> @@ -48,7 +48,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation type="unfinished">Annuleren</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>Gebruiker uitnodigen mislukt: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation type="unfinished"></translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation type="unfinished"></translation> </message> @@ -227,12 +227,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation type="unfinished"></translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation type="unfinished"></translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation type="unfinished">Kies een bestand</translation> </message> @@ -617,18 +617,44 @@ <translation type="unfinished">Alle bestanden (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> + <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> @@ -741,22 +767,9 @@ Example: https://server.my:8787</source> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>Kamerleden</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+110"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+169"/> <location line="+9"/> <source>removed</source> <translation type="unfinished"></translation> @@ -767,7 +780,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -777,7 +790,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -787,17 +800,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> @@ -812,17 +825,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+11"/> + <location line="+14"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> @@ -830,7 +843,7 @@ Example: https://server.my:8787</source> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation type="unfinished"></translation> </message> @@ -851,6 +864,11 @@ Example: https://server.my:8787</source> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation type="unfinished"></translation> </message> @@ -868,17 +886,17 @@ Example: https://server.my:8787</source> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -888,7 +906,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation type="unfinished"></translation> </message> @@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation type="unfinished"></translation> </message> @@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished">Accepteren</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished">Afwijzen</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1338,19 +1346,41 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1433,11 +1463,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation type="unfinished"></translation> @@ -1470,6 +1495,24 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation type="unfinished"></translation> </message> @@ -1547,6 +1590,14 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> @@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation type="unfinished">Afbeelding opslaan</translation> </message> @@ -1712,12 +1763,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation type="unfinished">Je bent lid geworden van deze kamer.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation type="unfinished"></translation> </message> @@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation type="unfinished"></translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>Minimaliseren naar systeemvak</translation> </message> @@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -2469,19 +2534,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_pl.ts b/resources/langs/nheko_pl.ts
index 6abcd147..4b6c31f2 100644 --- a/resources/langs/nheko_pl.ts +++ b/resources/langs/nheko_pl.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation>Oczekiwanie na potwierdzenie</translation> </message> @@ -48,7 +48,7 @@ <translation>Oczekiwanie na dokończenie weryfikacji przez drugą stronę.</translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>Anuluj</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>Nie udało się zaprosić użytkownika: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation type="unfinished"></translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation>Czy na pewno chcesz zaprosić %1 (%2)?</translation> </message> @@ -227,12 +227,12 @@ <translation>Odblokowano użytkownika: %1</translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation type="unfinished"></translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation>Nie udało się przenieść pamięci podręcznej!</translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation type="unfinished"></translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation>Szukaj</translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation>Ludzie</translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation type="unfinished">Wybierz plik</translation> </message> @@ -617,17 +617,43 @@ <translation type="unfinished">Wszystkie pliki (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> <message> - <location filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>Usuń</translation> + <location filename="../qml/InviteDialog.qml" line="+32"/> + <source>Invite users to %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> + <source>User ID to invite</source> + <translation type="unfinished">ID użytkownika do zaproszenia</translation> + </message> + <message> + <location line="+14"/> + <source>@joe:matrix.org</source> + <comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+17"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+58"/> + <source>Invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>Cancel</source> + <translation type="unfinished">Anuluj</translation> </message> </context> <context> @@ -743,22 +769,9 @@ Example: https://server.my:8787</source> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>Członkowie pokoju</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation>OK</translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+110"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+169"/> <location line="+9"/> <source>removed</source> <translation type="unfinished"></translation> @@ -769,7 +782,7 @@ Example: https://server.my:8787</source> <translation>Szyfrowanie włączone</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation>Nazwa pokoju zmieniona na: %1</translation> </message> @@ -779,7 +792,7 @@ Example: https://server.my:8787</source> <translation>usunięto nazwę pokoju</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation>temat zmieniono na: %1</translation> </message> @@ -789,17 +802,17 @@ Example: https://server.my:8787</source> <translation>usunięto temat</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation>%1 utworzył i skonfigurował pokój: %2</translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation>%1 rozpoczął(-ęła) połączenie głosowe.</translation> </message> @@ -814,17 +827,17 @@ Example: https://server.my:8787</source> <translation>%1 rozpoczął(-ęła) połączenie.</translation> </message> <message> - <location line="+11"/> + <location line="+14"/> <source>%1 answered the call.</source> <translation>%1 odebrał(a) połączenie.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 ended the call.</source> <translation>%1 zakończył(a) połączenie.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>Negotiating call...</source> <translation>Negocjowanie połączenia…</translation> </message> @@ -832,7 +845,7 @@ Example: https://server.my:8787</source> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation type="unfinished"></translation> </message> @@ -853,6 +866,11 @@ Example: https://server.my:8787</source> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation type="unfinished">Emoji</translation> </message> @@ -870,17 +888,17 @@ Example: https://server.my:8787</source> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -890,7 +908,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1098,7 +1116,7 @@ Example: https://server.my:8787</source> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation>Niezaimplementowane wydarzenie: </translation> </message> @@ -1218,7 +1236,7 @@ Example: https://server.my:8787</source> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation>Zamknij</translation> </message> @@ -1231,7 +1249,7 @@ Example: https://server.my:8787</source> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -1239,7 +1257,7 @@ Example: https://server.my:8787</source> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1279,17 +1297,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished">Akceptuj</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished">Odrzuć</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1340,19 +1348,42 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1435,11 +1466,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation type="unfinished">Nie udało się włączyć szyfrowania: %1</translation> @@ -1472,6 +1498,24 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1528,7 +1572,7 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation type="unfinished"></translation> </message> @@ -1549,6 +1593,14 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1569,7 +1621,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation type="unfinished">Redagowanie wiadomości nie powiodło się: %1</translation> </message> @@ -1580,7 +1632,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation type="unfinished">Zapisz obraz</translation> </message> @@ -1715,12 +1767,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation type="unfinished">Dołączyłeś(-łaś) do tego pokoju.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1749,7 +1801,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation type="unfinished"></translation> </message> @@ -1757,17 +1809,32 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation type="unfinished"></translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1775,7 +1842,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1783,18 +1850,17 @@ Example: https://server.my:8787</source> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation type="unfinished">Ustawienia pokoju</translation> </message> @@ -1835,7 +1901,7 @@ Example: https://server.my:8787</source> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1845,7 +1911,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1894,7 +1960,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1903,7 +1969,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>Zminimalizuj do paska zadań</translation> </message> @@ -2349,7 +2415,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2400,7 +2466,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -2472,19 +2538,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_pt_BR.ts b/resources/langs/nheko_pt_BR.ts
index fa0ea193..7774ba58 100644 --- a/resources/langs/nheko_pt_BR.ts +++ b/resources/langs/nheko_pt_BR.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation type="unfinished"></translation> </message> @@ -48,7 +48,7 @@ <translation>Esperando o outro lado completar a verificação.</translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>Cancelar</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>Falha ao convidar usuário: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation>Confirmar convite</translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation type="unfinished"></translation> </message> @@ -227,12 +227,12 @@ <translation>Usuário desbanido: %1</translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation type="unfinished"></translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation>Migração do cache falhou!</translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation type="unfinished"></translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation type="unfinished"></translation> </message> @@ -617,18 +617,44 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> + <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> @@ -741,27 +767,14 @@ Example: https://server.my:8787</source> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+128"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+187"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -771,7 +784,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -781,17 +794,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> @@ -806,23 +819,23 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+29"/> + <location line="+38"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> <message> - <location line="-18"/> + <location line="-24"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="-80"/> + <location line="-99"/> <location line="+9"/> <source>removed</source> <translation type="unfinished"></translation> </message> <message> - <location line="+80"/> + <location line="+102"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> @@ -830,7 +843,7 @@ Example: https://server.my:8787</source> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation type="unfinished"></translation> </message> @@ -851,6 +864,11 @@ Example: https://server.my:8787</source> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation type="unfinished"></translation> </message> @@ -868,17 +886,17 @@ Example: https://server.my:8787</source> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -888,7 +906,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation type="unfinished"></translation> </message> @@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation type="unfinished"></translation> </message> @@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished">Aceitar</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished">Rejeitar</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1338,19 +1346,41 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1433,11 +1463,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation type="unfinished"></translation> @@ -1470,6 +1495,24 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation type="unfinished"></translation> </message> @@ -1547,6 +1590,14 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> @@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation type="unfinished"></translation> </message> @@ -1712,12 +1763,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation type="unfinished">Você entrou nessa sala.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation type="unfinished"></translation> </message> @@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation type="unfinished"></translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation type="unfinished"></translation> </message> @@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -2469,19 +2534,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_pt_PT.ts b/resources/langs/nheko_pt_PT.ts
index 81343f97..cafbcdd6 100644 --- a/resources/langs/nheko_pt_PT.ts +++ b/resources/langs/nheko_pt_PT.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation type="unfinished"></translation> </message> @@ -48,7 +48,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation type="unfinished"></translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation type="unfinished"></translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation type="unfinished"></translation> </message> @@ -227,12 +227,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation type="unfinished"></translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation type="unfinished"></translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation type="unfinished"></translation> </message> @@ -617,16 +617,42 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> <message> - <location filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> + <location filename="../qml/InviteDialog.qml" line="+32"/> + <source>Invite users to %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> + <source>User ID to invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+14"/> + <source>@joe:matrix.org</source> + <comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+17"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+58"/> + <source>Invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>Cancel</source> <translation type="unfinished"></translation> </message> </context> @@ -741,27 +767,14 @@ Example: https://server.my:8787</source> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+128"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+187"/> <source>Encryption enabled</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -771,7 +784,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -781,17 +794,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> @@ -806,23 +819,23 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+29"/> + <location line="+38"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> <message> - <location line="-18"/> + <location line="-24"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="-80"/> + <location line="-99"/> <location line="+9"/> <source>removed</source> <translation type="unfinished"></translation> </message> <message> - <location line="+80"/> + <location line="+102"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> @@ -830,7 +843,7 @@ Example: https://server.my:8787</source> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation type="unfinished"></translation> </message> @@ -851,6 +864,11 @@ Example: https://server.my:8787</source> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation type="unfinished"></translation> </message> @@ -868,17 +886,17 @@ Example: https://server.my:8787</source> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -888,7 +906,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation type="unfinished"></translation> </message> @@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation type="unfinished"></translation> </message> @@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1338,19 +1346,41 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1433,11 +1463,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation type="unfinished"></translation> @@ -1470,6 +1495,24 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation type="unfinished"></translation> </message> @@ -1547,6 +1590,14 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> @@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation type="unfinished"></translation> </message> @@ -1712,12 +1763,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation type="unfinished"></translation> </message> @@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation type="unfinished"></translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation type="unfinished"></translation> </message> @@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -2469,19 +2534,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_ro.ts b/resources/langs/nheko_ro.ts
index c21bb069..8ff28d24 100644 --- a/resources/langs/nheko_ro.ts +++ b/resources/langs/nheko_ro.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation type="unfinished"></translation> </message> @@ -48,7 +48,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation type="unfinished"></translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>Nu s-a putut invita utilizatorul: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation type="unfinished"></translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation type="unfinished"></translation> </message> @@ -227,12 +227,12 @@ <translation>Utilizator dezinterzis: %1</translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation type="unfinished"></translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation>Nu s-a putut migra cache-ul!</translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation type="unfinished"></translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation type="unfinished"></translation> </message> @@ -617,17 +617,43 @@ <translation type="unfinished">Toate fișierele (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>Ștergere</translation> + <location line="+7"/> + <source>Cancel</source> + <translation type="unfinished"></translation> </message> </context> <context> @@ -745,22 +771,9 @@ Exemplu: https://serverul.meu:8787</translation> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>Membrii camerei</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation>OK</translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+110"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+169"/> <location line="+9"/> <source>removed</source> <translation type="unfinished"></translation> @@ -771,7 +784,7 @@ Exemplu: https://serverul.meu:8787</translation> <translation>Criptare activată</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation>numele camerei schimbat la: %1</translation> </message> @@ -781,7 +794,7 @@ Exemplu: https://serverul.meu:8787</translation> <translation>numele camerei șters</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation>subiect schimbat la: %1</translation> </message> @@ -791,17 +804,17 @@ Exemplu: https://serverul.meu:8787</translation> <translation>subiect șters</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation>%1 a creat și configurat camera: %2</translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> @@ -816,17 +829,17 @@ Exemplu: https://serverul.meu:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+11"/> + <location line="+14"/> <source>%1 answered the call.</source> <translation>%1 a răspuns apelului.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 ended the call.</source> <translation>%1 a închis apelul.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> @@ -834,7 +847,7 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation type="unfinished"></translation> </message> @@ -855,6 +868,11 @@ Exemplu: https://serverul.meu:8787</translation> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation type="unfinished"></translation> </message> @@ -872,17 +890,17 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation type="unfinished">Răspuns</translation> </message> @@ -892,7 +910,7 @@ Exemplu: https://serverul.meu:8787</translation> <translation type="unfinished">Opțiuni</translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1100,7 +1118,7 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation>eveniment neimplementat: </translation> </message> @@ -1220,7 +1238,7 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation type="unfinished">Închide</translation> </message> @@ -1233,7 +1251,7 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation>nicio versiune stocată</translation> </message> @@ -1241,7 +1259,7 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1281,17 +1299,7 @@ Exemplu: https://serverul.meu:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished">Acceptare</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished">Refuzare</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1342,19 +1350,42 @@ Exemplu: https://serverul.meu:8787</translation> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1437,11 +1468,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation type="unfinished">Nu s-a putut activa criptarea: %1</translation> @@ -1474,6 +1500,24 @@ Exemplu: https://serverul.meu:8787</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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1530,7 +1574,7 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation>Eșuat</translation> </message> @@ -1551,6 +1595,14 @@ Exemplu: https://serverul.meu:8787</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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1571,7 +1623,7 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation>Redactare mesaj eșuată: %1</translation> </message> @@ -1582,7 +1634,7 @@ Exemplu: https://serverul.meu:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation>Salvați imaginea</translation> </message> @@ -1717,12 +1769,12 @@ Exemplu: https://serverul.meu:8787</translation> <translation>%1 și-a redactat ciocănitul.</translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation>Te-ai alăturat camerei.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1751,7 +1803,7 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation type="unfinished"></translation> </message> @@ -1759,17 +1811,32 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation>Nicio cameră deschisă</translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1777,7 +1844,7 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1785,18 +1852,17 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1837,7 +1903,7 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1847,7 +1913,7 @@ Exemplu: https://serverul.meu:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1896,7 +1962,7 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1905,7 +1971,7 @@ Exemplu: https://serverul.meu:8787</translation> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>Minimizează în bara de notificări</translation> </message> @@ -2351,7 +2417,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2402,7 +2468,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation>Ieri</translation> </message> @@ -2474,19 +2540,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_ru.ts b/resources/langs/nheko_ru.ts
index 6f2b19af..be97413f 100644 --- a/resources/langs/nheko_ru.ts +++ b/resources/langs/nheko_ru.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation>Ожидание Подтверждения</translation> </message> @@ -48,7 +48,7 @@ <translation>Ожидание подтверждения у собеседника.</translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>Отмена</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>Не удалось пригласить пользователя: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation>Подтвердите приглашение</translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation>Вы точно хотите пригласить %1 (%2)?</translation> </message> @@ -227,12 +227,12 @@ <translation>Разблокированный пользователь: %1</translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation>Вы действительно хотите начать личную переписку с %1?</translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation>Миграция кэша не удалась!</translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation>Расшифровать секреты</translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation>Поиск</translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation>Люди</translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation>Выберите файл</translation> </message> @@ -617,17 +617,43 @@ <translation>Все файлы (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation>Не удалось загрузить медиа. Пожалуйста попробуйте ещё раз</translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>Удалить</translation> + <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> @@ -745,22 +771,9 @@ Example: https://server.my:8787</source> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>Участники комнаты</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation>ОК</translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+110"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+169"/> <location line="+9"/> <source>removed</source> <translation>убрано</translation> @@ -771,7 +784,7 @@ Example: https://server.my:8787</source> <translation>Шифрование включено</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation>имя комнаты изменено на: %1</translation> </message> @@ -781,7 +794,7 @@ Example: https://server.my:8787</source> <translation>название комнаты убрано</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation>тема изменена на: %1</translation> </message> @@ -791,17 +804,17 @@ Example: https://server.my:8787</source> <translation>тема убрана</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation>%1 создал и настроил комнату: %2</translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation>%1 начал голосовой звонок.</translation> </message> @@ -816,17 +829,17 @@ Example: https://server.my:8787</source> <translation>%1 начал вызов.</translation> </message> <message> - <location line="+11"/> + <location line="+14"/> <source>%1 answered the call.</source> <translation>%1 ответил на звонок.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 ended the call.</source> <translation>%1 завершил вызов.</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>Negotiating call...</source> <translation>Совершение звонка...</translation> </message> @@ -834,7 +847,7 @@ Example: https://server.my:8787</source> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation>Завершить звонок</translation> </message> @@ -855,6 +868,11 @@ Example: https://server.my:8787</source> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation>Эмоджи</translation> </message> @@ -872,17 +890,17 @@ Example: https://server.my:8787</source> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation>Редактировать</translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation>Реакция</translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation>Ответить</translation> </message> @@ -892,7 +910,7 @@ Example: https://server.my:8787</source> <translation>Опции</translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1100,7 +1118,7 @@ Example: https://server.my:8787</source> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation>не реализованное событие</translation> </message> @@ -1220,7 +1238,7 @@ Example: https://server.my:8787</source> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation>Закрыть</translation> </message> @@ -1233,7 +1251,7 @@ Example: https://server.my:8787</source> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation>нет сохраненной версии</translation> </message> @@ -1241,7 +1259,7 @@ Example: https://server.my:8787</source> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1281,17 +1299,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished">Принять</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished">Отказаться</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1342,19 +1350,42 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation>Настройки комнаты</translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation>%1 участник(ов)</translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation>НАЙСТРОЙКИ</translation> </message> @@ -1437,11 +1468,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation>Не удалось включить шифрование: %1</translation> @@ -1474,6 +1500,24 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1530,7 +1574,7 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation>Не удалоcь</translation> </message> @@ -1551,6 +1595,14 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1571,7 +1623,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation>Ошибка редактирования сообщения: %1</translation> </message> @@ -1582,7 +1634,7 @@ Example: https://server.my:8787</source> <translation>Не удалось зашифровать сообщение, отправка отменена!</translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation>Сохранить изображение</translation> </message> @@ -1717,12 +1769,12 @@ Example: https://server.my:8787</source> <translation>%1 отредактировал его &quot;стук&quot;.</translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation>Вы присоединились к этой комнате.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1751,7 +1803,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation>Изменено</translation> </message> @@ -1759,17 +1811,32 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation>Комната не выбрана</translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished">%1 участник(ов)</translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished">Вернуться к списку комнат</translation> </message> @@ -1777,7 +1844,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation>Не найдено личного чата с этим пользователем. Создайте зашифрованный личный чат с этим пользователем и попытайтесь еще раз.</translation> </message> @@ -1785,18 +1852,17 @@ Example: https://server.my:8787</source> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation>Вернуться к списку комнат</translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation>Комнаты не выбраны</translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation>Настройки комнаты</translation> </message> @@ -1837,7 +1903,7 @@ Example: https://server.my:8787</source> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation>Глобальный Пользовательский Профиль</translation> </message> @@ -1847,7 +1913,7 @@ Example: https://server.my:8787</source> <translation>Поользовательский Профиль в Комнате</translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation>Верифицировать</translation> @@ -1896,7 +1962,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation>По умолчанию</translation> @@ -1905,7 +1971,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>Сворачивать в системную панель</translation> </message> @@ -2357,7 +2423,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2408,7 +2474,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation>Вчера</translation> </message> @@ -2480,19 +2546,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_si.ts b/resources/langs/nheko_si.ts
index a80adb1b..67f09710 100644 --- a/resources/langs/nheko_si.ts +++ b/resources/langs/nheko_si.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation type="unfinished"></translation> </message> @@ -48,7 +48,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation type="unfinished"></translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation type="unfinished"></translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation type="unfinished"></translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation type="unfinished"></translation> </message> @@ -227,12 +227,12 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation type="unfinished"></translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation type="unfinished"></translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation type="unfinished"></translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation type="unfinished"></translation> </message> @@ -617,16 +617,42 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> + <location line="+58"/> + <source>Invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>Cancel</source> <translation type="unfinished"></translation> </message> </context> @@ -741,22 +767,9 @@ Example: https://server.my:8787</source> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+110"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+169"/> <location line="+9"/> <source>removed</source> <translation type="unfinished"></translation> @@ -767,7 +780,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -777,7 +790,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -787,17 +800,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> @@ -812,17 +825,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+11"/> + <location line="+14"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> @@ -830,7 +843,7 @@ Example: https://server.my:8787</source> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation type="unfinished"></translation> </message> @@ -851,6 +864,11 @@ Example: https://server.my:8787</source> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation type="unfinished"></translation> </message> @@ -868,17 +886,17 @@ Example: https://server.my:8787</source> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -888,7 +906,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation type="unfinished"></translation> </message> @@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation type="unfinished"></translation> </message> @@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1338,19 +1346,41 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1433,11 +1463,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation type="unfinished"></translation> @@ -1470,6 +1495,24 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1526,7 +1569,7 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation type="unfinished"></translation> </message> @@ -1547,6 +1590,14 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1567,7 +1618,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation type="unfinished"></translation> </message> @@ -1578,7 +1629,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation type="unfinished"></translation> </message> @@ -1712,12 +1763,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1746,7 +1797,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation type="unfinished"></translation> </message> @@ -1754,17 +1805,32 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation type="unfinished"></translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1772,7 +1838,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1780,18 +1846,17 @@ Example: https://server.my:8787</source> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation type="unfinished"></translation> </message> @@ -1832,7 +1897,7 @@ Example: https://server.my:8787</source> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1842,7 +1907,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1891,7 +1956,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1900,7 +1965,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation type="unfinished"></translation> </message> @@ -2346,7 +2411,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2397,7 +2462,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -2469,19 +2534,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_sv.ts b/resources/langs/nheko_sv.ts
index 8069dcea..fb662292 100644 --- a/resources/langs/nheko_sv.ts +++ b/resources/langs/nheko_sv.ts
@@ -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 på att motparten ska slutföra verifikationen.</translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>Avbryt</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>Kunde inte bjuda in användare: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation>Bekräfta inbjudan</translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation>Är du säker på att du vill bjuda in %1 (%2)?</translation> </message> @@ -227,12 +227,12 @@ <translation>Hävde bannlysningen av användare: %1</translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation type="unfinished"></translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation>Cache-migration misslyckades!</translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation>Dekryptera hemliga nycklar</translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation>Sök</translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation>Personer</translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation>Välj en fil</translation> </message> @@ -617,17 +617,43 @@ <translation>Alla Filer (*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation>Kunde inte ladda upp media. Vänligen försök igen.</translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> + <message> + <location filename="../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 filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>Ta bort</translation> + <location line="+7"/> + <source>Cancel</source> + <translation type="unfinished">Avbryt</translation> </message> </context> <context> @@ -745,27 +771,14 @@ Exempel: https://server.my:8787</translation> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>Rumsmedlemmar</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation>OK</translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+128"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+187"/> <source>Encryption enabled</source> <translation>Kryptering aktiverad</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation>rummets namn ändrat till: %1</translation> </message> @@ -775,7 +788,7 @@ Exempel: https://server.my:8787</translation> <translation>tog bort rummets namn</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation>ämne ändrat till: %1</translation> </message> @@ -785,17 +798,17 @@ Exempel: https://server.my:8787</translation> <translation>tog bort ämne</translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation>%1 skapade och konfigurerade rum: %2</translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation>%1 påbörjade ett röstsamtal.</translation> </message> @@ -810,23 +823,23 @@ Exempel: https://server.my:8787</translation> <translation>%1 påbörjade ett samtal.</translation> </message> <message> - <location line="+29"/> + <location line="+38"/> <source>Negotiating call...</source> <translation>Förhandlar samtal…</translation> </message> <message> - <location line="-18"/> + <location line="-24"/> <source>%1 answered the call.</source> <translation>%1 besvarade samtalet.</translation> </message> <message> - <location line="-80"/> + <location line="-99"/> <location line="+9"/> <source>removed</source> <translation>borttagen</translation> </message> <message> - <location line="+80"/> + <location line="+102"/> <source>%1 ended the call.</source> <translation>%1 avslutade samtalet.</translation> </message> @@ -834,7 +847,7 @@ Exempel: https://server.my:8787</translation> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation>Lägg på</translation> </message> @@ -855,6 +868,11 @@ Exempel: https://server.my:8787</translation> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation>Emoji</translation> </message> @@ -872,17 +890,17 @@ Exempel: https://server.my:8787</translation> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation type="unfinished">Reagera</translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation type="unfinished">Svara</translation> </message> @@ -892,7 +910,7 @@ Exempel: https://server.my:8787</translation> <translation type="unfinished">Alternativ</translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1100,7 +1118,7 @@ Exempel: https://server.my:8787</translation> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation>ej implementerat event: </translation> </message> @@ -1220,7 +1238,7 @@ Exempel: https://server.my:8787</translation> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation>Stäng</translation> </message> @@ -1233,7 +1251,7 @@ Exempel: https://server.my:8787</translation> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation>ingen version lagrad</translation> </message> @@ -1241,7 +1259,7 @@ Exempel: https://server.my:8787</translation> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1281,17 +1299,7 @@ Exempel: https://server.my:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished">Godkänn</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished"></translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1342,19 +1350,41 @@ Exempel: https://server.my:8787</translation> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1437,11 +1467,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation type="unfinished">Kunde inte aktivera kryptering: %1</translation> @@ -1474,6 +1499,24 @@ Exempel: https://server.my:8787</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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1530,7 +1573,7 @@ Exempel: https://server.my:8787</translation> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation>Misslyckat</translation> </message> @@ -1551,6 +1594,14 @@ Exempel: https://server.my:8787</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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1571,7 +1622,7 @@ Exempel: https://server.my:8787</translation> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation>Kunde inte maskera meddelande: %1</translation> </message> @@ -1582,7 +1633,7 @@ Exempel: https://server.my:8787</translation> <translation>Kunde inte kryptera event, sändning avbruten!</translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation>Spara bild</translation> </message> @@ -1716,12 +1767,12 @@ Exempel: https://server.my:8787</translation> <translation>%1 maskerade sin knackning.</translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation>Du gick med i detta rum.</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1750,7 +1801,7 @@ Exempel: https://server.my:8787</translation> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation type="unfinished"></translation> </message> @@ -1758,17 +1809,32 @@ Exempel: https://server.my:8787</translation> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation>Inget rum öppet</translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished">Tillbaka till rumlista</translation> </message> @@ -1776,7 +1842,7 @@ Exempel: https://server.my:8787</translation> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation>Ingen krypterad privat chatt med denna användare kunde hittas. Skapa en krypterad privat chatt med användaren och försök igen.</translation> </message> @@ -1784,18 +1850,17 @@ Exempel: https://server.my:8787</translation> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation>Tillbaka till rumlista</translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation>Inget rum markerat</translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation>Alternativ för rum</translation> </message> @@ -1836,7 +1901,7 @@ Exempel: https://server.my:8787</translation> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1846,7 +1911,7 @@ Exempel: https://server.my:8787</translation> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation>Bekräfta</translation> @@ -1895,7 +1960,7 @@ Exempel: https://server.my:8787</translation> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1904,7 +1969,7 @@ Exempel: https://server.my:8787</translation> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>Minimera till systemtråg</translation> </message> @@ -2358,7 +2423,7 @@ Detta gör vanligtvis att ikonen i aktivitetsfältet animeras på något sätt.< <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation>Väntar på motparten…</translation> </message> @@ -2409,7 +2474,7 @@ Detta gör vanligtvis att ikonen i aktivitetsfältet animeras på något sätt.< <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation>Igår</translation> </message> @@ -2481,19 +2546,6 @@ Detta gör vanligtvis att ikonen i aktivitetsfältet animeras på något sätt.< </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/langs/nheko_zh_CN.ts b/resources/langs/nheko_zh_CN.ts
index d468dfaa..c84e3c82 100644 --- a/resources/langs/nheko_zh_CN.ts +++ b/resources/langs/nheko_zh_CN.ts
@@ -38,7 +38,7 @@ <context> <name>AwaitingVerificationConfirmation</name> <message> - <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+11"/> + <location filename="../qml/device-verification/AwaitingVerificationConfirmation.qml" line="+12"/> <source>Awaiting Confirmation</source> <translation type="unfinished"></translation> </message> @@ -48,7 +48,7 @@ <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+13"/> <source>Cancel</source> <translation>取消</translation> </message> @@ -125,7 +125,7 @@ <context> <name>ChatPage</name> <message> - <location filename="../../src/ChatPage.cpp" line="+133"/> + <location filename="../../src/ChatPage.cpp" line="+135"/> <source>Failed to invite user: %1</source> <translation>邀请用户失败: %1</translation> </message> @@ -157,12 +157,12 @@ </message> <message> <location line="+34"/> - <location line="+280"/> + <location line="+284"/> <source>Confirm invite</source> <translation type="unfinished"></translation> </message> <message> - <location line="-279"/> + <location line="-283"/> <source>Do you really want to invite %1 (%2)?</source> <translation type="unfinished"></translation> </message> @@ -227,12 +227,12 @@ <translation>解禁用户: %1</translation> </message> <message> - <location line="+183"/> + <location line="+187"/> <source>Do you really want to start a private chat with %1?</source> <translation type="unfinished"></translation> </message> <message> - <location line="-721"/> + <location line="-725"/> <source>Cache migration failed!</source> <translation>缓存迁移失败!</translation> </message> @@ -352,7 +352,7 @@ <context> <name>CrossSigningSecrets</name> <message> - <location filename="../../src/ChatPage.cpp" line="+183"/> + <location filename="../../src/ChatPage.cpp" line="+187"/> <source>Decrypt secrets</source> <translation type="unfinished"></translation> </message> @@ -426,12 +426,12 @@ <context> <name>EmojiPicker</name> <message> - <location filename="../qml/emoji/EmojiPicker.qml" line="+59"/> + <location filename="../qml/emoji/EmojiPicker.qml" line="+68"/> <source>Search</source> <translation type="unfinished"></translation> </message> <message> - <location line="+172"/> + <location line="+186"/> <source>People</source> <translation type="unfinished"></translation> </message> @@ -607,7 +607,7 @@ <context> <name>InputBar</name> <message> - <location filename="../../src/timeline/InputBar.cpp" line="+233"/> + <location filename="../../src/timeline/InputBar.cpp" line="+234"/> <source>Select a file</source> <translation type="unfinished">选择一个文件</translation> </message> @@ -617,17 +617,43 @@ <translation type="unfinished">所有文件(*)</translation> </message> <message> - <location line="+417"/> + <location line="+442"/> <source>Failed to upload media. Please try again.</source> <translation type="unfinished"></translation> </message> </context> <context> - <name>InviteeItem</name> + <name>InviteDialog</name> <message> - <location filename="../../src/InviteeItem.cpp" line="+22"/> - <source>Remove</source> - <translation>移除</translation> + <location filename="../qml/InviteDialog.qml" line="+32"/> + <source>Invite users to %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> + <source>User ID to invite</source> + <translation type="unfinished">要邀请的用户 ID</translation> + </message> + <message> + <location line="+14"/> + <source>@joe:matrix.org</source> + <comment>Example user id. The name &apos;joe&apos; can be localized however you want.</comment> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+17"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+58"/> + <source>Invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>Cancel</source> + <translation type="unfinished">取消</translation> </message> </context> <context> @@ -741,22 +767,9 @@ Example: https://server.my:8787</source> </message> </context> <context> - <name>MemberList</name> - <message> - <location filename="../../src/dialogs/MemberList.cpp" line="+94"/> - <source>Room members</source> - <translation>聊天室成员</translation> - </message> - <message> - <location line="+4"/> - <source>OK</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> <name>MessageDelegate</name> <message> - <location filename="../qml/delegates/MessageDelegate.qml" line="+110"/> + <location filename="../qml/delegates/MessageDelegate.qml" line="+169"/> <location line="+9"/> <source>removed</source> <translation type="unfinished"></translation> @@ -767,7 +780,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>room name changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -777,7 +790,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>topic changed to: %1</source> <translation type="unfinished"></translation> </message> @@ -787,17 +800,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 changed the room avatar</source> <translation type="unfinished"></translation> </message> <message> - <location line="+8"/> + <location line="+12"/> <source>%1 created and configured room: %2</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> + <location line="+15"/> <source>%1 placed a voice call.</source> <translation type="unfinished"></translation> </message> @@ -812,17 +825,17 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+11"/> + <location line="+14"/> <source>%1 answered the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>%1 ended the call.</source> <translation type="unfinished"></translation> </message> <message> - <location line="+9"/> + <location line="+12"/> <source>Negotiating call...</source> <translation type="unfinished"></translation> </message> @@ -830,7 +843,7 @@ Example: https://server.my:8787</source> <context> <name>MessageInput</name> <message> - <location filename="../qml/MessageInput.qml" line="+43"/> + <location filename="../qml/MessageInput.qml" line="+44"/> <source>Hang up</source> <translation type="unfinished"></translation> </message> @@ -851,6 +864,11 @@ Example: https://server.my:8787</source> </message> <message> <location line="+214"/> + <source>Stickers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+24"/> <source>Emoji</source> <translation type="unfinished"></translation> </message> @@ -868,17 +886,17 @@ Example: https://server.my:8787</source> <context> <name>MessageView</name> <message> - <location filename="../qml/MessageView.qml" line="+83"/> + <location filename="../qml/MessageView.qml" line="+87"/> <source>Edit</source> <translation type="unfinished"></translation> </message> <message> - <location line="+15"/> + <location line="+16"/> <source>React</source> <translation type="unfinished"></translation> </message> <message> - <location line="+13"/> + <location line="+16"/> <source>Reply</source> <translation type="unfinished"></translation> </message> @@ -888,7 +906,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+329"/> + <location line="+394"/> <source>&amp;Copy</source> <translation type="unfinished"></translation> </message> @@ -1096,7 +1114,7 @@ Example: https://server.my:8787</source> <context> <name>Placeholder</name> <message> - <location filename="../qml/delegates/Placeholder.qml" line="+9"/> + <location filename="../qml/delegates/Placeholder.qml" line="+11"/> <source>unimplemented event: </source> <translation type="unfinished"></translation> </message> @@ -1216,7 +1234,7 @@ Example: https://server.my:8787</source> <context> <name>ReplyPopup</name> <message> - <location filename="../qml/ReplyPopup.qml" line="+47"/> + <location filename="../qml/ReplyPopup.qml" line="+62"/> <source>Close</source> <translation type="unfinished"></translation> </message> @@ -1229,7 +1247,7 @@ Example: https://server.my:8787</source> <context> <name>RoomInfo</name> <message> - <location filename="../../src/Cache.cpp" line="+4009"/> + <location filename="../../src/Cache.cpp" line="+4169"/> <source>no version stored</source> <translation type="unfinished"></translation> </message> @@ -1237,7 +1255,7 @@ Example: https://server.my:8787</source> <context> <name>RoomList</name> <message> - <location filename="../qml/RoomList.qml" line="+56"/> + <location filename="../qml/RoomList.qml" line="+57"/> <source>New tag</source> <translation type="unfinished"></translation> </message> @@ -1277,17 +1295,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+222"/> - <source>Accept</source> - <translation type="unfinished">接受</translation> - </message> - <message> - <location line="+21"/> - <source>Decline</source> - <translation type="unfinished">拒绝</translation> - </message> - <message> - <location line="+68"/> + <location line="+268"/> <source>Status Message</source> <translation type="unfinished"></translation> </message> @@ -1338,19 +1346,40 @@ Example: https://server.my:8787</source> </message> </context> <context> + <name>RoomMembers</name> + <message> + <location filename="../qml/RoomMembers.qml" line="+17"/> + <source>Members of %1</source> + <translation type="unfinished"></translation> + </message> + <message numerus="yes"> + <location line="+32"/> + <source>%n people in %1</source> + <comment>Summary above list of members</comment> + <translation type="unfinished"> + <numerusform></numerusform> + </translation> + </message> + <message> + <location line="+10"/> + <source>Invite more people</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>RoomSettings</name> <message> - <location filename="../qml/RoomSettings.qml" line="+25"/> + <location filename="../qml/RoomSettings.qml" line="+26"/> <source>Room Settings</source> <translation type="unfinished"></translation> </message> <message> - <location line="+79"/> + <location line="+80"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+43"/> + <location line="+45"/> <source>SETTINGS</source> <translation type="unfinished"></translation> </message> @@ -1433,11 +1462,6 @@ 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"/> <source>Failed to enable encryption: %1</source> <translation type="unfinished">启用加密失败:%1</translation> @@ -1470,6 +1494,24 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/voip/ScreenShare.qml" line="+30"/> @@ -1526,7 +1568,7 @@ Example: https://server.my:8787</source> <context> <name>StatusIndicator</name> <message> - <location filename="../qml/StatusIndicator.qml" line="+21"/> + <location filename="../qml/StatusIndicator.qml" line="+24"/> <source>Failed</source> <translation type="unfinished"></translation> </message> @@ -1547,6 +1589,14 @@ Example: https://server.my:8787</source> </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> <location filename="../qml/device-verification/Success.qml" line="+11"/> @@ -1567,7 +1617,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineModel</name> <message> - <location filename="../../src/timeline/TimelineModel.cpp" line="+1095"/> + <location filename="../../src/timeline/TimelineModel.cpp" line="+1132"/> <source>Message redaction failed: %1</source> <translation type="unfinished">删除消息失败:%1</translation> </message> @@ -1578,7 +1628,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+164"/> + <location line="+173"/> <source>Save image</source> <translation type="unfinished">保存图像</translation> </message> @@ -1711,12 +1761,12 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="-883"/> + <location line="-909"/> <source>You joined this room.</source> <translation type="unfinished">您已加入此房间</translation> </message> <message> - <location line="+849"/> + <location line="+875"/> <source>%1 has changed their avatar and changed their display name to %2.</source> <translation type="unfinished"></translation> </message> @@ -1745,7 +1795,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineRow</name> <message> - <location filename="../qml/TimelineRow.qml" line="+106"/> + <location filename="../qml/TimelineRow.qml" line="+180"/> <source>Edited</source> <translation type="unfinished"></translation> </message> @@ -1753,17 +1803,32 @@ Example: https://server.my:8787</source> <context> <name>TimelineView</name> <message> - <location filename="../qml/TimelineView.qml" line="+27"/> + <location filename="../qml/TimelineView.qml" line="+30"/> <source>No room open</source> <translation type="unfinished"></translation> </message> <message> - <location line="+127"/> + <location line="+139"/> <source>%1 member(s)</source> <translation type="unfinished"></translation> </message> <message> - <location line="+46"/> + <location line="+33"/> + <source>join the conversation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>accept invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+7"/> + <source>decline invite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location line="+27"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> @@ -1771,7 +1836,7 @@ Example: https://server.my:8787</source> <context> <name>TimelineViewManager</name> <message> - <location filename="../../src/timeline/TimelineViewManager.cpp" line="+461"/> + <location filename="../../src/timeline/TimelineViewManager.cpp" line="+472"/> <source>No encrypted private chat found with this user. Create an encrypted private chat with this user and try again.</source> <translation type="unfinished"></translation> </message> @@ -1779,18 +1844,17 @@ Example: https://server.my:8787</source> <context> <name>TopBar</name> <message> - <location filename="../qml/TopBar.qml" line="+51"/> + <location filename="../qml/TopBar.qml" line="+54"/> <source>Back to room list</source> <translation type="unfinished"></translation> </message> <message> - <location line="+12"/> - <location line="+10"/> + <location line="-39"/> <source>No room selected</source> <translation type="unfinished"></translation> </message> <message> - <location line="+24"/> + <location line="+90"/> <source>Room options</source> <translation type="unfinished">聊天室选项</translation> </message> @@ -1831,7 +1895,7 @@ Example: https://server.my:8787</source> <context> <name>UserProfile</name> <message> - <location filename="../qml/UserProfile.qml" line="+24"/> + <location filename="../qml/UserProfile.qml" line="+25"/> <source>Global User Profile</source> <translation type="unfinished"></translation> </message> @@ -1841,7 +1905,7 @@ Example: https://server.my:8787</source> <translation type="unfinished"></translation> </message> <message> - <location line="+114"/> + <location line="+115"/> <location line="+107"/> <source>Verify</source> <translation type="unfinished"></translation> @@ -1890,7 +1954,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettings</name> <message> - <location filename="../../src/UserSettingsPage.cpp" line="+362"/> + <location filename="../../src/UserSettingsPage.cpp" line="+363"/> <location filename="../../src/UserSettingsPage.h" line="+194"/> <source>Default</source> <translation type="unfinished"></translation> @@ -1899,7 +1963,7 @@ Example: https://server.my:8787</source> <context> <name>UserSettingsPage</name> <message> - <location line="+524"/> + <location line="+525"/> <source>Minimize to tray</source> <translation>最小化至托盘</translation> </message> @@ -2345,7 +2409,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>Waiting</name> <message> - <location filename="../qml/device-verification/Waiting.qml" line="+11"/> + <location filename="../qml/device-verification/Waiting.qml" line="+12"/> <source>Waiting for other party…</source> <translation type="unfinished"></translation> </message> @@ -2396,7 +2460,7 @@ This usually causes the application icon in the task bar to animate in some fash <context> <name>descriptiveTime</name> <message> - <location filename="../../src/Utils.cpp" line="+207"/> + <location filename="../../src/Utils.cpp" line="+210"/> <source>Yesterday</source> <translation type="unfinished"></translation> </message> @@ -2468,19 +2532,6 @@ This usually causes the application icon in the task bar to animate in some fash </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> <location filename="../../src/dialogs/JoinRoom.cpp" line="+34"/> diff --git a/resources/qml/Completer.qml b/resources/qml/Completer.qml
index 333fb11d..00fc3216 100644 --- a/resources/qml/Completer.qml +++ b/resources/qml/Completer.qml
@@ -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(""); diff --git a/resources/qml/InviteDialog.qml b/resources/qml/InviteDialog.qml new file mode 100644
index 00000000..50287ad5 --- /dev/null +++ b/resources/qml/InviteDialog.qml
@@ -0,0 +1,159 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 +import im.nheko 1.0 + +ApplicationWindow { + id: inviteDialogRoot + + property string roomId + property string plainRoomName + property InviteesModel invitees + + function addInvite() { + if (inviteeEntry.isValidMxid) { + invitees.addUser(inviteeEntry.text); + inviteeEntry.clear(); + } + } + + function cleanUpAndClose() { + if (inviteeEntry.isValidMxid) + addInvite(); + + invitees.accept(); + close(); + } + + title: qsTr("Invite users to %1").arg(plainRoomName) + x: MainWindow.x + (MainWindow.width / 2) - (width / 2) + y: MainWindow.y + (MainWindow.height / 2) - (height / 2) + height: 380 + width: 340 + palette: Nheko.colors + color: Nheko.colors.window + + Shortcut { + sequence: "Ctrl+Enter" + onActivated: cleanUpAndClose() + } + + Shortcut { + sequence: StandardKey.Cancel + onActivated: inviteDialogRoot.close() + } + + ColumnLayout { + anchors.fill: parent + anchors.margins: Nheko.paddingMedium + spacing: Nheko.paddingMedium + + Label { + text: qsTr("User ID to invite") + Layout.fillWidth: true + color: Nheko.colors.text + } + + RowLayout { + spacing: Nheko.paddingMedium + + MatrixTextField { + id: inviteeEntry + + property bool isValidMxid: text.match("@.+?:.{3,}") + + backgroundColor: Nheko.colors.window + placeholderText: qsTr("@joe:matrix.org", "Example user id. The name 'joe' can be localized however you want.") + Layout.fillWidth: true + onAccepted: { + if (isValidMxid) + addInvite(); + + } + Component.onCompleted: forceActiveFocus() + Keys.onShortcutOverride: event.accepted = ((event.key === Qt.Key_Return || event.key === Qt.Key_Enter) && (event.modifiers & Qt.ControlModifier)) + Keys.onPressed: { + if ((event.key === Qt.Key_Return || event.key === Qt.Key_Enter) && (event.modifiers === Qt.ControlModifier)) + cleanUpAndClose(); + + } + } + + Button { + text: qsTr("Add") + enabled: inviteeEntry.isValidMxid + onClicked: addInvite() + } + + } + + ListView { + id: inviteesList + + Layout.fillWidth: true + Layout.fillHeight: true + model: invitees + + delegate: RowLayout { + spacing: Nheko.paddingMedium + + Avatar { + width: Nheko.avatarSize + height: Nheko.avatarSize + userid: model.mxid + url: model.avatarUrl.replace("mxc://", "image://MxcImage/") + displayName: model.displayName + onClicked: TimelineManager.openGlobalUserProfile(model.mxid) + } + + ColumnLayout { + spacing: Nheko.paddingSmall + + Label { + text: model.displayName + color: TimelineManager.userColor(model ? model.mxid : "", Nheko.colors.window) + font.pointSize: fontMetrics.font.pointSize + } + + Label { + text: model.mxid + color: Nheko.colors.buttonText + font.pointSize: fontMetrics.font.pointSize * 0.9 + } + + Item { + Layout.fillHeight: true + Layout.fillWidth: true + } + + } + + } + + } + + } + + footer: DialogButtonBox { + id: buttons + + Button { + text: qsTr("Invite") + DialogButtonBox.buttonRole: DialogButtonBox.AcceptRole + enabled: invitees.count > 0 + onClicked: cleanUpAndClose() + } + + Button { + text: qsTr("Cancel") + DialogButtonBox.buttonRole: DialogButtonBox.DestructiveRole + onClicked: inviteDialogRoot.close() + } + + } + +} diff --git a/resources/qml/MatrixText.qml b/resources/qml/MatrixText.qml
index 9129b154..35e5f7e7 100644 --- a/resources/qml/MatrixText.qml +++ b/resources/qml/MatrixText.qml
@@ -8,6 +8,7 @@ import im.nheko 1.0 TextEdit { id: r + textFormat: TextEdit.RichText readOnly: true focus: false @@ -19,14 +20,13 @@ TextEdit { onLinkActivated: Nheko.openLink(link) ToolTip.visible: hoveredLink ToolTip.text: hoveredLink + Component.onCompleted: { + TimelineManager.fixImageRendering(r.textDocument, r); + } CursorShape { anchors.fill: parent cursorShape: hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor } - Component.onCompleted: { - TimelineManager.fixImageRendering(r.textDocument, r) - } - } diff --git a/resources/qml/MatrixTextField.qml b/resources/qml/MatrixTextField.qml
index 3c660bac..80732b27 100644 --- a/resources/qml/MatrixTextField.qml +++ b/resources/qml/MatrixTextField.qml
@@ -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 } diff --git a/resources/qml/MessageInput.qml b/resources/qml/MessageInput.qml
index 24f9b0e8..58d71a4e 100644 --- a/resources/qml/MessageInput.qml +++ b/resources/qml/MessageInput.qml
@@ -2,6 +2,7 @@ // // SPDX-License-Identifier: GPL-3.0-or-later +import "./emoji" import "./voip" import QtQuick 2.12 import QtQuick.Controls 2.3 @@ -87,7 +88,7 @@ Rectangle { Layout.alignment: Qt.AlignBottom // | Qt.AlignHCenter Layout.maximumHeight: Window.height / 4 Layout.minimumHeight: Settings.fontSize - implicitWidth: inputBar.width - 4 * (22 + 16) - 24 + implicitWidth: inputBar.width - 5 * (22 + 16) - 24 TextArea { id: messageInput @@ -320,6 +321,30 @@ Rectangle { } ImageButton { + id: stickerButton + + Layout.alignment: Qt.AlignRight | Qt.AlignBottom + Layout.margins: 8 + hoverEnabled: true + width: 22 + height: 22 + image: ":/icons/icons/ui/sticky-note-solid.svg" + ToolTip.visible: hovered + ToolTip.text: qsTr("Stickers") + onClicked: stickerPopup.visible ? stickerPopup.close() : stickerPopup.show(stickerButton, room.roomId, function(row) { + room.input.sticker(stickerPopup.model.sourceModel, row); + TimelineManager.focusMessageInput(); + }) + + StickerPicker { + id: stickerPopup + + colors: Nheko.colors + } + + } + + ImageButton { id: emojiButton Layout.alignment: Qt.AlignRight | Qt.AlignBottom diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml
index 33dff122..50cbd371 100644 --- a/resources/qml/MessageView.qml +++ b/resources/qml/MessageView.qml
@@ -92,16 +92,20 @@ ScrollView { } } - EmojiButton { + ImageButton { id: reactButton visible: chat.model ? chat.model.permissions.canSend(MtxEvent.Reaction) : false width: 16 hoverEnabled: true + image: ":/icons/icons/ui/smile.png" ToolTip.visible: hovered ToolTip.text: qsTr("React") - emojiPicker: emojiPopup - event_id: row.model ? row.model.eventId : "" + onClicked: emojiPopup.visible ? emojiPopup.close() : emojiPopup.show(reactButton, function(emoji) { + var event_id = row.model ? row.model.eventId : ""; + room.input.reaction(event_id, emoji); + TimelineManager.focusMessageInput(); + }) } ImageButton { @@ -337,6 +341,7 @@ ScrollView { required property var timestamp required property int status required property int index + required property int relatedEventCacheBuster required property string previousMessageUserId required property string day required property string previousMessageDay @@ -442,6 +447,7 @@ ScrollView { trustlevel: wrapper.trustlevel timestamp: wrapper.timestamp status: wrapper.status + relatedEventCacheBuster: wrapper.relatedEventCacheBuster y: section.visible && section.active ? section.y + section.height : 0 HoverHandler { @@ -471,12 +477,23 @@ ScrollView { } - footer: Spinner { + footer: Item { anchors.horizontalCenter: parent.horizontalCenter - running: chat.model && chat.model.paginationInProgress - foreground: Nheko.colors.mid + anchors.margins: Nheko.paddingLarge visible: chat.model && chat.model.paginationInProgress - z: 3 + // hacky, but works + height: loadingSpinner.height + 2 * Nheko.paddingLarge + + Spinner { + id: loadingSpinner + + anchors.centerIn: parent + anchors.margins: Nheko.paddingLarge + running: chat.model && chat.model.paginationInProgress + foreground: Nheko.colors.mid + z: 3 + } + } } diff --git a/resources/qml/RoomList.qml b/resources/qml/RoomList.qml
index a1ce8d7e..2be5fe92 100644 --- a/resources/qml/RoomList.qml +++ b/resources/qml/RoomList.qml
@@ -33,8 +33,8 @@ Page { Connections { onActiveTimelineChanged: { - roomlist.positionViewAtIndex(Rooms.roomidToIndex(Rooms.currentRoom.roomId()), ListView.Contain); - console.log("Test" + Rooms.currentRoom.roomId() + " " + Rooms.roomidToIndex(Rooms.currentRoom.roomId())); + roomlist.positionViewAtIndex(Rooms.roomidToIndex(Rooms.currentRoom.roomId), ListView.Contain); + console.log("Test" + Rooms.currentRoom.roomId + " " + Rooms.roomidToIndex(Rooms.currentRoom.roomId)); } target: TimelineManager } @@ -61,9 +61,19 @@ Page { } } + Platform.MessageDialog { + id: leaveRoomDialog + + title: qsTr("Leave Room") + text: qsTr("Are you sure you want to leave this room?") + modality: Qt.Modal + onAccepted: Rooms.leave(roomContextMenu.roomid) + buttons: Dialog.Ok | Dialog.Cancel + } + Platform.MenuItem { text: qsTr("Leave room") - onTriggered: Rooms.leave(roomContextMenu.roomid) + onTriggered: leaveRoomDialog.open() } Platform.MenuSeparator { @@ -133,7 +143,7 @@ Page { states: [ State { name: "highlight" - when: hovered.hovered && !((Rooms.currentRoom && roomId == Rooms.currentRoom.roomId()) || Rooms.currentRoomPreview.roomid == roomId) + when: hovered.hovered && !((Rooms.currentRoom && roomId == Rooms.currentRoom.roomId) || Rooms.currentRoomPreview.roomid == roomId) PropertyChanges { target: roomItem @@ -147,7 +157,7 @@ Page { }, State { name: "selected" - when: (Rooms.currentRoom && roomId == Rooms.currentRoom.roomId()) || Rooms.currentRoomPreview.roomid == roomId + when: (Rooms.currentRoom && roomId == Rooms.currentRoom.roomId) || Rooms.currentRoomPreview.roomid == roomId PropertyChanges { target: roomItem diff --git a/resources/qml/RoomMembers.qml b/resources/qml/RoomMembers.qml new file mode 100644
index 00000000..641a08be --- /dev/null +++ b/resources/qml/RoomMembers.qml
@@ -0,0 +1,148 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +import "./ui" +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 +import QtQuick.Window 2.12 +import im.nheko 1.0 + +ApplicationWindow { + id: roomMembersRoot + + property MemberList members + + title: qsTr("Members of %1").arg(members.roomName) + x: MainWindow.x + (MainWindow.width / 2) - (width / 2) + y: MainWindow.y + (MainWindow.height / 2) - (height / 2) + height: 650 + width: 420 + minimumHeight: 420 + palette: Nheko.colors + color: Nheko.colors.window + + Shortcut { + sequence: StandardKey.Cancel + onActivated: roomMembersRoot.close() + } + + ColumnLayout { + anchors.fill: parent + anchors.margins: Nheko.paddingMedium + spacing: Nheko.paddingMedium + + Avatar { + id: roomAvatar + + width: 130 + height: width + displayName: members.roomName + Layout.alignment: Qt.AlignHCenter + url: members.avatarUrl.replace("mxc://", "image://MxcImage/") + onClicked: TimelineManager.openRoomSettings(members.roomId) + } + + ElidedLabel { + font.pixelSize: fontMetrics.font.pixelSize * 2 + fullText: qsTr("%n people in %1", "Summary above list of members", members.memberCount).arg(members.roomName) + Layout.alignment: Qt.AlignHCenter + elideWidth: parent.width - Nheko.paddingMedium + } + + ImageButton { + Layout.alignment: Qt.AlignHCenter + image: ":/icons/icons/ui/add-square-button.png" + hoverEnabled: true + ToolTip.visible: hovered + ToolTip.text: qsTr("Invite more people") + onClicked: TimelineManager.openInviteUsers(members.roomId) + } + + ScrollView { + palette: Nheko.colors + padding: Nheko.paddingMedium + ScrollBar.horizontal.visible: false + Layout.fillHeight: true + Layout.minimumHeight: 200 + Layout.fillWidth: true + + ListView { + id: memberList + + clip: true + spacing: Nheko.paddingMedium + boundsBehavior: Flickable.StopAtBounds + model: members + + ScrollHelper { + flickable: parent + anchors.fill: parent + enabled: !Settings.mobileMode + } + + delegate: RowLayout { + spacing: Nheko.paddingMedium + + Avatar { + width: Nheko.avatarSize + height: Nheko.avatarSize + userid: model.mxid + url: model.avatarUrl.replace("mxc://", "image://MxcImage/") + displayName: model.displayName + onClicked: Rooms.currentRoom.openUserProfile(model.mxid) + } + + ColumnLayout { + spacing: Nheko.paddingSmall + + Label { + text: model.displayName + color: TimelineManager.userColor(model ? model.mxid : "", Nheko.colors.window) + font.pointSize: fontMetrics.font.pointSize + } + + Label { + text: model.mxid + color: Nheko.colors.buttonText + font.pointSize: fontMetrics.font.pointSize * 0.9 + } + + Item { + Layout.fillHeight: true + Layout.fillWidth: true + } + + } + + } + + footer: Item { + width: parent.width + visible: (members.numUsersLoaded < members.memberCount) && members.loadingMoreMembers + // use the default height if it's visible, otherwise no height at all + height: membersLoadingSpinner.height + anchors.margins: Nheko.paddingMedium + + Spinner { + id: membersLoadingSpinner + + anchors.centerIn: parent + height: visible ? 35 : 0 + } + + } + + } + + } + + } + + footer: DialogButtonBox { + standardButtons: DialogButtonBox.Ok + onAccepted: roomMembersRoot.close() + } + +} diff --git a/resources/qml/RoomSettings.qml b/resources/qml/RoomSettings.qml
index 4b06401a..b8e527a5 100644 --- a/resources/qml/RoomSettings.qml +++ b/resources/qml/RoomSettings.qml
@@ -4,7 +4,7 @@ import "./ui" import Qt.labs.platform 1.1 as Platform -import QtQuick 2.9 +import QtQuick 2.15 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.2 import QtQuick.Window 2.3 @@ -98,13 +98,23 @@ ApplicationWindow { MatrixText { text: roomSettings.roomName - font.pixelSize: 24 + font.pixelSize: fontMetrics.font.pixelSize * 2 Layout.alignment: Qt.AlignHCenter } MatrixText { text: qsTr("%1 member(s)").arg(roomSettings.memberCount) Layout.alignment: Qt.AlignHCenter + + TapHandler { + onTapped: TimelineManager.openRoomMembers(roomSettings.roomId) + } + + CursorShape { + cursorShape: Qt.PointingHandCursor + anchors.fill: parent + } + } } @@ -209,7 +219,7 @@ ApplicationWindow { title: qsTr("End-to-End Encryption") text: qsTr("Encryption is currently experimental and things might break unexpectedly. <br> Please take note that it can't be disabled afterwards.") - modality: Qt.NonModal + modality: Qt.Modal onAccepted: { if (roomSettings.isEncryptionEnabled) return ; @@ -222,6 +232,17 @@ ApplicationWindow { buttons: Dialog.Ok | Dialog.Cancel } + MatrixText { + text: qsTr("Sticker & Emote Settings") + } + + Button { + text: qsTr("Change") + ToolTip.text: qsTr("Change what packs are enabled, remove packs or create new ones") + onClicked: TimelineManager.openImagePackSettings(roomSettings.roomId) + Layout.alignment: Qt.AlignRight + } + Item { // for adding extra space between sections Layout.fillWidth: true @@ -247,7 +268,7 @@ ApplicationWindow { MatrixText { text: roomSettings.roomId - font.pixelSize: 14 + font.pixelSize: fontMetrics.font.pixelSize * 1.2 Layout.alignment: Qt.AlignRight } @@ -257,16 +278,16 @@ ApplicationWindow { MatrixText { text: roomSettings.roomVersion - font.pixelSize: 14 + font.pixelSize: fontMetrics.font.pixelSize * 1.2 Layout.alignment: Qt.AlignRight } } - Button { - Layout.alignment: Qt.AlignRight - text: qsTr("OK") - onClicked: close() + DialogButtonBox { + Layout.fillWidth: true + standardButtons: DialogButtonBox.Ok + onAccepted: close() } } diff --git a/resources/qml/Root.qml b/resources/qml/Root.qml
index 5316e20d..1793d9bc 100644 --- a/resources/qml/Root.qml +++ b/resources/qml/Root.qml
@@ -4,6 +4,7 @@ import "./delegates" import "./device-verification" +import "./dialogs" import "./emoji" import "./voip" import Qt.labs.platform 1.1 as Platform @@ -48,6 +49,14 @@ Page { } Component { + id: roomMembersComponent + + RoomMembers { + } + + } + + Component { id: mobileCallInviteDialog CallInvite { @@ -63,6 +72,30 @@ Page { } + Component { + id: deviceVerificationDialog + + DeviceVerification { + } + + } + + Component { + id: inviteDialog + + InviteDialog { + } + + } + + Component { + id: packSettingsComponent + + ImagePackSettingsDialog { + } + + } + Shortcut { sequence: "Ctrl+K" onActivated: { @@ -82,14 +115,6 @@ Page { onActivated: Rooms.previousRoom() } - Component { - id: deviceVerificationDialog - - DeviceVerification { - } - - } - Connections { target: TimelineManager onNewDeviceVerificationRequest: { @@ -104,6 +129,12 @@ Page { }); userProfile.show(); } + onShowImagePackSettings: { + var packSet = packSettingsComponent.createObject(timelineRoot, { + "packlist": packlist + }); + packSet.show(); + } } Connections { @@ -116,6 +147,31 @@ Page { } } + Connections { + target: TimelineManager + onOpenRoomMembersDialog: { + var membersDialog = roomMembersComponent.createObject(timelineRoot, { + "members": members, + "roomName": Rooms.currentRoom.roomName + }); + membersDialog.show(); + } + onOpenRoomSettingsDialog: { + var roomSettings = roomSettingsComponent.createObject(timelineRoot, { + "roomSettings": settings + }); + roomSettings.show(); + } + onOpenInviteUsersDialog: { + var dialog = inviteDialog.createObject(timelineRoot, { + "roomId": Rooms.currentRoom.roomId, + "plainRoomName": Rooms.currentRoom.plainRoomName, + "invitees": invitees + }); + dialog.show(); + } + } + ChatPage { anchors.fill: parent } diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml
index 58e367a0..755ab503 100644 --- a/resources/qml/TimelineRow.qml +++ b/resources/qml/TimelineRow.qml
@@ -40,6 +40,7 @@ Item { required property int trustlevel required property var timestamp required property int status + required property int relatedEventCacheBuster anchors.left: parent.left anchors.right: parent.right @@ -86,29 +87,30 @@ Item { // fancy reply, if this is a reply Reply { function fromModel(role) { - return replyTo != "" ? room.dataById(replyTo, role) : null; + return replyTo != "" ? room.dataById(replyTo, role, r.eventId) : null; } visible: replyTo - userColor: TimelineManager.userColor(userId, Nheko.colors.base) - blurhash: fromModel(Room.Blurhash) ?? "" - body: fromModel(Room.Body) ?? "" - formattedBody: fromModel(Room.FormattedBody) ?? "" + userColor: r.relatedEventCacheBuster, TimelineManager.userColor(userId, Nheko.colors.base) + blurhash: r.relatedEventCacheBuster, fromModel(Room.Blurhash) ?? "" + body: r.relatedEventCacheBuster, fromModel(Room.Body) ?? "" + formattedBody: r.relatedEventCacheBuster, fromModel(Room.FormattedBody) ?? "" eventId: fromModel(Room.EventId) ?? "" - filename: fromModel(Room.Filename) ?? "" - filesize: fromModel(Room.Filesize) ?? "" - proportionalHeight: fromModel(Room.ProportionalHeight) ?? 1 - type: fromModel(Room.Type) ?? MtxEvent.UnknownMessage - typeString: fromModel(Room.TypeString) ?? "" - url: fromModel(Room.Url) ?? "" - originalWidth: fromModel(Room.OriginalWidth) ?? 0 - isOnlyEmoji: fromModel(Room.IsOnlyEmoji) ?? false - userId: fromModel(Room.UserId) ?? "" - userName: fromModel(Room.UserName) ?? "" - thumbnailUrl: fromModel(Room.ThumbnailUrl) ?? "" - roomTopic: fromModel(Room.RoomTopic) ?? "" - roomName: fromModel(Room.RoomName) ?? "" - callType: fromModel(Room.CallType) ?? "" + filename: r.relatedEventCacheBuster, fromModel(Room.Filename) ?? "" + filesize: r.relatedEventCacheBuster, fromModel(Room.Filesize) ?? "" + proportionalHeight: r.relatedEventCacheBuster, fromModel(Room.ProportionalHeight) ?? 1 + type: r.relatedEventCacheBuster, fromModel(Room.Type) ?? MtxEvent.UnknownMessage + typeString: r.relatedEventCacheBuster, fromModel(Room.TypeString) ?? "" + url: r.relatedEventCacheBuster, fromModel(Room.Url) ?? "" + originalWidth: r.relatedEventCacheBuster, fromModel(Room.OriginalWidth) ?? 0 + isOnlyEmoji: r.relatedEventCacheBuster, fromModel(Room.IsOnlyEmoji) ?? false + userId: r.relatedEventCacheBuster, fromModel(Room.UserId) ?? "" + userName: r.relatedEventCacheBuster, fromModel(Room.UserName) ?? "" + thumbnailUrl: r.relatedEventCacheBuster, fromModel(Room.ThumbnailUrl) ?? "" + roomTopic: r.relatedEventCacheBuster, fromModel(Room.RoomTopic) ?? "" + roomName: r.relatedEventCacheBuster, fromModel(Room.RoomName) ?? "" + callType: r.relatedEventCacheBuster, fromModel(Room.CallType) ?? "" + relatedEventCacheBuster: r.relatedEventCacheBuster, fromModel(Room.RelatedEventCacheBuster) ?? 0 } // actual message content @@ -134,6 +136,7 @@ Item { roomTopic: r.roomTopic roomName: r.roomName callType: r.callType + relatedEventCacheBuster: r.relatedEventCacheBuster isReply: false } diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml
index 148a5817..c5cc69a6 100644 --- a/resources/qml/TimelineView.qml +++ b/resources/qml/TimelineView.qml
@@ -246,17 +246,7 @@ Item { NhekoDropArea { anchors.fill: parent - roomid: room ? room.roomId() : "" - } - - Connections { - target: room - onOpenRoomSettingsDialog: { - var roomSettings = roomSettingsComponent.createObject(timelineRoot, { - "roomSettings": settings - }); - roomSettings.show(); - } + roomid: room ? room.roomId : "" } } diff --git a/resources/qml/TopBar.qml b/resources/qml/TopBar.qml
index 58aba0c7..8543d02a 100644 --- a/resources/qml/TopBar.qml +++ b/resources/qml/TopBar.qml
@@ -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) } } diff --git a/resources/qml/delegates/MessageDelegate.qml b/resources/qml/delegates/MessageDelegate.qml
index 0b060629..a98c2a8b 100644 --- a/resources/qml/delegates/MessageDelegate.qml +++ b/resources/qml/delegates/MessageDelegate.qml
@@ -29,6 +29,7 @@ Item { required property string roomTopic required property string roomName required property string callType + required property int relatedEventCacheBuster height: chooser.childrenRect.height @@ -231,7 +232,7 @@ Item { body: formatted isOnlyEmoji: false isReply: d.isReply - formatted: qsTr("%1 created and configured room: %2").arg(d.userName).arg(room.roomId()) + formatted: qsTr("%1 created and configured room: %2").arg(d.userName).arg(room.roomId) } } @@ -301,7 +302,7 @@ Item { body: formatted isOnlyEmoji: false isReply: d.isReply - formatted: room.formatPowerLevelEvent(d.eventId) + formatted: d.relatedEventCacheBuster, room.formatPowerLevelEvent(d.eventId) } } @@ -313,7 +314,7 @@ Item { body: formatted isOnlyEmoji: false isReply: d.isReply - formatted: room.formatJoinRuleEvent(d.eventId) + formatted: d.relatedEventCacheBuster, room.formatJoinRuleEvent(d.eventId) } } @@ -325,7 +326,7 @@ Item { body: formatted isOnlyEmoji: false isReply: d.isReply - formatted: room.formatHistoryVisibilityEvent(d.eventId) + formatted: d.relatedEventCacheBuster, room.formatHistoryVisibilityEvent(d.eventId) } } @@ -337,7 +338,7 @@ Item { body: formatted isOnlyEmoji: false isReply: d.isReply - formatted: room.formatGuestAccessEvent(d.eventId) + formatted: d.relatedEventCacheBuster, room.formatGuestAccessEvent(d.eventId) } } @@ -349,7 +350,7 @@ Item { body: formatted isOnlyEmoji: false isReply: d.isReply - formatted: room.formatMemberEvent(d.eventId) + formatted: d.relatedEventCacheBuster, room.formatMemberEvent(d.eventId) } } diff --git a/resources/qml/delegates/Reply.qml b/resources/qml/delegates/Reply.qml
index 3a188d78..75e3d617 100644 --- a/resources/qml/delegates/Reply.qml +++ b/resources/qml/delegates/Reply.qml
@@ -30,6 +30,7 @@ Item { property string roomTopic property string roomName property string callType + property int relatedEventCacheBuster width: parent.width height: replyContainer.height @@ -95,6 +96,7 @@ Item { roomTopic: r.roomTopic roomName: r.roomName callType: r.callType + relatedEventCacheBuster: r.relatedEventCacheBuster enabled: false width: parent.width isReply: true diff --git a/resources/qml/dialogs/ImagePackSettingsDialog.qml b/resources/qml/dialogs/ImagePackSettingsDialog.qml new file mode 100644
index 00000000..c4b4a885 --- /dev/null +++ b/resources/qml/dialogs/ImagePackSettingsDialog.qml
@@ -0,0 +1,309 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +import ".." +import "../components" +import QtQuick 2.12 +import QtQuick.Controls 2.12 +import QtQuick.Layouts 1.12 +import im.nheko 1.0 + +ApplicationWindow { + id: win + + property ImagePackListModel packlist + property int avatarSize: Math.ceil(fontMetrics.lineSpacing * 2.3) + property SingleImagePackModel currentPack: packlist.packAt(currentPackIndex) + property int currentPackIndex: 0 + readonly property int stickerDim: 128 + readonly property int stickerDimPad: 128 + Nheko.paddingSmall + + title: qsTr("Image pack settings") + x: MainWindow.x + (MainWindow.width / 2) - (width / 2) + y: MainWindow.y + (MainWindow.height / 2) - (height / 2) + height: 400 + width: 600 + palette: Nheko.colors + color: Nheko.colors.base + modality: Qt.NonModal + flags: Qt.Dialog + + AdaptiveLayout { + id: adaptiveView + + anchors.fill: parent + singlePageMode: false + pageIndex: 0 + + AdaptiveLayoutElement { + id: packlistC + + visible: Settings.groupView + minimumWidth: 200 + collapsedWidth: 200 + preferredWidth: 300 + maximumWidth: 300 + + ListView { + model: packlist + clip: true + + ScrollHelper { + flickable: parent + anchors.fill: parent + enabled: !Settings.mobileMode + } + + delegate: Rectangle { + id: packItem + + property color background: Nheko.colors.window + property color importantText: Nheko.colors.text + property color unimportantText: Nheko.colors.buttonText + property color bubbleBackground: Nheko.colors.highlight + property color bubbleText: Nheko.colors.highlightedText + required property string displayName + required property string avatarUrl + required property bool fromAccountData + required property bool fromCurrentRoom + required property int index + + color: background + height: avatarSize + 2 * Nheko.paddingMedium + width: ListView.view.width + state: "normal" + states: [ + State { + name: "highlight" + when: hovered.hovered && !(index == currentPackIndex) + + PropertyChanges { + target: packItem + background: Nheko.colors.dark + importantText: Nheko.colors.brightText + unimportantText: Nheko.colors.brightText + bubbleBackground: Nheko.colors.highlight + bubbleText: Nheko.colors.highlightedText + } + + }, + State { + name: "selected" + when: index == currentPackIndex + + PropertyChanges { + target: packItem + background: Nheko.colors.highlight + importantText: Nheko.colors.highlightedText + unimportantText: Nheko.colors.highlightedText + bubbleBackground: Nheko.colors.highlightedText + bubbleText: Nheko.colors.highlight + } + + } + ] + + TapHandler { + margin: -Nheko.paddingSmall + onSingleTapped: currentPackIndex = index + } + + HoverHandler { + id: hovered + } + + RowLayout { + spacing: Nheko.paddingMedium + anchors.fill: parent + anchors.margins: Nheko.paddingMedium + + Avatar { + // In the future we could show an online indicator by setting the userid for the avatar + //userid: Nheko.currentUser.userid + + id: avatar + + enabled: false + Layout.alignment: Qt.AlignVCenter + height: avatarSize + width: avatarSize + url: avatarUrl.replace("mxc://", "image://MxcImage/") + displayName: packItem.displayName + } + + ColumnLayout { + id: textContent + + Layout.alignment: Qt.AlignLeft + Layout.fillWidth: true + Layout.minimumWidth: 100 + width: parent.width - avatar.width + Layout.preferredWidth: parent.width - avatar.width + spacing: Nheko.paddingSmall + + RowLayout { + Layout.fillWidth: true + spacing: 0 + + ElidedLabel { + Layout.alignment: Qt.AlignBottom + color: packItem.importantText + elideWidth: textContent.width - Nheko.paddingMedium + fullText: displayName + textFormat: Text.PlainText + } + + Item { + Layout.fillWidth: true + } + + } + + RowLayout { + Layout.fillWidth: true + spacing: 0 + + ElidedLabel { + color: packItem.unimportantText + font.pixelSize: fontMetrics.font.pixelSize * 0.9 + elideWidth: textContent.width - Nheko.paddingSmall + fullText: { + if (fromAccountData) + return qsTr("Private pack"); + else if (fromCurrentRoom) + return qsTr("Pack from this room"); + else + return qsTr("Globally enabled pack"); + } + textFormat: Text.PlainText + } + + Item { + Layout.fillWidth: true + } + + } + + } + + } + + } + + } + + } + + AdaptiveLayoutElement { + id: packinfoC + + Rectangle { + color: Nheko.colors.window + + ColumnLayout { + id: packinfo + + property string packName: currentPack ? currentPack.packname : "" + property string avatarUrl: currentPack ? currentPack.avatarUrl : "" + + anchors.fill: parent + anchors.margins: Nheko.paddingLarge + spacing: Nheko.paddingLarge + + Avatar { + url: packinfo.avatarUrl.replace("mxc://", "image://MxcImage/") + displayName: packinfo.packName + height: 100 + width: 100 + Layout.alignment: Qt.AlignHCenter + enabled: false + } + + MatrixText { + text: packinfo.packName + font.pixelSize: 24 + Layout.alignment: Qt.AlignHCenter + } + + GridLayout { + Layout.alignment: Qt.AlignHCenter + visible: currentPack && currentPack.roomid != "" + columns: 2 + rowSpacing: Nheko.paddingMedium + + MatrixText { + text: qsTr("Enable globally") + } + + ToggleButton { + ToolTip.text: qsTr("Enables this pack to be used in all rooms") + checked: currentPack ? currentPack.isGloballyEnabled : false + onClicked: currentPack.isGloballyEnabled = !currentPack.isGloballyEnabled + Layout.alignment: Qt.AlignRight + } + + } + + GridView { + Layout.fillHeight: true + Layout.fillWidth: true + model: currentPack + cellWidth: stickerDimPad + cellHeight: stickerDimPad + boundsBehavior: Flickable.StopAtBounds + clip: true + currentIndex: -1 // prevent sorting from stealing focus + cacheBuffer: 500 + + ScrollHelper { + flickable: parent + anchors.fill: parent + enabled: !Settings.mobileMode + } + + // Individual emoji + delegate: AbstractButton { + width: stickerDim + height: stickerDim + hoverEnabled: true + ToolTip.text: ":" + model.shortcode + ": - " + model.body + ToolTip.visible: hovered + + contentItem: Image { + height: stickerDim + width: stickerDim + source: model.url.replace("mxc://", "image://MxcImage/") + fillMode: Image.PreserveAspectFit + } + + background: Rectangle { + anchors.fill: parent + color: hovered ? Nheko.colors.highlight : 'transparent' + radius: 5 + } + + } + + } + + } + + } + + } + + } + + footer: DialogButtonBox { + id: buttons + + Button { + text: qsTr("Close") + DialogButtonBox.buttonRole: DialogButtonBox.AcceptRole + onClicked: win.close() + } + + } + +} diff --git a/resources/qml/emoji/EmojiButton.qml b/resources/qml/emoji/EmojiButton.qml deleted file mode 100644
index 5f4d23d3..00000000 --- a/resources/qml/emoji/EmojiButton.qml +++ /dev/null
@@ -1,23 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -import "../" -import QtQuick 2.10 -import QtQuick.Controls 2.1 -import im.nheko 1.0 -import im.nheko.EmojiModel 1.0 - -ImageButton { - id: emojiButton - - property var colors: currentActivePalette - property var emojiPicker - property string event_id - - image: ":/icons/icons/ui/smile.png" - onClicked: emojiPicker.visible ? emojiPicker.close() : emojiPicker.show(emojiButton, function(emoji) { - room.input.reaction(event_id, emoji); - TimelineManager.focusMessageInput(); - }) -} diff --git a/resources/qml/emoji/EmojiPicker.qml b/resources/qml/emoji/EmojiPicker.qml
index 6f10a230..354e340c 100644 --- a/resources/qml/emoji/EmojiPicker.qml +++ b/resources/qml/emoji/EmojiPicker.qml
@@ -130,6 +130,7 @@ Menu { boundsBehavior: Flickable.StopAtBounds clip: true currentIndex: -1 // prevent sorting from stealing focus + cacheBuffer: 500 // Individual emoji delegate: AbstractButton { diff --git a/resources/qml/emoji/StickerPicker.qml b/resources/qml/emoji/StickerPicker.qml new file mode 100644
index 00000000..3731a948 --- /dev/null +++ b/resources/qml/emoji/StickerPicker.qml
@@ -0,0 +1,180 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +import "../" +import QtGraphicalEffects 1.0 +import QtQuick 2.9 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.3 +import im.nheko 1.0 +import im.nheko.EmojiModel 1.0 + +Menu { + id: stickerPopup + + property var callback + property var colors + property string roomid + property alias model: gridView.model + property var textArea + property real highlightHue: Nheko.colors.highlight.hslHue + property real highlightSat: Nheko.colors.highlight.hslSaturation + property real highlightLight: Nheko.colors.highlight.hslLightness + readonly property int stickerDim: 128 + readonly property int stickerDimPad: 128 + Nheko.paddingSmall + readonly property int stickersPerRow: 3 + + function show(showAt, roomid_, callback) { + console.debug("Showing sticker picker"); + roomid = roomid_; + stickerPopup.callback = callback; + popup(showAt ? showAt : null); + } + + margins: 0 + bottomPadding: 1 + leftPadding: 1 + rightPadding: 1 + modal: true + focus: true + closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside + width: stickersPerRow * stickerDimPad + 20 + + Rectangle { + color: Nheko.colors.window + height: columnView.implicitHeight + 4 + width: stickersPerRow * stickerDimPad + 20 + + ColumnLayout { + id: columnView + + spacing: 0 + anchors.leftMargin: 3 + anchors.rightMargin: 3 + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: 2 + + // Search field + TextField { + id: emojiSearch + + Layout.topMargin: 3 + Layout.preferredWidth: stickersPerRow * stickerDimPad + 20 - 6 + palette: Nheko.colors + background: null + placeholderTextColor: Nheko.colors.buttonText + color: Nheko.colors.text + placeholderText: qsTr("Search") + selectByMouse: true + rightPadding: clearSearch.width + onTextChanged: searchTimer.restart() + onVisibleChanged: { + if (visible) + forceActiveFocus(); + + } + + Timer { + id: searchTimer + + interval: 350 // tweak as needed? + onTriggered: stickerPopup.model.searchString = emojiSearch.text + } + + ToolButton { + id: clearSearch + + visible: emojiSearch.text !== '' + icon.source: "image://colorimage/:/icons/icons/ui/round-remove-button.png?" + (clearSearch.hovered ? Nheko.colors.highlight : Nheko.colors.buttonText) + focusPolicy: Qt.NoFocus + onClicked: emojiSearch.clear() + hoverEnabled: true + background: null + + anchors { + verticalCenter: parent.verticalCenter + right: parent.right + } + // clear the default hover effects. + + Image { + height: parent.height - 2 * Nheko.paddingSmall + width: height + source: "image://colorimage/:/icons/icons/ui/round-remove-button.png?" + (clearSearch.hovered ? Nheko.colors.highlight : Nheko.colors.buttonText) + + anchors { + verticalCenter: parent.verticalCenter + right: parent.right + margins: Nheko.paddingSmall + } + + } + + } + + } + + // emoji grid + GridView { + id: gridView + + model: roomid ? TimelineManager.completerFor("stickers", roomid) : null + Layout.preferredHeight: cellHeight * 3.5 + Layout.preferredWidth: stickersPerRow * stickerDimPad + 20 + Layout.leftMargin: 4 + cellWidth: stickerDimPad + cellHeight: stickerDimPad + boundsBehavior: Flickable.StopAtBounds + clip: true + currentIndex: -1 // prevent sorting from stealing focus + cacheBuffer: 500 + + ScrollHelper { + flickable: parent + anchors.fill: parent + enabled: !Settings.mobileMode + } + + // Individual emoji + delegate: AbstractButton { + width: stickerDim + height: stickerDim + hoverEnabled: true + ToolTip.text: ":" + model.shortcode + ": - " + model.body + ToolTip.visible: hovered + // TODO: maybe add favorites at some point? + onClicked: { + console.debug("Picked " + model.shortcode); + stickerPopup.close(); + callback(model.originalRow); + } + + contentItem: Image { + height: stickerDim + width: stickerDim + source: model.url.replace("mxc://", "image://MxcImage/") + fillMode: Image.PreserveAspectFit + } + + background: Rectangle { + anchors.fill: parent + color: hovered ? Nheko.colors.highlight : 'transparent' + radius: 5 + } + + } + + ScrollBar.vertical: ScrollBar { + id: emojiScroll + } + + } + + } + + } + +} diff --git a/resources/qml/voip/PlaceCall.qml b/resources/qml/voip/PlaceCall.qml
index 5f564853..97932cc9 100644 --- a/resources/qml/voip/PlaceCall.qml +++ b/resources/qml/voip/PlaceCall.qml
@@ -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(); } } diff --git a/resources/qml/voip/ScreenShare.qml b/resources/qml/voip/ScreenShare.qml
index a10057b2..8cd43b1c 100644 --- a/resources/qml/voip/ScreenShare.qml +++ b/resources/qml/voip/ScreenShare.qml
@@ -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(); } } diff --git a/resources/res.qrc b/resources/res.qrc
index f41835f9..5d37c397 100644 --- a/resources/res.qrc +++ b/resources/res.qrc
@@ -9,7 +9,6 @@ <file>icons/ui/do-not-disturb-rounded-sign@2x.png</file> <file>icons/ui/round-remove-button.png</file> <file>icons/ui/round-remove-button@2x.png</file> - <file>icons/ui/double-tick-indicator.png</file> <file>icons/ui/double-tick-indicator@2x.png</file> <file>icons/ui/lock.png</file> @@ -26,6 +25,7 @@ <file>icons/ui/search@2x.png</file> <file>icons/ui/settings.png</file> <file>icons/ui/settings@2x.png</file> + <file>icons/ui/sticky-note-solid.svg</file> <file>icons/ui/smile.png</file> <file>icons/ui/smile@2x.png</file> <file>icons/ui/speech-bubbles-comment-option.png</file> @@ -54,22 +54,17 @@ <file>icons/ui/pause-symbol@2x.png</file> <file>icons/ui/remove-symbol.png</file> <file>icons/ui/remove-symbol@2x.png</file> - <file>icons/ui/world.png</file> <file>icons/ui/world@2x.png</file> - <file>icons/ui/tag.png</file> <file>icons/ui/tag@2x.png</file> <file>icons/ui/star.png</file> <file>icons/ui/star@2x.png</file> <file>icons/ui/lowprio.png</file> <file>icons/ui/lowprio@2x.png</file> - <file>icons/ui/edit.png</file> <file>icons/ui/edit@2x.png</file> - <file>icons/ui/mail-reply.png</file> - <file>icons/ui/place-call.png</file> <file>icons/ui/end-call.png</file> <file>icons/ui/microphone-mute.png</file> @@ -77,7 +72,6 @@ <file>icons/ui/screen-share.png</file> <file>icons/ui/toggle-camera-view.png</file> <file>icons/ui/video-call.png</file> - <file>icons/emoji-categories/people.png</file> <file>icons/emoji-categories/people@2x.png</file> <file>icons/emoji-categories/nature.png</file> @@ -98,16 +92,12 @@ <qresource prefix="/logos"> <file>nheko.png</file> <file>nheko.svg</file> - <file>splash.png</file> <file>splash@2x.png</file> - <file>register.png</file> <file>register@2x.png</file> - <file>login.png</file> <file>login@2x.png</file> - <file>nheko-512.png</file> <file>nheko-256.png</file> <file>nheko-128.png</file> @@ -150,8 +140,8 @@ <file>qml/ForwardCompleter.qml</file> <file>qml/TypingIndicator.qml</file> <file>qml/RoomSettings.qml</file> - <file>qml/emoji/EmojiButton.qml</file> <file>qml/emoji/EmojiPicker.qml</file> + <file>qml/emoji/StickerPicker.qml</file> <file>qml/UserProfile.qml</file> <file>qml/delegates/MessageDelegate.qml</file> <file>qml/delegates/TextMessage.qml</file> @@ -170,6 +160,7 @@ <file>qml/device-verification/Failed.qml</file> <file>qml/device-verification/Success.qml</file> <file>qml/dialogs/InputDialog.qml</file> + <file>qml/dialogs/ImagePackSettingsDialog.qml</file> <file>qml/ui/Ripple.qml</file> <file>qml/ui/Spinner.qml</file> <file>qml/ui/animations/BlinkAnimation.qml</file> @@ -184,6 +175,8 @@ <file>qml/components/AdaptiveLayout.qml</file> <file>qml/components/AdaptiveLayoutElement.qml</file> <file>qml/components/FlatButton.qml</file> + <file>qml/RoomMembers.qml</file> + <file>qml/InviteDialog.qml</file> </qresource> <qresource prefix="/media"> <file>media/ring.ogg</file> diff --git a/src/Cache.cpp b/src/Cache.cpp
index 9304db0e..d651b182 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp
@@ -78,6 +78,8 @@ constexpr auto ENCRYPTED_ROOMS_DB("encrypted_rooms"); constexpr auto INBOUND_MEGOLM_SESSIONS_DB("inbound_megolm_sessions"); //! MegolmSessionIndex -> pickled OlmOutboundGroupSession constexpr auto OUTBOUND_MEGOLM_SESSIONS_DB("outbound_megolm_sessions"); +//! MegolmSessionIndex -> session data about which devices have access to this +constexpr auto MEGOLM_SESSIONS_DATA_DB("megolm_sessions_data_db"); using CachedReceipts = std::multimap<uint64_t, std::string, std::greater<uint64_t>>; using Receipts = std::map<std::string, std::map<std::string, uint64_t>>; @@ -284,6 +286,7 @@ Cache::setup() // Session management inboundMegolmSessionDb_ = lmdb::dbi::open(txn, INBOUND_MEGOLM_SESSIONS_DB, MDB_CREATE); outboundMegolmSessionDb_ = lmdb::dbi::open(txn, OUTBOUND_MEGOLM_SESSIONS_DB, MDB_CREATE); + megolmSessionDataDb_ = lmdb::dbi::open(txn, MEGOLM_SESSIONS_DATA_DB, MDB_CREATE); txn.commit(); @@ -387,9 +390,14 @@ Cache::importSessionKeys(const mtx::crypto::ExportedSessionKeys &keys) index.session_id = s.session_id; index.sender_key = s.sender_key; + GroupSessionData data{}; + data.forwarding_curve25519_key_chain = s.forwarding_curve25519_key_chain; + if (s.sender_claimed_keys.count("ed25519")) + data.sender_claimed_ed25519_key = s.sender_claimed_keys.at("ed25519"); + auto exported_session = mtx::crypto::import_session(s.session_key); - saveInboundMegolmSession(index, std::move(exported_session)); + saveInboundMegolmSession(index, std::move(exported_session), data); ChatPage::instance()->receivedSessionKey(index.room_id, index.session_id); } } @@ -400,7 +408,8 @@ Cache::importSessionKeys(const mtx::crypto::ExportedSessionKeys &keys) void Cache::saveInboundMegolmSession(const MegolmSessionIndex &index, - mtx::crypto::InboundGroupSessionPtr session) + mtx::crypto::InboundGroupSessionPtr session, + const GroupSessionData &data) { using namespace mtx::crypto; const auto key = json(index).dump(); @@ -420,6 +429,7 @@ Cache::saveInboundMegolmSession(const MegolmSessionIndex &index, } inboundMegolmSessionDb_.put(txn, key, pickled); + megolmSessionDataDb_.put(txn, key, json(data).dump()); txn.commit(); } @@ -464,7 +474,7 @@ Cache::inboundMegolmSessionExists(const MegolmSessionIndex &index) void Cache::updateOutboundMegolmSession(const std::string &room_id, - const OutboundGroupSessionData &data_, + const GroupSessionData &data_, mtx::crypto::OutboundGroupSessionPtr &ptr) { using namespace mtx::crypto; @@ -472,18 +482,20 @@ Cache::updateOutboundMegolmSession(const std::string &room_id, if (!outboundMegolmSessionExists(room_id)) return; - OutboundGroupSessionData data = data_; - data.message_index = olm_outbound_group_session_message_index(ptr.get()); - data.session_id = mtx::crypto::session_id(ptr.get()); - data.session_key = mtx::crypto::session_key(ptr.get()); + GroupSessionData data = data_; + data.message_index = olm_outbound_group_session_message_index(ptr.get()); + MegolmSessionIndex index; + index.room_id = room_id; + index.sender_key = olm::client()->identity_keys().ed25519; + index.session_id = mtx::crypto::session_id(ptr.get()); // Save the updated pickled data for the session. json j; - j["data"] = data; j["session"] = pickle<OutboundSessionObject>(ptr.get(), SECRET); auto txn = lmdb::txn::begin(env_); outboundMegolmSessionDb_.put(txn, room_id, j.dump()); + megolmSessionDataDb_.put(txn, json(index).dump(), json(data).dump()); txn.commit(); } @@ -498,24 +510,32 @@ Cache::dropOutboundMegolmSession(const std::string &room_id) { auto txn = lmdb::txn::begin(env_); outboundMegolmSessionDb_.del(txn, room_id); + // don't delete session data, so that we can still share the session. txn.commit(); } } void Cache::saveOutboundMegolmSession(const std::string &room_id, - const OutboundGroupSessionData &data, + const GroupSessionData &data_, mtx::crypto::OutboundGroupSessionPtr &session) { using namespace mtx::crypto; const auto pickled = pickle<OutboundSessionObject>(session.get(), SECRET); + GroupSessionData data = data_; + data.message_index = olm_outbound_group_session_message_index(session.get()); + MegolmSessionIndex index; + index.room_id = room_id; + index.sender_key = olm::client()->identity_keys().ed25519; + index.session_id = mtx::crypto::session_id(session.get()); + json j; - j["data"] = data; j["session"] = pickled; auto txn = lmdb::txn::begin(env_); outboundMegolmSessionDb_.put(txn, room_id, j.dump()); + megolmSessionDataDb_.put(txn, json(index).dump(), json(data).dump()); txn.commit(); } @@ -544,8 +564,17 @@ Cache::getOutboundMegolmSession(const std::string &room_id) auto obj = json::parse(value); OutboundGroupSessionDataRef ref{}; - ref.data = obj.at("data").get<OutboundGroupSessionData>(); ref.session = unpickle<OutboundSessionObject>(obj.at("session"), SECRET); + + MegolmSessionIndex index; + index.room_id = room_id; + index.sender_key = olm::client()->identity_keys().ed25519; + index.session_id = mtx::crypto::session_id(ref.session.get()); + + if (megolmSessionDataDb_.get(txn, json(index).dump(), value)) { + ref.data = nlohmann::json::parse(value).get<GroupSessionData>(); + } + return ref; } catch (std::exception &e) { nhlog::db()->error("Failed to retrieve outbound Megolm Session: {}", e.what()); @@ -553,6 +582,25 @@ Cache::getOutboundMegolmSession(const std::string &room_id) } } +std::optional<GroupSessionData> +Cache::getMegolmSessionData(const MegolmSessionIndex &index) +{ + try { + using namespace mtx::crypto; + + auto txn = ro_txn(env_); + + std::string_view value; + if (megolmSessionDataDb_.get(txn, json(index).dump(), value)) { + return nlohmann::json::parse(value).get<GroupSessionData>(); + } + + return std::nullopt; + } catch (std::exception &e) { + nhlog::db()->error("Failed to retrieve Megolm Session Data: {}", e.what()); + return std::nullopt; + } +} // // OLM sessions. // @@ -829,6 +877,7 @@ Cache::deleteData() lmdb::dbi_close(env_, inboundMegolmSessionDb_); lmdb::dbi_close(env_, outboundMegolmSessionDb_); + lmdb::dbi_close(env_, megolmSessionDataDb_); env_.close(); @@ -3333,6 +3382,86 @@ Cache::getChildRoomIds(const std::string &room_id) return roomids; } +std::vector<ImagePackInfo> +Cache::getImagePacks(const std::string &room_id, std::optional<bool> stickers) +{ + auto txn = ro_txn(env_); + std::vector<ImagePackInfo> infos; + + auto addPack = [&infos, stickers](const mtx::events::msc2545::ImagePack &pack, + const std::string &source_room, + const std::string &state_key) { + if (!pack.pack || !stickers.has_value() || + (stickers.value() ? pack.pack->is_sticker() : pack.pack->is_emoji())) { + ImagePackInfo info; + info.source_room = source_room; + info.state_key = state_key; + info.pack.pack = pack.pack; + + for (const auto &img : pack.images) { + if (img.second.overrides_usage() && + (stickers ? !img.second.is_sticker() : !img.second.is_emoji())) + continue; + + info.pack.images.insert(img); + } + + if (!info.pack.images.empty()) + infos.push_back(std::move(info)); + } + }; + + // packs from account data + if (auto accountpack = + getAccountData(txn, mtx::events::EventType::ImagePackInAccountData, "")) { + auto tmp = + std::get_if<mtx::events::EphemeralEvent<mtx::events::msc2545::ImagePack>>( + &*accountpack); + if (tmp) + addPack(tmp->content, "", ""); + } + + // packs from rooms, that were enabled globally + if (auto roomPacks = getAccountData(txn, mtx::events::EventType::ImagePackRooms, "")) { + auto tmp = + std::get_if<mtx::events::EphemeralEvent<mtx::events::msc2545::ImagePackRooms>>( + &*roomPacks); + if (tmp) { + for (const auto &[room_id2, state_to_d] : tmp->content.rooms) { + // don't add stickers from this room twice + if (room_id2 == room_id) + continue; + + for (const auto &[state_id, d] : state_to_d) { + (void)d; + if (auto pack = + getStateEvent<mtx::events::msc2545::ImagePack>( + txn, room_id2, state_id)) + addPack(pack->content, room_id2, state_id); + } + } + } + } + + // packs from current room + if (auto pack = getStateEvent<mtx::events::msc2545::ImagePack>(txn, room_id)) { + addPack(pack->content, room_id, ""); + } + for (const auto &pack : + getStateEventsWithType<mtx::events::msc2545::ImagePack>(txn, room_id)) { + addPack(pack.content, room_id, pack.state_key); + } + + return infos; +} + +std::optional<mtx::events::collections::RoomAccountDataEvents> +Cache::getAccountData(mtx::events::EventType type, const std::string &room_id) +{ + auto txn = ro_txn(env_); + return getAccountData(txn, type, room_id); +} + std::optional<mtx::events::collections::RoomAccountDataEvents> Cache::getAccountData(lmdb::txn &txn, mtx::events::EventType type, const std::string &room_id) { @@ -3525,6 +3654,7 @@ to_json(json &j, const UserKeyCache &info) { j["device_keys"] = info.device_keys; j["seen_device_keys"] = info.seen_device_keys; + j["seen_device_ids"] = info.seen_device_ids; j["master_keys"] = info.master_keys; j["master_key_changed"] = info.master_key_changed; j["user_signing_keys"] = info.user_signing_keys; @@ -3538,6 +3668,7 @@ from_json(const json &j, UserKeyCache &info) { info.device_keys = j.value("device_keys", std::map<std::string, mtx::crypto::DeviceKeys>{}); info.seen_device_keys = j.value("seen_device_keys", std::set<std::string>{}); + info.seen_device_ids = j.value("seen_device_ids", std::set<std::string>{}); info.master_keys = j.value("master_keys", mtx::crypto::CrossSigningKeys{}); info.master_key_changed = j.value("master_key_changed", false); info.user_signing_keys = j.value("user_signing_keys", mtx::crypto::CrossSigningKeys{}); @@ -3634,6 +3765,15 @@ Cache::updateUserKeys(const std::string &sync_token, const mtx::responses::Query keyReused = true; break; } + if (updateToWrite.seen_device_ids.count( + device_id)) { + nhlog::crypto()->warn( + "device_id '{}' reused by ({})", + device_id, + user); + keyReused = true; + break; + } } if (!keyReused && !oldDeviceKeys.count(device_id)) @@ -3644,6 +3784,7 @@ Cache::updateUserKeys(const std::string &sync_token, const mtx::responses::Query (void)key_id; updateToWrite.seen_device_keys.insert(key); } + updateToWrite.seen_device_ids.insert(device_id); } } db.put(txn, user, json(updateToWrite).dump()); @@ -4077,17 +4218,15 @@ from_json(const json &j, MemberInfo &info) } void -to_json(nlohmann::json &obj, const DeviceAndMasterKeys &msg) +to_json(nlohmann::json &obj, const DeviceKeysToMsgIndex &msg) { - obj["devices"] = msg.devices; - obj["master_keys"] = msg.master_keys; + obj["deviceids"] = msg.deviceids; } void -from_json(const nlohmann::json &obj, DeviceAndMasterKeys &msg) +from_json(const nlohmann::json &obj, DeviceKeysToMsgIndex &msg) { - msg.devices = obj.at("devices").get<decltype(msg.devices)>(); - msg.master_keys = obj.at("master_keys").get<decltype(msg.master_keys)>(); + msg.deviceids = obj.at("deviceids").get<decltype(msg.deviceids)>(); } void @@ -4099,30 +4238,31 @@ to_json(nlohmann::json &obj, const SharedWithUsers &msg) void from_json(const nlohmann::json &obj, SharedWithUsers &msg) { - msg.keys = obj.at("keys").get<std::map<std::string, DeviceAndMasterKeys>>(); + msg.keys = obj.at("keys").get<std::map<std::string, DeviceKeysToMsgIndex>>(); } void -to_json(nlohmann::json &obj, const OutboundGroupSessionData &msg) +to_json(nlohmann::json &obj, const GroupSessionData &msg) { - obj["session_id"] = msg.session_id; - obj["session_key"] = msg.session_key; obj["message_index"] = msg.message_index; obj["ts"] = msg.timestamp; - obj["initially"] = msg.initially; + obj["sender_claimed_ed25519_key"] = msg.sender_claimed_ed25519_key; + obj["forwarding_curve25519_key_chain"] = msg.forwarding_curve25519_key_chain; + obj["currently"] = msg.currently; } void -from_json(const nlohmann::json &obj, OutboundGroupSessionData &msg) +from_json(const nlohmann::json &obj, GroupSessionData &msg) { - msg.session_id = obj.at("session_id"); - msg.session_key = obj.at("session_key"); msg.message_index = obj.at("message_index"); msg.timestamp = obj.value("ts", 0ULL); - msg.initially = obj.value("initially", SharedWithUsers{}); + msg.sender_claimed_ed25519_key = obj.value("sender_claimed_ed25519_key", ""); + msg.forwarding_curve25519_key_chain = + obj.value("forwarding_curve25519_key_chain", std::vector<std::string>{}); + msg.currently = obj.value("currently", SharedWithUsers{}); } @@ -4522,7 +4662,7 @@ isRoomMember(const std::string &user_id, const std::string &room_id) // void saveOutboundMegolmSession(const std::string &room_id, - const OutboundGroupSessionData &data, + const GroupSessionData &data, mtx::crypto::OutboundGroupSessionPtr &session) { instance_->saveOutboundMegolmSession(room_id, data, session); @@ -4539,7 +4679,7 @@ outboundMegolmSessionExists(const std::string &room_id) noexcept } void updateOutboundMegolmSession(const std::string &room_id, - const OutboundGroupSessionData &data, + const GroupSessionData &data, mtx::crypto::OutboundGroupSessionPtr &session) { instance_->updateOutboundMegolmSession(room_id, data, session); @@ -4566,9 +4706,10 @@ exportSessionKeys() // void saveInboundMegolmSession(const MegolmSessionIndex &index, - mtx::crypto::InboundGroupSessionPtr session) + mtx::crypto::InboundGroupSessionPtr session, + const GroupSessionData &data) { - instance_->saveInboundMegolmSession(index, std::move(session)); + instance_->saveInboundMegolmSession(index, std::move(session), data); } mtx::crypto::InboundGroupSessionPtr getInboundMegolmSession(const MegolmSessionIndex &index) @@ -4580,6 +4721,11 @@ inboundMegolmSessionExists(const MegolmSessionIndex &index) { return instance_->inboundMegolmSessionExists(index); } +std::optional<GroupSessionData> +getMegolmSessionData(const MegolmSessionIndex &index) +{ + return instance_->getMegolmSessionData(index); +} // // Olm Sessions diff --git a/src/Cache.h b/src/Cache.h
index b0520f6b..57a36d73 100644 --- a/src/Cache.h +++ b/src/Cache.h
@@ -200,7 +200,7 @@ isRoomMember(const std::string &user_id, const std::string &room_id); // void saveOutboundMegolmSession(const std::string &room_id, - const OutboundGroupSessionData &data, + const GroupSessionData &data, mtx::crypto::OutboundGroupSessionPtr &session); OutboundGroupSessionDataRef getOutboundMegolmSession(const std::string &room_id); @@ -208,7 +208,7 @@ bool outboundMegolmSessionExists(const std::string &room_id) noexcept; void updateOutboundMegolmSession(const std::string &room_id, - const OutboundGroupSessionData &data, + const GroupSessionData &data, mtx::crypto::OutboundGroupSessionPtr &session); void dropOutboundMegolmSession(const std::string &room_id); @@ -223,11 +223,14 @@ exportSessionKeys(); // void saveInboundMegolmSession(const MegolmSessionIndex &index, - mtx::crypto::InboundGroupSessionPtr session); + mtx::crypto::InboundGroupSessionPtr session, + const GroupSessionData &data); mtx::crypto::InboundGroupSessionPtr getInboundMegolmSession(const MegolmSessionIndex &index); bool inboundMegolmSessionExists(const MegolmSessionIndex &index); +std::optional<GroupSessionData> +getMegolmSessionData(const MegolmSessionIndex &index); // // Olm Sessions diff --git a/src/CacheCryptoStructs.h b/src/CacheCryptoStructs.h
index 07ca274e..409c9d67 100644 --- a/src/CacheCryptoStructs.h +++ b/src/CacheCryptoStructs.h
@@ -27,40 +27,43 @@ enum Trust Q_ENUM_NS(Trust) } -struct DeviceAndMasterKeys +struct DeviceKeysToMsgIndex { - // map from device id or master key id to message_index - std::map<std::string, uint64_t> devices, master_keys; + // map from device key to message_index + // Using the device id is safe because we check for reuse on device list updates + // Using the device id makes our logic much easier to read. + std::map<std::string, uint64_t> deviceids; }; struct SharedWithUsers { // userid to keys - std::map<std::string, DeviceAndMasterKeys> keys; + std::map<std::string, DeviceKeysToMsgIndex> keys; }; // Extra information associated with an outbound megolm session. -struct OutboundGroupSessionData +struct GroupSessionData { - std::string session_id; - std::string session_key; uint64_t message_index = 0; uint64_t timestamp = 0; + std::string sender_claimed_ed25519_key; + std::vector<std::string> forwarding_curve25519_key_chain; + // who has access to this session. // Rotate, when a user leaves the room and share, when a user gets added. - SharedWithUsers initially, currently; + SharedWithUsers currently; }; void -to_json(nlohmann::json &obj, const OutboundGroupSessionData &msg); +to_json(nlohmann::json &obj, const GroupSessionData &msg); void -from_json(const nlohmann::json &obj, OutboundGroupSessionData &msg); +from_json(const nlohmann::json &obj, GroupSessionData &msg); struct OutboundGroupSessionDataRef { mtx::crypto::OutboundGroupSessionPtr session; - OutboundGroupSessionData data; + GroupSessionData data; }; struct DevicePublicKeys @@ -134,6 +137,8 @@ struct UserKeyCache bool master_key_changed = false; //! Device keys that were already used at least once std::set<std::string> seen_device_keys; + //! Device ids that were already used at least once + std::set<std::string> seen_device_ids; }; void diff --git a/src/CacheStructs.h b/src/CacheStructs.h
index 28c70055..4a5c5c76 100644 --- a/src/CacheStructs.h +++ b/src/CacheStructs.h
@@ -11,6 +11,7 @@ #include <string> #include <mtx/events/join_rules.hpp> +#include <mtx/events/mscs/image_packs.hpp> namespace cache { enum class CacheVersion : int @@ -109,3 +110,10 @@ struct RoomSearchResult std::string room_id; RoomInfo info; }; + +struct ImagePackInfo +{ + mtx::events::msc2545::ImagePack pack; + std::string source_room; + std::string state_key; +}; diff --git a/src/Cache_p.h b/src/Cache_p.h
index c76cc717..c9d42202 100644 --- a/src/Cache_p.h +++ b/src/Cache_p.h
@@ -97,6 +97,12 @@ public: return getStateEvent<T>(txn, room_id, state_key); } + //! retrieve a specific event from account data + //! pass empty room_id for global account data + std::optional<mtx::events::collections::RoomAccountDataEvents> getAccountData( + mtx::events::EventType type, + const std::string &room_id = ""); + //! Retrieve member info from a room. std::vector<RoomMember> getMembers(const std::string &room_id, std::size_t startIndex = 0, @@ -225,6 +231,9 @@ public: std::vector<std::string> getParentRoomIds(const std::string &room_id); std::vector<std::string> getChildRoomIds(const std::string &room_id); + std::vector<ImagePackInfo> getImagePacks(const std::string &room_id, + std::optional<bool> stickers); + //! Mark a room that uses e2e encryption. void setEncryptedRoom(lmdb::txn &txn, const std::string &room_id); bool isRoomEncrypted(const std::string &room_id); @@ -238,12 +247,12 @@ public: // Outbound Megolm Sessions // void saveOutboundMegolmSession(const std::string &room_id, - const OutboundGroupSessionData &data, + const GroupSessionData &data, mtx::crypto::OutboundGroupSessionPtr &session); OutboundGroupSessionDataRef getOutboundMegolmSession(const std::string &room_id); bool outboundMegolmSessionExists(const std::string &room_id) noexcept; void updateOutboundMegolmSession(const std::string &room_id, - const OutboundGroupSessionData &data, + const GroupSessionData &data, mtx::crypto::OutboundGroupSessionPtr &session); void dropOutboundMegolmSession(const std::string &room_id); @@ -254,10 +263,12 @@ public: // Inbound Megolm Sessions // void saveInboundMegolmSession(const MegolmSessionIndex &index, - mtx::crypto::InboundGroupSessionPtr session); + mtx::crypto::InboundGroupSessionPtr session, + const GroupSessionData &data); mtx::crypto::InboundGroupSessionPtr getInboundMegolmSession( const MegolmSessionIndex &index); bool inboundMegolmSessionExists(const MegolmSessionIndex &index); + std::optional<GroupSessionData> getMegolmSessionData(const MegolmSessionIndex &index); // // Olm Sessions @@ -676,6 +687,7 @@ private: lmdb::dbi inboundMegolmSessionDb_; lmdb::dbi outboundMegolmSessionDb_; + lmdb::dbi megolmSessionDataDb_; QString localUserId_; QString cacheDirectory_; diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index 6003eb85..615a15b3 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp
@@ -116,29 +116,31 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent) connect(this, &ChatPage::loggedOut, this, &ChatPage::logout); - connect(view_manager_, &TimelineViewManager::inviteUsers, this, [this](QStringList users) { - const auto room_id = currentRoom().toStdString(); - - for (int ii = 0; ii < users.size(); ++ii) { - QTimer::singleShot(ii * 500, this, [this, room_id, ii, users]() { - const auto user = users.at(ii); + 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); - 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; - } + 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; + } - emit showNotification(tr("Invited user: %1").arg(user)); - }); - }); - } - }); + emit showNotification(tr("Invited user: %1").arg(user)); + }); + }); + } + }); connect(this, &ChatPage::leftRoom, this, &ChatPage::removeRoom); connect(this, &ChatPage::newRoom, this, &ChatPage::changeRoom, Qt::QueuedConnection); @@ -927,27 +929,33 @@ ChatPage::currentPresence() const void ChatPage::ensureOneTimeKeyCount(const std::map<std::string, uint16_t> &counts) { - for (const auto &entry : counts) { - if (entry.second < MAX_ONETIME_KEYS) { - const int nkeys = MAX_ONETIME_KEYS - entry.second; + uint16_t count = 0; + if (auto c = counts.find(mtx::crypto::SIGNED_CURVE25519); c != counts.end()) + count = c->second; - nhlog::crypto()->info("uploading {} {} keys", nkeys, entry.first); - olm::client()->generate_one_time_keys(nkeys); + if (count < MAX_ONETIME_KEYS) { + const int nkeys = MAX_ONETIME_KEYS - count; - http::client()->upload_keys( - olm::client()->create_upload_keys_request(), - [](const mtx::responses::UploadKeys &, mtx::http::RequestErr err) { - if (err) { - nhlog::crypto()->warn( - "failed to update one-time keys: {} {}", - err->matrix_error.error, - static_cast<int>(err->status_code)); + nhlog::crypto()->info( + "uploading {} {} keys", nkeys, mtx::crypto::SIGNED_CURVE25519); + olm::client()->generate_one_time_keys(nkeys); + + http::client()->upload_keys( + olm::client()->create_upload_keys_request(), + [](const mtx::responses::UploadKeys &, mtx::http::RequestErr err) { + if (err) { + nhlog::crypto()->warn("failed to update one-time keys: {} {} {}", + err->matrix_error.error, + static_cast<int>(err->status_code), + static_cast<int>(err->error_code)); + + if (err->status_code < 400 || err->status_code >= 500) return; - } + } - olm::mark_keys_as_published(); - }); - } + // mark as published anyway, otherwise we may end up in a loop. + olm::mark_keys_as_published(); + }); } } diff --git a/src/CombinedImagePackModel.cpp b/src/CombinedImagePackModel.cpp new file mode 100644
index 00000000..341a34ec --- /dev/null +++ b/src/CombinedImagePackModel.cpp
@@ -0,0 +1,77 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "CombinedImagePackModel.h" + +#include "Cache_p.h" +#include "CompletionModelRoles.h" + +CombinedImagePackModel::CombinedImagePackModel(const std::string &roomId, + bool stickers, + QObject *parent) + : QAbstractListModel(parent) + , room_id(roomId) +{ + auto packs = cache::client()->getImagePacks(room_id, stickers); + + for (const auto &pack : packs) { + QString packname = + pack.pack.pack ? QString::fromStdString(pack.pack.pack->display_name) : ""; + + for (const auto &img : pack.pack.images) { + ImageDesc i{}; + i.shortcode = QString::fromStdString(img.first); + i.packname = packname; + i.image = img.second; + images.push_back(std::move(i)); + } + } +} + +int +CombinedImagePackModel::rowCount(const QModelIndex &) const +{ + return (int)images.size(); +} + +QHash<int, QByteArray> +CombinedImagePackModel::roleNames() const +{ + return { + {CompletionModel::CompletionRole, "completionRole"}, + {CompletionModel::SearchRole, "searchRole"}, + {CompletionModel::SearchRole2, "searchRole2"}, + {Roles::Url, "url"}, + {Roles::ShortCode, "shortcode"}, + {Roles::Body, "body"}, + {Roles::PackName, "packname"}, + {Roles::OriginalRow, "originalRow"}, + }; +} + +QVariant +CombinedImagePackModel::data(const QModelIndex &index, int role) const +{ + if (hasIndex(index.row(), index.column(), index.parent())) { + switch (role) { + case CompletionModel::CompletionRole: + return QString::fromStdString(images[index.row()].image.url); + case Roles::Url: + return QString::fromStdString(images[index.row()].image.url); + case CompletionModel::SearchRole: + case Roles::ShortCode: + return images[index.row()].shortcode; + case CompletionModel::SearchRole2: + case Roles::Body: + return QString::fromStdString(images[index.row()].image.body); + case Roles::PackName: + return images[index.row()].packname; + case Roles::OriginalRow: + return index.row(); + default: + return {}; + } + } + return {}; +} diff --git a/src/CombinedImagePackModel.h b/src/CombinedImagePackModel.h new file mode 100644
index 00000000..f0f69799 --- /dev/null +++ b/src/CombinedImagePackModel.h
@@ -0,0 +1,48 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include <QAbstractListModel> + +#include <mtx/events/mscs/image_packs.hpp> + +class CombinedImagePackModel : public QAbstractListModel +{ + Q_OBJECT +public: + enum Roles + { + Url = Qt::UserRole, + ShortCode, + Body, + PackName, + OriginalRow, + }; + + CombinedImagePackModel(const std::string &roomId, bool stickers, QObject *parent = nullptr); + QHash<int, QByteArray> roleNames() const override; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role) const override; + + mtx::events::msc2545::PackImage imageAt(int row) + { + if (row < 0 || static_cast<size_t>(row) >= images.size()) + return {}; + return images.at(static_cast<size_t>(row)).image; + } + +private: + std::string room_id; + + struct ImageDesc + { + QString shortcode; + QString packname; + + mtx::events::msc2545::PackImage image; + }; + + std::vector<ImageDesc> images; +}; diff --git a/src/ImagePackListModel.cpp b/src/ImagePackListModel.cpp new file mode 100644
index 00000000..89f1f68e --- /dev/null +++ b/src/ImagePackListModel.cpp
@@ -0,0 +1,76 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "ImagePackListModel.h" + +#include <QQmlEngine> + +#include "Cache_p.h" +#include "SingleImagePackModel.h" + +ImagePackListModel::ImagePackListModel(const std::string &roomId, QObject *parent) + : QAbstractListModel(parent) + , room_id(roomId) +{ + auto packs_ = cache::client()->getImagePacks(room_id, std::nullopt); + + for (const auto &pack : packs_) { + packs.push_back( + QSharedPointer<SingleImagePackModel>(new SingleImagePackModel(pack))); + } +} + +int +ImagePackListModel::rowCount(const QModelIndex &) const +{ + return (int)packs.size(); +} + +QHash<int, QByteArray> +ImagePackListModel::roleNames() const +{ + return { + {Roles::DisplayName, "displayName"}, + {Roles::AvatarUrl, "avatarUrl"}, + {Roles::FromAccountData, "fromAccountData"}, + {Roles::FromCurrentRoom, "fromCurrentRoom"}, + {Roles::StateKey, "statekey"}, + {Roles::RoomId, "roomid"}, + }; +} + +QVariant +ImagePackListModel::data(const QModelIndex &index, int role) const +{ + if (hasIndex(index.row(), index.column(), index.parent())) { + const auto &pack = packs.at(index.row()); + switch (role) { + case Roles::DisplayName: + return pack->packname(); + case Roles::AvatarUrl: + return pack->avatarUrl(); + case Roles::FromAccountData: + return pack->roomid().isEmpty(); + case Roles::FromCurrentRoom: + return pack->roomid().toStdString() == this->room_id; + case Roles::StateKey: + return pack->statekey(); + case Roles::RoomId: + return pack->roomid(); + default: + return {}; + } + } + return {}; +} + +SingleImagePackModel * +ImagePackListModel::packAt(int row) +{ + if (row < 0 || static_cast<size_t>(row) >= packs.size()) + return {}; + auto e = packs.at(row).get(); + QQmlEngine::setObjectOwnership(e, QQmlEngine::CppOwnership); + return e; +} diff --git a/src/ImagePackListModel.h b/src/ImagePackListModel.h new file mode 100644
index 00000000..0a044690 --- /dev/null +++ b/src/ImagePackListModel.h
@@ -0,0 +1,37 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include <QAbstractListModel> +#include <QQmlEngine> +#include <QSharedPointer> + +class SingleImagePackModel; +class ImagePackListModel : public QAbstractListModel +{ + Q_OBJECT +public: + enum Roles + { + DisplayName = Qt::UserRole, + AvatarUrl, + FromAccountData, + FromCurrentRoom, + StateKey, + RoomId, + }; + + ImagePackListModel(const std::string &roomId, QObject *parent = nullptr); + QHash<int, QByteArray> roleNames() const override; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role) const override; + + Q_INVOKABLE SingleImagePackModel *packAt(int row); + +private: + std::string room_id; + + std::vector<QSharedPointer<SingleImagePackModel>> packs; +}; diff --git a/src/InviteeItem.cpp b/src/InviteeItem.cpp deleted file mode 100644
index 27f02560..00000000 --- a/src/InviteeItem.cpp +++ /dev/null
@@ -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); -} diff --git a/src/InviteeItem.h b/src/InviteeItem.h deleted file mode 100644
index 014541ea..00000000 --- a/src/InviteeItem.h +++ /dev/null
@@ -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_; -}; diff --git a/src/InviteesModel.cpp b/src/InviteesModel.cpp new file mode 100644
index 00000000..27b2116f --- /dev/null +++ b/src/InviteesModel.cpp
@@ -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(); + }); +} diff --git a/src/InviteesModel.h b/src/InviteesModel.h new file mode 100644
index 00000000..a4e19ebb --- /dev/null +++ b/src/InviteesModel.h
@@ -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 diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index ed337ca4..c0486d01 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp
@@ -21,6 +21,7 @@ #include "LoginPage.h" #include "MainWindow.h" #include "MatrixClient.h" +#include "MemberList.h" #include "RegisterPage.h" #include "TrayIcon.h" #include "UserSettingsPage.h" @@ -32,11 +33,9 @@ #include "ui/SnackBar.h" #include "dialogs/CreateRoom.h" -#include "dialogs/InviteUsers.h" #include "dialogs/JoinRoom.h" #include "dialogs/LeaveRoom.h" #include "dialogs/Logout.h" -#include "dialogs/MemberList.h" #include "dialogs/ReadReceipts.h" MainWindow *MainWindow::instance_ = nullptr; @@ -311,14 +310,6 @@ MainWindow::hasActiveUser() } void -MainWindow::openMemberListDialog(const QString &room_id) -{ - auto dialog = new dialogs::MemberList(room_id, this); - - showDialog(dialog); -} - -void MainWindow::openLeaveRoomDialog(const QString &room_id) { auto dialog = new dialogs::LeaveRoom(this); @@ -342,18 +333,6 @@ MainWindow::showOverlayProgressBar() } 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) { auto dialog = new dialogs::JoinRoom(this); diff --git a/src/MainWindow.h b/src/MainWindow.h
index 3571f079..6d62545c 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h
@@ -65,7 +65,6 @@ public: std::function<void(const mtx::requests::CreateRoom &request)> callback); void openJoinRoomDialog(std::function<void(const QString &room_id)> callback); void openLogoutDialog(); - void openMemberListDialog(const QString &room_id); void openReadReceiptsDialog(const QString &event_id); void hideOverlay(); diff --git a/src/MemberList.cpp b/src/MemberList.cpp new file mode 100644
index 00000000..0ef3b696 --- /dev/null +++ b/src/MemberList.cpp
@@ -0,0 +1,111 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include <QAbstractSlider> +#include <QLabel> +#include <QListWidgetItem> +#include <QPainter> +#include <QPushButton> +#include <QScrollBar> +#include <QShortcut> +#include <QStyleOption> +#include <QVBoxLayout> + +#include "MemberList.h" + +#include "Cache.h" +#include "ChatPage.h" +#include "Config.h" +#include "Logging.h" +#include "Utils.h" +#include "timeline/TimelineViewManager.h" +#include "ui/Avatar.h" + +MemberList::MemberList(const QString &room_id, QObject *parent) + : QAbstractListModel{parent} + , room_id_{room_id} +{ + try { + info_ = cache::singleRoomInfo(room_id_.toStdString()); + } catch (const lmdb::error &) { + nhlog::db()->warn("failed to retrieve room info from cache: {}", + room_id_.toStdString()); + } + + try { + auto members = cache::getMembers(room_id_.toStdString()); + addUsers(members); + numUsersLoaded_ = members.size(); + } catch (const lmdb::error &e) { + nhlog::db()->critical("Failed to retrieve members from cache: {}", e.what()); + } +} + +void +MemberList::addUsers(const std::vector<RoomMember> &members) +{ + beginInsertRows( + QModelIndex{}, m_memberList.count(), m_memberList.count() + members.size() - 1); + + for (const auto &member : members) + m_memberList.push_back( + {member, + ChatPage::instance()->timelineManager()->rooms()->currentRoom()->avatarUrl( + member.user_id)}); + + endInsertRows(); +} + +QHash<int, QByteArray> +MemberList::roleNames() const +{ + return { + {Mxid, "mxid"}, + {DisplayName, "displayName"}, + {AvatarUrl, "avatarUrl"}, + }; +} + +QVariant +MemberList::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() >= (int)m_memberList.size() || index.row() < 0) + return {}; + + switch (role) { + case Mxid: + return m_memberList[index.row()].first.user_id; + case DisplayName: + return m_memberList[index.row()].first.display_name; + case AvatarUrl: + return m_memberList[index.row()].second; + default: + return {}; + } +} + +bool +MemberList::canFetchMore(const QModelIndex &) const +{ + const size_t numMembers = rowCount(); + if (numMembers > 1 && numMembers < info_.member_count) + return true; + else + return false; +} + +void +MemberList::fetchMore(const QModelIndex &) +{ + loadingMoreMembers_ = true; + emit loadingMoreMembersChanged(); + + auto members = cache::getMembers(room_id_.toStdString(), rowCount()); + addUsers(members); + numUsersLoaded_ += members.size(); + emit numUsersLoadedChanged(); + + loadingMoreMembers_ = false; + emit loadingMoreMembersChanged(); +} diff --git a/src/MemberList.h b/src/MemberList.h new file mode 100644
index 00000000..9932f6a4 --- /dev/null +++ b/src/MemberList.h
@@ -0,0 +1,66 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include "CacheStructs.h" +#include <QAbstractListModel> + +class MemberList : public QAbstractListModel +{ + Q_OBJECT + + Q_PROPERTY(QString roomName READ roomName NOTIFY roomNameChanged) + Q_PROPERTY(int memberCount READ memberCount NOTIFY memberCountChanged) + Q_PROPERTY(QString avatarUrl READ avatarUrl NOTIFY avatarUrlChanged) + Q_PROPERTY(QString roomId READ roomId NOTIFY roomIdChanged) + Q_PROPERTY(int numUsersLoaded READ numUsersLoaded NOTIFY numUsersLoadedChanged) + Q_PROPERTY(bool loadingMoreMembers READ loadingMoreMembers NOTIFY loadingMoreMembersChanged) + +public: + enum Roles + { + Mxid, + DisplayName, + AvatarUrl, + }; + MemberList(const QString &room_id, QObject *parent = nullptr); + + QHash<int, QByteArray> roleNames() const override; + int rowCount(const QModelIndex &parent = QModelIndex()) const override + { + Q_UNUSED(parent) + return static_cast<int>(m_memberList.size()); + } + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + + QString roomName() const { return QString::fromStdString(info_.name); } + int memberCount() const { return info_.member_count; } + QString avatarUrl() const { return QString::fromStdString(info_.avatar_url); } + QString roomId() const { return room_id_; } + int numUsersLoaded() const { return numUsersLoaded_; } + bool loadingMoreMembers() const { return loadingMoreMembers_; } + +signals: + void roomNameChanged(); + void memberCountChanged(); + void avatarUrlChanged(); + void roomIdChanged(); + void numUsersLoadedChanged(); + void loadingMoreMembersChanged(); + +public slots: + void addUsers(const std::vector<RoomMember> &users); + +protected: + bool canFetchMore(const QModelIndex &) const override; + void fetchMore(const QModelIndex &) override; + +private: + QVector<QPair<RoomMember, QString>> m_memberList; + QString room_id_; + RoomInfo info_; + int numUsersLoaded_{0}; + bool loadingMoreMembers_{false}; +}; diff --git a/src/MxcImageProvider.cpp b/src/MxcImageProvider.cpp
index ab6540a4..ab0f8152 100644 --- a/src/MxcImageProvider.cpp +++ b/src/MxcImageProvider.cpp
@@ -196,7 +196,6 @@ MxcImageProvider::download(const QString &id, image.setText("original filename", QString::fromStdString(originalFilename)); image.setText("mxc url", "mxc://" + id); - image.save(fileInfo.absoluteFilePath()); then(id, requestedSize, image, fileInfo.absoluteFilePath()); }); } catch (std::exception &e) { diff --git a/src/Olm.cpp b/src/Olm.cpp
index 4a403cd0..69503e6e 100644 --- a/src/Olm.cpp +++ b/src/Olm.cpp
@@ -123,7 +123,17 @@ handle_to_device_messages(const std::vector<mtx::events::collections::DeviceEven if (msg_type == to_string(mtx::events::EventType::RoomEncrypted)) { try { olm::OlmMessage olm_msg = j_msg; - handle_olm_message(std::move(olm_msg)); + cache::client()->query_keys( + olm_msg.sender, + [olm_msg](const UserKeyCache &userKeys, mtx::http::RequestErr e) { + if (e) { + nhlog::crypto()->error( + "Failed to query user keys, dropping olm " + "message"); + return; + } + handle_olm_message(std::move(olm_msg), userKeys); + }); } catch (const nlohmann::json::exception &e) { nhlog::crypto()->warn( "parsing error for olm message: {} {}", e.what(), j_msg.dump(2)); @@ -197,13 +207,15 @@ handle_to_device_messages(const std::vector<mtx::events::collections::DeviceEven } void -handle_olm_message(const OlmMessage &msg) +handle_olm_message(const OlmMessage &msg, const UserKeyCache &otherUserDeviceKeys) { nhlog::crypto()->info("sender : {}", msg.sender); nhlog::crypto()->info("sender_key: {}", msg.sender_key); const auto my_key = olm::client()->identity_keys().curve25519; + bool failed_decryption = false; + for (const auto &cipher : msg.ciphertext) { // We skip messages not meant for the current device. if (cipher.first != my_key) { @@ -224,6 +236,7 @@ handle_olm_message(const OlmMessage &msg) msg.sender, msg.sender_key, cipher.second); } else { nhlog::crypto()->error("Undecryptable olm message!"); + failed_decryption = true; continue; } } @@ -231,6 +244,57 @@ handle_olm_message(const OlmMessage &msg) if (!payload.is_null()) { mtx::events::collections::DeviceEvents device_event; + // Other properties are included in order to prevent an attacker from + // publishing someone else's curve25519 keys as their own and subsequently + // claiming to have sent messages which they didn't. sender must correspond + // to the user who sent the event, recipient to the local user, and + // recipient_keys to the local ed25519 key. + std::string receiver_ed25519 = payload["recipient_keys"]["ed25519"]; + if (receiver_ed25519.empty() || + receiver_ed25519 != olm::client()->identity_keys().ed25519) { + nhlog::crypto()->warn( + "Decrypted event doesn't include our ed25519: {}", + payload.dump()); + return; + } + std::string receiver = payload["recipient"]; + if (receiver.empty() || receiver != http::client()->user_id().to_string()) { + nhlog::crypto()->warn( + "Decrypted event doesn't include our user_id: {}", + payload.dump()); + return; + } + + // Clients must confirm that the sender_key and the ed25519 field value + // under the keys property match the keys returned by /keys/query for the + // given user, and must also verify the signature of the payload. Without + // this check, a client cannot be sure that the sender device owns the + // private part of the ed25519 key it claims to have in the Olm payload. + // This is crucial when the ed25519 key corresponds to a verified device. + std::string sender_ed25519 = payload["keys"]["ed25519"]; + if (sender_ed25519.empty()) { + nhlog::crypto()->warn( + "Decrypted event doesn't include sender ed25519: {}", + payload.dump()); + return; + } + + bool from_their_device = false; + for (auto [device_id, key] : otherUserDeviceKeys.device_keys) { + if (key.keys.at("curve25519:" + device_id) == msg.sender_key) { + if (key.keys.at("ed25519:" + device_id) == sender_ed25519) { + from_their_device = true; + break; + } + } + } + if (!from_their_device) { + nhlog::crypto()->warn("Decrypted event isn't sent from a device " + "listed by that user! {}", + payload.dump()); + return; + } + { std::string msg_type = payload["type"]; json event_array = json::array(); @@ -242,7 +306,7 @@ handle_olm_message(const OlmMessage &msg) if (temp_events.empty()) { nhlog::crypto()->warn("Decrypted unknown event: {}", payload.dump()); - continue; + return; } device_event = temp_events.at(0); } @@ -276,17 +340,20 @@ handle_olm_message(const OlmMessage &msg) ChatPage::instance()->receivedDeviceVerificationDone(e8->content); } else if (auto roomKey = std::get_if<DeviceEvent<msg::RoomKey>>(&device_event)) { - create_inbound_megolm_session(*roomKey, msg.sender_key); + create_inbound_megolm_session( + *roomKey, msg.sender_key, sender_ed25519); } else if (auto forwardedRoomKey = std::get_if<DeviceEvent<msg::ForwardedRoomKey>>( &device_event)) { + forwardedRoomKey->content.forwarding_curve25519_key_chain.push_back( + msg.sender_key); import_inbound_megolm_session(*forwardedRoomKey); } else if (auto e = std::get_if<DeviceEvent<msg::SecretSend>>(&device_event)) { auto local_user = http::client()->user_id(); if (msg.sender != local_user.to_string()) - continue; + return; auto secret_name = request_id_to_secret_name.find(e->content.request_id); @@ -306,7 +373,7 @@ handle_olm_message(const OlmMessage &msg) cache::verificationStatus(local_user.to_string()); if (!verificationStatus) - continue; + return; auto deviceKeys = cache::userKeys(local_user.to_string()); std::string sender_device_id; @@ -344,7 +411,6 @@ handle_olm_message(const OlmMessage &msg) "for secrect " "'{}'", name); - return; } }); @@ -360,27 +426,28 @@ handle_olm_message(const OlmMessage &msg) } return; + } else { + failed_decryption = true; } } - try { - auto otherUserDeviceKeys = cache::userKeys(msg.sender); - - if (!otherUserDeviceKeys) - return; + 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); + } - std::map<std::string, std::vector<std::string>> targets; - for (auto [device_id, key] : otherUserDeviceKeys->device_keys) { - if (key.keys.at("curve25519:" + device_id) == msg.sender_key) - targets[msg.sender].push_back(device_id); + send_encrypted_to_device_messages( + targets, mtx::events::DeviceEvent<mtx::events::msg::Dummy>{}, true); + nhlog::crypto()->info("Recovering from broken olm channel with {}:{}", + msg.sender, + msg.sender_key); + } catch (std::exception &e) { + nhlog::crypto()->error("Failed to recover from broken olm sessions: {}", + e.what()); } - - send_encrypted_to_device_messages( - targets, mtx::events::DeviceEvent<mtx::events::msg::Dummy>{}, true); - nhlog::crypto()->info( - "Recovering from broken olm channel with {}:{}", msg.sender, msg.sender_key); - } catch (std::exception &e) { - nhlog::crypto()->error("Failed to recover from broken olm sessions: {}", e.what()); } } @@ -450,7 +517,7 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id, std::map<std::string, std::vector<std::string>> sendSessionTo; mtx::crypto::OutboundGroupSessionPtr session = nullptr; - OutboundGroupSessionData group_session_data; + GroupSessionData group_session_data; if (cache::outboundMegolmSessionExists(room_id)) { auto res = cache::getOutboundMegolmSession(room_id); @@ -519,7 +586,8 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id, } else { // compare devices bool device_removed = false; - for (const auto &dev : session_member_it->second.devices) { + for (const auto &dev : + session_member_it->second.deviceids) { if (!member_it->second || !member_it->second->device_keys.count( dev.first)) { @@ -541,7 +609,7 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id, if (member_it->second) for (const auto &dev : member_it->second->device_keys) - if (!session_member_it->second.devices + if (!session_member_it->second.deviceids .count(dev.first) && (member_it->first != own_user_id || dev.first != device_id)) @@ -571,32 +639,28 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id, const auto session_key = mtx::crypto::session_key(session.get()); // Saving the new megolm session. - OutboundGroupSessionData session_data{}; - session_data.session_id = mtx::crypto::session_id(session.get()); - session_data.session_key = mtx::crypto::session_key(session.get()); - session_data.message_index = 0; - session_data.timestamp = QDateTime::currentMSecsSinceEpoch(); + GroupSessionData session_data{}; + session_data.message_index = 0; + session_data.timestamp = QDateTime::currentMSecsSinceEpoch(); + session_data.sender_claimed_ed25519_key = olm::client()->identity_keys().ed25519; sendSessionTo.clear(); for (const auto &[user, devices] : members) { sendSessionTo[user] = {}; - session_data.initially.keys[user] = {}; + session_data.currently.keys[user] = {}; if (devices) { for (const auto &[device_id_, key] : devices->device_keys) { (void)key; if (device_id != device_id_ || user != own_user_id) { sendSessionTo[user].push_back(device_id_); - session_data.initially.keys[user] - .devices[device_id_] = 0; + session_data.currently.keys[user] + .deviceids[device_id_] = 0; } } } } - cache::saveOutboundMegolmSession(room_id, session_data, session); - group_session_data = std::move(session_data); - { MegolmSessionIndex index; index.room_id = room_id; @@ -604,8 +668,12 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id, index.sender_key = olm::client()->identity_keys().curve25519; auto megolm_session = olm::client()->init_inbound_group_session(session_key); - cache::saveInboundMegolmSession(index, std::move(megolm_session)); + cache::saveInboundMegolmSession( + index, std::move(megolm_session), session_data); } + + cache::saveOutboundMegolmSession(room_id, session_data, session); + group_session_data = std::move(session_data); } mtx::events::DeviceEvent<mtx::events::msg::RoomKey> megolm_payload{}; @@ -641,8 +709,8 @@ encrypt_group_message(const std::string &room_id, const std::string &device_id, group_session_data.currently.keys[user] = {}; for (const auto &device_id_ : devices) { - if (!group_session_data.currently.keys[user].devices.count(device_id_)) - group_session_data.currently.keys[user].devices[device_id_] = + if (!group_session_data.currently.keys[user].deviceids.count(device_id_)) + group_session_data.currently.keys[user].deviceids[device_id_] = group_session_data.message_index; } } @@ -704,7 +772,8 @@ try_olm_decryption(const std::string &sender_key, const mtx::events::msg::OlmCip void create_inbound_megolm_session(const mtx::events::DeviceEvent<mtx::events::msg::RoomKey> &roomKey, - const std::string &sender_key) + const std::string &sender_key, + const std::string &sender_ed25519) { MegolmSessionIndex index; index.room_id = roomKey.content.room_id; @@ -712,9 +781,13 @@ create_inbound_megolm_session(const mtx::events::DeviceEvent<mtx::events::msg::R index.sender_key = sender_key; try { + GroupSessionData data{}; + data.forwarding_curve25519_key_chain = {sender_key}; + data.sender_claimed_ed25519_key = sender_ed25519; + auto megolm_session = olm::client()->init_inbound_group_session(roomKey.content.session_key); - cache::saveInboundMegolmSession(index, std::move(megolm_session)); + cache::saveInboundMegolmSession(index, std::move(megolm_session), data); } catch (const lmdb::error &e) { nhlog::crypto()->critical("failed to save inbound megolm session: {}", e.what()); return; @@ -741,7 +814,13 @@ import_inbound_megolm_session( try { auto megolm_session = olm::client()->import_inbound_group_session(roomKey.content.session_key); - cache::saveInboundMegolmSession(index, std::move(megolm_session)); + + GroupSessionData data{}; + data.forwarding_curve25519_key_chain = + roomKey.content.forwarding_curve25519_key_chain; + data.sender_claimed_ed25519_key = roomKey.content.sender_claimed_ed25519_key; + + cache::saveInboundMegolmSession(index, std::move(megolm_session), data); } catch (const lmdb::error &e) { nhlog::crypto()->critical("failed to save inbound megolm session: {}", e.what()); return; @@ -817,30 +896,33 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR return; } - // Check if we were the sender of the session being requested. - if (req.content.sender_key != olm::client()->identity_keys().curve25519) { - nhlog::crypto()->debug("ignoring key request {} because we were not the sender: " - "\nrequested({}) ours({})", - req.content.request_id, - req.content.sender_key, - olm::client()->identity_keys().curve25519); + // Check if we were the sender of the session being requested (unless it is actually us + // requesting the session). + if (req.sender != http::client()->user_id().to_string() && + req.content.sender_key != olm::client()->identity_keys().curve25519) { + nhlog::crypto()->debug( + "ignoring key request {} because we did not create the requested session: " + "\nrequested({}) ours({})", + req.content.request_id, + req.content.sender_key, + olm::client()->identity_keys().curve25519); return; } + // Check that the requested session_id and the one we have saved match. + MegolmSessionIndex index{}; + index.room_id = req.content.room_id; + index.session_id = req.content.session_id; + index.sender_key = req.content.sender_key; + // Check if we have the keys for the requested session. - auto outboundSession = cache::getOutboundMegolmSession(req.content.room_id); - if (!outboundSession.session) { + auto sessionData = cache::getMegolmSessionData(index); + if (!sessionData) { nhlog::crypto()->warn("requested session not found in room: {}", req.content.room_id); return; } - // Check that the requested session_id and the one we have saved match. - MegolmSessionIndex index{}; - index.room_id = req.content.room_id; - index.session_id = req.content.session_id; - index.sender_key = olm::client()->identity_keys().curve25519; - const auto session = cache::getInboundMegolmSession(index); if (!session) { nhlog::crypto()->warn("No session with id {} in db", req.content.session_id); @@ -873,12 +955,12 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR bool shouldSeeKeys = false; uint64_t minimumIndex = -1; - if (outboundSession.data.currently.keys.count(req.sender)) { - if (outboundSession.data.currently.keys.at(req.sender) - .devices.count(req.content.requesting_device_id)) { + if (sessionData->currently.keys.count(req.sender)) { + if (sessionData->currently.keys.at(req.sender) + .deviceids.count(req.content.requesting_device_id)) { shouldSeeKeys = true; - minimumIndex = outboundSession.data.currently.keys.at(req.sender) - .devices.at(req.content.requesting_device_id); + minimumIndex = sessionData->currently.keys.at(req.sender) + .deviceids.at(req.content.requesting_device_id); } } @@ -906,8 +988,9 @@ handle_key_request_message(const mtx::events::DeviceEvent<mtx::events::msg::KeyR forward_key.sender_key = index.sender_key; // TODO(Nico): Figure out if this is correct - forward_key.sender_claimed_ed25519_key = olm::client()->identity_keys().ed25519; - forward_key.forwarding_curve25519_key_chain = {}; + forward_key.sender_claimed_ed25519_key = sessionData->sender_claimed_ed25519_key; + forward_key.forwarding_curve25519_key_chain = + sessionData->forwarding_curve25519_key_chain; send_megolm_key_to_device( req.sender, req.content.requesting_device_id, forward_key); @@ -928,6 +1011,7 @@ send_megolm_key_to_device(const std::string &user_id, std::map<std::string, std::vector<std::string>> targets; targets[user_id] = {device_id}; send_encrypted_to_device_messages(targets, room_key); + nhlog::crypto()->debug("Forwarded key to {}:{}", user_id, device_id); } DecryptionResult diff --git a/src/Olm.h b/src/Olm.h
index 8479f4f2..a18cbbfb 100644 --- a/src/Olm.h +++ b/src/Olm.h
@@ -59,12 +59,13 @@ try_olm_decryption(const std::string &sender_key, const mtx::events::msg::OlmCipherContent &content); void -handle_olm_message(const OlmMessage &msg); +handle_olm_message(const OlmMessage &msg, const UserKeyCache &otherUserDeviceKeys); //! Establish a new inbound megolm session with the decrypted payload from olm. void create_inbound_megolm_session(const mtx::events::DeviceEvent<mtx::events::msg::RoomKey> &roomKey, - const std::string &sender_key); + const std::string &sender_key, + const std::string &sender_ed25519); void import_inbound_megolm_session( const mtx::events::DeviceEvent<mtx::events::msg::ForwardedRoomKey> &roomKey); diff --git a/src/SingleImagePackModel.cpp b/src/SingleImagePackModel.cpp new file mode 100644
index 00000000..6c508da0 --- /dev/null +++ b/src/SingleImagePackModel.cpp
@@ -0,0 +1,100 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "SingleImagePackModel.h" + +#include "Cache_p.h" +#include "MatrixClient.h" + +SingleImagePackModel::SingleImagePackModel(ImagePackInfo pack_, QObject *parent) + : QAbstractListModel(parent) + , roomid_(std::move(pack_.source_room)) + , statekey_(std::move(pack_.state_key)) + , pack(std::move(pack_.pack)) +{ + if (!pack.pack) + pack.pack = mtx::events::msc2545::ImagePack::PackDescription{}; + + for (const auto &e : pack.images) + shortcodes.push_back(e.first); +} + +int +SingleImagePackModel::rowCount(const QModelIndex &) const +{ + return (int)shortcodes.size(); +} + +QHash<int, QByteArray> +SingleImagePackModel::roleNames() const +{ + return { + {Roles::Url, "url"}, + {Roles::ShortCode, "shortCode"}, + {Roles::Body, "body"}, + {Roles::IsEmote, "isEmote"}, + {Roles::IsSticker, "isSticker"}, + }; +} + +QVariant +SingleImagePackModel::data(const QModelIndex &index, int role) const +{ + if (hasIndex(index.row(), index.column(), index.parent())) { + const auto &img = pack.images.at(shortcodes.at(index.row())); + switch (role) { + case Url: + return QString::fromStdString(img.url); + case ShortCode: + return QString::fromStdString(shortcodes.at(index.row())); + case Body: + return QString::fromStdString(img.body); + case IsEmote: + return img.overrides_usage() ? img.is_emoji() : pack.pack->is_emoji(); + case IsSticker: + return img.overrides_usage() ? img.is_sticker() : pack.pack->is_sticker(); + default: + return {}; + } + } + return {}; +} + +bool +SingleImagePackModel::isGloballyEnabled() const +{ + if (auto roomPacks = + cache::client()->getAccountData(mtx::events::EventType::ImagePackRooms)) { + if (auto tmp = std::get_if< + mtx::events::EphemeralEvent<mtx::events::msc2545::ImagePackRooms>>( + &*roomPacks)) { + if (tmp->content.rooms.count(roomid_) && + tmp->content.rooms.at(roomid_).count(statekey_)) + return true; + } + } + return false; +} +void +SingleImagePackModel::setGloballyEnabled(bool enabled) +{ + mtx::events::msc2545::ImagePackRooms content{}; + if (auto roomPacks = + cache::client()->getAccountData(mtx::events::EventType::ImagePackRooms)) { + if (auto tmp = std::get_if< + mtx::events::EphemeralEvent<mtx::events::msc2545::ImagePackRooms>>( + &*roomPacks)) { + content = tmp->content; + } + } + + if (enabled) + content.rooms[roomid_][statekey_] = {}; + else + content.rooms[roomid_].erase(statekey_); + + http::client()->put_account_data(content, [](mtx::http::RequestErr) { + // emit this->globallyEnabledChanged(); + }); +} diff --git a/src/SingleImagePackModel.h b/src/SingleImagePackModel.h new file mode 100644
index 00000000..e0c791ba --- /dev/null +++ b/src/SingleImagePackModel.h
@@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#pragma once + +#include <QAbstractListModel> + +#include <mtx/events/mscs/image_packs.hpp> + +#include "CacheStructs.h" + +class SingleImagePackModel : public QAbstractListModel +{ + Q_OBJECT + + Q_PROPERTY(QString roomid READ roomid CONSTANT) + Q_PROPERTY(QString statekey READ statekey CONSTANT) + Q_PROPERTY(QString attribution READ statekey CONSTANT) + Q_PROPERTY(QString packname READ packname CONSTANT) + Q_PROPERTY(QString avatarUrl READ avatarUrl CONSTANT) + Q_PROPERTY(bool isStickerPack READ isStickerPack CONSTANT) + Q_PROPERTY(bool isEmotePack READ isEmotePack CONSTANT) + Q_PROPERTY(bool isGloballyEnabled READ isGloballyEnabled WRITE setGloballyEnabled NOTIFY + globallyEnabledChanged) +public: + enum Roles + { + Url = Qt::UserRole, + ShortCode, + Body, + IsEmote, + IsSticker, + }; + + SingleImagePackModel(ImagePackInfo pack_, QObject *parent = nullptr); + QHash<int, QByteArray> roleNames() const override; + int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QVariant data(const QModelIndex &index, int role) const override; + + QString roomid() const { return QString::fromStdString(roomid_); } + QString statekey() const { return QString::fromStdString(statekey_); } + QString packname() const { return QString::fromStdString(pack.pack->display_name); } + QString attribution() const { return QString::fromStdString(pack.pack->attribution); } + QString avatarUrl() const { return QString::fromStdString(pack.pack->avatar_url); } + bool isStickerPack() const { return pack.pack->is_sticker(); } + bool isEmotePack() const { return pack.pack->is_emoji(); } + + bool isGloballyEnabled() const; + void setGloballyEnabled(bool enabled); + +signals: + void globallyEnabledChanged(); + +private: + std::string roomid_; + std::string statekey_; + + mtx::events::msc2545::ImagePack pack; + std::vector<std::string> shortcodes; +}; diff --git a/src/UserSettingsPage.cpp b/src/UserSettingsPage.cpp
index 740b8979..a062780a 100644 --- a/src/UserSettingsPage.cpp +++ b/src/UserSettingsPage.cpp
@@ -91,7 +91,7 @@ UserSettings::load(std::optional<QString> profile) privacyScreen_ = settings.value("user/privacy_screen", false).toBool(); privacyScreenTimeout_ = settings.value("user/privacy_screen_timeout", 0).toInt(); shareKeysWithTrustedUsers_ = - settings.value("user/share_keys_with_trusted_users", true).toBool(); + settings.value("user/automatically_share_keys_with_trusted_users", false).toBool(); mobileMode_ = settings.value("user/mobile_mode", false).toBool(); emojiFont_ = settings.value("user/emoji_font_family", "default").toString(); baseFontSize_ = settings.value("user/font_size", QFont().pointSizeF()).toDouble(); @@ -610,7 +610,8 @@ UserSettings::save() settings.setValue("decrypt_sidebar", decryptSidebar_); settings.setValue("privacy_screen", privacyScreen_); settings.setValue("privacy_screen_timeout", privacyScreenTimeout_); - settings.setValue("share_keys_with_trusted_users", shareKeysWithTrustedUsers_); + settings.setValue("automatically_share_keys_with_trusted_users", + shareKeysWithTrustedUsers_); settings.setValue("mobile_mode", mobileMode_); settings.setValue("font_size", baseFontSize_); settings.setValue("typing_notifications", typingNotifications_); @@ -1398,7 +1399,7 @@ UserSettingsPage::exportSessionKeys() QString suffix("-----END MEGOLM SESSION DATA-----"); QString newline("\n"); QTextStream out(&file); - out << prefix << newline << b64 << newline << suffix; + out << prefix << newline << b64 << newline << suffix << newline; file.close(); } catch (const std::exception &e) { QMessageBox::warning(this, tr("Error"), e.what()); diff --git a/src/Utils.cpp b/src/Utils.cpp
index eabf50d9..a99831c4 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp
@@ -540,7 +540,7 @@ utils::markdownToHtml(const QString &text, bool rainbowify) // Use colors as described here: // https://shark.comfsm.fm/~dleeling/cis/hsl_rainbow.html auto color = - QColor::fromHslF((charIdx - 1.0) / textLen * (5. / 6.), 1.0, 0.5); + QColor::fromHslF((charIdx - 1.0) / textLen * (5. / 6.), 0.9, 0.5); // format color for HTML auto colorString = color.name(QColor::NameFormat::HexRgb); // create HTML element for current char diff --git a/src/dialogs/InviteUsers.cpp b/src/dialogs/InviteUsers.cpp deleted file mode 100644
index 9dd6085f..00000000 --- a/src/dialogs/InviteUsers.cpp +++ /dev/null
@@ -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); -} diff --git a/src/dialogs/InviteUsers.h b/src/dialogs/InviteUsers.h deleted file mode 100644
index e40183c1..00000000 --- a/src/dialogs/InviteUsers.h +++ /dev/null
@@ -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 diff --git a/src/dialogs/MemberList.cpp b/src/dialogs/MemberList.cpp deleted file mode 100644
index 21eb72b0..00000000 --- a/src/dialogs/MemberList.cpp +++ /dev/null
@@ -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); - } -} diff --git a/src/dialogs/MemberList.h b/src/dialogs/MemberList.h deleted file mode 100644
index b822eec8..00000000 --- a/src/dialogs/MemberList.h +++ /dev/null
@@ -1,57 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include <QFrame> -#include <QListWidget> - -class Avatar; -class QPushButton; -class QHBoxLayout; -class QLabel; -class QVBoxLayout; - -struct RoomMember; - -template<class T> -class QSharedPointer; - -namespace dialogs { - -class MemberItem : public QWidget -{ - Q_OBJECT - -public: - MemberItem(const RoomMember &member, QWidget *parent); - -protected: - void paintEvent(QPaintEvent *) override; - -private: - QHBoxLayout *topLayout_; - QVBoxLayout *textLayout_; - - Avatar *avatar_; - - QLabel *userName_; - QLabel *userId_; -}; - -class MemberList : public QFrame -{ - Q_OBJECT -public: - MemberList(const QString &room_id, QWidget *parent = nullptr); - -public slots: - void addUsers(const std::vector<RoomMember> &users); - -private: - QString room_id_; - QLabel *topLabel_; - QListWidget *list_; -}; -} // dialogs diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp
index b0747a7c..f17081e5 100644 --- a/src/timeline/InputBar.cpp +++ b/src/timeline/InputBar.cpp
@@ -19,6 +19,7 @@ #include "Cache.h" #include "ChatPage.h" +#include "CombinedImagePackModel.h" #include "CompletionProxyModel.h" #include "Config.h" #include "Logging.h" @@ -502,6 +503,31 @@ InputBar::video(const QString &filename, } void +InputBar::sticker(CombinedImagePackModel *model, int row) +{ + if (!model || row < 0) + return; + + auto img = model->imageAt(row); + + mtx::events::msg::StickerImage sticker{}; + sticker.info = img.info.value_or(mtx::common::ImageInfo{}); + sticker.url = img.url; + sticker.body = img.body; + + if (!room->reply().isEmpty()) { + sticker.relations.relations.push_back( + {mtx::common::RelationType::InReplyTo, room->reply().toStdString()}); + } + if (!room->edit().isEmpty()) { + sticker.relations.relations.push_back( + {mtx::common::RelationType::Replace, room->edit().toStdString()}); + } + + room->sendMessageEvent(sticker, mtx::events::EventType::Sticker); +} + +void InputBar::command(QString command, QString args) { if (command == "me") { diff --git a/src/timeline/InputBar.h b/src/timeline/InputBar.h
index c9728379..2e6fb5c0 100644 --- a/src/timeline/InputBar.h +++ b/src/timeline/InputBar.h
@@ -12,6 +12,7 @@ #include <mtx/responses/messages.hpp> class TimelineModel; +class CombinedImagePackModel; class QMimeData; class QDropEvent; class QStringList; @@ -57,6 +58,7 @@ public slots: MarkdownOverride useMarkdown = MarkdownOverride::NOT_SPECIFIED, bool rainbowify = false); void reaction(const QString &reactedEvent, const QString &reactionKey); + void sticker(CombinedImagePackModel *model, int row); private slots: void startTyping(); diff --git a/src/timeline/Permissions.cpp b/src/timeline/Permissions.cpp
index 1eaab468..e4957045 100644 --- a/src/timeline/Permissions.cpp +++ b/src/timeline/Permissions.cpp
@@ -8,9 +8,9 @@ #include "MatrixClient.h" #include "TimelineModel.h" -Permissions::Permissions(TimelineModel *parent) +Permissions::Permissions(QString roomId, QObject *parent) : QObject(parent) - , room(parent) + , roomId_(roomId) { invalidate(); } @@ -19,7 +19,7 @@ void Permissions::invalidate() { pl = cache::client() - ->getStateEvent<mtx::events::state::PowerLevels>(room->roomId().toStdString()) + ->getStateEvent<mtx::events::state::PowerLevels>(roomId_.toStdString()) .value_or(mtx::events::StateEvent<mtx::events::state::PowerLevels>{}) .content; } diff --git a/src/timeline/Permissions.h b/src/timeline/Permissions.h
index f7e6f389..7aab1ddb 100644 --- a/src/timeline/Permissions.h +++ b/src/timeline/Permissions.h
@@ -15,7 +15,7 @@ class Permissions : public QObject Q_OBJECT public: - Permissions(TimelineModel *parent); + Permissions(QString roomId, QObject *parent = nullptr); Q_INVOKABLE bool canInvite(); Q_INVOKABLE bool canBan(); @@ -28,6 +28,6 @@ public: void invalidate(); private: - TimelineModel *room; + QString roomId_; mtx::events::state::PowerLevels pl; }; diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index ab11f99b..ee5564a5 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp
@@ -25,6 +25,7 @@ #include "Logging.h" #include "MainWindow.h" #include "MatrixClient.h" +#include "MemberList.h" #include "MxcImageProvider.h" #include "Olm.h" #include "TimelineViewManager.h" @@ -317,6 +318,7 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj , events(room_id.toStdString(), this) , room_id_(room_id) , manager_(manager) + , permissions_{room_id} { lastMessage_.timestamp = 0; @@ -325,6 +327,10 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj this->isSpace_ = create->content.type == mtx::events::state::room_type::space; this->isEncrypted_ = cache::isRoomEncrypted(room_id_.toStdString()); + // this connection will simplify adding the plainRoomNameChanged() signal everywhere that it + // needs to be + connect(this, &TimelineModel::roomNameChanged, this, &TimelineModel::plainRoomNameChanged); + connect( this, &TimelineModel::redactionFailed, @@ -344,6 +350,7 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj &EventStore::dataChanged, this, [this](int from, int to) { + relatedEventCacheBuster++; nhlog::ui()->debug( "data changed {} to {}", events.size() - to - 1, events.size() - from - 1); emit dataChanged(index(events.size() - to - 1, 0), @@ -443,6 +450,7 @@ TimelineModel::roleNames() const {RoomTopic, "roomTopic"}, {CallType, "callType"}, {Dump, "dump"}, + {RelatedEventCacheBuster, "relatedEventCacheBuster"}, }; } int @@ -676,6 +684,8 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r return QVariant(m); } + case RelatedEventCacheBuster: + return relatedEventCacheBuster; default: return QVariant(); } @@ -710,6 +720,14 @@ TimelineModel::data(const QModelIndex &index, int role) const return data(*event, role); } +QVariant +TimelineModel::dataById(QString id, int role, QString relatedTo) +{ + if (auto event = events.get(id.toStdString(), relatedTo.toStdString())) + return data(*event, role); + return QVariant(); +} + bool TimelineModel::canFetchMore(const QModelIndex &) const { @@ -1049,14 +1067,6 @@ TimelineModel::openUserProfile(QString userid) } void -TimelineModel::openRoomSettings() -{ - RoomSettings *settings = new RoomSettings(roomId(), this); - connect(this, &TimelineModel::roomAvatarUrlChanged, settings, &RoomSettings::avatarChanged); - openRoomSettingsDialog(settings); -} - -void TimelineModel::replyAction(QString id) { setReply(id); @@ -1292,6 +1302,14 @@ struct SendMessageVisitor sendRoomEvent<mtx::events::msg::KeyVerificationCancel, mtx::events::EventType::KeyVerificationCancel>(msg); } + void operator()(mtx::events::Sticker msg) + { + msg.type = mtx::events::EventType::Sticker; + if (cache::isRoomEncrypted(model_->room_id_.toStdString())) { + model_->sendEncryptedMessage(msg, mtx::events::EventType::Sticker); + } else + emit model_->addPendingMessageToStore(msg); + } TimelineModel *model_; }; @@ -1301,6 +1319,7 @@ TimelineModel::addPendingMessage(mtx::events::collections::TimelineEvents event) { std::visit( [](auto &msg) { + // gets overwritten for reactions and stickers in SendMessageVisitor msg.type = mtx::events::EventType::RoomMessage; msg.event_id = "m" + http::client()->generate_txn_id(); msg.sender = http::client()->user_id().to_string(); diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index a3c973d6..0e2ce153 100644 --- a/src/timeline/TimelineModel.h +++ b/src/timeline/TimelineModel.h
@@ -17,6 +17,8 @@ #include "CacheStructs.h" #include "EventStore.h" #include "InputBar.h" +#include "InviteesModel.h" +#include "MemberList.h" #include "Permissions.h" #include "ui/RoomSettings.h" #include "ui/UserProfile.h" @@ -158,7 +160,9 @@ class TimelineModel : public QAbstractListModel Q_PROPERTY(QString edit READ edit WRITE setEdit NOTIFY editChanged RESET resetEdit) Q_PROPERTY( bool paginationInProgress READ paginationInProgress NOTIFY paginationInProgressChanged) + Q_PROPERTY(QString roomId READ roomId CONSTANT) Q_PROPERTY(QString roomName READ roomName NOTIFY roomNameChanged) + Q_PROPERTY(QString plainRoomName READ plainRoomName NOTIFY plainRoomNameChanged) Q_PROPERTY(QString roomAvatarUrl READ roomAvatarUrl NOTIFY roomAvatarUrlChanged) Q_PROPERTY(QString roomTopic READ roomTopic NOTIFY roomTopicChanged) Q_PROPERTY(int roomMemberCount READ roomMemberCount NOTIFY roomMemberCountChanged) @@ -208,6 +212,7 @@ public: RoomTopic, CallType, Dump, + RelatedEventCacheBuster, }; Q_ENUM(Roles); @@ -215,10 +220,7 @@ public: int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; QVariant data(const mtx::events::collections::TimelineEvents &event, int role) const; - Q_INVOKABLE QVariant dataById(QString id, int role) - { - return data(index(idToIndex(id)), role); - } + Q_INVOKABLE QVariant dataById(QString id, int role, QString relatedTo); bool canFetchMore(const QModelIndex &) const override; void fetchMore(const QModelIndex &) override; @@ -237,7 +239,6 @@ public: Q_INVOKABLE void forwardMessage(QString eventId, QString roomId); Q_INVOKABLE void viewDecryptedRawMessage(QString id) const; Q_INVOKABLE void openUserProfile(QString userid); - Q_INVOKABLE void openRoomSettings(); Q_INVOKABLE void editAction(QString id); Q_INVOKABLE void replyAction(QString id); Q_INVOKABLE void readReceiptsAction(QString id) const; @@ -354,14 +355,13 @@ signals: void lastMessageChanged(); void notificationsChanged(); - void openRoomSettingsDialog(RoomSettings *settings); - void newMessageToSend(mtx::events::collections::TimelineEvents event); void addPendingMessageToStore(mtx::events::collections::TimelineEvents event); void updateFlowEventId(std::string event_id); void encryptionChanged(); void roomNameChanged(); + void plainRoomNameChanged(); void roomTopicChanged(); void roomAvatarUrlChanged(); void roomMemberCountChanged(); @@ -391,7 +391,7 @@ private: TimelineViewManager *manager_; InputBar input_{this}; - Permissions permissions_{this}; + Permissions permissions_; QTimer showEventTimer{this}; QString eventIdToShow; @@ -403,6 +403,8 @@ private: int notification_count = 0, highlight_count = 0; + unsigned int relatedEventCacheBuster = 0; + bool decryptDescription = true; bool m_paginationInProgress = false; bool isSpace_ = false; @@ -413,10 +415,17 @@ template<class T> void TimelineModel::sendMessageEvent(const T &content, mtx::events::EventType eventType) { - mtx::events::RoomEvent<T> msgCopy = {}; - msgCopy.content = content; - msgCopy.type = eventType; - emit newMessageToSend(msgCopy); + if constexpr (std::is_same_v<T, mtx::events::msg::StickerImage>) { + mtx::events::Sticker msgCopy = {}; + msgCopy.content = content; + msgCopy.type = eventType; + emit newMessageToSend(msgCopy); + } else { + mtx::events::RoomEvent<T> msgCopy = {}; + msgCopy.content = content; + msgCopy.type = eventType; + emit newMessageToSend(msgCopy); + } resetReply(); resetEdit(); } diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index b39ef615..a6922be7 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp
@@ -15,15 +15,19 @@ #include "ChatPage.h" #include "Clipboard.h" #include "ColorImageProvider.h" +#include "CombinedImagePackModel.h" #include "CompletionProxyModel.h" #include "DelegateChooser.h" #include "DeviceVerificationFlow.h" #include "EventAccessors.h" +#include "ImagePackListModel.h" +#include "InviteesModel.h" #include "Logging.h" #include "MainWindow.h" #include "MatrixClient.h" #include "MxcImageProvider.h" #include "RoomsModel.h" +#include "SingleImagePackModel.h" #include "UserSettingsPage.h" #include "UsersModel.h" #include "dialogs/ImageOverlay.h" @@ -144,6 +148,7 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par qRegisterMetaType<mtx::events::msg::KeyVerificationReady>(); qRegisterMetaType<mtx::events::msg::KeyVerificationRequest>(); qRegisterMetaType<mtx::events::msg::KeyVerificationStart>(); + qRegisterMetaType<CombinedImagePackModel *>(); qmlRegisterUncreatableMetaObject(qml_mtx_events::staticMetaObject, "im.nheko", @@ -172,6 +177,8 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par 0, "UserProfileModel", "UserProfile needs to be instantiated on the C++ side"); + qmlRegisterUncreatableType<MemberList>( + "im.nheko", 1, 0, "MemberList", "MemberList needs to be instantiated on the C++ side"); qmlRegisterUncreatableType<RoomSettings>( "im.nheko", 1, @@ -180,6 +187,24 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par "Room Settings needs to be instantiated on the C++ side"); qmlRegisterUncreatableType<TimelineModel>( "im.nheko", 1, 0, "Room", "Room needs to be instantiated on the C++ side"); + qmlRegisterUncreatableType<ImagePackListModel>( + "im.nheko", + 1, + 0, + "ImagePackListModel", + "ImagePackListModel needs to be instantiated on the C++ side"); + qmlRegisterUncreatableType<SingleImagePackModel>( + "im.nheko", + 1, + 0, + "SingleImagePackModel", + "SingleImagePackModel needs to be instantiated on the C++ side"); + qmlRegisterUncreatableType<InviteesModel>( + "im.nheko", + 1, + 0, + "InviteesModel", + "InviteesModel needs to be instantiated on the C++ side"); static auto self = this; qmlRegisterSingletonType<MainWindow>( @@ -341,6 +366,41 @@ TimelineViewManager::TimelineViewManager(CallManager *callManager, ChatPage *par } void +TimelineViewManager::openRoomMembers(QString room_id) +{ + MemberList *memberList = new MemberList(room_id, this); + emit openRoomMembersDialog(memberList); +} + +void +TimelineViewManager::openRoomSettings(QString room_id) +{ + RoomSettings *settings = new RoomSettings(room_id, this); + connect(rooms_->getRoomById(room_id).data(), + &TimelineModel::roomAvatarUrlChanged, + settings, + &RoomSettings::avatarChanged); + emit openRoomSettingsDialog(settings); +} + +void +TimelineViewManager::openInviteUsers(QString roomId) +{ + InviteesModel *model = new InviteesModel{this}; + connect(model, &InviteesModel::accept, this, [this, model, roomId]() { + emit inviteUsers(roomId, model->mxids()); + }); + emit openInviteUsersDialog(model); +} + +void +TimelineViewManager::openGlobalUserProfile(QString userId) +{ + UserProfile *profile = new UserProfile{QString{}, userId, this}; + emit openProfile(profile); +} + +void TimelineViewManager::setVideoCallItem() { WebRTCSession::instance().setVideoItem( @@ -398,6 +458,12 @@ TimelineViewManager::openImageOverlay(QString mxcUrl, QString eventId) } void +TimelineViewManager::openImagePackSettings(QString roomid) +{ + emit showImagePackSettings(new ImagePackListModel(roomid.toStdString(), this)); +} + +void TimelineViewManager::openImageOverlayInternal(QString eventId, QImage img) { auto pixmap = QPixmap::fromImage(img); @@ -420,17 +486,6 @@ TimelineViewManager::openImageOverlayInternal(QString eventId, QImage img) } void -TimelineViewManager::openInviteUsersDialog() -{ - MainWindow::instance()->openInviteUsersDialog( - [this](const QStringList &invitees) { emit inviteUsers(invitees); }); -} -void -TimelineViewManager::openMemberListDialog(QString roomid) const -{ - MainWindow::instance()->openMemberListDialog(roomid); -} -void TimelineViewManager::openLeaveRoomDialog(QString roomid) const { MainWindow::instance()->openLeaveRoomDialog(roomid); @@ -593,6 +648,11 @@ TimelineViewManager::completerFor(QString completerName, QString roomId) auto proxy = new CompletionProxyModel(roomModel); roomModel->setParent(proxy); return proxy; + } else if (completerName == "stickers") { + auto stickerModel = new CombinedImagePackModel(roomId.toStdString(), true); + auto proxy = new CompletionProxyModel(stickerModel, 1, static_cast<size_t>(-1) / 4); + stickerModel->setParent(proxy); + return proxy; } return nullptr; } diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h
index 15b4f523..54e3a935 100644 --- a/src/timeline/TimelineViewManager.h +++ b/src/timeline/TimelineViewManager.h
@@ -33,6 +33,7 @@ class ColorImageProvider; class UserSettings; class ChatPage; class DeviceVerificationFlow; +class ImagePackListModel; class TimelineViewManager : public QObject { @@ -57,6 +58,7 @@ public: Q_INVOKABLE bool isInitialSync() const { return isInitialSync_; } bool isWindowFocused() const { return isWindowFocused_; } Q_INVOKABLE void openImageOverlay(QString mxcUrl, QString eventId); + Q_INVOKABLE void openImagePackSettings(QString roomid); Q_INVOKABLE QColor userColor(QString id, QColor background); Q_INVOKABLE QString escapeEmoji(QString str) const; Q_INVOKABLE QString htmlEscape(QString str) const { return str.toHtmlEscaped(); } @@ -64,9 +66,12 @@ public: Q_INVOKABLE QString userPresence(QString id) const; Q_INVOKABLE QString userStatus(QString id) const; + Q_INVOKABLE void openRoomMembers(QString room_id); + Q_INVOKABLE void openRoomSettings(QString room_id); + Q_INVOKABLE void openInviteUsers(QString roomId); + Q_INVOKABLE void openGlobalUserProfile(QString userId); + Q_INVOKABLE void focusMessageInput(); - Q_INVOKABLE void openInviteUsersDialog(); - Q_INVOKABLE void openMemberListDialog(QString roomid) const; Q_INVOKABLE void openLeaveRoomDialog(QString roomid) const; Q_INVOKABLE void removeVerificationFlow(DeviceVerificationFlow *flow); @@ -81,11 +86,17 @@ signals: void replyingEventChanged(QString replyingEvent); void replyClosed(); void newDeviceVerificationRequest(DeviceVerificationFlow *flow); - void inviteUsers(QStringList users); + void inviteUsers(QString roomId, QStringList users); + void showRoomList(); + void narrowViewChanged(); void focusChanged(); void focusInput(); void openImageOverlayInternalCb(QString eventId, QImage img); + void openRoomMembersDialog(MemberList *members); + void openRoomSettingsDialog(RoomSettings *settings); + void openInviteUsersDialog(InviteesModel *invitees); void openProfile(UserProfile *profile); + void showImagePackSettings(ImagePackListModel *packlist); public slots: void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids); diff --git a/src/ui/RoomSettings.h b/src/ui/RoomSettings.h
index 2a68a182..2deaa5e3 100644 --- a/src/ui/RoomSettings.h +++ b/src/ui/RoomSettings.h
@@ -134,4 +134,4 @@ private: RoomInfo info_; int notifications_ = 0; int accessRules_ = 0; -}; \ No newline at end of file +};