From a23e2ba85408b140308500af81d213d10b926fe1 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Wed, 23 Mar 2022 01:33:19 +0100 Subject: [PATCH 01/14] Make overlap of actionMenu a bit smaller again --- resources/qml/MessageView.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml index e5dd91b9..90ba4787 100644 --- a/resources/qml/MessageView.qml +++ b/resources/qml/MessageView.qml @@ -68,7 +68,7 @@ Item { hoverEnabled: true visible: Settings.buttonsInTimeline && !!attached && (attached.hovered || hovered) x: attached ? attachedPos.x : 0 - y: attached ? attachedPos.y + Nheko.paddingMedium : 0 + y: attached ? attachedPos.y + Nheko.paddingSmall : 0 z: 10 background: Rectangle { From de1776bf514c29005e3119842027ec0c0aa5c608 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Wed, 23 Mar 2022 01:17:55 +0100 Subject: [PATCH 02/14] Upgrade qt in CI --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a58bf885..9175681b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -76,7 +76,7 @@ build-macos: stage: build tags: [macos] before_script: - #- brew update + - 'brew upgrade qt@5' #- brew reinstall --force python3 #- brew bundle --file=./.ci/macos/Brewfile --force --cleanup - rm -rf ../.hunter && mv .hunter ../.hunter || true From e92e7e71c40a4e09870b3cd64ef3436718a45abe Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Wed, 23 Mar 2022 02:07:38 +0000 Subject: [PATCH 03/14] Update qt5 for macos in notarize step --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9175681b..d85f14a4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -112,6 +112,7 @@ codesign-macos: stage: deploy tags: [macos] before_script: + - 'brew upgrade qt@5' - pip3 install dmgbuild script: - export PATH=/usr/local/opt/qt@5/bin/:${PATH} From 41c6b75efc7d5c1f3eb2c8c7819fefdca477e372 Mon Sep 17 00:00:00 2001 From: Joseph Donofry Date: Wed, 23 Mar 2022 11:00:03 -0400 Subject: [PATCH 04/14] Remove brew upgrade now that the VM is updated --- .gitlab-ci.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d85f14a4..9d6fee3c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -76,9 +76,6 @@ build-macos: stage: build tags: [macos] before_script: - - 'brew upgrade qt@5' - #- brew reinstall --force python3 - #- brew bundle --file=./.ci/macos/Brewfile --force --cleanup - rm -rf ../.hunter && mv .hunter ../.hunter || true script: - export PATH=/usr/local/opt/qt@5/bin/:${PATH} From 13baf774358e700de65ca7dc934eb276ea29442a Mon Sep 17 00:00:00 2001 From: Malte E <97891689+maltee1@users.noreply.github.com> Date: Thu, 24 Mar 2022 01:35:42 +0100 Subject: [PATCH 05/14] Better touch scrolling (#1012) --- resources/qml/MessageView.qml | 104 +++++++++++------------ resources/qml/TimelineRow.qml | 48 +++++------ resources/qml/delegates/ImageMessage.qml | 21 ++--- resources/qml/delegates/Reply.qml | 28 +++--- 4 files changed, 91 insertions(+), 110 deletions(-) diff --git a/resources/qml/MessageView.qml b/resources/qml/MessageView.qml index 90ba4787..3763c24a 100644 --- a/resources/qml/MessageView.qml +++ b/resources/qml/MessageView.qml @@ -362,7 +362,7 @@ Item { } - delegate: ItemDelegate { + delegate: Item { id: wrapper required property double proportionalHeight @@ -407,55 +407,6 @@ Item { width: chat.delegateMaxWidth height: section.active ? section.height + timelinerow.height : timelinerow.height - hoverEnabled: true - - background: Rectangle { - id: scrollHighlight - - opacity: 0 - visible: true - z: 1 - enabled: false - color: Nheko.colors.highlight - - states: State { - name: "revealed" - when: wrapper.scrolledToThis - } - - transitions: Transition { - from: "" - to: "revealed" - - SequentialAnimation { - PropertyAnimation { - target: scrollHighlight - properties: "opacity" - easing.type: Easing.InOutQuad - from: 0 - to: 1 - duration: 500 - } - - PropertyAnimation { - target: scrollHighlight - properties: "opacity" - easing.type: Easing.InOutQuad - from: 1 - to: 0 - duration: 500 - } - - ScriptAction { - script: chat.model.eventShown() - } - - } - - } - - } - Loader { id: section @@ -480,8 +431,6 @@ Item { TimelineRow { id: timelinerow - hovered: messageActions.hovered ? (messageActions.model != undefined && messageActions.model == timelinerow) : wrapper.hovered - proportionalHeight: wrapper.proportionalHeight type: chat.model, wrapper.type typeString: wrapper.typeString @@ -523,7 +472,52 @@ Item { } } } + background: Rectangle { + id: scrollHighlight + opacity: 0 + visible: true + z: 1 + enabled: false + color: Nheko.colors.highlight + + states: State { + name: "revealed" + when: wrapper.scrolledToThis + } + + transitions: Transition { + from: "" + to: "revealed" + + SequentialAnimation { + PropertyAnimation { + target: scrollHighlight + properties: "opacity" + easing.type: Easing.InOutQuad + from: 0 + to: 1 + duration: 500 + } + + PropertyAnimation { + target: scrollHighlight + properties: "opacity" + easing.type: Easing.InOutQuad + from: 1 + to: 0 + duration: 500 + } + + ScriptAction { + script: chat.model.eventShown() + } + + } + + } + + } } Connections { @@ -729,10 +723,12 @@ Item { property string text property string link + property string eventId - function show(text_, link_) { + function show(text_, link_, eventId_) { text = text_; link = link_; + eventId = eventId_; open(); } @@ -754,7 +750,7 @@ Item { visible: true enabled: visible text: qsTr("&Go to quoted message") - onTriggered: chat.model.showEvent(eventId) + onTriggered: chat.model.showEvent(replyContextMenu.eventId) } } diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml index 032821ba..947ba030 100644 --- a/resources/qml/TimelineRow.qml +++ b/resources/qml/TimelineRow.qml @@ -11,7 +11,7 @@ import QtQuick.Layouts 1.2 import QtQuick.Window 2.13 import im.nheko 1.0 -Item { +AbstractButton { id: r required property double proportionalHeight @@ -46,7 +46,7 @@ Item { required property int status required property int relatedEventCacheBuster - property bool hovered: false + hoverEnabled: true width: parent.width height: row.height+(reactionRow.height > 0 ? reactionRow.height-2 : 0 ) @@ -55,21 +55,18 @@ Item { color: (Settings.messageHoverHighlight && hovered) ? Nheko.colors.alternateBase : "transparent" anchors.fill: parent // this looks better without margins + TapHandler { + acceptedButtons: Qt.RightButton + onSingleTapped: messageContextMenu.show(eventId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText) + gesturePolicy: TapHandler.ReleaseWithinBounds + } } - TapHandler { - acceptedButtons: Qt.RightButton - onSingleTapped: messageContextMenu.show(eventId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText) - gesturePolicy: TapHandler.ReleaseWithinBounds - } - TapHandler { - onLongPressed: messageContextMenu.show(eventId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText) - onDoubleTapped: chat.model.reply = eventId - gesturePolicy: TapHandler.ReleaseWithinBounds - } + onPressAndHold: messageContextMenu.show(eventId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText) + onDoubleClicked: chat.model.reply = eventId - Control { + Rectangle { id: row property bool bubbleOnRight : isSender && Settings.bubbles anchors.leftMargin: isStateEvent || Settings.smallAvatars? 0 : Nheko.avatarSize+8 // align bubble with section header @@ -78,20 +75,21 @@ Item { anchors.horizontalCenter: isStateEvent? parent.horizontalCenter : undefined property int maxWidth: (parent.width-(Settings.smallAvatars || isStateEvent? 0 : Nheko.avatarSize+8))*(Settings.bubbles && !isStateEvent? 0.9 : 1) width: Settings.bubbles? Math.min(maxWidth,Math.max(reply.implicitWidth+8,contentItem.implicitWidth+metadata.width+20)) : maxWidth + height: msg.height+msg.anchors.margins*2 - leftPadding: 4 - rightPadding: (Settings.bubbles && !isStateEvent)? 4: 2 - topPadding: rightPadding - bottomPadding: topPadding - background: Rectangle { - property color userColor: TimelineManager.userColor(userId, Nheko.colors.base) - property color bgColor: Nheko.colors.base - color: Qt.tint(bgColor, Qt.hsla(userColor.hslHue, 0.5, userColor.hslLightness, 0.2)) - radius: 4 - visible: Settings.bubbles && !isStateEvent - } + property color userColor: TimelineManager.userColor(userId, Nheko.colors.base) + property color bgColor: Nheko.colors.base + color: (Settings.bubbles && !isStateEvent) ? Qt.tint(bgColor, Qt.hsla(userColor.hslHue, 0.5, userColor.hslLightness, 0.2)) : "#00000000" + radius: 4 - contentItem: GridLayout { + GridLayout { + anchors { + left: parent.left + top: parent.top + right: parent.right + margins: (Settings.bubbles && ! isStateEvent)? 4 : 2 + leftMargin: 4 + } id: msg rowSpacing: 0 columnSpacing: 2 diff --git a/resources/qml/delegates/ImageMessage.qml b/resources/qml/delegates/ImageMessage.qml index 2ee8da7f..23cca019 100644 --- a/resources/qml/delegates/ImageMessage.qml +++ b/resources/qml/delegates/ImageMessage.qml @@ -5,9 +5,10 @@ import QtQuick 2.15 import QtQuick.Window 2.15 +import QtQuick.Controls 2.3 import im.nheko 1.0 -Item { +AbstractButton { required property int type required property int originalWidth required property double proportionalHeight @@ -24,6 +25,7 @@ Item { implicitWidth: Math.round(tempWidth*Math.min((timelineView.height/divisor)/(tempWidth*proportionalHeight), 1)) width: Math.min(parent.width,implicitWidth) height: width*proportionalHeight + hoverEnabled: true property int metadataWidth property bool fitsMetadata: (parent.width - width) > metadataWidth+4 @@ -61,28 +63,17 @@ Item { visible: loaded anchors.fill: parent roomm: room - play: !Settings.animateImagesOnHover || mouseArea.hovered + play: !Settings.animateImagesOnHover || parent.hovered eventId: parent.eventId } - TapHandler { - //enabled: type == MtxEvent.ImageMessage && (img.status == Image.Ready || mxcimage.loaded) - onSingleTapped: { - Settings.openImageExternal ? room.openMedia(eventId) : TimelineManager.openImageOverlay(room, url, eventId); - eventPoint.accepted = true; - } - gesturePolicy: TapHandler.ReleaseWithinBounds - } - - HoverHandler { - id: mouseArea - } + onClicked :Settings.openImageExternal ? room.openMedia(eventId) : TimelineManager.openImageOverlay(room, url, eventId); Item { id: overlay anchors.fill: parent - visible: mouseArea.hovered + visible: parent.hovered Rectangle { id: container diff --git a/resources/qml/delegates/Reply.qml b/resources/qml/delegates/Reply.qml index 27fb4e07..53a007fe 100644 --- a/resources/qml/delegates/Reply.qml +++ b/resources/qml/delegates/Reply.qml @@ -11,7 +11,7 @@ import QtQuick.Window 2.13 import im.nheko 1.0 import "../" -Item { +AbstractButton { id: r property color userColor: "red" @@ -57,6 +57,16 @@ Item { color: TimelineManager.userColor(userId, Nheko.colors.base) } + onClicked: { + let link = reply.child.linkAt != undefined && reply.child.linkAt(pressX-colorLine.width, pressY - userName_.implicitHeight); + if (link) { + Nheko.openLink(link) + } else { + room.showEvent(r.eventId) + } + } + onPressAndHold: replyContextMenu.show(reply.child.copyText, reply.child.linkAt(pressX-colorLine.width, pressY - userName_.implicitHeight), r.eventId) + ColumnLayout { id: replyContainer @@ -64,23 +74,9 @@ Item { width: parent.width - 4 spacing: 0 - TapHandler { - acceptedButtons: Qt.LeftButton - onSingleTapped: { - let link = reply.child.linkAt != undefined && reply.child.linkAt(eventPoint.position.x, eventPoint.position.y - userName_.implicitHeight); - if (link) { - Nheko.openLink(link) - } else { - room.showEvent(r.eventId) - } - } - gesturePolicy: TapHandler.ReleaseWithinBounds - } - TapHandler { acceptedButtons: Qt.RightButton - onLongPressed: replyContextMenu.show(reply.child.copyText, reply.child.linkAt(eventPoint.position.x, eventPoint.position.y - userName_.implicitHeight)) - onSingleTapped: replyContextMenu.show(reply.child.copyText, reply.child.linkAt(eventPoint.position.x, eventPoint.position.y - userName_.implicitHeight)) + onSingleTapped: replyContextMenu.show(reply.child.copyText, reply.child.linkAt(eventPoint.position.x, eventPoint.position.y - userName_.implicitHeight), r.eventId) gesturePolicy: TapHandler.ReleaseWithinBounds } From b152a2b874e4f7f8e4ebf6018d059764432dec39 Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 23 Mar 2022 21:50:08 -0400 Subject: [PATCH 06/14] Translated using Weblate (Estonian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (702 of 702 strings) Co-authored-by: Priit Jõerüüt Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/et/ Translation: Nheko/nheko --- resources/langs/nheko_et.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/resources/langs/nheko_et.ts b/resources/langs/nheko_et.ts index dd2b84f7..f5b94702 100644 --- a/resources/langs/nheko_et.ts +++ b/resources/langs/nheko_et.ts @@ -1231,7 +1231,7 @@ Näiteks: https://server.minu:8787 Failed to upload media. Please try again. - Meediafailide üleslaadimine ei õnnestunud. Palun proovi uuesti. + Meediafailide üleslaadimine ei õnnestunud. Palun proovi uuesti. @@ -2820,9 +2820,9 @@ Põhjus: %4 Upload %n file(s) - - - + + Laadi fail üles + Laadi %n faili üles @@ -3393,13 +3393,15 @@ See tavaliselt tähendab, et rakenduse ikoon tegumiribal annab mingit sorti anim Opens images with an external program when tapping the image. Note that when this option is ON, opened files are left unencrypted on disk and must be manually deleted. - + Pildile klõpsimisel avab need välises rakenduses. +Kui see valik on sisse lülitatud, siis failid jäävad andmekandjale krüptimata kujul ning sa pead neid eraldi kustutama. Opens videos with an external program when tapping the video. Note that when this option is ON, opened files are left unencrypted on disk and must be manually deleted. - + Videole klõpsimisel avab need välises rakenduses. +Kui see valik on sisse lülitatud, siis failid jäävad andmekandjale krüptimata kujul ning sa pead neid eraldi kustutama. From c59c8b6f3c2ad3f0ebde7b5d2113e3c3801e8fec Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 23 Mar 2022 21:50:08 -0400 Subject: [PATCH 07/14] Translated using Weblate (Indonesian) Currently translated at 100.0% (702 of 702 strings) Co-authored-by: Linerly Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/id/ Translation: Nheko/nheko --- resources/langs/nheko_id.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/resources/langs/nheko_id.ts b/resources/langs/nheko_id.ts index 0d955d53..04f8b368 100644 --- a/resources/langs/nheko_id.ts +++ b/resources/langs/nheko_id.ts @@ -1229,7 +1229,7 @@ Misalnya: https://server.my:8787 Failed to upload media. Please try again. - Gagal untuk mengunggah media. Silakan coba lagi. + Gagal untuk mengunggah media. Silakan coba lagi. @@ -2815,8 +2815,8 @@ Alasan: %4 Upload %n file(s) - - + + Unggah %n file @@ -3387,13 +3387,15 @@ Ini biasanya menyebabkan ikon aplikasi di bilah tugas untuk beranimasi. Opens images with an external program when tapping the image. Note that when this option is ON, opened files are left unencrypted on disk and must be manually deleted. - + Membuka gambar dengan sebuah program eksternal ketika mengetuk pada gambar. +Dicatat bahwa ketika opsi ini NYALA, file yang terbuka ditinggal tidak terenkripsi pada disk dan harus dihapus secara manual. Opens videos with an external program when tapping the video. Note that when this option is ON, opened files are left unencrypted on disk and must be manually deleted. - + Membuka video dengan sebuah program eksternal ketika mengetuk pada video. +Dicatat bahwa ketika opsi ini NYALA, file yang terbuka ditinggal tidak terenkripsi pada disk dan harus dihapus secara manual. From 179ae53b409f6f987e726e67991a77c57f022601 Mon Sep 17 00:00:00 2001 From: tastytea Date: Thu, 24 Mar 2022 19:34:20 +0100 Subject: [PATCH 08/14] Don't send thumbnails that are larger than the original - Set PNG compression to maximum - Don't upload thumbnail if it is not at least 10% smaller than the original --- src/timeline/InputBar.cpp | 70 ++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp index a82796a8..d5c2d428 100644 --- a/src/timeline/InputBar.cpp +++ b/src/timeline/InputBar.cpp @@ -896,39 +896,47 @@ MediaUpload::startUpload() QByteArray ba; QBuffer buffer(&ba); buffer.open(QIODevice::WriteOnly); - thumbnail_.save(&buffer, "PNG"); - auto payload = std::string(ba.data(), ba.size()); - if (encrypt_) { - mtx::crypto::BinaryBuf buf; - std::tie(buf, thumbnailEncryptedFile) = mtx::crypto::encrypt_file(std::move(payload)); - payload = mtx::crypto::to_string(buf); - } - thumbnailSize_ = payload.size(); + thumbnail_.save(&buffer, "PNG", 0); + if (ba.size() >= (data.size() - data.size() / 10)) { + nhlog::ui()->info( + "Thumbnail is not a lot smaller than original image, not uploading it"); + nhlog::ui()->debug( + "\n Image size: {:9d}\nThumbnail size: {:9d}", data.size(), ba.size()); + } else { + auto payload = std::string(ba.data(), ba.size()); + if (encrypt_) { + mtx::crypto::BinaryBuf buf; + std::tie(buf, thumbnailEncryptedFile) = + mtx::crypto::encrypt_file(std::move(payload)); + payload = mtx::crypto::to_string(buf); + } + thumbnailSize_ = payload.size(); + + http::client()->upload( + payload, + encryptedFile ? "application/octet-stream" : "image/png", + "", + [this](const mtx::responses::ContentURI &res, mtx::http::RequestErr err) mutable { + if (err) { + emit ChatPage::instance()->showNotification( + tr("Failed to upload media. Please try again.")); + nhlog::net()->warn("failed to upload media: {} {} ({})", + err->matrix_error.error, + to_string(err->matrix_error.errcode), + static_cast(err->status_code)); + thumbnail_ = QImage(); + startUpload(); + return; + } + + thumbnailUrl_ = QString::fromStdString(res.content_uri); + if (thumbnailEncryptedFile) + thumbnailEncryptedFile->url = res.content_uri; - http::client()->upload( - payload, - encryptedFile ? "application/octet-stream" : "image/png", - "", - [this](const mtx::responses::ContentURI &res, mtx::http::RequestErr err) mutable { - if (err) { - emit ChatPage::instance()->showNotification( - tr("Failed to upload media. Please try again.")); - nhlog::net()->warn("failed to upload media: {} {} ({})", - err->matrix_error.error, - to_string(err->matrix_error.errcode), - static_cast(err->status_code)); - thumbnail_ = QImage(); startUpload(); - return; - } - - thumbnailUrl_ = QString::fromStdString(res.content_uri); - if (thumbnailEncryptedFile) - thumbnailEncryptedFile->url = res.content_uri; - - startUpload(); - }); - return; + }); + return; + } } auto payload = std::string(data.data(), data.size()); From 87fa9a4edd82fddd015c3e7ace273ced69102612 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Fri, 25 Mar 2022 01:16:28 +0100 Subject: [PATCH 09/14] Update CHANGELOG --- CHANGELOG.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa769416..8c9f964f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,54 @@ # Changelog +## [0.9.3] -- unreleased + +### Highlights + +- New upload UX + - Queue multiple uploads by pasting or dragging multiple files. + - Videos will now properly have a thumbnail as well as images. + - Duration, width and height is now also properly included so that clients can resize appropriately. + - Thumbnails are excluded if they are bigger than the original image. (tastytea) +- Improvements for mobile devices (Malte E) + - You should now be able to scroll by touching anywhere with no random dead zones. + - Preedit text can now be used in a completer and is properly sent + - If an input method is active, pressing Enter will not send the current message. + +### Features + +- Optionally always open videos and images in an external program. (math) + +### Improvements + +- Build macOS releases against Qt 5.15.3 to resolve missing spaces after some punctuation. +- Send the shortcode as the body for stickers without a body. +- Elide long usernames in the timeline. (Malte E) +- Cleanup the reply popup. (Malte E) +- Use standard buttons where possible. (tastytea) +- Various improvements to the bubble layout. (Malte E) +- Enable online key backup by default. +- Update the bundled gstreamer in our Flatpaks. + +### Translations + +- Indonesian (Linerly) +- Estonian (Priit) +- Finnish (Priit) +#- Spanish (Lluise, Diego Collado, Richard, Edd Ludd, Drake) +#- Catalan (Edd Ludd) +#- French (ISSOtm) +#- Dutch (Thulinma) +#- Chinese (hulb) + +### Bugfixes + +- Fix hovering the action menu. +- Try to avoid using unknown UIA flows. +- Don't Components actively in use. +- Fix screensharing. +- Fix device id when doing SSO logins. + + ## [0.9.2] -- 2022-03-09 ### Highlights From 9bac429eaee53b4f34c675eff494d3953418c688 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Fri, 25 Mar 2022 01:32:42 +0100 Subject: [PATCH 10/14] Release v0.9.3 --- CHANGELOG.md | 8 ++------ CMakeLists.txt | 2 +- appveyor.yml | 8 ++++---- resources/nheko.appdata.xml | 3 ++- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c9f964f..e24f7c30 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [0.9.3] -- unreleased +## [0.9.3] -- 2022-03-25 ### Highlights @@ -34,11 +34,7 @@ - Indonesian (Linerly) - Estonian (Priit) - Finnish (Priit) -#- Spanish (Lluise, Diego Collado, Richard, Edd Ludd, Drake) -#- Catalan (Edd Ludd) -#- French (ISSOtm) -#- Dutch (Thulinma) -#- Chinese (hulb) +- Esperanto (Tirifto) ### Bugfixes diff --git a/CMakeLists.txt b/CMakeLists.txt index 550a3aa4..7594d22b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,7 +106,7 @@ include(GNUInstallDirs) set(CPACK_PACKAGE_VERSION_MAJOR "0") set(CPACK_PACKAGE_VERSION_MINOR "9") -set(CPACK_PACKAGE_VERSION_PATCH "2") +set(CPACK_PACKAGE_VERSION_PATCH "3") set(PROJECT_VERSION_MAJOR ${CPACK_PACKAGE_VERSION_MAJOR}) set(PROJECT_VERSION_MINOR ${CPACK_PACKAGE_VERSION_MINOR}) set(PROJECT_VERSION_PATCH ${CPACK_PACKAGE_VERSION_PATCH}) diff --git a/appveyor.yml b/appveyor.yml index 0ceaab79..6125ae7c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -31,8 +31,8 @@ build_script: # VERSION format: branch-master/branch-1.2 # INSTVERSION format: x.y.z # WINVERSION format: 9999.0.0.123/1.2.0.234 - - if "%APPVEYOR_REPO_TAG%"=="false" set INSTVERSION=0.9.2 - - if "%APPVEYOR_REPO_TAG%"=="false" set VERSION=0.9.2 + - if "%APPVEYOR_REPO_TAG%"=="false" set INSTVERSION=0.9.3 + - if "%APPVEYOR_REPO_TAG%"=="false" set VERSION=0.9.3 - if "%APPVEYOR_REPO_TAG%"=="false" if "%APPVEYOR_REPO_BRANCH%"=="master" set INSTVERSION=9999.0 - if "%APPVEYOR_REPO_TAG%"=="false" set WINVERSION=%INSTVERSION%.0.%APPVEYOR_BUILD_NUMBER% # VERSION format: v1.2.3/v1.3.4 @@ -94,8 +94,8 @@ after_build: - copy %BUILD%\deploy\installer\gui\package.xml installer\packages\io.github.nhekoreborn.nheko\meta - copy %BUILD%\deploy\installer\gui\installscript.qs installer\packages\io.github.nhekoreborn.nheko\meta # Amend version and date - - sed -i "s/__VERSION__/0.9.2/" installer\config\config.xml - - sed -i "s/__VERSION__/0.9.2/" installer\packages\io.github.nhekoreborn.nheko\meta\package.xml + - sed -i "s/__VERSION__/0.9.3/" installer\config\config.xml + - sed -i "s/__VERSION__/0.9.3/" installer\packages\io.github.nhekoreborn.nheko\meta\package.xml - sed -i "s/__DATE__/%DATE%/" installer\packages\io.github.nhekoreborn.nheko\meta\package.xml # Copy nheko data - xcopy NhekoData\*.* installer\packages\io.github.nhekoreborn.nheko\data\*.* /s /e /c /y diff --git a/resources/nheko.appdata.xml b/resources/nheko.appdata.xml index 597d7b9c..5aafdc6d 100644 --- a/resources/nheko.appdata.xml +++ b/resources/nheko.appdata.xml @@ -56,7 +56,8 @@ https://github.com/Nheko-Reborn/nheko https://github.com/Nheko-Reborn - + + From 7256c70108c17dbf04a3723d29b829b0fd7dffef Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Fri, 25 Mar 2022 18:40:27 +0100 Subject: [PATCH 11/14] Fix crash on missing pack description --- src/Cache.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Cache.cpp b/src/Cache.cpp index be3dfe69..30077850 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -3708,8 +3708,10 @@ Cache::getImagePacks(const std::string &room_id, std::optional stickers) auto addPack = [&infos, stickers](const mtx::events::msc2545::ImagePack &pack, const std::string &source_room, const std::string &state_key) { - bool pack_matches = !stickers.has_value() || - (stickers.value() ? pack.pack->is_sticker() : pack.pack->is_emoji()); + bool pack_is_sticker = pack.pack ? pack.pack->is_sticker() : true; + bool pack_is_emoji = pack.pack ? pack.pack->is_emoji() : true; + bool pack_matches = + !stickers.has_value() || (stickers.value() ? pack_is_sticker : pack_is_emoji); ImagePackInfo info; info.source_room = source_room; From ca1fe55d8cbea4695bcfe5f976ad11e07c480bec Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 25 Mar 2022 23:59:27 -0400 Subject: [PATCH 12/14] Translated using Weblate (French) Currently translated at 100.0% (702 of 702 strings) Translated using Weblate (French) Currently translated at 100.0% (702 of 702 strings) Co-authored-by: Eldred HABERT Co-authored-by: Glandos Co-authored-by: Weblate Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/fr/ Translation: Nheko/nheko --- resources/langs/nheko_fr.ts | 251 ++++++++++++++++++------------------ 1 file changed, 128 insertions(+), 123 deletions(-) diff --git a/resources/langs/nheko_fr.ts b/resources/langs/nheko_fr.ts index 2d025f83..0049dc9f 100644 --- a/resources/langs/nheko_fr.ts +++ b/resources/langs/nheko_fr.ts @@ -95,12 +95,12 @@ Unknown microphone: %1 - Microphone inconnu : %1 + Microphone inconnu : %1 Unknown camera: %1 - Caméra inconnue : %1 + Caméra inconnue : %1 @@ -147,7 +147,7 @@ Failed to open database, logging out! - Impossible d'ouvrir la base de données, déconnexion ! + Impossible d'ouvrir la base de données, déconnexion ! @@ -173,12 +173,12 @@ Do you really want to invite %1 (%2)? - Voulez-vous vraiment inviter %1 (%2) ? + Voulez-vous vraiment inviter %1 (%2) ? Failed to invite %1 to %2: %3 - Échec de l'invitation de %1 dans %2 : %3 + Échec de l'invitation de %1 dans %2 : %3 @@ -203,12 +203,12 @@ Do you really want to unban %1 (%2)? - Voulez-vous vraiment annuler le bannissement de %1 (%2) ? + Voulez-vous vraiment annuler le bannissement de %1 (%2) ? Failed to unban %1 in %2: %3 - Échec de l'annulation du bannissement de %1 dans %2 : %3 + Échec de l'annulation du bannissement de %1 dans %2 : %3 @@ -223,7 +223,7 @@ Cache migration failed! - Échec de la migration du cache ! + Échec de la migration du cache ! @@ -245,18 +245,18 @@ Failed to setup encryption keys. Server response: %1 %2. Please try again later. - Échec de la configuration des clés de chiffrement. Réponse du serveur : %1 %2. Veuillez réessayer plus tard. + Échec de la configuration des clés de chiffrement. Réponse du serveur : %1 %2. Veuillez réessayer plus tard. Please try to login again: %1 - Veuillez re-tenter vous reconnecter : %1 + Veuillez re-tenter vous reconnecter : %1 Failed to join room: %1 - Impossible de rejoindre le salon : %1 + Impossible de rejoindre le salon : %1 @@ -266,42 +266,42 @@ Failed to remove invite: %1 - Impossible de supprimer l'invitation : %1 + Impossible de supprimer l'invitation : %1 Room creation failed: %1 - Échec de la création du salon : %1 + Échec de la création du salon : %1 Failed to leave room: %1 - Impossible de quitter le salon : %1 + Impossible de quitter le salon : %1 Reason for the kick - + Motif de l’expulsion Enter reason for kicking %1 (%2) or hit enter for no reason: - + Saisissez le motif de l'expulsion de %1 (%2), ou appuyez sur entrée pour l'omettre : Failed to kick %1 from %2: %3 - Échec de l'expulsion de %1 de %2  : %3 + Échec de l'expulsion de %1 de %2  : %3 Reason for the ban - + Motif du bannissement Enter reason for banning %1 (%2) or hit enter for no reason: - + Saisissez le motif du bannissement de %1 (%2), ou appuyez sur entrée pour l'omettre : @@ -390,12 +390,12 @@ Enter your recovery key or passphrase to decrypt your secrets: - Entrez votre clé de récupération ou phrase de passe pour déchiffrer vos secrets : + Entrez votre clé de récupération ou phrase de passe pour déchiffrer vos secrets : Enter your recovery key or passphrase called %1 to decrypt your secrets: - Entrez votre clé de récupération ou votre phrase de passe nommée %1 pour déchiffrer vos secrets : + Entrez votre clé de récupération ou votre phrase de passe nommée %1 pour déchiffrer vos secrets : @@ -418,17 +418,17 @@ Please verify the following digits. You should see the same numbers on both sides. If they differ, please press 'They do not match!' to abort verification! - Veuillez vérifier les chiffres suivants. Vous devriez voir les mêmes chiffres des deux côtés. Si ceux-ci diffèrent, veuillez choisir « Ils sont différents ! » pour annuler la vérification ! + Veuillez vérifier les chiffres suivants. Vous devriez voir les mêmes chiffres des deux côtés. Si ceux-ci diffèrent, veuillez choisir « Ils sont différents ! » pour annuler la vérification ! They do not match! - Ils sont différents ! + Ils sont différents ! They match! - Ils sont identiques ! + Ils sont identiques ! @@ -436,12 +436,12 @@ Room Settings - Configuration du salon + Configuration du salon %n member(s) - + %n membre %n membres @@ -449,133 +449,134 @@ SETTINGS - CONFIGURATION + CONFIGURATION Notifications - Notifications + Notifications Muted - En sourdine + En sourdine Mentions only - Seulement les mentions + Seulement les mentions All messages - Tous les messages + Tous les messages Room access - Accès au salon + Accès au salon Anyone and guests - Tous le monde et les invités + Tous le monde et les invités Anyone - Tout le monde + Tout le monde Invited users - Utilisateurs invités + Utilisateurs invités By knocking - En toquant + En toquant Restricted by membership in other rooms - Restreint par l'appartenance à d'autre salons + Restreint par l'appartenance à d'autre salons Encryption - Chiffrement + Chiffrement End-to-End Encryption - Chiffrement bout-à-bout + Chiffrement de bout en bout Encryption is currently experimental and things might break unexpectedly. <br> Please take note that it can't be disabled afterwards. - + Le chiffrement est expérimental pour le moment, à vos risques et périls. <br> +Veuillez noter qu'il ne pourra plus être désactivé par la suite. Sticker & Emote Settings - Paramètres des autocollants & emotes + Paramètres des autocollants & emotes Change - Modifier + Modifier Change what packs are enabled, remove packs or create new ones - Modifier quels paquets sont activés, retirer des paquets ou bien en créer de nouveaux + Modifier quels paquets sont activés, supprimer des paquets, en créer des nouveaux Hidden events - Évènements cachés + Évènements cachés Configure - Configurer + Configurer Select events to hide in this room - Sélectionner les évènements à cacher dans ce salon + Sélectionnez les évènements à cacher dans ce salon INFO - INFO + INFO Internal ID - Identifiant interne + Identifiant interne Copied to clipboard - + Copié dans le presse-papiers Room Version - Version du salon + Version du salon show less - + montrer moins show more - + montrer plus @@ -659,17 +660,17 @@ Please verify the following emoji. You should see the same emoji on both sides. If they differ, please press 'They do not match!' to abort verification! - Veuillez vérifier les émoji suivants. Vous devriez voir les mêmes émoji des deux côtés. S'ils diffèrent, veuillez choisir « Ils sont différents ! » pour annuler la vérification ! + Veuillez vérifier les émoji suivants. Vous devriez voir les mêmes émoji des deux côtés. S'ils diffèrent, veuillez choisir « Ils sont différents ! » pour annuler la vérification ! They do not match! - Ils sont différents ! + Ils sont différents ! They match! - Ils sont identiques ! + Ils sont identiques ! @@ -720,7 +721,7 @@ This message is not encrypted! - Ce message n'est pas chiffré ! + Ce message n'est pas chiffré ! @@ -753,7 +754,7 @@ Key mismatch detected! - Clés non correspondantes détectées ! + Clés non correspondantes détectées ! @@ -768,7 +769,7 @@ Verification messages received out of order! - Messages de vérification reçus dans le désordre ! + Messages de vérification reçus dans le désordre ! @@ -813,12 +814,12 @@ These events will be <b>shown</b> in %1: - + Ces évènements seront <b>affichés</b> dans %1 : These events will be <b>shown</b> in all rooms: - + Ces évènements seront <b>affichés</b> dans tous les salons : @@ -1080,9 +1081,9 @@ You can also put your homeserver address there, if your server doesn't support .well-known lookup. Example: @user:server.my If Nheko fails to discover your homeserver, it will show you a field to enter the server manually. - Votre nom de connexion. Un mxid doit commencer par un « @ » suivi de l'identifiant. L'identifiant doit être suivi du nom de serveur, séparé de celui-ci par « : ». + Votre nom de connexion. Un mxid doit commencer par un « @ » suivi de l'identifiant. L'identifiant doit être suivi du nom de serveur, séparé de celui-ci par « : ». Vous pouvez également spécifier l'adresse de votre serveur ici, si votre serveur ne supporte pas l'identification .well-known. -Exemple : @utilisateur :monserveur.example.com +Exemple : @utilisateur :monserveur.example.com Si Nheko n'arrive pas à trouver votre serveur, il vous proposera de l'indiquer manuellement. @@ -1120,7 +1121,7 @@ Si Nheko n'arrive pas à trouver votre serveur, il vous proposera de l&apos The address that can be used to contact you homeservers client API. Example: https://server.my:8787 L'adresse qui peut être utilisée pour joindre l'API client de votre serveur. -Exemple : https ://monserveur.example.com:8787 +Exemple : https ://monserveur.example.com:8787 @@ -1138,7 +1139,7 @@ Exemple : https ://monserveur.example.com:8787 You have entered an invalid Matrix ID e.g @joe:matrix.org - Vous avez entré un identifiant Matrix invalide exemple correct : @moi:monserveur.example.com) + Vous avez entré un identifiant Matrix invalide exemple correct : @moi:monserveur.example.com) @@ -1168,27 +1169,27 @@ Exemple : https ://monserveur.example.com:8787 Sign in with Apple - + Se connecter avec Apple Continue with Facebook - + Continuer avec Facebook Sign in with Google - + Connexion avec Google Sign in with Twitter - + Connexion avec Twitter Login using %1 - + Connexion avec %1 @@ -1216,12 +1217,12 @@ Exemple : https ://monserveur.example.com:8787 A call is in progress. Log out? - Un appel est en cours. Se déconnecter ? + Un appel est en cours. Se déconnecter ? Are you sure you want to log out? - Êtes-vous certain de vouloir vous déconnecter ? + Êtes-vous certain de vouloir vous déconnecter ? @@ -1230,7 +1231,7 @@ Exemple : https ://monserveur.example.com:8787 Failed to upload media. Please try again. - Échec de l'envoi du média. Veuillez réessayer. + Échec de l'envoi du média. Veuillez réessayer. @@ -1293,7 +1294,7 @@ Exemple : https ://monserveur.example.com:8787 %1 created and configured room: %2 - %1 a créé et configuré le salon : %2 + %1 a créé et configuré le salon : %2 @@ -1399,12 +1400,12 @@ Exemple : https ://monserveur.example.com:8787 Reason for removal - + Raison de la suppression Enter reason for removal or hit enter for no reason: - + Entrez la raison de la suppression, ou appuyez sur entrée pour l'omettre : @@ -1509,12 +1510,12 @@ Exemple : https ://monserveur.example.com:8787 To allow other users to see, which of your devices actually belong to you, you can verify them. This also allows key backup to work automatically. Verify an unverified device now? (Please make sure you have one of those devices available.) - Pour permettre à d'autres utilisateurs de confirmer qu'un appareil est vraiment le vôtre, vous pouvez le vérifier. Cela permet également aux sauvegardes de clés de déchiffrement de fonctionner automatiquement sur ces appareils, pour ne pas perdre vos messages chiffrés. Vérifier un appareil maintenant ? (Vérifiez que celui-ci est à proximité). + Pour permettre à d'autres utilisateurs de confirmer qu'un appareil est vraiment le vôtre, vous pouvez le vérifier. Cela permet également aux sauvegardes de clés de déchiffrement de fonctionner automatiquement sur ces appareils, pour ne pas perdre vos messages chiffrés. Vérifier un appareil maintenant ? (Vérifiez que celui-ci est à proximité). To allow other users to see, which of your devices actually belong to you, you can verify them. This also allows key backup to work automatically. Verify %1 now? - Pour permettre aux autres utilisateurs de vérifier quels appareils de votre compte sont réellement les vôtres, vous pouvez les vérifier. Cela permet également à la sauvegarde des clés de fonctionner automatiquement. Vérifier %1 maintenant ? + Pour permettre aux autres utilisateurs de vérifier quels appareils de votre compte sont réellement les vôtres, vous pouvez les vérifier. Cela permet également à la sauvegarde des clés de fonctionner automatiquement. Vérifier %1 maintenant ? @@ -1602,7 +1603,7 @@ Exemple : https ://monserveur.example.com:8787 Place a call to %1? - Appeler %1 ? + Appeler %1 ? @@ -1635,7 +1636,7 @@ Exemple : https ://monserveur.example.com:8787 unimplemented event: - Évènement non implémenté : + Évènement non implémenté : @@ -1801,7 +1802,7 @@ Exemple : https ://monserveur.example.com:8787 Cancel Edit - + Annuler les modifications @@ -1850,7 +1851,7 @@ Exemple : https ://monserveur.example.com:8787 Tag room as: - Étiqueter le salon comme : + Étiqueter le salon comme : @@ -2077,7 +2078,8 @@ Exemple : https ://monserveur.example.com:8787 Encryption is currently experimental and things might break unexpectedly. <br> Please take note that it can't be disabled afterwards. - + Le chiffrement est expérimental pour le moment, à vos risques et périls. <br> +Veuillez noter qu'il ne pourra plus être désactivé par la suite. @@ -2122,7 +2124,7 @@ Exemple : https ://monserveur.example.com:8787 Copied to clipboard - + Copié dans le presse-papiers @@ -2132,17 +2134,17 @@ Exemple : https ://monserveur.example.com:8787 show less - + montrer moins show more - + montrer plus Failed to enable encryption: %1 - Échec de l'activation du chiffrement : %1 + Échec de l'activation du chiffrement : %1 @@ -2162,13 +2164,13 @@ Exemple : https ://monserveur.example.com:8787 Error while reading file: %1 - Erreur lors de la lecture du fichier : %1 + Erreur lors de la lecture du fichier : %1 Failed to upload image: %s - Échec de l'envoi de l'image : %s + Échec de l'envoi de l'image : %s @@ -2194,22 +2196,22 @@ Exemple : https ://monserveur.example.com:8787 Please enter your login password to continue: - Veuillez saisir votre mot de passe pour continuer : + Veuillez saisir votre mot de passe pour continuer : Please enter a valid email address to continue: - Veuillez saisir un courriel valide pour continuer : + Veuillez saisir un courriel valide pour continuer : Please enter a valid phone number to continue: - Veuillez saisir un numéro de téléphone valide pour continuer : + Veuillez saisir un numéro de téléphone valide pour continuer : Please enter the token, which has been sent to you: - Veuillez entrer le jeton qui vous a été envoyé : + Veuillez entrer le jeton qui vous a été envoyé : @@ -2222,17 +2224,17 @@ Exemple : https ://monserveur.example.com:8787 Share desktop with %1? - Partager le bureau avec %1  ? + Partager le bureau avec %1  ? Window: - Fenêtre : + Fenêtre : Frame rate: - Fréquence d'images : + Fréquence d'images : @@ -2281,7 +2283,7 @@ Exemple : https ://monserveur.example.com:8787 Nheko could not connect to the secure storage to save encryption secrets to. This can have multiple reasons. Check if your D-Bus service is running and you have configured a service like KWallet, Gnome Keyring, KeePassXC or the equivalent for your platform. If you are having trouble, feel free to open an issue here: https://github.com/Nheko-Reborn/nheko/issues - Nheko n'a pas pu se connecter au stockage sécurisé afin d'y sauvegarder les clés de chiffrement. Cela peut avoir différentes causes. Vérifiez si votre service D-Bus est lancé, et si vous avez configuré un service tel que KWallet ; Gnome Keyring ; KeePassXC ou l'équivalent pour votre système. Si vous n'arrivez pas à résoudre le problème, n'hésitez pas à nous en faire part ici : https ://github.com/Nheko-Reborn/nheko/issues + Nheko n'a pas pu se connecter au stockage sécurisé afin d'y sauvegarder les clés de chiffrement. Cela peut avoir différentes causes. Vérifiez si votre service D-Bus est lancé, et si vous avez configuré un service tel que KWallet ; Gnome Keyring ; KeePassXC ou l'équivalent pour votre système. Si vous n'arrivez pas à résoudre le problème, n'hésitez pas à nous en faire part ici : https ://github.com/Nheko-Reborn/nheko/issues @@ -2289,7 +2291,7 @@ Exemple : https ://monserveur.example.com:8787 This is your recovery key. You will need it to restore access to your encrypted messages and verification keys. Keep this safe. Don't share it with anyone and don't lose it! Do not pass go! Do not collect $200! - Ceci est votre clé de récupération. Vous en aurez besoin afin de restaurer l'accès à vos messages chiffrés et à vos clés de vérification. Gardez cette clé en sûreté. Ne la partagez pas avec qui que ce soit et ne la perdez pas ! Ne passez pas par la case départ et ne recevez pas 20 000 francs ! + Ceci est votre clé de récupération. Vous en aurez besoin afin de restaurer l'accès à vos messages chiffrés et à vos clés de vérification. Gardez cette clé en sûreté. Ne la partagez pas avec qui que ce soit et ne la perdez pas ! Ne passez pas par la case départ et ne recevez pas 20 000 francs ! @@ -2299,7 +2301,7 @@ Exemple : https ://monserveur.example.com:8787 Failed to setup encryption: %1 - Échec de la configuration du chiffrement : %1 + Échec de la configuration du chiffrement : %1 @@ -2310,8 +2312,8 @@ Exemple : https ://monserveur.example.com:8787 Hello and welcome to Matrix! It seems like you are new. Before you can securely encrypt your messages, we need to setup a few small things. You can either press accept immediately or adjust a few basic options. We also try to explain a few of the basics. You can skip those parts, but they might prove to be helpful! - Bonjour et bienvenue sur le réseau Matrix ! -Il semblerait que ce soit votre première fois ici. Avant de pouvoir chiffrer vos messages de manière sécurisée, nous devons configurer quelques détails. Vous pouvez soit accepter immédiatement, soit ajuster quelques options basiques. Nous essayons également d'expliquer le fonctionnement de certains mécanismes. Vous pouvez sauter ces étapes, mais celles-ci pourraient se montrer utiles par la suite ! + Bonjour et bienvenue sur le réseau Matrix ! +Il semblerait que ce soit votre première fois ici. Avant de pouvoir chiffrer vos messages de manière sécurisée, nous devons configurer quelques détails. Vous pouvez soit accepter immédiatement, soit ajuster quelques options basiques. Nous essayons également d'expliquer le fonctionnement de certains mécanismes. Vous pouvez sauter ces étapes, mais celles-ci pourraient se montrer utiles par la suite ! @@ -2341,17 +2343,17 @@ Si vous choisissez de vérifier, vous aurez besoin de l'autre appareil. Si Failed to create keys for cross-signing! - Échec de la création des clés pour l'auto-vérification (cross-signing) ! + Échec de la création des clés pour l'auto-vérification (cross-signing) ! Failed to create keys for online key backup! - Échec de la création de clés pour la sauvegarde en ligne ! + Échec de la création de clés pour la sauvegarde en ligne ! Failed to create keys for secure server side secret storage! - Échec de la création des clés pour le stockage sécurisé côté serveur ! + Échec de la création des clés pour le stockage sécurisé côté serveur ! @@ -2361,7 +2363,7 @@ Si vous choisissez de vérifier, vous aurez besoin de l'autre appareil. Si Encryption setup failed: %1 - Échec de la configuration du chiffrement : %1 + Échec de la configuration du chiffrement : %1 @@ -2436,7 +2438,7 @@ Si vous choisissez de vérifier, vous aurez besoin de l'autre appareil. Si Verification successful! Both sides verified their devices! - Vérification réussie ! Les deux côtés ont vérifié leur appareil ! + Vérification réussie ! Les deux côtés ont vérifié leur appareil ! @@ -2450,13 +2452,13 @@ Si vous choisissez de vérifier, vous aurez besoin de l'autre appareil. Si Message redaction failed: %1 - Échec de la suppression du message : %1 + Échec de la suppression du message : %1 Failed to encrypt event, sending aborted! - Échec du chiffrement de l'évènement, envoi abandonné ! + Échec du chiffrement de l'évènement, envoi abandonné ! @@ -2648,7 +2650,7 @@ Raison : %4 %1 left after having already left! This is a leave event after the user already left and shouldn't happen apart from state resets - %1 a quitté le salon après l'avoir déjà quitté ! + %1 a quitté le salon après l'avoir déjà quitté ! @@ -2818,9 +2820,9 @@ Raison : %4 Upload %n file(s) - - - + + Mettre en ligne un fichier + Mettre en ligne %n fichiers @@ -2945,7 +2947,7 @@ Raison : %4 Error while reading file: %1 - Erreur lors de la lecture du fichier  : %1 + Erreur lors de la lecture du fichier  : %1 @@ -3062,12 +3064,12 @@ Raison : %4 Open images with external program - + Ouvrir les images avec un programme externe Open videos with external program - + Ouvrir les vidéos avec un programme externe @@ -3361,18 +3363,19 @@ Le statut est affiché près de la date des messages. Notify about received messages when the client is not currently focused. - + Notifier des messages reçus quand le client n'est pas la fenêtre active. Change the appearance of user avatars in chats. OFF - square, ON - circle. - + Changer l'apparence des images de profil dans les discussions. +OFF - carré, ON - circulaire. The key to verify your own devices. If it is cached, verifying one of your devices will mark it verified for all your other devices and for users that have verified you. - + La clef pour vérifier vos propres appareils. Si elle est en cache, vérifier un de vos appareils le marquera comme vérifié pour tous vos autres appareils et pour les utilisateurs qui vous ont vérifié. @@ -3390,13 +3393,15 @@ Typiquement, l'icône de l'application est mise en évidence dans la b Opens images with an external program when tapping the image. Note that when this option is ON, opened files are left unencrypted on disk and must be manually deleted. - + Ouvre les images avec un programme externe au clic de l'image. +Notez que si cette option est activée, les fichiers sont laissés déchiffrés sur le disque et doivent être supprimés manuellement. Opens videos with an external program when tapping the video. Note that when this option is ON, opened files are left unencrypted on disk and must be manually deleted. - + Ouvre les vidéos avec un programme externe au clic de la vidéo. +Notez que si cette option est activée, les fichiers sont laissés déchiffrés sur le disque et doivent être supprimés manuellement. @@ -3490,7 +3495,7 @@ be blurred. Enter the passphrase to decrypt the file: - Entrez la phrase de passe pour déchiffrer le fichier : + Entrez la phrase de passe pour déchiffrer le fichier : @@ -3501,7 +3506,7 @@ be blurred. Enter passphrase to encrypt your session keys: - Entrez une phrase de passe pour chiffrer vos clés de session : + Entrez une phrase de passe pour chiffrer vos clés de session : @@ -3788,12 +3793,12 @@ be blurred. You: %1 - Vous : %1 + Vous : %1 %1: %2 - %1 : %2 + %1 : %2 From 01347c353ddbebf22a98a474aec4a0e076c36f48 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 25 Mar 2022 23:59:27 -0400 Subject: [PATCH 13/14] Translated using Weblate (Dutch) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (702 of 702 strings) Co-authored-by: Jaron Viëtor Translate-URL: https://weblate.nheko.im/projects/nheko/nheko-master/nl/ Translation: Nheko/nheko --- resources/langs/nheko_nl.ts | 80 +++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/resources/langs/nheko_nl.ts b/resources/langs/nheko_nl.ts index b80ba972..194c9e88 100644 --- a/resources/langs/nheko_nl.ts +++ b/resources/langs/nheko_nl.ts @@ -436,12 +436,12 @@ Room Settings - Kamerinstellingen + Kamerinstellingen %n member(s) - + %n deelnemer %n deelnemers @@ -449,134 +449,134 @@ SETTINGS - INSTELLINGEN + INSTELLINGEN Notifications - Meldingen + Meldingen Muted - Gedempt + Gedempt Mentions only - Alleen vermeldingen + Alleen vermeldingen All messages - Alle berichten + Alle berichten Room access - Kamertoegang + Kamertoegang Anyone and guests - Iedereen (inclusief gasten) + Iedereen (inclusief gasten) Anyone - Iedereen + Iedereen Invited users - Uitgenodigde gebruikers + Uitgenodigde gebruikers By knocking - Door aan te kloppen + Door aan te kloppen Restricted by membership in other rooms - Beperkt door deelname aan andere kamers + Beperkt door deelname aan andere kamers Encryption - Versleuteling + Versleuteling End-to-End Encryption - Eind-tot-eind versleuteling + Eind-tot-eind versleuteling Encryption is currently experimental and things might break unexpectedly. <br> Please take note that it can't be disabled afterwards. - Versleuteling is momenteel experimenteel en dingen gaan misschien stuk. <br> + Versleuteling is momenteel experimenteel en dingen gaan misschien stuk. <br> Wees ervan bewust dat het achteraf niet meer uitgeschakeld kan worden. Sticker & Emote Settings - Sticker & Emoji instellingen + Sticker & Emoji instellingen Change - Bewerken + Bewerken Change what packs are enabled, remove packs or create new ones - Verander welke afbeeldingspakketten zijn ingeschakeld, verwijder ze of voeg nieuwe toe + Verander welke afbeeldingspakketten zijn ingeschakeld, verwijder ze of voeg nieuwe toe Hidden events - Verborgen gebeurtenissen + Verborgen gebeurtenissen Configure - Instellen + Instellen Select events to hide in this room - Selecteer gebeurtenissen die verborgen dienen te worden in deze kamer + Selecteer gebeurtenissen die verborgen dienen te worden in deze kamer INFO - INFO + INFO Internal ID - Interne ID + Interne ID Copied to clipboard - Gekopieerd naar klembord + Gekopieerd naar klembord Room Version - Kamerversie + Kamerversie show less - + minder tonen show more - + meer tonen @@ -1231,7 +1231,7 @@ Voorbeeld: https://mijnserver.nl:8787 Failed to upload media. Please try again. - Het is niet is gelukt om de media te versturen. Probeer het a.u.b. opnieuw. + Het is niet is gelukt om de media te versturen. Probeer het a.u.b. opnieuw. @@ -1802,7 +1802,7 @@ Voorbeeld: https://mijnserver.nl:8787 Cancel Edit - + Bewerken annuleren @@ -2134,12 +2134,12 @@ Wees ervan bewust dat het achteraf niet meer uitgeschakeld kan worden. show less - + minder tonen show more - + meer tonen @@ -2820,9 +2820,9 @@ Reden: %4 Upload %n file(s) - - - + + Bestand versturen + %n bestanden versturen @@ -3064,12 +3064,12 @@ Reden: %4 Open images with external program - + Open afbeeldingen met externe applicatie Open videos with external program - + Open videos met externe applicatie @@ -3393,13 +3393,15 @@ Meestal zorgt dit dat het icoon in de taakbalk op een manier animeert of iets de Opens images with an external program when tapping the image. Note that when this option is ON, opened files are left unencrypted on disk and must be manually deleted. - + Opent afbeeldingen met een externe applicatie wanneer op een afbeelding geklikt wordt. +Let up dat als deze instelling AAN staat, geopende afbeeldingen zonder versleuteling opgeslagen worden en met de hand moeten worden opgeruimd. Opens videos with an external program when tapping the video. Note that when this option is ON, opened files are left unencrypted on disk and must be manually deleted. - + Opent videos met een externe applicatie wanneer op een afbeelding geklikt wordt. +Let up dat als deze instelling AAN staat, geopende videos zonder versleuteling opgeslagen worden en met de hand moeten worden opgeruimd. From 5078bdd14f5a3b521b1f7a6541c7b5875af61fc1 Mon Sep 17 00:00:00 2001 From: Malte E <97891689+maltee1@users.noreply.github.com> Date: Sun, 27 Mar 2022 21:23:40 +0200 Subject: [PATCH 14/14] drag to reply (#1018) --- resources/qml/TimelineRow.qml | 28 ++++++++++++++++++++- resources/qml/TimelineView.qml | 1 + resources/qml/components/AdaptiveLayout.qml | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml index 947ba030..43de679c 100644 --- a/resources/qml/TimelineRow.qml +++ b/resources/qml/TimelineRow.qml @@ -5,7 +5,7 @@ import "./delegates" import "./emoji" -import QtQuick 2.12 +import QtQuick 2.15 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.2 import QtQuick.Window 2.13 @@ -66,6 +66,32 @@ AbstractButton { onPressAndHold: messageContextMenu.show(eventId, type, isSender, isEncrypted, isEditable, contentItem.child.hoveredLink, contentItem.child.copyText) onDoubleClicked: chat.model.reply = eventId + DragHandler { + id: draghandler + yAxis.enabled: false + xAxis.maximum: 100 + xAxis.minimum: -100 + onActiveChanged: { + if(!active && (x < -70 || x > 70)) + chat.model.reply = eventId + } + } + states: State { + name: "dragging" + when: draghandler.active + } + transitions: Transition { + from: "dragging" + to: "" + PropertyAnimation { + target: r + properties: "x" + easing.type: Easing.InOutQuad + to: 0 + duration: 100 + } + } + Rectangle { id: row property bool bubbleOnRight : isSender && Settings.bubbles diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml index c4820077..023de8f0 100644 --- a/resources/qml/TimelineView.qml +++ b/resources/qml/TimelineView.qml @@ -23,6 +23,7 @@ Item { property var room: null property var roomPreview: null property bool showBackButton: false + clip: true Label { visible: !room && !TimelineManager.isInitialSync && (!roomPreview || !roomPreview.roomid) diff --git a/resources/qml/components/AdaptiveLayout.qml b/resources/qml/components/AdaptiveLayout.qml index 28befe91..8e3c0e3d 100644 --- a/resources/qml/components/AdaptiveLayout.qml +++ b/resources/qml/components/AdaptiveLayout.qml @@ -131,6 +131,7 @@ Container { interactive: singlePageMode highlightMoveDuration: container.singlePageMode ? 200 : 0 currentIndex: container.singlePageMode ? container.pageIndex : 0 + boundsBehavior: Flickable.StopAtBounds } }