Compare commits

..

86 Commits

Author SHA1 Message Date
l10n daemon script
588266d7c3 Additional po sync 2024-10-09 11:01:45 +00:00
l10n daemon script
258e799138 GIT_SILENT made messages (after extraction) 2024-10-09 02:29:41 +00:00
l10n daemon script
73cd253e25 GIT_SILENT Sync po/docbooks with svn 2024-10-07 03:04:36 +00:00
l10n daemon script
eee81329a4 GIT_SILENT made messages (after extraction) 2024-10-07 02:28:56 +00:00
Tobias Fella
9b425e5a54 Fix for not rendering html in replies
The proper fix on master branch isn't suitable to be backported
2024-10-06 22:14:22 +02:00
Tobias Fella
fb83d5cff8 Fix compilation
(cherry picked from commit a769b904dc)
2024-10-06 22:14:22 +02:00
Tobias Fella
21cabeb20c Fix compilation against changes in libQuotient
(cherry picked from commit f156551d4f)
2024-10-06 22:14:22 +02:00
Tobias Fella
bed04cc59f Adapt to libQuotient changes
(cherry picked from commit 3e1044b8fd)
2024-10-06 22:14:22 +02:00
Carl Schwan
18db04d073 Unify redaction handling
The code in messageeventmodel was calling to EventHandler::getBody who
already handles reaction handlings

(cherry picked from commit 16b27700f5)
2024-10-06 22:14:22 +02:00
Carl Schwan
0f05c1b921 Escape html from redaction message
(cherry picked from commit 9ee10b6968)
2024-10-06 22:14:14 +02:00
Heiko Becker
765292e0e9 GIT_SILENT Update Appstream for new release 2024-10-06 22:02:21 +02:00
Heiko Becker
7c27308a59 GIT_SILENT Upgrade release service version to 24.08.2. 2024-10-06 20:00:19 +02:00
l10n daemon script
b574e68164 GIT_SILENT Sync po/docbooks with svn 2024-10-06 03:06:57 +00:00
l10n daemon script
66d16dd16b SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2024-10-06 03:04:21 +00:00
l10n daemon script
b1c810c242 GIT_SILENT Sync po/docbooks with svn 2024-09-26 03:06:29 +00:00
l10n daemon script
8f0b3a16f1 GIT_SILENT Sync po/docbooks with svn 2024-09-24 03:32:05 +00:00
l10n daemon script
043519784b GIT_SILENT Sync po/docbooks with svn 2024-09-23 03:06:07 +00:00
Carl Schwan
aafe42c4cc Ensure floating buttons have correct size on mobile
(cherry picked from commit 42dd2e5413)

Co-authored-by: Carl Schwan <carl@carlschwan.eu>
2024-09-22 13:18:36 +00:00
Carl Schwan
d9b9b18872 Make sure that m_components cannot be accessed out of bounds in closeLinkPreview
https://crash-reports.kde.org/organizations/kde/issues/67352/?project=18&query=is%3Aunresolved+issue.priority%3A%5Bhigh%2C+medium%5D&referrer=issue-stream&statsPeriod=14d&stream_index=5


(cherry picked from commit f89cec9c55)

53f949e6 Make sure that m_components cannot be accessed out of bounds in closeLinkPreview
34b847cb Add warning

Co-authored-by: James Graham <james.h.graham@protonmail.com>
2024-09-22 13:16:39 +00:00
Carl Schwan
18e26c9e3a Fix NeoChatRoom::directChatRemoteMember
- Don't access member that's not there
- Use NeoChatRoomMember instead of RoomMember

BUG: 492733


(cherry picked from commit 2a5359e73b)

Co-authored-by: Tobias Fella <fella@posteo.de>
2024-09-22 13:14:59 +00:00
Carl Schwan
19c93e9d82 Fix crash in MessageContentModel
(cherry picked from commit 52ab6f484b)

Co-authored-by: Tobias Fella <fella@posteo.de>
2024-09-22 13:14:37 +00:00
Carl Schwan
af6187706e Fix display name in verification message
Previously this would be undefined and i18n doesn't handle this very
well


(cherry picked from commit fad4e506bc)

Co-authored-by: Carl Schwan <carl@carlschwan.eu>
2024-09-21 13:27:00 +00:00
l10n daemon script
bf18fcbbba GIT_SILENT Sync po/docbooks with svn 2024-09-19 03:08:37 +00:00
l10n daemon script
ee5502d7bf GIT_SILENT Sync po/docbooks with svn 2024-09-17 03:16:26 +00:00
l10n daemon script
d8d6a4ef3b GIT_SILENT Sync po/docbooks with svn 2024-09-16 03:30:14 +00:00
Carl Schwan
2803c6fd58 Fix filtering users in the member list
(cherry picked from commit 5c04eb85af)

Co-authored-by: Tobias Fella <fella@posteo.de>
2024-09-15 21:02:05 +00:00
Carl Schwan
f2f6406403 Don't open a room by default on mobile
Since the room window is fullscreen on mobile and you can't see the room list,
the first thing you'll be doing is backing out so you can choose the actual room you want to see


(cherry picked from commit 17da652152)

Co-authored-by: Bart Ribbers <bribbers@disroot.org>
2024-09-15 20:59:12 +00:00
Claire Elford
63dc8a5857 Fix increasing font size of certain emojis
Before this commit, NeoChat has two methods of detecting whether or not a piece
of text was an emoji. One is through a regex, and the other is by using the ICU
library. The two methods are used in different parts of the code.

This commit removes the regex detector and instead uses ICU for all the places
where NeoChat needs to figure out whether or not a string is an emoji. This
fixes increasing the font size for messages that only consist of emoji when
certain emoji are used that the regex did not handle (such as the transgender
symbol and transgender flag emojis).

(cherry picked from commit f7533a454c)
2024-09-15 22:59:54 +02:00
Carl Schwan
3dafc62f04 Use autoTransform on images
closes network/neochat#674


(cherry picked from commit 38cfc915f1)

533130b5 Use autoTransform on images

Co-authored-by: James Graham <james.h.graham@protonmail.com>
2024-09-15 10:22:08 +00:00
l10n daemon script
5be112e0e2 GIT_SILENT Sync po/docbooks with svn 2024-09-12 03:02:17 +00:00
Joshua Goins
b15ee49691 Web Shortcuts: kcmshell5 does not exist anymore on Plasma 6
This is hardcoded, but it's probably a safe assumption to think most
people running modern NeoChat are using Plasma 6 anyway.

(cherry picked from commit aa116a35f5)
2024-09-08 03:53:04 -04:00
l10n daemon script
fa5872ec5a GIT_SILENT Sync po/docbooks with svn 2024-09-08 03:08:01 +00:00
l10n daemon script
54061c744f GIT_SILENT Sync po/docbooks with svn 2024-09-07 03:06:04 +00:00
Heiko Becker
b6dac3bbdf GIT_SILENT Update Appstream for new release 2024-09-07 00:48:45 +02:00
Heiko Becker
3a838596c5 GIT_SILENT Upgrade release service version to 24.08.1. 2024-09-06 23:53:24 +02:00
l10n daemon script
cc22e80adc GIT_SILENT Sync po/docbooks with svn 2024-09-03 03:03:24 +00:00
Joshua Goins
1c0a5edd2e LocationHelper: Move clamp from zoomToFit to QML
The OSM plugin has a different zoom tolerance than what we're hardcoding
here. This fixes the map looking funky from being too zoomed while
trying to fit multiple location points at once.

(cherry picked from commit 15d6287995)
2024-09-02 09:28:15 -04:00
Joshua Goins
47408d536d AuthorDelegate: Don't make empty space clickable
(cherry picked from commit 4b7cbf37d5)
2024-09-02 09:28:15 -04:00
Joshua Goins
fc21eea7e7 AuthorDelegate: Add pointing hand cursor to indicate you can tap
It's not immediately obvious that you can press on this static text to
bring up the user's details. This isn't a problem with the avatar - for
example - because it has a pointing hand cursor. Let's do the same here.

(cherry picked from commit 0ccfe7d991)
2024-09-02 09:28:15 -04:00
Joshua Goins
ca95eb3505 Make the SectionDelegate look just a little bit better
This has insets on it - probably from qqc2-desktop-style - and makes it
look extremely bad when scrolling through messages as the background
size doesn't match. Now the insets are set to zero, except for topInset.
This is done to work around a visual bug where you can see a one-pixel
line right above the SectionDelegate when scrolling.

(cherry picked from commit ab5585cd06)
2024-09-02 09:28:15 -04:00
l10n daemon script
639cbed343 GIT_SILENT Sync po/docbooks with svn 2024-09-02 03:05:11 +00:00
l10n daemon script
be3cffaf3a GIT_SILENT Sync po/docbooks with svn 2024-09-01 03:05:11 +00:00
l10n daemon script
7af520d0ae GIT_SILENT Sync po/docbooks with svn 2024-08-30 03:10:58 +00:00
l10n daemon script
d145177014 GIT_SILENT Sync po/docbooks with svn 2024-08-28 03:30:02 +00:00
l10n daemon script
75aa2c0e8d SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2024-08-28 03:20:31 +00:00
l10n daemon script
7eda952aa2 GIT_SILENT Sync po/docbooks with svn 2024-08-25 03:09:56 +00:00
Tobias Fella
22d0d84fee Fix pending indicator 2024-08-24 17:42:11 +02:00
Tobias Fella
941a724381 Use plaintext for reply author component
(cherry picked from commit aeb566746a)
2024-08-24 17:33:48 +02:00
Tobias Fella
7e880c6663 Don't run QtKeychain job in a nested event loop
Doing that causes deadlocks and there's no need for it here

(cherry picked from commit 8da567d9fa)
2024-08-24 17:33:44 +02:00
Tobias Fella
22315b810c Adapt to libQuotient API change
(cherry picked from commit d99f69cc24)
2024-08-24 17:33:37 +02:00
Tobias Fella
d0c41d5224 Ensure that room list does not show rooms without title during startup
There's a brief moment during startup where the model knows about the rooms, but their state
is not loaded, which makes them show up in the room list with ugly fallback titles.
To prevent this, we delay closing the welcome page until the basestate is loaded.

(cherry picked from commit bd1d4289c0)
2024-08-24 17:33:30 +02:00
Andreas Sturmlechner
a7e06375fd Include missing ECMQmlModule
Amends bc67033c00 and e0c3a1c143

No idea why this isn't caught by CI, but it fails for me otherwise.

Signed-off-by: Andreas Sturmlechner <asturm@gentoo.org>
(cherry picked from commit 22743b6d8b)
2024-08-24 12:24:15 +02:00
l10n daemon script
e638f61ff1 GIT_SILENT Sync po/docbooks with svn 2024-08-22 03:20:42 +00:00
l10n daemon script
2218b39a50 GIT_SILENT Sync po/docbooks with svn 2024-08-20 03:27:56 +00:00
Tobias Fella
b34936a017 Re-add pending event indicator
This seems to have been accidentally removed

BUG: 491277
(cherry picked from commit 776807580a)
2024-08-18 15:37:08 +02:00
l10n daemon script
5b3e650854 GIT_SILENT Sync po/docbooks with svn 2024-08-16 03:04:39 +00:00
Heiko Becker
86d85c6ce7 GIT_SILENT Update Appstream for new release 2024-08-16 00:35:00 +02:00
Heiko Becker
863e20394a GIT_SILENT Upgrade release service version to 24.08.0. 2024-08-15 23:34:44 +02:00
l10n daemon script
908dcea75e GIT_SILENT made messages (after extraction) 2024-08-11 02:34:30 +00:00
l10n daemon script
c59d5bc75d SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2024-08-10 03:12:41 +00:00
l10n daemon script
ff4ba4df9c GIT_SILENT made messages (after extraction) 2024-08-10 02:39:29 +00:00
l10n daemon script
0c1494e74a SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2024-08-09 03:01:15 +00:00
Albert Astals Cid
18d4da8b42 GIT_SILENT Upgrade release service version to 24.07.90. 2024-08-08 10:00:41 +02:00
l10n daemon script
9680cbbb38 GIT_SILENT Sync po/docbooks with svn 2024-08-06 03:07:30 +00:00
l10n daemon script
3b5ba470b6 GIT_SILENT Sync po/docbooks with svn 2024-08-04 03:12:15 +00:00
l10n daemon script
e1066aede2 SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2024-08-04 03:08:29 +00:00
l10n daemon script
2bf4ed26f0 GIT_SILENT Sync po/docbooks with svn 2024-08-03 03:09:58 +00:00
l10n daemon script
b460b588a8 GIT_SILENT Sync po/docbooks with svn 2024-08-02 03:10:44 +00:00
l10n daemon script
05270c38bf GIT_SILENT Sync po/docbooks with svn 2024-07-31 03:05:10 +00:00
l10n daemon script
18afad83db GIT_SILENT Sync po/docbooks with svn 2024-07-30 03:09:21 +00:00
Tobias Fella
d390433b2b Show time without seconds in timeline
(cherry picked from commit 2df2e39d43)
2024-07-29 18:00:10 +02:00
Tobias Fella
0017be1c0f Show time without timezone in tooltip
Constructing the timezone string is relatively heavy and is done for each delegate, even when the tooltip is never shown

(cherry picked from commit 42cec7d5ba)
2024-07-29 18:00:08 +02:00
l10n daemon script
63eda3796d GIT_SILENT Sync po/docbooks with svn 2024-07-29 03:09:38 +00:00
l10n daemon script
3246076a0b GIT_SILENT Sync po/docbooks with svn 2024-07-28 03:10:41 +00:00
James Graham
e905cdd151 Cherrypick: Create NeochatRoomMember as a shim for RoomMember
The intention is that NeochatRoomMember can be created passed to QML and then be fully managed by it. It effectively just grabs the current RoomMember, calls the correct function then discards it so that we don't end up trying to access an already deleted state event.


(cherry picked from commit 11fd4f88ec)

a2a8ad09 Create NeochatRoomMember as a shim for RoomMember so it can be safely passed to QML
0867eef5 Fix showAuthor
0f72ccd0 Mamange the creation of NeochatRoomMembers and only create one per member rather than event.
dba88fe2 REmove getAuthor as no longer needed
4e3a61d1 Update include
32d4d9f7 Pass NeochatRoomMembers rather than RoomMembers to menus
8e4b2034 Don't leak memory
c2f2bb26 Fix code component regression.
5aee89be Make sure the sender Id is intialised properly for pending events
c10c2677 Tweak intialisation
b3146034 Make sure event objects are created for new pending events
e4fab6d9 Pass an empty NeochatRoomMember when not in the map

Co-authored-by: James Graham <james.h.graham@protonmail.com>
2024-07-27 09:33:14 +00:00
l10n daemon script
0372074beb GIT_SILENT Sync po/docbooks with svn 2024-07-27 03:10:43 +00:00
Joshua Goins
09e97f2bdb Make the "Unignore this user" button work on the Ignored Users page
This function now takes a QString. This should be fine to use since it's
in the 0.8.2 release which we require.

(cherry picked from commit 9a4504ce61)
2024-07-26 19:09:57 +00:00
Joshua Goins
8e324c16f3 Fix the emoji page not doing anything
This is yet more stuff broken due to referencing a implicit pageStack
that no longer exists.


(cherry picked from commit cb8ed02e82)

Co-authored-by: Joshua Goins <josh@redstrate.com>
2024-07-26 19:00:47 +00:00
Joshua Goins
2bb55eece7 Don't flag invite notifications as persistent
These really don't need to be persistent, as they even stick around
when NeoChat is closed. This also spams the user's notification system
usually, if they get lots of invitations at once which don't go away
automatically.

(cherry picked from commit 51197d7c1a)
2024-07-25 16:38:13 -04:00
Joshua Goins
2877e40647 Hint that the user can auto-reject invitations on the invite page
This should help make the new setting more discoverable.

(cherry picked from commit 2a2a2e0c05)
2024-07-25 16:38:13 -04:00
Joshua Goins
768ec242fa Allow blocking invites from people you don't share a room with
Matrix currently has a significant moderation loophole, thanks to
invites. Right now, anyone can invite anyone to a room - and clients
like NeoChat will gladly display these rooms to them and even give you
a notification.

However, this creates a pretty easy attack since room names and avatars
are arbitrary and this is a known vector of harassment in the Matrix
community. There's currently no tools to block this server-side, so
let's try to improve the situation where we can.

This adds a new setting to the Security page, wherein it allows you to
block invites from people you don't share a room with. This prevents the
notification from appearing and NeoChat will attempt to leave the room
immediately.

Since this depends on MSC 2666 - a currently unstable feature - the
server may not support it and NeoChat will disable the setting in this
case.

(cherry picked from commit 07fee30cc0)
2024-07-25 16:38:13 -04:00
Joshua Goins
194751627f Don't display notifications for invite rooms
Sometimes a ghost notification will appear, this is sometimes a stray
m.room.invite notification we didn't handle or some other event. Let's
outright reject all notifications from Invite-type rooms to prevent this
from happening altogether.

(cherry picked from commit 83c6ce0ace)
2024-07-25 16:38:13 -04:00
l10n daemon script
bc701c51d9 GIT_SILENT Sync po/docbooks with svn 2024-07-25 03:13:15 +00:00
l10n daemon script
35939b4af4 GIT_SILENT Sync po/docbooks with svn 2024-07-23 03:14:18 +00:00
l10n daemon script
a178b8b6ca SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2024-07-23 03:04:52 +00:00
Albert Astals Cid
a6994318de GIT_SILENT Upgrade release service version to 24.07.80. 2024-07-21 12:25:07 +02:00
128 changed files with 7409 additions and 13341 deletions

View File

@@ -8,13 +8,13 @@ cmake_minimum_required(VERSION 3.16)
# KDE Applications version, managed by release script. # KDE Applications version, managed by release script.
set(RELEASE_SERVICE_VERSION_MAJOR "24") set(RELEASE_SERVICE_VERSION_MAJOR "24")
set(RELEASE_SERVICE_VERSION_MINOR "11") set(RELEASE_SERVICE_VERSION_MINOR "08")
set(RELEASE_SERVICE_VERSION_MICRO "70") set(RELEASE_SERVICE_VERSION_MICRO "2")
set(RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}") set(RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
project(NeoChat VERSION ${RELEASE_SERVICE_VERSION}) project(NeoChat VERSION ${RELEASE_SERVICE_VERSION})
set(KF_MIN_VERSION "6.4") set(KF_MIN_VERSION "6.0")
set(QT_MIN_VERSION "6.5") set(QT_MIN_VERSION "6.5")
find_package(ECM ${KF_MIN_VERSION} REQUIRED NO_MODULE) find_package(ECM ${KF_MIN_VERSION} REQUIRED NO_MODULE)
@@ -38,6 +38,7 @@ include(KDEGitCommitHooks)
include(ECMCheckOutboundLicense) include(ECMCheckOutboundLicense)
include(ECMQtDeclareLoggingCategory) include(ECMQtDeclareLoggingCategory)
include(ECMAddAndroidApk) include(ECMAddAndroidApk)
include(ECMQmlModule)
if (NOT ANDROID) if (NOT ANDROID)
include(KDEClangFormat) include(KDEClangFormat)
endif() endif()
@@ -59,7 +60,6 @@ set_package_properties(Qt6 PROPERTIES
PURPOSE "Basic application components" PURPOSE "Basic application components"
) )
qt_policy(SET QTP0001 NEW)
if (QT_KNOWN_POLICY_QTP0004) if (QT_KNOWN_POLICY_QTP0004)
qt_policy(SET QTP0004 NEW) qt_policy(SET QTP0004 NEW)
endif () endif ()

View File

@@ -274,7 +274,6 @@ void TextHandlerTest::receiveRichInPlainOut_data()
QTest::newRow("ampersand") << QStringLiteral("a &amp; b") << QStringLiteral("a & b"); QTest::newRow("ampersand") << QStringLiteral("a &amp; b") << QStringLiteral("a & b");
QTest::newRow("quote") << QStringLiteral("&quot;a and b&quot;") << QStringLiteral("\"a and b\""); QTest::newRow("quote") << QStringLiteral("&quot;a and b&quot;") << QStringLiteral("\"a and b\"");
QTest::newRow("new line") << QStringLiteral("new<br>line") << QStringLiteral("new\nline"); QTest::newRow("new line") << QStringLiteral("new<br>line") << QStringLiteral("new\nline");
QTest::newRow("unescape") << QStringLiteral("can&#x27;t") << QStringLiteral("can't");
} }
void TextHandlerTest::receiveRichInPlainOut() void TextHandlerTest::receiveRichInPlainOut()

View File

@@ -55,6 +55,7 @@
<summary xml:lang="ca">Xategeu amb els vostres amics a Matrix</summary> <summary xml:lang="ca">Xategeu amb els vostres amics a Matrix</summary>
<summary xml:lang="ca-valencia">Xategeu amb els vostres amics a Matrix</summary> <summary xml:lang="ca-valencia">Xategeu amb els vostres amics a Matrix</summary>
<summary xml:lang="cs">Mluvte se svými přáteli na Matrixu</summary> <summary xml:lang="cs">Mluvte se svými přáteli na Matrixu</summary>
<summary xml:lang="de">Mit den Freunden auf Matrix unterhalten</summary>
<summary xml:lang="en-GB">Chat with your friends on matrix</summary> <summary xml:lang="en-GB">Chat with your friends on matrix</summary>
<summary xml:lang="eo">Babilu kun viaj amikoj sur matrix</summary> <summary xml:lang="eo">Babilu kun viaj amikoj sur matrix</summary>
<summary xml:lang="es">Charle con sus amigos en matrix</summary> <summary xml:lang="es">Charle con sus amigos en matrix</summary>
@@ -85,12 +86,14 @@
<p xml:lang="ar">نيوتشات هو تطبيق دردشة يتيح لك الاستفادة الكاملة من شبكة Matrix. فهو يوفر لك طريقة آمنة لإرسال الرسائل النصية ومقاطع الفيديو والملفات الصوتية إلى عائلتك وزملائك وأصدقائك.</p> <p xml:lang="ar">نيوتشات هو تطبيق دردشة يتيح لك الاستفادة الكاملة من شبكة Matrix. فهو يوفر لك طريقة آمنة لإرسال الرسائل النصية ومقاطع الفيديو والملفات الصوتية إلى عائلتك وزملائك وأصدقائك.</p>
<p xml:lang="ca">El NeoChat és una aplicació de xat que us permet aprofitar plenament la xarxa Matrix. Proporciona una manera segura d'enviar missatges de text, vídeos i arxius d'àudio a la vostra família, companys i amics.</p> <p xml:lang="ca">El NeoChat és una aplicació de xat que us permet aprofitar plenament la xarxa Matrix. Proporciona una manera segura d'enviar missatges de text, vídeos i arxius d'àudio a la vostra família, companys i amics.</p>
<p xml:lang="ca-valencia">NeoChat és una aplicació de xat que us permet aprofitar plenament la xarxa Matrix. Proporciona una manera segura d'enviar missatges de text, vídeos i arxius d'àudio a la vostra família, companys i amics.</p> <p xml:lang="ca-valencia">NeoChat és una aplicació de xat que us permet aprofitar plenament la xarxa Matrix. Proporciona una manera segura d'enviar missatges de text, vídeos i arxius d'àudio a la vostra família, companys i amics.</p>
<p xml:lang="de">NeoChat ist eine Anwendung für Unterhaltungen mit allen Vorteilen des Matrix-Netzwerkes. Sie bietet eine sichere Möglichkeit zum Versenden von Nachrichten, Videos und Audiodateien and die Familienmitglieder.</p>
<p xml:lang="en-GB">NeoChat is a chat app that lets you take full advantage of the Matrix network. It provides you with a secure way to send text messages, videos and audio files to your family, colleagues and friends.</p> <p xml:lang="en-GB">NeoChat is a chat app that lets you take full advantage of the Matrix network. It provides you with a secure way to send text messages, videos and audio files to your family, colleagues and friends.</p>
<p xml:lang="eo">NeoChat estas babilej-apo, kiu ebligas al vi plene profiti de la Matrix-reto. Ĝi provizas al vi sekuran manieron sendi tekstmesaĝojn, filmetojn kaj sondosierojn al via familio, kolegoj kaj amikoj.</p> <p xml:lang="eo">NeoChat estas babilej-apo, kiu ebligas al vi plene profiti de la Matrix-reto. Ĝi provizas al vi sekuran manieron sendi tekstmesaĝojn, filmetojn kaj sondosierojn al via familio, kolegoj kaj amikoj.</p>
<p xml:lang="es">NeoChat es una aplicación de chat que le permite aprovechar al máximo la red Matrix. Le proporciona un modo seguro de enviar mensajes de texto, vídeos y archivos de sonido a su familia, colegas y amigos.</p> <p xml:lang="es">NeoChat es una aplicación de chat que le permite aprovechar al máximo la red Matrix. Le proporciona un modo seguro de enviar mensajes de texto, vídeos y archivos de sonido a su familia, colegas y amigos.</p>
<p xml:lang="eu">NeoChat, Matrix sarearen abantaila guztiei probetsua ateratzeko aukera ematen dizun berriketa aplikaizo bat da. Zure familiari, kideei eta lagunei testu mezuak, bideoak eta audio fitxategiak era seguruan bidaltzeko aukera ematen dizu.</p> <p xml:lang="eu">NeoChat, Matrix sarearen abantaila guztiei probetsua ateratzeko aukera ematen dizun berriketa aplikaizo bat da. Zure familiari, kideei eta lagunei testu mezuak, bideoak eta audio fitxategiak era seguruan bidaltzeko aukera ematen dizu.</p>
<p xml:lang="fi">NeoChat on keskustelusovellus, jolla Matrix-verkosta saa täyden hyödyn. Se tarjoaa salatun kanavan lähettää perheelle, työkavereille ja ystäville tekstiviestejä sekä video- ja äänitiedostoja.</p> <p xml:lang="fi">NeoChat on keskustelusovellus, jolla Matrix-verkosta saa täyden hyödyn. Se tarjoaa salatun kanavan lähettää perheelle, työkavereille ja ystäville tekstiviestejä sekä video- ja äänitiedostoja.</p>
<p xml:lang="fr">NeoChat est une application de discussions vous permettant de profiter pleinement du réseau Matrix. Elle vous offre un moyen sécurisé d'envoyer des messages de texte, des vidéos et des fichiers audio à votre famille, vos collègues et vos ami(e)s.</p> <p xml:lang="fr">NeoChat est une application de discussions vous permettant de profiter pleinement du réseau Matrix. Elle vous offre un moyen sécurisé d'envoyer des messages de texte, des vidéos et des fichiers audio à votre famille, vos collègues et vos ami(e)s.</p>
<p xml:lang="gl">NeoChat é unha aplicación de conversa que lle permite usar todas as funcionalidades da rede Matrix. Fornece unha forma segura de enviar mensaxes de texto e ficheiros de vídeo e son a familiares, amizades ou no traballo.</p>
<p xml:lang="he">NeoChat הוא יישום התכתבות שמאפשר לך לנצל את רשת Matrix במלואה. הוא מספק דרך מאובטחת לשליחת הודעות כתובות, סרטונים וקובצי שמע למשפחה, לעמיתים לעבודה ולחברים.</p> <p xml:lang="he">NeoChat הוא יישום התכתבות שמאפשר לך לנצל את רשת Matrix במלואה. הוא מספק דרך מאובטחת לשליחת הודעות כתובות, סרטונים וקובצי שמע למשפחה, לעמיתים לעבודה ולחברים.</p>
<p xml:lang="hu">A NeoChat egy olyan csevegőalkalmazás, amellyel teljes mértékben kihasználhatja a Matrix hálózatot. Biztonságos módot biztosít szöveges üzenetek, videók és hangfájlok küldéséhez családtagjainak, kollégáinak és barátainak.</p> <p xml:lang="hu">A NeoChat egy olyan csevegőalkalmazás, amellyel teljes mértékben kihasználhatja a Matrix hálózatot. Biztonságos módot biztosít szöveges üzenetek, videók és hangfájlok küldéséhez családtagjainak, kollégáinak és barátainak.</p>
<p xml:lang="ia">NeoChat es un app de conversation que te permitte prender avantage plen del rete Matrix. Il te forni un modo secur de inviar messages de texto, videos e files audio a tui familia, collegas e amicos.</p> <p xml:lang="ia">NeoChat es un app de conversation que te permitte prender avantage plen del rete Matrix. Il te forni un modo secur de inviar messages de texto, videos e files audio a tui familia, collegas e amicos.</p>
@@ -110,6 +113,7 @@
<p xml:lang="ar">يهدف نيوتشات إلى أن يكون تطبيقًا كامل الميزات لمواصفات ماتركس. على هذا النحو يتم دعم كل شيء في المواصفات المستقرة الحالية مع الاستثناءات الملحوظة لـ VoIP والخيوط وبعض جوانب التشفير من طرف إلى طرف. هناك عدد قليل من الإغفالات الصغيرة الأخرى بسبب حقيقة أن مواصفات ماتركس تتطور باستمرار ، ولكن يبقى الهدف توفير الدعم النهائي للمواصفات بأكملها.</p> <p xml:lang="ar">يهدف نيوتشات إلى أن يكون تطبيقًا كامل الميزات لمواصفات ماتركس. على هذا النحو يتم دعم كل شيء في المواصفات المستقرة الحالية مع الاستثناءات الملحوظة لـ VoIP والخيوط وبعض جوانب التشفير من طرف إلى طرف. هناك عدد قليل من الإغفالات الصغيرة الأخرى بسبب حقيقة أن مواصفات ماتركس تتطور باستمرار ، ولكن يبقى الهدف توفير الدعم النهائي للمواصفات بأكملها.</p>
<p xml:lang="ca">NeoChat pretén ser una aplicació amb totes les característiques per a l'especificació de Matrix. Com a tal, s'ha implementat tota l'especificació actual estable amb les notables excepcions de la VoIP, fils i alguns aspectes de l'encriptatge d'extrem a extrem. Hi ha algunes altres omissions més petites a causa del fet que l'especificació de Matrix està evolucionant constantment, però l'objectiu segueix sent proporcionar suport eventual per a tota l'especificació.</p> <p xml:lang="ca">NeoChat pretén ser una aplicació amb totes les característiques per a l'especificació de Matrix. Com a tal, s'ha implementat tota l'especificació actual estable amb les notables excepcions de la VoIP, fils i alguns aspectes de l'encriptatge d'extrem a extrem. Hi ha algunes altres omissions més petites a causa del fet que l'especificació de Matrix està evolucionant constantment, però l'objectiu segueix sent proporcionar suport eventual per a tota l'especificació.</p>
<p xml:lang="ca-valencia">NeoChat pretén ser una aplicació amb totes les característiques per a l'especificació de Matrix. Com a tal, s'ha implementat tota l'especificació actual estable amb les notables excepcions de la VoIP, fils i alguns aspectes de l'encriptació d'extrem a extrem. Hi ha algunes altres omissions més xicotetes a causa del fet que l'especificació de Matrix està evolucionant constantment, però l'objectiu seguix sent proporcionar suport eventual per a tota l'especificació.</p> <p xml:lang="ca-valencia">NeoChat pretén ser una aplicació amb totes les característiques per a l'especificació de Matrix. Com a tal, s'ha implementat tota l'especificació actual estable amb les notables excepcions de la VoIP, fils i alguns aspectes de l'encriptació d'extrem a extrem. Hi ha algunes altres omissions més xicotetes a causa del fet que l'especificació de Matrix està evolucionant constantment, però l'objectiu seguix sent proporcionar suport eventual per a tota l'especificació.</p>
<p xml:lang="de">NeoChat versucht eine vollumfängliche Anwendung für die Spezifikation von Matrix zu sein. Damit wird alles der aktuellen stabilen Spezifikation mit den erwähnenswerten Ausnahmen von VoIP, Diskussionsfäden und ein paar Teilen der Ende-zu-Ende-Verschlüsselung unterstützt. Zudem sind andere kleinere Auslassungen vorhanden, da sich die Matrixspezifikation ständig weiterentwickelt. Nichtsdestotrotz soll letztendlich die gesamte Spezifikation unterstützt werden.</p>
<p xml:lang="en-GB">NeoChat aims to be a fully featured application for the Matrix specification. As such everything in the current stable specification with the notable exceptions of VoIP, threads and some aspects of End-to-End Encryption are supported. There are a few other smaller omissions due to the fact that the Matrix spec is constantly evolving but the aim remains to provide eventual support for the entire spec.</p> <p xml:lang="en-GB">NeoChat aims to be a fully featured application for the Matrix specification. As such everything in the current stable specification with the notable exceptions of VoIP, threads and some aspects of End-to-End Encryption are supported. There are a few other smaller omissions due to the fact that the Matrix spec is constantly evolving but the aim remains to provide eventual support for the entire spec.</p>
<p xml:lang="eo">NeoChat celas esti plene kapabla aplikaĵo por la Matrix-specifo. Kiel tia, ĉio en la nuna stabila specifo kun la rimarkindaj esceptoj de VoIP, fadenoj kaj kelkaj aspektoj de Fin-al-Fina Ĉifrado estas subtenataj. Estas kelkaj aliaj pli malgrandaj preterlasoj pro la fakto, ke la Matrix-speco konstante evoluas, sed la celo restas provizi finfine subtenon por la tuta specifaĵo.</p> <p xml:lang="eo">NeoChat celas esti plene kapabla aplikaĵo por la Matrix-specifo. Kiel tia, ĉio en la nuna stabila specifo kun la rimarkindaj esceptoj de VoIP, fadenoj kaj kelkaj aspektoj de Fin-al-Fina Ĉifrado estas subtenataj. Estas kelkaj aliaj pli malgrandaj preterlasoj pro la fakto, ke la Matrix-speco konstante evoluas, sed la celo restas provizi finfine subtenon por la tuta specifaĵo.</p>
<p xml:lang="es">NeoChat pretende ser una aplicación con todas las funciones para la especificación de Matrix. Como tal, admite todo en la especificación estable actual, con las notables excepciones de VoIP, subprocesos y algunas funciones de cifrado de extremo a extremo. Existen algunas omisiones menos importantes debido al hecho de que la especificación de Matrix está en constante evolución, pero el objetivo sigue siendo brindar compatibilidad final con toda la especificación.</p> <p xml:lang="es">NeoChat pretende ser una aplicación con todas las funciones para la especificación de Matrix. Como tal, admite todo en la especificación estable actual, con las notables excepciones de VoIP, subprocesos y algunas funciones de cifrado de extremo a extremo. Existen algunas omisiones menos importantes debido al hecho de que la especificación de Matrix está en constante evolución, pero el objetivo sigue siendo brindar compatibilidad final con toda la especificación.</p>
@@ -139,6 +143,7 @@
<p xml:lang="ar">نظرًا لطبيعة تطوير مواصفات ماتركس، يدعم نيوتشات أيضًا العديد من الميزات غير المستقرة وهي:</p> <p xml:lang="ar">نظرًا لطبيعة تطوير مواصفات ماتركس، يدعم نيوتشات أيضًا العديد من الميزات غير المستقرة وهي:</p>
<p xml:lang="ca">A causa de la naturalesa del desenvolupament de l'especificació de Matrix, el NeoChat també implementa nombroses característiques inestables. Actualment són:</p> <p xml:lang="ca">A causa de la naturalesa del desenvolupament de l'especificació de Matrix, el NeoChat també implementa nombroses característiques inestables. Actualment són:</p>
<p xml:lang="ca-valencia">A causa de la naturalea del desenvolupament de l'especificació de Matrix, NeoChat també implementa nombroses característiques inestables. Actualment són:</p> <p xml:lang="ca-valencia">A causa de la naturalea del desenvolupament de l'especificació de Matrix, NeoChat també implementa nombroses característiques inestables. Actualment són:</p>
<p xml:lang="de">Durch die Weiterentwicklung der Matrix-Spezifikation unterstützt auch NeoChat einige als noch instabil gekennzeichnete Funktionen. Derzeit sind das:</p>
<p xml:lang="en-GB">Due to the nature of the Matrix specification development NeoChat also supports numerous unstable features. Currently these are:</p> <p xml:lang="en-GB">Due to the nature of the Matrix specification development NeoChat also supports numerous unstable features. Currently these are:</p>
<p xml:lang="eo">Pro la naturo de la Matrix-specifevoluo NeoChat ankaŭ subtenas multajn malstabilajn funkciojn. Nuntempe ĉi tiuj estas:</p> <p xml:lang="eo">Pro la naturo de la Matrix-specifevoluo NeoChat ankaŭ subtenas multajn malstabilajn funkciojn. Nuntempe ĉi tiuj estas:</p>
<p xml:lang="es">Debido a la naturaleza del desarrollo de la especificación de Matrix, NeoChat también permite numerosas funciones no estables, como:</p> <p xml:lang="es">Debido a la naturaleza del desarrollo de la especificación de Matrix, NeoChat también permite numerosas funciones no estables, como:</p>
@@ -293,6 +298,7 @@
<caption xml:lang="ar">العرض الرئيسة مع قائمة الغرف والدردشات و معلومات الغرفة</caption> <caption xml:lang="ar">العرض الرئيسة مع قائمة الغرف والدردشات و معلومات الغرفة</caption>
<caption xml:lang="ca">Vista principal amb la llista de sales, xats i informació de les sales</caption> <caption xml:lang="ca">Vista principal amb la llista de sales, xats i informació de les sales</caption>
<caption xml:lang="ca-valencia">Vista principal amb la llista de sales, xats i informació de les sales</caption> <caption xml:lang="ca-valencia">Vista principal amb la llista de sales, xats i informació de les sales</caption>
<caption xml:lang="de">Hauptansicht mit Raumliste, Unterhaltung und Raum-Informationen</caption>
<caption xml:lang="en-GB">Main view with room list, chat, and room information</caption> <caption xml:lang="en-GB">Main view with room list, chat, and room information</caption>
<caption xml:lang="eo">Ĉefa vido kun ĉambra listo, babilejo kaj ĉambra informo</caption> <caption xml:lang="eo">Ĉefa vido kun ĉambra listo, babilejo kaj ĉambra informo</caption>
<caption xml:lang="es">Vista principal con la lista de salas, chat e información de la sala</caption> <caption xml:lang="es">Vista principal con la lista de salas, chat e información de la sala</caption>
@@ -326,12 +332,14 @@
<caption xml:lang="ar">اكتشف مجتمعات جديدة مع فضاءات ماتركس</caption> <caption xml:lang="ar">اكتشف مجتمعات جديدة مع فضاءات ماتركس</caption>
<caption xml:lang="ca">Descobriu comunitats noves amb els espais de Matrix</caption> <caption xml:lang="ca">Descobriu comunitats noves amb els espais de Matrix</caption>
<caption xml:lang="ca-valencia">Descobriu comunitats noves amb els espais de Matrix</caption> <caption xml:lang="ca-valencia">Descobriu comunitats noves amb els espais de Matrix</caption>
<caption xml:lang="de">Neue Gemeinschaften mit den Umgebungen von Matrix erkunden</caption>
<caption xml:lang="en-GB">Discover new communities with Matrix Spaces</caption> <caption xml:lang="en-GB">Discover new communities with Matrix Spaces</caption>
<caption xml:lang="eo">Malkovru novajn komunumojn per Matrix Spaces</caption> <caption xml:lang="eo">Malkovru novajn komunumojn per Matrix Spaces</caption>
<caption xml:lang="es">Descubra nuevas comunidades con los espacios de Matrix</caption> <caption xml:lang="es">Descubra nuevas comunidades con los espacios de Matrix</caption>
<caption xml:lang="eu">Ezagutu komunitate berriak Matrixeko Tokiak erabiliz</caption> <caption xml:lang="eu">Ezagutu komunitate berriak Matrixeko Tokiak erabiliz</caption>
<caption xml:lang="fi">Löydä uusia yhteisöjä Matrix Spacesillä</caption> <caption xml:lang="fi">Löydä uusia yhteisöjä Matrix Spacesillä</caption>
<caption xml:lang="fr">Découvrez de nouvelles communautés avec les espaces sous Matrix</caption> <caption xml:lang="fr">Découvrez de nouvelles communautés avec les espaces sous Matrix</caption>
<caption xml:lang="gl">Descubra novas comunidades dos espazos de Matrix.</caption>
<caption xml:lang="he">אפשר להיחשף לקהילות חדשות דרך Matrix Spaces</caption> <caption xml:lang="he">אפשר להיחשף לקהילות חדשות דרך Matrix Spaces</caption>
<caption xml:lang="hu">Fedezzen fel új közösségeket a Matrix Terek segítségével</caption> <caption xml:lang="hu">Fedezzen fel új közösségeket a Matrix Terek segítségével</caption>
<caption xml:lang="ia">Discoperi nove communitate con Matrix Spaces (Spatios de Matrix)</caption> <caption xml:lang="ia">Discoperi nove communitate con Matrix Spaces (Spatios de Matrix)</caption>
@@ -361,6 +369,7 @@
<caption xml:lang="ar">العرض الرئيسة مع قائمة الغرف والدردشات و معلومات الغرفة</caption> <caption xml:lang="ar">العرض الرئيسة مع قائمة الغرف والدردشات و معلومات الغرفة</caption>
<caption xml:lang="ca">Vista principal amb la llista de sales, xats i informació de les sales</caption> <caption xml:lang="ca">Vista principal amb la llista de sales, xats i informació de les sales</caption>
<caption xml:lang="ca-valencia">Vista principal amb la llista de sales, xats i informació de les sales</caption> <caption xml:lang="ca-valencia">Vista principal amb la llista de sales, xats i informació de les sales</caption>
<caption xml:lang="de">Hauptansicht mit Raumliste, Unterhaltung und Raum-Informationen</caption>
<caption xml:lang="en-GB">Main view with room list, chat, and room information</caption> <caption xml:lang="en-GB">Main view with room list, chat, and room information</caption>
<caption xml:lang="eo">Ĉefa vido kun ĉambra listo, babilejo kaj ĉambra informo</caption> <caption xml:lang="eo">Ĉefa vido kun ĉambra listo, babilejo kaj ĉambra informo</caption>
<caption xml:lang="es">Vista principal con la lista de salas, chat e información de la sala</caption> <caption xml:lang="es">Vista principal con la lista de salas, chat e información de la sala</caption>
@@ -395,6 +404,7 @@
<caption xml:lang="ca">Pantalla d'inici de sessió</caption> <caption xml:lang="ca">Pantalla d'inici de sessió</caption>
<caption xml:lang="ca-valencia">Pantalla d'inici de sessió</caption> <caption xml:lang="ca-valencia">Pantalla d'inici de sessió</caption>
<caption xml:lang="cs">Přihlašovací obrazovka</caption> <caption xml:lang="cs">Přihlašovací obrazovka</caption>
<caption xml:lang="de">Anmeldebildschirm</caption>
<caption xml:lang="en-GB">Login screen</caption> <caption xml:lang="en-GB">Login screen</caption>
<caption xml:lang="eo">Ensaluta ekrano</caption> <caption xml:lang="eo">Ensaluta ekrano</caption>
<caption xml:lang="es">Pantalla de inicio de sesión</caption> <caption xml:lang="es">Pantalla de inicio de sesión</caption>
@@ -427,6 +437,9 @@
<content_attribute id="social-chat">intense</content_attribute> <content_attribute id="social-chat">intense</content_attribute>
</content_rating> </content_rating>
<releases> <releases>
<release version="24.08.2" date="2024-10-10"/>
<release version="24.08.1" date="2024-09-12"/>
<release version="24.08.0" date="2024-08-22"/>
<release version="24.05.2" date="2024-07-04"/> <release version="24.05.2" date="2024-07-04"/>
<release version="24.05.1" date="2024-06-13"/> <release version="24.05.1" date="2024-06-13"/>
<release version="24.05.0" date="2024-05-23"/> <release version="24.05.0" date="2024-05-23"/>

File diff suppressed because it is too large Load Diff

View File

@@ -6,7 +6,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: neochat\n" "Project-Id-Version: neochat\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-08-07 00:40+0000\n" "POT-Creation-Date: 2024-10-07 02:28+0000\n"
"PO-Revision-Date: 2023-12-12 01:02+0100\n" "PO-Revision-Date: 2023-12-12 01:02+0100\n"
"Last-Translator: Enol P. <enolp@softastur.org>\n" "Last-Translator: Enol P. <enolp@softastur.org>\n"
"Language-Team: Asturian <alministradores@softastur.org>\n" "Language-Team: Asturian <alministradores@softastur.org>\n"
@@ -88,7 +88,7 @@ msgctxt "@action:button"
msgid "Cancel reply" msgid "Cancel reply"
msgstr "" msgstr ""
#: src/controller.cpp:132 #: src/controller.cpp:136
#, kde-format #, kde-format
msgctxt "" msgctxt ""
"The reason for using push notifications, as in: '[Push notifications are " "The reason for using push notifications, as in: '[Push notifications are "
@@ -96,47 +96,47 @@ msgctxt ""
msgid "Receiving notifications for new messages" msgid "Receiving notifications for new messages"
msgstr "" msgstr ""
#: src/controller.cpp:211 #: src/controller.cpp:229
#, kde-format #, kde-format
msgid "Network Error: %1" msgid "Network Error: %1"
msgstr "" msgstr ""
#: src/controller.cpp:233 #: src/controller.cpp:255
#, kde-format #, kde-format
msgid "Access token wasn't found" msgid "Access token wasn't found"
msgstr "" msgstr ""
#: src/controller.cpp:233 #: src/controller.cpp:255
#, kde-format #, kde-format
msgid "Maybe it was deleted?" msgid "Maybe it was deleted?"
msgstr "" msgstr ""
#: src/controller.cpp:237 #: src/controller.cpp:259
#, kde-format #, kde-format
msgid "Access to keychain was denied." msgid "Access to keychain was denied."
msgstr "" msgstr ""
#: src/controller.cpp:237 #: src/controller.cpp:259
#, kde-format #, kde-format
msgid "Please allow NeoChat to read the access token" msgid "Please allow NeoChat to read the access token"
msgstr "" msgstr ""
#: src/controller.cpp:240 #: src/controller.cpp:262
#, kde-format #, kde-format
msgid "No keychain available." msgid "No keychain available."
msgstr "" msgstr ""
#: src/controller.cpp:240 #: src/controller.cpp:262
#, kde-format #, kde-format
msgid "Please install a keychain, e.g. KWallet or GNOME keyring on Linux" msgid "Please install a keychain, e.g. KWallet or GNOME keyring on Linux"
msgstr "" msgstr ""
#: src/controller.cpp:243 #: src/controller.cpp:265
#, kde-format #, kde-format
msgid "Unable to read access token" msgid "Unable to read access token"
msgstr "" msgstr ""
#: src/controller.cpp:339 #: src/controller.cpp:357
#, kde-format #, kde-format
msgid "Receiving push notifications" msgid "Receiving push notifications"
msgstr "" msgstr ""
@@ -363,7 +363,7 @@ msgid "Custom"
msgstr "" msgstr ""
#: src/enums/powerlevel.cpp:88 src/models/permissionsmodel.cpp:162 #: src/enums/powerlevel.cpp:88 src/models/permissionsmodel.cpp:162
#: src/models/userlistmodel.cpp:114 #: src/models/userlistmodel.cpp:118
#, kde-format #, kde-format
msgctxt "" msgctxt ""
"%1 is the name of the power level, e.g. admin and %2 is the value that " "%1 is the name of the power level, e.g. admin and %2 is the value that "
@@ -372,13 +372,11 @@ msgid "%1 (%2)"
msgstr "" msgstr ""
#: src/eventhandler.cpp:297 src/eventhandler.cpp:505 #: src/eventhandler.cpp:297 src/eventhandler.cpp:505
#: src/models/messagecontentmodel.cpp:236 src/models/messageeventmodel.cpp:440
#, kde-format #, kde-format
msgid "<i>[This message was deleted]</i>" msgid "<i>[This message was deleted]</i>"
msgstr "" msgstr ""
#: src/eventhandler.cpp:297 src/models/messagecontentmodel.cpp:237 #: src/eventhandler.cpp:297
#: src/models/messageeventmodel.cpp:441
#, kde-format #, kde-format
msgid "<i>[This message was deleted: %1]</i>" msgid "<i>[This message was deleted: %1]</i>"
msgstr "" msgstr ""
@@ -738,12 +736,12 @@ msgctxt "The location being downloaded to"
msgid "Destination" msgid "Destination"
msgstr "" msgstr ""
#: src/login.cpp:90 src/login.cpp:105 #: src/login.cpp:88 src/login.cpp:103
#, kde-format #, kde-format
msgid "Network Error" msgid "Network Error"
msgstr "" msgstr ""
#: src/login.cpp:98 #: src/login.cpp:96
#, kde-format #, kde-format
msgid "Login Failed: %1" msgid "Login Failed: %1"
msgstr "" msgstr ""
@@ -812,7 +810,7 @@ msgid "Loading…"
msgstr "" msgstr ""
#: src/login/Login.qml:38 src/login/WelcomePage.qml:198 #: src/login/Login.qml:38 src/login/WelcomePage.qml:198
#: src/settings/ThreePIdCard.qml:183 #: src/settings/ThreePIdCard.qml:181
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Continue" msgid "Continue"
@@ -853,7 +851,7 @@ msgstr ""
msgid "Password:" msgid "Password:"
msgstr "" msgstr ""
#: src/login/Password.qml:32 src/settings/AccountEditorPage.qml:152 #: src/login/Password.qml:32 src/settings/AccountEditorPage.qml:149
#: src/settings/NetworkProxyPage.qml:95 #: src/settings/NetworkProxyPage.qml:95
#, kde-format #, kde-format
msgid "Password" msgid "Password"
@@ -1457,7 +1455,7 @@ msgctxt "As in 'The user's own emojis"
msgid "Own Emojis" msgid "Own Emojis"
msgstr "" msgstr ""
#: src/models/messagecontentmodel.cpp:229 #: src/models/messagecontentmodel.cpp:223
#: src/timeline/LinkPreviewLoadComponent.qml:66 #: src/timeline/LinkPreviewLoadComponent.qml:66
#, kde-format #, kde-format
msgid "Loading reply" msgid "Loading reply"
@@ -1692,13 +1690,13 @@ msgctxt "Notification type"
msgid "Call invitation" msgid "Call invitation"
msgstr "" msgstr ""
#: src/models/reactionmodel.cpp:69 #: src/models/reactionmodel.cpp:64
#, kde-format #, kde-format
msgctxt "Separate the usernames of users" msgctxt "Separate the usernames of users"
msgid " and " msgid " and "
msgstr "" msgstr ""
#: src/models/reactionmodel.cpp:76 #: src/models/reactionmodel.cpp:71
#, kde-format #, kde-format
msgctxt "%1 is the number of other users" msgctxt "%1 is the number of other users"
msgid " and %1 other" msgid " and %1 other"
@@ -1706,7 +1704,7 @@ msgid_plural " and %1 others"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/models/reactionmodel.cpp:80 #: src/models/reactionmodel.cpp:75
#, kde-format #, kde-format
msgctxt "%2 is the users who reacted and %3 the emoji that was given" msgctxt "%2 is the users who reacted and %3 the emoji that was given"
msgid "%2 reacted with %3" msgid "%2 reacted with %3"
@@ -1759,139 +1757,133 @@ msgstr ""
msgid "Space creation failed: %1" msgid "Space creation failed: %1"
msgstr "" msgstr ""
#: src/neochatroom.cpp:1403 #: src/neochatroom.cpp:1439
#, kde-format #, kde-format
msgid "Report sent successfully." msgid "Report sent successfully."
msgstr "" msgstr ""
#: src/neochatroom.cpp:1724 src/neochatroom.cpp:1732 #: src/neochatroom.cpp:1764 src/neochatroom.cpp:1772
#, kde-format #, kde-format
msgctxt "'Lat' and 'Lon' as in Latitude and Longitude" msgctxt "'Lat' and 'Lon' as in Latitude and Longitude"
msgid "Lat: %1, Lon: %2" msgid "Lat: %1, Lon: %2"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:126 src/notificationsmanager.cpp:330 #: src/notificationsmanager.cpp:126 src/notificationsmanager.cpp:334
#, kde-format #, kde-format
msgid "Encrypted Message" msgid "Encrypted Message"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:210 src/qml/Main.qml:279 #: src/notificationsmanager.cpp:214 src/qml/Main.qml:279
#, kde-format #, kde-format
msgid "%1: %2" msgid "%1: %2"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:216 #: src/notificationsmanager.cpp:220
#, kde-format #, kde-format
msgid "Open NeoChat in this room" msgid "Open NeoChat in this room"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:229 src/qml/DelegateContextMenu.qml:98 #: src/notificationsmanager.cpp:233 src/qml/DelegateContextMenu.qml:98
#: src/qml/HoverActions.qml:111 #: src/qml/HoverActions.qml:111
#, kde-format #, kde-format
msgid "Reply" msgid "Reply"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:230 #: src/notificationsmanager.cpp:234
#, kde-format #, kde-format
msgid "Reply..." msgid "Reply..."
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:249 #: src/notificationsmanager.cpp:253
#, kde-format #, kde-format
msgid "%1 invited you to a room" msgid "%1 invited you to a room"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:252 #: src/notificationsmanager.cpp:256
#, kde-format #, kde-format
msgid "Open this invitation in NeoChat" msgid "Open this invitation in NeoChat"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:262 #: src/notificationsmanager.cpp:266
#, kde-format #, kde-format
msgctxt "@action:button The thing being accepted is an invitation to chat" msgctxt "@action:button The thing being accepted is an invitation to chat"
msgid "Accept" msgid "Accept"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:263 #: src/notificationsmanager.cpp:267
#, kde-format #, kde-format
msgctxt "@action:button The thing being rejected is an invitation to chat" msgctxt "@action:button The thing being rejected is an invitation to chat"
msgid "Reject" msgid "Reject"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:264 #: src/notificationsmanager.cpp:268
#, kde-format #, kde-format
msgctxt "@action:button The thing being rejected is an invitation to chat" msgctxt "@action:button The thing being rejected is an invitation to chat"
msgid "Reject and Ignore User" msgid "Reject and Ignore User"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:323 #: src/notificationsmanager.cpp:327
#, kde-format #, kde-format
msgid "%1 (%2)" msgid "%1 (%2)"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:334 #: src/notificationsmanager.cpp:338
#, kde-format #, kde-format
msgid "Open NeoChat" msgid "Open NeoChat"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:23 #: src/qml/AccountMenu.qml:23 src/qml/UserInfo.qml:46
#, kde-format
msgctxt "@action:button"
msgid "Show QR code"
msgstr ""
#: src/qml/AccountMenu.qml:39 src/qml/UserInfo.qml:46
#, kde-format #, kde-format
msgid "Edit this account" msgid "Edit this account"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:44 src/settings/AccountsPage.qml:34 #: src/qml/AccountMenu.qml:28 src/settings/AccountsPage.qml:34
#: src/settings/AccountsPage.qml:51 #: src/settings/AccountsPage.qml:51
#, kde-format #, kde-format
msgid "Account editor" msgid "Account editor"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:48 #: src/qml/AccountMenu.qml:32
#, kde-format #, kde-format
msgid "Notification settings" msgid "Notification settings"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:55 src/settings/DevicesPage.qml:17 #: src/qml/AccountMenu.qml:39 src/settings/DevicesPage.qml:17
#: src/settings/NeoChatSettingsView.qml:85 #: src/settings/NeoChatSettingsView.qml:85
#, kde-format #, kde-format
msgid "Devices" msgid "Devices"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:62 src/settings/NeoChatGeneralPage.qml:241 #: src/qml/AccountMenu.qml:46 src/settings/NeoChatGeneralPage.qml:241
#, kde-format #, kde-format
msgid "Open developer tools" msgid "Open developer tools"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:68 #: src/qml/AccountMenu.qml:52
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
msgid "Developer Tools" msgid "Developer Tools"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:74 #: src/qml/AccountMenu.qml:58
#, kde-format #, kde-format
msgctxt "@action:inmenu" msgctxt "@action:inmenu"
msgid "Open Secret Backup" msgid "Open Secret Backup"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:78 #: src/qml/AccountMenu.qml:62
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
msgid "Open Key Backup" msgid "Open Key Backup"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:82 #: src/qml/AccountMenu.qml:66
#, kde-format #, kde-format
msgctxt "@action:inmenu" msgctxt "@action:inmenu"
msgid "Verify this Device" msgid "Verify this Device"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:88 src/settings/AccountsPage.qml:88 #: src/qml/AccountMenu.qml:72 src/settings/AccountsPage.qml:88
#, kde-format #, kde-format
msgid "Logout" msgid "Logout"
msgstr "" msgstr ""
@@ -2194,8 +2186,8 @@ msgstr ""
#: src/qml/CreateRoomDialog.qml:30 src/qml/ExploreComponent.qml:64 #: src/qml/CreateRoomDialog.qml:30 src/qml/ExploreComponent.qml:64
#: src/qml/ExploreComponent.qml:66 src/qml/ExploreComponentMobile.qml:162 #: src/qml/ExploreComponent.qml:66 src/qml/ExploreComponentMobile.qml:162
#: src/qml/ExploreComponentMobile.qml:164 src/qml/SpaceDrawer.qml:272 #: src/qml/ExploreComponentMobile.qml:164 src/qml/SpaceDrawer.qml:294
#: src/qml/SpaceDrawer.qml:274 #: src/qml/SpaceDrawer.qml:296
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Create a Space" msgid "Create a Space"
@@ -2228,7 +2220,7 @@ msgstr ""
msgid "Space" msgid "Space"
msgstr "" msgstr ""
#: src/qml/CreateRoomDialog.qml:77 #: src/qml/CreateRoomDialog.qml:77 src/settings/AccountEditorPage.qml:106
#, kde-format #, kde-format
msgid "Name:" msgid "Name:"
msgstr "" msgstr ""
@@ -2866,13 +2858,13 @@ msgstr ""
msgid "Send this location" msgid "Send this location"
msgstr "" msgstr ""
#: src/qml/LocationsPage.qml:16 src/qml/RoomInformation.qml:125 #: src/qml/LocationsPage.qml:16 src/qml/RoomInformation.qml:127
#, kde-format #, kde-format
msgctxt "Locations on a map" msgctxt "Locations on a map"
msgid "Locations" msgid "Locations"
msgstr "" msgstr ""
#: src/qml/LocationsPage.qml:65 #: src/qml/LocationsPage.qml:68
#, kde-format #, kde-format
msgid "There are no locations shared in this room." msgid "There are no locations shared in this room."
msgstr "" msgstr ""
@@ -3118,12 +3110,12 @@ msgstr ""
msgid "Reason for reporting this message" msgid "Reason for reporting this message"
msgstr "" msgstr ""
#: src/qml/RoomDelegate.qml:112 #: src/qml/RoomDelegate.qml:108
#, kde-format #, kde-format
msgid "Muted room" msgid "Muted room"
msgstr "" msgstr ""
#: src/qml/RoomDelegate.qml:145 #: src/qml/RoomDelegate.qml:141
#, kde-format #, kde-format
msgid "Configure room" msgid "Configure room"
msgstr "" msgstr ""
@@ -3144,86 +3136,86 @@ msgstr ""
msgid "Media" msgid "Media"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:40 #: src/qml/RoomInformation.qml:42
#, kde-format #, kde-format
msgctxt "@action:title" msgctxt "@action:title"
msgid "Space Members" msgid "Space Members"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:40 #: src/qml/RoomInformation.qml:42
#, kde-format #, kde-format
msgctxt "@action:title" msgctxt "@action:title"
msgid "Room information" msgid "Room information"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:68 #: src/qml/RoomInformation.qml:70
#, kde-format #, kde-format
msgctxt "Room actions" msgctxt "Room actions"
msgid "Actions" msgid "Actions"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:78 #: src/qml/RoomInformation.qml:80
#, kde-format #, kde-format
msgid "Search in this room" msgid "Search in this room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:87 #: src/qml/RoomInformation.qml:89
#, kde-format #, kde-format
msgctxt "@action:title" msgctxt "@action:title"
msgid "Search" msgid "Search"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:95 #: src/qml/RoomInformation.qml:97
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Verify user" msgid "Verify user"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:106 #: src/qml/RoomInformation.qml:108
#, kde-format #, kde-format
msgid "Remove room from favorites" msgid "Remove room from favorites"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:106 #: src/qml/RoomInformation.qml:108
#, kde-format #, kde-format
msgid "Favorite this room" msgid "Favorite this room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:119 #: src/qml/RoomInformation.qml:121
#, kde-format #, kde-format
msgid "Show locations for this room" msgid "Show locations for this room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:134 #: src/qml/RoomInformation.qml:136
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Leave this room" msgid "Leave this room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:147 #: src/qml/RoomInformation.qml:149
#, kde-format #, kde-format
msgid "Members" msgid "Members"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:162 src/qml/SpaceHomePage.qml:55 #: src/qml/RoomInformation.qml:164 src/qml/SpaceHomePage.qml:55
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Invite a User" msgid "Invite a User"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:166 #: src/qml/RoomInformation.qml:168
#, kde-format #, kde-format
msgid "Invite user to room" msgid "Invite user to room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:173 #: src/qml/RoomInformation.qml:175
#, kde-format #, kde-format
msgid "%1 member" msgid "%1 member"
msgid_plural "%1 members" msgid_plural "%1 members"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: src/qml/RoomInformation.qml:173 #: src/qml/RoomInformation.qml:175
#, kde-format #, kde-format
msgid "No member count" msgid "No member count"
msgstr "" msgstr ""
@@ -3270,12 +3262,7 @@ msgstr ""
msgid "NeoChat is offline. Please check your network connection." msgid "NeoChat is offline. Please check your network connection."
msgstr "" msgstr ""
#: src/qml/RoomPage.qml:158 #: src/qml/RoomPage.qml:264
#, kde-format
msgid "Select or join a room to get started"
msgstr ""
#: src/qml/RoomPage.qml:265
#, kde-format #, kde-format
msgid "Message Source" msgid "Message Source"
msgstr "" msgstr ""
@@ -3430,19 +3417,19 @@ msgstr ""
msgid "Home" msgid "Home"
msgstr "" msgstr ""
#: src/qml/SpaceDrawer.qml:135 #: src/qml/SpaceDrawer.qml:134
#, kde-format #, kde-format
msgctxt "@button View all one-on-one chats with your friends." msgctxt "@button View all one-on-one chats with your friends."
msgid "Friends" msgid "Friends"
msgstr "" msgstr ""
#: src/qml/SpaceDrawer.qml:220 #: src/qml/SpaceDrawer.qml:242
#, kde-format #, kde-format
msgctxt "Join <name of a space>" msgctxt "Join <name of a space>"
msgid "Join %1" msgid "Join %1"
msgstr "" msgstr ""
#: src/qml/SpaceDrawer.qml:262 #: src/qml/SpaceDrawer.qml:284
#, kde-format #, kde-format
msgid "Create a space" msgid "Create a space"
msgstr "" msgstr ""
@@ -3529,27 +3516,27 @@ msgctxt "'Space' is a matrix space"
msgid "Leave Space" msgid "Leave Space"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:196 #: src/qml/TimelineView.qml:201
#, kde-format #, kde-format
msgid "Jump to first unread message" msgid "Jump to first unread message"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:196 #: src/qml/TimelineView.qml:201
#, kde-format #, kde-format
msgid "Jump to oldest loaded message" msgid "Jump to oldest loaded message"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:236 #: src/qml/TimelineView.qml:245
#, kde-format #, kde-format
msgid "Jump to latest message" msgid "Jump to latest message"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:261 #: src/qml/TimelineView.qml:270
#, kde-format #, kde-format
msgid "Drag items here to share them" msgid "Drag items here to share them"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:268 #: src/qml/TimelineView.qml:277
#, kde-format #, kde-format
msgctxt "Message displayed when some users are typing" msgctxt "Message displayed when some users are typing"
msgid "%2 is typing" msgid "%2 is typing"
@@ -3891,72 +3878,72 @@ msgstr ""
msgid "The session verification was canceled due to an unknown error." msgid "The session verification was canceled due to an unknown error."
msgstr "" msgstr ""
#: src/registration.cpp:311 #: src/registration.cpp:309
#, kde-format #, kde-format
msgid "No server." msgid "No server."
msgstr "" msgstr ""
#: src/registration.cpp:313 #: src/registration.cpp:311
#, kde-format #, kde-format
msgid "Checking Server availability." msgid "Checking Server availability."
msgstr "" msgstr ""
#: src/registration.cpp:315 #: src/registration.cpp:313
#, kde-format #, kde-format
msgid "This is not a valid server." msgid "This is not a valid server."
msgstr "" msgstr ""
#: src/registration.cpp:317 #: src/registration.cpp:315
#, kde-format #, kde-format
msgid "Registration for this server is disabled." msgid "Registration for this server is disabled."
msgstr "" msgstr ""
#: src/registration.cpp:319 #: src/registration.cpp:317
#, kde-format #, kde-format
msgid "No username." msgid "No username."
msgstr "" msgstr ""
#: src/registration.cpp:321 #: src/registration.cpp:319
#, kde-format #, kde-format
msgid "Checking username availability." msgid "Checking username availability."
msgstr "" msgstr ""
#: src/registration.cpp:323 #: src/registration.cpp:321
#, kde-format #, kde-format
msgid "This username is not available." msgid "This username is not available."
msgstr "" msgstr ""
#: src/registration.cpp:325 #: src/registration.cpp:323
#, kde-format #, kde-format
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
#: src/registration.cpp:327 #: src/registration.cpp:325
#, kde-format #, kde-format
msgid "Working" msgid "Working"
msgstr "" msgstr ""
#: src/roommanager.cpp:138 #: src/roommanager.cpp:139
#, kde-format #, kde-format
msgid "Malformed or empty Matrix id" msgid "Malformed or empty Matrix id"
msgstr "" msgstr ""
#: src/roommanager.cpp:138 #: src/roommanager.cpp:139
#, kde-format #, kde-format
msgid "%1 is not a correct Matrix identifier" msgid "%1 is not a correct Matrix identifier"
msgstr "" msgstr ""
#: src/roommanager.cpp:345 #: src/roommanager.cpp:352
#, kde-format #, kde-format
msgid "Failed to join room" msgid "Failed to join room"
msgstr "" msgstr ""
#: src/roommanager.cpp:377 #: src/roommanager.cpp:388
#, kde-format #, kde-format
msgid "You requested to join '%1'" msgid "You requested to join '%1'"
msgstr "" msgstr ""
#: src/roommanager.cpp:381 #: src/roommanager.cpp:392
#, kde-format #, kde-format
msgid "Failed to request joining room" msgid "Failed to request joining room"
msgstr "" msgstr ""
@@ -3978,12 +3965,7 @@ msgstr ""
#: src/settings/AccountEditorPage.qml:101 #: src/settings/AccountEditorPage.qml:101
#, kde-format #, kde-format
msgid "User Information" msgid "User information"
msgstr ""
#: src/settings/AccountEditorPage.qml:106
#, kde-format
msgid "Display Name:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:112 #: src/settings/AccountEditorPage.qml:112
@@ -3991,101 +3973,96 @@ msgstr ""
msgid "Label:" msgid "Label:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:113 #: src/settings/AccountEditorPage.qml:117
#, kde-format
msgid "Work"
msgstr ""
#: src/settings/AccountEditorPage.qml:118
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Show QR Code" msgid "QR code for account"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:135 #: src/settings/AccountEditorPage.qml:133
#: src/settings/AccountEditorPage.qml:191 #: src/settings/AccountEditorPage.qml:188
#: src/settings/EmoticonEditorPage.qml:108 src/settings/RoomGeneralPage.qml:105 #: src/settings/EmoticonEditorPage.qml:108 src/settings/RoomGeneralPage.qml:105
#, kde-format #, kde-format
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:157 #: src/settings/AccountEditorPage.qml:154
#, kde-format #, kde-format
msgid "Your server doesn't support changing your password" msgid "Your server doesn't support changing your password"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:164 #: src/settings/AccountEditorPage.qml:161
#, kde-format #, kde-format
msgid "Current Password:" msgid "Current Password:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:171 #: src/settings/AccountEditorPage.qml:168
#, kde-format #, kde-format
msgid "New Password:" msgid "New Password:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:178 #: src/settings/AccountEditorPage.qml:175
#, kde-format #, kde-format
msgid "Confirm new Password:" msgid "Confirm new Password:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:183 #: src/settings/AccountEditorPage.qml:180
#, kde-format #, kde-format
msgid "Passwords don't match" msgid "Passwords don't match"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:198 #: src/settings/AccountEditorPage.qml:194
#, kde-format #, kde-format
msgid "Passwords do not match" msgid "Passwords do not match"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:205 #: src/settings/AccountEditorPage.qml:201
#, kde-format #, kde-format
msgid "Email Addresses" msgid "Email Addresses"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:211 #: src/settings/AccountEditorPage.qml:207
#, kde-format #, kde-format
msgid "Phone Numbers" msgid "Phone Numbers"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:216 #: src/settings/AccountEditorPage.qml:212
#, kde-format #, kde-format
msgid "Identity Server" msgid "Identity Server"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:225 #: src/settings/AccountEditorPage.qml:221
#, kde-format #, kde-format
msgid "Server Information" msgid "Server Information"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:229 #: src/settings/AccountEditorPage.qml:225
#, kde-format #, kde-format
msgid "Homeserver url" msgid "Homeserver url"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:250 #: src/settings/AccountEditorPage.qml:246
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Account Management" msgid "Account Management"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:255 #: src/settings/AccountEditorPage.qml:251
#, kde-format #, kde-format
msgid "Deactivate Account" msgid "Deactivate Account"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:271 #: src/settings/AccountEditorPage.qml:266
#, kde-format #, kde-format
msgid "Password changed successfully" msgid "Password changed successfully"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:273 #: src/settings/AccountEditorPage.qml:268
#, kde-format #, kde-format
msgid "Wrong password entered" msgid "Wrong password entered"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:275 #: src/settings/AccountEditorPage.qml:270
#, kde-format #, kde-format
msgid "Unknown problem while trying to change password" msgid "Unknown problem while trying to change password"
msgstr "" msgstr ""
@@ -4326,44 +4303,6 @@ msgctxt "@title"
msgid "Stickers & Emojis" msgid "Stickers & Emojis"
msgstr "" msgstr ""
#: src/settings/ExportKeysDialog.qml:18
#: src/settings/NeoChatSecurityPage.qml:101
#, kde-format
msgctxt "@title"
msgid "Export Keys"
msgstr ""
#: src/settings/ExportKeysDialog.qml:33 src/settings/ImportKeysDialog.qml:51
#, kde-format
msgctxt "@label:textbox"
msgid "Passphrase:"
msgstr ""
#: src/settings/ExportKeysDialog.qml:37
#, kde-format
msgid ""
"A passphrase to secure your key backup. It should not be your account "
"password."
msgstr ""
#: src/settings/ExportKeysDialog.qml:42
#, kde-format
msgctxt "@action:button"
msgid "Export keys"
msgstr ""
#: src/settings/ExportKeysDialog.qml:50
#, kde-format
msgctxt "@info"
msgid "Keys exported successfully"
msgstr ""
#: src/settings/ExportKeysDialog.qml:54 src/settings/ImportKeysDialog.qml:74
#, kde-format
msgctxt "@info"
msgid "Unknown error"
msgstr ""
#: src/settings/GlobalNotificationsPage.qml:19 #: src/settings/GlobalNotificationsPage.qml:19
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
@@ -4463,48 +4402,25 @@ msgctxt "@title"
msgid "Ignored Users" msgid "Ignored Users"
msgstr "" msgstr ""
#: src/settings/IgnoredUsersDialog.qml:25 #: src/settings/IgnoredUsersDialog.qml:24
#: src/settings/NeoChatSecurityPage.qml:35
#, kde-format #, kde-format
msgctxt "Placeholder message when no user is ignored" msgctxt "@title:group"
msgid "No ignored users" msgid "Ignored Users"
msgstr "" msgstr ""
#: src/settings/IgnoredUsersDialog.qml:55 #: src/settings/IgnoredUsersDialog.qml:29
#, kde-format
msgctxt "Placeholder message when no user is ignored"
msgid "You are not ignoring any users"
msgstr ""
#: src/settings/IgnoredUsersDialog.qml:51
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Unignore this user" msgid "Unignore this user"
msgstr "" msgstr ""
#: src/settings/ImportKeysDialog.qml:22 src/settings/NeoChatSecurityPage.qml:84
#, kde-format
msgctxt "@title"
msgid "Import Keys"
msgstr ""
#: src/settings/ImportKeysDialog.qml:35
#, kde-format
msgctxt "@action:button"
msgid "Choose backup file"
msgstr ""
#: src/settings/ImportKeysDialog.qml:56
#, kde-format
msgctxt "@action:button"
msgid "Import keys"
msgstr ""
#: src/settings/ImportKeysDialog.qml:66
#, kde-format
msgctxt "@info"
msgid "Invalid passphrase"
msgstr ""
#: src/settings/ImportKeysDialog.qml:70
#, kde-format
msgctxt "@info"
msgid "Invalid key backup data"
msgstr ""
#: src/settings/NeoChatGeneralPage.qml:20 #: src/settings/NeoChatGeneralPage.qml:20
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
@@ -4609,99 +4525,69 @@ msgstr ""
msgid "Enable developer tools" msgid "Enable developer tools"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:18 #: src/settings/NeoChatSecurityPage.qml:17
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Security" msgid "Security"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:28 #: src/settings/NeoChatSecurityPage.qml:20
#, kde-format #, kde-format
msgctxt "@title:group" msgctxt "@title:group"
msgid "Invitations" msgid "Invitations"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:32 #: src/settings/NeoChatSecurityPage.qml:24
#, kde-format #, kde-format
msgctxt "@option:check" msgctxt "@option:check"
msgid "Reject invitations from unknown users" msgid "Reject invitations from unknown users"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:33 #: src/settings/NeoChatSecurityPage.qml:25
#, kde-format #, kde-format
msgid "" msgid ""
"If enabled, NeoChat will reject invitations from users you don't share a " "If enabled, NeoChat will reject invitations from from users you don't share "
"room with." "a room with."
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:33 #: src/settings/NeoChatSecurityPage.qml:25
#, kde-format #, kde-format
msgid "Your server does not support this setting." msgid "Your server does not support this setting."
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:43 #: src/settings/NeoChatSecurityPage.qml:39
#, kde-format
msgctxt "@title:group"
msgid "Ignored Users"
msgstr ""
#: src/settings/NeoChatSecurityPage.qml:47
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Manage ignored users" msgid "Manage ignored users"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:49 #: src/settings/NeoChatSecurityPage.qml:41
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
msgid "Ignored Users" msgid "Ignored Users"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:54 #: src/settings/NeoChatSecurityPage.qml:46
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Keys" msgid "Keys"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:59 #: src/settings/NeoChatSecurityPage.qml:51
#, kde-format #, kde-format
msgid "Device key" msgid "Device key"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:63 #: src/settings/NeoChatSecurityPage.qml:55
#, kde-format #, kde-format
msgid "Encryption key" msgid "Encryption key"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:67 #: src/settings/NeoChatSecurityPage.qml:59
#, kde-format #, kde-format
msgid "Device id" msgid "Device id"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:73
#, kde-format
msgctxt "@title"
msgid "Encryption Keys"
msgstr ""
#: src/settings/NeoChatSecurityPage.qml:78
#, kde-format
msgctxt "@action:button"
msgid "Import Encryption Keys"
msgstr ""
#: src/settings/NeoChatSecurityPage.qml:87
#, kde-format
msgctxt "@info"
msgid "Keys imported successfully"
msgstr ""
#: src/settings/NeoChatSecurityPage.qml:95
#, kde-format
msgctxt "@action:button"
msgid "Export Encryption Keys"
msgstr ""
#: src/settings/NeoChatSettingsView.qml:22 src/settings/RoomGeneralPage.qml:22 #: src/settings/NeoChatSettingsView.qml:22 src/settings/RoomGeneralPage.qml:22
#: src/settings/RoomSettingsView.qml:39 #: src/settings/RoomSettingsView.qml:39
#, kde-format #, kde-format
@@ -5239,13 +5125,13 @@ msgstr ""
#: src/settings/ThreePIdCard.qml:146 #: src/settings/ThreePIdCard.qml:146
#, kde-format #, kde-format
msgctxt "@label:textbox" msgctxt "@label:textbox"
msgid "New Email Address:" msgid "New email address"
msgstr "" msgstr ""
#: src/settings/ThreePIdCard.qml:146 #: src/settings/ThreePIdCard.qml:146
#, kde-format #, kde-format
msgctxt "@label:textbox" msgctxt "@label:textbox"
msgid "New Phone Number:" msgid "New phone number"
msgstr "" msgstr ""
#: src/settings/ThreePIdCard.qml:150 src/threepidbindhelper.cpp:177 #: src/settings/ThreePIdCard.qml:150 src/threepidbindhelper.cpp:177
@@ -5293,13 +5179,13 @@ msgid ""
"follow the instructions there and then click the button below" "follow the instructions there and then click the button below"
msgstr "" msgstr ""
#: src/settings/ThreePIdCard.qml:183 #: src/settings/ThreePIdCard.qml:181
#, kde-format #, kde-format
msgctxt "@action:button Add new email or phone number" msgctxt "@action:button Add new email or phone number"
msgid "Add" msgid "Add"
msgstr "" msgstr ""
#: src/settings/ThreePIdCard.qml:191 #: src/settings/ThreePIdCard.qml:189
#, kde-format #, kde-format
msgctxt "@action:button As in 'go back'" msgctxt "@action:button As in 'go back'"
msgid "Back" msgid "Back"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: neochat\n" "Project-Id-Version: neochat\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-08-07 00:40+0000\n" "POT-Creation-Date: 2024-10-07 02:28+0000\n"
"PO-Revision-Date: 2020-11-05 23:50-0800\n" "PO-Revision-Date: 2020-11-05 23:50-0800\n"
"Last-Translator: Japanese KDE translation team <kde-jp@kde.org>\n" "Last-Translator: Japanese KDE translation team <kde-jp@kde.org>\n"
"Language-Team: Japanese <kde-jp@kde.org>\n" "Language-Team: Japanese <kde-jp@kde.org>\n"
@@ -85,7 +85,7 @@ msgctxt "@action:button"
msgid "Cancel reply" msgid "Cancel reply"
msgstr "" msgstr ""
#: src/controller.cpp:132 #: src/controller.cpp:136
#, kde-format #, kde-format
msgctxt "" msgctxt ""
"The reason for using push notifications, as in: '[Push notifications are " "The reason for using push notifications, as in: '[Push notifications are "
@@ -93,47 +93,47 @@ msgctxt ""
msgid "Receiving notifications for new messages" msgid "Receiving notifications for new messages"
msgstr "" msgstr ""
#: src/controller.cpp:211 #: src/controller.cpp:229
#, kde-format #, kde-format
msgid "Network Error: %1" msgid "Network Error: %1"
msgstr "" msgstr ""
#: src/controller.cpp:233 #: src/controller.cpp:255
#, kde-format #, kde-format
msgid "Access token wasn't found" msgid "Access token wasn't found"
msgstr "" msgstr ""
#: src/controller.cpp:233 #: src/controller.cpp:255
#, kde-format #, kde-format
msgid "Maybe it was deleted?" msgid "Maybe it was deleted?"
msgstr "" msgstr ""
#: src/controller.cpp:237 #: src/controller.cpp:259
#, kde-format #, kde-format
msgid "Access to keychain was denied." msgid "Access to keychain was denied."
msgstr "" msgstr ""
#: src/controller.cpp:237 #: src/controller.cpp:259
#, kde-format #, kde-format
msgid "Please allow NeoChat to read the access token" msgid "Please allow NeoChat to read the access token"
msgstr "" msgstr ""
#: src/controller.cpp:240 #: src/controller.cpp:262
#, kde-format #, kde-format
msgid "No keychain available." msgid "No keychain available."
msgstr "" msgstr ""
#: src/controller.cpp:240 #: src/controller.cpp:262
#, kde-format #, kde-format
msgid "Please install a keychain, e.g. KWallet or GNOME keyring on Linux" msgid "Please install a keychain, e.g. KWallet or GNOME keyring on Linux"
msgstr "" msgstr ""
#: src/controller.cpp:243 #: src/controller.cpp:265
#, kde-format #, kde-format
msgid "Unable to read access token" msgid "Unable to read access token"
msgstr "" msgstr ""
#: src/controller.cpp:339 #: src/controller.cpp:357
#, kde-format #, kde-format
msgid "Receiving push notifications" msgid "Receiving push notifications"
msgstr "" msgstr ""
@@ -359,7 +359,7 @@ msgid "Custom"
msgstr "" msgstr ""
#: src/enums/powerlevel.cpp:88 src/models/permissionsmodel.cpp:162 #: src/enums/powerlevel.cpp:88 src/models/permissionsmodel.cpp:162
#: src/models/userlistmodel.cpp:114 #: src/models/userlistmodel.cpp:118
#, kde-format #, kde-format
msgctxt "" msgctxt ""
"%1 is the name of the power level, e.g. admin and %2 is the value that " "%1 is the name of the power level, e.g. admin and %2 is the value that "
@@ -368,13 +368,11 @@ msgid "%1 (%2)"
msgstr "" msgstr ""
#: src/eventhandler.cpp:297 src/eventhandler.cpp:505 #: src/eventhandler.cpp:297 src/eventhandler.cpp:505
#: src/models/messagecontentmodel.cpp:236 src/models/messageeventmodel.cpp:440
#, kde-format #, kde-format
msgid "<i>[This message was deleted]</i>" msgid "<i>[This message was deleted]</i>"
msgstr "" msgstr ""
#: src/eventhandler.cpp:297 src/models/messagecontentmodel.cpp:237 #: src/eventhandler.cpp:297
#: src/models/messageeventmodel.cpp:441
#, kde-format #, kde-format
msgid "<i>[This message was deleted: %1]</i>" msgid "<i>[This message was deleted: %1]</i>"
msgstr "" msgstr ""
@@ -734,12 +732,12 @@ msgctxt "The location being downloaded to"
msgid "Destination" msgid "Destination"
msgstr "" msgstr ""
#: src/login.cpp:90 src/login.cpp:105 #: src/login.cpp:88 src/login.cpp:103
#, kde-format #, kde-format
msgid "Network Error" msgid "Network Error"
msgstr "" msgstr ""
#: src/login.cpp:98 #: src/login.cpp:96
#, kde-format #, kde-format
msgid "Login Failed: %1" msgid "Login Failed: %1"
msgstr "" msgstr ""
@@ -808,7 +806,7 @@ msgid "Loading…"
msgstr "" msgstr ""
#: src/login/Login.qml:38 src/login/WelcomePage.qml:198 #: src/login/Login.qml:38 src/login/WelcomePage.qml:198
#: src/settings/ThreePIdCard.qml:183 #: src/settings/ThreePIdCard.qml:181
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Continue" msgid "Continue"
@@ -849,7 +847,7 @@ msgstr ""
msgid "Password:" msgid "Password:"
msgstr "" msgstr ""
#: src/login/Password.qml:32 src/settings/AccountEditorPage.qml:152 #: src/login/Password.qml:32 src/settings/AccountEditorPage.qml:149
#: src/settings/NetworkProxyPage.qml:95 #: src/settings/NetworkProxyPage.qml:95
#, kde-format #, kde-format
msgid "Password" msgid "Password"
@@ -1453,7 +1451,7 @@ msgctxt "As in 'The user's own emojis"
msgid "Own Emojis" msgid "Own Emojis"
msgstr "" msgstr ""
#: src/models/messagecontentmodel.cpp:229 #: src/models/messagecontentmodel.cpp:223
#: src/timeline/LinkPreviewLoadComponent.qml:66 #: src/timeline/LinkPreviewLoadComponent.qml:66
#, kde-format #, kde-format
msgid "Loading reply" msgid "Loading reply"
@@ -1686,20 +1684,20 @@ msgctxt "Notification type"
msgid "Call invitation" msgid "Call invitation"
msgstr "" msgstr ""
#: src/models/reactionmodel.cpp:69 #: src/models/reactionmodel.cpp:64
#, kde-format #, kde-format
msgctxt "Separate the usernames of users" msgctxt "Separate the usernames of users"
msgid " and " msgid " and "
msgstr "" msgstr ""
#: src/models/reactionmodel.cpp:76 #: src/models/reactionmodel.cpp:71
#, kde-format #, kde-format
msgctxt "%1 is the number of other users" msgctxt "%1 is the number of other users"
msgid " and %1 other" msgid " and %1 other"
msgid_plural " and %1 others" msgid_plural " and %1 others"
msgstr[0] "" msgstr[0] ""
#: src/models/reactionmodel.cpp:80 #: src/models/reactionmodel.cpp:75
#, kde-format #, kde-format
msgctxt "%2 is the users who reacted and %3 the emoji that was given" msgctxt "%2 is the users who reacted and %3 the emoji that was given"
msgid "%2 reacted with %3" msgid "%2 reacted with %3"
@@ -1750,139 +1748,133 @@ msgstr ""
msgid "Space creation failed: %1" msgid "Space creation failed: %1"
msgstr "" msgstr ""
#: src/neochatroom.cpp:1403 #: src/neochatroom.cpp:1439
#, kde-format #, kde-format
msgid "Report sent successfully." msgid "Report sent successfully."
msgstr "" msgstr ""
#: src/neochatroom.cpp:1724 src/neochatroom.cpp:1732 #: src/neochatroom.cpp:1764 src/neochatroom.cpp:1772
#, kde-format #, kde-format
msgctxt "'Lat' and 'Lon' as in Latitude and Longitude" msgctxt "'Lat' and 'Lon' as in Latitude and Longitude"
msgid "Lat: %1, Lon: %2" msgid "Lat: %1, Lon: %2"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:126 src/notificationsmanager.cpp:330 #: src/notificationsmanager.cpp:126 src/notificationsmanager.cpp:334
#, kde-format #, kde-format
msgid "Encrypted Message" msgid "Encrypted Message"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:210 src/qml/Main.qml:279 #: src/notificationsmanager.cpp:214 src/qml/Main.qml:279
#, kde-format #, kde-format
msgid "%1: %2" msgid "%1: %2"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:216 #: src/notificationsmanager.cpp:220
#, kde-format #, kde-format
msgid "Open NeoChat in this room" msgid "Open NeoChat in this room"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:229 src/qml/DelegateContextMenu.qml:98 #: src/notificationsmanager.cpp:233 src/qml/DelegateContextMenu.qml:98
#: src/qml/HoverActions.qml:111 #: src/qml/HoverActions.qml:111
#, kde-format #, kde-format
msgid "Reply" msgid "Reply"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:230 #: src/notificationsmanager.cpp:234
#, kde-format #, kde-format
msgid "Reply..." msgid "Reply..."
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:249 #: src/notificationsmanager.cpp:253
#, kde-format #, kde-format
msgid "%1 invited you to a room" msgid "%1 invited you to a room"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:252 #: src/notificationsmanager.cpp:256
#, kde-format #, kde-format
msgid "Open this invitation in NeoChat" msgid "Open this invitation in NeoChat"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:262 #: src/notificationsmanager.cpp:266
#, kde-format #, kde-format
msgctxt "@action:button The thing being accepted is an invitation to chat" msgctxt "@action:button The thing being accepted is an invitation to chat"
msgid "Accept" msgid "Accept"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:263 #: src/notificationsmanager.cpp:267
#, kde-format #, kde-format
msgctxt "@action:button The thing being rejected is an invitation to chat" msgctxt "@action:button The thing being rejected is an invitation to chat"
msgid "Reject" msgid "Reject"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:264 #: src/notificationsmanager.cpp:268
#, kde-format #, kde-format
msgctxt "@action:button The thing being rejected is an invitation to chat" msgctxt "@action:button The thing being rejected is an invitation to chat"
msgid "Reject and Ignore User" msgid "Reject and Ignore User"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:323 #: src/notificationsmanager.cpp:327
#, kde-format #, kde-format
msgid "%1 (%2)" msgid "%1 (%2)"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:334 #: src/notificationsmanager.cpp:338
#, kde-format #, kde-format
msgid "Open NeoChat" msgid "Open NeoChat"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:23 #: src/qml/AccountMenu.qml:23 src/qml/UserInfo.qml:46
#, kde-format
msgctxt "@action:button"
msgid "Show QR code"
msgstr ""
#: src/qml/AccountMenu.qml:39 src/qml/UserInfo.qml:46
#, kde-format #, kde-format
msgid "Edit this account" msgid "Edit this account"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:44 src/settings/AccountsPage.qml:34 #: src/qml/AccountMenu.qml:28 src/settings/AccountsPage.qml:34
#: src/settings/AccountsPage.qml:51 #: src/settings/AccountsPage.qml:51
#, kde-format #, kde-format
msgid "Account editor" msgid "Account editor"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:48 #: src/qml/AccountMenu.qml:32
#, kde-format #, kde-format
msgid "Notification settings" msgid "Notification settings"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:55 src/settings/DevicesPage.qml:17 #: src/qml/AccountMenu.qml:39 src/settings/DevicesPage.qml:17
#: src/settings/NeoChatSettingsView.qml:85 #: src/settings/NeoChatSettingsView.qml:85
#, kde-format #, kde-format
msgid "Devices" msgid "Devices"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:62 src/settings/NeoChatGeneralPage.qml:241 #: src/qml/AccountMenu.qml:46 src/settings/NeoChatGeneralPage.qml:241
#, kde-format #, kde-format
msgid "Open developer tools" msgid "Open developer tools"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:68 #: src/qml/AccountMenu.qml:52
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
msgid "Developer Tools" msgid "Developer Tools"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:74 #: src/qml/AccountMenu.qml:58
#, kde-format #, kde-format
msgctxt "@action:inmenu" msgctxt "@action:inmenu"
msgid "Open Secret Backup" msgid "Open Secret Backup"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:78 #: src/qml/AccountMenu.qml:62
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
msgid "Open Key Backup" msgid "Open Key Backup"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:82 #: src/qml/AccountMenu.qml:66
#, kde-format #, kde-format
msgctxt "@action:inmenu" msgctxt "@action:inmenu"
msgid "Verify this Device" msgid "Verify this Device"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:88 src/settings/AccountsPage.qml:88 #: src/qml/AccountMenu.qml:72 src/settings/AccountsPage.qml:88
#, kde-format #, kde-format
msgid "Logout" msgid "Logout"
msgstr "" msgstr ""
@@ -2185,8 +2177,8 @@ msgstr ""
#: src/qml/CreateRoomDialog.qml:30 src/qml/ExploreComponent.qml:64 #: src/qml/CreateRoomDialog.qml:30 src/qml/ExploreComponent.qml:64
#: src/qml/ExploreComponent.qml:66 src/qml/ExploreComponentMobile.qml:162 #: src/qml/ExploreComponent.qml:66 src/qml/ExploreComponentMobile.qml:162
#: src/qml/ExploreComponentMobile.qml:164 src/qml/SpaceDrawer.qml:272 #: src/qml/ExploreComponentMobile.qml:164 src/qml/SpaceDrawer.qml:294
#: src/qml/SpaceDrawer.qml:274 #: src/qml/SpaceDrawer.qml:296
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Create a Space" msgid "Create a Space"
@@ -2219,7 +2211,7 @@ msgstr ""
msgid "Space" msgid "Space"
msgstr "" msgstr ""
#: src/qml/CreateRoomDialog.qml:77 #: src/qml/CreateRoomDialog.qml:77 src/settings/AccountEditorPage.qml:106
#, kde-format #, kde-format
msgid "Name:" msgid "Name:"
msgstr "" msgstr ""
@@ -2857,13 +2849,13 @@ msgstr ""
msgid "Send this location" msgid "Send this location"
msgstr "" msgstr ""
#: src/qml/LocationsPage.qml:16 src/qml/RoomInformation.qml:125 #: src/qml/LocationsPage.qml:16 src/qml/RoomInformation.qml:127
#, kde-format #, kde-format
msgctxt "Locations on a map" msgctxt "Locations on a map"
msgid "Locations" msgid "Locations"
msgstr "" msgstr ""
#: src/qml/LocationsPage.qml:65 #: src/qml/LocationsPage.qml:68
#, kde-format #, kde-format
msgid "There are no locations shared in this room." msgid "There are no locations shared in this room."
msgstr "" msgstr ""
@@ -3109,12 +3101,12 @@ msgstr ""
msgid "Reason for reporting this message" msgid "Reason for reporting this message"
msgstr "" msgstr ""
#: src/qml/RoomDelegate.qml:112 #: src/qml/RoomDelegate.qml:108
#, kde-format #, kde-format
msgid "Muted room" msgid "Muted room"
msgstr "" msgstr ""
#: src/qml/RoomDelegate.qml:145 #: src/qml/RoomDelegate.qml:141
#, kde-format #, kde-format
msgid "Configure room" msgid "Configure room"
msgstr "" msgstr ""
@@ -3135,85 +3127,85 @@ msgstr ""
msgid "Media" msgid "Media"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:40 #: src/qml/RoomInformation.qml:42
#, kde-format #, kde-format
msgctxt "@action:title" msgctxt "@action:title"
msgid "Space Members" msgid "Space Members"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:40 #: src/qml/RoomInformation.qml:42
#, kde-format #, kde-format
msgctxt "@action:title" msgctxt "@action:title"
msgid "Room information" msgid "Room information"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:68 #: src/qml/RoomInformation.qml:70
#, kde-format #, kde-format
msgctxt "Room actions" msgctxt "Room actions"
msgid "Actions" msgid "Actions"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:78 #: src/qml/RoomInformation.qml:80
#, kde-format #, kde-format
msgid "Search in this room" msgid "Search in this room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:87 #: src/qml/RoomInformation.qml:89
#, kde-format #, kde-format
msgctxt "@action:title" msgctxt "@action:title"
msgid "Search" msgid "Search"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:95 #: src/qml/RoomInformation.qml:97
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Verify user" msgid "Verify user"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:106 #: src/qml/RoomInformation.qml:108
#, kde-format #, kde-format
msgid "Remove room from favorites" msgid "Remove room from favorites"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:106 #: src/qml/RoomInformation.qml:108
#, kde-format #, kde-format
msgid "Favorite this room" msgid "Favorite this room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:119 #: src/qml/RoomInformation.qml:121
#, kde-format #, kde-format
msgid "Show locations for this room" msgid "Show locations for this room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:134 #: src/qml/RoomInformation.qml:136
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Leave this room" msgid "Leave this room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:147 #: src/qml/RoomInformation.qml:149
#, kde-format #, kde-format
msgid "Members" msgid "Members"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:162 src/qml/SpaceHomePage.qml:55 #: src/qml/RoomInformation.qml:164 src/qml/SpaceHomePage.qml:55
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Invite a User" msgid "Invite a User"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:166 #: src/qml/RoomInformation.qml:168
#, kde-format #, kde-format
msgid "Invite user to room" msgid "Invite user to room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:173 #: src/qml/RoomInformation.qml:175
#, kde-format #, kde-format
msgid "%1 member" msgid "%1 member"
msgid_plural "%1 members" msgid_plural "%1 members"
msgstr[0] "" msgstr[0] ""
#: src/qml/RoomInformation.qml:173 #: src/qml/RoomInformation.qml:175
#, kde-format #, kde-format
msgid "No member count" msgid "No member count"
msgstr "" msgstr ""
@@ -3260,12 +3252,7 @@ msgstr ""
msgid "NeoChat is offline. Please check your network connection." msgid "NeoChat is offline. Please check your network connection."
msgstr "" msgstr ""
#: src/qml/RoomPage.qml:158 #: src/qml/RoomPage.qml:264
#, kde-format
msgid "Select or join a room to get started"
msgstr ""
#: src/qml/RoomPage.qml:265
#, kde-format #, kde-format
msgid "Message Source" msgid "Message Source"
msgstr "" msgstr ""
@@ -3420,19 +3407,19 @@ msgstr ""
msgid "Home" msgid "Home"
msgstr "" msgstr ""
#: src/qml/SpaceDrawer.qml:135 #: src/qml/SpaceDrawer.qml:134
#, kde-format #, kde-format
msgctxt "@button View all one-on-one chats with your friends." msgctxt "@button View all one-on-one chats with your friends."
msgid "Friends" msgid "Friends"
msgstr "" msgstr ""
#: src/qml/SpaceDrawer.qml:220 #: src/qml/SpaceDrawer.qml:242
#, kde-format #, kde-format
msgctxt "Join <name of a space>" msgctxt "Join <name of a space>"
msgid "Join %1" msgid "Join %1"
msgstr "" msgstr ""
#: src/qml/SpaceDrawer.qml:262 #: src/qml/SpaceDrawer.qml:284
#, kde-format #, kde-format
msgid "Create a space" msgid "Create a space"
msgstr "" msgstr ""
@@ -3517,27 +3504,27 @@ msgctxt "'Space' is a matrix space"
msgid "Leave Space" msgid "Leave Space"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:196 #: src/qml/TimelineView.qml:201
#, kde-format #, kde-format
msgid "Jump to first unread message" msgid "Jump to first unread message"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:196 #: src/qml/TimelineView.qml:201
#, kde-format #, kde-format
msgid "Jump to oldest loaded message" msgid "Jump to oldest loaded message"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:236 #: src/qml/TimelineView.qml:245
#, kde-format #, kde-format
msgid "Jump to latest message" msgid "Jump to latest message"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:261 #: src/qml/TimelineView.qml:270
#, kde-format #, kde-format
msgid "Drag items here to share them" msgid "Drag items here to share them"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:268 #: src/qml/TimelineView.qml:277
#, kde-format #, kde-format
msgctxt "Message displayed when some users are typing" msgctxt "Message displayed when some users are typing"
msgid "%2 is typing" msgid "%2 is typing"
@@ -3878,72 +3865,72 @@ msgstr ""
msgid "The session verification was canceled due to an unknown error." msgid "The session verification was canceled due to an unknown error."
msgstr "" msgstr ""
#: src/registration.cpp:311 #: src/registration.cpp:309
#, kde-format #, kde-format
msgid "No server." msgid "No server."
msgstr "" msgstr ""
#: src/registration.cpp:313 #: src/registration.cpp:311
#, kde-format #, kde-format
msgid "Checking Server availability." msgid "Checking Server availability."
msgstr "" msgstr ""
#: src/registration.cpp:315 #: src/registration.cpp:313
#, kde-format #, kde-format
msgid "This is not a valid server." msgid "This is not a valid server."
msgstr "" msgstr ""
#: src/registration.cpp:317 #: src/registration.cpp:315
#, kde-format #, kde-format
msgid "Registration for this server is disabled." msgid "Registration for this server is disabled."
msgstr "" msgstr ""
#: src/registration.cpp:319 #: src/registration.cpp:317
#, kde-format #, kde-format
msgid "No username." msgid "No username."
msgstr "" msgstr ""
#: src/registration.cpp:321 #: src/registration.cpp:319
#, kde-format #, kde-format
msgid "Checking username availability." msgid "Checking username availability."
msgstr "" msgstr ""
#: src/registration.cpp:323 #: src/registration.cpp:321
#, kde-format #, kde-format
msgid "This username is not available." msgid "This username is not available."
msgstr "" msgstr ""
#: src/registration.cpp:325 #: src/registration.cpp:323
#, kde-format #, kde-format
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
#: src/registration.cpp:327 #: src/registration.cpp:325
#, kde-format #, kde-format
msgid "Working" msgid "Working"
msgstr "" msgstr ""
#: src/roommanager.cpp:138 #: src/roommanager.cpp:139
#, kde-format #, kde-format
msgid "Malformed or empty Matrix id" msgid "Malformed or empty Matrix id"
msgstr "" msgstr ""
#: src/roommanager.cpp:138 #: src/roommanager.cpp:139
#, kde-format #, kde-format
msgid "%1 is not a correct Matrix identifier" msgid "%1 is not a correct Matrix identifier"
msgstr "" msgstr ""
#: src/roommanager.cpp:345 #: src/roommanager.cpp:352
#, kde-format #, kde-format
msgid "Failed to join room" msgid "Failed to join room"
msgstr "" msgstr ""
#: src/roommanager.cpp:377 #: src/roommanager.cpp:388
#, kde-format #, kde-format
msgid "You requested to join '%1'" msgid "You requested to join '%1'"
msgstr "" msgstr ""
#: src/roommanager.cpp:381 #: src/roommanager.cpp:392
#, kde-format #, kde-format
msgid "Failed to request joining room" msgid "Failed to request joining room"
msgstr "" msgstr ""
@@ -3965,12 +3952,7 @@ msgstr ""
#: src/settings/AccountEditorPage.qml:101 #: src/settings/AccountEditorPage.qml:101
#, kde-format #, kde-format
msgid "User Information" msgid "User information"
msgstr ""
#: src/settings/AccountEditorPage.qml:106
#, kde-format
msgid "Display Name:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:112 #: src/settings/AccountEditorPage.qml:112
@@ -3978,101 +3960,96 @@ msgstr ""
msgid "Label:" msgid "Label:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:113 #: src/settings/AccountEditorPage.qml:117
#, kde-format
msgid "Work"
msgstr ""
#: src/settings/AccountEditorPage.qml:118
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Show QR Code" msgid "QR code for account"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:135 #: src/settings/AccountEditorPage.qml:133
#: src/settings/AccountEditorPage.qml:191 #: src/settings/AccountEditorPage.qml:188
#: src/settings/EmoticonEditorPage.qml:108 src/settings/RoomGeneralPage.qml:105 #: src/settings/EmoticonEditorPage.qml:108 src/settings/RoomGeneralPage.qml:105
#, kde-format #, kde-format
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:157 #: src/settings/AccountEditorPage.qml:154
#, kde-format #, kde-format
msgid "Your server doesn't support changing your password" msgid "Your server doesn't support changing your password"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:164 #: src/settings/AccountEditorPage.qml:161
#, kde-format #, kde-format
msgid "Current Password:" msgid "Current Password:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:171 #: src/settings/AccountEditorPage.qml:168
#, kde-format #, kde-format
msgid "New Password:" msgid "New Password:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:178 #: src/settings/AccountEditorPage.qml:175
#, kde-format #, kde-format
msgid "Confirm new Password:" msgid "Confirm new Password:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:183 #: src/settings/AccountEditorPage.qml:180
#, kde-format #, kde-format
msgid "Passwords don't match" msgid "Passwords don't match"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:198 #: src/settings/AccountEditorPage.qml:194
#, kde-format #, kde-format
msgid "Passwords do not match" msgid "Passwords do not match"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:205 #: src/settings/AccountEditorPage.qml:201
#, kde-format #, kde-format
msgid "Email Addresses" msgid "Email Addresses"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:211 #: src/settings/AccountEditorPage.qml:207
#, kde-format #, kde-format
msgid "Phone Numbers" msgid "Phone Numbers"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:216 #: src/settings/AccountEditorPage.qml:212
#, kde-format #, kde-format
msgid "Identity Server" msgid "Identity Server"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:225 #: src/settings/AccountEditorPage.qml:221
#, kde-format #, kde-format
msgid "Server Information" msgid "Server Information"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:229 #: src/settings/AccountEditorPage.qml:225
#, kde-format #, kde-format
msgid "Homeserver url" msgid "Homeserver url"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:250 #: src/settings/AccountEditorPage.qml:246
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Account Management" msgid "Account Management"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:255 #: src/settings/AccountEditorPage.qml:251
#, kde-format #, kde-format
msgid "Deactivate Account" msgid "Deactivate Account"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:271 #: src/settings/AccountEditorPage.qml:266
#, kde-format #, kde-format
msgid "Password changed successfully" msgid "Password changed successfully"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:273 #: src/settings/AccountEditorPage.qml:268
#, kde-format #, kde-format
msgid "Wrong password entered" msgid "Wrong password entered"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:275 #: src/settings/AccountEditorPage.qml:270
#, kde-format #, kde-format
msgid "Unknown problem while trying to change password" msgid "Unknown problem while trying to change password"
msgstr "" msgstr ""
@@ -4313,44 +4290,6 @@ msgctxt "@title"
msgid "Stickers & Emojis" msgid "Stickers & Emojis"
msgstr "" msgstr ""
#: src/settings/ExportKeysDialog.qml:18
#: src/settings/NeoChatSecurityPage.qml:101
#, kde-format
msgctxt "@title"
msgid "Export Keys"
msgstr ""
#: src/settings/ExportKeysDialog.qml:33 src/settings/ImportKeysDialog.qml:51
#, kde-format
msgctxt "@label:textbox"
msgid "Passphrase:"
msgstr ""
#: src/settings/ExportKeysDialog.qml:37
#, kde-format
msgid ""
"A passphrase to secure your key backup. It should not be your account "
"password."
msgstr ""
#: src/settings/ExportKeysDialog.qml:42
#, kde-format
msgctxt "@action:button"
msgid "Export keys"
msgstr ""
#: src/settings/ExportKeysDialog.qml:50
#, kde-format
msgctxt "@info"
msgid "Keys exported successfully"
msgstr ""
#: src/settings/ExportKeysDialog.qml:54 src/settings/ImportKeysDialog.qml:74
#, kde-format
msgctxt "@info"
msgid "Unknown error"
msgstr ""
#: src/settings/GlobalNotificationsPage.qml:19 #: src/settings/GlobalNotificationsPage.qml:19
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
@@ -4450,48 +4389,25 @@ msgctxt "@title"
msgid "Ignored Users" msgid "Ignored Users"
msgstr "" msgstr ""
#: src/settings/IgnoredUsersDialog.qml:25 #: src/settings/IgnoredUsersDialog.qml:24
#: src/settings/NeoChatSecurityPage.qml:35
#, kde-format #, kde-format
msgctxt "Placeholder message when no user is ignored" msgctxt "@title:group"
msgid "No ignored users" msgid "Ignored Users"
msgstr "" msgstr ""
#: src/settings/IgnoredUsersDialog.qml:55 #: src/settings/IgnoredUsersDialog.qml:29
#, kde-format
msgctxt "Placeholder message when no user is ignored"
msgid "You are not ignoring any users"
msgstr ""
#: src/settings/IgnoredUsersDialog.qml:51
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Unignore this user" msgid "Unignore this user"
msgstr "" msgstr ""
#: src/settings/ImportKeysDialog.qml:22 src/settings/NeoChatSecurityPage.qml:84
#, kde-format
msgctxt "@title"
msgid "Import Keys"
msgstr ""
#: src/settings/ImportKeysDialog.qml:35
#, kde-format
msgctxt "@action:button"
msgid "Choose backup file"
msgstr ""
#: src/settings/ImportKeysDialog.qml:56
#, kde-format
msgctxt "@action:button"
msgid "Import keys"
msgstr ""
#: src/settings/ImportKeysDialog.qml:66
#, kde-format
msgctxt "@info"
msgid "Invalid passphrase"
msgstr ""
#: src/settings/ImportKeysDialog.qml:70
#, kde-format
msgctxt "@info"
msgid "Invalid key backup data"
msgstr ""
#: src/settings/NeoChatGeneralPage.qml:20 #: src/settings/NeoChatGeneralPage.qml:20
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
@@ -4596,99 +4512,69 @@ msgstr ""
msgid "Enable developer tools" msgid "Enable developer tools"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:18 #: src/settings/NeoChatSecurityPage.qml:17
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Security" msgid "Security"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:28 #: src/settings/NeoChatSecurityPage.qml:20
#, kde-format #, kde-format
msgctxt "@title:group" msgctxt "@title:group"
msgid "Invitations" msgid "Invitations"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:32 #: src/settings/NeoChatSecurityPage.qml:24
#, kde-format #, kde-format
msgctxt "@option:check" msgctxt "@option:check"
msgid "Reject invitations from unknown users" msgid "Reject invitations from unknown users"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:33 #: src/settings/NeoChatSecurityPage.qml:25
#, kde-format #, kde-format
msgid "" msgid ""
"If enabled, NeoChat will reject invitations from users you don't share a " "If enabled, NeoChat will reject invitations from from users you don't share "
"room with." "a room with."
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:33 #: src/settings/NeoChatSecurityPage.qml:25
#, kde-format #, kde-format
msgid "Your server does not support this setting." msgid "Your server does not support this setting."
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:43 #: src/settings/NeoChatSecurityPage.qml:39
#, kde-format
msgctxt "@title:group"
msgid "Ignored Users"
msgstr ""
#: src/settings/NeoChatSecurityPage.qml:47
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Manage ignored users" msgid "Manage ignored users"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:49 #: src/settings/NeoChatSecurityPage.qml:41
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
msgid "Ignored Users" msgid "Ignored Users"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:54 #: src/settings/NeoChatSecurityPage.qml:46
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Keys" msgid "Keys"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:59 #: src/settings/NeoChatSecurityPage.qml:51
#, kde-format #, kde-format
msgid "Device key" msgid "Device key"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:63 #: src/settings/NeoChatSecurityPage.qml:55
#, kde-format #, kde-format
msgid "Encryption key" msgid "Encryption key"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:67 #: src/settings/NeoChatSecurityPage.qml:59
#, kde-format #, kde-format
msgid "Device id" msgid "Device id"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:73
#, kde-format
msgctxt "@title"
msgid "Encryption Keys"
msgstr ""
#: src/settings/NeoChatSecurityPage.qml:78
#, kde-format
msgctxt "@action:button"
msgid "Import Encryption Keys"
msgstr ""
#: src/settings/NeoChatSecurityPage.qml:87
#, kde-format
msgctxt "@info"
msgid "Keys imported successfully"
msgstr ""
#: src/settings/NeoChatSecurityPage.qml:95
#, kde-format
msgctxt "@action:button"
msgid "Export Encryption Keys"
msgstr ""
#: src/settings/NeoChatSettingsView.qml:22 src/settings/RoomGeneralPage.qml:22 #: src/settings/NeoChatSettingsView.qml:22 src/settings/RoomGeneralPage.qml:22
#: src/settings/RoomSettingsView.qml:39 #: src/settings/RoomSettingsView.qml:39
#, kde-format #, kde-format
@@ -5226,13 +5112,13 @@ msgstr ""
#: src/settings/ThreePIdCard.qml:146 #: src/settings/ThreePIdCard.qml:146
#, kde-format #, kde-format
msgctxt "@label:textbox" msgctxt "@label:textbox"
msgid "New Email Address:" msgid "New email address"
msgstr "" msgstr ""
#: src/settings/ThreePIdCard.qml:146 #: src/settings/ThreePIdCard.qml:146
#, kde-format #, kde-format
msgctxt "@label:textbox" msgctxt "@label:textbox"
msgid "New Phone Number:" msgid "New phone number"
msgstr "" msgstr ""
#: src/settings/ThreePIdCard.qml:150 src/threepidbindhelper.cpp:177 #: src/settings/ThreePIdCard.qml:150 src/threepidbindhelper.cpp:177
@@ -5280,13 +5166,13 @@ msgid ""
"follow the instructions there and then click the button below" "follow the instructions there and then click the button below"
msgstr "" msgstr ""
#: src/settings/ThreePIdCard.qml:183 #: src/settings/ThreePIdCard.qml:181
#, kde-format #, kde-format
msgctxt "@action:button Add new email or phone number" msgctxt "@action:button Add new email or phone number"
msgid "Add" msgid "Add"
msgstr "" msgstr ""
#: src/settings/ThreePIdCard.qml:191 #: src/settings/ThreePIdCard.qml:189
#, kde-format #, kde-format
msgctxt "@action:button As in 'go back'" msgctxt "@action:button As in 'go back'"
msgid "Back" msgid "Back"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: neochat\n" "Project-Id-Version: neochat\n"
"Report-Msgid-Bugs-To: https://bugs.kde.org\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n"
"POT-Creation-Date: 2024-08-07 00:40+0000\n" "POT-Creation-Date: 2024-10-07 02:28+0000\n"
"PO-Revision-Date: 2023-02-25 01:00+0000\n" "PO-Revision-Date: 2023-02-25 01:00+0000\n"
"Last-Translator: Automatically generated\n" "Last-Translator: Automatically generated\n"
"Language-Team: none\n" "Language-Team: none\n"
@@ -89,7 +89,7 @@ msgctxt "@action:button"
msgid "Cancel reply" msgid "Cancel reply"
msgstr "" msgstr ""
#: src/controller.cpp:132 #: src/controller.cpp:136
#, kde-format #, kde-format
msgctxt "" msgctxt ""
"The reason for using push notifications, as in: '[Push notifications are " "The reason for using push notifications, as in: '[Push notifications are "
@@ -97,47 +97,47 @@ msgctxt ""
msgid "Receiving notifications for new messages" msgid "Receiving notifications for new messages"
msgstr "" msgstr ""
#: src/controller.cpp:211 #: src/controller.cpp:229
#, kde-format #, kde-format
msgid "Network Error: %1" msgid "Network Error: %1"
msgstr "" msgstr ""
#: src/controller.cpp:233 #: src/controller.cpp:255
#, kde-format #, kde-format
msgid "Access token wasn't found" msgid "Access token wasn't found"
msgstr "" msgstr ""
#: src/controller.cpp:233 #: src/controller.cpp:255
#, kde-format #, kde-format
msgid "Maybe it was deleted?" msgid "Maybe it was deleted?"
msgstr "" msgstr ""
#: src/controller.cpp:237 #: src/controller.cpp:259
#, kde-format #, kde-format
msgid "Access to keychain was denied." msgid "Access to keychain was denied."
msgstr "" msgstr ""
#: src/controller.cpp:237 #: src/controller.cpp:259
#, kde-format #, kde-format
msgid "Please allow NeoChat to read the access token" msgid "Please allow NeoChat to read the access token"
msgstr "" msgstr ""
#: src/controller.cpp:240 #: src/controller.cpp:262
#, kde-format #, kde-format
msgid "No keychain available." msgid "No keychain available."
msgstr "" msgstr ""
#: src/controller.cpp:240 #: src/controller.cpp:262
#, kde-format #, kde-format
msgid "Please install a keychain, e.g. KWallet or GNOME keyring on Linux" msgid "Please install a keychain, e.g. KWallet or GNOME keyring on Linux"
msgstr "" msgstr ""
#: src/controller.cpp:243 #: src/controller.cpp:265
#, kde-format #, kde-format
msgid "Unable to read access token" msgid "Unable to read access token"
msgstr "" msgstr ""
#: src/controller.cpp:339 #: src/controller.cpp:357
#, kde-format #, kde-format
msgid "Receiving push notifications" msgid "Receiving push notifications"
msgstr "" msgstr ""
@@ -366,7 +366,7 @@ msgid "Custom"
msgstr "" msgstr ""
#: src/enums/powerlevel.cpp:88 src/models/permissionsmodel.cpp:162 #: src/enums/powerlevel.cpp:88 src/models/permissionsmodel.cpp:162
#: src/models/userlistmodel.cpp:114 #: src/models/userlistmodel.cpp:118
#, kde-format #, kde-format
msgctxt "" msgctxt ""
"%1 is the name of the power level, e.g. admin and %2 is the value that " "%1 is the name of the power level, e.g. admin and %2 is the value that "
@@ -375,13 +375,11 @@ msgid "%1 (%2)"
msgstr "" msgstr ""
#: src/eventhandler.cpp:297 src/eventhandler.cpp:505 #: src/eventhandler.cpp:297 src/eventhandler.cpp:505
#: src/models/messagecontentmodel.cpp:236 src/models/messageeventmodel.cpp:440
#, kde-format #, kde-format
msgid "<i>[This message was deleted]</i>" msgid "<i>[This message was deleted]</i>"
msgstr "" msgstr ""
#: src/eventhandler.cpp:297 src/models/messagecontentmodel.cpp:237 #: src/eventhandler.cpp:297
#: src/models/messageeventmodel.cpp:441
#, kde-format #, kde-format
msgid "<i>[This message was deleted: %1]</i>" msgid "<i>[This message was deleted: %1]</i>"
msgstr "" msgstr ""
@@ -741,12 +739,12 @@ msgctxt "The location being downloaded to"
msgid "Destination" msgid "Destination"
msgstr "" msgstr ""
#: src/login.cpp:90 src/login.cpp:105 #: src/login.cpp:88 src/login.cpp:103
#, kde-format #, kde-format
msgid "Network Error" msgid "Network Error"
msgstr "" msgstr ""
#: src/login.cpp:98 #: src/login.cpp:96
#, kde-format #, kde-format
msgid "Login Failed: %1" msgid "Login Failed: %1"
msgstr "" msgstr ""
@@ -815,7 +813,7 @@ msgid "Loading…"
msgstr "" msgstr ""
#: src/login/Login.qml:38 src/login/WelcomePage.qml:198 #: src/login/Login.qml:38 src/login/WelcomePage.qml:198
#: src/settings/ThreePIdCard.qml:183 #: src/settings/ThreePIdCard.qml:181
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Continue" msgid "Continue"
@@ -856,7 +854,7 @@ msgstr ""
msgid "Password:" msgid "Password:"
msgstr "" msgstr ""
#: src/login/Password.qml:32 src/settings/AccountEditorPage.qml:152 #: src/login/Password.qml:32 src/settings/AccountEditorPage.qml:149
#: src/settings/NetworkProxyPage.qml:95 #: src/settings/NetworkProxyPage.qml:95
#, kde-format #, kde-format
msgid "Password" msgid "Password"
@@ -1460,7 +1458,7 @@ msgctxt "As in 'The user's own emojis"
msgid "Own Emojis" msgid "Own Emojis"
msgstr "" msgstr ""
#: src/models/messagecontentmodel.cpp:229 #: src/models/messagecontentmodel.cpp:223
#: src/timeline/LinkPreviewLoadComponent.qml:66 #: src/timeline/LinkPreviewLoadComponent.qml:66
#, kde-format #, kde-format
msgid "Loading reply" msgid "Loading reply"
@@ -1698,13 +1696,13 @@ msgctxt "Notification type"
msgid "Call invitation" msgid "Call invitation"
msgstr "" msgstr ""
#: src/models/reactionmodel.cpp:69 #: src/models/reactionmodel.cpp:64
#, kde-format #, kde-format
msgctxt "Separate the usernames of users" msgctxt "Separate the usernames of users"
msgid " and " msgid " and "
msgstr "" msgstr ""
#: src/models/reactionmodel.cpp:76 #: src/models/reactionmodel.cpp:71
#, kde-format #, kde-format
msgctxt "%1 is the number of other users" msgctxt "%1 is the number of other users"
msgid " and %1 other" msgid " and %1 other"
@@ -1713,7 +1711,7 @@ msgstr[0] ""
msgstr[1] "" msgstr[1] ""
msgstr[2] "" msgstr[2] ""
#: src/models/reactionmodel.cpp:80 #: src/models/reactionmodel.cpp:75
#, kde-format #, kde-format
msgctxt "%2 is the users who reacted and %3 the emoji that was given" msgctxt "%2 is the users who reacted and %3 the emoji that was given"
msgid "%2 reacted with %3" msgid "%2 reacted with %3"
@@ -1769,139 +1767,133 @@ msgstr ""
msgid "Space creation failed: %1" msgid "Space creation failed: %1"
msgstr "" msgstr ""
#: src/neochatroom.cpp:1403 #: src/neochatroom.cpp:1439
#, kde-format #, kde-format
msgid "Report sent successfully." msgid "Report sent successfully."
msgstr "" msgstr ""
#: src/neochatroom.cpp:1724 src/neochatroom.cpp:1732 #: src/neochatroom.cpp:1764 src/neochatroom.cpp:1772
#, kde-format #, kde-format
msgctxt "'Lat' and 'Lon' as in Latitude and Longitude" msgctxt "'Lat' and 'Lon' as in Latitude and Longitude"
msgid "Lat: %1, Lon: %2" msgid "Lat: %1, Lon: %2"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:126 src/notificationsmanager.cpp:330 #: src/notificationsmanager.cpp:126 src/notificationsmanager.cpp:334
#, kde-format #, kde-format
msgid "Encrypted Message" msgid "Encrypted Message"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:210 src/qml/Main.qml:279 #: src/notificationsmanager.cpp:214 src/qml/Main.qml:279
#, kde-format #, kde-format
msgid "%1: %2" msgid "%1: %2"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:216 #: src/notificationsmanager.cpp:220
#, kde-format #, kde-format
msgid "Open NeoChat in this room" msgid "Open NeoChat in this room"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:229 src/qml/DelegateContextMenu.qml:98 #: src/notificationsmanager.cpp:233 src/qml/DelegateContextMenu.qml:98
#: src/qml/HoverActions.qml:111 #: src/qml/HoverActions.qml:111
#, kde-format #, kde-format
msgid "Reply" msgid "Reply"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:230 #: src/notificationsmanager.cpp:234
#, kde-format #, kde-format
msgid "Reply..." msgid "Reply..."
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:249 #: src/notificationsmanager.cpp:253
#, kde-format #, kde-format
msgid "%1 invited you to a room" msgid "%1 invited you to a room"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:252 #: src/notificationsmanager.cpp:256
#, kde-format #, kde-format
msgid "Open this invitation in NeoChat" msgid "Open this invitation in NeoChat"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:262 #: src/notificationsmanager.cpp:266
#, kde-format #, kde-format
msgctxt "@action:button The thing being accepted is an invitation to chat" msgctxt "@action:button The thing being accepted is an invitation to chat"
msgid "Accept" msgid "Accept"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:263 #: src/notificationsmanager.cpp:267
#, kde-format #, kde-format
msgctxt "@action:button The thing being rejected is an invitation to chat" msgctxt "@action:button The thing being rejected is an invitation to chat"
msgid "Reject" msgid "Reject"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:264 #: src/notificationsmanager.cpp:268
#, kde-format #, kde-format
msgctxt "@action:button The thing being rejected is an invitation to chat" msgctxt "@action:button The thing being rejected is an invitation to chat"
msgid "Reject and Ignore User" msgid "Reject and Ignore User"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:323 #: src/notificationsmanager.cpp:327
#, kde-format #, kde-format
msgid "%1 (%2)" msgid "%1 (%2)"
msgstr "" msgstr ""
#: src/notificationsmanager.cpp:334 #: src/notificationsmanager.cpp:338
#, kde-format #, kde-format
msgid "Open NeoChat" msgid "Open NeoChat"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:23 #: src/qml/AccountMenu.qml:23 src/qml/UserInfo.qml:46
#, kde-format
msgctxt "@action:button"
msgid "Show QR code"
msgstr ""
#: src/qml/AccountMenu.qml:39 src/qml/UserInfo.qml:46
#, kde-format #, kde-format
msgid "Edit this account" msgid "Edit this account"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:44 src/settings/AccountsPage.qml:34 #: src/qml/AccountMenu.qml:28 src/settings/AccountsPage.qml:34
#: src/settings/AccountsPage.qml:51 #: src/settings/AccountsPage.qml:51
#, kde-format #, kde-format
msgid "Account editor" msgid "Account editor"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:48 #: src/qml/AccountMenu.qml:32
#, kde-format #, kde-format
msgid "Notification settings" msgid "Notification settings"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:55 src/settings/DevicesPage.qml:17 #: src/qml/AccountMenu.qml:39 src/settings/DevicesPage.qml:17
#: src/settings/NeoChatSettingsView.qml:85 #: src/settings/NeoChatSettingsView.qml:85
#, kde-format #, kde-format
msgid "Devices" msgid "Devices"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:62 src/settings/NeoChatGeneralPage.qml:241 #: src/qml/AccountMenu.qml:46 src/settings/NeoChatGeneralPage.qml:241
#, kde-format #, kde-format
msgid "Open developer tools" msgid "Open developer tools"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:68 #: src/qml/AccountMenu.qml:52
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
msgid "Developer Tools" msgid "Developer Tools"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:74 #: src/qml/AccountMenu.qml:58
#, kde-format #, kde-format
msgctxt "@action:inmenu" msgctxt "@action:inmenu"
msgid "Open Secret Backup" msgid "Open Secret Backup"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:78 #: src/qml/AccountMenu.qml:62
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
msgid "Open Key Backup" msgid "Open Key Backup"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:82 #: src/qml/AccountMenu.qml:66
#, kde-format #, kde-format
msgctxt "@action:inmenu" msgctxt "@action:inmenu"
msgid "Verify this Device" msgid "Verify this Device"
msgstr "" msgstr ""
#: src/qml/AccountMenu.qml:88 src/settings/AccountsPage.qml:88 #: src/qml/AccountMenu.qml:72 src/settings/AccountsPage.qml:88
#, kde-format #, kde-format
msgid "Logout" msgid "Logout"
msgstr "" msgstr ""
@@ -2204,8 +2196,8 @@ msgstr ""
#: src/qml/CreateRoomDialog.qml:30 src/qml/ExploreComponent.qml:64 #: src/qml/CreateRoomDialog.qml:30 src/qml/ExploreComponent.qml:64
#: src/qml/ExploreComponent.qml:66 src/qml/ExploreComponentMobile.qml:162 #: src/qml/ExploreComponent.qml:66 src/qml/ExploreComponentMobile.qml:162
#: src/qml/ExploreComponentMobile.qml:164 src/qml/SpaceDrawer.qml:272 #: src/qml/ExploreComponentMobile.qml:164 src/qml/SpaceDrawer.qml:294
#: src/qml/SpaceDrawer.qml:274 #: src/qml/SpaceDrawer.qml:296
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Create a Space" msgid "Create a Space"
@@ -2238,7 +2230,7 @@ msgstr ""
msgid "Space" msgid "Space"
msgstr "" msgstr ""
#: src/qml/CreateRoomDialog.qml:77 #: src/qml/CreateRoomDialog.qml:77 src/settings/AccountEditorPage.qml:106
#, kde-format #, kde-format
msgid "Name:" msgid "Name:"
msgstr "" msgstr ""
@@ -2876,13 +2868,13 @@ msgstr ""
msgid "Send this location" msgid "Send this location"
msgstr "" msgstr ""
#: src/qml/LocationsPage.qml:16 src/qml/RoomInformation.qml:125 #: src/qml/LocationsPage.qml:16 src/qml/RoomInformation.qml:127
#, kde-format #, kde-format
msgctxt "Locations on a map" msgctxt "Locations on a map"
msgid "Locations" msgid "Locations"
msgstr "" msgstr ""
#: src/qml/LocationsPage.qml:65 #: src/qml/LocationsPage.qml:68
#, kde-format #, kde-format
msgid "There are no locations shared in this room." msgid "There are no locations shared in this room."
msgstr "" msgstr ""
@@ -3128,12 +3120,12 @@ msgstr ""
msgid "Reason for reporting this message" msgid "Reason for reporting this message"
msgstr "" msgstr ""
#: src/qml/RoomDelegate.qml:112 #: src/qml/RoomDelegate.qml:108
#, kde-format #, kde-format
msgid "Muted room" msgid "Muted room"
msgstr "" msgstr ""
#: src/qml/RoomDelegate.qml:145 #: src/qml/RoomDelegate.qml:141
#, kde-format #, kde-format
msgid "Configure room" msgid "Configure room"
msgstr "" msgstr ""
@@ -3154,79 +3146,79 @@ msgstr ""
msgid "Media" msgid "Media"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:40 #: src/qml/RoomInformation.qml:42
#, kde-format #, kde-format
msgctxt "@action:title" msgctxt "@action:title"
msgid "Space Members" msgid "Space Members"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:40 #: src/qml/RoomInformation.qml:42
#, kde-format #, kde-format
msgctxt "@action:title" msgctxt "@action:title"
msgid "Room information" msgid "Room information"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:68 #: src/qml/RoomInformation.qml:70
#, kde-format #, kde-format
msgctxt "Room actions" msgctxt "Room actions"
msgid "Actions" msgid "Actions"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:78 #: src/qml/RoomInformation.qml:80
#, kde-format #, kde-format
msgid "Search in this room" msgid "Search in this room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:87 #: src/qml/RoomInformation.qml:89
#, kde-format #, kde-format
msgctxt "@action:title" msgctxt "@action:title"
msgid "Search" msgid "Search"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:95 #: src/qml/RoomInformation.qml:97
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Verify user" msgid "Verify user"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:106 #: src/qml/RoomInformation.qml:108
#, kde-format #, kde-format
msgid "Remove room from favorites" msgid "Remove room from favorites"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:106 #: src/qml/RoomInformation.qml:108
#, kde-format #, kde-format
msgid "Favorite this room" msgid "Favorite this room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:119 #: src/qml/RoomInformation.qml:121
#, kde-format #, kde-format
msgid "Show locations for this room" msgid "Show locations for this room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:134 #: src/qml/RoomInformation.qml:136
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Leave this room" msgid "Leave this room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:147 #: src/qml/RoomInformation.qml:149
#, kde-format #, kde-format
msgid "Members" msgid "Members"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:162 src/qml/SpaceHomePage.qml:55 #: src/qml/RoomInformation.qml:164 src/qml/SpaceHomePage.qml:55
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Invite a User" msgid "Invite a User"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:166 #: src/qml/RoomInformation.qml:168
#, kde-format #, kde-format
msgid "Invite user to room" msgid "Invite user to room"
msgstr "" msgstr ""
#: src/qml/RoomInformation.qml:173 #: src/qml/RoomInformation.qml:175
#, kde-format #, kde-format
msgid "%1 member" msgid "%1 member"
msgid_plural "%1 members" msgid_plural "%1 members"
@@ -3235,7 +3227,7 @@ msgstr[1] ""
msgstr[2] "" msgstr[2] ""
msgstr[3] "" msgstr[3] ""
#: src/qml/RoomInformation.qml:173 #: src/qml/RoomInformation.qml:175
#, kde-format #, kde-format
msgid "No member count" msgid "No member count"
msgstr "" msgstr ""
@@ -3282,12 +3274,7 @@ msgstr ""
msgid "NeoChat is offline. Please check your network connection." msgid "NeoChat is offline. Please check your network connection."
msgstr "" msgstr ""
#: src/qml/RoomPage.qml:158 #: src/qml/RoomPage.qml:264
#, kde-format
msgid "Select or join a room to get started"
msgstr ""
#: src/qml/RoomPage.qml:265
#, kde-format #, kde-format
msgid "Message Source" msgid "Message Source"
msgstr "" msgstr ""
@@ -3442,19 +3429,19 @@ msgstr ""
msgid "Home" msgid "Home"
msgstr "" msgstr ""
#: src/qml/SpaceDrawer.qml:135 #: src/qml/SpaceDrawer.qml:134
#, kde-format #, kde-format
msgctxt "@button View all one-on-one chats with your friends." msgctxt "@button View all one-on-one chats with your friends."
msgid "Friends" msgid "Friends"
msgstr "" msgstr ""
#: src/qml/SpaceDrawer.qml:220 #: src/qml/SpaceDrawer.qml:242
#, kde-format #, kde-format
msgctxt "Join <name of a space>" msgctxt "Join <name of a space>"
msgid "Join %1" msgid "Join %1"
msgstr "" msgstr ""
#: src/qml/SpaceDrawer.qml:262 #: src/qml/SpaceDrawer.qml:284
#, kde-format #, kde-format
msgid "Create a space" msgid "Create a space"
msgstr "" msgstr ""
@@ -3545,27 +3532,27 @@ msgctxt "'Space' is a matrix space"
msgid "Leave Space" msgid "Leave Space"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:196 #: src/qml/TimelineView.qml:201
#, kde-format #, kde-format
msgid "Jump to first unread message" msgid "Jump to first unread message"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:196 #: src/qml/TimelineView.qml:201
#, kde-format #, kde-format
msgid "Jump to oldest loaded message" msgid "Jump to oldest loaded message"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:236 #: src/qml/TimelineView.qml:245
#, kde-format #, kde-format
msgid "Jump to latest message" msgid "Jump to latest message"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:261 #: src/qml/TimelineView.qml:270
#, kde-format #, kde-format
msgid "Drag items here to share them" msgid "Drag items here to share them"
msgstr "" msgstr ""
#: src/qml/TimelineView.qml:268 #: src/qml/TimelineView.qml:277
#, kde-format #, kde-format
msgctxt "Message displayed when some users are typing" msgctxt "Message displayed when some users are typing"
msgid "%2 is typing" msgid "%2 is typing"
@@ -3908,72 +3895,72 @@ msgstr ""
msgid "The session verification was canceled due to an unknown error." msgid "The session verification was canceled due to an unknown error."
msgstr "" msgstr ""
#: src/registration.cpp:311 #: src/registration.cpp:309
#, kde-format #, kde-format
msgid "No server." msgid "No server."
msgstr "" msgstr ""
#: src/registration.cpp:313 #: src/registration.cpp:311
#, kde-format #, kde-format
msgid "Checking Server availability." msgid "Checking Server availability."
msgstr "" msgstr ""
#: src/registration.cpp:315 #: src/registration.cpp:313
#, kde-format #, kde-format
msgid "This is not a valid server." msgid "This is not a valid server."
msgstr "" msgstr ""
#: src/registration.cpp:317 #: src/registration.cpp:315
#, kde-format #, kde-format
msgid "Registration for this server is disabled." msgid "Registration for this server is disabled."
msgstr "" msgstr ""
#: src/registration.cpp:319 #: src/registration.cpp:317
#, kde-format #, kde-format
msgid "No username." msgid "No username."
msgstr "" msgstr ""
#: src/registration.cpp:321 #: src/registration.cpp:319
#, kde-format #, kde-format
msgid "Checking username availability." msgid "Checking username availability."
msgstr "" msgstr ""
#: src/registration.cpp:323 #: src/registration.cpp:321
#, kde-format #, kde-format
msgid "This username is not available." msgid "This username is not available."
msgstr "" msgstr ""
#: src/registration.cpp:325 #: src/registration.cpp:323
#, kde-format #, kde-format
msgid "Continue" msgid "Continue"
msgstr "" msgstr ""
#: src/registration.cpp:327 #: src/registration.cpp:325
#, kde-format #, kde-format
msgid "Working" msgid "Working"
msgstr "" msgstr ""
#: src/roommanager.cpp:138 #: src/roommanager.cpp:139
#, kde-format #, kde-format
msgid "Malformed or empty Matrix id" msgid "Malformed or empty Matrix id"
msgstr "" msgstr ""
#: src/roommanager.cpp:138 #: src/roommanager.cpp:139
#, kde-format #, kde-format
msgid "%1 is not a correct Matrix identifier" msgid "%1 is not a correct Matrix identifier"
msgstr "" msgstr ""
#: src/roommanager.cpp:345 #: src/roommanager.cpp:352
#, kde-format #, kde-format
msgid "Failed to join room" msgid "Failed to join room"
msgstr "" msgstr ""
#: src/roommanager.cpp:377 #: src/roommanager.cpp:388
#, kde-format #, kde-format
msgid "You requested to join '%1'" msgid "You requested to join '%1'"
msgstr "" msgstr ""
#: src/roommanager.cpp:381 #: src/roommanager.cpp:392
#, kde-format #, kde-format
msgid "Failed to request joining room" msgid "Failed to request joining room"
msgstr "" msgstr ""
@@ -3995,12 +3982,7 @@ msgstr ""
#: src/settings/AccountEditorPage.qml:101 #: src/settings/AccountEditorPage.qml:101
#, kde-format #, kde-format
msgid "User Information" msgid "User information"
msgstr ""
#: src/settings/AccountEditorPage.qml:106
#, kde-format
msgid "Display Name:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:112 #: src/settings/AccountEditorPage.qml:112
@@ -4008,101 +3990,96 @@ msgstr ""
msgid "Label:" msgid "Label:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:113 #: src/settings/AccountEditorPage.qml:117
#, kde-format
msgid "Work"
msgstr ""
#: src/settings/AccountEditorPage.qml:118
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Show QR Code" msgid "QR code for account"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:135 #: src/settings/AccountEditorPage.qml:133
#: src/settings/AccountEditorPage.qml:191 #: src/settings/AccountEditorPage.qml:188
#: src/settings/EmoticonEditorPage.qml:108 src/settings/RoomGeneralPage.qml:105 #: src/settings/EmoticonEditorPage.qml:108 src/settings/RoomGeneralPage.qml:105
#, kde-format #, kde-format
msgid "Save" msgid "Save"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:157 #: src/settings/AccountEditorPage.qml:154
#, kde-format #, kde-format
msgid "Your server doesn't support changing your password" msgid "Your server doesn't support changing your password"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:164 #: src/settings/AccountEditorPage.qml:161
#, kde-format #, kde-format
msgid "Current Password:" msgid "Current Password:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:171 #: src/settings/AccountEditorPage.qml:168
#, kde-format #, kde-format
msgid "New Password:" msgid "New Password:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:178 #: src/settings/AccountEditorPage.qml:175
#, kde-format #, kde-format
msgid "Confirm new Password:" msgid "Confirm new Password:"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:183 #: src/settings/AccountEditorPage.qml:180
#, kde-format #, kde-format
msgid "Passwords don't match" msgid "Passwords don't match"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:198 #: src/settings/AccountEditorPage.qml:194
#, kde-format #, kde-format
msgid "Passwords do not match" msgid "Passwords do not match"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:205 #: src/settings/AccountEditorPage.qml:201
#, kde-format #, kde-format
msgid "Email Addresses" msgid "Email Addresses"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:211 #: src/settings/AccountEditorPage.qml:207
#, kde-format #, kde-format
msgid "Phone Numbers" msgid "Phone Numbers"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:216 #: src/settings/AccountEditorPage.qml:212
#, kde-format #, kde-format
msgid "Identity Server" msgid "Identity Server"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:225 #: src/settings/AccountEditorPage.qml:221
#, kde-format #, kde-format
msgid "Server Information" msgid "Server Information"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:229 #: src/settings/AccountEditorPage.qml:225
#, kde-format #, kde-format
msgid "Homeserver url" msgid "Homeserver url"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:250 #: src/settings/AccountEditorPage.qml:246
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Account Management" msgid "Account Management"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:255 #: src/settings/AccountEditorPage.qml:251
#, kde-format #, kde-format
msgid "Deactivate Account" msgid "Deactivate Account"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:271 #: src/settings/AccountEditorPage.qml:266
#, kde-format #, kde-format
msgid "Password changed successfully" msgid "Password changed successfully"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:273 #: src/settings/AccountEditorPage.qml:268
#, kde-format #, kde-format
msgid "Wrong password entered" msgid "Wrong password entered"
msgstr "" msgstr ""
#: src/settings/AccountEditorPage.qml:275 #: src/settings/AccountEditorPage.qml:270
#, kde-format #, kde-format
msgid "Unknown problem while trying to change password" msgid "Unknown problem while trying to change password"
msgstr "" msgstr ""
@@ -4343,44 +4320,6 @@ msgctxt "@title"
msgid "Stickers & Emojis" msgid "Stickers & Emojis"
msgstr "" msgstr ""
#: src/settings/ExportKeysDialog.qml:18
#: src/settings/NeoChatSecurityPage.qml:101
#, kde-format
msgctxt "@title"
msgid "Export Keys"
msgstr ""
#: src/settings/ExportKeysDialog.qml:33 src/settings/ImportKeysDialog.qml:51
#, kde-format
msgctxt "@label:textbox"
msgid "Passphrase:"
msgstr ""
#: src/settings/ExportKeysDialog.qml:37
#, kde-format
msgid ""
"A passphrase to secure your key backup. It should not be your account "
"password."
msgstr ""
#: src/settings/ExportKeysDialog.qml:42
#, kde-format
msgctxt "@action:button"
msgid "Export keys"
msgstr ""
#: src/settings/ExportKeysDialog.qml:50
#, kde-format
msgctxt "@info"
msgid "Keys exported successfully"
msgstr ""
#: src/settings/ExportKeysDialog.qml:54 src/settings/ImportKeysDialog.qml:74
#, kde-format
msgctxt "@info"
msgid "Unknown error"
msgstr ""
#: src/settings/GlobalNotificationsPage.qml:19 #: src/settings/GlobalNotificationsPage.qml:19
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
@@ -4480,48 +4419,25 @@ msgctxt "@title"
msgid "Ignored Users" msgid "Ignored Users"
msgstr "" msgstr ""
#: src/settings/IgnoredUsersDialog.qml:25 #: src/settings/IgnoredUsersDialog.qml:24
#: src/settings/NeoChatSecurityPage.qml:35
#, kde-format #, kde-format
msgctxt "Placeholder message when no user is ignored" msgctxt "@title:group"
msgid "No ignored users" msgid "Ignored Users"
msgstr "" msgstr ""
#: src/settings/IgnoredUsersDialog.qml:55 #: src/settings/IgnoredUsersDialog.qml:29
#, kde-format
msgctxt "Placeholder message when no user is ignored"
msgid "You are not ignoring any users"
msgstr ""
#: src/settings/IgnoredUsersDialog.qml:51
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Unignore this user" msgid "Unignore this user"
msgstr "" msgstr ""
#: src/settings/ImportKeysDialog.qml:22 src/settings/NeoChatSecurityPage.qml:84
#, kde-format
msgctxt "@title"
msgid "Import Keys"
msgstr ""
#: src/settings/ImportKeysDialog.qml:35
#, kde-format
msgctxt "@action:button"
msgid "Choose backup file"
msgstr ""
#: src/settings/ImportKeysDialog.qml:56
#, kde-format
msgctxt "@action:button"
msgid "Import keys"
msgstr ""
#: src/settings/ImportKeysDialog.qml:66
#, kde-format
msgctxt "@info"
msgid "Invalid passphrase"
msgstr ""
#: src/settings/ImportKeysDialog.qml:70
#, kde-format
msgctxt "@info"
msgid "Invalid key backup data"
msgstr ""
#: src/settings/NeoChatGeneralPage.qml:20 #: src/settings/NeoChatGeneralPage.qml:20
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
@@ -4626,99 +4542,69 @@ msgstr ""
msgid "Enable developer tools" msgid "Enable developer tools"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:18 #: src/settings/NeoChatSecurityPage.qml:17
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Security" msgid "Security"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:28 #: src/settings/NeoChatSecurityPage.qml:20
#, kde-format #, kde-format
msgctxt "@title:group" msgctxt "@title:group"
msgid "Invitations" msgid "Invitations"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:32 #: src/settings/NeoChatSecurityPage.qml:24
#, kde-format #, kde-format
msgctxt "@option:check" msgctxt "@option:check"
msgid "Reject invitations from unknown users" msgid "Reject invitations from unknown users"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:33 #: src/settings/NeoChatSecurityPage.qml:25
#, kde-format #, kde-format
msgid "" msgid ""
"If enabled, NeoChat will reject invitations from users you don't share a " "If enabled, NeoChat will reject invitations from from users you don't share "
"room with." "a room with."
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:33 #: src/settings/NeoChatSecurityPage.qml:25
#, kde-format #, kde-format
msgid "Your server does not support this setting." msgid "Your server does not support this setting."
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:43 #: src/settings/NeoChatSecurityPage.qml:39
#, kde-format
msgctxt "@title:group"
msgid "Ignored Users"
msgstr ""
#: src/settings/NeoChatSecurityPage.qml:47
#, kde-format #, kde-format
msgctxt "@action:button" msgctxt "@action:button"
msgid "Manage ignored users" msgid "Manage ignored users"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:49 #: src/settings/NeoChatSecurityPage.qml:41
#, kde-format #, kde-format
msgctxt "@title:window" msgctxt "@title:window"
msgid "Ignored Users" msgid "Ignored Users"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:54 #: src/settings/NeoChatSecurityPage.qml:46
#, kde-format #, kde-format
msgctxt "@title" msgctxt "@title"
msgid "Keys" msgid "Keys"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:59 #: src/settings/NeoChatSecurityPage.qml:51
#, kde-format #, kde-format
msgid "Device key" msgid "Device key"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:63 #: src/settings/NeoChatSecurityPage.qml:55
#, kde-format #, kde-format
msgid "Encryption key" msgid "Encryption key"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:67 #: src/settings/NeoChatSecurityPage.qml:59
#, kde-format #, kde-format
msgid "Device id" msgid "Device id"
msgstr "" msgstr ""
#: src/settings/NeoChatSecurityPage.qml:73
#, kde-format
msgctxt "@title"
msgid "Encryption Keys"
msgstr ""
#: src/settings/NeoChatSecurityPage.qml:78
#, kde-format
msgctxt "@action:button"
msgid "Import Encryption Keys"
msgstr ""
#: src/settings/NeoChatSecurityPage.qml:87
#, kde-format
msgctxt "@info"
msgid "Keys imported successfully"
msgstr ""
#: src/settings/NeoChatSecurityPage.qml:95
#, kde-format
msgctxt "@action:button"
msgid "Export Encryption Keys"
msgstr ""
#: src/settings/NeoChatSettingsView.qml:22 src/settings/RoomGeneralPage.qml:22 #: src/settings/NeoChatSettingsView.qml:22 src/settings/RoomGeneralPage.qml:22
#: src/settings/RoomSettingsView.qml:39 #: src/settings/RoomSettingsView.qml:39
#, kde-format #, kde-format
@@ -5256,13 +5142,13 @@ msgstr ""
#: src/settings/ThreePIdCard.qml:146 #: src/settings/ThreePIdCard.qml:146
#, kde-format #, kde-format
msgctxt "@label:textbox" msgctxt "@label:textbox"
msgid "New Email Address:" msgid "New email address"
msgstr "" msgstr ""
#: src/settings/ThreePIdCard.qml:146 #: src/settings/ThreePIdCard.qml:146
#, kde-format #, kde-format
msgctxt "@label:textbox" msgctxt "@label:textbox"
msgid "New Phone Number:" msgid "New phone number"
msgstr "" msgstr ""
#: src/settings/ThreePIdCard.qml:150 src/threepidbindhelper.cpp:177 #: src/settings/ThreePIdCard.qml:150 src/threepidbindhelper.cpp:177
@@ -5310,13 +5196,13 @@ msgid ""
"follow the instructions there and then click the button below" "follow the instructions there and then click the button below"
msgstr "" msgstr ""
#: src/settings/ThreePIdCard.qml:183 #: src/settings/ThreePIdCard.qml:181
#, kde-format #, kde-format
msgctxt "@action:button Add new email or phone number" msgctxt "@action:button Add new email or phone number"
msgid "Add" msgid "Add"
msgstr "" msgstr ""
#: src/settings/ThreePIdCard.qml:191 #: src/settings/ThreePIdCard.qml:189
#, kde-format #, kde-format
msgctxt "@action:button As in 'go back'" msgctxt "@action:button As in 'go back'"
msgid "Back" msgid "Back"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -288,7 +288,6 @@ ecm_add_qml_module(neochat URI org.kde.neochat GENERATE_PLUGIN_SOURCE
qml/ConsentDialog.qml qml/ConsentDialog.qml
qml/AskDirectChatConfirmation.qml qml/AskDirectChatConfirmation.qml
qml/HoverLinkIndicator.qml qml/HoverLinkIndicator.qml
qml/AvatarNotification.qml
DEPENDENCIES DEPENDENCIES
QtCore QtCore
QtQuick QtQuick
@@ -426,7 +425,7 @@ if (TARGET KF6::Crash)
target_link_libraries(neochat PUBLIC KF6::Crash) target_link_libraries(neochat PUBLIC KF6::Crash)
endif() endif()
kconfig_target_kcfg_file(neochat FILE neochatconfig.kcfg CLASS_NAME NeoChatConfig MUTATORS GENERATE_PROPERTIES DEFAULT_VALUE_GETTERS PARENT_IN_CONSTRUCTOR SINGLETON GENERATE_MOC QML_REGISTRATION) kconfig_add_kcfg_files(neochat GENERATE_MOC neochatconfig.kcfgc)
if(NEOCHAT_FLATPAK) if(NEOCHAT_FLATPAK)
target_compile_definitions(neochat PUBLIC NEOCHAT_FLATPAK) target_compile_definitions(neochat PUBLIC NEOCHAT_FLATPAK)

View File

@@ -219,7 +219,7 @@ QQC2.Control {
} }
onTextChanged: { onTextChanged: {
if (!repeatTimer.running && NeoChatConfig.typingNotifications) { if (!repeatTimer.running && Config.typingNotifications) {
var textExists = text.length > 0; var textExists = text.length > 0;
root.currentRoom.sendTypingNotification(textExists); root.currentRoom.sendTypingNotification(textExists);
textExists ? repeatTimer.start() : repeatTimer.stop(); textExists ? repeatTimer.start() : repeatTimer.stop();
@@ -353,8 +353,8 @@ QQC2.Control {
startBreakpoint: Kirigami.Units.gridUnit * 46 startBreakpoint: Kirigami.Units.gridUnit * 46
endBreakpoint: Kirigami.Units.gridUnit * 66 endBreakpoint: Kirigami.Units.gridUnit * 66
startPercentWidth: 100 startPercentWidth: 100
endPercentWidth: NeoChatConfig.compactLayout ? 100 : 85 endPercentWidth: Config.compactLayout ? 100 : 85
maxWidth: NeoChatConfig.compactLayout ? -1 : Kirigami.Units.gridUnit * 60 maxWidth: Config.compactLayout ? -1 : Kirigami.Units.gridUnit * 60
parentWidth: root.width parentWidth: root.width
} }

View File

@@ -120,7 +120,11 @@ QString ChatBarCache::relationMessage() const
if (auto event = room->findInTimeline(m_relationId); event != room->historyEdge()) { if (auto event = room->findInTimeline(m_relationId); event != room->historyEdge()) {
EventHandler eventhandler(room, &**event); EventHandler eventhandler(room, &**event);
return eventhandler.getMarkdownBody(); if (isEditing()) {
return eventhandler.getMarkdownBody();
} else {
return eventhandler.getMarkdownBody().toHtmlEscaped();
}
} }
return {}; return {};
} }

View File

@@ -9,18 +9,12 @@
#include <KLocalizedString> #include <KLocalizedString>
#include <QGuiApplication> #include <QGuiApplication>
#include <QNetworkReply>
#include <QRandomGenerator>
#include <QTcpServer>
#include <QTimer> #include <QTimer>
#include <QCoroNetworkReply>
#include <signal.h> #include <signal.h>
#include <Quotient/accountregistry.h> #include <Quotient/accountregistry.h>
#include <Quotient/csapi/notifications.h> #include <Quotient/csapi/notifications.h>
#include <Quotient/csapi/wellknown.h>
#include <Quotient/qt_connection_util.h> #include <Quotient/qt_connection_util.h>
#include <Quotient/settings.h> #include <Quotient/settings.h>
@@ -51,7 +45,6 @@
bool testMode = false; bool testMode = false;
using namespace Quotient; using namespace Quotient;
using namespace Qt::Literals::StringLiterals;
Controller::Controller(QObject *parent) Controller::Controller(QObject *parent)
: QObject(parent) : QObject(parent)
@@ -71,7 +64,11 @@ Controller::Controller(QObject *parent)
}); });
} else { } else {
auto c = new NeoChatConnection(this); auto c = new NeoChatConnection(this);
#if Quotient_VERSION_MINOR > 8
c->assumeIdentity(QStringLiteral("@user:localhost:1234"), QStringLiteral("device_1234"), QStringLiteral("token_1234"));
#else
c->assumeIdentity(QStringLiteral("@user:localhost:1234"), QStringLiteral("token_1234")); c->assumeIdentity(QStringLiteral("@user:localhost:1234"), QStringLiteral("token_1234"));
#endif
connect(c, &Connection::connected, this, [c, this]() { connect(c, &Connection::connected, this, [c, this]() {
m_accountRegistry.add(c); m_accountRegistry.add(c);
c->syncLoop(); c->syncLoop();
@@ -209,20 +206,33 @@ void Controller::invokeLogin()
m_connectionsLoading[accountId] = connection; m_connectionsLoading[accountId] = connection;
connect(connection, &NeoChatConnection::connected, this, [this, connection, accountId] { connect(connection, &NeoChatConnection::connected, this, [this, connection, accountId] {
connection->loadState(); connection->loadState();
addConnection(connection); if (connection->allRooms().size() == 0 || connection->allRooms()[0]->currentState().get<RoomCreateEvent>()) {
m_accountsLoading.removeAll(connection->userId()); addConnection(connection);
m_connectionsLoading.remove(accountId); m_accountsLoading.removeAll(connection->userId());
Q_EMIT accountsLoadingChanged(); m_connectionsLoading.remove(accountId);
Q_EMIT accountsLoadingChanged();
} else {
connect(
connection->allRooms()[0],
&Room::baseStateLoaded,
this,
[this, connection, accountId]() {
addConnection(connection);
m_accountsLoading.removeAll(connection->userId());
m_connectionsLoading.remove(accountId);
Q_EMIT accountsLoadingChanged();
},
Qt::SingleShotConnection);
}
}); });
connect(connection, &NeoChatConnection::networkError, this, [this](const QString &error, const QString &, int, int) { connect(connection, &NeoChatConnection::networkError, this, [this](const QString &error, const QString &, int, int) {
Q_EMIT errorOccured(i18n("Network Error: %1", error), {}); Q_EMIT errorOccured(i18n("Network Error: %1", error), {});
}); });
#if Quotient_VERSION_MINOR > 8
if (!account.clientId().isEmpty()) { connection->assumeIdentity(account.userId(), account.deviceId(), accessToken);
connection->assumeOidcIdentity(account.userId(), accessToken, account.clientId(), account.tokenEndpoint()); #else
} else { connection->assumeIdentity(account.userId(), accessToken);
connection->assumeIdentity(account.userId(), accessToken); #endif
}
}); });
} }
} }
@@ -263,23 +273,19 @@ QKeychain::ReadPasswordJob *Controller::loadAccessTokenFromKeyChain(const QStrin
return job; return job;
} }
bool Controller::saveAccessTokenToKeyChain(const QString &userId, const QByteArray &accessToken) void Controller::saveAccessTokenToKeyChain(const QString &userId, const QByteArray &accessToken)
{ {
qDebug() << "Save the access token to the keychain for " << userId; qDebug() << "Save the access token to the keychain for " << userId;
QKeychain::WritePasswordJob job(qAppName()); auto job = new QKeychain::WritePasswordJob(qAppName());
job.setAutoDelete(false); job->setAutoDelete(true);
job.setKey(userId); job->setKey(userId);
job.setBinaryData(accessToken); job->setBinaryData(accessToken);
QEventLoop loop; connect(job, &QKeychain::WritePasswordJob::finished, this, [job]() {
QKeychain::WritePasswordJob::connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit); if (job->error()) {
job.start(); qWarning() << "Could not save access token to the keychain: " << qPrintable(job->errorString());
loop.exec(); }
});
if (job.error()) { job->start();
qWarning() << "Could not save access token to the keychain: " << qPrintable(job.errorString());
return false;
}
return true;
} }
bool Controller::supportSystemTray() const bool Controller::supportSystemTray() const
@@ -421,29 +427,11 @@ void Controller::removeConnection(const QString &userId)
bool Controller::csSupported() const bool Controller::csSupported() const
{ {
#if Quotient_VERSION_MINOR > 8 #if Quotient_VERSION_MINOR > 9
return true; return true;
#else #else
return false; return false;
#endif #endif
} }
NeoChatConnection *Controller::pendingOidcConnection() const
{
return m_pendingOidcConnection.get();
}
void Controller::startOidcLogin(const QString &homeserver)
{
auto url = QUrl::fromUserInput(homeserver.startsWith(u"https:"_s) ? homeserver : u"https://%1"_s.arg(homeserver));
m_pendingOidcConnection = new NeoChatConnection(url, this);
Q_EMIT pendingOidcConnectionChanged();
m_pendingOidcConnection->startOidcLogin();
connect(m_pendingOidcConnection, &Connection::connected, this, [this]() {
m_pendingOidcConnection->loadState();
addConnection(m_pendingOidcConnection);
setActiveConnection(m_pendingOidcConnection);
});
}
#include "moc_controller.cpp" #include "moc_controller.cpp"

View File

@@ -52,8 +52,6 @@ class Controller : public QObject
Q_PROPERTY(bool csSupported READ csSupported CONSTANT) Q_PROPERTY(bool csSupported READ csSupported CONSTANT)
Q_PROPERTY(NeoChatConnection *pendingOidcConnection READ pendingOidcConnection NOTIFY pendingOidcConnectionChanged)
public: public:
/** /**
* @brief Define the types on inline messages that can be shown. * @brief Define the types on inline messages that can be shown.
@@ -88,7 +86,7 @@ public:
/** /**
* @brief Save an access token to the keychain for the given account. * @brief Save an access token to the keychain for the given account.
*/ */
bool saveAccessTokenToKeyChain(const QString &userId, const QByteArray &accessToken); void saveAccessTokenToKeyChain(const QString &userId, const QByteArray &accessToken);
[[nodiscard]] bool supportSystemTray() const; [[nodiscard]] bool supportSystemTray() const;
@@ -108,12 +106,8 @@ public:
Q_INVOKABLE void removeConnection(const QString &userId); Q_INVOKABLE void removeConnection(const QString &userId);
Q_INVOKABLE void startOidcLogin(const QString &homeserver);
bool csSupported() const; bool csSupported() const;
NeoChatConnection *pendingOidcConnection() const;
private: private:
explicit Controller(QObject *parent = nullptr); explicit Controller(QObject *parent = nullptr);
@@ -125,13 +119,10 @@ private:
void loadSettings(); void loadSettings();
void saveSettings() const; void saveSettings() const;
QCoro::Task<void> doStartOidcLogin(QString homeserver);
Quotient::AccountRegistry m_accountRegistry; Quotient::AccountRegistry m_accountRegistry;
QStringList m_accountsLoading; QStringList m_accountsLoading;
QMap<QString, QPointer<NeoChatConnection>> m_connectionsLoading; QMap<QString, QPointer<NeoChatConnection>> m_connectionsLoading;
QString m_endpoint; QString m_endpoint;
QPointer<NeoChatConnection> m_pendingOidcConnection;
private Q_SLOTS: private Q_SLOTS:
void invokeLogin(); void invokeLogin();
@@ -145,5 +136,4 @@ Q_SIGNALS:
void activeConnectionChanged(NeoChatConnection *connection); void activeConnectionChanged(NeoChatConnection *connection);
void accountsLoadingChanged(); void accountsLoadingChanged();
void showMessage(MessageType messageType, const QString &message); void showMessage(MessageType messageType, const QString &message);
void pendingOidcConnectionChanged();
}; };

View File

@@ -17,25 +17,25 @@ FormCard.FormCardPage {
FormCard.FormCheckDelegate { FormCard.FormCheckDelegate {
text: i18nc("@option:check", "Show hidden events in the timeline") text: i18nc("@option:check", "Show hidden events in the timeline")
checked: NeoChatConfig.showAllEvents checked: Config.showAllEvents
onToggled: NeoChatConfig.showAllEvents = checked onToggled: Config.showAllEvents = checked
} }
FormCard.FormCheckDelegate { FormCard.FormCheckDelegate {
id: roomAccountDataVisibleCheck id: roomAccountDataVisibleCheck
text: i18nc("@option:check Enable the matrix 'threads' feature", "Always allow device verification") text: i18nc("@option:check Enable the matrix 'threads' feature", "Always allow device verification")
description: i18n("Allow the user to start a verification session with devices that were already verified") description: i18n("Allow the user to start a verification session with devices that were already verified")
checked: NeoChatConfig.alwaysVerifyDevice checked: Config.alwaysVerifyDevice
onToggled: NeoChatConfig.alwaysVerifyDevice = checked onToggled: Config.alwaysVerifyDevice = checked
} }
FormCard.FormCheckDelegate { FormCard.FormCheckDelegate {
text: i18nc("@option:check", "Show focus in window header") text: i18nc("@option:check", "Show focus in window header")
checked: NeoChatConfig.windowTitleFocus checked: Config.windowTitleFocus
onToggled: { onToggled: {
NeoChatConfig.windowTitleFocus = checked; Config.windowTitleFocus = checked;
NeoChatConfig.save(); Config.save();
} }
} }
} }

View File

@@ -18,23 +18,23 @@ FormCard.FormCardPage {
FormCard.FormCheckDelegate { FormCard.FormCheckDelegate {
id: roomAccountDataVisibleCheck id: roomAccountDataVisibleCheck
text: i18nc("@option:check Enable the matrix 'threads' feature", "Threads") text: i18nc("@option:check Enable the matrix 'threads' feature", "Threads")
checked: NeoChatConfig.threads checked: Config.threads
onToggled: NeoChatConfig.threads = checked onToggled: Config.threads = checked
} }
FormCard.FormCheckDelegate { FormCard.FormCheckDelegate {
text: i18nc("@option:check Enable the matrix 'secret backup' feature", "Secret Backup") text: i18nc("@option:check Enable the matrix 'secret backup' feature", "Secret Backup")
checked: NeoChatConfig.secretBackup checked: Config.secretBackup
onToggled: NeoChatConfig.secretBackup = checked onToggled: Config.secretBackup = checked
} }
FormCard.FormCheckDelegate { FormCard.FormCheckDelegate {
text: i18nc("@option:check Enable the matrix feature to add a phone number as a third party ID", "Add phone numbers as 3PIDs") text: i18nc("@option:check Enable the matrix feature to add a phone number as a third party ID", "Add phone numbers as 3PIDs")
checked: NeoChatConfig.phone3PId checked: Config.phone3PId
onToggled: { onToggled: {
NeoChatConfig.phone3PId = checked Config.phone3PId = checked
NeoChatConfig.save(); Config.save();
} }
} }
} }

View File

@@ -294,7 +294,7 @@ QString EventHandler::getBody(const Quotient::RoomEvent *event, Qt::TextFormat f
{ {
if (event->isRedacted()) { if (event->isRedacted()) {
auto reason = event->redactedBecause()->reason(); auto reason = event->redactedBecause()->reason();
return (reason.isEmpty()) ? i18n("<i>[This message was deleted]</i>") : i18n("<i>[This message was deleted: %1]</i>", reason); return (reason.isEmpty()) ? i18n("<i>[This message was deleted]</i>") : i18n("<i>[This message was deleted: %1]</i>", reason.toHtmlEscaped());
} }
const bool prettyPrint = (format == Qt::RichText); const bool prettyPrint = (format == Qt::RichText);

View File

@@ -10,13 +10,22 @@
#include <Quotient/keyverificationsession.h> #include <Quotient/keyverificationsession.h>
#include <Quotient/roommember.h> #include <Quotient/roommember.h>
#if Quotient_VERSION_MINOR > 8
#include <Quotient/keyimport.h>
#endif
#include "controller.h" #include "controller.h"
#include "neochatconfig.h" #include "neochatconfig.h"
struct ForeignConfig {
Q_GADGET
QML_FOREIGN(NeoChatConfig)
QML_NAMED_ELEMENT(Config)
QML_SINGLETON
public:
static NeoChatConfig *create(QQmlEngine *, QJSEngine *)
{
QQmlEngine::setObjectOwnership(NeoChatConfig::self(), QQmlEngine::CppOwnership);
return NeoChatConfig::self();
}
};
struct ForeignAccountRegistry { struct ForeignAccountRegistry {
Q_GADGET Q_GADGET
QML_FOREIGN(Quotient::AccountRegistry) QML_FOREIGN(Quotient::AccountRegistry)
@@ -42,12 +51,3 @@ struct ForeignSSSSHandler {
QML_FOREIGN(Quotient::SSSSHandler) QML_FOREIGN(Quotient::SSSSHandler)
QML_NAMED_ELEMENT(SSSSHandler) QML_NAMED_ELEMENT(SSSSHandler)
}; };
#if Quotient_VERSION_MINOR > 8
struct ForeignKeyImport {
Q_GADGET
QML_SINGLETON
QML_FOREIGN(Quotient::KeyImport)
QML_NAMED_ELEMENT(KeyImport)
};
#endif

View File

@@ -40,7 +40,7 @@ float LocationHelper::zoomToFit(const QRectF &r, float mapWidth, float mapHeight
const auto zy = std::log2((mapHeight / (p2.y() - p1.y()))); const auto zy = std::log2((mapHeight / (p2.y() - p1.y())));
const auto z = std::min(zx, zy); const auto z = std::min(zx, zy);
return std::clamp(z, 5.0, 18.0); return z;
} }
#include "moc_locationhelper.cpp" #include "moc_locationhelper.cpp"

View File

@@ -78,9 +78,7 @@ void LoginHelper::init()
account.setHomeserver(m_connection->homeserver()); account.setHomeserver(m_connection->homeserver());
account.setDeviceId(m_connection->deviceId()); account.setDeviceId(m_connection->deviceId());
account.setDeviceName(m_deviceName); account.setDeviceName(m_deviceName);
if (!Controller::instance().saveAccessTokenToKeyChain(account.userId(), m_connection->accessToken())) { Controller::instance().saveAccessTokenToKeyChain(account.userId(), m_connection->accessToken());
qWarning() << "Couldn't save access token";
}
account.sync(); account.sync();
Controller::instance().addConnection(m_connection); Controller::instance().addConnection(m_connection);
Controller::instance().setActiveConnection(m_connection); Controller::instance().setActiveConnection(m_connection);

View File

@@ -20,5 +20,4 @@ ecm_add_qml_module(login GENERATE_PLUGIN_SOURCE
Sso.qml Sso.qml
Terms.qml Terms.qml
Username.qml Username.qml
Oidc.qml
) )

View File

@@ -31,11 +31,4 @@ LoginStep {
text: i18nc("@action:button", "Register") text: i18nc("@action:button", "Register")
onClicked: root.processed("Homeserver") onClicked: root.processed("Homeserver")
} }
FormCard.FormDelegateSeparator {}
FormCard.FormButtonDelegate {
text: i18nc("@action:button", "Login with OIDC")
onClicked: root.processed("Oidc")
}
} }

View File

@@ -1,74 +0,0 @@
// SPDX-FileCopyrightText: 2024 Tobias Fella <tobias.fella@kde.org>
// SPDX-License-Identifier: GPL-2.0-or-later
import QtQuick
import QtQuick.Layouts
import org.kde.kirigamiaddons.formcard as FormCard
import org.kde.neochat
LoginStep {
id: root
FormCard.FormTextFieldDelegate {
id: homeserver
visible: !infoLabel.visible
label: i18n("Homeserver")
text: "synapse-oidc.element.dev"
}
Connections {
target: Controller.pendingOidcConnection
function onOpenOidcUrl(url: string): void {
infoLabel.url = url;
infoLabel.visible = true;
}
function onConnected(): void {
root.processed("Loading");
}
}
FormCard.FormTextDelegate {
id: infoLabel
property string url: ""
visible: false
text: i18n("To continue, please open the following link in your web browser: %1", "<br /><br /><a href='" + url + "'>" + url + "</a>")
onLinkActivated: url => Qt.openUrlExternally(url)
}
FormCard.FormDelegateSeparator { above: openLink }
FormCard.FormButtonDelegate {
id: openLink
visible: infoLabel.visible
text: i18n("Open Authorization Link")
icon.name: "document-open"
onClicked: Qt.openUrlExternally(infoLabel.url.authorizeUrl)
}
FormCard.FormDelegateSeparator {
visible: infoLabel.visible
above: openLink
below: copyLink
}
FormCard.FormButtonDelegate {
id: copyLink
visible: infoLabel.visible
text: i18n("Copy Authorization Link")
icon.name: "edit-copy"
onClicked: {
Clipboard.saveText(infoLabel.url)
applicationWindow().showPassiveNotification(i18n("Link copied."));
}
}
FormCard.FormButtonDelegate {
visible: !infoLabel.visible
text: i18nc("@action:button", "Log in with OIDC")
onClicked: Controller.startOidcLogin(homeserver.text)
}
}

View File

@@ -148,7 +148,7 @@ int main(int argc, char *argv[])
i18n("Maintainer"), i18n("Maintainer"),
QStringLiteral("carl@carlschwan.eu"), QStringLiteral("carl@carlschwan.eu"),
QStringLiteral("https://carlschwan.eu"), QStringLiteral("https://carlschwan.eu"),
QUrl(QStringLiteral("https://carlschwan.eu/avatar.png"))); QStringLiteral("https://carlschwan.eu/avatar.png"));
about.addAuthor(i18n("Tobias Fella"), i18n("Maintainer"), QStringLiteral("tobias.fella@kde.org"), QStringLiteral("https://tobiasfella.de")); about.addAuthor(i18n("Tobias Fella"), i18n("Maintainer"), QStringLiteral("tobias.fella@kde.org"), QStringLiteral("https://tobiasfella.de"));
about.addAuthor(i18n("James Graham"), i18n("Maintainer"), QStringLiteral("james.h.graham@protonmail.com")); about.addAuthor(i18n("James Graham"), i18n("Maintainer"), QStringLiteral("james.h.graham@protonmail.com"));
about.addCredit(i18n("Black Hat"), i18n("Original author of Spectral"), QStringLiteral("bhat@encom.eu.org")); about.addCredit(i18n("Black Hat"), i18n("Original author of Spectral"), QStringLiteral("bhat@encom.eu.org"));

View File

@@ -31,8 +31,8 @@
using namespace Quotient; using namespace Quotient;
MessageContentModel::MessageContentModel(NeoChatRoom *room, const Quotient::RoomEvent *event, bool isReply, bool isPending, MessageContentModel *parent) MessageContentModel::MessageContentModel(NeoChatRoom *room, const Quotient::RoomEvent *event, bool isReply, bool isPending)
: QAbstractListModel(parent) : QAbstractListModel(nullptr)
, m_room(room) , m_room(room)
, m_eventId(event != nullptr ? event->id() : QString()) , m_eventId(event != nullptr ? event->id() : QString())
, m_eventSenderId(event != nullptr ? event->senderId() : QString()) , m_eventSenderId(event != nullptr ? event->senderId() : QString())
@@ -43,8 +43,8 @@ MessageContentModel::MessageContentModel(NeoChatRoom *room, const Quotient::Room
initializeModel(); initializeModel();
} }
MessageContentModel::MessageContentModel(NeoChatRoom *room, const QString &eventId, bool isReply, bool isPending, MessageContentModel *parent) MessageContentModel::MessageContentModel(NeoChatRoom *room, const QString &eventId, bool isReply, bool isPending)
: QAbstractListModel(parent) : QAbstractListModel(nullptr)
, m_room(room) , m_room(room)
, m_eventId(eventId) , m_eventId(eventId)
, m_isPending(isPending) , m_isPending(isPending)
@@ -58,16 +58,15 @@ void MessageContentModel::initializeModel()
Q_ASSERT(m_room != nullptr); Q_ASSERT(m_room != nullptr);
// Allow making a model for an event that is being downloaded but will appear later // Allow making a model for an event that is being downloaded but will appear later
// e.g. a reply, but we need an ID to know when it has arrived. // e.g. a reply, but we need an ID to know when it has arrived.
// Also note that a pending event may not have an event ID yet but as long as we have an event Q_ASSERT(!m_eventId.isEmpty());
// pointer we can pass out the transaction ID until it is set.
Q_ASSERT(!m_eventId.isEmpty() || m_event != nullptr);
Quotient::connectUntil(m_room.get(), &NeoChatRoom::extraEventLoaded, this, [this](const QString &eventId) { Quotient::connectUntil(m_room.get(), &NeoChatRoom::extraEventLoaded, this, [this](const QString &eventId) {
if (m_room != nullptr) { if (m_room != nullptr) {
if (eventId == m_eventId) { if (eventId == m_eventId) {
intiializeEvent(m_room->getEvent(eventId)); m_event = loadEvent<RoomEvent>(m_room->getEvent(eventId)->fullJson());
Q_EMIT eventUpdated();
updateReplyModel(); updateReplyModel();
resetModel(); resetContent();
return true; return true;
} }
} }
@@ -165,12 +164,7 @@ void MessageContentModel::intiializeEvent(const QString &eventId)
void MessageContentModel::intiializeEvent(const Quotient::RoomEvent *event) void MessageContentModel::intiializeEvent(const Quotient::RoomEvent *event)
{ {
m_event = loadEvent<RoomEvent>(event->fullJson()); m_event = loadEvent<RoomEvent>(event->fullJson());
// a pending event may not previously have had an event ID so update. auto senderId = event->senderId();
if (m_eventId.isEmpty()) {
m_eventId = m_event->id();
}
auto senderId = m_event->senderId();
// A pending event might not have a sender ID set yet but in that case it must // A pending event might not have a sender ID set yet but in that case it must
// be the local member. // be the local member.
if (senderId.isEmpty()) { if (senderId.isEmpty()) {
@@ -231,11 +225,6 @@ QVariant MessageContentModel::data(const QModelIndex &index, int role) const
if (m_event == nullptr) { if (m_event == nullptr) {
return QString(); return QString();
} }
if (m_event->isRedacted()) {
auto reason = m_event->redactedBecause()->reason();
return (reason.isEmpty()) ? i18n("<i>[This message was deleted]</i>")
: i18n("<i>[This message was deleted: %1]</i>", m_event->redactedBecause()->reason());
}
if (!component.content.isEmpty()) { if (!component.content.isEmpty()) {
return component.content; return component.content;
} }
@@ -428,9 +417,9 @@ void MessageContentModel::updateReplyModel()
const auto replyEvent = m_room->findInTimeline(eventHandler.getReplyId()); const auto replyEvent = m_room->findInTimeline(eventHandler.getReplyId());
if (replyEvent == m_room->historyEdge()) { if (replyEvent == m_room->historyEdge()) {
m_replyModel = new MessageContentModel(m_room, eventHandler.getReplyId(), true, false, this); m_replyModel = new MessageContentModel(m_room, eventHandler.getReplyId(), true);
} else { } else {
m_replyModel = new MessageContentModel(m_room, replyEvent->get(), true, false, this); m_replyModel = new MessageContentModel(m_room, replyEvent->get(), true);
} }
connect(m_replyModel, &MessageContentModel::eventUpdated, this, [this]() { connect(m_replyModel, &MessageContentModel::eventUpdated, this, [this]() {
@@ -520,7 +509,7 @@ MessageComponent MessageContentModel::linkPreviewComponent(const QUrl &link)
if (linkPreviewer->loaded()) { if (linkPreviewer->loaded()) {
return MessageComponent{MessageComponentType::LinkPreview, QString(), {{"link"_ls, link}}}; return MessageComponent{MessageComponentType::LinkPreview, QString(), {{"link"_ls, link}}};
} else { } else {
connect(linkPreviewer, &LinkPreviewer::loadedChanged, [this, link]() { connect(linkPreviewer, &LinkPreviewer::loadedChanged, this, [this, link]() {
const auto linkPreviewer = dynamic_cast<NeoChatConnection *>(m_room->connection())->previewerForLink(link); const auto linkPreviewer = dynamic_cast<NeoChatConnection *>(m_room->connection())->previewerForLink(link);
if (linkPreviewer != nullptr && linkPreviewer->loaded()) { if (linkPreviewer != nullptr && linkPreviewer->loaded()) {
for (auto &component : m_components) { for (auto &component : m_components) {
@@ -561,6 +550,11 @@ QList<MessageComponent> MessageContentModel::addLinkPreviews(QList<MessageCompon
void MessageContentModel::closeLinkPreview(int row) void MessageContentModel::closeLinkPreview(int row)
{ {
if (row < 0 || row > m_components.size()) {
qWarning() << "closeLinkPreview() called with row" << row << "which does not exist. m_components.size() =" << m_components.size();
return;
}
if (m_components[row].type == MessageComponentType::LinkPreview || m_components[row].type == MessageComponentType::LinkPreviewLoad) { if (m_components[row].type == MessageComponentType::LinkPreview || m_components[row].type == MessageComponentType::LinkPreviewLoad) {
beginResetModel(); beginResetModel();
m_removedLinkPreviews += m_components[row].attributes["link"_ls].toUrl(); m_removedLinkPreviews += m_components[row].attributes["link"_ls].toUrl();

View File

@@ -75,12 +75,8 @@ public:
}; };
Q_ENUM(Roles) Q_ENUM(Roles)
explicit MessageContentModel(NeoChatRoom *room, explicit MessageContentModel(NeoChatRoom *room, const Quotient::RoomEvent *event, bool isReply = false, bool isPending = false);
const Quotient::RoomEvent *event, MessageContentModel(NeoChatRoom *room, const QString &eventId, bool isReply = false, bool isPending = false);
bool isReply = false,
bool isPending = false,
MessageContentModel *parent = nullptr);
MessageContentModel(NeoChatRoom *room, const QString &eventId, bool isReply = false, bool isPending = false, MessageContentModel *parent = nullptr);
bool showAuthor() const; bool showAuthor() const;
void setShowAuthor(bool showAuthor); void setShowAuthor(bool showAuthor);

View File

@@ -88,6 +88,7 @@ void MessageEventModel::setRoom(NeoChatRoom *room)
// HACK: Reset the model to a null room first to make sure QML dismantles // HACK: Reset the model to a null room first to make sure QML dismantles
// last room's objects before the room is actually changed // last room's objects before the room is actually changed
beginResetModel(); beginResetModel();
m_readMarkerModels.clear();
m_currentRoom->disconnect(this); m_currentRoom->disconnect(this);
m_currentRoom = nullptr; m_currentRoom = nullptr;
endResetModel(); endResetModel();
@@ -95,9 +96,6 @@ void MessageEventModel::setRoom(NeoChatRoom *room)
// Don't clear the member objects until the model has been fully reset and all // Don't clear the member objects until the model has been fully reset and all
// refs cleared. // refs cleared.
m_memberObjects.clear(); m_memberObjects.clear();
m_contentModels.clear();
m_reactionModels.clear();
m_readMarkerModels.clear();
} }
beginResetModel(); beginResetModel();
@@ -435,17 +433,17 @@ QVariant MessageEventModel::data(const QModelIndex &idx, int role) const
EventHandler eventHandler(m_currentRoom, &evt); EventHandler eventHandler(m_currentRoom, &evt);
if (role == Qt::DisplayRole) { if (role == Qt::DisplayRole) {
if (evt.isRedacted()) {
auto reason = evt.redactedBecause()->reason();
return (reason.isEmpty()) ? i18n("<i>[This message was deleted]</i>")
: i18n("<i>[This message was deleted: %1]</i>", evt.redactedBecause()->reason());
}
return eventHandler.getRichBody(); return eventHandler.getRichBody();
} }
if (role == ContentModelRole) { if (role == ContentModelRole) {
if (m_contentModels.contains(evt.id())) { if (!evt.isStateEvent() && !evt.id().isEmpty()) {
return QVariant::fromValue<MessageContentModel *>(m_contentModels.at(evt.id()).get()); return QVariant::fromValue<MessageContentModel *>(new MessageContentModel(m_currentRoom, &evt));
}
if (evt.isStateEvent()) {
if (evt.matrixType() == QStringLiteral("org.matrix.msc3672.beacon_info")) {
return QVariant::fromValue<MessageContentModel *>(new MessageContentModel(m_currentRoom, &evt));
}
} }
return {}; return {};
} }
@@ -631,12 +629,6 @@ void MessageEventModel::createEventObjects(const Quotient::RoomEvent *event)
m_memberObjects[senderId] = std::unique_ptr<NeochatRoomMember>(new NeochatRoomMember(m_currentRoom, senderId)); m_memberObjects[senderId] = std::unique_ptr<NeochatRoomMember>(new NeochatRoomMember(m_currentRoom, senderId));
} }
if (!m_contentModels.contains(eventId)) {
if (!event->isStateEvent() || event->matrixType() == QStringLiteral("org.matrix.msc3672.beacon_info")) {
m_contentModels[eventId] = std::unique_ptr<MessageContentModel>(new MessageContentModel(m_currentRoom, event));
}
}
// ReadMarkerModel handles updates to add and remove markers, we only need to // ReadMarkerModel handles updates to add and remove markers, we only need to
// handle adding and removing whole models here. // handle adding and removing whole models here.
if (m_readMarkerModels.contains(eventId)) { if (m_readMarkerModels.contains(eventId)) {

View File

@@ -8,7 +8,6 @@
#include <QQmlEngine> #include <QQmlEngine>
#include "linkpreviewer.h" #include "linkpreviewer.h"
#include "messagecontentmodel.h"
#include "neochatroom.h" #include "neochatroom.h"
#include "neochatroommember.h" #include "neochatroommember.h"
#include "pollhandler.h" #include "pollhandler.h"
@@ -118,7 +117,6 @@ private:
KFormat m_format; KFormat m_format;
std::map<QString, std::unique_ptr<NeochatRoomMember>> m_memberObjects; std::map<QString, std::unique_ptr<NeochatRoomMember>> m_memberObjects;
std::map<QString, std::unique_ptr<MessageContentModel>> m_contentModels;
QMap<QString, QSharedPointer<ReadMarkerModel>> m_readMarkerModels; QMap<QString, QSharedPointer<ReadMarkerModel>> m_readMarkerModels;
QMap<QString, QSharedPointer<ReactionModel>> m_reactionModels; QMap<QString, QSharedPointer<ReactionModel>> m_reactionModels;

View File

@@ -247,7 +247,7 @@ void PermissionsModel::setPowerLevel(const QString &permission, const int &newPo
powerLevelContent[QLatin1String("events")] = eventPowerLevels; powerLevelContent[QLatin1String("events")] = eventPowerLevels;
} }
m_room->setState<Quotient::RoomPowerLevelsEvent>(powerLevelContent); m_room->setState<Quotient::RoomPowerLevelsEvent>(Quotient::fromJson<Quotient::PowerLevelsEventContent>(powerLevelContent));
} }
} }

View File

@@ -312,8 +312,12 @@ void PushRuleModel::addKeyword(const QString &keyword, const QString &roomId)
pushConditions.append(keywordCondition); pushConditions.append(keywordCondition);
} }
#if Quotient_VERSION_MINOR > 8
auto job = m_connection->callApi<Quotient::SetPushRuleJob>(PushRuleKind::kindString(kind),
#else
auto job = m_connection->callApi<Quotient::SetPushRuleJob>(QLatin1String("global"), auto job = m_connection->callApi<Quotient::SetPushRuleJob>(QLatin1String("global"),
PushRuleKind::kindString(kind), PushRuleKind::kindString(kind),
#endif
keyword, keyword,
actions, actions,
QString(), QString(),
@@ -338,7 +342,11 @@ void PushRuleModel::removeKeyword(const QString &keyword)
} }
auto kind = PushRuleKind::kindString(m_rules[index].kind); auto kind = PushRuleKind::kindString(m_rules[index].kind);
#if Quotient_VERSION_MINOR > 8
auto job = m_connection->callApi<Quotient::DeletePushRuleJob>(kind, m_rules[index].id);
#else
auto job = m_connection->callApi<Quotient::DeletePushRuleJob>(QStringLiteral("global"), kind, m_rules[index].id); auto job = m_connection->callApi<Quotient::DeletePushRuleJob>(QStringLiteral("global"), kind, m_rules[index].id);
#endif
connect(job, &Quotient::BaseJob::failure, this, [this, job, index]() { connect(job, &Quotient::BaseJob::failure, this, [this, job, index]() {
qWarning() << QLatin1String("Unable to remove push rule for keyword %1: ").arg(m_rules[index].id) << job->errorString(); qWarning() << QLatin1String("Unable to remove push rule for keyword %1: ").arg(m_rules[index].id) << job->errorString();
}); });
@@ -346,10 +354,18 @@ void PushRuleModel::removeKeyword(const QString &keyword)
void PushRuleModel::setNotificationRuleEnabled(const QString &kind, const QString &ruleId, bool enabled) void PushRuleModel::setNotificationRuleEnabled(const QString &kind, const QString &ruleId, bool enabled)
{ {
#if Quotient_VERSION_MINOR > 8
auto job = m_connection->callApi<Quotient::IsPushRuleEnabledJob>(kind, ruleId);
#else
auto job = m_connection->callApi<Quotient::IsPushRuleEnabledJob>(QStringLiteral("global"), kind, ruleId); auto job = m_connection->callApi<Quotient::IsPushRuleEnabledJob>(QStringLiteral("global"), kind, ruleId);
#endif
connect(job, &Quotient::BaseJob::success, this, [job, kind, ruleId, enabled, this]() { connect(job, &Quotient::BaseJob::success, this, [job, kind, ruleId, enabled, this]() {
if (job->enabled() != enabled) { if (job->enabled() != enabled) {
#if Quotient_VERSION_MINOR > 8
m_connection->callApi<Quotient::SetPushRuleEnabledJob>(kind, ruleId, enabled);
#else
m_connection->callApi<Quotient::SetPushRuleEnabledJob>(QStringLiteral("global"), kind, ruleId, enabled); m_connection->callApi<Quotient::SetPushRuleEnabledJob>(QStringLiteral("global"), kind, ruleId, enabled);
#endif
} }
}); });
} }
@@ -363,7 +379,11 @@ void PushRuleModel::setNotificationRuleActions(const QString &kind, const QStrin
actions = actionToVariant(action); actions = actionToVariant(action);
} }
#if Quotient_VERSION_MINOR > 8
m_connection->callApi<Quotient::SetPushRuleActionsJob>(kind, ruleId, actions);
#else
m_connection->callApi<Quotient::SetPushRuleActionsJob>(QStringLiteral("global"), kind, ruleId, actions); m_connection->callApi<Quotient::SetPushRuleActionsJob>(QStringLiteral("global"), kind, ruleId, actions);
#endif
} }
PushRuleAction::Action PushRuleModel::variantToAction(const QList<QVariant> &actions, bool enabled) PushRuleAction::Action PushRuleModel::variantToAction(const QList<QVariant> &actions, bool enabled)

View File

@@ -3,15 +3,10 @@
#include "reactionmodel.h" #include "reactionmodel.h"
#include "neochatroom.h" #include "neochatroom.h"
#include "utils.h"
#include <QDebug> #include <QDebug>
#include <QFont> #include <QFont>
#ifdef HAVE_ICU
#include <QTextBoundaryFinder>
#include <QTextCharFormat>
#include <unicode/uchar.h>
#include <unicode/urename.h>
#endif
#include <KLocalizedString> #include <KLocalizedString>
@@ -157,30 +152,6 @@ QHash<int, QByteArray> ReactionModel::roleNames() const
}; };
} }
bool isEmoji(const QString &text)
{
#ifdef HAVE_ICU
QTextBoundaryFinder finder(QTextBoundaryFinder::Grapheme, text);
int from = 0;
while (finder.toNextBoundary() != -1) {
auto to = finder.position();
if (text[from].isSpace()) {
from = to;
continue;
}
auto first = text.mid(from, to - from).toUcs4()[0];
if (!u_hasBinaryProperty(first, UCHAR_EMOJI)) {
return false;
}
from = to;
}
return true;
#else
return false;
#endif
}
QString ReactionModel::reactionText(QString text) const QString ReactionModel::reactionText(QString text) const
{ {
text = text.toHtmlEscaped(); text = text.toHtmlEscaped();
@@ -194,7 +165,7 @@ QString ReactionModel::reactionText(QString text) const
.arg(m_room->connection()->makeMediaUrl(QUrl(text)).toString(), QString::number(size)); .arg(m_room->connection()->makeMediaUrl(QUrl(text)).toString(), QString::number(size));
} }
return isEmoji(text) ? QStringLiteral("<span style=\"font-family: 'emoji';\">") + text + QStringLiteral("</span>") : text; return Utils::isEmoji(text) ? QStringLiteral("<span style=\"font-family: 'emoji';\">") + text + QStringLiteral("</span>") : text;
} }
#include "moc_reactionmodel.cpp" #include "moc_reactionmodel.cpp"

View File

@@ -8,7 +8,7 @@
bool UserFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const bool UserFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const
{ {
Q_UNUSED(sourceParent); Q_UNUSED(sourceParent);
if (m_filterText.length() < 1) { if (!m_allowEmpty && m_filterText.length() < 1) {
return false; return false;
} }
return sourceModel()->data(sourceModel()->index(sourceRow, 0), UserListModel::DisplayNameRole).toString().contains(m_filterText, Qt::CaseInsensitive) return sourceModel()->data(sourceModel()->index(sourceRow, 0), UserListModel::DisplayNameRole).toString().contains(m_filterText, Qt::CaseInsensitive)
@@ -27,4 +27,15 @@ void UserFilterModel::setFilterText(const QString &filterText)
invalidateFilter(); invalidateFilter();
} }
bool UserFilterModel::allowEmpty() const
{
return m_allowEmpty;
}
void UserFilterModel::setAllowEmpty(bool allowEmpty)
{
m_allowEmpty = allowEmpty;
Q_EMIT allowEmptyChanged();
}
#include "moc_userfiltermodel.cpp" #include "moc_userfiltermodel.cpp"

View File

@@ -24,6 +24,7 @@ class UserFilterModel : public QSortFilterProxyModel
* The text is either a desired display name or matrix id. * The text is either a desired display name or matrix id.
*/ */
Q_PROPERTY(QString filterText READ filterText WRITE setFilterText NOTIFY filterTextChanged) Q_PROPERTY(QString filterText READ filterText WRITE setFilterText NOTIFY filterTextChanged)
Q_PROPERTY(bool allowEmpty READ allowEmpty WRITE setAllowEmpty NOTIFY allowEmptyChanged)
public: public:
/** /**
@@ -36,9 +37,14 @@ public:
QString filterText() const; QString filterText() const;
void setFilterText(const QString &filterText); void setFilterText(const QString &filterText);
bool allowEmpty() const;
void setAllowEmpty(bool allowEmpty);
Q_SIGNALS: Q_SIGNALS:
void filterTextChanged(); void filterTextChanged();
void allowEmptyChanged();
private: private:
QString m_filterText; QString m_filterText;
bool m_allowEmpty = false;
}; };

View File

@@ -88,7 +88,11 @@ QVariant UserListModel::data(const QModelIndex &index, int role) const
return memberId; return memberId;
} }
if (role == AvatarRole) { if (role == AvatarRole) {
#if Quotient_VERSION_MINOR > 8
return m_currentRoom->member(memberId).avatarUrl();
#else
return m_currentRoom->memberAvatar(memberId).url(); return m_currentRoom->memberAvatar(memberId).url();
#endif
} }
if (role == ObjectRole) { if (role == ObjectRole) {
return QVariant::fromValue(memberId); return QVariant::fromValue(memberId);

View File

@@ -125,7 +125,7 @@ void WebShortcutModel::trigger(const QString &data)
void WebShortcutModel::configureWebShortcuts() void WebShortcutModel::configureWebShortcuts()
{ {
#ifdef HAVE_KIO #ifdef HAVE_KIO
auto job = new KIO::CommandLauncherJob(QStringLiteral("kcmshell5"), QStringList() << QStringLiteral("webshortcuts"), this); auto job = new KIO::CommandLauncherJob(QStringLiteral("kcmshell6"), QStringList() << QStringLiteral("webshortcuts"), this);
job->exec(); job->exec();
#endif #endif
} }

View File

@@ -261,14 +261,16 @@ Action=Popup
Name=Share Name=Share
Name[ar]=شارك Name[ar]=شارك
Name[ca]=Compartició Name[ca]=Compartició
Name[ca@valencia]=Compartició Name[ca@valencia]=Compartiu
Name[cs]=Sdílet Name[cs]=Sdílet
Name[de]=Teilen
Name[en_GB]=Share Name[en_GB]=Share
Name[eo]=Kundividi Name[eo]=Kundividi
Name[es]=Compartir Name[es]=Compartir
Name[eu]=Partekatu Name[eu]=Partekatu
Name[fi]=Jaa Name[fi]=Jaa
Name[fr]=Partager Name[fr]=Partager
Name[gl]=Compartir
Name[he]=שיתוף Name[he]=שיתוף
Name[hu]=Megosztás Name[hu]=Megosztás
Name[ia]=Comparti Name[ia]=Comparti
@@ -290,12 +292,14 @@ Comment=The result of sharing a piece of content
Comment[ar]=نتيجة مشاركة محتوى Comment[ar]=نتيجة مشاركة محتوى
Comment[ca]=El resultat de compartir una peça de contingut Comment[ca]=El resultat de compartir una peça de contingut
Comment[ca@valencia]=El resultat de compartir una peça de contingut Comment[ca@valencia]=El resultat de compartir una peça de contingut
Comment[de]=Das Ergebnis nach dem Teilen eines Teils des Inhalts
Comment[en_GB]=The result of sharing a piece of content Comment[en_GB]=The result of sharing a piece of content
Comment[eo]=La rezulto el kundividado de enhavero Comment[eo]=La rezulto el kundividado de enhavero
Comment[es]=El resultado de compartir una parte de contenido Comment[es]=El resultado de compartir una parte de contenido
Comment[eu]=Eduki pieza bat partekatzearen emaitza Comment[eu]=Eduki pieza bat partekatzearen emaitza
Comment[fi]=Tulos yhden sisältöosasen jakamisesta Comment[fi]=Tulos yhden sisältöosasen jakamisesta
Comment[fr]=Le résultat du partage d'une partie de contenu. Comment[fr]=Le résultat du partage d'une partie de contenu.
Comment[gl]=O resultado de compartir un fragmento de contido.
Comment[he]=תוצאת שיתוף פיסת תוכן Comment[he]=תוצאת שיתוף פיסת תוכן
Comment[hu]=Tartalom megosztásának eredménye Comment[hu]=Tartalom megosztásának eredménye
Comment[ia]=Le exito de compartir un pecietta de contento Comment[ia]=Le exito de compartir un pecietta de contento

9
src/neochatconfig.kcfgc Normal file
View File

@@ -0,0 +1,9 @@
# SPDX-FileCopyrightText: 2020 Carl Schwan <carl@carlschwan.eu>
# SPDX-License-Identifier: LGPL-2.1-or-later
File=neochatconfig.kcfg
ClassName=NeoChatConfig
Mutators=true
DefaultValueGetters=true
GenerateProperties=true
ParentInConstructor=true
Singleton=true

View File

@@ -23,7 +23,6 @@
#include <KLocalizedString> #include <KLocalizedString>
#include <Quotient/connectiondata.h>
#include <Quotient/csapi/content-repo.h> #include <Quotient/csapi/content-repo.h>
#include <Quotient/csapi/profile.h> #include <Quotient/csapi/profile.h>
#include <Quotient/csapi/versions.h> #include <Quotient/csapi/versions.h>
@@ -149,17 +148,6 @@ void NeoChatConnection::connectSignals()
}); });
}, },
Qt::SingleShotConnection); Qt::SingleShotConnection);
connect(this, &Connection::refreshTokenChanged, this, [this]() {
QKeychain::WritePasswordJob job(qAppName());
job.setAutoDelete(true);
job.setKey(userId());
job.setBinaryData(connectionData()->refreshToken().toLatin1());
QEventLoop loop;
connect(&job, &QKeychain::Job::finished, &loop, &QEventLoop::quit);
job.start();
loop.exec();
});
} }
int NeoChatConnection::badgeNotificationCount() const int NeoChatConnection::badgeNotificationCount() const
@@ -586,21 +574,4 @@ LinkPreviewer *NeoChatConnection::previewerForLink(const QUrl &link)
return previewer; return previewer;
} }
#if Quotient_VERSION_MINOR > 8
KeyImport::Error NeoChatConnection::exportMegolmSessions(const QString &passphrase, const QString &path)
{
KeyImport keyImport;
auto result = keyImport.exportKeys(passphrase, this);
if (!result.has_value()) {
return result.error();
}
QUrl url(path);
QFile file(url.toLocalFile());
file.open(QFile::WriteOnly);
file.write(result.value());
file.close();
return KeyImport::Success;
}
#endif
#include "moc_neochatconnection.cpp" #include "moc_neochatconnection.cpp"

View File

@@ -9,10 +9,6 @@
#include <QCoroTask> #include <QCoroTask>
#include <Quotient/connection.h> #include <Quotient/connection.h>
#if Quotient_VERSION_MINOR > 8
#include <Quotient/keyimport.h>
#endif
#include "models/threepidmodel.h" #include "models/threepidmodel.h"
class LinkPreviewer; class LinkPreviewer;
@@ -173,10 +169,6 @@ public:
*/ */
Q_INVOKABLE QString accountDataJsonString(const QString &type) const; Q_INVOKABLE QString accountDataJsonString(const QString &type) const;
#if Quotient_VERSION_MINOR > 8
Q_INVOKABLE Quotient::KeyImport::Error exportMegolmSessions(const QString &passphrase, const QString &path);
#endif
qsizetype directChatNotifications() const; qsizetype directChatNotifications() const;
bool directChatsHaveHighlightNotifications() const; bool directChatsHaveHighlightNotifications() const;
qsizetype homeNotifications() const; qsizetype homeNotifications() const;

View File

@@ -134,7 +134,11 @@ NeoChatRoom::NeoChatRoom(Connection *connection, QString roomId, JoinState joinS
auto showNotification = [this, roomMemberEvent] { auto showNotification = [this, roomMemberEvent] {
QImage avatar_image; QImage avatar_image;
if (roomMemberEvent && !member(roomMemberEvent->senderId()).avatarUrl().isEmpty()) { if (roomMemberEvent && !member(roomMemberEvent->senderId()).avatarUrl().isEmpty()) {
#if Quotient_VERSION_MINOR > 8
avatar_image = member(roomMemberEvent->senderId()).avatar(128, 128, {});
#else
avatar_image = memberAvatar(roomMemberEvent->senderId()).get(this->connection(), 128, [] {}); avatar_image = memberAvatar(roomMemberEvent->senderId()).get(this->connection(), 128, [] {});
#endif
} else { } else {
qWarning() << "using this room's avatar"; qWarning() << "using this room's avatar";
avatar_image = avatar(128); avatar_image = avatar(128);
@@ -1223,7 +1227,11 @@ void NeoChatRoom::setPushNotificationState(PushNotificationState::State state)
for (const auto &i : roomRuleArray) { for (const auto &i : roomRuleArray) {
QJsonObject roomRule = i.toObject(); QJsonObject roomRule = i.toObject();
if (roomRule["rule_id"_ls] == id()) { if (roomRule["rule_id"_ls] == id()) {
connection()->callApi<DeletePushRuleJob>("global"_ls, "room"_ls, id()); #if Quotient_VERSION_MINOR > 8
connection()->callApi<DeletePushRuleJob>("room"_ls, id());
#else
connection()->callApi<DeletePushRuleJob>(QLatin1String("global"), "room"_ls, id());
#endif
} }
} }
} }
@@ -1234,7 +1242,11 @@ void NeoChatRoom::setPushNotificationState(PushNotificationState::State state)
for (const auto &i : overrideRuleArray) { for (const auto &i : overrideRuleArray) {
QJsonObject overrideRule = i.toObject(); QJsonObject overrideRule = i.toObject();
if (overrideRule["rule_id"_ls] == id()) { if (overrideRule["rule_id"_ls] == id()) {
#if Quotient_VERSION_MINOR > 8
connection()->callApi<DeletePushRuleJob>("override"_ls, id());
#else
connection()->callApi<DeletePushRuleJob>("global"_ls, "override"_ls, id()); connection()->callApi<DeletePushRuleJob>("global"_ls, "override"_ls, id());
#endif
} }
} }
} }
@@ -1270,9 +1282,17 @@ void NeoChatRoom::setPushNotificationState(PushNotificationState::State state)
const QList<PushCondition> conditions = {pushCondition}; const QList<PushCondition> conditions = {pushCondition};
// Add new override rule and make sure it's enabled // Add new override rule and make sure it's enabled
#if Quotient_VERSION_MINOR > 8
auto job = connection()->callApi<SetPushRuleJob>("override"_ls, id(), actions, QString(), QString(), conditions, QString());
#else
auto job = connection()->callApi<SetPushRuleJob>("global"_ls, "override"_ls, id(), actions, QString(), QString(), conditions, QString()); auto job = connection()->callApi<SetPushRuleJob>("global"_ls, "override"_ls, id(), actions, QString(), QString(), conditions, QString());
#endif
connect(job, &BaseJob::success, this, [this]() { connect(job, &BaseJob::success, this, [this]() {
#if Quotient_VERSION_MINOR > 8
auto enableJob = connection()->callApi<SetPushRuleEnabledJob>("override"_ls, id(), true);
#else
auto enableJob = connection()->callApi<SetPushRuleEnabledJob>("global"_ls, "override"_ls, id(), true); auto enableJob = connection()->callApi<SetPushRuleEnabledJob>("global"_ls, "override"_ls, id(), true);
#endif
connect(enableJob, &BaseJob::success, this, [this]() { connect(enableJob, &BaseJob::success, this, [this]() {
m_pushNotificationStateUpdating = false; m_pushNotificationStateUpdating = false;
}); });
@@ -1296,9 +1316,17 @@ void NeoChatRoom::setPushNotificationState(PushNotificationState::State state)
// No conditions for a room rule // No conditions for a room rule
const QList<PushCondition> conditions; const QList<PushCondition> conditions;
#if Quotient_VERSION_MINOR > 8
auto setJob = connection()->callApi<SetPushRuleJob>("room"_ls, id(), actions, QString(), QString(), conditions, QString());
#else
auto setJob = connection()->callApi<SetPushRuleJob>("global"_ls, "room"_ls, id(), actions, QString(), QString(), conditions, QString()); auto setJob = connection()->callApi<SetPushRuleJob>("global"_ls, "room"_ls, id(), actions, QString(), QString(), conditions, QString());
#endif
connect(setJob, &BaseJob::success, this, [this]() { connect(setJob, &BaseJob::success, this, [this]() {
#if Quotient_VERSION_MINOR > 8
auto enableJob = connection()->callApi<SetPushRuleEnabledJob>("room"_ls, id(), true);
#else
auto enableJob = connection()->callApi<SetPushRuleEnabledJob>("global"_ls, "room"_ls, id(), true); auto enableJob = connection()->callApi<SetPushRuleEnabledJob>("global"_ls, "room"_ls, id(), true);
#endif
connect(enableJob, &BaseJob::success, this, [this]() { connect(enableJob, &BaseJob::success, this, [this]() {
m_pushNotificationStateUpdating = false; m_pushNotificationStateUpdating = false;
}); });
@@ -1327,9 +1355,17 @@ void NeoChatRoom::setPushNotificationState(PushNotificationState::State state)
const QList<PushCondition> conditions; const QList<PushCondition> conditions;
// Add new room rule and make sure enabled // Add new room rule and make sure enabled
#if Quotient_VERSION_MINOR > 8
auto setJob = connection()->callApi<SetPushRuleJob>("room"_ls, id(), actions, QString(), QString(), conditions, QString());
#else
auto setJob = connection()->callApi<SetPushRuleJob>("global"_ls, "room"_ls, id(), actions, QString(), QString(), conditions, QString()); auto setJob = connection()->callApi<SetPushRuleJob>("global"_ls, "room"_ls, id(), actions, QString(), QString(), conditions, QString());
#endif
connect(setJob, &BaseJob::success, this, [this]() { connect(setJob, &BaseJob::success, this, [this]() {
#if Quotient_VERSION_MINOR > 8
auto enableJob = connection()->callApi<SetPushRuleEnabledJob>("room"_ls, id(), true);
#else
auto enableJob = connection()->callApi<SetPushRuleEnabledJob>("global"_ls, "room"_ls, id(), true); auto enableJob = connection()->callApi<SetPushRuleEnabledJob>("global"_ls, "room"_ls, id(), true);
#endif
connect(enableJob, &BaseJob::success, this, [this]() { connect(enableJob, &BaseJob::success, this, [this]() {
m_pushNotificationStateUpdating = false; m_pushNotificationStateUpdating = false;
}); });
@@ -1705,9 +1741,13 @@ int NeoChatRoom::maxRoomVersion() const
return maxVersion; return maxVersion;
} }
Quotient::RoomMember NeoChatRoom::directChatRemoteMember() const NeochatRoomMember *NeoChatRoom::directChatRemoteMember()
{ {
return directChatMembers()[0]; if (directChatMembers().size() == 0) {
qWarning() << "No other member available in this room";
return {};
}
return new NeochatRoomMember(this, directChatMembers()[0].id());
} }
void NeoChatRoom::sendLocation(float lat, float lon, const QString &description) void NeoChatRoom::sendLocation(float lat, float lon, const QString &description)
@@ -1748,7 +1788,6 @@ void NeoChatRoom::downloadEventFromServer(const QString &eventId)
connect(job, &BaseJob::success, this, [this, job, eventId] { connect(job, &BaseJob::success, this, [this, job, eventId] {
// The event may have arrived in the meantime so check it's not in the timeline. // The event may have arrived in the meantime so check it's not in the timeline.
if (findInTimeline(eventId) != historyEdge()) { if (findInTimeline(eventId) != historyEdge()) {
Q_EMIT extraEventLoaded(eventId);
return; return;
} }

View File

@@ -13,6 +13,7 @@
#include <Quotient/roommember.h> #include <Quotient/roommember.h>
#include "enums/pushrule.h" #include "enums/pushrule.h"
#include "neochatroommember.h"
#include "pollhandler.h" #include "pollhandler.h"
namespace Quotient namespace Quotient
@@ -74,7 +75,7 @@ class NeoChatRoom : public Quotient::Room
/** /**
* @brief Get a RoomMember object for the other person in a direct chat. * @brief Get a RoomMember object for the other person in a direct chat.
*/ */
Q_PROPERTY(Quotient::RoomMember directChatRemoteMember READ directChatRemoteMember CONSTANT) Q_PROPERTY(NeochatRoomMember *directChatRemoteMember READ directChatRemoteMember CONSTANT)
/** /**
* @brief The Matrix IDs of this room's parents. * @brief The Matrix IDs of this room's parents.
@@ -319,7 +320,7 @@ public:
[[nodiscard]] QString avatarMediaId() const; [[nodiscard]] QString avatarMediaId() const;
Quotient::RoomMember directChatRemoteMember() const; NeochatRoomMember *directChatRemoteMember();
/** /**
* @brief Whether this room has one or more parent spaces set. * @brief Whether this room has one or more parent spaces set.

View File

@@ -131,7 +131,11 @@ void NotificationsManager::processNotificationJob(QPointer<NeoChatConnection> co
QImage avatar_image; QImage avatar_image;
if (!sender.avatarUrl().isEmpty()) { if (!sender.avatarUrl().isEmpty()) {
#if Quotient_VERSION_MINOR > 8
avatar_image = room->member(sender.id()).avatar(128, 128, {});
#else
avatar_image = room->memberAvatar(sender.id()).get(connection, 128, {}); avatar_image = room->memberAvatar(sender.id()).get(connection, 128, {});
#endif
} else { } else {
avatar_image = room->avatar(128); avatar_image = room->avatar(128);
} }

View File

@@ -4,9 +4,34 @@
{ {
"Name": "Tobias Fella", "Name": "Tobias Fella",
"Name[ar]": "توبياس فلة", "Name[ar]": "توبياس فلة",
"Name[he]": "טוביאס פלה", "Name[ca@valencia]": "Tobias Fella",
"Name[ca]": "Tobias Fella",
"Name[cs]": "Tobias Fella",
"Name[de]": "Tobias Fella",
"Name[en_GB]": "Tobias Fella",
"Name[eo]": "Tobias Fella",
"Name[es]": "Tobias Fella",
"Name[eu]": "Tobias Fella",
"Name[fi]": "Tobias Fella",
"Name[fr]": "Tobias Fella",
"Name[gl]": "Tobias Fella",
"Name[hu]": "Tobias Fella",
"Name[ia]": "Tobias Fella",
"Name[it]": "Tobias Fella",
"Name[ka]": "Tobias Fella",
"Name[lv]": "Tobias Fella",
"Name[nl]": "Tobias Fella",
"Name[nn]": "Tobias Fella",
"Name[pl]": "Tobias Fella",
"Name[pt_BR]": "Tobias Fella",
"Name[ru]": "Tobias Fella",
"Name[sl]": "Tobias Fella",
"Name[sv]": "Tobias Fella",
"Name[ta]": "டோபியாஸ் ஃபெல்லா", "Name[ta]": "டோபியாஸ் ஃபெல்லா",
"Name[x-test]": "xxTobias Fellaxx" "Name[tr]": "Tobias Fella",
"Name[uk]": "Tobias Fella",
"Name[x-test]": "xxTobias Fellaxx",
"Name[zh_TW]": "Tobias Fella"
} }
], ],
"Category": "Utilities", "Category": "Utilities",
@@ -15,13 +40,13 @@
"Description[ca@valencia]": "Compartix a través de NeoChat", "Description[ca@valencia]": "Compartix a través de NeoChat",
"Description[ca]": "Comparteix a través del NeoChat", "Description[ca]": "Comparteix a través del NeoChat",
"Description[de]": "Über NeoChat teilen", "Description[de]": "Über NeoChat teilen",
"Description[en_GB]": "Share via NeoChat",
"Description[eo]": "Kundividi per NeoChat", "Description[eo]": "Kundividi per NeoChat",
"Description[es]": "Compartir mediante NeoChat", "Description[es]": "Compartir mediante NeoChat",
"Description[eu]": "Partekatu NeoChat bidez", "Description[eu]": "Partekatu NeoChat bidez",
"Description[fi]": "Jaa NeoChatillä", "Description[fi]": "Jaa NeoChatillä",
"Description[fr]": "Partager grâce à NeoChat", "Description[fr]": "Partager grâce à NeoChat",
"Description[gl]": "Compartir por NeoChat", "Description[gl]": "Compartir por NeoChat",
"Description[he]": "שיתוף דרך NeoChat",
"Description[hu]": "Megosztás NeoChatben", "Description[hu]": "Megosztás NeoChatben",
"Description[ia]": "Comparti via NeoChat", "Description[ia]": "Comparti via NeoChat",
"Description[it]": "Condividi tramite NeoChat", "Description[it]": "Condividi tramite NeoChat",
@@ -30,6 +55,7 @@
"Description[nl]": "Delen via NeoChat", "Description[nl]": "Delen via NeoChat",
"Description[nn]": "Del via NeoChat", "Description[nn]": "Del via NeoChat",
"Description[pl]": "Udostępnij przez NeoChat", "Description[pl]": "Udostępnij przez NeoChat",
"Description[pt_BR]": "Compartilhar via NeoChat",
"Description[ru]": "Опубликовать в NeoChat", "Description[ru]": "Опубликовать в NeoChat",
"Description[sl]": "Deli prek NeoChat", "Description[sl]": "Deli prek NeoChat",
"Description[sv]": "Dela via NeoChat", "Description[sv]": "Dela via NeoChat",
@@ -42,9 +68,35 @@
"License": "GPL", "License": "GPL",
"Name": "NeoChat", "Name": "NeoChat",
"Name[ar]": "نيوتشات", "Name[ar]": "نيوتشات",
"Name[ast]": "NeoChat",
"Name[ca@valencia]": "NeoChat",
"Name[ca]": "NeoChat",
"Name[cs]": "NeoChat",
"Name[de]": "NeoChat",
"Name[en_GB]": "NeoChat",
"Name[eo]": "NeoChat",
"Name[es]": "NeoChat",
"Name[eu]": "NeoChat",
"Name[fi]": "NeoChat",
"Name[fr]": "NeoChat",
"Name[gl]": "NeoChat",
"Name[hu]": "NeoChat",
"Name[ia]": "Neochat", "Name[ia]": "Neochat",
"Name[it]": "NeoChat",
"Name[ka]": "NeoChat",
"Name[lv]": "NeoChat",
"Name[nl]": "NeoChat",
"Name[nn]": "NeoChat",
"Name[pl]": "NeoChat",
"Name[pt_BR]": "NeoChat",
"Name[ru]": "NeoChat",
"Name[sl]": "NeoChat",
"Name[sv]": "NeoChat",
"Name[ta]": "நியோச்சாட்", "Name[ta]": "நியோச்சாட்",
"Name[tr]": "NeoChat",
"Name[uk]": "NeoChat",
"Name[x-test]": "xxNeoChatxx", "Name[x-test]": "xxNeoChatxx",
"Name[zh_TW]": "NeoChat",
"X-Purpose-ActionDisplay": "NeoChat" "X-Purpose-ActionDisplay": "NeoChat"
}, },
"X-Purpose-PluginTypes": [ "X-Purpose-PluginTypes": [

View File

@@ -19,22 +19,6 @@ QQC2.Menu {
margins: Kirigami.Units.smallSpacing margins: Kirigami.Units.smallSpacing
QQC2.MenuItem {
text: i18nc("@action:button", "Show QR code")
icon.name: "view-barcode-qr-symbolic"
onTriggered: {
let qrMax = Qt.createComponent('org.kde.neochat', 'QrCodeMaximizeComponent').createObject(QQC2.Overlay.overlay, {
text: "https://matrix.to/#/" + root.connection.localUser.id,
title: root.connection.localUser.displayName,
subtitle: root.connection.localUser.id,
avatarSource: root.connection.makeMediaUrl(root.connection.localUser.avatarUrl)
});
if (typeof root.closeDialog === "function") {
root.closeDialog();
}
qrMax.open();
}
}
QQC2.MenuItem { QQC2.MenuItem {
text: i18n("Edit this account") text: i18n("Edit this account")
icon.name: "document-edit" icon.name: "document-edit"
@@ -61,7 +45,7 @@ QQC2.Menu {
QQC2.MenuItem { QQC2.MenuItem {
text: i18n("Open developer tools") text: i18n("Open developer tools")
icon.name: "tools" icon.name: "tools"
visible: NeoChatConfig.developerTools visible: Config.developerTools
onTriggered: pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat.devtools', 'DevtoolsPage'), { onTriggered: pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat.devtools', 'DevtoolsPage'), {
connection: root.connection connection: root.connection
}, { }, {
@@ -73,7 +57,7 @@ QQC2.Menu {
QQC2.MenuItem { QQC2.MenuItem {
text: i18nc("@action:inmenu", "Open Secret Backup") text: i18nc("@action:inmenu", "Open Secret Backup")
icon.name: "unlock" icon.name: "unlock"
visible: NeoChatConfig.secretBackup visible: Config.secretBackup
onTriggered: root.window.pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'UnlockSSSSDialog'), {}, { onTriggered: root.window.pageStack.pushDialogLayer(Qt.createComponent('org.kde.neochat', 'UnlockSSSSDialog'), {}, {
title: i18nc("@title:window", "Open Key Backup") title: i18nc("@title:window", "Open Key Backup")
}) })

View File

@@ -1,47 +0,0 @@
// SPDX-FileCopyrightText: 2024 James Graham <james.h.graham@protonmail.com>
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
import QtQuick
import QtQuick.Controls as QQC2
import org.kde.kirigami as Kirigami
import org.kde.kirigamiaddons.labs.components as KirigamiComponents
KirigamiComponents.Avatar {
id: root
property int notificationCount
property bool notificationHighlight
property bool showNotificationLabel
QQC2.Label {
id: notificationCountLabel
anchors.top: parent.top
anchors.right: parent.right
anchors.topMargin: -Kirigami.Units.smallSpacing
anchors.rightMargin: -Kirigami.Units.smallSpacing
z: 1
width: Math.max(notificationCountTextMetrics.advanceWidth + Kirigami.Units.smallSpacing * 2, height)
height: Kirigami.Units.iconSizes.smallMedium
text: root.notificationCount > 0 ? root.notificationCount : ""
visible: root.showNotificationLabel
color: Kirigami.Theme.textColor
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
background: Rectangle {
visible: true
Kirigami.Theme.colorSet: Kirigami.Theme.Button
Kirigami.Theme.inherit: false
color: root.notificationHighlight ? Kirigami.Theme.positiveTextColor : Kirigami.Theme.backgroundColor
radius: height / 2
}
TextMetrics {
id: notificationCountTextMetrics
text: notificationCountLabel.text
}
}
}

View File

@@ -15,12 +15,6 @@ Delegates.RoundedItemDelegate {
property url source property url source
property alias notificationCount: avatarNotification.notificationCount
property alias notificationHighlight: avatarNotification.notificationHighlight
property alias showNotificationLabel: avatarNotification.showNotificationLabel
signal contextMenuRequested signal contextMenuRequested
signal selected signal selected
@@ -47,8 +41,7 @@ Delegates.RoundedItemDelegate {
} }
} }
contentItem: AvatarNotification { contentItem: KirigamiComponents.Avatar {
id: avatarNotification
source: root.source source: root.source
name: root.text name: root.text
} }

View File

@@ -74,7 +74,7 @@ Loader {
* Some common actions shared between menus * Some common actions shared between menus
*/ */
component ViewSourceAction: Kirigami.Action { component ViewSourceAction: Kirigami.Action {
visible: NeoChatConfig.developerTools visible: Config.developerTools
text: i18n("View Source") text: i18n("View Source")
icon.name: "code-context" icon.name: "code-context"
onTriggered: RoomManager.viewEventSource(root.eventId) onTriggered: RoomManager.viewEventSource(root.eventId)

View File

@@ -101,13 +101,13 @@ DelegateContextMenu {
id: saveAsDialog id: saveAsDialog
FileDialog { FileDialog {
fileMode: FileDialog.SaveFile fileMode: FileDialog.SaveFile
folder: NeoChatConfig.lastSaveDirectory.length > 0 ? NeoChatConfig.lastSaveDirectory : StandardPaths.writableLocation(StandardPaths.DownloadLocation) folder: Config.lastSaveDirectory.length > 0 ? Config.lastSaveDirectory : StandardPaths.writableLocation(StandardPaths.DownloadLocation)
onAccepted: { onAccepted: {
if (!currentFile) { if (!currentFile) {
return; return;
} }
NeoChatConfig.lastSaveDirectory = folder; Config.lastSaveDirectory = folder;
NeoChatConfig.save(); Config.save();
currentRoom.downloadFile(eventId, currentFile); currentRoom.downloadFile(eventId, currentFile);
} }
} }

View File

@@ -117,7 +117,7 @@ QQC2.Control {
} }
}, },
Kirigami.Action { Kirigami.Action {
visible: NeoChatConfig.threads && !root.currentRoom.readOnly visible: Config.threads && !root.currentRoom.readOnly
text: i18n("Reply in Thread") text: i18n("Reply in Thread")
icon.name: "dialog-messages" icon.name: "dialog-messages"
onTriggered: { onTriggered: {

View File

@@ -27,7 +27,10 @@ Kirigami.Page {
let c = LocationHelper.center(LocationHelper.unite(locationsModel.boundingBox, liveLocationsModel.boundingBox)); let c = LocationHelper.center(LocationHelper.unite(locationsModel.boundingBox, liveLocationsModel.boundingBox));
return QtPositioning.coordinate(c.y, c.x); return QtPositioning.coordinate(c.y, c.x);
} }
map.zoomLevel: LocationHelper.zoomToFit(LocationHelper.unite(locationsModel.boundingBox, liveLocationsModel.boundingBox), mapView.width, mapView.height) map.zoomLevel: {
const zoom = LocationHelper.zoomToFit(LocationHelper.unite(locationsModel.boundingBox, liveLocationsModel.boundingBox), mapView.width, mapView.height)
return Math.min(Math.max(zoom, map.minimumZoomLevel), map.maximumZoomLevel);
}
MapItemView { MapItemView {
Component.onCompleted: mapView.map.addMapItemView(this) Component.onCompleted: mapView.map.addMapItemView(this)

View File

@@ -18,7 +18,7 @@ Kirigami.ApplicationWindow {
readonly property HoverLinkIndicator hoverLinkIndicator: linkIndicator readonly property HoverLinkIndicator hoverLinkIndicator: linkIndicator
title: NeoChatConfig.windowTitleFocus ? activeFocusItem + " " + (activeFocusItem ? activeFocusItem.Accessible.name : "") : "NeoChat" title: Config.windowTitleFocus ? activeFocusItem + " " + (activeFocusItem ? activeFocusItem.Accessible.name : "") : "NeoChat"
minimumWidth: Kirigami.Units.gridUnit * 20 minimumWidth: Kirigami.Units.gridUnit * 20
minimumHeight: Kirigami.Units.gridUnit * 15 minimumHeight: Kirigami.Units.gridUnit * 15
@@ -54,16 +54,6 @@ Kirigami.ApplicationWindow {
} }
} }
Connections {
id: pendingOidcConnections
target: Controller.pendingOidcConnection
function onConnected() {
console.warn("loading rooms")
root.load();
pendingOidcConnections.enabled = false;
}
}
Connections { Connections {
target: root.quitAction target: root.quitAction
function onTriggered() { function onTriggered() {
@@ -168,7 +158,7 @@ Kirigami.ApplicationWindow {
// This is a memory for all user initiated actions on the drawer, i.e. clicking the button // This is a memory for all user initiated actions on the drawer, i.e. clicking the button
// It is used to ensure that user choice is remembered when changing pages and expanding and contracting the window width // It is used to ensure that user choice is remembered when changing pages and expanding and contracting the window width
property bool drawerUserState: NeoChatConfig.autoRoomInfoDrawer property bool drawerUserState: Config.autoRoomInfoDrawer
connection: root.connection connection: root.connection
@@ -189,7 +179,7 @@ Kirigami.ApplicationWindow {
modal: (!root.wideScreen || !enabled) modal: (!root.wideScreen || !enabled)
onEnabledChanged: drawerOpen = enabled && !modal onEnabledChanged: drawerOpen = enabled && !modal
onModalChanged: { onModalChanged: {
if (NeoChatConfig.autoRoomInfoDrawer) { if (Config.autoRoomInfoDrawer) {
drawerOpen = !modal && drawerUserState; drawerOpen = !modal && drawerUserState;
dim = false; dim = false;
} }
@@ -204,11 +194,11 @@ Kirigami.ApplicationWindow {
RoomSettingsView.window = root; RoomSettingsView.window = root;
NeoChatSettingsView.window = root; NeoChatSettingsView.window = root;
NeoChatSettingsView.connection = root.connection; NeoChatSettingsView.connection = root.connection;
WindowController.setBlur(pageStack, NeoChatConfig.blur && !NeoChatConfig.compactLayout); WindowController.setBlur(pageStack, Config.blur && !Config.compactLayout);
if (ShareHandler.text && root.connection) { if (ShareHandler.text && root.connection) {
root.handleShare() root.handleShare()
} }
if (NeoChatConfig.minimizeToSystemTrayOnStartup && !Kirigami.Settings.isMobile && Controller.supportSystemTray && NeoChatConfig.systemTray) { if (Config.minimizeToSystemTrayOnStartup && !Kirigami.Settings.isMobile && Controller.supportSystemTray && Config.systemTray) {
restoreWindowGeometryConnections.enabled = true; // To restore window size and position restoreWindowGeometryConnections.enabled = true; // To restore window size and position
} else { } else {
visible = true; visible = true;
@@ -216,21 +206,21 @@ Kirigami.ApplicationWindow {
} }
} }
Connections { Connections {
target: NeoChatConfig target: Config
function onBlurChanged() { function onBlurChanged() {
WindowController.setBlur(pageStack, NeoChatConfig.blur && !NeoChatConfig.compactLayout); WindowController.setBlur(pageStack, Config.blur && !Config.compactLayout);
} }
function onCompactLayoutChanged() { function onCompactLayoutChanged() {
WindowController.setBlur(pageStack, NeoChatConfig.blur && !NeoChatConfig.compactLayout); WindowController.setBlur(pageStack, Config.blur && !Config.compactLayout);
} }
} }
// blur effect // blur effect
color: NeoChatConfig.blur && !NeoChatConfig.compactLayout ? "transparent" : Kirigami.Theme.backgroundColor color: Config.blur && !Config.compactLayout ? "transparent" : Kirigami.Theme.backgroundColor
// we need to apply the translucency effect separately on top of the color // we need to apply the translucency effect separately on top of the color
background: Rectangle { background: Rectangle {
color: NeoChatConfig.blur && !NeoChatConfig.compactLayout ? Qt.rgba(Kirigami.Theme.backgroundColor.r, Kirigami.Theme.backgroundColor.g, Kirigami.Theme.backgroundColor.b, 1 - NeoChatConfig.transparency) : "transparent" color: Config.blur && !Config.compactLayout ? Qt.rgba(Kirigami.Theme.backgroundColor.r, Kirigami.Theme.backgroundColor.g, Kirigami.Theme.backgroundColor.b, 1 - Config.transparency) : "transparent"
} }
Component { Component {

View File

@@ -119,8 +119,8 @@ Components.AlbumMaximizeComponent {
fileMode: Platform.FileDialog.SaveFile fileMode: Platform.FileDialog.SaveFile
folder: root.saveFolder folder: root.saveFolder
onAccepted: { onAccepted: {
NeoChatConfig.lastSaveDirectory = folder; Config.lastSaveDirectory = folder;
NeoChatConfig.save(); Config.save();
if (!currentFile) { if (!currentFile) {
return; return;
} }

View File

@@ -54,17 +54,13 @@ Delegates.RoundedItemDelegate {
contentItem: RowLayout { contentItem: RowLayout {
spacing: Kirigami.Units.largeSpacing spacing: Kirigami.Units.largeSpacing
AvatarNotification { Components.Avatar {
source: root.avatar ? root.connection.makeMediaUrl("mxc://" + root.avatar) : "" source: root.avatar ? root.connection.makeMediaUrl("mxc://" + root.avatar) : ""
name: root.displayName name: root.displayName
visible: NeoChatConfig.showAvatarInRoomDrawer visible: Config.showAvatarInRoomDrawer
implicitHeight: Kirigami.Units.gridUnit + (NeoChatConfig.compactRoomList ? 0 : Kirigami.Units.largeSpacing * 2) implicitHeight: Kirigami.Units.gridUnit + (Config.compactRoomList ? 0 : Kirigami.Units.largeSpacing * 2)
implicitWidth: visible ? implicitHeight : 0 implicitWidth: visible ? implicitHeight : 0
notificationCount: root.contextNotificationCount
notificationHighlight: root.hasHighlightNotifications
showNotificationLabel: root.hasNotifications && root.collapsed
Layout.fillHeight: true Layout.fillHeight: true
Layout.preferredWidth: height Layout.preferredWidth: height
} }
@@ -95,7 +91,7 @@ Delegates.RoundedItemDelegate {
elide: Text.ElideRight elide: Text.ElideRight
font: Kirigami.Theme.smallFont font: Kirigami.Theme.smallFont
opacity: root.hasNotifications ? 0.9 : 0.7 opacity: root.hasNotifications ? 0.9 : 0.7
visible: !NeoChatConfig.compactRoomList && text.length > 0 visible: !Config.compactRoomList && text.length > 0
textFormat: Text.PlainText textFormat: Text.PlainText
Layout.fillWidth: true Layout.fillWidth: true
@@ -141,7 +137,7 @@ Delegates.RoundedItemDelegate {
QQC2.Button { QQC2.Button {
id: configButton id: configButton
visible: root.hovered && !Kirigami.Settings.isMobile && !NeoChatConfig.compactRoomList && !root.collapsed && root.showConfigure visible: root.hovered && !Kirigami.Settings.isMobile && !Config.compactRoomList && !root.collapsed && root.showConfigure
text: i18n("Configure room") text: i18n("Configure room")
display: QQC2.Button.IconOnly display: QQC2.Button.IconOnly
@@ -159,14 +155,14 @@ Delegates.RoundedItemDelegate {
room: root.currentRoom, room: root.currentRoom,
connection: root.connection connection: root.connection
}); });
if (!Kirigami.Settings.isMobile && !NeoChatConfig.compactRoomList) { if (!Kirigami.Settings.isMobile && !Config.compactRoomList) {
configButton.visible = true; configButton.visible = true;
configButton.down = true; configButton.down = true;
} }
menu.closed.connect(function () { menu.closed.connect(function () {
configButton.down = undefined; configButton.down = undefined;
configButton.visible = Qt.binding(() => { configButton.visible = Qt.binding(() => {
return root.hovered && !Kirigami.Settings.isMobile && !NeoChatConfig.compactRoomList; return root.hovered && !Kirigami.Settings.isMobile && !Config.compactRoomList;
}); });
}); });
menu.open(); menu.open();

View File

@@ -24,10 +24,10 @@ Kirigami.OverlayDrawer {
readonly property int maxWidth: Kirigami.Units.gridUnit * 25 readonly property int maxWidth: Kirigami.Units.gridUnit * 25
readonly property int defaultWidth: Kirigami.Units.gridUnit * 20 readonly property int defaultWidth: Kirigami.Units.gridUnit * 20
property int actualWidth: { property int actualWidth: {
if (NeoChatConfig.roomDrawerWidth === -1) { if (Config.roomDrawerWidth === -1) {
return Kirigami.Units.gridUnit * 20; return Kirigami.Units.gridUnit * 20;
} else { } else {
return NeoChatConfig.roomDrawerWidth; return Config.roomDrawerWidth;
} }
} }
@@ -45,8 +45,8 @@ Kirigami.OverlayDrawer {
visible: true visible: true
onPressed: _lastX = mapToGlobal(mouseX, mouseY).x onPressed: _lastX = mapToGlobal(mouseX, mouseY).x
onReleased: { onReleased: {
NeoChatConfig.roomDrawerWidth = root.actualWidth; Config.roomDrawerWidth = root.actualWidth;
NeoChatConfig.save(); Config.save();
} }
property real _lastX: -1 property real _lastX: -1
@@ -55,9 +55,9 @@ Kirigami.OverlayDrawer {
return; return;
} }
if (Qt.application.layoutDirection === Qt.RightToLeft) { if (Qt.application.layoutDirection === Qt.RightToLeft) {
root.actualWidth = Math.min(root.maxWidth, Math.max(root.minWidth, NeoChatConfig.roomDrawerWidth - _lastX + mapToGlobal(mouseX, mouseY).x)); root.actualWidth = Math.min(root.maxWidth, Math.max(root.minWidth, Config.roomDrawerWidth - _lastX + mapToGlobal(mouseX, mouseY).x));
} else { } else {
root.actualWidth = Math.min(root.maxWidth, Math.max(root.minWidth, NeoChatConfig.roomDrawerWidth + _lastX - mapToGlobal(mouseX, mouseY).x)); root.actualWidth = Math.min(root.maxWidth, Math.max(root.minWidth, Config.roomDrawerWidth + _lastX - mapToGlobal(mouseX, mouseY).x));
} }
} }
} }

View File

@@ -1,6 +1,8 @@
// SPDX-FileCopyrightText: 2023 James Graham <james.h.graham@protonmail.com> // SPDX-FileCopyrightText: 2023 James Graham <james.h.graham@protonmail.com>
// SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
pragma ComponentBehavior: Bound
import QtQuick import QtQuick
import QtQuick.Controls as QQC2 import QtQuick.Controls as QQC2
import QtQuick.Layouts import QtQuick.Layouts
@@ -188,11 +190,17 @@ QQC2.ScrollView {
focusSequence: "Ctrl+Shift+F" focusSequence: "Ctrl+Shift+F"
onAccepted: sortedMessageEventModel.filterString = text onAccepted: userFilterModel.filterText = text
} }
} }
model: root.room.isDirectChat() ? 0 : RoomManager.userListModel model: root.room.isDirectChat() ? 0 : userFilterModel
UserFilterModel {
id: userFilterModel
sourceModel: RoomManager.userListModel
allowEmpty: true
}
clip: true clip: true
focus: true focus: true

View File

@@ -27,7 +27,7 @@ Kirigami.Page {
required property NeoChatConnection connection required property NeoChatConnection connection
readonly property bool collapsed: NeoChatConfig.collapsed readonly property bool collapsed: Config.collapsed
signal search signal search
@@ -258,7 +258,7 @@ Kirigami.Page {
if (_private.currentWidth < _private.collapseWidth && _private.currentWidth + (mouse.x - _lastX) >= _private.collapseWidth) { if (_private.currentWidth < _private.collapseWidth && _private.currentWidth + (mouse.x - _lastX) >= _private.collapseWidth) {
// Here we get back directly to a more wide mode. // Here we get back directly to a more wide mode.
_private.currentWidth = _private.defaultWidth; _private.currentWidth = _private.defaultWidth;
NeoChatConfig.collapsed = false; Config.collapsed = false;
} else if (_private.currentWidth >= _private.collapseWidth) { } else if (_private.currentWidth >= _private.collapseWidth) {
// Increase page width // Increase page width
_private.currentWidth = Math.min(_private.defaultWidth, _private.currentWidth + (mouse.x - _lastX)); _private.currentWidth = Math.min(_private.defaultWidth, _private.currentWidth + (mouse.x - _lastX));
@@ -267,7 +267,7 @@ Kirigami.Page {
const tmpWidth = _private.currentWidth - (_lastX - mouse.x); const tmpWidth = _private.currentWidth - (_lastX - mouse.x);
if (tmpWidth < _private.collapseWidth) { if (tmpWidth < _private.collapseWidth) {
_private.currentWidth = Qt.binding(() => _private.collapsedSize); _private.currentWidth = Qt.binding(() => _private.collapsedSize);
NeoChatConfig.collapsed = true; Config.collapsed = true;
} else { } else {
_private.currentWidth = tmpWidth; _private.currentWidth = tmpWidth;
} }
@@ -324,9 +324,9 @@ Kirigami.Page {
*/ */
QtObject { QtObject {
id: _private id: _private
property int currentWidth: NeoChatConfig.collapsed ? collapsedSize : defaultWidth property int currentWidth: Config.collapsed ? collapsedSize : defaultWidth
readonly property int defaultWidth: Kirigami.Units.gridUnit * 17 readonly property int defaultWidth: Kirigami.Units.gridUnit * 17
readonly property int collapseWidth: Kirigami.Units.gridUnit * 10 readonly property int collapseWidth: Kirigami.Units.gridUnit * 10
readonly property int collapsedSize: Kirigami.Units.gridUnit + (NeoChatConfig.compactRoomList ? 0 : Kirigami.Units.largeSpacing * 2) + Kirigami.Units.largeSpacing * 2 + (scrollView.QQC2.ScrollBar.vertical.visible ? scrollView.QQC2.ScrollBar.vertical.width : 0) readonly property int collapsedSize: Kirigami.Units.gridUnit + (Config.compactRoomList ? 0 : Kirigami.Units.largeSpacing * 2) + Kirigami.Units.largeSpacing * 2 + (scrollView.QQC2.ScrollBar.vertical.visible ? scrollView.QQC2.ScrollBar.vertical.width : 0)
} }
} }

View File

@@ -155,7 +155,6 @@ Kirigami.Page {
sourceComponent: Kirigami.PlaceholderMessage { sourceComponent: Kirigami.PlaceholderMessage {
icon.name: "org.kde.neochat" icon.name: "org.kde.neochat"
text: i18n("Welcome to NeoChat") text: i18n("Welcome to NeoChat")
explanation: i18n("Select or join a room to get started")
} }
} }
@@ -170,7 +169,7 @@ Kirigami.Page {
background: Rectangle { background: Rectangle {
Kirigami.Theme.colorSet: Kirigami.Theme.View Kirigami.Theme.colorSet: Kirigami.Theme.View
Kirigami.Theme.inherit: false Kirigami.Theme.inherit: false
color: NeoChatConfig.compactLayout ? Kirigami.Theme.backgroundColor : "transparent" color: Config.compactLayout ? Kirigami.Theme.backgroundColor : "transparent"
} }
footer: Loader { footer: Loader {

View File

@@ -86,34 +86,6 @@ QQC2.Control {
text: i18n("Home") text: i18n("Home")
contentItem: Kirigami.Icon { contentItem: Kirigami.Icon {
source: "user-home-symbolic" source: "user-home-symbolic"
QQC2.Label {
id: homeNotificationCountLabel
anchors.top: parent.top
anchors.right: parent.right
anchors.topMargin: -Kirigami.Units.smallSpacing
anchors.rightMargin: -Kirigami.Units.smallSpacing
z: 1
width: Math.max(homeNotificationCountTextMetrics.advanceWidth + Kirigami.Units.smallSpacing * 2, height)
height: Kirigami.Units.iconSizes.smallMedium
text: root.connection.homeNotifications > 0 ? root.connection.homeNotifications : ""
visible: root.connection.homeNotifications > 0 && (RoomManager.currentSpace.length > 0 || root.showDirectChats === true)
color: Kirigami.Theme.textColor
horizontalAlignment: Text.AlignHCenter
background: Rectangle {
visible: true
Kirigami.Theme.colorSet: Kirigami.Theme.Button
Kirigami.Theme.inherit: false
color: root.connection.homeHaveHighlightNotifications ? Kirigami.Theme.positiveTextColor : Kirigami.Theme.backgroundColor
radius: height / 2
}
TextMetrics {
id: homeNotificationCountTextMetrics
text: homeNotificationCountLabel.text
}
}
} }
activeFocusOnTab: true activeFocusOnTab: true
@@ -123,6 +95,33 @@ QQC2.Control {
RoomManager.currentSpace = ""; RoomManager.currentSpace = "";
root.selectionChanged(); root.selectionChanged();
} }
QQC2.Label {
id: homeNotificationCountLabel
anchors.top: parent.top
anchors.right: parent.right
anchors.rightMargin: Kirigami.Units.smallSpacing / 2
z: 1
width: Math.max(homeNotificationCountTextMetrics.advanceWidth + Kirigami.Units.smallSpacing * 2, height)
height: Kirigami.Units.iconSizes.smallMedium
text: root.connection.homeNotifications > 0 ? root.connection.homeNotifications : ""
visible: root.connection.homeNotifications > 0 && (RoomManager.currentSpace.length > 0 || root.showDirectChats === true)
color: Kirigami.Theme.textColor
horizontalAlignment: Text.AlignHCenter
background: Rectangle {
visible: true
Kirigami.Theme.colorSet: Kirigami.Theme.Button
Kirigami.Theme.inherit: false
color: root.connection.homeHaveHighlightNotifications ? Kirigami.Theme.positiveTextColor : Kirigami.Theme.backgroundColor
radius: height / 2
}
TextMetrics {
id: homeNotificationCountTextMetrics
text: homeNotificationCountLabel.text
}
}
} }
AvatarTabButton { AvatarTabButton {
id: directChatButton id: directChatButton
@@ -135,34 +134,6 @@ QQC2.Control {
text: i18nc("@button View all one-on-one chats with your friends.", "Friends") text: i18nc("@button View all one-on-one chats with your friends.", "Friends")
contentItem: Kirigami.Icon { contentItem: Kirigami.Icon {
source: "system-users" source: "system-users"
QQC2.Label {
id: directChatNotificationCountLabel
anchors.top: parent.top
anchors.right: parent.right
anchors.topMargin: -Kirigami.Units.smallSpacing
anchors.rightMargin: -Kirigami.Units.smallSpacing
z: 1
width: Math.max(directChatNotificationCountTextMetrics.advanceWidth + Kirigami.Units.smallSpacing * 2, height)
height: Kirigami.Units.iconSizes.smallMedium
text: root.connection.directChatNotifications > 0 ? root.connection.directChatNotifications : ""
visible: (root.connection.directChatNotifications > 0 || root.connection.directChatInvites) && RoomManager.currentSpace !== "DM"
color: Kirigami.Theme.textColor
horizontalAlignment: Text.AlignHCenter
background: Rectangle {
visible: true
Kirigami.Theme.colorSet: Kirigami.Theme.Button
Kirigami.Theme.inherit: false
color: root.connection.directChatsHaveHighlightNotifications ? Kirigami.Theme.positiveTextColor : Kirigami.Theme.backgroundColor
radius: height / 2
}
TextMetrics {
id: directChatNotificationCountTextMetrics
text: directChatNotificationCountLabel.text
}
}
} }
activeFocusOnTab: true activeFocusOnTab: true
@@ -172,6 +143,33 @@ QQC2.Control {
RoomManager.currentSpace = "DM"; RoomManager.currentSpace = "DM";
root.selectionChanged(); root.selectionChanged();
} }
QQC2.Label {
id: directChatNotificationCountLabel
anchors.top: parent.top
anchors.right: parent.right
anchors.rightMargin: Kirigami.Units.smallSpacing / 2
z: 1
width: Math.max(directChatNotificationCountTextMetrics.advanceWidth + Kirigami.Units.smallSpacing * 2, height)
height: Kirigami.Units.iconSizes.smallMedium
text: root.connection.directChatNotifications > 0 ? root.connection.directChatNotifications : ""
visible: (root.connection.directChatNotifications > 0 || root.connection.directChatInvites) && RoomManager.currentSpace !== "DM"
color: Kirigami.Theme.textColor
horizontalAlignment: Text.AlignHCenter
background: Rectangle {
visible: true
Kirigami.Theme.colorSet: Kirigami.Theme.Button
Kirigami.Theme.inherit: false
color: root.connection.directChatsHaveHighlightNotifications ? Kirigami.Theme.positiveTextColor : Kirigami.Theme.backgroundColor
radius: height / 2
}
TextMetrics {
id: directChatNotificationCountTextMetrics
text: directChatNotificationCountLabel.text
}
}
} }
Repeater { Repeater {
@@ -192,10 +190,6 @@ QQC2.Control {
text: displayName text: displayName
source: avatar ? root.connection.makeMediaUrl("mxc://" + avatar) : "" source: avatar ? root.connection.makeMediaUrl("mxc://" + avatar) : ""
notificationCount: spaceDelegate.currentRoom.childrenNotificationCount
notificationHighlight: spaceDelegate.currentRoom.childrenHaveHighlightNotifications
showNotificationLabel: spaceDelegate.currentRoom.childrenNotificationCount > 0 && RoomManager.currentSpace != spaceDelegate.roomId
activeFocusOnTab: true activeFocusOnTab: true
onSelected: { onSelected: {
@@ -204,6 +198,34 @@ QQC2.Control {
} }
checked: RoomManager.currentSpace === roomId checked: RoomManager.currentSpace === roomId
onContextMenuRequested: root.createContextMenu(currentRoom) onContextMenuRequested: root.createContextMenu(currentRoom)
QQC2.Label {
id: notificationCountLabel
anchors.top: parent.top
anchors.right: parent.right
anchors.rightMargin: Kirigami.Units.smallSpacing / 2
z: 1
width: Math.max(notificationCountTextMetrics.advanceWidth + Kirigami.Units.smallSpacing * 2, height)
height: Kirigami.Units.iconSizes.smallMedium
text: spaceDelegate.currentRoom.childrenNotificationCount > 0 ? spaceDelegate.currentRoom.childrenNotificationCount : ""
visible: spaceDelegate.currentRoom.childrenNotificationCount > 0 && RoomManager.currentSpace != spaceDelegate.roomId
color: Kirigami.Theme.textColor
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
background: Rectangle {
visible: true
Kirigami.Theme.colorSet: Kirigami.Theme.Button
Kirigami.Theme.inherit: false
color: spaceDelegate.currentRoom.childrenHaveHighlightNotifications ? Kirigami.Theme.positiveTextColor : Kirigami.Theme.backgroundColor
radius: height / 2
}
TextMetrics {
id: notificationCountTextMetrics
text: notificationCountLabel.text
}
}
} }
} }

View File

@@ -143,12 +143,12 @@ QQC2.ScrollView {
footer: Item { footer: Item {
z: 3 z: 3
width: root.width width: root.width
visible: !NeoChatConfig.blur visible: !Config.blur
SectionDelegate { SectionDelegate {
id: sectionDelegate id: sectionDelegate
anchors.leftMargin: state === "alignLeft" ? Kirigami.Units.largeSpacing : 0 anchors.leftMargin: state === "alignLeft" ? Kirigami.Units.largeSpacing : 0
state: NeoChatConfig.compactLayout ? "alignLeft" : "alignCenter" state: Config.compactLayout ? "alignLeft" : "alignCenter"
// Align left when in compact mode and center when using bubbles // Align left when in compact mode and center when using bubbles
states: [ states: [
State { State {
@@ -171,7 +171,7 @@ QQC2.ScrollView {
width: messageListView.sectionBannerItem ? messageListView.sectionBannerItem.contentItem.width : 0 width: messageListView.sectionBannerItem ? messageListView.sectionBannerItem.contentItem.width : 0
labelText: messageListView.sectionBannerItem ? messageListView.sectionBannerItem.ListView.section : "" labelText: messageListView.sectionBannerItem ? messageListView.sectionBannerItem.ListView.section : ""
colorSet: NeoChatConfig.compactLayout ? Kirigami.Theme.View : Kirigami.Theme.Window colorSet: Config.compactLayout ? Kirigami.Theme.View : Kirigami.Theme.Window
} }
} }
footerPositioning: ListView.OverlayHeader footerPositioning: ListView.OverlayHeader
@@ -183,12 +183,17 @@ QQC2.ScrollView {
KirigamiComponents.FloatingButton { KirigamiComponents.FloatingButton {
id: goReadMarkerFab id: goReadMarkerFab
anchors.right: parent.right anchors {
anchors.top: parent.top right: parent.right
anchors.topMargin: Kirigami.Units.largeSpacing top: parent.top
anchors.rightMargin: Kirigami.Units.largeSpacing topMargin: Kirigami.Units.largeSpacing
implicitWidth: Kirigami.Units.gridUnit * 2 rightMargin: Kirigami.Units.largeSpacing
implicitHeight: Kirigami.Units.gridUnit * 2 }
implicitWidth: Kirigami.Settings.hasTransientTouchInput ? Kirigami.Units.gridUnit * 3 : Kirigami.Units.gridUnit * 2
implicitHeight: Kirigami.Settings.hasTransientTouchInput ? Kirigami.Units.gridUnit * 3 : Kirigami.Units.gridUnit * 2
padding: Kirigami.Units.largeSpacing
z: 2 z: 2
visible: (root.currentRoom?.hasUnreadMessages ?? false) visible: (root.currentRoom?.hasUnreadMessages ?? false)
@@ -215,12 +220,16 @@ QQC2.ScrollView {
} }
KirigamiComponents.FloatingButton { KirigamiComponents.FloatingButton {
id: goMarkAsReadFab id: goMarkAsReadFab
anchors.right: parent.right anchors {
anchors.bottom: parent.bottom right: parent.right
anchors.bottomMargin: Kirigami.Units.largeSpacing bottom: parent.bottom
anchors.rightMargin: Kirigami.Units.largeSpacing bottomMargin: Kirigami.Units.largeSpacing
implicitWidth: Kirigami.Units.gridUnit * 2 rightMargin: Kirigami.Units.largeSpacing
implicitHeight: Kirigami.Units.gridUnit * 2 }
implicitWidth: Kirigami.Settings.hasTransientTouchInput ? Kirigami.Units.gridUnit * 3 : Kirigami.Units.gridUnit * 2
implicitHeight: Kirigami.Settings.hasTransientTouchInput ? Kirigami.Units.gridUnit * 3 : Kirigami.Units.gridUnit * 2
padding: Kirigami.Units.largeSpacing
z: 2 z: 2
visible: !messageListView.atYEnd visible: !messageListView.atYEnd

View File

@@ -106,9 +106,7 @@ void Registration::registerAccount()
account.setHomeserver(connection->homeserver()); account.setHomeserver(connection->homeserver());
account.setDeviceId(connection->deviceId()); account.setDeviceId(connection->deviceId());
account.setDeviceName(displayName); account.setDeviceName(displayName);
if (!Controller::instance().saveAccessTokenToKeyChain(account.userId(), connection->accessToken())) { Controller::instance().saveAccessTokenToKeyChain(account.userId(), connection->accessToken());
qWarning() << "Couldn't save access token";
}
account.sync(); account.sync();
Controller::instance().addConnection(connection); Controller::instance().addConnection(connection);
Controller::instance().setActiveConnection(connection); Controller::instance().setActiveConnection(connection);

View File

@@ -16,6 +16,7 @@
#include "urlhelper.h" #include "urlhelper.h"
#include <KLocalizedString> #include <KLocalizedString>
#include <KRuntimePlatform>
#include <QDesktopServices> #include <QDesktopServices>
#include <QQuickTextDocument> #include <QQuickTextDocument>
#include <QStandardPaths> #include <QStandardPaths>
@@ -239,6 +240,12 @@ void RoomManager::loadInitialRoom()
resolveResource(m_arg); resolveResource(m_arg);
} }
const auto runtimePlatform = KRuntimePlatform::runtimePlatform();
if (runtimePlatform.contains(QStringLiteral("phone")) || runtimePlatform.contains(QStringLiteral("handset"))) {
// We don't want to open a room on startup on mobile
return;
}
if (m_currentRoom) { if (m_currentRoom) {
// we opened a room with the arg parsing already // we opened a room with the arg parsing already
return; return;
@@ -350,7 +357,11 @@ void RoomManager::joinRoom(Quotient::Connection *account, const QString &roomAli
void RoomManager::knockRoom(NeoChatConnection *account, const QString &roomAliasOrId, const QString &reason, const QStringList &viaServers) void RoomManager::knockRoom(NeoChatConnection *account, const QString &roomAliasOrId, const QString &reason, const QStringList &viaServers)
{ {
#if Quotient_VERSION_MINOR > 8
auto job = account->callApi<KnockRoomJob>(roomAliasOrId, viaServers, viaServers, reason);
#else
auto job = account->callApi<KnockRoomJob>(roomAliasOrId, viaServers, reason); auto job = account->callApi<KnockRoomJob>(roomAliasOrId, viaServers, reason);
#endif
// Upon completion, ensure a room object is created in case it hasn't come // Upon completion, ensure a room object is created in case it hasn't come
// with a sync yet. If the room object is not there, provideRoom() will // with a sync yet. If the room object is not there, provideRoom() will
// create it in Join state. finished() is used here instead of success() // create it in Join state. finished() is used here instead of success()

View File

@@ -98,25 +98,23 @@ FormCard.FormCardPage {
} }
FormCard.FormHeader { FormCard.FormHeader {
title: i18n("User Information") title: i18n("User information")
} }
FormCard.FormCard { FormCard.FormCard {
FormCard.FormTextFieldDelegate { FormCard.FormTextFieldDelegate {
id: name id: name
label: i18n("Display Name:") label: i18n("Name:")
text: root.connection ? root.connection.localUser.displayName : "" text: root.connection ? root.connection.localUser.displayName : ""
} }
FormCard.FormDelegateSeparator {} FormCard.FormDelegateSeparator {}
FormCard.FormTextFieldDelegate { FormCard.FormTextFieldDelegate {
id: accountLabel id: accountLabel
label: i18n("Label:") label: i18n("Label:")
placeholderText: i18n("Work")
text: root.connection ? root.connection.label : "" text: root.connection ? root.connection.label : ""
} }
FormCard.FormDelegateSeparator {} FormCard.FormDelegateSeparator {}
FormCard.FormButtonDelegate { FormCard.FormButtonDelegate {
text: i18nc("@action:button", "Show QR Code") text: i18nc("@action:button", "QR code for account")
icon.name: "view-barcode-qr-symbolic"
onClicked: { onClicked: {
let qrMax = Qt.createComponent('org.kde.neochat', 'QrCodeMaximizeComponent').createObject(QQC2.Overlay.overlay, { let qrMax = Qt.createComponent('org.kde.neochat', 'QrCodeMaximizeComponent').createObject(QQC2.Overlay.overlay, {
text: "https://matrix.to/#/" + root.connection.localUser.id, text: "https://matrix.to/#/" + root.connection.localUser.id,
@@ -133,7 +131,6 @@ FormCard.FormCardPage {
FormCard.FormDelegateSeparator {} FormCard.FormDelegateSeparator {}
FormCard.FormButtonDelegate { FormCard.FormButtonDelegate {
text: i18n("Save") text: i18n("Save")
icon.name: "document-save-symbolic"
onClicked: { onClicked: {
if (!root.connection.setAvatar(avatar.source)) { if (!root.connection.setAvatar(avatar.source)) {
showPassiveNotification("The Avatar could not be set"); showPassiveNotification("The Avatar could not be set");
@@ -189,7 +186,6 @@ FormCard.FormCardPage {
FormCard.FormDelegateSeparator {} FormCard.FormDelegateSeparator {}
FormCard.FormButtonDelegate { FormCard.FormButtonDelegate {
text: i18n("Save") text: i18n("Save")
icon.name: "document-save-symbolic"
enabled: currentPassword.text.length > 0 && newPassword.text.length > 0 && confirmPassword.text.length > 0 enabled: currentPassword.text.length > 0 && newPassword.text.length > 0 && confirmPassword.text.length > 0
onClicked: { onClicked: {
if (newPassword.text === confirmPassword.text) { if (newPassword.text === confirmPassword.text) {
@@ -206,7 +202,7 @@ FormCard.FormCardPage {
medium: "email" medium: "email"
} }
ThreePIdCard { ThreePIdCard {
visible: NeoChatConfig.phone3PId visible: Config.phone3PId
connection: root.connection connection: root.connection
title: i18n("Phone Numbers") title: i18n("Phone Numbers")
medium: "msisdn" medium: "msisdn"
@@ -253,7 +249,6 @@ FormCard.FormCardPage {
FormCard.FormButtonDelegate { FormCard.FormButtonDelegate {
id: deactivateAccountButton id: deactivateAccountButton
text: i18n("Deactivate Account") text: i18n("Deactivate Account")
icon.name: "trash-empty-symbolic"
onClicked: { onClicked: {
const component = Qt.createComponent('org.kde.neochat', 'ConfirmDeactivateAccountDialog'); const component = Qt.createComponent('org.kde.neochat', 'ConfirmDeactivateAccountDialog');
const dialog = component.createObject(QQC2.ApplicationWindow.window, { const dialog = component.createObject(QQC2.ApplicationWindow.window, {

View File

@@ -41,8 +41,8 @@ FormCard.FormCardPage {
KirigamiComponents.Avatar { KirigamiComponents.Avatar {
color: "#4a5bcc" color: "#4a5bcc"
Layout.alignment: Qt.AlignTop Layout.alignment: Qt.AlignTop
visible: NeoChatConfig.showAvatarInTimeline visible: Config.showAvatarInTimeline
Layout.preferredWidth: NeoChatConfig.showAvatarInTimeline ? Kirigami.Units.largeSpacing * 2 : 0 Layout.preferredWidth: Config.showAvatarInTimeline ? Kirigami.Units.largeSpacing * 2 : 0
Layout.preferredHeight: Kirigami.Units.largeSpacing * 2 Layout.preferredHeight: Kirigami.Units.largeSpacing * 2
} }
QQC2.Control { QQC2.Control {
@@ -78,8 +78,8 @@ FormCard.FormCardPage {
KirigamiComponents.Avatar { KirigamiComponents.Avatar {
color: "#9f244b" color: "#9f244b"
Layout.alignment: Qt.AlignTop Layout.alignment: Qt.AlignTop
visible: NeoChatConfig.showAvatarInTimeline visible: Config.showAvatarInTimeline
Layout.preferredWidth: NeoChatConfig.showAvatarInTimeline ? Kirigami.Units.largeSpacing * 2 : 0 Layout.preferredWidth: Config.showAvatarInTimeline ? Kirigami.Units.largeSpacing * 2 : 0
Layout.preferredHeight: Kirigami.Units.largeSpacing * 2 Layout.preferredHeight: Kirigami.Units.largeSpacing * 2
} }
QQC2.Control { QQC2.Control {
@@ -113,13 +113,13 @@ FormCard.FormCardPage {
] ]
text: i18n("Bubbles") text: i18n("Bubbles")
checked: !NeoChatConfig.compactLayout checked: !Config.compactLayout
QQC2.ButtonGroup.group: themeGroup QQC2.ButtonGroup.group: themeGroup
enabled: !NeoChatConfig.isCompactLayoutImmutable enabled: !Config.isCompactLayoutImmutable
onToggled: { onToggled: {
NeoChatConfig.compactLayout = !checked; Config.compactLayout = !checked;
NeoChatConfig.save(); Config.save();
} }
} }
ThemeRadioButton { ThemeRadioButton {
@@ -131,8 +131,8 @@ FormCard.FormCardPage {
KirigamiComponents.Avatar { KirigamiComponents.Avatar {
color: "#4a5bcc" color: "#4a5bcc"
Layout.alignment: Qt.AlignTop Layout.alignment: Qt.AlignTop
visible: NeoChatConfig.showAvatarInTimeline visible: Config.showAvatarInTimeline
Layout.preferredWidth: NeoChatConfig.showAvatarInTimeline ? Kirigami.Units.largeSpacing * 2 : 0 Layout.preferredWidth: Config.showAvatarInTimeline ? Kirigami.Units.largeSpacing * 2 : 0
Layout.preferredHeight: Kirigami.Units.largeSpacing * 2 Layout.preferredHeight: Kirigami.Units.largeSpacing * 2
} }
ColumnLayout { ColumnLayout {
@@ -158,8 +158,8 @@ FormCard.FormCardPage {
KirigamiComponents.Avatar { KirigamiComponents.Avatar {
color: "#9f244b" color: "#9f244b"
Layout.alignment: Qt.AlignTop Layout.alignment: Qt.AlignTop
visible: NeoChatConfig.showAvatarInTimeline visible: Config.showAvatarInTimeline
Layout.preferredWidth: NeoChatConfig.showAvatarInTimeline ? Kirigami.Units.largeSpacing * 2 : 0 Layout.preferredWidth: Config.showAvatarInTimeline ? Kirigami.Units.largeSpacing * 2 : 0
Layout.preferredHeight: Kirigami.Units.largeSpacing * 2 Layout.preferredHeight: Kirigami.Units.largeSpacing * 2
} }
ColumnLayout { ColumnLayout {
@@ -182,13 +182,13 @@ FormCard.FormCardPage {
} }
] ]
text: i18n("Compact") text: i18n("Compact")
checked: NeoChatConfig.compactLayout checked: Config.compactLayout
QQC2.ButtonGroup.group: themeGroup QQC2.ButtonGroup.group: themeGroup
enabled: !NeoChatConfig.isCompactLayoutImmutable enabled: !Config.isCompactLayoutImmutable
onToggled: { onToggled: {
NeoChatConfig.compactLayout = checked; Config.compactLayout = checked;
NeoChatConfig.save(); Config.save();
} }
} }
Item { Item {
@@ -204,10 +204,10 @@ FormCard.FormCardPage {
FormCard.FormCheckDelegate { FormCard.FormCheckDelegate {
id: compactRoomListDelegate id: compactRoomListDelegate
text: i18n("Use compact room list") text: i18n("Use compact room list")
checked: NeoChatConfig.compactRoomList checked: Config.compactRoomList
onToggled: { onToggled: {
NeoChatConfig.compactRoomList = checked; Config.compactRoomList = checked;
NeoChatConfig.save(); Config.save();
} }
} }
@@ -231,11 +231,11 @@ FormCard.FormCardPage {
id: hasWindowSystemDelegate id: hasWindowSystemDelegate
visible: WindowController.hasWindowSystem visible: WindowController.hasWindowSystem
text: i18n("Use transparent chat page") text: i18n("Use transparent chat page")
enabled: !NeoChatConfig.compactLayout && !NeoChatConfig.isBlurImmutable enabled: !Config.compactLayout && !Config.isBlurImmutable
checked: NeoChatConfig.blur checked: Config.blur
onToggled: { onToggled: {
NeoChatConfig.blur = checked; Config.blur = checked;
NeoChatConfig.save(); Config.save();
} }
} }
@@ -246,8 +246,8 @@ FormCard.FormCardPage {
FormCard.AbstractFormDelegate { FormCard.AbstractFormDelegate {
id: transparencyDelegate id: transparencyDelegate
visible: WindowController.hasWindowSystem && NeoChatConfig.blur visible: WindowController.hasWindowSystem && Config.blur
enabled: !NeoChatConfig.isTransparancyImmutable enabled: !Config.isTransparancyImmutable
background: Item {} background: Item {}
contentItem: ColumnLayout { contentItem: ColumnLayout {
QQC2.Label { QQC2.Label {
@@ -255,14 +255,14 @@ FormCard.FormCardPage {
Layout.fillWidth: true Layout.fillWidth: true
} }
QQC2.Slider { QQC2.Slider {
enabled: !NeoChatConfig.compactLayout && NeoChatConfig.blur enabled: !Config.compactLayout && Config.blur
from: 0 from: 0
to: 1 to: 1
stepSize: 0.05 stepSize: 0.05
value: NeoChatConfig.transparency value: Config.transparency
onMoved: { onMoved: {
NeoChatConfig.transparency = value; Config.transparency = value;
NeoChatConfig.save(); Config.save();
} }
Layout.fillWidth: true Layout.fillWidth: true
@@ -273,7 +273,7 @@ FormCard.FormCardPage {
QQC2.ToolTip.text: i18n("Only enabled if the transparent chat page is enabled.") QQC2.ToolTip.text: i18n("Only enabled if the transparent chat page is enabled.")
} }
QQC2.Label { QQC2.Label {
text: Math.round(NeoChatConfig.transparency * 100) + "%" text: Math.round(Config.transparency * 100) + "%"
Layout.fillWidth: true Layout.fillWidth: true
} }
} }
@@ -288,11 +288,11 @@ FormCard.FormCardPage {
FormCard.FormCheckDelegate { FormCard.FormCheckDelegate {
id: showLocalMessagesOnRightDelegate id: showLocalMessagesOnRightDelegate
text: i18n("Show your messages on the right") text: i18n("Show your messages on the right")
checked: NeoChatConfig.showLocalMessagesOnRight checked: Config.showLocalMessagesOnRight
enabled: !NeoChatConfig.isShowLocalMessagesOnRightImmutable && !NeoChatConfig.compactLayout enabled: !Config.isShowLocalMessagesOnRightImmutable && !Config.compactLayout
onToggled: { onToggled: {
NeoChatConfig.showLocalMessagesOnRight = checked; Config.showLocalMessagesOnRight = checked;
NeoChatConfig.save(); Config.save();
} }
} }
@@ -304,10 +304,10 @@ FormCard.FormCardPage {
FormCard.FormCheckDelegate { FormCard.FormCheckDelegate {
id: showLinkPreviewDelegate id: showLinkPreviewDelegate
text: i18n("Show links preview in the chat messages") text: i18n("Show links preview in the chat messages")
checked: NeoChatConfig.showLinkPreview checked: Config.showLinkPreview
onToggled: { onToggled: {
NeoChatConfig.showLinkPreview = checked; Config.showLinkPreview = checked;
NeoChatConfig.save(); Config.save();
} }
} }
} }
@@ -318,21 +318,21 @@ FormCard.FormCardPage {
FormCard.FormCard { FormCard.FormCard {
FormCard.FormCheckDelegate { FormCard.FormCheckDelegate {
text: i18n("In chat") text: i18n("In chat")
checked: NeoChatConfig.showAvatarInTimeline checked: Config.showAvatarInTimeline
onToggled: { onToggled: {
NeoChatConfig.showAvatarInTimeline = checked; Config.showAvatarInTimeline = checked;
NeoChatConfig.save(); Config.save();
} }
enabled: !NeoChatConfig.isShowAvatarInTimelineImmutable enabled: !Config.isShowAvatarInTimelineImmutable
} }
FormCard.FormCheckDelegate { FormCard.FormCheckDelegate {
text: i18n("In sidebar") text: i18n("In sidebar")
checked: NeoChatConfig.showAvatarInRoomDrawer checked: Config.showAvatarInRoomDrawer
enabled: !NeoChatConfig.isShowAvatarInRoomDrawerImmutable enabled: !Config.isShowAvatarInRoomDrawerImmutable
onToggled: { onToggled: {
NeoChatConfig.showAvatarInRoomDrawer = checked; Config.showAvatarInRoomDrawer = checked;
NeoChatConfig.save(); Config.save();
} }
} }
} }

View File

@@ -40,6 +40,4 @@ ecm_add_qml_module(settings GENERATE_PLUGIN_SOURCE
PasswordSheet.qml PasswordSheet.qml
ThemeRadioButton.qml ThemeRadioButton.qml
ThreePIdCard.qml ThreePIdCard.qml
ImportKeysDialog.qml
ExportKeysDialog.qml
) )

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