From 29a81bbe85ca1ca1c4c54534fe94e9d477aef22c Mon Sep 17 00:00:00 2001 From: Aaron Raimist Date: Tue, 10 Nov 2020 15:04:01 -0600 Subject: [PATCH 001/154] Warn when you attempt to leave room that you are the only member of Signed-off-by: Aaron Raimist --- src/components/structures/MatrixChat.tsx | 17 ++++++++++++++++- src/i18n/strings/en_EN.json | 1 + 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 22cd73eff7..43e1798c6e 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -1056,8 +1056,21 @@ export default class MatrixChat extends React.PureComponent { private leaveRoomWarnings(roomId: string) { const roomToLeave = MatrixClientPeg.get().getRoom(roomId); // Show a warning if there are additional complications. - const joinRules = roomToLeave.currentState.getStateEvents('m.room.join_rules', ''); const warnings = []; + + const memberCount = roomToLeave.currentState.getJoinedMemberCount(); + if (memberCount === 1) { + warnings.push( + + {' '/* Whitespace, otherwise the sentences get smashed together */ } + { _t("You are the only member of this room. This room will become unjoinable if you leave.") } + + ); + + return warnings; + } + + const joinRules = roomToLeave.currentState.getStateEvents('m.room.join_rules', ''); if (joinRules) { const rule = joinRules.getContent().join_rule; if (rule !== "public") { @@ -1076,6 +1089,7 @@ export default class MatrixChat extends React.PureComponent { const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); const roomToLeave = MatrixClientPeg.get().getRoom(roomId); const warnings = this.leaveRoomWarnings(roomId); + const hasWarnings = warnings.length > 0; Modal.createTrackedDialog('Leave room', '', QuestionDialog, { title: _t("Leave room"), @@ -1086,6 +1100,7 @@ export default class MatrixChat extends React.PureComponent { ), button: _t("Leave"), + danger: hasWarnings, onFinished: (shouldLeave) => { if (shouldLeave) { const d = leaveRoomBehaviour(roomId); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 78340447f3..b412db5ca0 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2317,6 +2317,7 @@ "Cannot create rooms in this community": "Cannot create rooms in this community", "You do not have permission to create rooms in this community.": "You do not have permission to create rooms in this community.", "This room is not public. You will not be able to rejoin without an invite.": "This room is not public. You will not be able to rejoin without an invite.", + "You are the only member of this room. This room will become unjoinable if you leave.": "You are the only member of this room. This room will become unjoinable if you leave.", "Are you sure you want to leave the room '%(roomName)s'?": "Are you sure you want to leave the room '%(roomName)s'?", "Failed to forget room %(errCode)s": "Failed to forget room %(errCode)s", "Signed Out": "Signed Out", From 80c4d54ccc56396e15a4979de84d9d18c83a70ad Mon Sep 17 00:00:00 2001 From: Aaron Raimist Date: Wed, 18 Nov 2020 13:54:49 -0600 Subject: [PATCH 002/154] Fix lint Signed-off-by: Aaron Raimist --- src/components/structures/MatrixChat.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 43e1798c6e..17c21a2016 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -1060,12 +1060,12 @@ export default class MatrixChat extends React.PureComponent { const memberCount = roomToLeave.currentState.getJoinedMemberCount(); if (memberCount === 1) { - warnings.push( + warnings.push(( {' '/* Whitespace, otherwise the sentences get smashed together */ } { _t("You are the only member of this room. This room will become unjoinable if you leave.") } - ); + )); return warnings; } From ef3d87f8e8b371d058c535bd348ae0f4617fb02e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 25 Mar 2021 16:15:41 +0100 Subject: [PATCH 003/154] First implementation of context switching MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/structures/MatrixChat.tsx | 10 +++++++++- src/stores/SpaceStore.tsx | 16 ++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 689561fd60..9a4e83828c 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -79,7 +79,7 @@ import { CommunityPrototypeStore } from "../../stores/CommunityPrototypeStore"; import DialPadModal from "../views/voip/DialPadModal"; import { showToast as showMobileGuideToast } from '../../toasts/MobileGuideToast'; import { shouldUseLoginForWelcome } from "../../utils/pages"; -import SpaceStore from "../../stores/SpaceStore"; +import SpaceStore, {LAST_VIEWED_ROOMS, LAST_VIEWED_ROOMS_HOME} from "../../stores/SpaceStore"; import SpaceRoomDirectory from "./SpaceRoomDirectory"; import {replaceableComponent} from "../../utils/replaceableComponent"; import RoomListStore from "../../stores/room-list/RoomListStore"; @@ -875,6 +875,14 @@ export default class MatrixChat extends React.PureComponent { private viewRoom(roomInfo: IRoomInfo) { this.focusComposer = true; + // persist last viewed room from a space + const activeSpace = SpaceStore.instance.activeSpace; + const activeSpaceId = activeSpace?.roomId || LAST_VIEWED_ROOMS_HOME; + const lastViewedRooms = JSON.parse(window.localStorage.getItem(LAST_VIEWED_ROOMS)) || {}; + + lastViewedRooms[activeSpaceId] = roomInfo.room_id; + window.localStorage.setItem(LAST_VIEWED_ROOMS, JSON.stringify(lastViewedRooms)); + if (roomInfo.room_alias) { console.log( `Switching to room alias ${roomInfo.room_alias} at event ` + diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index bcf95a82be..20223cb8a6 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -41,6 +41,10 @@ type SpaceKey = string | symbol; interface IState {} const ACTIVE_SPACE_LS_KEY = "mx_active_space"; +export const LAST_VIEWED_ROOMS = "mx_last_viewed_rooms"; + +// We can't use HOME_SPACE here because JSON.stringify() will ignore any Symbols +export const LAST_VIEWED_ROOMS_HOME = "home_space"; export const HOME_SPACE = Symbol("home-space"); export const SUGGESTED_ROOMS = Symbol("suggested-rooms"); @@ -111,6 +115,18 @@ export class SpaceStoreClass extends AsyncStoreWithClient { this.emit(UPDATE_SELECTED_SPACE, this.activeSpace); this.emit(SUGGESTED_ROOMS, this._suggestedRooms = []); + // view last selected room from space + const spaceId = space?.roomId || LAST_VIEWED_ROOMS_HOME; + const lastViewedRooms = JSON.parse(window.localStorage.getItem(LAST_VIEWED_ROOMS)); + const roomId = lastViewedRooms[spaceId]; + + if (roomId) { + defaultDispatcher.dispatch({ + action: "view_room", + room_id: roomId, + }); + } // TODO: Handle else + // persist space selected if (space) { window.localStorage.setItem(ACTIVE_SPACE_LS_KEY, space.roomId); From 67dcb3a448b923254cc1516e54be684abec70cf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 25 Mar 2021 20:51:21 +0100 Subject: [PATCH 004/154] If no roomId was saved go to space home MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 20223cb8a6..063256f421 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -125,7 +125,16 @@ export class SpaceStoreClass extends AsyncStoreWithClient { action: "view_room", room_id: roomId, }); - } // TODO: Handle else + } else { + if (space) { + defaultDispatcher.dispatch({ + action: "view_room", + room_id: space.roomId, + }); + } else { + // TODO: Switch to first room in the RoomList + } + } // persist space selected if (space) { From 2dcb60b489e0c53101ab9586f9578277baf2e7ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 26 Mar 2021 07:53:07 +0100 Subject: [PATCH 005/154] Move persisting of last viewed into SpaceStore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/structures/MatrixChat.tsx | 10 +--------- src/stores/SpaceStore.tsx | 8 ++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index 9a4e83828c..689561fd60 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -79,7 +79,7 @@ import { CommunityPrototypeStore } from "../../stores/CommunityPrototypeStore"; import DialPadModal from "../views/voip/DialPadModal"; import { showToast as showMobileGuideToast } from '../../toasts/MobileGuideToast'; import { shouldUseLoginForWelcome } from "../../utils/pages"; -import SpaceStore, {LAST_VIEWED_ROOMS, LAST_VIEWED_ROOMS_HOME} from "../../stores/SpaceStore"; +import SpaceStore from "../../stores/SpaceStore"; import SpaceRoomDirectory from "./SpaceRoomDirectory"; import {replaceableComponent} from "../../utils/replaceableComponent"; import RoomListStore from "../../stores/room-list/RoomListStore"; @@ -875,14 +875,6 @@ export default class MatrixChat extends React.PureComponent { private viewRoom(roomInfo: IRoomInfo) { this.focusComposer = true; - // persist last viewed room from a space - const activeSpace = SpaceStore.instance.activeSpace; - const activeSpaceId = activeSpace?.roomId || LAST_VIEWED_ROOMS_HOME; - const lastViewedRooms = JSON.parse(window.localStorage.getItem(LAST_VIEWED_ROOMS)) || {}; - - lastViewedRooms[activeSpaceId] = roomInfo.room_id; - window.localStorage.setItem(LAST_VIEWED_ROOMS, JSON.stringify(lastViewedRooms)); - if (roomInfo.room_alias) { console.log( `Switching to room alias ${roomInfo.room_alias} at event ` + diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 063256f421..1f6cbb33b5 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -490,6 +490,14 @@ export class SpaceStoreClass extends AsyncStoreWithClient { if (!SettingsStore.getValue("feature_spaces")) return; switch (payload.action) { case "view_room": { + // persist last viewed room from a space + const activeSpace = SpaceStore.instance.activeSpace; + const activeSpaceId = activeSpace?.roomId || LAST_VIEWED_ROOMS_HOME; + const lastViewedRooms = JSON.parse(window.localStorage.getItem(LAST_VIEWED_ROOMS)) || {}; + + lastViewedRooms[activeSpaceId] = payload.room_id; + window.localStorage.setItem(LAST_VIEWED_ROOMS, JSON.stringify(lastViewedRooms)); + const room = this.matrixClient?.getRoom(payload.room_id); if (room?.getMyMembership() === "join") { From e39f7caf59993031fe47cd076619f8235195ee8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 26 Mar 2021 07:55:52 +0100 Subject: [PATCH 006/154] Don't export as we don't need to MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 1f6cbb33b5..453cccdc17 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -41,10 +41,10 @@ type SpaceKey = string | symbol; interface IState {} const ACTIVE_SPACE_LS_KEY = "mx_active_space"; -export const LAST_VIEWED_ROOMS = "mx_last_viewed_rooms"; +const LAST_VIEWED_ROOMS = "mx_last_viewed_rooms"; // We can't use HOME_SPACE here because JSON.stringify() will ignore any Symbols -export const LAST_VIEWED_ROOMS_HOME = "home_space"; +const LAST_VIEWED_ROOMS_HOME = "home_space"; export const HOME_SPACE = Symbol("home-space"); export const SUGGESTED_ROOMS = Symbol("suggested-rooms"); From c26da1bce6d1cfec21d8266abb5a8c4d8f44aca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 26 Mar 2021 07:58:09 +0100 Subject: [PATCH 007/154] Use this.activeSpace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 453cccdc17..3d476f7077 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -491,8 +491,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { switch (payload.action) { case "view_room": { // persist last viewed room from a space - const activeSpace = SpaceStore.instance.activeSpace; - const activeSpaceId = activeSpace?.roomId || LAST_VIEWED_ROOMS_HOME; + const activeSpaceId = this.activeSpace?.roomId || LAST_VIEWED_ROOMS_HOME; const lastViewedRooms = JSON.parse(window.localStorage.getItem(LAST_VIEWED_ROOMS)) || {}; lastViewedRooms[activeSpaceId] = payload.room_id; From efb8c89433a1aee5fea49dfda3c8cc2e82e149cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 26 Mar 2021 08:13:50 +0100 Subject: [PATCH 008/154] Don't save if isSpaceRoom() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 3d476f7077..ef12640438 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -490,15 +490,20 @@ export class SpaceStoreClass extends AsyncStoreWithClient { if (!SettingsStore.getValue("feature_spaces")) return; switch (payload.action) { case "view_room": { - // persist last viewed room from a space - const activeSpaceId = this.activeSpace?.roomId || LAST_VIEWED_ROOMS_HOME; - const lastViewedRooms = JSON.parse(window.localStorage.getItem(LAST_VIEWED_ROOMS)) || {}; - - lastViewedRooms[activeSpaceId] = payload.room_id; - window.localStorage.setItem(LAST_VIEWED_ROOMS, JSON.stringify(lastViewedRooms)); - const room = this.matrixClient?.getRoom(payload.room_id); + // persist last viewed room from a space + + // We don't want to save if the room is a + // space room since it can cause problems + if (!room.isSpaceRoom()) { + const activeSpaceId = this.activeSpace?.roomId || LAST_VIEWED_ROOMS_HOME; + const lastViewedRooms = JSON.parse(window.localStorage.getItem(LAST_VIEWED_ROOMS)) || {}; + + lastViewedRooms[activeSpaceId] = payload.room_id; + window.localStorage.setItem(LAST_VIEWED_ROOMS, JSON.stringify(lastViewedRooms)); + } + if (room?.getMyMembership() === "join") { if (room.isSpaceRoom()) { this.setActiveSpace(room); From 7e425ce939ef5ddb30f4ae07fb94079536f1daad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 26 Mar 2021 08:15:35 +0100 Subject: [PATCH 009/154] Empty object if nothing saved MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This isn't nice but I'll rework this soon anyway Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index ef12640438..e5cad51240 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -117,7 +117,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { // view last selected room from space const spaceId = space?.roomId || LAST_VIEWED_ROOMS_HOME; - const lastViewedRooms = JSON.parse(window.localStorage.getItem(LAST_VIEWED_ROOMS)); + const lastViewedRooms = JSON.parse(window.localStorage.getItem(LAST_VIEWED_ROOMS)) || {}; const roomId = lastViewedRooms[spaceId]; if (roomId) { From 65ef2b845e05ad7648b1b32ddc7dd1617128b069 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 26 Mar 2021 08:16:39 +0100 Subject: [PATCH 010/154] Go to /#/home if there is no saved room MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index e5cad51240..1a9df5a9b3 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -132,7 +132,9 @@ export class SpaceStoreClass extends AsyncStoreWithClient { room_id: space.roomId, }); } else { - // TODO: Switch to first room in the RoomList + defaultDispatcher.dispatch({ + action: "view_home_page", + }); } } From f64008e23916fa6b65034dcab7304d69eec43a4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 26 Mar 2021 13:39:16 +0100 Subject: [PATCH 011/154] Check if room is defined MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sometimes it isn't and that leads to errors. We can't use ? here because we also use ! Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 1a9df5a9b3..f07616aed3 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -498,7 +498,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { // We don't want to save if the room is a // space room since it can cause problems - if (!room.isSpaceRoom()) { + if (room && !room.isSpaceRoom()) { const activeSpaceId = this.activeSpace?.roomId || LAST_VIEWED_ROOMS_HOME; const lastViewedRooms = JSON.parse(window.localStorage.getItem(LAST_VIEWED_ROOMS)) || {}; From f62e2c0042eb2bb9a76eca417aff46bc0010a4d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 26 Mar 2021 13:44:51 +0100 Subject: [PATCH 012/154] Use compound keys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index f07616aed3..c58340356d 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -117,8 +117,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { // view last selected room from space const spaceId = space?.roomId || LAST_VIEWED_ROOMS_HOME; - const lastViewedRooms = JSON.parse(window.localStorage.getItem(LAST_VIEWED_ROOMS)) || {}; - const roomId = lastViewedRooms[spaceId]; + const roomId = window.localStorage.getItem(`${LAST_VIEWED_ROOMS}_${spaceId}`); if (roomId) { defaultDispatcher.dispatch({ @@ -500,10 +499,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { // space room since it can cause problems if (room && !room.isSpaceRoom()) { const activeSpaceId = this.activeSpace?.roomId || LAST_VIEWED_ROOMS_HOME; - const lastViewedRooms = JSON.parse(window.localStorage.getItem(LAST_VIEWED_ROOMS)) || {}; - - lastViewedRooms[activeSpaceId] = payload.room_id; - window.localStorage.setItem(LAST_VIEWED_ROOMS, JSON.stringify(lastViewedRooms)); + window.localStorage.setItem(`${LAST_VIEWED_ROOMS}_${activeSpaceId}`, payload.room_id); } if (room?.getMyMembership() === "join") { From a707524aade0e1b6a0cf35829af363dbec1f3cd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 26 Mar 2021 13:49:01 +0100 Subject: [PATCH 013/154] Delete comment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index c58340356d..2eec2afbb3 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -43,7 +43,6 @@ interface IState {} const ACTIVE_SPACE_LS_KEY = "mx_active_space"; const LAST_VIEWED_ROOMS = "mx_last_viewed_rooms"; -// We can't use HOME_SPACE here because JSON.stringify() will ignore any Symbols const LAST_VIEWED_ROOMS_HOME = "home_space"; export const HOME_SPACE = Symbol("home-space"); From d68afcc4ce278d89d9b9bff0dc0ca7490445a627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 26 Mar 2021 13:52:41 +0100 Subject: [PATCH 014/154] Use else if MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Maybe it looks a little nicer, I don't know Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 2eec2afbb3..1bf98617a3 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -123,17 +123,15 @@ export class SpaceStoreClass extends AsyncStoreWithClient { action: "view_room", room_id: roomId, }); + } else if (space) { + defaultDispatcher.dispatch({ + action: "view_room", + room_id: space.roomId, + }); } else { - if (space) { - defaultDispatcher.dispatch({ - action: "view_room", - room_id: space.roomId, - }); - } else { - defaultDispatcher.dispatch({ - action: "view_home_page", - }); - } + defaultDispatcher.dispatch({ + action: "view_home_page", + }); } // persist space selected From 653146a177769cff2ff9e2b25f2565e5d3d3af34 Mon Sep 17 00:00:00 2001 From: iaiz Date: Wed, 7 Apr 2021 12:32:29 +0000 Subject: [PATCH 015/154] Translated using Weblate (Spanish) Currently translated at 99.5% (2903 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index c6e84570d6..202c6d4d71 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -3188,5 +3188,28 @@ "From %(deviceName)s (%(deviceId)s) at %(ip)s": "De %(deviceName)s (%(deviceId)s) en", "Check your devices": "Comprueba tus dispositivos", "A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Alguien está iniciando sesión a tu cuenta: %(name)s (%(deviceID)s) en %(ip)s", - "You have unverified logins": "Tienes inicios de sesión sin verificar" + "You have unverified logins": "Tienes inicios de sesión sin verificar", + "Verification requested": "Verificación solicitada", + "Avatar": "Imagen de perfil", + "Verify other login": "Verificar otro inicio de sesión", + "Consult first": "Consultar primero", + "Invited people will be able to read old messages.": "Las personas invitadas podrán leer mensajes antiguos.", + "We couldn't create your DM.": "No hemos podido crear tu mensaje directo.", + "Adding...": "Añadiendo...", + "Add existing rooms": "Añadir salas existentes", + "%(count)s people you know have already joined|one": "%(count)s persona que ya conoces se ha unido", + "%(count)s people you know have already joined|other": "%(count)s personas que ya conoces se han unido", + "Accept on your other login…": "Acepta en tu otro inicio de sesión…", + "Stop & send recording": "Parar y enviar grabación", + "Record a voice message": "Grabar un mensaje de voz", + "Quick actions": "Acciones rápidas", + "Invite to just this room": "Invitar solo a esta sala", + "Warn before quitting": "Avisar antes de salir", + "Manage & explore rooms": "Gestionar y explorar salas", + "unknown person": "persona desconocida", + "Share decryption keys for room history when inviting users": "Compartir claves para descifrar el historial de la sala al invitar a gente", + "Send and receive voice messages (in development)": "Enviar y recibir mensajes de voz (en desarrollo)", + "%(deviceId)s from %(ip)s": "%(deviceId)s desde %(ip)s", + "Review to ensure your account is safe": "Revisa que tu cuenta esté segura", + "Sends the given message as a spoiler": "Envía el mensaje como un spoiler" } From 8eabb0f2142576e7242068b53c50f72bcaeb9265 Mon Sep 17 00:00:00 2001 From: Thibault Martin Date: Wed, 7 Apr 2021 13:16:12 +0000 Subject: [PATCH 016/154] Translated using Weblate (French) Currently translated at 100.0% (2917 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 01390329bb..fcc5ec9afe 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -3225,5 +3225,42 @@ "From %(deviceName)s (%(deviceId)s) at %(ip)s": "Sur %(deviceName)s %(deviceId)s depuis %(ip)s", "Check your devices": "Vérifiez vos appareils", "A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Une nouvelle session a accès à votre compte : %(name)s %(deviceID)s depuis %(ip)s", - "You have unverified logins": "Vous avez des sessions non-vérifiées" + "You have unverified logins": "Vous avez des sessions non-vérifiées", + "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Sans vérification vous n’aurez pas accès à tous vos messages et n’apparaîtrez pas comme de confiance aux autres.", + "Verify your identity to access encrypted messages and prove your identity to others.": "Vérifiez votre identité pour accéder aux messages chiffrés et prouver votre identité aux autres.", + "Use another login": "Utiliser un autre identifiant", + "Please choose a strong password": "Merci de choisir un mot de passe fort", + "You can add more later too, including already existing ones.": "Vous pourrez en ajouter plus tard, y compris certains déjà existant.", + "Let's create a room for each of them.": "Créons un salon pour chacun d’entre eux.", + "What are some things you want to discuss in %(spaceName)s?": "De quoi voulez vous discuter dans %(spaceName)s ?", + "Verification requested": "Vérification requise", + "Avatar": "Avatar", + "Verify other login": "Vérifier l’autre connexion", + "Reset event store": "Réinitialiser le magasin d’événements", + "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Si vous le faites, notes qu’aucun de vos messages ne sera supprimé, mais la recherche pourrait être dégradée pendant quelques instants, le temps de recréer l’index", + "You most likely do not want to reset your event index store": "Il est probable que vous ne vouliez pas réinitialiser votre magasin d’index d’événements", + "Reset event store?": "Réinitialiser le magasin d’événements ?", + "Consult first": "Consulter d’abord", + "Invited people will be able to read old messages.": "Les personnes invitées pourront lire les anciens messages.", + "We couldn't create your DM.": "Nous n’avons pas pu créer votre message direct.", + "Adding...": "Ajout…", + "Add existing rooms": "Ajouter des salons existants", + "%(count)s people you know have already joined|one": "%(count)s personne que vous connaissez en fait déjà partie", + "%(count)s people you know have already joined|other": "%(count)s personnes que vous connaissez en font déjà partie", + "Accept on your other login…": "Acceptez sur votre autre connexion…", + "Stop & send recording": "Terminer et envoyer l’enregistrement", + "Record a voice message": "Enregistrer un message vocal", + "Invite messages are hidden by default. Click to show the message.": "Les messages d’invitation sont masqués par défaut. Cliquez pour voir le message.", + "Quick actions": "Actions rapides", + "Invite to just this room": "Inviter seulement dans ce salon", + "Warn before quitting": "Avertir avant de quitter", + "Message search initilisation failed": "Échec de l’initialisation de la recherche de message", + "Manage & explore rooms": "Gérer et découvrir les salons", + "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Consultation avec %(transferTarget)s. Transfert à %(transferee)s", + "unknown person": "personne inconnue", + "Share decryption keys for room history when inviting users": "Partager les clés de déchiffrement lors de l’invitation d’utilisateurs", + "Send and receive voice messages (in development)": "Envoyez et recevez des messages vocaux (en développement)", + "%(deviceId)s from %(ip)s": "%(deviceId)s depuis %(ip)s", + "Review to ensure your account is safe": "Vérifiez pour assurer la sécurité de votre compte", + "Sends the given message as a spoiler": "Envoie le message flouté" } From b04a34b37a7e897f5d4ce8c2475a8e91f3cd9b87 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Wed, 7 Apr 2021 15:41:24 +0000 Subject: [PATCH 017/154] Translated using Weblate (Hungarian) Currently translated at 100.0% (2917 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index eaa77e809d..2ec5af8a17 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -3243,5 +3243,42 @@ "From %(deviceName)s (%(deviceId)s) at %(ip)s": "Innen: %(deviceName)s (%(deviceId)s), %(ip)s", "Check your devices": "Ellenőrizze az eszközeit", "A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Új bejelentkezéssel hozzáférés történik a fiókjához: %(name)s (%(deviceID)s), %(ip)s", - "You have unverified logins": "Ellenőrizetlen bejelentkezései vannak" + "You have unverified logins": "Ellenőrizetlen bejelentkezései vannak", + "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Az ellenőrzés nélkül nem fér hozzá az összes üzenetéhez és mások számára megbízhatatlannak fog látszani.", + "Verify your identity to access encrypted messages and prove your identity to others.": "Ellenőrizze a személyazonosságát, hogy hozzáférjen a titkosított üzeneteihez és másoknak is bizonyítani tudja személyazonosságát.", + "Use another login": "Másik munkamenet használata", + "Please choose a strong password": "Kérem válasszon erős jelszót", + "You can add more later too, including already existing ones.": "Később is hozzáadhat többet, beleértve meglévőket is.", + "Let's create a room for each of them.": "Készítsünk szobát mindhez.", + "What are some things you want to discuss in %(spaceName)s?": "Mik azok amikről beszélni szeretne itt: %(spaceName)s?", + "Verification requested": "Hitelesítés kérés elküldve", + "Avatar": "Profilkép", + "Verify other login": "Másik munkamenet ellenőrzése", + "Reset event store": "Az esemény tárolót alaphelyzetbe állítása", + "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Ha ezt teszi, tudnia kell, hogy az üzenetek nem kerülnek törlésre de keresés nem lesz tökéletes amíg az indexek nem készülnek el újra", + "You most likely do not want to reset your event index store": "Az esemény index tárolót nagy valószínűséggel nem szeretné alaphelyzetbe állítani", + "Reset event store?": "Az esemény tárolót alaphelyzetbe állítja?", + "Consult first": "Kérjen először véleményt", + "Invited people will be able to read old messages.": "A meghívott személyek el tudják olvasni a régi üzeneteket.", + "We couldn't create your DM.": "Nem tudjuk elkészíteni a közvetlen üzenetét.", + "Adding...": "Hozzáadás…", + "Add existing rooms": "Létező szobák hozzáadása", + "%(count)s people you know have already joined|one": "%(count)s ismerős már csatlakozott", + "%(count)s people you know have already joined|other": "%(count)s ismerős már csatlakozott", + "Accept on your other login…": "Egy másik bejelentkezésében fogadta el…", + "Stop & send recording": "Megállít és a felvétel elküldése", + "Record a voice message": "Hang üzenet felvétele", + "Invite messages are hidden by default. Click to show the message.": "A meghívók alapesetben rejtve vannak. A megjelenítéshez kattintson.", + "Quick actions": "Gyors műveletek", + "Invite to just this room": "Meghívás csak ebbe a szobába", + "Warn before quitting": "Kilépés előtt figyelmeztet", + "Message search initilisation failed": "Üzenet keresés beállítása sikertelen", + "Manage & explore rooms": "Szobák kezelése és felderítése", + "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Egyeztetés vele: %(transferTarget)s. Átadás ide: %(transferee)s", + "unknown person": "ismeretlen személy", + "Share decryption keys for room history when inviting users": "Visszafejtéshez szükséges kulcsok megosztása a szoba előzményekhez felhasználók meghívásakor", + "Send and receive voice messages (in development)": "Hang üzenetek küldése és fogadása (fejlesztés alatt)", + "%(deviceId)s from %(ip)s": "%(deviceId)s innen: %(ip)s", + "Review to ensure your account is safe": "Tekintse át, hogy meggyőződjön arról, hogy a fiókja biztonságban van", + "Sends the given message as a spoiler": "A megadott üzenet szpojlerként küldése" } From dfca00d2d9857f30dcc8908e7253f714bec70936 Mon Sep 17 00:00:00 2001 From: jelv Date: Wed, 7 Apr 2021 14:25:17 +0000 Subject: [PATCH 018/154] Translated using Weblate (Dutch) Currently translated at 100.0% (2917 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nl/ --- src/i18n/strings/nl.json | 43 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index ee99127e04..f1c48cc539 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -632,7 +632,7 @@ "The version of %(brand)s": "De versie van %(brand)s", "Your language of choice": "De door jou gekozen taal", "Which officially provided instance you are using, if any": "Welke officieel aangeboden instantie je eventueel gebruikt", - "Whether or not you're using the Richtext mode of the Rich Text Editor": "Of je de tekstverwerker al dan niet in de modus voor opgemaakte tekst gebruikt", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Of u de tekstverwerker al dan niet in de modus voor opgemaakte tekst gebruikt", "Your homeserver's URL": "De URL van je homeserver", "In reply to ": "Als antwoord op ", "This room is not public. You will not be able to rejoin without an invite.": "Dit is geen openbaar gesprek. Slechts op uitnodiging zult u opnieuw kunnen toetreden.", @@ -1255,7 +1255,7 @@ "The homeserver may be unavailable or overloaded.": "De homeserver is mogelijk onbereikbaar of overbelast.", "You have %(count)s unread notifications in a prior version of this room.|other": "U heeft %(count)s ongelezen meldingen in een vorige versie van dit gesprek.", "You have %(count)s unread notifications in a prior version of this room.|one": "U heeft %(count)s ongelezen meldingen in een vorige versie van dit gesprek.", - "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Of je de icoontjes voor recente gesprekken (boven de gesprekkenlijst) al dan niet gebruikt", + "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Of u de icoontjes voor recente gesprekken (boven de gesprekkenlijst) al dan niet gebruikt", "Replying With Files": "Beantwoorden met bestanden", "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Het is momenteel niet mogelijk met een bestand te antwoorden. Wil je dit bestand uploaden zonder te antwoorden?", "The file '%(fileName)s' failed to upload.": "Het bestand ‘%(fileName)s’ kon niet geüpload worden.", @@ -3134,5 +3134,42 @@ "From %(deviceName)s (%(deviceId)s) at %(ip)s": "Van %(deviceName)s (%(deviceId)s) op %(ip)s", "Check your devices": "Controleer uw apparaten", "A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Een nieuwe login heeft toegang tot uw account: %(name)s (%(deviceID)s) op %(ip)s", - "You have unverified logins": "U heeft ongeverifieerde logins" + "You have unverified logins": "U heeft ongeverifieerde logins", + "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Zonder verifiëren heeft u geen toegang tot al uw berichten en kan u als onvertrouwd aangemerkt staan bij anderen.", + "Verify your identity to access encrypted messages and prove your identity to others.": "Verifeer uw identiteit om toegang te krijgen tot uw versleutelde berichten en uw identiteit te bewijzen voor anderen.", + "Use another login": "Gebruik andere login", + "Please choose a strong password": "Kies een sterk wachtwoord", + "You can add more later too, including already existing ones.": "U kunt er later nog meer toevoegen, inclusief al bestaande gesprekken.", + "Let's create a room for each of them.": "Laten we voor elk een los gesprek maken.", + "What are some things you want to discuss in %(spaceName)s?": "Wat wilt u allemaal bespreken in %(spaceName)s?", + "Verification requested": "Verificatieverzocht", + "Avatar": "Avatar", + "Verify other login": "Verifieer andere login", + "You most likely do not want to reset your event index store": "U wilt waarschijnlijk niet uw gebeurtenisopslag-index resetten", + "Reset event store?": "Gebeurtenisopslag resetten?", + "Reset event store": "Gebeurtenisopslag resetten", + "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Als u dit wilt, let op uw berichten worden niet verwijderd, zal het zoeken tijdelijk minder goed werken terwijl we uw index opnieuw opbouwen", + "Consult first": "Eerst overleggen", + "Invited people will be able to read old messages.": "Uitgenodigde personen kunnen de oude berichten lezen.", + "We couldn't create your DM.": "We konden uw DM niet aanmaken.", + "Adding...": "Toevoegen...", + "Add existing rooms": "Bestaande gesprekken toevoegen", + "%(count)s people you know have already joined|one": "%(count)s persoon die u kent is al geregistreerd", + "%(count)s people you know have already joined|other": "%(count)s personen die u kent hebben zijn al geregistreerd", + "Accept on your other login…": "Accepteer op uw andere login…", + "Stop & send recording": "Stop & verstuur opname", + "Record a voice message": "Audiobericht opnemen", + "Invite messages are hidden by default. Click to show the message.": "Uitnodigingen zijn standaard verborgen. Klik om de uitnodigingen weer te geven.", + "Quick actions": "Snelle acties", + "Invite to just this room": "Uitnodigen voor alleen dit gesprek", + "Warn before quitting": "Waarschuwen voordat u afsluit", + "Message search initilisation failed": "Zoeken in berichten opstarten is mislukt", + "Manage & explore rooms": "Beheer & ontdek gesprekken", + "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Overleggen met %(transferTarget)s. Verstuur naar %(transferee)s", + "unknown person": "onbekend persoon", + "Share decryption keys for room history when inviting users": "Deel ontsleutelsleutels voor de gespreksgeschiedenis wanneer u personen uitnodigd", + "Send and receive voice messages (in development)": "Verstuur en ontvang audioberichten (in ontwikkeling)", + "%(deviceId)s from %(ip)s": "%(deviceId)s van %(ip)s", + "Review to ensure your account is safe": "Controleer om u te verzekeren dat uw account veilig is", + "Sends the given message as a spoiler": "Verstuurt het bericht als een spoiler" } From a5767a9b8dd8bfd236f314f0db29000f3a799ac5 Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Wed, 7 Apr 2021 12:09:31 +0000 Subject: [PATCH 019/154] Translated using Weblate (Russian) Currently translated at 99.4% (2863 of 2880 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 43 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 27a418c5c2..7db3758fd8 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -3169,5 +3169,46 @@ "Decrypted event source": "Расшифрованный исходный код", "%(count)s rooms and %(numSpaces)s spaces|one": "%(count)s комната и %(numSpaces)s пространств", "%(count)s rooms and %(numSpaces)s spaces|other": "%(count)s комнат и %(numSpaces)s пространств", - "If you can't find the room you're looking for, ask for an invite or create a new room.": "Если вы не можете найти комнату, попросите приглашение или создайте новую комнату." + "If you can't find the room you're looking for, ask for an invite or create a new room.": "Если вы не можете найти комнату, попросите приглашение или создайте новую комнату.", + "Values at explicit levels in this room:": "Значения уровня чувствительности в этой комнате:", + "Values at explicit levels:": "Значения уровня чувствительности:", + "Values at explicit levels in this room": "Значения уровня чувствительности в этой комнате", + "Values at explicit levels": "Значения уровня чувствительности", + "We'll create rooms for each of them. You can add more later too, including already existing ones.": "Мы создадим комнаты для каждого из них. Вы можете добавить ещё больше позже, включая уже существующие.", + "What projects are you working on?": "Над какими проектами вы работаете?", + "Invite by username": "Пригласить по имени пользователя", + "Make sure the right people have access. You can invite more later.": "Убедитесь, что правильные люди имеют доступ. Вы можете пригласить больше людей позже.", + "Invite your teammates": "Пригласите своих товарищей по команде", + "Inviting...": "Приглашение…", + "Failed to invite the following users to your space: %(csvUsers)s": "Не удалось пригласить следующих пользователей в ваше пространство: %(csvUsers)s", + "Me and my teammates": "Я и мои товарищи по команде", + "A private space for you and your teammates": "Приватное пространство для вас и ваших товарищей по команде", + "A private space to organise your rooms": "Приватное пространство для организации ваших комнат", + "Just me": "Только я", + "Make sure the right people have access to %(name)s": "Убедитесь, что правильные люди имеют доступ к %(name)s", + "Who are you working with?": "С кем ты работаешь?", + "Go to my first room": "Перейти в мою первую комнату", + "It's just you at the moment, it will be even better with others.": "Сейчас здесь только ты, с другими будет ещё лучше.", + "Share %(name)s": "Поделиться %(name)s", + "Creating rooms...": "Создание комнат…", + "Skip for now": "Пропустить сейчас", + "Failed to create initial space rooms": "Не удалось создать первоначальные комнаты пространства", + "Room name": "Название комнаты", + "Support": "Поддержка", + "Random": "Случайный", + "Welcome to ": "Добро пожаловать в ", + "Your server does not support showing space hierarchies.": "Ваш сервер не поддерживает отображение пространственных иерархий.", + "Add existing rooms & spaces": "Добавить существующие комнаты и пространства", + "Private space": "Приватное пространство", + "Public space": "Публичное пространство", + " invites you": " пригласил(а) тебя", + "Search names and description": "Искать имена и описание", + "You may want to try a different search or check for typos.": "Вы можете попробовать другой поиск или проверить опечатки.", + "No results found": "Результаты не найдены", + "Mark as suggested": "Отметить как рекомендуется", + "Mark as not suggested": "Отметить как не рекомендуется", + "Removing...": "Удаление…", + "Failed to remove some rooms. Try again later": "Не удалось удалить несколько комнат. Попробуйте позже", + "%(count)s rooms and 1 space|one": "%(count)s комната и одно пространство", + "%(count)s rooms and 1 space|other": "%(count)s комнат и одно пространство" } From 4136a02279be829d717f346ecf9b8c5585bd40c8 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 7 Apr 2021 15:42:31 +0000 Subject: [PATCH 020/154] Translated using Weblate (Albanian) Currently translated at 99.6% (2907 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 58d23e9395..ad768b59cb 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -874,7 +874,7 @@ "Incompatible Database": "Bazë të dhënash e Papërputhshme", "Continue With Encryption Disabled": "Vazhdo Me Fshehtëzimin të Çaktivizuar", "Unable to load! Check your network connectivity and try again.": "S’arrihet të ngarkohet! Kontrolloni lidhjen tuaj në rrjet dhe riprovoni.", - "Forces the current outbound group session in an encrypted room to be discarded": "", + "Forces the current outbound group session in an encrypted room to be discarded": "E detyron të hidhet tej sesionin e tanishëm outbound grupi në një dhomë të fshehtëzuar", "Delete Backup": "Fshije Kopjeruajtjen", "Unable to load key backup status": "S’arrihet të ngarkohet gjendje kopjeruajtjeje kyçesh", "Backup version: ": "Version kopjeruajtjeje: ", @@ -3240,5 +3240,37 @@ "From %(deviceName)s (%(deviceId)s) at %(ip)s": "Nga %(deviceName)s (%(deviceId)s) te %(ip)s", "Check your devices": "Kontrolloni pajisjet tuaja", "A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Në llogarinë tuaj po hyhet nga një palë kredenciale të reja: %(name)s (%(deviceID)s) te %(ip)s", - "You have unverified logins": "Keni kredenciale të erifikuar" + "You have unverified logins": "Keni kredenciale të erifikuar", + "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Pa e verifikuar, s’do të mund të hyni te krejt mesazhet tuaja dhe mund të dukeni jo i besueshëm për të tjerët.", + "Verify your identity to access encrypted messages and prove your identity to others.": "Verifikoni identitetin tuaj që të hyhet në mesazhe të fshehtëzuar dhe t’u provoni të tjerëve identitetin tuaj.", + "Use another login": "Përdorni të tjera kredenciale hyrjesh", + "Please choose a strong password": "Ju lutemi, zgjidhni një fjalëkalim të fuqishëm", + "You can add more later too, including already existing ones.": "Mund të shtoni edhe të tjera më vonë, përfshi ato ekzistueset tashmë.", + "Let's create a room for each of them.": "Le të krijojmë një dhomë për secilën prej tyre.", + "What are some things you want to discuss in %(spaceName)s?": "Cilat janë disa nga gjërat që doni të diskutoni në %(spaceName)s?", + "Verification requested": "U kërkua verifikim", + "Avatar": "Avatar", + "Verify other login": "Verifikoni kredencialet e tjera për hyrje", + "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Nëse e bëni, ju lutemi, kini parasysh se s’do të fshihet asnjë prej mesazheve tuaja, por puna me kërkimet mund të bjerë, për ca çaste, teksa rikrijohet treguesi", + "Consult first": "Konsultohu së pari", + "Invited people will be able to read old messages.": "Personat e ftuar do të jenë në gjendje të lexojnë mesazhe të vjetër.", + "We couldn't create your DM.": "S’e krijuam dot DM-në tuaj.", + "Adding...": "Po shtohet…", + "Add existing rooms": "Shtoni dhoma ekzistuese", + "%(count)s people you know have already joined|one": "%(count)s person që e njihni është bërë pjesë tashmë", + "%(count)s people you know have already joined|other": "%(count)s persona që i njihni janë bërë pjesë tashmë", + "Stop & send recording": "Ndale & dërgo incizimin", + "Record a voice message": "Incizoni një mesazh zanor", + "Invite messages are hidden by default. Click to show the message.": "Mesazhet e ftesave, si parazgjedhje, janë të fshehur. Klikoni që të shfaqet mesazhi.", + "Quick actions": "Veprime të shpejta", + "Invite to just this room": "Ftoje thjesht te kjo dhomë", + "Warn before quitting": "Sinjalizo përpara daljes", + "Message search initilisation failed": "Dështoi gatitje kërkimi mesazhesh", + "Manage & explore rooms": "Administroni & eksploroni dhoma", + "unknown person": "person i panjohur", + "Sends the given message as a spoiler": "E dërgon mesazhin e dhënë si spoiler", + "Share decryption keys for room history when inviting users": "Ndani me përdorues kyçe shfshehtëzimi, kur ftohen përdorues", + "Send and receive voice messages (in development)": "Dërgoni dhe merrni mesazhe zanorë (në zhvillim)", + "%(deviceId)s from %(ip)s": "%(deviceId)s prej %(ip)s", + "Review to ensure your account is safe": "Shqyrtojeni për t’u siguruar se llogaria është e parrezik" } From 0b878e9d72398354dabb5efcb60c8c2ddea56e7e Mon Sep 17 00:00:00 2001 From: Magnus Date: Wed, 7 Apr 2021 16:44:36 +0000 Subject: [PATCH 021/154] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 48.3% (1411 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nb_NO/ --- src/i18n/strings/nb_NO.json | 48 ++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index ee116fa5bd..a2f5444289 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -1507,5 +1507,51 @@ "This will end the conference for everyone. Continue?": "Dette vil avslutte konferansen for alle. Fortsett?", "End conference": "Avslutt konferanse", "You're already in a call with this person.": "Du er allerede i en samtale med denne personen.", - "Already in call": "Allerede i en samtale" + "Already in call": "Allerede i en samtale", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Er du sikkert på at du vil fjerne '%(roomName)s' fra %(groupId)s?", + "Burundi": "Burundi", + "Burkina Faso": "Burkina Faso", + "Bulgaria": "Bulgaria", + "Brunei": "Brunei", + "Brazil": "Brazil", + "Botswana": "Botswana", + "Bolivia": "Bolivia", + "Bhutan": "Bhutan", + "Bermuda": "Bermuda", + "Benin": "Benin", + "Belize": "Belize", + "Belarus": "Hviterussland", + "Barbados": "Barbados", + "Bangladesh": "Bangladesh", + "Bahrain": "Bahrain", + "Bahamas": "Bahamas", + "Azerbaijan": "Azerbaijan", + "Austria": "Østerrike", + "Australia": "Australia", + "Aruba": "Aruba", + "Armenia": "Armenia", + "Argentina": "Argentina", + "Antigua & Barbuda": "Antigua og Barbuda", + "Antarctica": "Antarktis", + "Anguilla": "Anguilla", + "Angola": "Angola", + "Andorra": "Andorra", + "Algeria": "Algeria", + "Albania": "Albania", + "Åland Islands": "Åland", + "Afghanistan": "Afghanistan", + "United Kingdom": "Storbritannia", + "Your homeserver was unreachable and was not able to log you in. Please try again. If this continues, please contact your homeserver administrator.": "Din hjemmeserver kunne ikke nås, og kan derfor ikke logge deg inn. Vennligst prøv igjen. Hvis dette fortsetter, kontakt administratoren til din hjemmeserver", + "Only continue if you trust the owner of the server.": "Fortsett kun om du stoler på eieren av serveren.", + "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Denne handlingen krever tilgang til standard identitetsserver for å kunne validere en epostaddresse eller telefonnummer, men serveren har ikke bruksvilkår.", + "Too Many Calls": "For mange samtaler", + "Call failed because webcam or microphone could not be accessed. Check that:": "Samtalen mislyktes fordi du fikk ikke tilgang til webkamera eller mikrofon. Sørg for at:", + "Unable to access webcam / microphone": "Ingen tilgang til webkamera / mikrofon", + "The call was answered on another device.": "Samtalen ble besvart på en annen enhet.", + "The call could not be established": "Samtalen kunne ikke etableres.", + "The other party declined the call.": "Den andre parten avviste samtalen.", + "Call Declined": "Samtale avvist", + "Click the button below to confirm adding this phone number.": "Klikk knappen nedenfor for å bekrefte dette telefonnummeret.", + "Single Sign On": "Single Sign On", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bekreft dette telefonnummeret ved å bruke Single Sign On for å bevise din identitet." } From eaeefa8c61f3fd8608b712a446796343472c819c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20L=C3=B8vbr=C3=B8tte=20Olsen?= Date: Wed, 7 Apr 2021 16:39:01 +0000 Subject: [PATCH 022/154] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 48.3% (1411 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nb_NO/ --- src/i18n/strings/nb_NO.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index a2f5444289..9fe5efddbb 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -1553,5 +1553,6 @@ "Call Declined": "Samtale avvist", "Click the button below to confirm adding this phone number.": "Klikk knappen nedenfor for å bekrefte dette telefonnummeret.", "Single Sign On": "Single Sign On", - "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bekreft dette telefonnummeret ved å bruke Single Sign On for å bevise din identitet." + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bekreft dette telefonnummeret ved å bruke Single Sign On for å bevise din identitet.", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Befrekt denne e-postadressen ved å bruke Single Sign On for å bevise din identitet." } From 8d60d85570e57ad12bc802c4c1f88a0f8a0dc260 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Thu, 8 Apr 2021 09:27:41 +0100 Subject: [PATCH 023/154] replace velocity-animate with CSS transitions --- package.json | 1 - res/css/views/rooms/_EventTile.scss | 4 + src/Velociraptor.js | 79 +++++++++++-------- src/VelocityBounce.js | 17 ---- .../views/rooms/ReadReceiptMarker.js | 38 +-------- yarn.lock | 5 -- 6 files changed, 50 insertions(+), 94 deletions(-) delete mode 100644 src/VelocityBounce.js diff --git a/package.json b/package.json index 6a8645adf3..2f1a96eadd 100644 --- a/package.json +++ b/package.json @@ -102,7 +102,6 @@ "tar-js": "^0.3.0", "text-encoding-utf-8": "^1.0.2", "url": "^0.11.0", - "velocity-animate": "^2.0.6", "what-input": "^5.2.10", "zxcvbn": "^4.4.2" }, diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 028d9a7556..a82c894ac5 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -282,6 +282,10 @@ $left-gutter: 64px; display: inline-block; height: $font-14px; width: $font-14px; + + transition: + left .1s ease-out, + top .3s ease-out; } .mx_EventTile_readAvatarRemainder { diff --git a/src/Velociraptor.js b/src/Velociraptor.js index 2da54babe5..4fd9a23c82 100644 --- a/src/Velociraptor.js +++ b/src/Velociraptor.js @@ -1,6 +1,5 @@ import React from "react"; import ReactDom from "react-dom"; -import Velocity from "velocity-animate"; import PropTypes from 'prop-types'; /** @@ -20,14 +19,10 @@ export default class Velociraptor extends React.Component { // a list of state objects to apply to each child node in turn startStyles: PropTypes.array, - - // a list of transition options from the corresponding startStyle - enterTransitionOpts: PropTypes.array, }; static defaultProps = { startStyles: [], - enterTransitionOpts: [], }; constructor(props) { @@ -41,6 +36,25 @@ export default class Velociraptor extends React.Component { this._updateChildren(this.props.children); } + /** + * + * @param {HTMLElement} node element to apply styles to + * @param {object} styles a key/value pair of CSS properties + * @returns {Promise} promise resolving when the applied styles have finished transitioning + */ + _applyStyles(node, styles) { + Object.entries(styles).forEach(([property, value]) => { + node.style[property] = value; + }); + const transitionEndPromise = new Promise(resolve => { + node.addEventListener("transitionend", () => { + resolve(); + }, { once: true }); + }); + + return Promise.race([timeout(300), transitionEndPromise]); + } + _updateChildren(newChildren) { const oldChildren = this.children || {}; this.children = {}; @@ -50,14 +64,16 @@ export default class Velociraptor extends React.Component { const oldNode = ReactDom.findDOMNode(this.nodes[old.key]); if (oldNode && oldNode.style.left !== c.props.style.left) { - Velocity(oldNode, { left: c.props.style.left }, this.props.transition).then(() => { - // special case visibility because it's nonsensical to animate an invisible element - // so we always hidden->visible pre-transition and visible->hidden after - if (oldNode.style.visibility === 'visible' && c.props.style.visibility === 'hidden') { - oldNode.style.visibility = c.props.style.visibility; - } - }); - //console.log("translation: "+oldNode.style.left+" -> "+c.props.style.left); + this._applyStyles(oldNode, { left: c.props.style.left }) + .then(() => { + // special case visibility because it's nonsensical to animate an invisible element + // so we always hidden->visible pre-transition and visible->hidden after + if (oldNode.style.visibility === 'visible' && c.props.style.visibility === 'hidden') { + oldNode.style.visibility = c.props.style.visibility; + } + }); + + console.log("translation: "+oldNode.style.left+" -> "+c.props.style.left); } if (oldNode && oldNode.style.visibility === 'hidden' && c.props.style.visibility === 'visible') { oldNode.style.visibility = c.props.style.visibility; @@ -94,33 +110,22 @@ export default class Velociraptor extends React.Component { this.props.startStyles.length > 0 ) { const startStyles = this.props.startStyles; - const transitionOpts = this.props.enterTransitionOpts; const domNode = ReactDom.findDOMNode(node); // start from startStyle 1: 0 is the one we gave it // to start with, so now we animate 1 etc. - for (var i = 1; i < startStyles.length; ++i) { - Velocity(domNode, startStyles[i], transitionOpts[i-1]); - /* - console.log("start:", - JSON.stringify(transitionOpts[i-1]), - "->", - JSON.stringify(startStyles[i]), - ); - */ + for (let i = 1; i < startStyles.length; ++i) { + this._applyStyles(domNode, startStyles[i]); + // console.log("start:" + // JSON.stringify(startStyles[i]), + // ); } // and then we animate to the resting state - Velocity(domNode, restingStyle, - transitionOpts[i-1]) - .then(() => { - // once we've reached the resting state, hide the element if - // appropriate - domNode.style.visibility = restingStyle.visibility; - }); + setTimeout(() => { + this._applyStyles(domNode, restingStyle); + }, 0); // console.log("enter:", - // JSON.stringify(transitionOpts[i-1]), - // "->", // JSON.stringify(restingStyle)); } this.nodes[k] = node; @@ -128,9 +133,13 @@ export default class Velociraptor extends React.Component { render() { return ( - - { Object.values(this.children) } - + <>{ Object.values(this.children) } ); } } + +function timeout(time) { + return new Promise(resolve => + setTimeout(() => resolve(), time), + ); +} diff --git a/src/VelocityBounce.js b/src/VelocityBounce.js deleted file mode 100644 index ffbf7de829..0000000000 --- a/src/VelocityBounce.js +++ /dev/null @@ -1,17 +0,0 @@ -import Velocity from "velocity-animate"; - -// courtesy of https://github.com/julianshapiro/velocity/issues/283 -// We only use easeOutBounce (easeInBounce is just sort of nonsensical) -function bounce( p ) { - let pow2; - let bounce = 4; - - while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) { - // just sets pow2 - } - return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 ); -} - -Velocity.Easings.easeOutBounce = function(p) { - return 1 - bounce(1 - p); -}; diff --git a/src/components/views/rooms/ReadReceiptMarker.js b/src/components/views/rooms/ReadReceiptMarker.js index 7473aac7cd..cf5abeec63 100644 --- a/src/components/views/rooms/ReadReceiptMarker.js +++ b/src/components/views/rooms/ReadReceiptMarker.js @@ -17,7 +17,6 @@ limitations under the License. import React, {createRef} from 'react'; import PropTypes from 'prop-types'; -import '../../../VelocityBounce'; import { _t } from '../../../languageHandler'; import {formatDate} from '../../../DateUtils'; import Velociraptor from "../../../Velociraptor"; @@ -25,14 +24,6 @@ import * as sdk from "../../../index"; import {toPx} from "../../../utils/units"; import {replaceableComponent} from "../../../utils/replaceableComponent"; -let bounce = false; -try { - if (global.localStorage) { - bounce = global.localStorage.getItem('avatar_bounce') == 'true'; - } -} catch (e) { -} - @replaceableComponent("views.rooms.ReadReceiptMarker") export default class ReadReceiptMarker extends React.PureComponent { static propTypes = { @@ -139,42 +130,18 @@ export default class ReadReceiptMarker extends React.PureComponent { } const startStyles = []; - const enterTransitionOpts = []; if (oldInfo && oldInfo.left) { // start at the old height and in the old h pos - startStyles.push({ top: startTopOffset+"px", left: toPx(oldInfo.left) }); - - const reorderTransitionOpts = { - duration: 100, - easing: 'easeOut', - }; - - enterTransitionOpts.push(reorderTransitionOpts); } - // then shift to the rightmost column, - // and then it will drop down to its resting position - // - // XXX: We use a small left value to trick velocity-animate into actually animating. - // This is a very annoying bug where if it thinks there's no change to `left` then it'll - // skip applying it, thus making our read receipt at +14px instead of +0px like it - // should be. This does cause a tiny amount of drift for read receipts, however with a - // value so small it's not perceived by a user. - // Note: Any smaller values (or trying to interchange units) might cause read receipts to - // fail to fall down or cause gaps. - startStyles.push({ top: startTopOffset+'px', left: '1px' }); - enterTransitionOpts.push({ - duration: bounce ? Math.min(Math.log(Math.abs(startTopOffset)) * 200, 3000) : 300, - easing: bounce ? 'easeOutBounce' : 'easeOutCubic', - }); + startStyles.push({ top: startTopOffset+'px', left: '0' }); this.setState({ suppressDisplay: false, startStyles: startStyles, - enterTransitionOpts: enterTransitionOpts, }); } @@ -211,8 +178,7 @@ export default class ReadReceiptMarker extends React.PureComponent { return ( + startStyles={this.state.startStyles} > Date: Thu, 8 Apr 2021 10:36:38 +0100 Subject: [PATCH 024/154] Animate read receipts for all component updates --- src/components/views/rooms/ReadReceiptMarker.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/components/views/rooms/ReadReceiptMarker.js b/src/components/views/rooms/ReadReceiptMarker.js index cf5abeec63..2820cea7db 100644 --- a/src/components/views/rooms/ReadReceiptMarker.js +++ b/src/components/views/rooms/ReadReceiptMarker.js @@ -106,7 +106,18 @@ export default class ReadReceiptMarker extends React.PureComponent { // we've already done our display - nothing more to do. return; } + this._animateMarker(); + } + componentDidUpdate(prevProps) { + const differentLeftOffset = prevProps.leftOffset !== this.props.leftOffset; + const visibilityChanged = prevProps.hidden !== this.props.hidden; + if (differentLeftOffset || visibilityChanged) { + this._animateMarker(); + } + } + + _animateMarker() { // treat new RRs as though they were off the top of the screen let oldTop = -15; From 1d75726a758a5a43073fdfea8b714051b34c930c Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Thu, 8 Apr 2021 11:05:45 +0100 Subject: [PATCH 025/154] Honour prefers reduced motion for read receipts --- res/css/_common.scss | 10 ++++++++++ res/css/views/rooms/_EventTile.scss | 4 ++-- src/Velociraptor.js | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/res/css/_common.scss b/res/css/_common.scss index 0093bde0ab..0b363edaee 100644 --- a/res/css/_common.scss +++ b/res/css/_common.scss @@ -28,6 +28,16 @@ $MessageTimestamp_width_hover: calc($MessageTimestamp_width - 2 * $EventTile_e2e :root { font-size: 10px; + + --transition-short: .1s; + --transition-standard: .3s; +} + +@media (prefers-reduced-motion) { + :root { + --transition-short: 0; + --transition-standard: 0; + } } html { diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index a82c894ac5..f455931f08 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -284,8 +284,8 @@ $left-gutter: 64px; width: $font-14px; transition: - left .1s ease-out, - top .3s ease-out; + left var(--transition-short) ease-out, + top var(--transition-standard) ease-out; } .mx_EventTile_readAvatarRemainder { diff --git a/src/Velociraptor.js b/src/Velociraptor.js index 4fd9a23c82..c453f56fdb 100644 --- a/src/Velociraptor.js +++ b/src/Velociraptor.js @@ -73,7 +73,7 @@ export default class Velociraptor extends React.Component { } }); - console.log("translation: "+oldNode.style.left+" -> "+c.props.style.left); + // console.log("translation: "+oldNode.style.left+" -> "+c.props.style.left); } if (oldNode && oldNode.style.visibility === 'hidden' && c.props.style.visibility === 'visible') { oldNode.style.visibility = c.props.style.visibility; From bf34e37dcc8ad36c521020e821391520f49176b4 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Thu, 8 Apr 2021 11:43:13 +0100 Subject: [PATCH 026/154] fix hiding read receipts animation --- src/Velociraptor.js | 28 ++----------------- .../views/rooms/ReadReceiptMarker.js | 1 - 2 files changed, 2 insertions(+), 27 deletions(-) diff --git a/src/Velociraptor.js b/src/Velociraptor.js index c453f56fdb..1592f4be06 100644 --- a/src/Velociraptor.js +++ b/src/Velociraptor.js @@ -40,19 +40,12 @@ export default class Velociraptor extends React.Component { * * @param {HTMLElement} node element to apply styles to * @param {object} styles a key/value pair of CSS properties - * @returns {Promise} promise resolving when the applied styles have finished transitioning + * @returns {void} */ _applyStyles(node, styles) { Object.entries(styles).forEach(([property, value]) => { node.style[property] = value; }); - const transitionEndPromise = new Promise(resolve => { - node.addEventListener("transitionend", () => { - resolve(); - }, { once: true }); - }); - - return Promise.race([timeout(300), transitionEndPromise]); } _updateChildren(newChildren) { @@ -64,20 +57,9 @@ export default class Velociraptor extends React.Component { const oldNode = ReactDom.findDOMNode(this.nodes[old.key]); if (oldNode && oldNode.style.left !== c.props.style.left) { - this._applyStyles(oldNode, { left: c.props.style.left }) - .then(() => { - // special case visibility because it's nonsensical to animate an invisible element - // so we always hidden->visible pre-transition and visible->hidden after - if (oldNode.style.visibility === 'visible' && c.props.style.visibility === 'hidden') { - oldNode.style.visibility = c.props.style.visibility; - } - }); - + this._applyStyles(oldNode, { left: c.props.style.left }); // console.log("translation: "+oldNode.style.left+" -> "+c.props.style.left); } - if (oldNode && oldNode.style.visibility === 'hidden' && c.props.style.visibility === 'visible') { - oldNode.style.visibility = c.props.style.visibility; - } // clone the old element with the props (and children) of the new element // so prop updates are still received by the children. this.children[c.key] = React.cloneElement(old, c.props, c.props.children); @@ -137,9 +119,3 @@ export default class Velociraptor extends React.Component { ); } } - -function timeout(time) { - return new Promise(resolve => - setTimeout(() => resolve(), time), - ); -} diff --git a/src/components/views/rooms/ReadReceiptMarker.js b/src/components/views/rooms/ReadReceiptMarker.js index 2820cea7db..e2b95a7ada 100644 --- a/src/components/views/rooms/ReadReceiptMarker.js +++ b/src/components/views/rooms/ReadReceiptMarker.js @@ -165,7 +165,6 @@ export default class ReadReceiptMarker extends React.PureComponent { const style = { left: toPx(this.props.leftOffset), top: '0px', - visibility: this.props.hidden ? 'hidden' : 'visible', }; let title; From 0981b0ce6f0c605924c65ec9ae599ae4a883a704 Mon Sep 17 00:00:00 2001 From: Dan-Philipp Krenn Date: Thu, 8 Apr 2021 13:54:48 +0000 Subject: [PATCH 027/154] Translated using Weblate (German) Currently translated at 98.3% (2868 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index d22b9ebfb7..b5b08f43f4 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2621,7 +2621,7 @@ "Call Paused": "Anruf pausiert", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Verschlüsselte Nachrichten sicher lokal zwischenspeichern, um sie in Suchergebnissen finden zu können. Es werden %(size)s benötigt, um die Nachrichten von %(rooms)s Räumen zu speichern.", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "Verschlüsselte Nachrichten sicher lokal zwischenspeichern, um sie in Suchergebnissen finden zu können. Es werden %(size)s benötigt, um die Nachrichten vom Raum %(rooms)s zu speichern.", - "Only the two of you are in this conversation, unless either of you invites anyone to join.": "Nur ihr zwei seid in dieser Konversation, außer ihr lädt jemanden neues ein.", + "Only the two of you are in this conversation, unless either of you invites anyone to join.": "Nur ihr zwei seid in dieser Konversation, außer ihr ladet jemanden Neues ein.", "This is the beginning of your direct message history with .": "Dies ist der Beginn deiner Direktnachrichten mit .", "Topic: %(topic)s (edit)": "Thema: %(topic)s (ändern)", "Topic: %(topic)s ": "Thema: %(topic)s ", From 3c4eb3514c0ea3fc0155767993a5c1fa226bace4 Mon Sep 17 00:00:00 2001 From: libexus Date: Thu, 8 Apr 2021 11:28:27 +0000 Subject: [PATCH 028/154] Translated using Weblate (German) Currently translated at 98.3% (2868 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index b5b08f43f4..bb7ad2d0f9 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -126,12 +126,12 @@ "Jan": "Jan", "Feb": "Feb", "Mar": "Mrz", - "Apr": "April", + "Apr": "Apr", "May": "Mai", "Jun": "Jun", "Jul": "Jul", "Aug": "Aug", - "Sep": "Sep", + "Sep": "Sept", "Oct": "Okt", "Nov": "Nov", "Dec": "Dez", @@ -582,7 +582,7 @@ "Notify the whole room": "Alle im Raum benachrichtigen", "Room Notification": "Raum-Benachrichtigung", "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "Diese Räume werden Community-Mitgliedern auf der Community-Seite angezeigt. Community-Mitglieder können diesen Räumen beitreten, indem sie diese anklicken.", - "Show these rooms to non-members on the community page and room list?": "Sollen diese Räume öffentlich sichtbar auf der Community-Seite und in der Raum-Liste angezeigt werden?", + "Show these rooms to non-members on the community page and room list?": "Sollen diese Räume öffentlich auf der Community-Seite und in der Raum-Liste angezeigt werden?", "

HTML for your community's page

\n

\n Use the long description to introduce new members to the community, or distribute\n some important links\n

\n

\n You can even use 'img' tags\n

\n": "

HTML für deine Community-Seite

\n

\n Nutze die ausführliche Beschreibung, um neuen Mitgliedern diese Community vorzustellen\n oder um wichtige Links bereitzustellen.\n

\n

\n Du kannst sogar 'img'-Tags (HTML) verwenden\n

\n", "Your community hasn't got a Long Description, a HTML page to show to community members.
Click here to open settings and give it one!": "Deine Community hat noch keine ausführliche Beschreibung, d. h. eine HTML-Seite, die Community-Mitgliedern angezeigt wird.
Hier klicken, um die Einstellungen zu öffnen und eine Beschreibung zu erstellen!", "Enable inline URL previews by default": "URL-Vorschau standardmäßig aktivieren", @@ -632,7 +632,7 @@ "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Du wirst nicht in der Lage sein, die Änderung zurückzusetzen, da du dich degradierst. Wenn du der letze Nutzer mit Berechtigungen bist, wird es unmöglich sein die Privilegien zurückzubekommen.", "Community IDs cannot be empty.": "Community-IDs können nicht leer sein.", "Learn more about how we use analytics.": "Lerne mehr darüber, wie wir die Analysedaten nutzen.", - "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Wenn diese Seite identifizierbare Informationen wie Raum-, Nutzer- oder Gruppen-ID enthält, werden diese Daten entfernt bevor sie an den Server gesendet werden.", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Wenn diese Seite identifizierbare Informationen wie Raum-, Nutzer- oder Gruppen-ID enthält, werden diese Daten entfernt, bevor sie an den Server gesendet werden.", "Which officially provided instance you are using, if any": "Welche offiziell angebotene Instanz du nutzt, wenn überhaupt eine", "In reply to ": "Als Antwort auf ", "This room is not public. You will not be able to rejoin without an invite.": "Dies ist kein öffentlicher Raum. Du wirst diesen nicht ohne Einladung wieder beitreten können.", @@ -1240,7 +1240,7 @@ "The server does not support the room version specified.": "Der Server unterstützt die angegebene Raumversion nicht.", "Warning: Upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "Achtung: Ein Raum-Upgrade wird die Mitglieder des Raumes nicht automatisch auf die neue Version migrieren. Wir werden in der alten Raumversion einen Link zum neuen Raum posten - Raum-Mitglieder müssen dann auf diesen Link klicken um dem neuen Raum beizutreten.", "Replying With Files": "Mit Dateien antworten", - "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Momentan ist es nicht möglich mit einer Datei zu antworten. Möchtest Du die Datei hochladen ohne zu antworten?", + "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Momentan ist es nicht möglich mit einer Datei zu antworten. Möchtest Du die Datei hochladen, ohne zu antworten?", "The file '%(fileName)s' failed to upload.": "Die Datei \"%(fileName)s\" konnte nicht hochgeladen werden.", "Changes your avatar in this current room only": "Ändert deinen Avatar für diesen Raum", "Unbans user with given ID": "Entbannt den Benutzer mit der angegebenen ID", @@ -1328,7 +1328,7 @@ "Find a room…": "Einen Raum suchen…", "Find a room… (e.g. %(exampleRoom)s)": "Einen Raum suchen… (z.B. %(exampleRoom)s)", "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Wenn du den gesuchten Raum nicht finden kannst, frage nach einer Einladung für den Raum oder Erstelle einen neuen Raum.", - "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativ kannst du versuchen, den öffentlichen Server unter turn.matrix.org zu verwenden. Allerdings wird dieser nicht so zuverlässig sein und du teilst deine IP-Adresse mit diesem Server. Du kannst dies auch in den Einstellungen konfigurieren.", + "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativ kannst du versuchen, den öffentlichen Server unter turn.matrix.org zu verwenden. Allerdings wird dieser nicht so zuverlässig sein und du teilst deine IP-Adresse mit dem Server. Du kannst dies auch in den Einstellungen konfigurieren.", "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Diese Handlung erfordert es, auf den Standard-Identitätsserver zuzugreifen, um eine E-Mail Adresse oder Telefonnummer zu validieren, aber der Server hat keine Nutzungsbedingungen.", "Only continue if you trust the owner of the server.": "Fahre nur fort, wenn du den Betreibern des Servers vertraust.", "Trust": "Vertrauen", @@ -1416,8 +1416,8 @@ "View rules": "Regeln öffnen", "You are currently subscribed to:": "Du abonnierst momentan:", "⚠ These settings are meant for advanced users.": "⚠ Diese Einstellungen sind für fortgeschrittene Nutzer gedacht.", - "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Ob du %(brand)s auf einem Gerät verwendest, bei dem das Tasten die primäre Eingabemöglichkeit ist", - "Whether you're using %(brand)s as an installed Progressive Web App": "Ob du %(brand)s als installierte progressive Web-App verwendest", + "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Ob du %(brand)s auf einem Gerät verwendest, bei dem Touch die primäre Eingabemöglichkeit ist", + "Whether you're using %(brand)s as an installed Progressive Web App": "Ob du %(brand)s als installierte progressive Web-App (PWA) verwendest", "Your user agent": "Dein User-Agent", "If you cancel now, you won't complete verifying the other user.": "Wenn Sie jetzt abbrechen, werden Sie die Verifizierung des anderen Nutzers nicht beenden können.", "If you cancel now, you won't complete verifying your other session.": "Wenn Sie jetzt abbrechen, werden Sie die Verifizierung der anderen Sitzung nicht beenden können.", @@ -2540,7 +2540,7 @@ "🎉 All servers are banned from participating! This room can no longer be used.": "🎉 Alle Server sind von der Teilnahme ausgeschlossen! Dieser Raum kann nicht mehr genutzt werden.", "%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s hat die Server-ACLs für diesen Raum geändert.", "%(senderDisplayName)s set the server ACLs for this room.": "%(senderDisplayName)s hat die Server-ACLs für diesen Raum gesetzt.", - "The call was answered on another device.": "Der Anruf wurde an einem anderen Gerät angenommen.", + "The call was answered on another device.": "Der Anruf wurde auf einem anderen Gerät angenommen.", "Answered Elsewhere": "Anderswo beantwortet", "The call could not be established": "Der Anruf kann nicht getätigt werden", "The other party declined the call.": "Die andere Seite hat den Anruf abgelehnt.", @@ -2649,7 +2649,7 @@ "Decline All": "Alles ablehnen", "Go to Home View": "Zur Startseite gehen", "Filter rooms and people": "Räume und Personen filtern", - "%(creator)s created this DM.": "%(creator)s hat diese DM erstellt.", + "%(creator)s created this DM.": "%(creator)s hat diese Direktnachricht erstellt.", "Now, let's help you get started": "Nun, lassen Sie uns Ihnen den Einstieg erleichtern", "Welcome %(name)s": "Willkommen %(name)s", "Add a photo so people know it's you.": "Fügen Sie ein Foto hinzu, damit die Leute wissen, dass Sie es sind.", @@ -3204,5 +3204,6 @@ "Don't want to add an existing room?": "Willst du keinen existierenden Raum hinzufügen?", "Edit devices": "Sitzungen anzeigen", "Your private space ": "Dein privater Space ", - "Your public space ": "Dein öffentlicher Space " + "Your public space ": "Dein öffentlicher Space ", + "Quick actions": "Schnellaktionen" } From a5743489cb0cc244937706a1e697b3db27bed6aa Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Thu, 8 Apr 2021 11:21:01 +0000 Subject: [PATCH 029/154] Translated using Weblate (German) Currently translated at 98.3% (2868 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index bb7ad2d0f9..675c27c9a3 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -776,7 +776,7 @@ "Failed to change settings": "Einstellungen konnten nicht geändert werden", "View Community": "Community ansehen", "Event sent!": "Event gesendet!", - "View Source": "Quellcode ansehen", + "View Source": "Rohdaten anzeigen", "Event Content": "Event-Inhalt", "Thank you!": "Danke!", "Uploaded on %(date)s by %(user)s": "Hochgeladen: %(date)s von %(user)s", @@ -1461,7 +1461,7 @@ "If your other sessions do not have the key for this message you will not be able to decrypt them.": "Wenn deine anderen Sitzungen nicht über den Schlüssel für diese Nachricht verfügen, kannst du die Nachricht nicht entschlüsseln.", "Re-request encryption keys from your other sessions.": "Fordere die Schlüssel aus deinen anderen Sitzungen erneut an.", "Room %(name)s": "Raum %(name)s", - "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Ein Upgrade dieses Raums schaltet die aktuelle Instanz des Raums ab und erstellt einen aktualisierten Raum mit demselben Namen.", + "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Ein Upgrade dieses Raums deaktiviert die aktuelle Instanz des Raums und erstellt einen aktualisierten Raum mit demselben Namen.", "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) hat sich zu einer neuen Sitzung angemeldet, ohne sie zu verifizieren:", "%(count)s verified sessions|other": "%(count)s verifizierte Sitzungen", "Hide verified sessions": "Verifizierte Sitzungen ausblenden", @@ -2659,7 +2659,7 @@ "Enter email address": "E-Mail-Adresse eingeben", "Open the link in the email to continue registration.": "Öffnen Sie den Link in der E-Mail, um mit der Registrierung fortzufahren.", "A confirmation email has been sent to %(emailAddress)s": "Eine Bestätigungs-E-Mail wurde an %(emailAddress)s gesendet", - "Use the + to make a new room or explore existing ones below": "Benutze das + um einen neuen Raum zu erstellen oder darunter um existierende Räume zu suchen", + "Use the + to make a new room or explore existing ones below": "Benutze das + um einen neuen Raum zu erstellen oder um existierende Räume zu entdecken", "Return to call": "Zurück zum Anruf", "Fill Screen": "Bildschirm ausfüllen", "Voice Call": "Sprachanruf", @@ -3205,5 +3205,25 @@ "Edit devices": "Sitzungen anzeigen", "Your private space ": "Dein privater Space ", "Your public space ": "Dein öffentlicher Space ", - "Quick actions": "Schnellaktionen" + "Quick actions": "Schnellaktionen", + "We couldn't create your DM.": "Wir konnten deine Direktnachricht nicht erstellen.", + "Adding...": "Hinzufügen...", + "Add existing rooms": "Bestehende Räume hinzufügen", + "Space selection": "Matrix-Space-Auswahl", + "%(count)s people you know have already joined|one": "%(count)s Person, die du kennst, ist schon beigetreten", + "%(count)s people you know have already joined|other": "%(count)s Leute, die du kennst, sind bereits beigetreten", + "Accept on your other login…": "Akzeptiere in deiner anderen Anmeldung…", + "Stop & send recording": "Stoppen und Aufzeichnung senden", + "Record a voice message": "Eine Sprachnachricht aufnehmen", + "Invite messages are hidden by default. Click to show the message.": "Einladungsnachrichten sind standardmäßig ausgeblendet. Klicken um diese anzuzeigen.", + "Warn before quitting": "Vor Beenden warnen", + "Spell check dictionaries": "Wörterbücher für Rechtschreibprüfung", + "Space options": "Matrix-Space-Optionen", + "Manage & explore rooms": "Räume entdecken und verwalten", + "unknown person": "unbekannte Person", + "Send and receive voice messages (in development)": "Sprachnachrichten senden und empfangen (in der Entwicklung)", + "Check your devices": "Überprüfe dein Gerät", + "%(deviceId)s from %(ip)s": "%(deviceId)s von %(ip)s", + "This homeserver has been blocked by it's administrator.": "Dieser Heimserver wurde von seiner Administration blockiert.", + "You have unverified logins": "Du hast nicht-bestätigte Anmeldungen" } From 00ad860bd0083a21f19cd145cbbd6760871f85d2 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 10 Apr 2021 04:58:54 +0000 Subject: [PATCH 030/154] Translated using Weblate (English (United States)) Currently translated at 20.0% (585 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/en_US/ --- src/i18n/strings/en_US.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index a1275fb089..baabce2fe7 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -650,5 +650,7 @@ "Error upgrading room": "Error upgrading room", "Double check that your server supports the room version chosen and try again.": "Double check that your server supports the room version chosen and try again.", "Changes the avatar of the current room": "Changes the avatar of the current room", - "Changes your avatar in all rooms": "Changes your avatar in all rooms" + "Changes your avatar in all rooms": "Changes your avatar in all rooms", + "Favourited": "Favorited", + "Explore rooms": "Explore rooms" } From b9ff02c5a5031f0f6c4d9f590c0cd3cd0dc948fd Mon Sep 17 00:00:00 2001 From: Qt Resynth Date: Sat, 10 Apr 2021 03:39:14 +0000 Subject: [PATCH 031/154] Translated using Weblate (English (United States)) Currently translated at 20.0% (585 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/en_US/ --- src/i18n/strings/en_US.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index baabce2fe7..7be8e8fa9e 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -652,5 +652,9 @@ "Changes the avatar of the current room": "Changes the avatar of the current room", "Changes your avatar in all rooms": "Changes your avatar in all rooms", "Favourited": "Favorited", - "Explore rooms": "Explore rooms" + "Explore rooms": "Explore rooms", + "Click the button below to confirm adding this email address.": "Click the button below to confirm adding this email address.", + "Confirm adding email": "Confirm adding email", + "Single Sign On": "Single Sign On", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Confirm adding this email address by using Single Sign On to prove your identity." } From bc250bbffbef087384dc8a7aa8355483972ea891 Mon Sep 17 00:00:00 2001 From: jeiannueva Date: Sat, 10 Apr 2021 03:38:54 +0000 Subject: [PATCH 032/154] Translated using Weblate (English (United States)) Currently translated at 20.0% (585 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/en_US/ --- src/i18n/strings/en_US.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index 7be8e8fa9e..003da7ef8f 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -656,5 +656,6 @@ "Click the button below to confirm adding this email address.": "Click the button below to confirm adding this email address.", "Confirm adding email": "Confirm adding email", "Single Sign On": "Single Sign On", - "Confirm adding this email address by using Single Sign On to prove your identity.": "Confirm adding this email address by using Single Sign On to prove your identity." + "Confirm adding this email address by using Single Sign On to prove your identity.": "Confirm adding this email address by using Single Sign On to prove your identity.", + "Use Single Sign On to continue": "Use Single Sign On to continue" } From 457139f59097e570eefe4d22f94408a28dfd7d58 Mon Sep 17 00:00:00 2001 From: jelv Date: Wed, 7 Apr 2021 19:53:05 +0000 Subject: [PATCH 033/154] Translated using Weblate (Dutch) Currently translated at 100.0% (2917 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nl/ --- src/i18n/strings/nl.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index f1c48cc539..de98a878e8 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -198,7 +198,7 @@ "Join Room": "Gesprek toetreden", "%(targetName)s joined the room.": "%(targetName)s is tot het gesprek toegetreden.", "Jump to first unread message.": "Spring naar het eerste ongelezen bericht.", - "Labs": "Experimenteel", + "Labs": "Labs", "Last seen": "Laatst gezien", "Leave room": "Gesprek verlaten", "%(targetName)s left the room.": "%(targetName)s heeft het gesprek verlaten.", @@ -1758,7 +1758,7 @@ "Cancelling…": "Bezig met annuleren…", "%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with search components added.": "In %(brand)s ontbreken enige modulen vereist voor het veilig lokaal bewaren van versleutelde berichten. Wilt u deze functie uittesten, compileer dan een aangepaste versie van %(brand)s Desktop die de zoekmodulen bevat.", "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Deze sessie maakt geen back-ups van uw sleutels, maar u beschikt over een reeds bestaande back-up waaruit u kunt herstellen en waaraan u nieuwe sleutels vanaf nu kunt toevoegen.", - "Customise your experience with experimental labs features. Learn more.": "Personaliseer uw ervaring met experimentele functies. Klik hier voor meer informatie.", + "Customise your experience with experimental labs features. Learn more.": "Personaliseer uw ervaring met experimentele labs functies. Lees verder.", "Cross-signing": "Kruiselings ondertekenen", "Your key share request has been sent - please check your other sessions for key share requests.": "Uw sleuteldeelverzoek is verstuurd - controleer de sleuteldeelverzoeken op uw andere sessies.", "Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Sleuteldeelverzoeken worden automatisch naar andere sessies verstuurd. Als u op uw andere sessies het sleuteldeelverzoek geweigerd of genegeerd hebt, kunt u hier klikken op de sleutels voor deze sessie opnieuw aan te vragen.", From 32ae074ddff7a7536cdb9d8840d8f9c3d1e102d1 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 8 Apr 2021 06:34:20 +0000 Subject: [PATCH 034/154] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2917 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 39 ++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 33abcfe74e..c9bb9bb2d7 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -3251,5 +3251,42 @@ "From %(deviceName)s (%(deviceId)s) at %(ip)s": "從 %(deviceName)s (%(deviceId)s) 於 %(ip)s", "Check your devices": "檢查您的裝置", "A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "新登入正在存取您的帳號:%(name)s (%(deviceID)s) 於 %(ip)s", - "You have unverified logins": "您有未驗證的登入" + "You have unverified logins": "您有未驗證的登入", + "unknown person": "不明身份的人", + "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "與 %(transferTarget)s 進行協商。轉讓至 %(transferee)s", + "Message search initilisation failed": "訊息搜尋初始化失敗", + "Invite to just this room": "邀請到此聊天室", + "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "如果這樣做,請注意,您的任何訊息都不會被刪除,但是在重新建立索引的同時,搜索體驗可能會降低片刻", + "Let's create a room for each of them.": "讓我們為每個主題建立一個聊天室吧。", + "Verify your identity to access encrypted messages and prove your identity to others.": "驗證您的身份來存取已加密的訊息並對其他人證明您的身份。", + "Sends the given message as a spoiler": "將指定訊息以劇透傳送", + "Review to ensure your account is safe": "請審閱以確保您的帳號安全", + "%(deviceId)s from %(ip)s": "從 %(ip)s 而來的 %(deviceId)s", + "Send and receive voice messages (in development)": "傳送與接收語音訊息(開發中)", + "Share decryption keys for room history when inviting users": "邀請使用者時分享聊天室歷史紀錄的解密金鑰", + "Manage & explore rooms": "管理與探索聊天室", + "Warn before quitting": "離開前警告", + "Quick actions": "快速動作", + "Invite messages are hidden by default. Click to show the message.": "邀請訊息預設隱藏。點擊以顯示訊息。", + "Record a voice message": "錄製語音訊息", + "Stop & send recording": "停止並傳送錄音", + "Accept on your other login…": "接受您的其他登入……", + "%(count)s people you know have already joined|other": "%(count)s 個您認識的人已加入", + "%(count)s people you know have already joined|one": "%(count)s 個您認識的人已加入", + "Add existing rooms": "新增既有聊天室", + "Adding...": "正在新增……", + "We couldn't create your DM.": "我們無法建立您的直接訊息。", + "Invited people will be able to read old messages.": "被邀請的人將能閱讀舊訊息。", + "Consult first": "先協商", + "Reset event store?": "重設活動儲存?", + "You most likely do not want to reset your event index store": "您很可能不想重設您的活動索引儲存", + "Reset event store": "重設活動儲存", + "Verify other login": "驗證其他登入", + "Avatar": "大頭貼", + "Verification requested": "已請求驗證", + "What are some things you want to discuss in %(spaceName)s?": "您想在 %(spaceName)s 中討論什麼?", + "You can add more later too, including already existing ones.": "您稍後可以新增更多內容,包含既有的。", + "Please choose a strong password": "請選擇強密碼", + "Use another login": "使用其他登入", + "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "未經驗證,您將無法存取您的所有訊息,且可能不被其他人信任。" } From 56635ce026bea64cccfb30a2fcc1b64519b2ebc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20L=C3=B8vbr=C3=B8tte=20Olsen?= Date: Wed, 7 Apr 2021 16:46:10 +0000 Subject: [PATCH 035/154] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 48.3% (1411 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nb_NO/ --- src/i18n/strings/nb_NO.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index 9fe5efddbb..9253f74fab 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -1508,7 +1508,7 @@ "End conference": "Avslutt konferanse", "You're already in a call with this person.": "Du er allerede i en samtale med denne personen.", "Already in call": "Allerede i en samtale", - "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Er du sikkert på at du vil fjerne '%(roomName)s' fra %(groupId)s?", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Er du sikke på at du vil fjerne '%(roomName)s' fra %(groupId)s?", "Burundi": "Burundi", "Burkina Faso": "Burkina Faso", "Bulgaria": "Bulgaria", @@ -1541,14 +1541,14 @@ "Åland Islands": "Åland", "Afghanistan": "Afghanistan", "United Kingdom": "Storbritannia", - "Your homeserver was unreachable and was not able to log you in. Please try again. If this continues, please contact your homeserver administrator.": "Din hjemmeserver kunne ikke nås, og kan derfor ikke logge deg inn. Vennligst prøv igjen. Hvis dette fortsetter, kontakt administratoren til din hjemmeserver", + "Your homeserver was unreachable and was not able to log you in. Please try again. If this continues, please contact your homeserver administrator.": "Din hjemmeserver kunne ikke nås, og kan derfor ikke logge deg inn. Vennligst prøv igjen. Hvis dette fortsetter, kontakt administratoren til din hjemmeserver.", "Only continue if you trust the owner of the server.": "Fortsett kun om du stoler på eieren av serveren.", "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Denne handlingen krever tilgang til standard identitetsserver for å kunne validere en epostaddresse eller telefonnummer, men serveren har ikke bruksvilkår.", "Too Many Calls": "For mange samtaler", "Call failed because webcam or microphone could not be accessed. Check that:": "Samtalen mislyktes fordi du fikk ikke tilgang til webkamera eller mikrofon. Sørg for at:", "Unable to access webcam / microphone": "Ingen tilgang til webkamera / mikrofon", "The call was answered on another device.": "Samtalen ble besvart på en annen enhet.", - "The call could not be established": "Samtalen kunne ikke etableres.", + "The call could not be established": "Samtalen kunne ikke etableres", "The other party declined the call.": "Den andre parten avviste samtalen.", "Call Declined": "Samtale avvist", "Click the button below to confirm adding this phone number.": "Klikk knappen nedenfor for å bekrefte dette telefonnummeret.", From 98cd0c2b4bcfef8f32c414be1950f31c604197e0 Mon Sep 17 00:00:00 2001 From: random Date: Thu, 8 Apr 2021 13:18:54 +0000 Subject: [PATCH 036/154] Translated using Weblate (Italian) Currently translated at 100.0% (2917 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 229b769c18..2d0edb77e6 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -3248,5 +3248,42 @@ "Check your devices": "Controlla i tuoi dispositivi", "A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Una nuova sessione sta accedendo al tuo account: %(name)s (%(deviceID)s) al %(ip)s", "You have unverified logins": "Hai accessi non verificati", - "Open": "Apri" + "Open": "Apri", + "Send and receive voice messages (in development)": "Invia e ricevi messaggi vocali (in sviluppo)", + "unknown person": "persona sconosciuta", + "Sends the given message as a spoiler": "Invia il messaggio come spoiler", + "Review to ensure your account is safe": "Controlla per assicurarti che l'account sia sicuro", + "%(deviceId)s from %(ip)s": "%(deviceId)s da %(ip)s", + "Share decryption keys for room history when inviting users": "Condividi le chiavi di decifrazione della cronologia della stanza quando inviti utenti", + "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Consultazione con %(transferTarget)s. Trasferisci a %(transferee)s", + "Manage & explore rooms": "Gestisci ed esplora le stanze", + "Invite to just this room": "Invita solo in questa stanza", + "%(count)s people you know have already joined|other": "%(count)s persone che conosci sono già entrate", + "%(count)s people you know have already joined|one": "%(count)s persona che conosci è già entrata", + "Message search initilisation failed": "Inizializzazione ricerca messaggi fallita", + "Add existing rooms": "Aggiungi stanze esistenti", + "Warn before quitting": "Avvisa prima di uscire", + "Invited people will be able to read old messages.": "Le persone invitate potranno leggere i vecchi messaggi.", + "You most likely do not want to reset your event index store": "Probabilmente non hai bisogno di reinizializzare il tuo archivio indice degli eventi", + "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Se lo fai, ricorda che nessuno dei tuoi messaggi verrà eliminato, ma l'esperienza di ricerca potrà peggiorare per qualche momento mentre l'indice viene ricreato", + "Avatar": "Avatar", + "Verification requested": "Verifica richiesta", + "What are some things you want to discuss in %(spaceName)s?": "Quali sono le cose di cui vuoi discutere in %(spaceName)s?", + "Please choose a strong password": "Scegli una password robusta", + "Quick actions": "Azioni rapide", + "Invite messages are hidden by default. Click to show the message.": "I messaggi di invito sono nascosti in modo predefinito. Clicca per mostrare il messaggio.", + "Record a voice message": "Registra un messaggio vocale", + "Stop & send recording": "Ferma e invia la registrazione", + "Accept on your other login…": "Accetta nella tua altra sessione…", + "Adding...": "Aggiunta...", + "We couldn't create your DM.": "Non abbiamo potuto creare il tuo messaggio diretto.", + "Consult first": "Prima consulta", + "Reset event store?": "Reinizializzare l'archivio eventi?", + "Reset event store": "Reinizializza archivio eventi", + "Verify other login": "Verifica l'altra sessione", + "Let's create a room for each of them.": "Creiamo una stanza per ognuno di essi.", + "You can add more later too, including already existing ones.": "Puoi aggiungerne anche altri in seguito, inclusi quelli già esistenti.", + "Use another login": "Usa un altro accesso", + "Verify your identity to access encrypted messages and prove your identity to others.": "Verifica la tua identità per accedere ai messaggi cifrati e provare agli altri che sei tu.", + "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Senza la verifica, non avrai accesso a tutti i tuoi messaggi e potresti apparire agli altri come non fidato." } From 6e4b55ed673c42f97ff72120c239318b4ce61ce0 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Thu, 8 Apr 2021 17:18:21 +0000 Subject: [PATCH 037/154] Translated using Weblate (Czech) Currently translated at 100.0% (2917 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index b03bd6a2b5..7f9ff9341c 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -3165,5 +3165,42 @@ "Edit devices": "Upravit zařízení", "Check your devices": "Zkontrolujte svá zařízení", "You have unverified logins": "Máte neověřená přihlášení", - "Open": "Otevřít" + "Open": "Otevřít", + "Share decryption keys for room history when inviting users": "Při pozvání uživatelů sdílet dešifrovací klíče pro historii místnosti", + "Manage & explore rooms": "Spravovat a prozkoumat místnosti", + "Message search initilisation failed": "Inicializace vyhledávání zpráv se nezdařila", + "%(count)s people you know have already joined|one": "%(count)s osoba, kterou znáte, se již připojila", + "Invited people will be able to read old messages.": "Pozvaní lidé budou moci číst staré zprávy.", + "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Pokud tak učiníte, nezapomeňte, že žádná z vašich zpráv nebude smazána, ale vyhledávání může být na několik okamžiků degradováno, zatímco index bude znovu vytvářen", + "You can add more later too, including already existing ones.": "Později můžete přidat i další, včetně již existujících.", + "Verify your identity to access encrypted messages and prove your identity to others.": "Ověřte svou identitu, abyste získali přístup k šifrovaným zprávám a prokázali svou identitu ostatním.", + "Sends the given message as a spoiler": "Odešle danou zprávu jako spoiler", + "Review to ensure your account is safe": "Zkontrolujte, zda je váš účet v bezpečí", + "%(deviceId)s from %(ip)s": "%(deviceId)s z %(ip)s", + "Send and receive voice messages (in development)": "Odesílat a přijímat hlasové zprávy (ve vývoji)", + "unknown person": "neznámá osoba", + "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Konzultace s %(transferTarget)s. Převod na %(transferee)s", + "Warn before quitting": "Varovat před ukončením", + "Invite to just this room": "Pozvat jen do této místnosti", + "Quick actions": "Rychlé akce", + "Invite messages are hidden by default. Click to show the message.": "Zprávy s pozvánkou jsou ve výchozím nastavení skryté. Kliknutím zobrazíte zprávu.", + "Record a voice message": "Nahrát hlasovou zprávu", + "Stop & send recording": "Zastavit a odeslat záznam", + "Accept on your other login…": "Přijměte ve svém dalším přihlášení…", + "%(count)s people you know have already joined|other": "%(count)s lidí, které znáte, se již připojili", + "Add existing rooms": "Přidat stávající místnosti", + "Adding...": "Přidávání...", + "We couldn't create your DM.": "Nemohli jsme vytvořit vaši přímou zprávu.", + "Consult first": "Nejprve se poraďte", + "You most likely do not want to reset your event index store": "Pravděpodobně nechcete resetovat úložiště indexů událostí", + "Reset event store": "Resetovat úložiště událostí", + "Reset event store?": "Resetovat úložiště událostí?", + "Verify other login": "Ověřit další přihlášení", + "Avatar": "Avatar", + "Verification requested": "Žádost ověření", + "Please choose a strong password": "Vyberte silné heslo", + "What are some things you want to discuss in %(spaceName)s?": "O kterých tématech chcete diskutovat v %(spaceName)s?", + "Let's create a room for each of them.": "Vytvořme pro každé z nich místnost.", + "Use another login": "Použijte jiné přihlašovací jméno", + "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Bez ověření nebudete mít přístup ke všem svým zprávám a ostatním se můžete zobrazit jako nedůvěryhodný." } From f34d4b95dcfbe7e13a498b7cabfe8a93af29380d Mon Sep 17 00:00:00 2001 From: XoseM Date: Thu, 8 Apr 2021 04:37:24 +0000 Subject: [PATCH 038/154] Translated using Weblate (Galician) Currently translated at 100.0% (2917 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 026207030e..f6ebce684f 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -3248,5 +3248,42 @@ "From %(deviceName)s (%(deviceId)s) at %(ip)s": "Desde %(deviceName)s%(deviceId)s en %(ip)s", "Check your devices": "Comproba os teus dispositivos", "A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Hai unha nova conexión á túa conta: %(name)s %(deviceID)s desde %(ip)s", - "You have unverified logins": "Tes conexións sen verificar" + "You have unverified logins": "Tes conexións sen verificar", + "Sends the given message as a spoiler": "Envía a mensaxe dada como un spoiler", + "Review to ensure your account is safe": "Revisa para asegurarte de que a túa conta está protexida", + "Share decryption keys for room history when inviting users": "Comparte chaves de descifrado para o historial da sala ao convidar usuarias", + "Warn before quitting": "Aviso antes de saír", + "Invite to just this room": "Convida só a esta sala", + "Stop & send recording": "Deter e enviar e a gravación", + "We couldn't create your DM.": "Non puidemos crear o teu MD.", + "Invited people will be able to read old messages.": "As persoas convidadas poderán ler as mensaxes antigas.", + "Reset event store?": "Restablecer almacenaxe do evento?", + "You most likely do not want to reset your event index store": "Probablemente non queiras restablecer o índice de almacenaxe do evento", + "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Se o fas, ten en conta que ningunha das mensaxes será eliminada, pero a experiencia de busca podería degradarse durante o tempo en que o índice volve a crearse", + "Avatar": "Avatar", + "Please choose a strong password": "Escolle un contrasinal forte", + "Verify your identity to access encrypted messages and prove your identity to others.": "Verifica a túa identidade para acceder a mensaxes cifradas e acreditar a túa identidade ante outras.", + "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Sen verificación, non terás acceso a tódalas túas mensaxes e poderías aparecer antes outras como non confiable.", + "%(deviceId)s from %(ip)s": "%(deviceId)s desde %(ip)s", + "Send and receive voice messages (in development)": "Enviar e recibir mensaxes de voz (en desenvolvemento)", + "unknown person": "persoa descoñecida", + "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Consultando con %(transferTarget)s. Transferir a %(transferee)s", + "Manage & explore rooms": "Xestionar e explorar salas", + "Message search initilisation failed": "Fallo a inicialización da busca de mensaxes", + "Quick actions": "Accións rápidas", + "Invite messages are hidden by default. Click to show the message.": "As mensaxes de convite están agochadas por defecto. Preme para amosar a mensaxe.", + "Record a voice message": "Gravar mensaxe de voz", + "Accept on your other login…": "Acepta na túa outra sesión…", + "%(count)s people you know have already joined|other": "%(count)s persoas que coñeces xa se uniron", + "%(count)s people you know have already joined|one": "%(count)s persoa que coñeces xa se uniu", + "Add existing rooms": "Engadir salas existentes", + "Adding...": "Engadindo...", + "Consult first": "Preguntar primeiro", + "Reset event store": "Restablecer almacenaxe de eventos", + "Verify other login": "Verificar outra conexión", + "Verification requested": "Verificación solicitada", + "What are some things you want to discuss in %(spaceName)s?": "Sobre que temas queres conversar en %(spaceName)s?", + "Let's create a room for each of them.": "Crea unha sala para cada un deles.", + "You can add more later too, including already existing ones.": "Podes engadir máis posteriormente, incluíndo os xa existentes.", + "Use another login": "Usar outra conexión" } From 460650ea7cd25fdcb4c4110e96ae83abbed81a32 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 10 Apr 2021 07:31:42 +0000 Subject: [PATCH 039/154] Translated using Weblate (Hebrew) Currently translated at 92.4% (2696 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/he/ --- src/i18n/strings/he.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index dda9902e72..5baa1d7c67 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -52,7 +52,7 @@ "Operation failed": "פעולה נכשלה", "Search": "חפש", "Custom Server Options": "הגדרות שרת מותאמות אישית", - "Dismiss": "שחרר", + "Dismiss": "התעלם", "powered by Matrix": "מופעל ע\"י Matrix", "Error": "שגיאה", "Remove": "הסר", From 3879a7449d33a12f2f5286d1a130cf171c977261 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 11 Apr 2021 02:02:14 +0000 Subject: [PATCH 040/154] Translated using Weblate (Croatian) Currently translated at 0.2% (7 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hr/ --- src/i18n/strings/hr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hr.json b/src/i18n/strings/hr.json index 527b86e0a7..2511771578 100644 --- a/src/i18n/strings/hr.json +++ b/src/i18n/strings/hr.json @@ -4,5 +4,6 @@ "Failed to verify email address: make sure you clicked the link in the email": "Nismo u mogućnosti verificirati Vašu email adresu. Provjerite dali ste kliknuli link u mailu", "The platform you're on": "Platforma na kojoj se nalazite", "The version of %(brand)s": "Verzija %(brand)s", - "Your language of choice": "Izabrani jezik" + "Your language of choice": "Izabrani jezik", + "Dismiss": "Odbaci" } From 3fd32698f61c3c1b805845b06eb507c4552d75b7 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 11 Apr 2021 02:31:40 +0000 Subject: [PATCH 041/154] Translated using Weblate (Vietnamese) Currently translated at 9.8% (286 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/vi/ --- src/i18n/strings/vi.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/vi.json b/src/i18n/strings/vi.json index 744310675c..eebbaef3d0 100644 --- a/src/i18n/strings/vi.json +++ b/src/i18n/strings/vi.json @@ -293,5 +293,7 @@ "Enable URL previews by default for participants in this room": "Bật mặc định xem trước nội dung đường link cho mọi người trong phòng", "Room Colour": "Màu phòng chat", "Enable widget screenshots on supported widgets": "Bật widget chụp màn hình cho các widget có hỗ trợ", - "Sign In": "Đăng nhập" + "Sign In": "Đăng nhập", + "Explore rooms": "Khám phá phòng chat", + "Create Account": "Tạo tài khoản" } From a5a91f015ec1aae2977bf4732b9c489b88b67069 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 10 Apr 2021 12:40:56 +0000 Subject: [PATCH 042/154] Translated using Weblate (Arabic) Currently translated at 51.4% (1502 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ar/ --- src/i18n/strings/ar.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ar.json b/src/i18n/strings/ar.json index 67b5426d09..cc63995e0f 100644 --- a/src/i18n/strings/ar.json +++ b/src/i18n/strings/ar.json @@ -1551,5 +1551,6 @@ "You've reached the maximum number of simultaneous calls.": "لقد وصلت للحد الاقصى من المكالمات المتزامنة.", "Too Many Calls": "مكالمات كثيرة جدا", "Call failed because webcam or microphone could not be accessed. Check that:": "فشلت المكالمة لعدم امكانية الوصل للميكروفون او الكاميرا , من فضلك قم بالتأكد.", - "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "فشلت المكالمة لعدم امكانية الوصل للميكروفون , تأكد من ان المكروفون متصل وتم اعداده بشكل صحيح." + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "فشلت المكالمة لعدم امكانية الوصل للميكروفون , تأكد من ان المكروفون متصل وتم اعداده بشكل صحيح.", + "Explore rooms": "استكشِف الغرف" } From dda0d56b7a57fe9621dfc106bf3907f98a157fb2 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 11 Apr 2021 02:15:24 +0000 Subject: [PATCH 043/154] Translated using Weblate (West Flemish) Currently translated at 44.7% (1306 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/vls/ --- src/i18n/strings/vls.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/vls.json b/src/i18n/strings/vls.json index 1172804efa..75ab903ebe 100644 --- a/src/i18n/strings/vls.json +++ b/src/i18n/strings/vls.json @@ -1443,5 +1443,7 @@ "Terms of service not accepted or the identity server is invalid.": "Dienstvoorwoardn nie anveird, of den identiteitsserver is oungeldig.", "Enter a new identity server": "Gift e nieuwen identiteitsserver in", "Remove %(email)s?": "%(email)s verwydern?", - "Remove %(phone)s?": "%(phone)s verwydern?" + "Remove %(phone)s?": "%(phone)s verwydern?", + "Explore rooms": "Gesprekkn ountdekkn", + "Create Account": "Account anmoakn" } From 4f5ee0896c20ab69cf89017a2cc9713a63976ed7 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 10 Apr 2021 18:01:48 +0000 Subject: [PATCH 044/154] Translated using Weblate (Polish) Currently translated at 72.3% (2110 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pl/ --- src/i18n/strings/pl.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 9fa9c7555e..ab9a478446 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -1277,8 +1277,8 @@ "Enable desktop notifications for this session": "Włącz powiadomienia na pulpicie dla tej sesji", "Enable audible notifications for this session": "Włącz powiadomienia dźwiękowe dla tej sesji", "Direct Messages": "Wiadomości bezpośrednie", - "Create Account": "Utwórz konto", - "Sign In": "Zaloguj się", + "Create Account": "Stwórz konto", + "Sign In": "Zaloguj", "a few seconds ago": "kilka sekund temu", "%(num)s minutes ago": "%(num)s minut temu", "%(num)s hours ago": "%(num)s godzin temu", From cde8fa7ac9e59c0278cd2bebea6b9b74ef7ff35b Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 11 Apr 2021 01:00:51 +0000 Subject: [PATCH 045/154] Translated using Weblate (Azerbaijani) Currently translated at 12.2% (357 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/az/ --- src/i18n/strings/az.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/az.json b/src/i18n/strings/az.json index 5a8dec76f0..987cef73b2 100644 --- a/src/i18n/strings/az.json +++ b/src/i18n/strings/az.json @@ -380,5 +380,8 @@ "%(senderDisplayName)s disabled flair for %(groups)s in this room.": "Bu otaqda %(groups)s üçün %(senderDisplayName)s aktiv oldu.", "powered by Matrix": "Matrix tərəfindən təchiz edilmişdir", "Custom Server Options": "Fərdi Server Seçimləri", - "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "Bu otaqda %(newGroups)s üçün aktiv və %(oldGroups)s üçün %(senderDisplayName)s deaktiv oldu." + "%(senderDisplayName)s enabled flair for %(newGroups)s and disabled flair for %(oldGroups)s in this room.": "Bu otaqda %(newGroups)s üçün aktiv və %(oldGroups)s üçün %(senderDisplayName)s deaktiv oldu.", + "Create Account": "Hesab Aç", + "Explore rooms": "Otaqları kəşf edin", + "Sign In": "Daxil ol" } From 9dd7e0f4bf44024f58da801b16ce8c2dbe0c9d73 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 11 Apr 2021 01:22:19 +0000 Subject: [PATCH 046/154] Translated using Weblate (Tamil) Currently translated at 5.5% (162 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ta/ --- src/i18n/strings/ta.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ta.json b/src/i18n/strings/ta.json index 9cb046ed39..4f87230ef3 100644 --- a/src/i18n/strings/ta.json +++ b/src/i18n/strings/ta.json @@ -179,5 +179,7 @@ "Mar": "மார்ச்", "Apr": "ஏப்ரல்", "May": "மே", - "Jun": "ஜூன்" + "Jun": "ஜூன்", + "Explore rooms": "அறைகளை ஆராயுங்கள்", + "Create Account": "உங்கள் கணக்கை துவங்குங்கள்" } From 8d45a7b463cefe07f8c5ecbf77311ea3d2872b6c Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 10 Apr 2021 08:27:00 +0000 Subject: [PATCH 047/154] Translated using Weblate (Malayalam) Currently translated at 3.8% (111 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ml/ --- src/i18n/strings/ml.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ml.json b/src/i18n/strings/ml.json index 23740fefda..6183fe7de2 100644 --- a/src/i18n/strings/ml.json +++ b/src/i18n/strings/ml.json @@ -127,5 +127,8 @@ "Failed to change settings": "സജ്ജീകരണങ്ങള്‍ മാറ്റുന്നവാന്‍ സാധിച്ചില്ല", "View Source": "സോഴ്സ് കാണുക", "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "നിങ്ങളുടെ ഇപ്പോളത്തെ ബ്രൌസര്‍ റയട്ട് പ്രവര്‍ത്തിപ്പിക്കാന്‍ പൂര്‍ണമായും പര്യാപത്മല്ല. പല ഫീച്ചറുകളും പ്രവര്‍ത്തിക്കാതെയിരിക്കാം. ഈ ബ്രൌസര്‍ തന്നെ ഉപയോഗിക്കണമെങ്കില്‍ മുന്നോട്ട് പോകാം. പക്ഷേ നിങ്ങള്‍ നേരിടുന്ന പ്രശ്നങ്ങള്‍ നിങ്ങളുടെ ഉത്തരവാദിത്തത്തില്‍ ആയിരിക്കും!", - "Checking for an update...": "അപ്ഡേറ്റ് ഉണ്ടോ എന്ന് തിരയുന്നു..." + "Checking for an update...": "അപ്ഡേറ്റ് ഉണ്ടോ എന്ന് തിരയുന്നു...", + "Explore rooms": "മുറികൾ കണ്ടെത്തുക", + "Sign In": "പ്രവേശിക്കുക", + "Create Account": "അക്കൗണ്ട് സൃഷ്ടിക്കുക" } From 256caed209a097541c31a0ddedb38b5a0d3d962d Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 11 Apr 2021 02:56:25 +0000 Subject: [PATCH 048/154] Translated using Weblate (Occitan) Currently translated at 11.1% (325 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/oc/ --- src/i18n/strings/oc.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/oc.json b/src/i18n/strings/oc.json index cd62ff69db..1fcea5a976 100644 --- a/src/i18n/strings/oc.json +++ b/src/i18n/strings/oc.json @@ -62,7 +62,7 @@ "Server error": "Error servidor", "Single Sign On": "Autentificacion unica", "Confirm": "Confirmar", - "Dismiss": "Far desaparéisser", + "Dismiss": "Refusar", "OK": "D’acòrdi", "Continue": "Contunhar", "Go Back": "En arrièr", @@ -118,7 +118,7 @@ "Incoming call": "Sonada entranta", "Accept": "Acceptar", "Start": "Començament", - "Cancelling…": "Anullacion...", + "Cancelling…": "Anullacion…", "Fish": "Pes", "Butterfly": "Parpalhòl", "Tree": "Arborescéncia", @@ -338,5 +338,7 @@ "Esc": "Escap", "Enter": "Entrada", "Space": "Espaci", - "End": "Fin" + "End": "Fin", + "Explore rooms": "Percórrer las salas", + "Create Account": "Crear un compte" } From 36b6e2088cca77a58f6e4ac95a3ba4547f4c989d Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 10 Apr 2021 09:45:24 +0000 Subject: [PATCH 049/154] Translated using Weblate (Portuguese (Brazil)) Currently translated at 96.9% (2827 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt_BR/ --- src/i18n/strings/pt_BR.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 0ec835362a..8497ae7164 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -1175,7 +1175,7 @@ "Learn More": "Saiba mais", "Sign In or Create Account": "Faça login ou crie uma conta", "Use your account or create a new one to continue.": "Use sua conta ou crie uma nova para continuar.", - "Create Account": "Criar conta", + "Create Account": "Criar Conta", "Sign In": "Entrar", "Custom (%(level)s)": "Personalizado (%(level)s)", "Messages": "Mensagens", From 269cd79531ed6177b76b94cb1b65a84cc4f8342f Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 10 Apr 2021 11:08:48 +0000 Subject: [PATCH 050/154] Translated using Weblate (Thai) Currently translated at 11.7% (342 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/th/ --- src/i18n/strings/th.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index 811d549d54..a5b641921c 100644 --- a/src/i18n/strings/th.json +++ b/src/i18n/strings/th.json @@ -378,5 +378,8 @@ "Unable to fetch notification target list": "ไม่สามารถรับรายชื่ออุปกรณ์แจ้งเตือน", "Quote": "อ้างอิง", "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "การแสดงผลของโปรแกรมอาจผิดพลาด ฟังก์ชันบางอย่างหรือทั้งหมดอาจไม่ทำงานในเบราว์เซอร์ปัจจุบันของคุณ หากคุณต้องการลองดำเนินการต่อ คุณต้องรับมือกับปัญหาที่อาจจะเกิดขึ้นด้วยตัวคุณเอง!", - "Checking for an update...": "กำลังตรวจหาอัปเดต..." + "Checking for an update...": "กำลังตรวจหาอัปเดต...", + "Explore rooms": "สำรวจห้อง", + "Sign In": "เข้าสู่ระบบ", + "Create Account": "สร้างบัญชี" } From 417d384e37170e18c9f6012a0132a83ae6b8381e Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 11 Apr 2021 02:47:53 +0000 Subject: [PATCH 051/154] Translated using Weblate (Mongolian) Currently translated at 0.1% (4 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/mn/ --- src/i18n/strings/mn.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/mn.json b/src/i18n/strings/mn.json index 0967ef424b..5e44298332 100644 --- a/src/i18n/strings/mn.json +++ b/src/i18n/strings/mn.json @@ -1 +1,6 @@ -{} +{ + "Explore rooms": "Өрөөнүүд үзэх", + "Sign In": "Нэвтрэх", + "Create Account": "Хэрэглэгч үүсгэх", + "Dismiss": "Орхих" +} From a494871727ebdfab561979ea72279c8c31c87a77 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 11 Apr 2021 02:45:26 +0000 Subject: [PATCH 052/154] Translated using Weblate (Welsh) Currently translated at 0.4% (13 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cy/ --- src/i18n/strings/cy.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cy.json b/src/i18n/strings/cy.json index 99c5296be5..b99b834636 100644 --- a/src/i18n/strings/cy.json +++ b/src/i18n/strings/cy.json @@ -8,5 +8,8 @@ "The version of %(brand)s": "Fersiwn %(brand)s", "Whether or not you're logged in (we don't record your username)": "Os ydych wedi mewngofnodi ai peidio (nid ydym yn cofnodi'ch enw defnyddiwr)", "Your language of choice": "Eich iaith o ddewis", - "The version of %(brand)s": "Fersiwn %(brand)s" + "Sign In": "Mewngofnodi", + "Create Account": "Creu Cyfrif", + "Dismiss": "Wfftio", + "Explore rooms": "Archwilio Ystafelloedd" } From 691bfcfeb71c258f2b6ea992f791a28c6bc19654 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 11 Apr 2021 02:45:14 +0000 Subject: [PATCH 053/154] Translated using Weblate (Serbian (latin)) Currently translated at 2.0% (60 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sr_Latn/ --- src/i18n/strings/sr_Latn.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sr_Latn.json b/src/i18n/strings/sr_Latn.json index 19778858d0..96a5d89411 100644 --- a/src/i18n/strings/sr_Latn.json +++ b/src/i18n/strings/sr_Latn.json @@ -58,5 +58,6 @@ "Failed to invite users to the room:": "Nije uspelo pozivanje korisnika u sobu:", "You need to be logged in.": "Morate biti prijavljeni", "You need to be able to invite users to do that.": "Mora vam biti dozvoljeno da pozovete korisnike kako bi to uradili.", - "Failed to send request.": "Slanje zahteva nije uspelo." + "Failed to send request.": "Slanje zahteva nije uspelo.", + "Create Account": "Napravite nalog" } From 893d37cbe1dd76ae3fb367dadef9d1782ebbb7e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Wed, 7 Apr 2021 17:41:46 +0000 Subject: [PATCH 054/154] Translated using Weblate (Estonian) Currently translated at 100.0% (2917 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 41 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 85f8cbb751..444475deea 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2517,7 +2517,7 @@ "Join the conference from the room information card on the right": "Liitu konverentsiga selle jututoa infolehelt paremal", "Video conference ended by %(senderName)s": "%(senderName)s lõpetas video rühmakõne", "Video conference updated by %(senderName)s": "%(senderName)s uuendas video rühmakõne", - "Video conference started by %(senderName)s": "%(senderName)s alustas video rühmakõne", + "Video conference started by %(senderName)s": "%(senderName)s alustas video rühmakõnet", "End conference": "Lõpeta videokonverents", "This will end the conference for everyone. Continue?": "Sellega lõpetame kõikide osalejate jaoks videokonverentsi. Nõus?", "Ignored attempt to disable encryption": "Eirasin katset lõpetada krüptimise kasutamine", @@ -3226,5 +3226,42 @@ "Open": "Ava", "Check your devices": "Kontrolli oma seadmeid", "A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "Uus sisselogimissessioon kasutab sinu Matrixi kontot: %(name)s %(deviceID)s aadressil %(ip)s", - "You have unverified logins": "Sul on verifitseerimata sisselogimissessioone" + "You have unverified logins": "Sul on verifitseerimata sisselogimissessioone", + "Manage & explore rooms": "Halda ja uuri jututubasid", + "Warn before quitting": "Hoiata enne rakenduse töö lõpetamist", + "Invite to just this room": "Kutsi vaid siia jututuppa", + "Quick actions": "Kiirtoimingud", + "Adding...": "Lisan...", + "Sends the given message as a spoiler": "Saadab selle sõnumi rõõmurikkujana", + "unknown person": "tundmatu isik", + "Send and receive voice messages (in development)": "Saada ja võta vastu häälsõnumeid (arendusjärgus)", + "%(deviceId)s from %(ip)s": "%(deviceId)s ip-aadressil %(ip)s", + "Review to ensure your account is safe": "Tagamaks, et su konto on sinu kontrolli all, vaata andmed üle", + "Share decryption keys for room history when inviting users": "Kasutajate kutsumisel jaga jututoa ajaloo võtmeid", + "Record a voice message": "Salvesta häälsõnum", + "Stop & send recording": "Lõpeta salvestamine ja saada häälsõnum", + "Add existing rooms": "Lisa olemasolevaid jututubasid", + "%(count)s people you know have already joined|other": "%(count)s sulle tuttavat kasutajat on juba liitunud", + "We couldn't create your DM.": "Otsesuhtluse loomine ei õnnestunud.", + "Invited people will be able to read old messages.": "Kutse saanud kasutajad saavad lugeda vanu sõnumeid.", + "Consult first": "Pea esmalt nõu", + "Reset event store?": "Kas lähtestame sündmuste andmekogu?", + "Reset event store": "Lähtesta sündmuste andmekogu", + "Verify other login": "Verifitseeri muu sisselogimissessioon", + "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Suhtlen teise osapoolega %(transferTarget)s. Saadan andmeid kasutajale %(transferee)s", + "Message search initilisation failed": "Sõnumite otsingu alustamine ei õnnestunud", + "Invite messages are hidden by default. Click to show the message.": "Kutsed on vaikimisi peidetud. Sõnumi nägemiseks klõpsi.", + "Accept on your other login…": "Nõustu oma teise sisselogimissessiooniga…", + "Avatar": "Tunnuspilt", + "Verification requested": "Verifitseerimistaotlus on saadetud", + "%(count)s people you know have already joined|one": "%(count)s sulle tuttav kasutaja on juba liitunud", + "You most likely do not want to reset your event index store": "Pigem sa siiski ei taha lähtestada sündmuste andmekogu ja selle indeksit", + "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Kui sa siiski soovid seda teha, siis sinu sõnumeid me ei kustuta, aga seniks kuni sõnumite indeks taustal uuesti luuakse, toimib otsing aeglaselt ja ebatõhusalt", + "You can add more later too, including already existing ones.": "Sa võid ka hiljem siia luua uusi jututubasid või lisada olemasolevaid.", + "What are some things you want to discuss in %(spaceName)s?": "Mida sa sooviksid arutada %(spaceName)s kogukonnakeskuses?", + "Please choose a strong password": "Palun tee üks korralik salasõna", + "Use another login": "Pruugi muud kasutajakontot", + "Verify your identity to access encrypted messages and prove your identity to others.": "Tagamaks ligipääsu oma krüptitud sõnumitele ja tõestamaks oma isikut teistele kasutajatale, verifitseeri end.", + "Let's create a room for each of them.": "Teeme siis iga teema jaoks oma jututoa.", + "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Ilma verifitseerimiseta sul puudub ligipääs kõikidele oma sõnumitele ning teised ei näe sinu kasutajakontot usaldusväärsena." } From 2a236e020ad52da7523fc87aab19e8f36da674d9 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 10 Apr 2021 09:12:42 +0000 Subject: [PATCH 055/154] Translated using Weblate (Portuguese) Currently translated at 16.8% (492 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ --- src/i18n/strings/pt.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index f72edc150d..4047aae760 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -569,5 +569,8 @@ "Try using turn.matrix.org": "Tente utilizar turn.matrix.org", "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Quer esteja a usar o %(brand)s num dispositivo onde o touch é o mecanismo de entrada primário", "Whether you're using %(brand)s as an installed Progressive Web App": "Quer esteja a usar o %(brand)s como uma Progressive Web App (PWA)", - "Your user agent": "O seu user agent" + "Your user agent": "O seu user agent", + "Explore rooms": "Explorar rooms", + "Sign In": "Iniciar sessão", + "Create Account": "Criar conta" } From f4ec4ec8fd6f9601903fe9384cd9ac261b34beef Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 11 Apr 2021 02:07:49 +0000 Subject: [PATCH 056/154] Translated using Weblate (Slovenian) Currently translated at 1.0% (30 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sl/ --- src/i18n/strings/sl.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sl.json b/src/i18n/strings/sl.json index 0e9bdb3d3e..aa2019ad45 100644 --- a/src/i18n/strings/sl.json +++ b/src/i18n/strings/sl.json @@ -27,5 +27,7 @@ "Your homeserver's URL": "URL domačega strežnika", "End": "Konec", "Use default": "Uporabi privzeto", - "Change": "Sprememba" + "Change": "Sprememba", + "Explore rooms": "Raziščite sobe", + "Create Account": "Registracija" } From 4450313741ad567ae24949dcdda7b4ccb5047e70 Mon Sep 17 00:00:00 2001 From: iaiz Date: Sat, 10 Apr 2021 22:24:22 +0000 Subject: [PATCH 057/154] Translated using Weblate (Spanish) Currently translated at 99.9% (2916 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 202c6d4d71..785ac28f37 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -3211,5 +3211,18 @@ "Send and receive voice messages (in development)": "Enviar y recibir mensajes de voz (en desarrollo)", "%(deviceId)s from %(ip)s": "%(deviceId)s desde %(ip)s", "Review to ensure your account is safe": "Revisa que tu cuenta esté segura", - "Sends the given message as a spoiler": "Envía el mensaje como un spoiler" + "Sends the given message as a spoiler": "Envía el mensaje como un spoiler", + "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Consultando a %(transferTarget)s. Transferir a %(transferee)s", + "Message search initilisation failed": "Ha fallado la inicialización de la búsqueda de mensajes", + "Reset event store?": "¿Restablecer almacenamiento de eventos?", + "You most likely do not want to reset your event index store": "Lo más probable es que no quieras restablecer tu almacenamiento de índice de ecentos", + "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Si lo haces, ten en cuenta que no se borrarán tus mensajes, pero la experiencia de búsqueda será peor durante unos momentos mientras se recrea el índice", + "Reset event store": "Restablecer el almacenamiento de eventos", + "What are some things you want to discuss in %(spaceName)s?": "¿De qué quieres hablar en %(spaceName)s?", + "Let's create a room for each of them.": "Crearemos una sala para cada uno.", + "You can add more later too, including already existing ones.": "Puedes añadir más después, incluso si ya existen.", + "Please choose a strong password": "Por favor, elige una contraseña segura", + "Use another login": "Usar otro inicio de sesión", + "Verify your identity to access encrypted messages and prove your identity to others.": "Verifica tu identidad para acceder a mensajes cifrados y probar tu identidad a otros.", + "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Si no verificas no tendrás acceso a todos tus mensajes y puede que aparezcas como no confiable para otros usuarios." } From 986443ba18f312141d60a78bc54a043f102c04da Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 10 Apr 2021 03:46:17 +0000 Subject: [PATCH 058/154] Translated using Weblate (Danish) Currently translated at 19.9% (582 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/da/ --- src/i18n/strings/da.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index 1f4eef4d93..32dba2f063 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -54,7 +54,7 @@ "OK": "OK", "Search": "Søg", "Custom Server Options": "Brugerdefinerede serverindstillinger", - "Dismiss": "Afskedige", + "Dismiss": "Afslut", "powered by Matrix": "Drevet af Matrix", "Close": "Luk", "Cancel": "Afbryd", From 33332c1677fb9a1a432f28f5a1fcd9d541d2b1c3 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 10 Apr 2021 21:45:36 +0000 Subject: [PATCH 059/154] Translated using Weblate (Catalan) Currently translated at 28.2% (825 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ca/ --- src/i18n/strings/ca.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index 7db987b8af..9a9e0efaa7 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -950,5 +950,6 @@ "Confirm": "Confirma", "Click the button below to confirm adding this email address.": "Fes clic al botó de sota per confirmar l'addició d'aquesta adreça de correu electrònic.", "Unable to access webcam / microphone": "No s'ha pogut accedir a la càmera web / micròfon", - "Unable to access microphone": "No s'ha pogut accedir al micròfon" + "Unable to access microphone": "No s'ha pogut accedir al micròfon", + "Explore rooms": "Explora sales" } From 7f8995a5c7a8c65aa492f4b5f8afb606b97c01c7 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 11 Apr 2021 02:50:12 +0000 Subject: [PATCH 060/154] Translated using Weblate (Kabyle) Currently translated at 85.2% (2486 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index c4e0cc7099..b6e1b3020f 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -2,7 +2,7 @@ "Confirm": "Sentem", "Analytics": "Tiselḍin", "Error": "Tuccḍa", - "Dismiss": "Agi", + "Dismiss": "Agwi", "OK": "IH", "Permission Required": "Tasiregt tlaq", "Continue": "Kemmel", From c394f2da44a8028327ca12a4c48af4b170236152 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 11 Apr 2021 01:53:48 +0000 Subject: [PATCH 061/154] Translated using Weblate (Lojban) Currently translated at 16.0% (469 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/jbo/ --- src/i18n/strings/jbo.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/jbo.json b/src/i18n/strings/jbo.json index f2c9dc6e43..b19d4bb95d 100644 --- a/src/i18n/strings/jbo.json +++ b/src/i18n/strings/jbo.json @@ -580,5 +580,8 @@ "%(displayName)s cancelled verification.": ".i la'o zoi. %(displayName)s .zoi co'u co'a lacri", "Decrypt %(text)s": "nu facki le du'u mifra la'o zoi. %(text)s .zoi", "Download %(text)s": "nu kibycpa la'o zoi. %(text)s .zoi", - "Download this file": "nu kibycpa le vreji" + "Download this file": "nu kibycpa le vreji", + "Explore rooms": "nu facki le du'u ve zilbe'i", + "Create Account": "nu pa re'u co'a jaspu", + "Dismiss": "nu mipri" } From 979b7fedb07711d8728cec0c88241f3d818fd59f Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 10 Apr 2021 19:05:27 +0000 Subject: [PATCH 062/154] Translated using Weblate (Persian) Currently translated at 9.7% (285 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fa/ --- src/i18n/strings/fa.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json index 738f48733c..d036a55c23 100644 --- a/src/i18n/strings/fa.json +++ b/src/i18n/strings/fa.json @@ -311,5 +311,8 @@ "Your device resolution": "وضوح دستگاه شما", "e.g. ": "برای مثال ", "Every page you use in the app": "هر صفحه‌ی برنامه از که آن استفاده می‌کنید", - "e.g. %(exampleValue)s": "برای مثال %(exampleValue)s" + "e.g. %(exampleValue)s": "برای مثال %(exampleValue)s", + "Explore rooms": "کاوش اتاق", + "Sign In": "ورود", + "Create Account": "ایجاد اکانت" } From deb307e0c58b1c0f30c87268159a20626555372e Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 10 Apr 2021 13:13:14 +0000 Subject: [PATCH 063/154] Translated using Weblate (Korean) Currently translated at 51.8% (1512 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ko/ --- src/i18n/strings/ko.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index 59bb68af94..f817dbc26b 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -1666,5 +1666,6 @@ "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "경고: 키 검증 실패! 제공된 키인 \"%(fingerprint)s\"가 사용자 %(userId)s와 %(deviceId)s 세션의 서명 키인 \"%(fprint)s\"와 일치하지 않습니다. 이는 통신이 탈취되고 있는 중일 수도 있다는 뜻입니다!", "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "사용자 %(userId)s의 세션 %(deviceId)s에서 받은 서명 키와 당신이 제공한 서명 키가 일치합니다. 세션이 검증되었습니다.", "Show more": "더 보기", - "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "비밀번호를 변경한다면 방의 암호화 키를 내보낸 후 다시 가져오지 않는 이상 모든 종단간 암호화 키는 초기화 될 것이고, 암호화된 대화 내역은 읽을 수 없게 될 것입니다. 이 문제는 추후에 개선될 것입니다." + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "비밀번호를 변경한다면 방의 암호화 키를 내보낸 후 다시 가져오지 않는 이상 모든 종단간 암호화 키는 초기화 될 것이고, 암호화된 대화 내역은 읽을 수 없게 될 것입니다. 이 문제는 추후에 개선될 것입니다.", + "Create Account": "계정 만들기" } From f10b6ed882f8d7c91d5c5dde89918b4ad2ebbd06 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 11 Apr 2021 01:24:14 +0000 Subject: [PATCH 064/154] Translated using Weblate (Romanian) Currently translated at 2.4% (72 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ro/ --- src/i18n/strings/ro.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ro.json b/src/i18n/strings/ro.json index aa87d0a912..062a89f2e3 100644 --- a/src/i18n/strings/ro.json +++ b/src/i18n/strings/ro.json @@ -70,5 +70,9 @@ "Add to community": "Adăugați la comunitate", "Failed to invite the following users to %(groupId)s:": "Nu a putut fi invitat următorii utilizatori %(groupId)s", "Failed to invite users to community": "Nu a fost posibilă invitarea utilizatorilor la comunitate", - "Failed to invite users to %(groupId)s": "Nu a fost posibilă invitarea utilizatorilor la %(groupId)s" + "Failed to invite users to %(groupId)s": "Nu a fost posibilă invitarea utilizatorilor la %(groupId)s", + "Explore rooms": "Explorează camerele", + "Sign In": "Autentificare", + "Create Account": "Înregistare", + "Dismiss": "Închide" } From d1a2ca4bbe71d3916f0e483372f3dfbe579c4fe0 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sun, 11 Apr 2021 01:15:48 +0000 Subject: [PATCH 065/154] Translated using Weblate (Hindi) Currently translated at 19.1% (558 of 2917 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hi/ --- src/i18n/strings/hi.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hi.json b/src/i18n/strings/hi.json index 75b14cca18..f71c024342 100644 --- a/src/i18n/strings/hi.json +++ b/src/i18n/strings/hi.json @@ -585,5 +585,8 @@ "You cannot modify widgets in this room.": "आप इस रूम में विजेट्स को संशोधित नहीं कर सकते।", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s ने कमरे में शामिल होने के लिए %(targetDisplayName)s के निमंत्रण को रद्द कर दिया।", "User %(userId)s is already in the room": "उपयोगकर्ता %(userId)s पहले से ही रूम में है", - "The user must be unbanned before they can be invited.": "उपयोगकर्ता को आमंत्रित करने से पहले उन्हें प्रतिबंधित किया जाना चाहिए।" + "The user must be unbanned before they can be invited.": "उपयोगकर्ता को आमंत्रित करने से पहले उन्हें प्रतिबंधित किया जाना चाहिए।", + "Explore rooms": "रूम का अन्वेषण करें", + "Sign In": "साइन करना", + "Create Account": "खाता बनाएं" } From 9081f800087b073f4d7640ce2310700db1b62c02 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Mon, 12 Apr 2021 17:01:27 +0100 Subject: [PATCH 066/154] Move user to welcome_page if continuing with previous session --- src/components/structures/auth/Registration.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/components/structures/auth/Registration.tsx b/src/components/structures/auth/Registration.tsx index 9d004de2ec..73955e7832 100644 --- a/src/components/structures/auth/Registration.tsx +++ b/src/components/structures/auth/Registration.tsx @@ -436,6 +436,8 @@ export default class Registration extends React.Component { // ok fine, there's still no session: really go to the login page this.props.onLoginClick(); } + + return sessionLoaded; }; private renderRegisterComponent() { @@ -557,7 +559,12 @@ export default class Registration extends React.Component { loggedInUserId: this.state.differentLoggedInUserId, }, )}

-

+

{ + const sessionLoaded = await this.onLoginClickWithCheck(event); + if (sessionLoaded) { + dis.dispatch({action: "view_welcome_page"}); + } + }}> {_t("Continue with previous account")}

; From c726213680c5ac56ba510220ea09b08ce041f1ac Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 13 Apr 2021 10:03:50 +0100 Subject: [PATCH 067/154] Switch to a spec conforming email validation Regexp --- src/email.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/email.ts b/src/email.ts index 6642a51541..0476d4467c 100644 --- a/src/email.ts +++ b/src/email.ts @@ -14,7 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. */ -const EMAIL_ADDRESS_REGEX = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i; +// Regexp based on Simpler Version from https://gist.github.com/gregseth/5582254 - matches RFC2822 +const EMAIL_ADDRESS_REGEX = new RegExp( + "^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*" + // localpart + "@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$", "i"); export function looksValid(email: string): boolean { return EMAIL_ADDRESS_REGEX.test(email); From fd54fa51195046f29699bb99d568eca3b757eab9 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 13 Apr 2021 10:33:32 +0100 Subject: [PATCH 068/154] Fix unknown slash command error exploding --- src/SlashCommands.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index 3b6a202cf6..0fe7cf7bda 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -1222,4 +1222,5 @@ export function getCommand(input: string) { args, }; } + return {}; } From 2aebf103ed3f7379afa006e6f5392f4e072a9bd8 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Tue, 13 Apr 2021 11:20:53 +0100 Subject: [PATCH 069/154] always display message timestamp in IRC layout replies --- res/css/views/rooms/_EventTile.scss | 1 + res/css/views/rooms/_IRCLayout.scss | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 028d9a7556..50adaea305 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -159,6 +159,7 @@ $left-gutter: 64px; .mx_EventTile.focus-visible:focus-within > div > a > .mx_MessageTimestamp, .mx_IRCLayout .mx_EventTile_last > a > .mx_MessageTimestamp, .mx_IRCLayout .mx_EventTile:hover > a > .mx_MessageTimestamp, +.mx_IRCLayout .mx_ReplyThread .mx_EventTile > a > .mx_MessageTimestamp, .mx_IRCLayout .mx_EventTile.mx_EventTile_actionBarFocused > a > .mx_MessageTimestamp, .mx_IRCLayout .mx_EventTile.focus-visible:focus-within > a > .mx_MessageTimestamp { visibility: visible; diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index 21baa795e6..8419ecba8d 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -136,6 +136,21 @@ $irc-line-height: $font-18px; } } + .mx_ReplyThread { + .mx_MessageTimestamp { + width: initial; + } + + /** + * adding the icon back in the document flow + * if it's not present, there's no unwanted wasted space + */ + .mx_EventTile_e2eIcon { + position: relative; + order: -1; + } + } + blockquote { margin: 0; } From e520f7462cc403712859e6cbab07aa6df7eefc8e Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Tue, 13 Apr 2021 11:21:47 +0100 Subject: [PATCH 070/154] Fix emotes left spacing in replies for the IRC layout --- res/css/views/rooms/_IRCLayout.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index 8419ecba8d..e9661d45b1 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -137,6 +137,12 @@ $irc-line-height: $font-18px; } .mx_ReplyThread { + .mx_EventTile_emote { + > .mx_EventTile_avatar { + margin-left: initial; + } + } + .mx_MessageTimestamp { width: initial; } From c9c53dbcd7c190a0bc356ced328b498d21175c77 Mon Sep 17 00:00:00 2001 From: Robin Townsend Date: Tue, 13 Apr 2021 12:02:22 -0400 Subject: [PATCH 071/154] Add tooltips to message previews Signed-off-by: Robin Townsend --- src/components/views/rooms/RoomTile.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/views/rooms/RoomTile.tsx b/src/components/views/rooms/RoomTile.tsx index 79db460275..a32fc46a80 100644 --- a/src/components/views/rooms/RoomTile.tsx +++ b/src/components/views/rooms/RoomTile.tsx @@ -563,7 +563,11 @@ export default class RoomTile extends React.PureComponent { let messagePreview = null; if (this.showMessagePreview && this.state.messagePreview) { messagePreview = ( -
+
{this.state.messagePreview}
); From cd48a8f3ab7b446f93ad1845ab4b434524738d4f Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Wed, 14 Apr 2021 08:15:32 +0100 Subject: [PATCH 072/154] merge .mx_ReplyThread declaration in _IRCLayout.css --- res/css/views/rooms/_IRCLayout.scss | 40 ++++++++++++++--------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/res/css/views/rooms/_IRCLayout.scss b/res/css/views/rooms/_IRCLayout.scss index e9661d45b1..b6b901757c 100644 --- a/res/css/views/rooms/_IRCLayout.scss +++ b/res/css/views/rooms/_IRCLayout.scss @@ -136,27 +136,6 @@ $irc-line-height: $font-18px; } } - .mx_ReplyThread { - .mx_EventTile_emote { - > .mx_EventTile_avatar { - margin-left: initial; - } - } - - .mx_MessageTimestamp { - width: initial; - } - - /** - * adding the icon back in the document flow - * if it's not present, there's no unwanted wasted space - */ - .mx_EventTile_e2eIcon { - position: relative; - order: -1; - } - } - blockquote { margin: 0; } @@ -237,6 +216,25 @@ $irc-line-height: $font-18px; } } } + + .mx_EventTile_emote { + > .mx_EventTile_avatar { + margin-left: initial; + } + } + + .mx_MessageTimestamp { + width: initial; + } + + /** + * adding the icon back in the document flow + * if it's not present, there's no unwanted wasted space + */ + .mx_EventTile_e2eIcon { + position: relative; + order: -1; + } } .mx_ProfileResizer { From 8d95c012ef7bba98795322742756f80da81bd9bf Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Wed, 14 Apr 2021 08:44:33 +0100 Subject: [PATCH 073/154] refactor _startDm invite flow to use async/await --- src/components/views/dialogs/InviteDialog.tsx | 41 ++++++++----------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index 60f783e889..aabc8b59e3 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -656,35 +656,30 @@ export default class InviteDialog extends React.PureComponent; - const isSelf = targetIds.length === 1 && targetIds[0] === MatrixClientPeg.get().getUserId(); - if (targetIds.length === 1 && !isSelf) { - createRoomOptions.dmUserId = targetIds[0]; - createRoomPromise = createRoom(createRoomOptions); - } else if (isSelf) { - createRoomPromise = createRoom(createRoomOptions); - } else { - // Create a boring room and try to invite the targets manually. - createRoomPromise = createRoom(createRoomOptions).then(roomId => { - return inviteMultipleToRoom(roomId, targetIds); - }).then(result => { - if (this._shouldAbortAfterInviteError(result)) { - return true; // abort - } - }); - } - // the createRoom call will show the room for us, so we don't need to worry about that. - createRoomPromise.then(abort => { - if (abort === true) return; // only abort on true booleans, not roomIds or something - this.props.onFinished(); - }).catch(err => { + try { + const isSelf = targetIds.length === 1 && targetIds[0] === MatrixClientPeg.get().getUserId(); + if (targetIds.length === 1 && !isSelf) { + createRoomOptions.dmUserId = targetIds[0]; + await createRoom(createRoomOptions); + } else if (isSelf) { + await createRoom(createRoomOptions); + } else { + const roomId = await createRoom(createRoomOptions); + const invitesState = await inviteMultipleToRoom(roomId, targetIds); + + const abort = this._shouldAbortAfterInviteError(invitesState); + if (abort === false) { + this.props.onFinished(); + } + } + } catch (err) { console.error(err); this.setState({ busy: false, errorText: _t("We couldn't create your DM."), }); - }); + } }; _inviteUsers = async () => { From f89bbea3f1678754f2ef9b6e1eb2f8f178350f04 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Wed, 14 Apr 2021 09:03:47 +0100 Subject: [PATCH 074/154] Ensure room is synced with account before sending invites --- src/components/views/dialogs/InviteDialog.tsx | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index aabc8b59e3..cbdfdcbdc8 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -618,13 +618,14 @@ export default class InviteDialog extends React.PureComponent { this.setState({busy: true}); + const client = MatrixClientPeg.get(); const targets = this._convertFilter(); const targetIds = targets.map(t => t.userId); // Check if there is already a DM with these people and reuse it if possible. let existingRoom: Room; if (targetIds.length === 1) { - existingRoom = findDMForUser(MatrixClientPeg.get(), targetIds[0]); + existingRoom = findDMForUser(client, targetIds[0]); } else { existingRoom = DMRoomMap.shared().getDMRoomForIdentifiers(targetIds); } @@ -646,7 +647,6 @@ export default class InviteDialog extends React.PureComponent t instanceof ThreepidMember); if (!has3PidMembers) { - const client = MatrixClientPeg.get(); const allHaveDeviceKeys = await canEncryptToAllUsers(client, targetIds); if (allHaveDeviceKeys) { createRoomOptions.encryption = true; @@ -656,9 +656,8 @@ export default class InviteDialog extends React.PureComponent Date: Wed, 14 Apr 2021 09:37:06 +0100 Subject: [PATCH 075/154] fix closing modal when finished --- src/components/views/dialogs/InviteDialog.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index cbdfdcbdc8..c89e61bd18 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -656,6 +656,7 @@ export default class InviteDialog extends React.PureComponent Date: Wed, 14 Apr 2021 10:18:45 +0100 Subject: [PATCH 076/154] Rename Velociraptor to NodeAnimator after velocity deprecation --- .eslintignore.errorfiles | 2 +- src/{Velociraptor.js => NodeAnimator.js} | 4 ++-- src/components/views/rooms/ReadReceiptMarker.js | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) rename src/{Velociraptor.js => NodeAnimator.js} (96%) diff --git a/.eslintignore.errorfiles b/.eslintignore.errorfiles index 1c0a3d1254..d9177bebb5 100644 --- a/.eslintignore.errorfiles +++ b/.eslintignore.errorfiles @@ -1,7 +1,7 @@ # autogenerated file: run scripts/generate-eslint-error-ignore-file to update. src/Markdown.js -src/Velociraptor.js +src/NodeAnimator.js src/components/structures/RoomDirectory.js src/components/views/rooms/MemberList.js src/ratelimitedfunc.js diff --git a/src/Velociraptor.js b/src/NodeAnimator.js similarity index 96% rename from src/Velociraptor.js rename to src/NodeAnimator.js index 1592f4be06..8456e6e9fd 100644 --- a/src/Velociraptor.js +++ b/src/NodeAnimator.js @@ -3,13 +3,13 @@ import ReactDom from "react-dom"; import PropTypes from 'prop-types'; /** - * The Velociraptor contains components and animates transitions with velocity. + * The NodeAnimator contains components and animates transitions. * It will only pick up direct changes to properties ('left', currently), and so * will not work for animating positional changes where the position is implicit * from DOM order. This makes it a lot simpler and lighter: if you need fully * automatic positional animation, look at react-shuffle or similar libraries. */ -export default class Velociraptor extends React.Component { +export default class NodeAnimator extends React.Component { static propTypes = { // either a list of child nodes, or a single child. children: PropTypes.any, diff --git a/src/components/views/rooms/ReadReceiptMarker.js b/src/components/views/rooms/ReadReceiptMarker.js index e2b95a7ada..709e6a0db0 100644 --- a/src/components/views/rooms/ReadReceiptMarker.js +++ b/src/components/views/rooms/ReadReceiptMarker.js @@ -19,7 +19,7 @@ import React, {createRef} from 'react'; import PropTypes from 'prop-types'; import { _t } from '../../../languageHandler'; import {formatDate} from '../../../DateUtils'; -import Velociraptor from "../../../Velociraptor"; +import NodeAnimator from "../../../NodeAnimator"; import * as sdk from "../../../index"; import {toPx} from "../../../utils/units"; import {replaceableComponent} from "../../../utils/replaceableComponent"; @@ -187,7 +187,7 @@ export default class ReadReceiptMarker extends React.PureComponent { } return ( - - + ); } } From ba0384f381441b8040dedcbe81669b2c8a1a3936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Apr 2021 11:43:42 +0200 Subject: [PATCH 077/154] Render msgOption only if showReadReceipts is enabled MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/structures/_ScrollPanel.scss | 2 +- src/components/views/rooms/EventTile.js | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/res/css/structures/_ScrollPanel.scss b/res/css/structures/_ScrollPanel.scss index 699224949b..ebbaff0931 100644 --- a/res/css/structures/_ScrollPanel.scss +++ b/res/css/structures/_ScrollPanel.scss @@ -21,6 +21,6 @@ limitations under the License. display: flex; flex-direction: column; justify-content: flex-end; - overflow-y: hidden; + overflow: hidden; } } diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index a3474161d7..c48e557981 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -988,6 +988,16 @@ export default class EventTile extends React.Component { const groupPadlock = !useIRCLayout && !isBubbleMessage && this._renderE2EPadlock(); const ircPadlock = useIRCLayout && !isBubbleMessage && this._renderE2EPadlock(); + let msgOption; + if (SettingsStore.getValue("showReadReceipts")) { + msgOption = ( +
+ { readAvatars } +
+ ); + } + + switch (this.props.tileShape) { case 'notif': { const room = this.context.getRoom(this.props.mxEvent.getRoomId()); @@ -1107,9 +1117,7 @@ export default class EventTile extends React.Component { { reactionsRow } { actionBar }
-
- { readAvatars } -
+ {msgOption} { // The avatar goes after the event tile as it's absolutely positioned to be over the // event tile line, so needs to be later in the DOM so it appears on top (this avoids From 43c236e8a59e4953f35543d0653200441dbcb95b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Apr 2021 12:24:33 +0200 Subject: [PATCH 078/154] Pass showReadReceipts from MessagePanel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/structures/MessagePanel.js | 1 + src/components/views/rooms/EventTile.js | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/structures/MessagePanel.js b/src/components/structures/MessagePanel.js index 41a3015721..132d9ab4c3 100644 --- a/src/components/structures/MessagePanel.js +++ b/src/components/structures/MessagePanel.js @@ -659,6 +659,7 @@ export default class MessagePanel extends React.Component { showReactions={this.props.showReactions} layout={this.props.layout} enableFlair={this.props.enableFlair} + showReadReceipts={this.props.showReadReceipts} /> , diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index c48e557981..f9541ed4f8 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -260,6 +260,9 @@ export default class EventTile extends React.Component { // whether or not to show flair at all enableFlair: PropTypes.bool, + + // whether or not to show read receipts + showReadReceipts: PropTypes.bool, }; static defaultProps = { @@ -989,7 +992,7 @@ export default class EventTile extends React.Component { const ircPadlock = useIRCLayout && !isBubbleMessage && this._renderE2EPadlock(); let msgOption; - if (SettingsStore.getValue("showReadReceipts")) { + if (this.props.showReadReceipts) { msgOption = (
{ readAvatars } From a7b1c5dfe04cbd70b92d670d3de8172064fd055a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 14 Apr 2021 12:25:48 +0200 Subject: [PATCH 079/154] Run getReadAvatars() only when neccessary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/EventTile.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index f9541ed4f8..2a18bfd794 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -861,8 +861,6 @@ export default class EventTile extends React.Component { permalink = this.props.permalinkCreator.forEvent(this.props.mxEvent.getId()); } - const readAvatars = this.getReadAvatars(); - let avatar; let sender; let avatarSize; @@ -993,6 +991,7 @@ export default class EventTile extends React.Component { let msgOption; if (this.props.showReadReceipts) { + const readAvatars = this.getReadAvatars(); msgOption = (
{ readAvatars } From bc802280cb4534a7114c6eec9b5998e46fce5cad Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 14 Apr 2021 12:38:11 +0100 Subject: [PATCH 080/154] Update security notice New information came to light after the original report, so this updates the notice to match the latest details. --- CHANGELOG.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17da59b8c5..ec73756ff9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -312,11 +312,12 @@ Changes in [3.15.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/ ## Security notice -matrix-react-sdk 3.15.0 fixes a low severity issue (CVE-2021-21320) where the -user content sandbox can be abused to trick users into opening unexpected -documents. The content is opened with a `blob` origin that cannot access Matrix -user data, so messages and secrets are not at risk. Thanks to @keerok for -responsibly disclosing this via Matrix's Security Disclosure Policy. +matrix-react-sdk 3.15.0 fixes a moderate severity issue (CVE-2021-21320) where +the user content sandbox can be abused to trick users into opening unexpected +documents after several user interactions. The content can be opened with a +`blob` origin from the Matrix client, so it is possible for a malicious document +to access user messages and secrets. Thanks to @keerok for responsibly +disclosing this via Matrix's Security Disclosure Policy. ## All changes From c521be2d16119c510dbd250c21274e8c4fe1ff7e Mon Sep 17 00:00:00 2001 From: ColonisationCaptain <52425971+ColonisationCaptain@users.noreply.github.com> Date: Wed, 14 Apr 2021 14:28:41 +0100 Subject: [PATCH 081/154] add missing spaces --- src/components/views/dialogs/SeshatResetDialog.tsx | 2 +- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/dialogs/SeshatResetDialog.tsx b/src/components/views/dialogs/SeshatResetDialog.tsx index 135f5d8197..63654ca949 100644 --- a/src/components/views/dialogs/SeshatResetDialog.tsx +++ b/src/components/views/dialogs/SeshatResetDialog.tsx @@ -36,7 +36,7 @@ export default class SeshatResetDialog extends React.PureComponent {_t("You most likely do not want to reset your event index store")}
{_t("If you do, please note that none of your messages will be deleted, " + - "but the search experience might be degraded for a few moments" + + "but the search experience might be degraded for a few moments " + "whilst the index is recreated", )}

diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 02236f9997..a51e67c54a 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2308,7 +2308,7 @@ "About homeservers": "About homeservers", "Reset event store?": "Reset event store?", "You most likely do not want to reset your event index store": "You most likely do not want to reset your event index store", - "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated", + "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few moments whilst the index is recreated": "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few moments whilst the index is recreated", "Reset event store": "Reset event store", "Sign out and remove encryption keys?": "Sign out and remove encryption keys?", "Clear Storage and Sign Out": "Clear Storage and Sign Out", From 3b66821258974a82b280e189638926a33d8000f9 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Wed, 14 Apr 2021 19:59:17 +0100 Subject: [PATCH 082/154] move DM invite responsiblity to the server side --- src/components/views/dialogs/InviteDialog.tsx | 39 +++++++++++-------- src/createRoom.ts | 6 +++ 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index c89e61bd18..5ca7e3aec2 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -31,6 +31,7 @@ import Modal from "../../../Modal"; import {humanizeTime} from "../../../utils/humanize"; import createRoom, { canEncryptToAllUsers, ensureDMExists, findDMForUser, privateShouldBeEncrypted, + IInvite3PID, } from "../../../createRoom"; import {inviteMultipleToRoom, showCommunityInviteDialog} from "../../../RoomInvite"; import {Key} from "../../../Keyboard"; @@ -656,29 +657,33 @@ export default class InviteDialog extends React.PureComponent 1) { + createRoomOptions.createOpts = targetIds.reduce( + (roomOptions, address) => { + if (getAddressType(address) === 'email') { + const invite: IInvite3PID = { + id_server: client.getIdentityServerUrl(true), + medium: 'email', + address, + }; + roomOptions.invite_3pid.push(invite); + } else { + roomOptions.invite.push(address); + } + return roomOptions; + }, + { invite: [], invite_3pid: [] }, + ) } + + await createRoom(createRoomOptions); + this.props.onFinished(); } catch (err) { console.error(err); this.setState({ diff --git a/src/createRoom.ts b/src/createRoom.ts index a5343076ac..310d894266 100644 --- a/src/createRoom.ts +++ b/src/createRoom.ts @@ -90,6 +90,12 @@ export interface IOpts { parentSpace?: Room; } +export interface IInvite3PID { + id_server: string, + medium: 'email', + address: string, +} + /** * Create a new room, and switch to it. * From a3bcb730479e07c1ca4ed9adf023d607f770f637 Mon Sep 17 00:00:00 2001 From: Sebastian Lithgow Date: Wed, 14 Apr 2021 18:57:17 +0000 Subject: [PATCH 083/154] Translated using Weblate (Danish) Currently translated at 21.2% (621 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/da/ --- src/i18n/strings/da.json | 42 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index 32dba2f063..ca28295c4f 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -618,5 +618,45 @@ "Unable to access microphone": "Kan ikke tilgå mikrofonen", "The call could not be established": "Opkaldet kunne ikke etableres", "Call Declined": "Opkald afvist", - "Folder": "Mappe" + "Folder": "Mappe", + "We couldn't log you in": "Vi kunne ikke logge dig ind", + "Try again": "Prøv igen", + "Already in call": "", + "You're already in a call with this person.": "Du har allerede i et opkald med denne person.", + "Chile": "Chile", + "Call failed because webcam or microphone could not be accessed. Check that:": "Opkald fejlede på grund af kamera og mikrofon ikke kunne nås. Tjek dette:", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Opkald fejlede på grund af mikrofon ikke kunne nås. Tjek at din mikrofon er tilsluttet og sat op rigtigt.", + "India": "Indien", + "Iceland": "Island", + "Hong Kong": "Hong Kong", + "Greenland": "Grønland", + "Greece": "Grækenland", + "Ghana": "Ghana", + "Germany": "Tyskland", + "Faroe Islands": "Færøerne", + "Estonia": "Estonien", + "Ecuador": "Ecuador", + "Czech Republic": "Tjekkiet", + "Colombia": "Colombien", + "Chad": "Chad", + "Bulgaria": "Bulgarien", + "Brazil": "Brazilien", + "Bosnia": "Bosnien", + "Bolivia": "Bolivien", + "Belarus": "Hviderusland", + "Austria": "Østrig", + "Australia": "Australien", + "Armenia": "Armenien", + "Argentina": "Argentina", + "Antarctica": "Antarktis", + "Angola": "Angola", + "Albania": "Albanien", + "Afghanistan": "Afghanistan", + "United States": "Amerikas Forenede Stater", + "United Kingdom": "Storbritanien", + "This will end the conference for everyone. Continue?": "Dette vil afbryde opkaldet for alle. Fortsæt?", + "No other application is using the webcam": "Ingen anden application bruger kameraet", + "A microphone and webcam are plugged in and set up correctly": "En mikrofon og kamera er tilsluttet og sat op rigtigt", + "Croatia": "Kroatien", + "Answered Elsewhere": "Svaret andet sted" } From 2ce36a210ce30b7cbbbc01d20ecefc7e006858ac Mon Sep 17 00:00:00 2001 From: "@a2sc:matrix.org" Date: Mon, 12 Apr 2021 10:29:24 +0000 Subject: [PATCH 084/154] Translated using Weblate (German) Currently translated at 98.4% (2870 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 675c27c9a3..c90b5f1c33 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -3225,5 +3225,6 @@ "Check your devices": "Überprüfe dein Gerät", "%(deviceId)s from %(ip)s": "%(deviceId)s von %(ip)s", "This homeserver has been blocked by it's administrator.": "Dieser Heimserver wurde von seiner Administration blockiert.", - "You have unverified logins": "Du hast nicht-bestätigte Anmeldungen" + "You have unverified logins": "Du hast nicht-bestätigte Anmeldungen", + "Review to ensure your account is safe": "Überprüfen, um sicher zu sein, dass dein Account sicher ist" } From e77d3bea0483b62de7705e26bc5266cc3d58f3ae Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 14 Apr 2021 15:08:11 -0600 Subject: [PATCH 085/154] Pulse animation option for voice record button --- .../views/rooms/_VoiceRecordComposerTile.scss | 22 ++++++++++++++++++- .../legacy-light/css/_legacy-light.scss | 6 +++-- res/themes/light/css/_light.scss | 5 +++-- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/res/css/views/rooms/_VoiceRecordComposerTile.scss b/res/css/views/rooms/_VoiceRecordComposerTile.scss index 2fb112a38c..4d706c7ed4 100644 --- a/res/css/views/rooms/_VoiceRecordComposerTile.scss +++ b/res/css/views/rooms/_VoiceRecordComposerTile.scss @@ -53,7 +53,9 @@ limitations under the License. font-size: $font-14px; &::before { - // TODO: @@ TravisR: Animate + // Pulsing animation + animation: recording-pulse 1.5s infinite; + content: ''; background-color: $voice-record-live-circle-color; width: 10px; @@ -74,3 +76,21 @@ limitations under the License. width: 42px; // we're not using a monospace font, so fake it } } + +@keyframes recording-pulse { + // Source: https://codepen.io/FlorinPop17/pen/drJJzK + // Same source: https://www.florin-pop.com/blog/2019/03/css-pulse-effect/ + + 0% { + transform: scale(0.95); + box-shadow: 0 0 0 0 $voice-record-live-circle-color; + } + 70% { + transform: scale(1); + box-shadow: 0 0 0 6px transparent; + } + 100% { + transform: scale(0.95); + box-shadow: 0 0 0 0 transparent; + } +} diff --git a/res/themes/legacy-light/css/_legacy-light.scss b/res/themes/legacy-light/css/_legacy-light.scss index 7cb7082c4e..8ce231f47c 100644 --- a/res/themes/legacy-light/css/_legacy-light.scss +++ b/res/themes/legacy-light/css/_legacy-light.scss @@ -189,11 +189,13 @@ $roomsublist-skeleton-ui-bg: linear-gradient(180deg, #ffffff 0%, #ffffff00 100%) $groupFilterPanel-divider-color: $roomlist-header-color; +// See non-legacy _light for variable information $voice-record-stop-border-color: #E3E8F0; -$voice-record-stop-symbol-color: $warning-color; +$voice-record-stop-symbol-color: #ff4b55; $voice-record-waveform-bg-color: #E3E8F0; $voice-record-waveform-fg-color: $muted-fg-color; -$voice-record-live-circle-color: $warning-color; +$voice-record-live-circle-color: #ff4b55; +$voice-record-live-halo-color: #ff4b5544; $roomtile-preview-color: #9e9e9e; $roomtile-default-badge-bg-color: #61708b; diff --git a/res/themes/light/css/_light.scss b/res/themes/light/css/_light.scss index dc26c4d652..4744c4d5b6 100644 --- a/res/themes/light/css/_light.scss +++ b/res/themes/light/css/_light.scss @@ -181,10 +181,11 @@ $roomsublist-skeleton-ui-bg: linear-gradient(180deg, #ffffff 0%, #ffffff00 100%) $groupFilterPanel-divider-color: $roomlist-header-color; $voice-record-stop-border-color: #E3E8F0; -$voice-record-stop-symbol-color: $warning-color; +$voice-record-stop-symbol-color: #ff4b55; // $warning-color, but without letting people change it in themes $voice-record-waveform-bg-color: #E3E8F0; $voice-record-waveform-fg-color: $muted-fg-color; -$voice-record-live-circle-color: $warning-color; +$voice-record-live-circle-color: #ff4b55; // $warning-color, but without letting people change it in themes +$voice-record-live-halo-color: #ff4b5544; // $warning-color, but with some alpha and without theme support $roomtile-preview-color: $secondary-fg-color; $roomtile-default-badge-bg-color: #61708b; From 595225b98b240df574fc609d7f48618d3c023e08 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 14 Apr 2021 15:10:57 -0600 Subject: [PATCH 086/154] A different animation option for pulsing record icons --- .../views/rooms/_VoiceRecordComposerTile.scss | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/res/css/views/rooms/_VoiceRecordComposerTile.scss b/res/css/views/rooms/_VoiceRecordComposerTile.scss index 4d706c7ed4..6eee496e8d 100644 --- a/res/css/views/rooms/_VoiceRecordComposerTile.scss +++ b/res/css/views/rooms/_VoiceRecordComposerTile.scss @@ -54,7 +54,7 @@ limitations under the License. &::before { // Pulsing animation - animation: recording-pulse 1.5s infinite; + animation: recording-pulse 1s infinite; content: ''; background-color: $voice-record-live-circle-color; @@ -78,19 +78,13 @@ limitations under the License. } @keyframes recording-pulse { - // Source: https://codepen.io/FlorinPop17/pen/drJJzK - // Same source: https://www.florin-pop.com/blog/2019/03/css-pulse-effect/ - 0% { - transform: scale(0.95); - box-shadow: 0 0 0 0 $voice-record-live-circle-color; + opacity: 1; } - 70% { - transform: scale(1); - box-shadow: 0 0 0 6px transparent; + 65% { + opacity: 0; } 100% { - transform: scale(0.95); - box-shadow: 0 0 0 0 transparent; + opacity: 1; } } From 208152d10f188d96910576de57ebf418314400c5 Mon Sep 17 00:00:00 2001 From: Sven Grewe Date: Wed, 14 Apr 2021 21:52:25 +0000 Subject: [PATCH 087/154] Translated using Weblate (German) Currently translated at 98.1% (2862 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 132 ++++++++++++++++++------------------ 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index c90b5f1c33..6ab638b6c1 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -115,7 +115,7 @@ "You are already in a call.": "Du bist bereits in einem Gespräch.", "You cannot place a call with yourself.": "Du kannst keinen Anruf mit dir selbst starten.", "You cannot place VoIP calls in this browser.": "VoIP-Gespräche werden von diesem Browser nicht unterstützt.", - "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Deine E-Mail-Adresse scheint nicht mit einer Matrix-ID auf diesem Homeserver verbunden zu sein.", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Deine E-Mail-Adresse scheint nicht mit einer Matrix-ID auf diesem Heimserver verbunden zu sein.", "Sun": "So", "Mon": "Mo", "Tue": "Di", @@ -155,7 +155,7 @@ "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s von %(fromPowerLevel)s zu %(toPowerLevel)s", "%(senderName)s invited %(targetName)s.": "%(senderName)s hat %(targetName)s eingeladen.", "%(targetName)s joined the room.": "%(targetName)s hat den Raum betreten.", - "%(senderName)s kicked %(targetName)s.": "%(senderName)s hat %(targetName)s gekickt.", + "%(senderName)s kicked %(targetName)s.": "%(senderName)s hat %(targetName)s rausgeworfen.", "%(targetName)s left the room.": "%(targetName)s hat den Raum verlassen.", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s hat den Chatverlauf für alle Raummitglieder ab ihrer Einladung sichtbar gemacht.", "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s hat den Chatverlauf für alle Raummitglieder ab ihrem Beitreten sichtbar gemacht.", @@ -238,7 +238,7 @@ "%(items)s and %(lastItem)s": "%(items)s und %(lastItem)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s. %(monthName)s %(fullYear)s %(time)s", "Access Token:": "Zugangs-Token:", - "Always show message timestamps": "Nachrichten-Zeitstempel immer anzeigen", + "Always show message timestamps": "Nachrichtenzeitstempel immer anzeigen", "Authentication": "Authentifizierung", "An error has occurred.": "Ein Fehler ist aufgetreten.", "Confirm password": "Passwort bestätigen", @@ -380,7 +380,7 @@ "(could not connect media)": "(Medienverbindung konnte nicht hergestellt werden)", "(no answer)": "(keine Antwort)", "(unknown failure: %(reason)s)": "(Unbekannter Fehler: %(reason)s)", - "Your browser does not support the required cryptography extensions": "Dein Browser unterstützt die benötigten Verschlüsselungs-Erweiterungen nicht", + "Your browser does not support the required cryptography extensions": "Dein Browser unterstützt die benötigten Verschlüsselungserweiterungen nicht", "Not a valid %(brand)s keyfile": "Keine gültige %(brand)s-Schlüsseldatei", "Authentication check failed: incorrect password?": "Authentifizierung fehlgeschlagen: Falsches Passwort?", "Do you want to set an email address?": "Möchtest du eine E-Mail-Adresse setzen?", @@ -392,7 +392,7 @@ "Delete widget": "Widget entfernen", "Define the power level of a user": "Berechtigungsstufe einers Benutzers setzen", "Edit": "Bearbeiten", - "Enable automatic language detection for syntax highlighting": "Automatische Spracherkennung für die Syntax-Hervorhebung", + "Enable automatic language detection for syntax highlighting": "Automatische Spracherkennung für die Syntaxhervorhebung", "To get started, please pick a username!": "Um zu starten, wähle bitte einen Nutzernamen!", "Unable to create widget.": "Widget kann nicht erstellt werden.", "You are not in this room.": "Du bist nicht in diesem Raum.", @@ -451,7 +451,7 @@ "Pinned Messages": "Angeheftete Nachrichten", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s hat die angehefteten Nachrichten für diesen Raum geändert.", "Jump to read receipt": "Zur Lesebestätigung springen", - "Message Pinning": "Nachrichten-Anheftung", + "Message Pinning": "Nachrichtenanheftung", "Long Description (HTML)": "Lange Beschreibung (HTML)", "Jump to message": "Zur Nachricht springen", "No pinned messages.": "Keine angehefteten Nachrichten vorhanden.", @@ -627,7 +627,7 @@ "The version of %(brand)s": "Die %(brand)s-Version", "Your language of choice": "Deine ausgewählte Sprache", "Whether or not you're using the Richtext mode of the Rich Text Editor": "Ob du den Richtext-Modus des Editors benutzt oder nicht", - "Your homeserver's URL": "Deine Homeserver-URL", + "Your homeserver's URL": "Deine Heimserver-URL", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s. %(monthName)s %(fullYear)s", "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Du wirst nicht in der Lage sein, die Änderung zurückzusetzen, da du dich degradierst. Wenn du der letze Nutzer mit Berechtigungen bist, wird es unmöglich sein die Privilegien zurückzubekommen.", "Community IDs cannot be empty.": "Community-IDs können nicht leer sein.", @@ -795,7 +795,7 @@ "We encountered an error trying to restore your previous session.": "Wir haben ein Problem beim Wiederherstellen deiner vorherigen Sitzung festgestellt.", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Den Browser-Speicher zu löschen kann das Problem lösen, wird dich aber abmelden und verschlüsselte Chats unlesbar machen.", "Collapse Reply Thread": "Antwort-Thread zusammenklappen", - "Enable widget screenshots on supported widgets": "Widget-Screenshots bei unterstützten Widgets aktivieren", + "Enable widget screenshots on supported widgets": "Widgetbildschirmfotos bei unterstützten Widgets aktivieren", "Send analytics data": "Analysedaten senden", "e.g. %(exampleValue)s": "z.B. %(exampleValue)s", "Muted Users": "Stummgeschaltete Benutzer", @@ -840,8 +840,8 @@ "System Alerts": "Systembenachrichtigung", "Only room administrators will see this warning": "Nur Raum-Administratoren werden diese Nachricht sehen", "Please contact your service administrator to continue using the service.": "Bitte kontaktiere deinen Systemadministrator, um diesen Dienst weiter zu nutzen.", - "This homeserver has hit its Monthly Active User limit.": "Dieser Heimserver hat sein Limit an monatlich aktiven Nutzern erreicht.", - "This homeserver has exceeded one of its resource limits.": "Dieser Heimserver hat einen seiner Ressourcen-Limits überschritten.", + "This homeserver has hit its Monthly Active User limit.": "Dieser Heimserver hat seinen Grenzwert an monatlich aktiven Nutzern erreicht.", + "This homeserver has exceeded one of its resource limits.": "Dieser Heimserver hat einen seiner Ressourcengrenzwert überschritten.", "Upgrade Room Version": "Raum-Version aufrüsten", "Create a new room with the same name, description and avatar": "Einen neuen Raum mit demselben Namen, Beschreibung und Profilbild erstellen", "Update any local room aliases to point to the new room": "Alle lokalen Raum-Aliase aktualisieren, damit sie auf den neuen Raum zeigen", @@ -850,8 +850,8 @@ "Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please contact your service administrator to continue using the service.": "Deine Nachricht wurde nicht gesendet, weil dieser Heimserver sein Limit an monatlich aktiven Benutzern erreicht hat. Bitte kontaktiere deinen Systemadministrator um diesen Dienst weiter zu nutzen.", "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Deine Nachricht wurde nicht gesendet, weil dieser Heimserver ein Ressourcen-Limit erreicht hat. Bitte kontaktiere deinen Systemadministrator um diesen Dienst weiter zu nutzen.", "Please contact your service administrator to continue using this service.": "Bitte kontaktiere deinen Systemadministrator um diesen Dienst weiter zu nutzen.", - "Sorry, your homeserver is too old to participate in this room.": "Sorry, dein Homeserver ist zu alt, um an diesem Raum teilzunehmen.", - "Please contact your homeserver administrator.": "Bitte setze dich mit der Administration deines Homeservers in Verbindung.", + "Sorry, your homeserver is too old to participate in this room.": "Tschuldige, dein Heimserver ist zu alt, um an diesem Raum teilzunehmen.", + "Please contact your homeserver administrator.": "Bitte setze dich mit der Administration deines Heimservers in Verbindung.", "Legal": "Rechtliches", "This room has been replaced and is no longer active.": "Dieser Raum wurde ersetzt und ist nicht länger aktiv.", "The conversation continues here.": "Die Konversation wird hier fortgesetzt.", @@ -860,7 +860,7 @@ "Failed to upgrade room": "Konnte Raum nicht aufrüsten", "The room upgrade could not be completed": "Die Raum-Aufrüstung konnte nicht fertiggestellt werden", "Upgrade this room to version %(version)s": "Diesen Raum zur Version %(version)s aufrüsten", - "Forces the current outbound group session in an encrypted room to be discarded": "Erzwingt, dass die aktuell ausgehende Gruppen-Sitzung in einem verschlüsseltem Raum verworfen wird", + "Forces the current outbound group session in an encrypted room to be discarded": "Erzwingt, dass die aktuell ausgehende Gruppensitzung in einem verschlüsseltem Raum verworfen wird", "Unable to connect to Homeserver. Retrying...": "Verbindung mit Heimserver nicht möglich. Versuche erneut...", "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s hat die Hauptadresse zu diesem Raum auf %(address)s gesetzt.", "%(senderName)s removed the main address for this room.": "%(senderName)s hat die Hauptadresse von diesem Raum entfernt.", @@ -933,7 +933,7 @@ "Encrypted messages in group chats": "Verschlüsselte Gruppenchats", "Use a longer keyboard pattern with more turns": "Nutze ein längeres Tastaturmuster mit mehr Abwechslung", "Straight rows of keys are easy to guess": "Gerade Reihen von Tasten sind einfach zu erraten", - "Custom user status messages": "Angepasste Nutzerstatus-Nachrichten", + "Custom user status messages": "Angepasste Nutzerstatusnachrichten", "Unable to load key backup status": "Konnte Status der Schlüsselsicherung nicht laden", "Don't ask again": "Nicht erneut fragen", "Set up": "Einrichten", @@ -976,16 +976,16 @@ "%(names)s and %(count)s others are typing …|other": "%(names)s und %(count)s andere tippen…", "%(names)s and %(count)s others are typing …|one": "%(names)s und eine weitere Person tippen…", "%(names)s and %(lastPerson)s are typing …": "%(names)s und %(lastPerson)s tippen…", - "Render simple counters in room header": "Einfache Zähler in Raum-Kopfzeile anzeigen", - "Enable Emoji suggestions while typing": "Emoji-Vorschläge während Eingabe", + "Render simple counters in room header": "Einfache Zähler in Raumkopfzeile anzeigen", + "Enable Emoji suggestions while typing": "Emojivorschläge während Eingabe", "Show a placeholder for removed messages": "Zeigt einen Platzhalter für gelöschte Nachrichten an", - "Show join/leave messages (invites/kicks/bans unaffected)": "Betreten oder Verlassen von Benutzern (ausgen. Kicks/Bans)", - "Show avatar changes": "Avatar-Änderungen anzeigen", + "Show join/leave messages (invites/kicks/bans unaffected)": "Betreten oder Verlassen von Benutzern (ausgen. Einladungen/Rauswürfe/Banne)", + "Show avatar changes": "Avataränderungen anzeigen", "Show display name changes": "Änderungen von Anzeigenamen", "Send typing notifications": "Tippbenachrichtigungen senden", "Show avatars in user and room mentions": "Avatare in Benutzer- und Raumerwähnungen", "Enable big emoji in chat": "Große Emojis im Chat anzeigen", - "Enable Community Filter Panel": "Community-Filter-Panel", + "Enable Community Filter Panel": "Community-Filtertafel", "Messages containing my username": "Nachrichten mit meinem Benutzernamen", "The other party cancelled the verification.": "Die Gegenstelle hat die Überprüfung abgebrochen.", "Verified!": "Verifiziert!", @@ -1028,7 +1028,7 @@ "Deactivating your account is a permanent action - be careful!": "Die Deaktivierung deines Kontos ist unwiderruflich - sei vorsichtig!", "Preferences": "Chats", "Room list": "Raumliste", - "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Die Datei '%(fileName)s' überschreitet die maximale Uploadgröße deines Homeservers", + "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Die Datei '%(fileName)s' überschreitet die maximale Uploadgröße deines Heimservers", "This room has no topic.": "Dieser Raum hat kein Thema.", "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s hat den Raum für jeden, der den Link kennt, öffentlich gemacht.", "%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s hat den Raum auf eingeladene Benutzer beschränkt.", @@ -1036,7 +1036,7 @@ "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s erlaubte Gäste diesem Raum beizutreten.", "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s hat Gästen verboten, diesem Raum beizutreten.", "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s änderte den Gastzugriff auf '%(rule)s'", - "Group & filter rooms by custom tags (refresh to apply changes)": "Gruppiere & filtere Räume nach eigenen Tags (neu laden um Änderungen zu übernehmen)", + "Group & filter rooms by custom tags (refresh to apply changes)": "Gruppiere und filtere Räume nach eigenen Tags (neu laden um Änderungen zu übernehmen)", "Unable to find a supported verification method.": "Konnte keine unterstützte Verifikationsmethode finden.", "Dog": "Hund", "Cat": "Katze", @@ -1245,21 +1245,21 @@ "Changes your avatar in this current room only": "Ändert deinen Avatar für diesen Raum", "Unbans user with given ID": "Entbannt den Benutzer mit der angegebenen ID", "Sends the given message coloured as a rainbow": "Sendet die Nachricht in Regenbogenfarben", - "Adds a custom widget by URL to the room": "Fügt ein Benutzer-Widget über eine URL zum Raum hinzu", + "Adds a custom widget by URL to the room": "Fügt ein Benutzerwidget über eine URL zum Raum hinzu", "Please supply a https:// or http:// widget URL": "Bitte gib eine mit https:// oder http:// beginnende Widget-URL an", "Sends the given emote coloured as a rainbow": "Zeigt Aktionen in Regenbogenfarben", "%(senderName)s made no change.": "%(senderName)s hat keine Änderung vorgenommen.", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s hat die Einladung zum Raumbeitritt für %(targetDisplayName)s zurückgezogen.", "Cannot reach homeserver": "Der Heimserver ist nicht erreichbar", - "Ensure you have a stable internet connection, or get in touch with the server admin": "Stelle sicher, dass du eine stabile Internetverbindung hast oder wende dich an deinen Server-Administrator", + "Ensure you have a stable internet connection, or get in touch with the server admin": "Stelle sicher, dass du eine stabile Internetverbindung hast oder wende dich an deinen Serveradministrator", "Ask your %(brand)s admin to check your config for incorrect or duplicate entries.": "Wende dich an deinen %(brand)s-Admin um deine Konfiguration auf ungültige oder doppelte Einträge zu überprüfen.", - "Unexpected error resolving identity server configuration": "Ein unerwarteter Fehler ist beim Laden der Identitätsserver-Konfiguration aufgetreten", + "Unexpected error resolving identity server configuration": "Ein unerwarteter Fehler ist beim Laden der Identitätsserverkonfiguration aufgetreten", "Cannot reach identity server": "Der Identitätsserver ist nicht erreichbar", - "You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Du kannst dich registrieren, aber manche Funktionen werden erst wieder verfügbar sein, wenn der Identitätsserver wieder online ist. Wenn diese Warnmeldung weiterhin angezeigt wird, überprüfe deine Konfiguration oder kontaktiere die Server-Administration.", - "You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Du kannst dein Passwort zurücksetzen, aber manche Funktionen werden nicht verfügbar sein, bis der Identitätsserver wieder online ist. Wenn du diese Warnmeldung weiterhin siehst, überprüfe deine Konfiguration oder kontaktiere die Server-Administration.", - "You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Du kannst dich einloggen, aber manche Funktionen werden nicht verfügbar sein bis der Identitätsserver wieder online ist. Wenn du diese Warnmeldung weiterhin siehst, überprüfe deine Konfiguration oder kontaktiere deinen Server-Administrator.", + "You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Du kannst dich registrieren, aber manche Funktionen werden erst wieder verfügbar sein, wenn der Identitätsserver wieder online ist. Wenn diese Warnmeldung weiterhin angezeigt wird, überprüfe deine Konfiguration oder kontaktiere die Serveradministration.", + "You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Du kannst dein Passwort zurücksetzen, aber manche Funktionen werden nicht verfügbar sein, bis der Identitätsserver wieder online ist. Wenn du diese Warnmeldung weiterhin siehst, überprüfe deine Konfiguration oder kontaktiere die Serveradministrator.", + "You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Du kannst dich anmelden, aber manche Funktionen werden nicht verfügbar sein bis der Identitätsserver wieder erreichbar ist. Wenn du diese Warnmeldung weiterhin siehst, überprüfe deine Konfiguration oder kontaktiere deinen Serveradministrator.", "No homeserver URL provided": "Keine Heimserver-URL angegeben", - "Unexpected error resolving homeserver configuration": "Ein unerwarteter Fehler ist beim Laden der Heimserver-Konfiguration aufgetreten", + "Unexpected error resolving homeserver configuration": "Ein unerwarteter Fehler ist beim Laden der Heimserverkonfiguration aufgetreten", "The user's homeserver does not support the version of the room.": "Die Raumversion wird vom Heimserver des Benutzers nicht unterstützt.", "Show hidden events in timeline": "Zeige versteckte Ereignisse in der Chronik", "Low bandwidth mode": "Modus für niedrige Bandbreite", @@ -1298,7 +1298,7 @@ "Call failed due to misconfigured server": "Anruf aufgrund eines falsch konfigurierten Servers fehlgeschlagen", "Try using turn.matrix.org": "Versuche es mit turn.matrix.org", "You do not have the required permissions to use this command.": "Du hast nicht die erforderlichen Berechtigungen, diesen Befehl zu verwenden.", - "Multiple integration managers": "Mehrere Integrationsmanager", + "Multiple integration managers": "Mehrere Integrationsverwalter", "Public Name": "Öffentlicher Name", "Identity Server URL must be HTTPS": "Die Identity-Server-URL über HTTPS erreichbar sein", "Could not connect to Identity Server": "Verbindung zum Identitätsserver konnte nicht hergestellt werden", @@ -1307,7 +1307,7 @@ "Disconnect": "Trennen", "Identity Server": "Identitätsserver", "Use an identity server": "Benutze einen Identitätsserver", - "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Benutze einen Identitätsserver, um andere mittels E-Mail einzuladen. Klicke auf fortfahren, um den Standard-Identitätsserver (%(defaultIdentityServerName)s) zu benutzen oder ändere ihn in den Einstellungen.", + "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Benutze einen Identitätsserver, um andere mittels E-Mail einzuladen. Klicke auf fortfahren, um den Standardidentitätsserver (%(defaultIdentityServerName)s) zu benutzen oder ändere ihn in den Einstellungen.", "ID": "ID", "Not a valid Identity Server (status code %(code)s)": "Ungültiger Identitätsserver (Fehlercode %(code)s)", "Terms of service not accepted or the identity server is invalid.": "Die Nutzungsbedingungen wurden nicht akzeptiert oder der Identitätsserver ist ungültig.", @@ -1329,7 +1329,7 @@ "Find a room… (e.g. %(exampleRoom)s)": "Einen Raum suchen… (z.B. %(exampleRoom)s)", "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Wenn du den gesuchten Raum nicht finden kannst, frage nach einer Einladung für den Raum oder Erstelle einen neuen Raum.", "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativ kannst du versuchen, den öffentlichen Server unter turn.matrix.org zu verwenden. Allerdings wird dieser nicht so zuverlässig sein und du teilst deine IP-Adresse mit dem Server. Du kannst dies auch in den Einstellungen konfigurieren.", - "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Diese Handlung erfordert es, auf den Standard-Identitätsserver zuzugreifen, um eine E-Mail Adresse oder Telefonnummer zu validieren, aber der Server hat keine Nutzungsbedingungen.", + "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Diese Handlung erfordert es, auf den Standardidentitätsserver zuzugreifen, um eine E-Mail-Adresse oder Telefonnummer zu validieren, aber der Server hat keine Nutzungsbedingungen.", "Only continue if you trust the owner of the server.": "Fahre nur fort, wenn du den Betreibern des Servers vertraust.", "Trust": "Vertrauen", "Custom (%(level)s)": "Benutzerdefinierte (%(level)s)", @@ -1368,7 +1368,7 @@ "%(num)s hours from now": "in %(num)s Stunden", "about a day from now": "in etwa einem Tag", "%(num)s days from now": "in %(num)s Tagen", - "Show info about bridges in room settings": "Information über Bridges in den Raumeinstellungen anzeigen", + "Show info about bridges in room settings": "Information über Brücken in den Raumeinstellungen anzeigen", "Enable message search in encrypted rooms": "Nachrichtensuche in verschlüsselten Räumen aktivieren", "Lock": "Schloss", "Later": "Später", @@ -1416,22 +1416,22 @@ "View rules": "Regeln öffnen", "You are currently subscribed to:": "Du abonnierst momentan:", "⚠ These settings are meant for advanced users.": "⚠ Diese Einstellungen sind für fortgeschrittene Nutzer gedacht.", - "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Ob du %(brand)s auf einem Gerät verwendest, bei dem Touch die primäre Eingabemöglichkeit ist", + "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Ob du %(brand)s auf einem Gerät verwendest, bei dem die Berührung die primäre Eingabemöglichkeit ist", "Whether you're using %(brand)s as an installed Progressive Web App": "Ob du %(brand)s als installierte progressive Web-App (PWA) verwendest", - "Your user agent": "Dein User-Agent", + "Your user agent": "Dein Useragent", "If you cancel now, you won't complete verifying the other user.": "Wenn Sie jetzt abbrechen, werden Sie die Verifizierung des anderen Nutzers nicht beenden können.", "If you cancel now, you won't complete verifying your other session.": "Wenn Sie jetzt abbrechen, werden Sie die Verifizierung der anderen Sitzung nicht beenden können.", "Cancel entering passphrase?": "Eingabe der Passphrase abbrechen?", "Setting up keys": "Einrichten der Schlüssel", - "Encryption upgrade available": "Verschlüsselungs-Update verfügbar", - "Verifies a user, session, and pubkey tuple": "Verifiziert einen Benutzer, eine Sitzung und Pubkey-Tupel", + "Encryption upgrade available": "Verschlüsselungsaufstufung verfügbar", + "Verifies a user, session, and pubkey tuple": "Verifiziert einen Benutzer, eine Sitzung und die Endlichkeit eines öffentlichen Schlüssels", "Unknown (user, session) pair:": "Unbekanntes Nutzer-/Sitzungspaar:", "Session already verified!": "Sitzung bereits verifiziert!", "WARNING: Session already verified, but keys do NOT MATCH!": "WARNUNG: Die Sitzung wurde bereits verifiziert, aber die Schlüssel passen NICHT ZUSAMMEN!", - "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ACHTUNG: SCHLÜSSEL-VERIFIZIERUNG FEHLGESCHLAGEN! Der Signierschlüssel für %(userId)s und Sitzung %(deviceId)s ist \"%(fprint)s\", was nicht mit dem bereitgestellten Schlüssel \"%(fingerprint)s\" übereinstimmt. Das könnte bedeuten, dass deine Kommunikation abgehört wird!", + "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "ACHTUNG: SCHLÜSSELVERIFIZIERUNG FEHLGESCHLAGEN! Der Signierschlüssel für %(userId)s und Sitzung %(deviceId)s ist \"%(fprint)s\", was nicht mit dem bereitgestellten Schlüssel \"%(fingerprint)s\" übereinstimmt. Das könnte bedeuten, dass deine Kommunikation abgehört wird!", "Never send encrypted messages to unverified sessions from this session": "Niemals verschlüsselte Nachrichten von dieser Sitzung zu unverifizierten Sitzungen senden", "Never send encrypted messages to unverified sessions in this room from this session": "Niemals verschlüsselte Nachrichten von dieser Sitzung zu unverifizierten Sitzungen in diesem Raum senden", - "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Durch die Änderung des Passworts werden derzeit alle Ende-zu-Ende-Verschlüsselungsschlüssel in allen Sitzungen zurückgesetzt, sodass der verschlüsselte Chat-Verlauf nicht mehr lesbar ist, es sei denn, du exportierst zuerst deine Raumschlüssel und importierst sie anschließend wieder. In Zukunft wird dies verbessert werden.", + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Durch die Änderung des Passworts werden derzeit alle Ende-zu-Ende-Verschlüsselungsschlüssel in allen Sitzungen zurückgesetzt, sodass der verschlüsselte Chatverlauf nicht mehr lesbar ist, es sei denn, du exportierst zuerst deine Raumschlüssel und importierst sie anschließend wieder. In Zukunft wird dies verbessert werden.", "Delete %(count)s sessions|other": "%(count)s Sitzungen löschen", "Backup is not signed by any of your sessions": "Die Sicherung wurde von keiner deiner Sitzungen bestätigt", "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Dein Passwort wurde erfolgreich geändert. Du erhältst keine Push-Benachrichtigungen zu anderen Sitzungen, bis du dich wieder bei diesen anmeldest", @@ -1633,11 +1633,11 @@ "Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im HTML-Format, ohne sie als Markdown zu darzustellen", "Show rooms with unread notifications first": "Räume mit ungelesenen Benachrichtigungen zuerst zeigen", "Show shortcuts to recently viewed rooms above the room list": "Kürzlich besuchte Räume anzeigen", - "Use Single Sign On to continue": "Einmal-Anmeldung zum Fortfahren nutzen", - "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte E-Mail-Adresse mit der Einmal-Anmeldung, um deine Identität nachzuweisen.", - "Single Sign On": "Einmal-Anmeldung", + "Use Single Sign On to continue": "Einmalanmeldung zum Fortfahren nutzen", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte E-Mail-Adresse mit der Einmalanmeldung, um deine Identität nachzuweisen.", + "Single Sign On": "Einmalanmeldung", "Confirm adding email": "Hinzugefügte E-Mail-Addresse bestätigen", - "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte Telefonnummer, indem du deine Identität mittels der Einmal-Anmeldung nachweist.", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte Telefonnummer, indem du deine Identität mittels der Einmalanmeldung nachweist.", "Click the button below to confirm adding this phone number.": "Klicke unten die Schaltfläche, um die hinzugefügte Telefonnummer zu bestätigen.", "If you cancel now, you won't complete your operation.": "Wenn du jetzt abbrichst, wirst du deinen Vorgang nicht fertigstellen.", "%(name)s is requesting verification": "%(name)s fordert eine Verifizierung an", @@ -1676,7 +1676,7 @@ "Forgotten your password?": "Passwort vergessen?", "You're signed out": "Du wurdest abgemeldet", "Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Achtung: Deine persönlichen Daten (einschließlich Verschlüsselungsschlüssel) sind noch in dieser Sitzung gespeichert. Lösche diese Daten, wenn du diese Sitzung nicht mehr benötigst, oder dich mit einem anderen Konto anmelden möchtest.", - "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Melde dich mittels Single Sign-On an, um das Löschen der Sitzungen zu bestätigen.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Melde dich mittels Einmalanmeldung an, um das Löschen der Sitzungen zu bestätigen.", "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Melde dich mittels Single Sign-On an, um das Löschen der Sitzung zu bestätigen.", "Confirm deleting these sessions": "Bestätige das Löschen dieser Sitzungen", "Click the button below to confirm deleting these sessions.|other": "Klicke den Knopf, um das Löschen dieser Sitzungen zu bestätigen.", @@ -1724,7 +1724,7 @@ "Upgrade this room to the recommended room version": "Aktualisiere diesen Raum auf die empfohlene Raumversion", "this room": "Dieser Raum", "View older messages in %(roomName)s.": "Zeige alte Nachrichten in %(roomName)s.", - "Send a bug report with logs": "Einen Fehlerbericht mit Logs senden", + "Send a bug report with logs": "Einen Fehlerbericht mit der Protokolldatei senden", "Verify all your sessions to ensure your account & messages are safe": "Verifiziere alle deine Sitzungen, um dein Konto und deine Nachrichten zu schützen", "Verify your other session using one of the options below.": "Verifiziere deine andere Sitzung mit einer der folgenden Optionen.", "You signed in to a new session without verifying it:": "Du hast dich in einer neuen Sitzung angemeldet ohne sie zu verifizieren:", @@ -1732,25 +1732,25 @@ "Upgrade": "Hochstufen", "Verify the new login accessing your account: %(name)s": "Verifiziere die neue Anmeldung an deinem Konto: %(name)s", "From %(deviceName)s (%(deviceId)s)": "Von %(deviceName)s (%(deviceId)s)", - "Your homeserver does not support cross-signing.": "Dein Heimserver unterstützt kein Cross-Signing.", + "Your homeserver does not support cross-signing.": "Dein Heimserver unterstützt keine Quersignierung.", "Cross-signing and secret storage are enabled.": "Cross-signing und der sichere Speicher wurden eingerichtet.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Dein Konto hat eine Cross-Signing-Identität im sicheren Speicher, der von dieser Sitzung jedoch noch nicht vertraut wird.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Dein Konto hat eine Quersignaturidentität im sicheren Speicher, der von dieser Sitzung jedoch noch nicht vertraut wird.", "Cross-signing and secret storage are not yet set up.": "Cross-Signing und der sichere Speicher sind noch nicht eingerichtet.", "Reset cross-signing and secret storage": "Cross-Signing und den sicheren Speicher zurücksetzen", "Bootstrap cross-signing and secret storage": "Richte Cross-Signing und den sicheren Speicher ein", "unexpected type": "unbekannter Typ", - "Cross-signing public keys:": "Öffentliche Cross-Signing-Schlüssel:", + "Cross-signing public keys:": "Öffentlicher Quersignaturschlüssel:", "in memory": "im Speicher", - "Cross-signing private keys:": "Private Cross-Signing-Schlüssel:", + "Cross-signing private keys:": "Private Quersignaturschlüssel:", "in secret storage": "im Schlüsselspeicher", "Self signing private key:": "Selbst signierter privater Schlüssel:", "cached locally": "lokal zwischengespeichert", "not found locally": "lokal nicht gefunden", - "User signing private key:": "Privater Benutzer-Schlüssel:", + "User signing private key:": "Privater Benutzerschlüssel:", "Session backup key:": "Sitzungswiederherstellungsschlüssel:", "Secret storage public key:": "Öffentlicher Schlüssel des sicheren Speichers:", "in account data": "in den Kontodaten", - "Homeserver feature support:": "Unterstützte Funktionen des Homeservers:", + "Homeserver feature support:": "Unterstützte Funktionen des Heimservers:", "exists": "existiert", "Delete sessions|other": "Sitzungen löschen", "Delete sessions|one": "Sitzung löschen", @@ -2185,7 +2185,7 @@ "Click the button below to confirm setting up encryption.": "Klick die Schaltfläche unten um die Einstellungen der Verschlüsselung zu bestätigen.", "Font scaling": "Schriftskalierung", "Font size": "Schriftgröße", - "IRC display name width": "Breite des IRC Anzeigenamens", + "IRC display name width": "Breite des IRC-Anzeigenamens", "Size must be a number": "Schriftgröße muss eine Zahl sein", "Custom font size can only be between %(min)s pt and %(max)s pt": "Eigene Schriftgröße kann nur eine Zahl zwischen %(min)s pt und %(max)s pt sein", "Use between %(min)s pt and %(max)s pt": "Verwende eine Zahl zwischen %(min)s pt und %(max)s pt", @@ -2200,9 +2200,9 @@ "Help us improve %(brand)s": "Hilf uns, %(brand)s zu verbessern", "Send anonymous usage data which helps us improve %(brand)s. This will use a cookie.": "Hilf uns, %(brand)s zu verbessern, indem du anonyme Nutzungsdaten schickst. Dies wird ein Cookie verwenden.", "I want to help": "Ich möchte helfen", - "Your homeserver has exceeded its user limit.": "Dein Heimserver hat das Benutzerlimit erreicht.", + "Your homeserver has exceeded its user limit.": "Dein Heimserver hat das Benutzergrenzwert erreicht.", "Your homeserver has exceeded one of its resource limits.": "Dein Heimserver hat eine seiner Ressourcengrenzen erreicht.", - "Contact your server admin.": "Kontaktiere deine Heimserver-Administration.", + "Contact your server admin.": "Kontaktiere deine Heimserveradministration.", "Ok": "Ok", "Set password": "Setze Passwort", "To return to your account in future you need to set a password": "Um dein Konto zukünftig wieder verwenden zu können, setze ein Passwort", @@ -2263,7 +2263,7 @@ "Compact": "Kompakt", "Modern": "Modern", "Use a system font": "Systemschriftart verwenden", - "System font name": "System-Schriftart", + "System font name": "Systemschriftart", "Customise your appearance": "Verändere das Erscheinungsbild", "Appearance Settings only affect this %(brand)s session.": "Einstellungen zum Erscheinungsbild wirken sich nur auf diese Sitzung aus.", "The authenticity of this encrypted message can't be guaranteed on this device.": "Die Echtheit dieser verschlüsselten Nachricht kann auf diesem Gerät nicht garantiert werden.", @@ -2363,7 +2363,7 @@ "We’re excited to announce Riot is now Element!": "Wir freuen uns bekanntzugeben: Riot ist jetzt Element!", "Learn more at element.io/previously-riot": "Erfahre mehr unter element.io/previously-riot", "The person who invited you already left the room.": "Die Person, die dich eingeladen hat, hat den Raum bereits verlassen.", - "The person who invited you already left the room, or their server is offline.": "Die Person, die dich eingeladen hat, hat den Raum bereits verlassen oder ihr Server ist offline.", + "The person who invited you already left the room, or their server is offline.": "Die Person, die dich eingeladen hat, hat den Raum bereits verlassen oder ihr Server ist nicht erreichbar bzw. aus.", "Change notification settings": "Benachrichtigungseinstellungen ändern", "Your server isn't responding to some requests.": "Dein Server antwortet auf einige Anfragen nicht.", "Go to Element": "Zu Element gehen", @@ -2478,8 +2478,8 @@ "Group call modified by %(senderName)s": "Gruppenanruf wurde von %(senderName)s verändert", "Group call started by %(senderName)s": "Gruppenanruf von %(senderName)s gestartet", "Group call ended by %(senderName)s": "Gruppenanruf wurde von %(senderName)s beendet", - "Cross-signing is ready for use.": "Cross-Signing ist bereit zur Anwendung.", - "Cross-signing is not set up.": "Cross-Signing wurde nicht eingerichtet.", + "Cross-signing is ready for use.": "Quersignaturen sind bereits in Anwendung.", + "Cross-signing is not set up.": "Quersignierung wurde nicht eingerichtet.", "Backup version:": "Backup-Version:", "Algorithm:": "Algorithmus:", "Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key.": "Sichere deine Verschlüsselungsschlüssel mit deinen Kontodaten, falls du den Zugriff auf deine Sitzungen verlierst. Deine Schlüssel werden mit einem eindeutigen Wiederherstellungsschlüssel gesichert.", @@ -2535,7 +2535,7 @@ "Hide Widgets": "Widgets verstecken", "%(senderName)s declined the call.": "%(senderName)s hat den Anruf abgelehnt.", "(an error occurred)": "(ein Fehler ist aufgetreten)", - "(their device couldn't start the camera / microphone)": "(ihr/sein Gerät konnte Kamera oder Mikrophon nicht starten)", + "(their device couldn't start the camera / microphone)": "(Gerät des Gegenübers konnte Kamera oder Mikrophon nicht starten)", "(connection failed)": "(Verbindung fehlgeschlagen)", "🎉 All servers are banned from participating! This room can no longer be used.": "🎉 Alle Server sind von der Teilnahme ausgeschlossen! Dieser Raum kann nicht mehr genutzt werden.", "%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s hat die Server-ACLs für diesen Raum geändert.", @@ -2616,8 +2616,8 @@ "New version of %(brand)s is available": "Neue Version von %(brand)s verfügbar", "You ended the call": "Du hast den Anruf beendet", "%(senderName)s ended the call": "%(senderName)s hat den Anruf beendet", - "Use Command + Enter to send a message": "Benutze Betriebssystemtaste + Enter um eine Nachricht zu senden", - "Use Ctrl + Enter to send a message": "Nachrichten mit Strg + Enter senden", + "Use Command + Enter to send a message": "Benutze Betriebssystemtaste + Eingabe um eine Nachricht zu senden", + "Use Ctrl + Enter to send a message": "Nachrichten mit Strg + Eingabe senden", "Call Paused": "Anruf pausiert", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Verschlüsselte Nachrichten sicher lokal zwischenspeichern, um sie in Suchergebnissen finden zu können. Es werden %(size)s benötigt, um die Nachrichten von %(rooms)s Räumen zu speichern.", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "Verschlüsselte Nachrichten sicher lokal zwischenspeichern, um sie in Suchergebnissen finden zu können. Es werden %(size)s benötigt, um die Nachrichten vom Raum %(rooms)s zu speichern.", @@ -3038,10 +3038,10 @@ "Use app": "App verwenden", "Element Web is experimental on mobile. For a better experience and the latest features, use our free native app.": "Element Web ist auf mobilen Endgeräten experimentell. Für eine bessere Erfahrung und die neuesten Erweiterungen, nutze unsere freie, native App.", "Use app for a better experience": "Nutze die App für eine bessere Erfahrung", - "We asked the browser to remember which homeserver you use to let you sign in, but unfortunately your browser has forgotten it. Go to the sign in page and try again.": "Wir haben deinen Browser gebeten, sich zu merken, bei welchem Homeserver du dich anmeldest, aber dein Browser hat dies leider vergessen. Gehe zur Anmeldeseite und versuche es erneut.", - "Show stickers button": "Sticker-Schaltfläche", - "Your homeserver rejected your log in attempt. This could be due to things just taking too long. Please try again. If this continues, please contact your homeserver administrator.": "Dein Homeserver hat deinen Anmeldeversuch abgelehnt. Vielleicht dauert der Prozess einfach zu lange. Bitte versuche es erneut. Wenn dies öfters passiert, wende dich bitte an deine Homeserver-Administration.", - "Your homeserver was unreachable and was not able to log you in. Please try again. If this continues, please contact your homeserver administrator.": "Dein Homeserver war nicht erreichbar und konnte dich nicht anmelden. Bitte versuche es erneut. Wenn dies öfters passiert, wende dich bitte an deine Homeserver-Administration.", + "We asked the browser to remember which homeserver you use to let you sign in, but unfortunately your browser has forgotten it. Go to the sign in page and try again.": "Wir haben deinen Browser gebeten, sich zu merken, bei welchem Heimserver du dich anmeldest, aber dein Browser hat dies leider vergessen. Gehe zur Anmeldeseite und versuche es erneut.", + "Show stickers button": "Stickerschaltfläche", + "Your homeserver rejected your log in attempt. This could be due to things just taking too long. Please try again. If this continues, please contact your homeserver administrator.": "Dein Heimserver hat deinen Anmeldeversuch abgelehnt. Vielleicht dauert der Prozess einfach zu lange. Bitte versuche es erneut. Wenn dies öfters passiert, wende dich bitte an deine Heimserveradministrator.", + "Your homeserver was unreachable and was not able to log you in. Please try again. If this continues, please contact your homeserver administrator.": "Dein Heimserver war nicht erreichbar und konnte dich nicht anmelden. Bitte versuche es erneut. Wenn dies öfters passiert, wende dich bitte an deine Heimserveradministrator.", "We couldn't log you in": "Wir konnten dich nicht anmelden", "Windows": "Fenster", "Screens": "Bildschirme", @@ -3122,7 +3122,7 @@ "Invite members": "Mitglieder einladen", "Add some details to help people recognise it.": "Gib einige Infos über deinen neuen Space an.", "Spaces are new ways to group rooms and people. To join an existing space you'll need an invite.": "Mit Matrix-Spaces kannst du Räume und Personen gruppieren. Um einen existierenden Space zu betreten, musst du eingeladen werden.", - "Spaces prototype. Incompatible with Communities, Communities v2 and Custom Tags. Requires compatible homeserver for some features.": "Spaces Prototyp. Inkompatibel mit Communities, Communities v2 und Custom Tags. Für einige Features wird ein kompatibler Homeserver benötigt.", + "Spaces prototype. Incompatible with Communities, Communities v2 and Custom Tags. Requires compatible homeserver for some features.": "Spaces Prototyp. Inkompatibel mit Communities, Communities v2 und benutzerdefinierte Tags. Für einige Funktionen wird ein kompatibler Heimserver benötigt.", "Invite to this space": "In diesen Space enladen", "Verify this login to access your encrypted messages and prove to others that this login is really you.": "Verifiziere diese Anmeldung um deine Identität zu bestätigen und Zugriff auf verschlüsselte Nachrichten zu erhalten.", "What projects are you working on?": "An welchen Projekten arbeitest du gerade?", @@ -3226,5 +3226,5 @@ "%(deviceId)s from %(ip)s": "%(deviceId)s von %(ip)s", "This homeserver has been blocked by it's administrator.": "Dieser Heimserver wurde von seiner Administration blockiert.", "You have unverified logins": "Du hast nicht-bestätigte Anmeldungen", - "Review to ensure your account is safe": "Überprüfen, um sicher zu sein, dass dein Account sicher ist" + "Review to ensure your account is safe": "Überprüfen, um sicher zu sein, dass dein Konto sicher ist" } From 8241b6a730105bdea7be4a8366c54e7d71d433a7 Mon Sep 17 00:00:00 2001 From: Christian Paul Date: Wed, 14 Apr 2021 21:56:50 +0000 Subject: [PATCH 088/154] Translated using Weblate (German) Currently translated at 98.1% (2862 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 6ab638b6c1..0abe885675 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1677,7 +1677,7 @@ "You're signed out": "Du wurdest abgemeldet", "Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Achtung: Deine persönlichen Daten (einschließlich Verschlüsselungsschlüssel) sind noch in dieser Sitzung gespeichert. Lösche diese Daten, wenn du diese Sitzung nicht mehr benötigst, oder dich mit einem anderen Konto anmelden möchtest.", "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Melde dich mittels Einmalanmeldung an, um das Löschen der Sitzungen zu bestätigen.", - "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Melde dich mittels Single Sign-On an, um das Löschen der Sitzung zu bestätigen.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Bestätige das Löschen dieser Sitzung indem du dich mittels „Single Sign-On“ anmeldest um deine Identität nachzuweisen.", "Confirm deleting these sessions": "Bestätige das Löschen dieser Sitzungen", "Click the button below to confirm deleting these sessions.|other": "Klicke den Knopf, um das Löschen dieser Sitzungen zu bestätigen.", "Click the button below to confirm deleting these sessions.|one": "Klicke den Knopf, um das Löschen dieser Sitzung zu bestätigen.", From 9c250171b4ff2864f3680f921a864f285375af77 Mon Sep 17 00:00:00 2001 From: Aaron Raimist Date: Wed, 14 Apr 2021 18:27:35 -0500 Subject: [PATCH 089/154] Use new copy Signed-off-by: Aaron Raimist --- src/components/structures/MatrixChat.tsx | 4 +--- src/i18n/strings/en_EN.json | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index e8e28088db..dd64dd76f9 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -1098,7 +1098,7 @@ export default class MatrixChat extends React.PureComponent { warnings.push(( {' '/* Whitespace, otherwise the sentences get smashed together */ } - { _t("You are the only member of this room. This room will become unjoinable if you leave.") } + { _t("You are the only person here. If you leave, no one will be able to join in the future, including you.") } )); @@ -1126,7 +1126,6 @@ export default class MatrixChat extends React.PureComponent { const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); const roomToLeave = MatrixClientPeg.get().getRoom(roomId); const warnings = this.leaveRoomWarnings(roomId); - const hasWarnings = warnings.length > 0; const isSpace = roomToLeave?.isSpaceRoom(); Modal.createTrackedDialog(isSpace ? "Leave space" : "Leave room", '', QuestionDialog, { @@ -1140,7 +1139,6 @@ export default class MatrixChat extends React.PureComponent { ), button: _t("Leave"), - danger: hasWarnings, onFinished: (shouldLeave) => { if (shouldLeave) { const d = leaveRoomBehaviour(roomId); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b3afc8bfc8..8971848f73 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2545,7 +2545,7 @@ "Failed to reject invitation": "Failed to reject invitation", "Cannot create rooms in this community": "Cannot create rooms in this community", "You do not have permission to create rooms in this community.": "You do not have permission to create rooms in this community.", - "You are the only member of this room. This room will become unjoinable if you leave.": "You are the only member of this room. This room will become unjoinable if you leave.", + "You are the only person here. If you leave, no one will be able to join in the future, including you.": "You are the only person here. If you leave, no one will be able to join in the future, including you.", "This space is not public. You will not be able to rejoin without an invite.": "This space is not public. You will not be able to rejoin without an invite.", "This room is not public. You will not be able to rejoin without an invite.": "This room is not public. You will not be able to rejoin without an invite.", "Are you sure you want to leave the space '%(spaceName)s'?": "Are you sure you want to leave the space '%(spaceName)s'?", From b0a04c9f814e7f68a02cdddc88a62c422a730193 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 14 Apr 2021 20:00:16 -0600 Subject: [PATCH 090/154] Rename VoiceRecorder -> VoiceRecording to better match expected function --- src/@types/global.d.ts | 4 ++-- src/components/views/rooms/VoiceRecordComposerTile.tsx | 4 ++-- src/components/views/voice_messages/LiveRecordingClock.tsx | 4 ++-- src/components/views/voice_messages/LiveRecordingWaveform.tsx | 4 ++-- src/voice/{VoiceRecorder.ts => VoiceRecording.ts} | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) rename src/voice/{VoiceRecorder.ts => VoiceRecording.ts} (99%) diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts index 051e5cc429..ee0963e537 100644 --- a/src/@types/global.d.ts +++ b/src/@types/global.d.ts @@ -39,7 +39,7 @@ import {ModalWidgetStore} from "../stores/ModalWidgetStore"; import { WidgetLayoutStore } from "../stores/widgets/WidgetLayoutStore"; import VoipUserMapper from "../VoipUserMapper"; import {SpaceStoreClass} from "../stores/SpaceStore"; -import {VoiceRecorder} from "../voice/VoiceRecorder"; +import {VoiceRecording} from "../voice/VoiceRecording"; declare global { interface Window { @@ -71,7 +71,7 @@ declare global { mxModalWidgetStore: ModalWidgetStore; mxVoipUserMapper: VoipUserMapper; mxSpaceStore: SpaceStoreClass; - mxVoiceRecorder: typeof VoiceRecorder; + mxVoiceRecorder: typeof VoiceRecording; } interface Document { diff --git a/src/components/views/rooms/VoiceRecordComposerTile.tsx b/src/components/views/rooms/VoiceRecordComposerTile.tsx index b4999ac0df..e83aa8b994 100644 --- a/src/components/views/rooms/VoiceRecordComposerTile.tsx +++ b/src/components/views/rooms/VoiceRecordComposerTile.tsx @@ -17,7 +17,7 @@ limitations under the License. import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; import {_t} from "../../../languageHandler"; import React from "react"; -import {VoiceRecorder} from "../../../voice/VoiceRecorder"; +import {VoiceRecording} from "../../../voice/VoiceRecording"; import {Room} from "matrix-js-sdk/src/models/room"; import {MatrixClientPeg} from "../../../MatrixClientPeg"; import classNames from "classnames"; @@ -31,7 +31,7 @@ interface IProps { } interface IState { - recorder?: VoiceRecorder; + recorder?: VoiceRecording; } /** diff --git a/src/components/views/voice_messages/LiveRecordingClock.tsx b/src/components/views/voice_messages/LiveRecordingClock.tsx index 00316d196a..5e9006c6ab 100644 --- a/src/components/views/voice_messages/LiveRecordingClock.tsx +++ b/src/components/views/voice_messages/LiveRecordingClock.tsx @@ -15,12 +15,12 @@ limitations under the License. */ import React from "react"; -import {IRecordingUpdate, VoiceRecorder} from "../../../voice/VoiceRecorder"; +import {IRecordingUpdate, VoiceRecording} from "../../../voice/VoiceRecording"; import {replaceableComponent} from "../../../utils/replaceableComponent"; import Clock from "./Clock"; interface IProps { - recorder: VoiceRecorder; + recorder: VoiceRecording; } interface IState { diff --git a/src/components/views/voice_messages/LiveRecordingWaveform.tsx b/src/components/views/voice_messages/LiveRecordingWaveform.tsx index e7cab4a5cb..c1f5e97fff 100644 --- a/src/components/views/voice_messages/LiveRecordingWaveform.tsx +++ b/src/components/views/voice_messages/LiveRecordingWaveform.tsx @@ -15,14 +15,14 @@ limitations under the License. */ import React from "react"; -import {IRecordingUpdate, VoiceRecorder} from "../../../voice/VoiceRecorder"; +import {IRecordingUpdate, VoiceRecording} from "../../../voice/VoiceRecording"; import {replaceableComponent} from "../../../utils/replaceableComponent"; import {arrayFastResample, arraySeed} from "../../../utils/arrays"; import {percentageOf} from "../../../utils/numbers"; import Waveform from "./Waveform"; interface IProps { - recorder: VoiceRecorder; + recorder: VoiceRecording; } interface IState { diff --git a/src/voice/VoiceRecorder.ts b/src/voice/VoiceRecording.ts similarity index 99% rename from src/voice/VoiceRecorder.ts rename to src/voice/VoiceRecording.ts index 077990ac17..77c182fc54 100644 --- a/src/voice/VoiceRecorder.ts +++ b/src/voice/VoiceRecording.ts @@ -30,7 +30,7 @@ export interface IRecordingUpdate { timeSeconds: number; // float } -export class VoiceRecorder { +export class VoiceRecording { private recorder: Recorder; private recorderContext: AudioContext; private recorderSource: MediaStreamAudioSourceNode; @@ -209,4 +209,4 @@ export class VoiceRecorder { } } -window.mxVoiceRecorder = VoiceRecorder; +window.mxVoiceRecorder = VoiceRecording; From 3cafed478cc78ca1157877b1cf1ac860529bb4b2 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 14 Apr 2021 20:11:34 -0600 Subject: [PATCH 091/154] Run voice recording updates through a dedicated store --- src/components/views/rooms/MessageComposer.js | 11 +-- .../views/rooms/VoiceRecordComposerTile.tsx | 7 +- src/stores/VoiceRecordingStore.ts | 82 +++++++++++++++++++ 3 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 src/stores/VoiceRecordingStore.ts diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js index b7078766fb..283b11a437 100644 --- a/src/components/views/rooms/MessageComposer.js +++ b/src/components/views/rooms/MessageComposer.js @@ -34,6 +34,7 @@ import {UPDATE_EVENT} from "../../../stores/AsyncStore"; import ActiveWidgetStore from "../../../stores/ActiveWidgetStore"; import {replaceableComponent} from "../../../utils/replaceableComponent"; import VoiceRecordComposerTile from "./VoiceRecordComposerTile"; +import {VoiceRecordingStore} from "../../../stores/VoiceRecordingStore"; function ComposerAvatar(props) { const MemberStatusMessageAvatar = sdk.getComponent('avatars.MemberStatusMessageAvatar'); @@ -180,6 +181,7 @@ export default class MessageComposer extends React.Component { this.renderPlaceholderText = this.renderPlaceholderText.bind(this); WidgetStore.instance.on(UPDATE_EVENT, this._onWidgetUpdate); ActiveWidgetStore.on('update', this._onActiveWidgetUpdate); + VoiceRecordingStore.instance.on(UPDATE_EVENT, this._onVoiceStoreUpdate); this._dispatcherRef = null; this.state = { @@ -240,6 +242,7 @@ export default class MessageComposer extends React.Component { } WidgetStore.instance.removeListener(UPDATE_EVENT, this._onWidgetUpdate); ActiveWidgetStore.removeListener('update', this._onActiveWidgetUpdate); + VoiceRecordingStore.instance.off(UPDATE_EVENT, this._onVoiceStoreUpdate); dis.unregister(this.dispatcherRef); } @@ -327,8 +330,8 @@ export default class MessageComposer extends React.Component { }); } - onVoiceUpdate = (haveRecording: boolean) => { - this.setState({haveRecording}); + _onVoiceStoreUpdate = () => { + this.setState({haveRecording: !!VoiceRecordingStore.instance.activeRecording}); }; render() { @@ -352,7 +355,6 @@ export default class MessageComposer extends React.Component { permalinkCreator={this.props.permalinkCreator} replyToEvent={this.props.replyToEvent} onChange={this.onChange} - // TODO: @@ TravisR - Disabling the composer doesn't work disabled={this.state.haveRecording} />, ); @@ -373,8 +375,7 @@ export default class MessageComposer extends React.Component { if (SettingsStore.getValue("feature_voice_messages")) { controls.push(); + room={this.props.room} />); } if (!this.state.isComposerEmpty || this.state.haveRecording) { diff --git a/src/components/views/rooms/VoiceRecordComposerTile.tsx b/src/components/views/rooms/VoiceRecordComposerTile.tsx index e83aa8b994..1210a44958 100644 --- a/src/components/views/rooms/VoiceRecordComposerTile.tsx +++ b/src/components/views/rooms/VoiceRecordComposerTile.tsx @@ -24,10 +24,10 @@ import classNames from "classnames"; import LiveRecordingWaveform from "../voice_messages/LiveRecordingWaveform"; import {replaceableComponent} from "../../../utils/replaceableComponent"; import LiveRecordingClock from "../voice_messages/LiveRecordingClock"; +import {VoiceRecordingStore} from "../../../stores/VoiceRecordingStore"; interface IProps { room: Room; - onRecording: (haveRecording: boolean) => void; } interface IState { @@ -57,13 +57,12 @@ export default class VoiceRecordComposerTile extends React.PureComponent { + private static internalInstance: VoiceRecordingStore; + + public constructor() { + super(defaultDispatcher, {}); + } + + /** + * Gets the active recording instance, if any. + */ + public get activeRecording(): VoiceRecording | null { + return this.state.recording; + } + + public static get instance(): VoiceRecordingStore { + if (!VoiceRecordingStore.internalInstance) { + VoiceRecordingStore.internalInstance = new VoiceRecordingStore(); + } + return VoiceRecordingStore.internalInstance; + } + + protected async onAction(payload: ActionPayload): Promise { + // Nothing to do, but we're required to override the function + return; + } + + /** + * Starts a new recording if one isn't already in progress. Note that this simply + * creates a recording instance - whether or not recording is actively in progress + * can be seen via the VoiceRecording class. + * @returns {VoiceRecording} The recording. + */ + public startRecording(): VoiceRecording { + if (!this.matrixClient) throw new Error("Cannot start a recording without a MatrixClient"); + if (this.state.recording) throw new Error("A recording is already in progress"); + + const recording = new VoiceRecording(this.matrixClient); + + // noinspection JSIgnoredPromiseFromCall - we can safely run this async + this.updateState({recording}); + + return recording; + } + + /** + * Disposes of the current recording, no matter the state of it. + * @returns {Promise} Resolves when complete. + */ + public disposeRecording(): Promise { + if (this.state.recording) { + // Stop for good measure, but completely async because we're not concerned with this + // passing or failing. + this.state.recording.stop().catch(e => console.error("Error stopping recording", e)); + } + return this.updateState({recording: null}); + } +} From fedb5b9f63083ab7511d15be01a441f524868610 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 14 Apr 2021 20:12:10 -0600 Subject: [PATCH 092/154] Fix disabled state of the composer --- res/css/views/rooms/_BasicMessageComposer.scss | 2 +- src/components/views/rooms/BasicMessageComposer.tsx | 9 ++++++--- src/components/views/rooms/SendMessageComposer.js | 4 ++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/res/css/views/rooms/_BasicMessageComposer.scss b/res/css/views/rooms/_BasicMessageComposer.scss index 4f58c08617..e1ba468204 100644 --- a/res/css/views/rooms/_BasicMessageComposer.scss +++ b/res/css/views/rooms/_BasicMessageComposer.scss @@ -68,8 +68,8 @@ limitations under the License. } &.mx_BasicMessageComposer_input_disabled { + // Ignore all user input to avoid accidentally triggering the composer pointer-events: none; - cursor: not-allowed; } } diff --git a/src/components/views/rooms/BasicMessageComposer.tsx b/src/components/views/rooms/BasicMessageComposer.tsx index 9d9e3a1ba0..e83f066bd0 100644 --- a/src/components/views/rooms/BasicMessageComposer.tsx +++ b/src/components/views/rooms/BasicMessageComposer.tsx @@ -140,7 +140,12 @@ export default class BasicMessageEditor extends React.Component } public componentDidUpdate(prevProps: IProps) { - if (this.props.placeholder !== prevProps.placeholder && this.props.placeholder) { + // We need to re-check the placeholder when the enabled state changes because it causes the + // placeholder element to remount, which gets rid of the `::before` class. Re-evaluating the + // placeholder means we get a proper `::before` with the placeholder. + const enabledChange = this.props.disabled !== prevProps.disabled; + const placeholderChanged = this.props.placeholder !== prevProps.placeholder; + if (this.props.placeholder && (placeholderChanged || enabledChange)) { const {isEmpty} = this.props.model; if (isEmpty) { this.showPlaceholder(); @@ -670,8 +675,6 @@ export default class BasicMessageEditor extends React.Component }); const classes = classNames("mx_BasicMessageComposer_input", { "mx_BasicMessageComposer_input_shouldShowPillAvatar": this.state.showPillAvatar, - - // TODO: @@ TravisR: This doesn't work properly. The composer resets in a strange way. "mx_BasicMessageComposer_input_disabled": this.props.disabled, }); diff --git a/src/components/views/rooms/SendMessageComposer.js b/src/components/views/rooms/SendMessageComposer.js index 75bc943146..0d3a174766 100644 --- a/src/components/views/rooms/SendMessageComposer.js +++ b/src/components/views/rooms/SendMessageComposer.js @@ -477,6 +477,10 @@ export default class SendMessageComposer extends React.Component { } onAction = (payload) => { + // don't let the user into the composer if it is disabled - all of these branches lead + // to the cursor being in the composer + if (this.props.disabled) return; + switch (payload.action) { case 'reply_to_event': case Action.FocusComposer: From 22219e0e802cc58eb3a6d507a2221ec9fc4ad64f Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 14 Apr 2021 21:13:09 -0600 Subject: [PATCH 093/154] Adapt to use an Alignment enum instead --- src/components/views/elements/Field.tsx | 2 +- src/components/views/elements/InfoTooltip.tsx | 6 +-- src/components/views/elements/Tooltip.tsx | 48 ++++++++++++++++--- 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/components/views/elements/Field.tsx b/src/components/views/elements/Field.tsx index f5754da9ae..59d9a11596 100644 --- a/src/components/views/elements/Field.tsx +++ b/src/components/views/elements/Field.tsx @@ -262,7 +262,7 @@ export default class Field extends React.PureComponent { tooltipClassName={classNames("mx_Field_tooltip", tooltipClassName)} visible={(this.state.focused && this.props.forceTooltipVisible) || this.state.feedbackVisible} label={tooltipContent || this.state.feedback} - forceOnRight + alignment={Tooltip.Alignment.Right} />; } diff --git a/src/components/views/elements/InfoTooltip.tsx b/src/components/views/elements/InfoTooltip.tsx index 8f7f1ea53f..d49090dbae 100644 --- a/src/components/views/elements/InfoTooltip.tsx +++ b/src/components/views/elements/InfoTooltip.tsx @@ -18,8 +18,8 @@ limitations under the License. import React from 'react'; import classNames from 'classnames'; -import Tooltip from './Tooltip'; -import { _t } from "../../../languageHandler"; +import Tooltip, {Alignment} from './Tooltip'; +import {_t} from "../../../languageHandler"; import {replaceableComponent} from "../../../utils/replaceableComponent"; interface ITooltipProps { @@ -61,7 +61,7 @@ export default class InfoTooltip extends React.PureComponent :
; return (
diff --git a/src/components/views/elements/Tooltip.tsx b/src/components/views/elements/Tooltip.tsx index b2dd00de18..116b226b8f 100644 --- a/src/components/views/elements/Tooltip.tsx +++ b/src/components/views/elements/Tooltip.tsx @@ -25,6 +25,14 @@ import {replaceableComponent} from "../../../utils/replaceableComponent"; const MIN_TOOLTIP_HEIGHT = 25; +export enum Alignment { + Natural, // Pick left or right + Left, + Right, + Top, // Centered + Bottom, // Centered +} + interface IProps { // Class applied to the element used to position the tooltip className?: string; @@ -36,7 +44,7 @@ interface IProps { visible?: boolean; // the react element to put into the tooltip label: React.ReactNode; - forceOnRight?: boolean; + alignment?: Alignment; // defaults to Natural yOffset?: number; } @@ -46,10 +54,14 @@ export default class Tooltip extends React.Component { private tooltip: void | Element | Component; private parent: Element; + // XXX: This is because some components (Field) are unable to `import` the Tooltip class, + // so we expose the Alignment options off of us statically. + public static readonly Alignment = Alignment; public static readonly defaultProps = { visible: true, yOffset: 0, + alignment: Alignment.Natural, }; // Create a wrapper for the tooltip outside the parent and attach it to the body element @@ -86,11 +98,35 @@ export default class Tooltip extends React.Component { offset = Math.floor(parentBox.height - MIN_TOOLTIP_HEIGHT); } - style.top = (parentBox.top - 2 + this.props.yOffset) + window.pageYOffset + offset; - if (!this.props.forceOnRight && parentBox.right > window.innerWidth / 2) { - style.right = window.innerWidth - parentBox.right - window.pageXOffset - 16; - } else { - style.left = parentBox.right + window.pageXOffset + 6; + const baseTop = (parentBox.top - 2 + this.props.yOffset) + window.pageYOffset; + const top = baseTop + offset; + const right = window.innerWidth - parentBox.right - window.pageXOffset - 16; + const left = parentBox.right + window.pageXOffset + 6; + const horizontalCenter = parentBox.right - window.pageXOffset - (parentBox.width / 2); + switch(this.props.alignment) { + case Alignment.Natural: + if (parentBox.right > window.innerWidth / 2) { + style.right = right; + style.top = top; + break; + } + // fall through to Right + case Alignment.Right: + style.left = left; + style.top = top; + break; + case Alignment.Left: + style.right = right; + style.top = top; + break; + case Alignment.Top: + style.top = baseTop - 16; + style.left = horizontalCenter; + break; + case Alignment.Bottom: + style.top = baseTop + parentBox.height; + style.left = horizontalCenter; + break; } return style; From 0677cf866cf694d6dae371bce8d3ae91d0c944e7 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 14 Apr 2021 21:15:06 -0600 Subject: [PATCH 094/154] Cap recording length, and warn at 10s remaining See diff for details. Note that this introduces an "Uploading" state which is not currently used. At the moment, if a user hits the maximum time then their recording will be broken. This is expected to be fixed in a future PR. --- src/components/views/rooms/MessageComposer.js | 25 +++++++++- src/i18n/strings/en_EN.json | 1 + src/stores/VoiceRecordingStore.ts | 4 +- src/voice/VoiceRecording.ts | 47 +++++++++++++++++-- 4 files changed, 69 insertions(+), 8 deletions(-) diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js index 283b11a437..6c227458aa 100644 --- a/src/components/views/rooms/MessageComposer.js +++ b/src/components/views/rooms/MessageComposer.js @@ -35,6 +35,8 @@ import ActiveWidgetStore from "../../../stores/ActiveWidgetStore"; import {replaceableComponent} from "../../../utils/replaceableComponent"; import VoiceRecordComposerTile from "./VoiceRecordComposerTile"; import {VoiceRecordingStore} from "../../../stores/VoiceRecordingStore"; +import {RecordingState} from "../../../voice/VoiceRecording"; +import Tooltip, {Alignment} from "../elements/Tooltip"; function ComposerAvatar(props) { const MemberStatusMessageAvatar = sdk.getComponent('avatars.MemberStatusMessageAvatar'); @@ -191,6 +193,7 @@ export default class MessageComposer extends React.Component { joinedConference: WidgetStore.instance.isJoinedToConferenceIn(this.props.room), isComposerEmpty: true, haveRecording: false, + recordingTimeLeftSeconds: null, // when set to a number, shows a toast }; } @@ -331,7 +334,17 @@ export default class MessageComposer extends React.Component { } _onVoiceStoreUpdate = () => { - this.setState({haveRecording: !!VoiceRecordingStore.instance.activeRecording}); + const recording = VoiceRecordingStore.instance.activeRecording; + this.setState({haveRecording: !!recording}); + if (recording) { + // We show a little head's up that the recording is about to automatically end soon. The 3s + // display time is completely arbitrary. Note that we don't need to deregister the listener + // because the recording instance will clean that up for us. + recording.on(RecordingState.EndingSoon, ({secondsLeft}) => { + this.setState({recordingTimeLeftSeconds: secondsLeft}); + setTimeout(() => this.setState({recordingTimeLeftSeconds: null}), 3000); + }); + } }; render() { @@ -412,8 +425,18 @@ export default class MessageComposer extends React.Component { ); } + let recordingTooltip; + const secondsLeft = Math.round(this.state.recordingTimeLeftSeconds); + if (secondsLeft) { + recordingTooltip = ; + } + return (
+ {recordingTooltip}
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 02236f9997..e8839369b1 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1473,6 +1473,7 @@ "The conversation continues here.": "The conversation continues here.", "This room has been replaced and is no longer active.": "This room has been replaced and is no longer active.", "You do not have permission to post to this room": "You do not have permission to post to this room", + "%(seconds)ss left": "%(seconds)ss left", "Bold": "Bold", "Italics": "Italics", "Strikethrough": "Strikethrough", diff --git a/src/stores/VoiceRecordingStore.ts b/src/stores/VoiceRecordingStore.ts index e1685de529..cc999f23f8 100644 --- a/src/stores/VoiceRecordingStore.ts +++ b/src/stores/VoiceRecordingStore.ts @@ -73,9 +73,7 @@ export class VoiceRecordingStore extends AsyncStoreWithClient { */ public disposeRecording(): Promise { if (this.state.recording) { - // Stop for good measure, but completely async because we're not concerned with this - // passing or failing. - this.state.recording.stop().catch(e => console.error("Error stopping recording", e)); + this.state.recording.destroy(); // stops internally } return this.updateState({recording: null}); } diff --git a/src/voice/VoiceRecording.ts b/src/voice/VoiceRecording.ts index 77c182fc54..41bce9d698 100644 --- a/src/voice/VoiceRecording.ts +++ b/src/voice/VoiceRecording.ts @@ -20,17 +20,29 @@ import {MatrixClient} from "matrix-js-sdk/src/client"; import CallMediaHandler from "../CallMediaHandler"; import {SimpleObservable} from "matrix-widget-api"; import {clamp} from "../utils/numbers"; +import EventEmitter from "events"; +import {IDestroyable} from "../utils/IDestroyable"; const CHANNELS = 1; // stereo isn't important const SAMPLE_RATE = 48000; // 48khz is what WebRTC uses. 12khz is where we lose quality. const BITRATE = 24000; // 24kbps is pretty high quality for our use case in opus. +const TARGET_MAX_LENGTH = 120; // 2 minutes in seconds. Somewhat arbitrary, though longer == larger files. +const TARGET_WARN_TIME_LEFT = 10; // 10 seconds, also somewhat arbitrary. export interface IRecordingUpdate { waveform: number[]; // floating points between 0 (low) and 1 (high). timeSeconds: number; // float } -export class VoiceRecording { +export enum RecordingState { + Started = "started", + EndingSoon = "ending_soon", // emits an object with a single numerical value: secondsLeft + Ended = "ended", + Uploading = "uploading", + Uploaded = "uploaded", +} + +export class VoiceRecording extends EventEmitter implements IDestroyable { private recorder: Recorder; private recorderContext: AudioContext; private recorderSource: MediaStreamAudioSourceNode; @@ -40,9 +52,12 @@ export class VoiceRecording { private buffer = new Uint8Array(0); private mxc: string; private recording = false; + private stopping = false; + private haveWarned = false; // whether or not EndingSoon has been fired private observable: SimpleObservable; public constructor(private client: MatrixClient) { + super(); } private async makeRecorder() { @@ -124,7 +139,7 @@ export class VoiceRecording { return this.mxc; } - private tryUpdateLiveData = (ev: AudioProcessingEvent) => { + private processAudioUpdate = (ev: AudioProcessingEvent) => { if (!this.recording) return; // The time domain is the input to the FFT, which means we use an array of the same @@ -150,6 +165,17 @@ export class VoiceRecording { waveform: translatedData, timeSeconds: ev.playbackTime, }); + + // Now that we've updated the data/waveform, let's do a time check. We don't want to + // go horribly over the limit. We also emit a warning state if needed. + const secondsLeft = TARGET_MAX_LENGTH - ev.playbackTime; + if (secondsLeft <= 0) { + // noinspection JSIgnoredPromiseFromCall - we aren't concerned with it overlapping + this.stop(); + } else if (secondsLeft <= TARGET_WARN_TIME_LEFT && !this.haveWarned) { + this.emit(RecordingState.EndingSoon, {secondsLeft}); + this.haveWarned = true; + } }; public async start(): Promise { @@ -164,9 +190,10 @@ export class VoiceRecording { } this.observable = new SimpleObservable(); await this.makeRecorder(); - this.recorderProcessor.addEventListener("audioprocess", this.tryUpdateLiveData); + this.recorderProcessor.addEventListener("audioprocess", this.processAudioUpdate); await this.recorder.start(); this.recording = true; + this.emit(RecordingState.Started); } public async stop(): Promise { @@ -174,6 +201,9 @@ export class VoiceRecording { throw new Error("No recording to stop"); } + if (this.stopping) return; + this.stopping = true; + // Disconnect the source early to start shutting down resources this.recorderSource.disconnect(); await this.recorder.stop(); @@ -187,12 +217,19 @@ export class VoiceRecording { // Finally do our post-processing and clean up this.recording = false; - this.recorderProcessor.removeEventListener("audioprocess", this.tryUpdateLiveData); + this.recorderProcessor.removeEventListener("audioprocess", this.processAudioUpdate); await this.recorder.close(); + this.emit(RecordingState.Ended); return this.buffer; } + public destroy() { + // noinspection JSIgnoredPromiseFromCall - not concerned about stop() being called async here + this.stop(); + this.removeAllListeners(); + } + public async upload(): Promise { if (!this.hasRecording) { throw new Error("No recording available to upload"); @@ -200,11 +237,13 @@ export class VoiceRecording { if (this.mxc) return this.mxc; + this.emit(RecordingState.Uploading); this.mxc = await this.client.uploadContent(new Blob([this.buffer], { type: "audio/ogg", }), { onlyContentUri: false, // to stop the warnings in the console }).then(r => r['content_uri']); + this.emit(RecordingState.Uploaded); return this.mxc; } } From 22233a8745ee0f8b043b6955762a5bfbb6e87666 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 14 Apr 2021 21:47:30 -0600 Subject: [PATCH 095/154] Add a concept of a singleflight to avoid repeated calls to stop/ending This makes it easier to keep track of which pieces the client will have already dispatched or been executed, reducing the amount of class members needed. Critically, this makes it so the 'stop' button (which is currently a send button) actually works even after the automatic stop has happened. UI is still pending for stopping recording early. This is not covered by this change. --- src/utils/Singleflight.ts | 101 +++++++++++++++++++++++++++++++ src/voice/VoiceRecording.ts | 51 ++++++++-------- test/Singleflight-test.ts | 115 ++++++++++++++++++++++++++++++++++++ 3 files changed, 242 insertions(+), 25 deletions(-) create mode 100644 src/utils/Singleflight.ts create mode 100644 test/Singleflight-test.ts diff --git a/src/utils/Singleflight.ts b/src/utils/Singleflight.ts new file mode 100644 index 0000000000..c8d303bcac --- /dev/null +++ b/src/utils/Singleflight.ts @@ -0,0 +1,101 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import {EnhancedMap} from "./maps"; + +// Inspired by https://pkg.go.dev/golang.org/x/sync/singleflight + +const keyMap = new EnhancedMap>(); + +/** + * Access class to get a singleflight context. Singleflights execute a + * function exactly once, unless instructed to forget about a result. + */ +export class Singleflight { + private constructor() { + } + + /** + * A void marker to help with returning a value in a singleflight context. + * If your code doesn't return anything, return this instead. + */ + public static Void = Symbol("void"); + + /** + * Acquire a singleflight context. + * @param {Object} instance An instance to associate the context with. Can be any object. + * @param {string} key A string key relevant to that instance to namespace under. + * @returns {SingleflightContext} Returns the context to execute the function. + */ + public static for(instance: Object, key: string): SingleflightContext { + if (!instance || !key) throw new Error("An instance and key must be supplied"); + return new SingleflightContext(instance, key); + } + + /** + * Forgets all results for a given instance. + * @param {Object} instance The instance to forget about. + */ + public static forgetAllFor(instance: Object) { + keyMap.delete(instance); + } + + /** + * Forgets all cached results for all instances. Intended for use by tests. + */ + public static forgetAll() { + for (const k of keyMap.keys()) { + keyMap.remove(k); + } + } +} + +class SingleflightContext { + public constructor(private instance: Object, private key: string) { + } + + /** + * Forget this particular instance and key combination, discarding the result. + */ + public forget() { + const map = keyMap.get(this.instance); + if (!map) return; + map.remove(this.key); + if (!map.size) keyMap.remove(this.instance); + } + + /** + * Execute a function. If a result is already known, that will be returned instead + * of executing the provided function. However, if no result is known then the function + * will be called, with its return value cached. The function must return a value + * other than `undefined` - take a look at Singleflight.Void if you don't have a return + * to make. + * @param {Function} fn The function to execute. + * @returns The recorded value. + */ + public do(fn: () => T): T { + const map = keyMap.getOrCreate(this.instance, new EnhancedMap()); + + // We have to manually getOrCreate() because we need to execute the fn + let val = map.get(this.key); + if (val === undefined) { + val = fn(); + map.set(this.key, val); + } + + return val; + } +} diff --git a/src/voice/VoiceRecording.ts b/src/voice/VoiceRecording.ts index 41bce9d698..55775ff786 100644 --- a/src/voice/VoiceRecording.ts +++ b/src/voice/VoiceRecording.ts @@ -22,6 +22,7 @@ import {SimpleObservable} from "matrix-widget-api"; import {clamp} from "../utils/numbers"; import EventEmitter from "events"; import {IDestroyable} from "../utils/IDestroyable"; +import {Singleflight} from "../utils/Singleflight"; const CHANNELS = 1; // stereo isn't important const SAMPLE_RATE = 48000; // 48khz is what WebRTC uses. 12khz is where we lose quality. @@ -52,8 +53,6 @@ export class VoiceRecording extends EventEmitter implements IDestroyable { private buffer = new Uint8Array(0); private mxc: string; private recording = false; - private stopping = false; - private haveWarned = false; // whether or not EndingSoon has been fired private observable: SimpleObservable; public constructor(private client: MatrixClient) { @@ -172,9 +171,11 @@ export class VoiceRecording extends EventEmitter implements IDestroyable { if (secondsLeft <= 0) { // noinspection JSIgnoredPromiseFromCall - we aren't concerned with it overlapping this.stop(); - } else if (secondsLeft <= TARGET_WARN_TIME_LEFT && !this.haveWarned) { - this.emit(RecordingState.EndingSoon, {secondsLeft}); - this.haveWarned = true; + } else if (secondsLeft <= TARGET_WARN_TIME_LEFT) { + Singleflight.for(this, "ending_soon").do(() => { + this.emit(RecordingState.EndingSoon, {secondsLeft}); + return Singleflight.Void; + }); } }; @@ -197,37 +198,37 @@ export class VoiceRecording extends EventEmitter implements IDestroyable { } public async stop(): Promise { - if (!this.recording) { - throw new Error("No recording to stop"); - } + return Singleflight.for(this, "stop").do(async () => { + if (!this.recording) { + throw new Error("No recording to stop"); + } - if (this.stopping) return; - this.stopping = true; + // Disconnect the source early to start shutting down resources + this.recorderSource.disconnect(); + await this.recorder.stop(); - // Disconnect the source early to start shutting down resources - this.recorderSource.disconnect(); - await this.recorder.stop(); + // close the context after the recorder so the recorder doesn't try to + // connect anything to the context (this would generate a warning) + await this.recorderContext.close(); - // close the context after the recorder so the recorder doesn't try to - // connect anything to the context (this would generate a warning) - await this.recorderContext.close(); + // Now stop all the media tracks so we can release them back to the user/OS + this.recorderStream.getTracks().forEach(t => t.stop()); - // Now stop all the media tracks so we can release them back to the user/OS - this.recorderStream.getTracks().forEach(t => t.stop()); + // Finally do our post-processing and clean up + this.recording = false; + this.recorderProcessor.removeEventListener("audioprocess", this.processAudioUpdate); + await this.recorder.close(); + this.emit(RecordingState.Ended); - // Finally do our post-processing and clean up - this.recording = false; - this.recorderProcessor.removeEventListener("audioprocess", this.processAudioUpdate); - await this.recorder.close(); - this.emit(RecordingState.Ended); - - return this.buffer; + return this.buffer; + }); } public destroy() { // noinspection JSIgnoredPromiseFromCall - not concerned about stop() being called async here this.stop(); this.removeAllListeners(); + Singleflight.forgetAllFor(this); } public async upload(): Promise { diff --git a/test/Singleflight-test.ts b/test/Singleflight-test.ts new file mode 100644 index 0000000000..4f0c6e0da3 --- /dev/null +++ b/test/Singleflight-test.ts @@ -0,0 +1,115 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import {Singleflight} from "../src/utils/Singleflight"; + +describe('Singleflight', () => { + afterEach(() => { + Singleflight.forgetAll(); + }); + + it('should throw for bad context variables', () => { + const permutations: [Object, string][] = [ + [null, null], + [{}, null], + [null, "test"], + ]; + for (const p of permutations) { + try { + Singleflight.for(p[0], p[1]); + // noinspection ExceptionCaughtLocallyJS + throw new Error("failed to fail: " + JSON.stringify(p)); + } catch (e) { + expect(e.message).toBe("An instance and key must be supplied"); + } + } + }); + + it('should execute the function once', () => { + const instance = {}; + const key = "test"; + const val = {}; // unique object for reference check + const fn = jest.fn().mockReturnValue(val); + const sf = Singleflight.for(instance, key); + const r1 = sf.do(fn); + expect(r1).toBe(val); + expect(fn.mock.calls.length).toBe(1); + const r2 = sf.do(fn); + expect(r2).toBe(val); + expect(fn.mock.calls.length).toBe(1); + }); + + it('should execute the function once, even with new contexts', () => { + const instance = {}; + const key = "test"; + const val = {}; // unique object for reference check + const fn = jest.fn().mockReturnValue(val); + let sf = Singleflight.for(instance, key); + const r1 = sf.do(fn); + expect(r1).toBe(val); + expect(fn.mock.calls.length).toBe(1); + sf = Singleflight.for(instance, key); // RESET FOR TEST + const r2 = sf.do(fn); + expect(r2).toBe(val); + expect(fn.mock.calls.length).toBe(1); + }); + + it('should execute the function twice if the result was forgotten', () => { + const instance = {}; + const key = "test"; + const val = {}; // unique object for reference check + const fn = jest.fn().mockReturnValue(val); + const sf = Singleflight.for(instance, key); + const r1 = sf.do(fn); + expect(r1).toBe(val); + expect(fn.mock.calls.length).toBe(1); + sf.forget(); + const r2 = sf.do(fn); + expect(r2).toBe(val); + expect(fn.mock.calls.length).toBe(2); + }); + + it('should execute the function twice if the instance was forgotten', () => { + const instance = {}; + const key = "test"; + const val = {}; // unique object for reference check + const fn = jest.fn().mockReturnValue(val); + const sf = Singleflight.for(instance, key); + const r1 = sf.do(fn); + expect(r1).toBe(val); + expect(fn.mock.calls.length).toBe(1); + Singleflight.forgetAllFor(instance); + const r2 = sf.do(fn); + expect(r2).toBe(val); + expect(fn.mock.calls.length).toBe(2); + }); + + it('should execute the function twice if everything was forgotten', () => { + const instance = {}; + const key = "test"; + const val = {}; // unique object for reference check + const fn = jest.fn().mockReturnValue(val); + const sf = Singleflight.for(instance, key); + const r1 = sf.do(fn); + expect(r1).toBe(val); + expect(fn.mock.calls.length).toBe(1); + Singleflight.forgetAll(); + const r2 = sf.do(fn); + expect(r2).toBe(val); + expect(fn.mock.calls.length).toBe(2); + }); +}); + From 1aeb9a5fb2dd120b85062bea5c5c236f63ea0ba5 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 14 Apr 2021 22:04:07 -0600 Subject: [PATCH 096/154] Appease the linter --- src/components/views/elements/Tooltip.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/elements/Tooltip.tsx b/src/components/views/elements/Tooltip.tsx index 116b226b8f..062d26c852 100644 --- a/src/components/views/elements/Tooltip.tsx +++ b/src/components/views/elements/Tooltip.tsx @@ -103,7 +103,7 @@ export default class Tooltip extends React.Component { const right = window.innerWidth - parentBox.right - window.pageXOffset - 16; const left = parentBox.right + window.pageXOffset + 6; const horizontalCenter = parentBox.right - window.pageXOffset - (parentBox.width / 2); - switch(this.props.alignment) { + switch (this.props.alignment) { case Alignment.Natural: if (parentBox.right > window.innerWidth / 2) { style.right = right; From 72d8e6ccca4a214231c1a6cbbba8aab7bbc62ed7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 15 Apr 2021 08:09:14 +0200 Subject: [PATCH 097/154] Decrease ZOOM_COEFFICIENT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/elements/ImageView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/elements/ImageView.tsx b/src/components/views/elements/ImageView.tsx index dad62521da..71e63d214d 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/src/components/views/elements/ImageView.tsx @@ -38,7 +38,7 @@ const MAX_ZOOM = 300; // This is used for the buttons const ZOOM_STEP = 10; // This is used for mouse wheel events -const ZOOM_COEFFICIENT = 10; +const ZOOM_COEFFICIENT = 7.5; // If we have moved only this much we can zoom const ZOOM_DISTANCE = 10; From 2e31355741f7d7a837e5691cbee99db291e369b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 15 Apr 2021 08:10:03 +0200 Subject: [PATCH 098/154] Don't do anything if we didn't press the left button MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/elements/ImageView.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/components/views/elements/ImageView.tsx b/src/components/views/elements/ImageView.tsx index 71e63d214d..bb69e24855 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/src/components/views/elements/ImageView.tsx @@ -209,6 +209,10 @@ export default class ImageView extends React.Component { ev.stopPropagation(); ev.preventDefault(); + // Don't do anything if we pressed any + // other button than the left one + if (ev.button !== 0) return; + // Zoom in if we are completely zoomed out if (this.state.zoom === MIN_ZOOM) { this.setState({zoom: MAX_ZOOM}); From eed5efdbe1eefe618b3ef2b9aa00f48632753a29 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 15 Apr 2021 00:47:09 -0600 Subject: [PATCH 099/154] Labs: Add quick/cheap "do not disturb" flag This just disables audio notifications and the popup, which is the easiest way to do "do not disturb" for a device. This needs spec changes to be done properly, as it's a shame that mobile devices for the user will still go off. Disabling all of push doesn't sound ideal as it would potentially mean missing highlights for when leaving DND mode. --- res/css/structures/_UserMenu.scss | 26 ++++++++++++++++++++++++++ src/Notifier.ts | 4 ++++ src/components/structures/UserMenu.tsx | 23 +++++++++++++++++++++++ src/i18n/strings/en_EN.json | 1 + src/settings/Settings.ts | 10 ++++++++++ 5 files changed, 64 insertions(+) diff --git a/res/css/structures/_UserMenu.scss b/res/css/structures/_UserMenu.scss index 3badb0850c..17e6ad75df 100644 --- a/res/css/structures/_UserMenu.scss +++ b/res/css/structures/_UserMenu.scss @@ -117,6 +117,32 @@ limitations under the License. .mx_UserMenu_headerButtons { // No special styles: the rest of the layout happens to make it work. } + + .mx_UserMenu_dnd { + width: 24px; + height: 24px; + margin-right: 8px; + position: relative; + + &::before { + content: ''; + position: absolute; + width: 24px; + height: 24px; + mask-position: center; + mask-size: contain; + mask-repeat: no-repeat; + background: $muted-fg-color; + } + + &.mx_UserMenu_dnd_noisy::before { + mask-image: url('$(res)/img/element-icons/notifications.svg'); + } + + &.mx_UserMenu_dnd_muted::before { + mask-image: url('$(res)/img/element-icons/roomlist/notifications-off.svg'); + } + } } &.mx_UserMenu_minimized { diff --git a/src/Notifier.ts b/src/Notifier.ts index f68bfabc18..3e927cea0c 100644 --- a/src/Notifier.ts +++ b/src/Notifier.ts @@ -383,6 +383,10 @@ export const Notifier = { // don't bother notifying as user was recently active in this room return; } + if (SettingsStore.getValue("doNotDisturb")) { + // Don't bother the user if they didn't ask to be bothered + return; + } if (this.isEnabled()) { this._displayPopupNotification(ev, room); diff --git a/src/components/structures/UserMenu.tsx b/src/components/structures/UserMenu.tsx index 0543cc4d07..65861624e6 100644 --- a/src/components/structures/UserMenu.tsx +++ b/src/components/structures/UserMenu.tsx @@ -74,6 +74,7 @@ interface IState { export default class UserMenu extends React.Component { private dispatcherRef: string; private themeWatcherRef: string; + private dndWatcherRef: string; private buttonRef: React.RefObject = createRef(); private tagStoreRef: fbEmitter.EventSubscription; @@ -89,6 +90,9 @@ export default class UserMenu extends React.Component { if (SettingsStore.getValue("feature_spaces")) { SpaceStore.instance.on(UPDATE_SELECTED_SPACE, this.onSelectedSpaceUpdate); } + + // Force update is the easiest way to trigger the UI update (we don't store state for this) + this.dndWatcherRef = SettingsStore.watchSetting("doNotDisturb", null, () => this.forceUpdate()); } private get hasHomePage(): boolean { @@ -103,6 +107,7 @@ export default class UserMenu extends React.Component { public componentWillUnmount() { if (this.themeWatcherRef) SettingsStore.unwatchSetting(this.themeWatcherRef); + if (this.dndWatcherRef) SettingsStore.unwatchSetting(this.dndWatcherRef); if (this.dispatcherRef) defaultDispatcher.unregister(this.dispatcherRef); OwnProfileStore.instance.off(UPDATE_EVENT, this.onProfileUpdate); this.tagStoreRef.remove(); @@ -288,6 +293,12 @@ export default class UserMenu extends React.Component { this.setState({contextMenuPosition: null}); // also close the menu }; + private onDndToggle = (ev) => { + ev.stopPropagation(); + const current = SettingsStore.getValue("doNotDisturb"); + SettingsStore.setValue("doNotDisturb", null, SettingLevel.DEVICE, !current); + }; + private renderContextMenu = (): React.ReactNode => { if (!this.state.contextMenuPosition) return null; @@ -534,6 +545,7 @@ export default class UserMenu extends React.Component { {/* masked image in CSS */} ); + let dnd; if (this.state.selectedSpace) { name = (
@@ -560,6 +572,16 @@ export default class UserMenu extends React.Component {
); isPrototype = true; + } else if (SettingsStore.getValue("feature_dnd")) { + const isDnd = SettingsStore.getValue("doNotDisturb"); + dnd = ; } if (this.props.isMinimized) { name = null; @@ -595,6 +617,7 @@ export default class UserMenu extends React.Component { /> {name} + {dnd} {buttons}
diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 02236f9997..3bb575415f 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -786,6 +786,7 @@ "%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s", "Change notification settings": "Change notification settings", "Spaces prototype. Incompatible with Communities, Communities v2 and Custom Tags. Requires compatible homeserver for some features.": "Spaces prototype. Incompatible with Communities, Communities v2 and Custom Tags. Requires compatible homeserver for some features.", + "Show options to enable 'Do not disturb' mode": "Show options to enable 'Do not disturb' mode", "Send and receive voice messages (in development)": "Send and receive voice messages (in development)", "Render LaTeX maths in messages": "Render LaTeX maths in messages", "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.", diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index b38dee6e1a..2a26eeac13 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -128,6 +128,12 @@ export const SETTINGS: {[setting: string]: ISetting} = { default: false, controller: new ReloadOnChangeController(), }, + "feature_dnd": { + isFeature: true, + displayName: _td("Show options to enable 'Do not disturb' mode"), + supportedLevels: LEVELS_FEATURE, + default: false, + }, "feature_voice_messages": { isFeature: true, displayName: _td("Send and receive voice messages (in development)"), @@ -226,6 +232,10 @@ export const SETTINGS: {[setting: string]: ISetting} = { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, default: false, }, + "doNotDisturb": { + supportedLevels: [SettingLevel.DEVICE], + default: false, + }, "mjolnirRooms": { supportedLevels: [SettingLevel.ACCOUNT], default: [], From ff8db76d5a7724b34106d98b07e43d96392f2062 Mon Sep 17 00:00:00 2001 From: Sven Grewe Date: Wed, 14 Apr 2021 22:28:14 +0000 Subject: [PATCH 100/154] Translated using Weblate (German) Currently translated at 98.0% (2860 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 93 +++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 46 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 0abe885675..153519a643 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -25,8 +25,8 @@ "Warning!": "Warnung!", "Error": "Fehler", "Advanced": "Erweitert", - "Anyone who knows the room's link, apart from guests": "Alle, die den Raum-Link kennen (ausgenommen Gäste)", - "Anyone who knows the room's link, including guests": "Alle, die den Raum-Link kennen (auch Gäste)", + "Anyone who knows the room's link, apart from guests": "Alle, die den Raumlink kennen (ausgenommen Gäste)", + "Anyone who knows the room's link, including guests": "Alle, die den Raumlink kennen (auch Gäste)", "Are you sure you want to reject the invitation?": "Bist du sicher, dass du die Einladung ablehnen willst?", "Banned users": "Verbannte Benutzer", "Continue": "Fortfahren", @@ -50,7 +50,7 @@ "Homeserver is": "Der Heimserver ist", "Identity Server is": "Der Identitätsserver ist", "I have verified my email address": "Ich habe meine E-Mail-Adresse verifiziert", - "Import E2E room keys": "E2E-Raum-Schlüssel importieren", + "Import E2E room keys": "E2E-Raumschlüssel importieren", "Invalid Email Address": "Ungültige E-Mail-Adresse", "Sign in with": "Anmelden mit", "Leave room": "Raum verlassen", @@ -78,7 +78,7 @@ "Someone": "Jemand", "Success": "Erfolg", "This doesn't appear to be a valid email address": "Dies scheint keine gültige E-Mail-Adresse zu sein", - "This room is not accessible by remote Matrix servers": "Remote-Matrix-Server können auf diesen Raum nicht zugreifen", + "This room is not accessible by remote Matrix servers": "Ferngesteuerte Matrixserver können auf diesen Raum nicht zugreifen", "Admin": "Administrator", "Server may be unavailable, overloaded, or you hit a bug.": "Server ist nicht verfügbar, überlastet oder du bist auf einen Softwarefehler gestoßen.", "Labs": "Labor", @@ -190,7 +190,7 @@ "click to reveal": "anzeigen", "Failed to forget room %(errCode)s": "Das Entfernen des Raums ist fehlgeschlagen %(errCode)s", "and %(count)s others...|other": "und %(count)s weitere...", - "and %(count)s others...|one": "und ein(e) weitere(r)...", + "and %(count)s others...|one": "und ein weiterer...", "Are you sure?": "Bist du sicher?", "Attachment": "Anhang", "Ban": "Bannen", @@ -237,7 +237,7 @@ "Autoplay GIFs and videos": "Videos und GIFs automatisch abspielen", "%(items)s and %(lastItem)s": "%(items)s und %(lastItem)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s. %(monthName)s %(fullYear)s %(time)s", - "Access Token:": "Zugangs-Token:", + "Access Token:": "Zugangstoken:", "Always show message timestamps": "Nachrichtenzeitstempel immer anzeigen", "Authentication": "Authentifizierung", "An error has occurred.": "Ein Fehler ist aufgetreten.", @@ -302,7 +302,7 @@ "Idle": "Abwesend", "Ongoing conference call%(supportedText)s.": "Laufendes Konferenzgespräch%(supportedText)s.", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Um dein Konto für die Verwendung von %(integrationsUrl)s zu authentifizieren, wirst du jetzt auf die Website eines Drittanbieters weitergeleitet. Möchtest du fortfahren?", - "Start automatically after system login": "Nach System-Login automatisch starten", + "Start automatically after system login": "Nach Systemanmeldung automatisch starten", "Jump to first unread message.": "Zur ersten ungelesenen Nachricht springen.", "Options": "Optionen", "Invited": "Eingeladen", @@ -386,7 +386,7 @@ "Do you want to set an email address?": "Möchtest du eine E-Mail-Adresse setzen?", "This will allow you to reset your password and receive notifications.": "Dies ermöglicht es dir, dein Passwort zurückzusetzen und Benachrichtigungen zu empfangen.", "Skip": "Überspringen", - "Check for update": "Nach Updates suchen", + "Check for update": "Nach Aktualisierung suchen", "Add a widget": "Widget hinzufügen", "Allow": "Erlauben", "Delete widget": "Widget entfernen", @@ -654,12 +654,12 @@ "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "Änderungen am Namen und Bild deiner Community werden evtl. erst nach 30 Minuten von anderen Nutzern gesehen werden.", "Join this community": "Community beitreten", "Leave this community": "Community verlassen", - "You don't currently have any stickerpacks enabled": "Du hast aktuell keine Stickerpacks aktiviert", + "You don't currently have any stickerpacks enabled": "Du hast aktuell keine Stickerpakete aktiviert", "Hide Stickers": "Sticker ausblenden", "Show Stickers": "Sticker anzeigen", "Who can join this community?": "Wer kann dieser Community beitreten?", "Everyone": "Jeder", - "Stickerpack": "Stickerpack", + "Stickerpack": "Stickerpaket", "Fetching third party location failed": "Das Abrufen des Drittanbieterstandorts ist fehlgeschlagen", "Send Account Data": "Benutzerkonto-Daten senden", "All notifications are currently disabled for all targets.": "Aktuell sind alle Benachrichtigungen für alle Ziele deaktiviert.", @@ -676,7 +676,7 @@ "Changelog": "Änderungsprotokoll", "Waiting for response from server": "Auf Antwort vom Server warten", "Send Custom Event": "Benutzerdefiniertes Event senden", - "Advanced notification settings": "Erweiterte Benachrichtigungs-Einstellungen", + "Advanced notification settings": "Erweiterte Benachrichtigungseinstellungen", "Failed to send logs: ": "Senden von Logs fehlgeschlagen: ", "Forget": "Entfernen", "You cannot delete this image. (%(code)s)": "Das Bild kann nicht gelöscht werden. (%(code)s)", @@ -699,7 +699,7 @@ "Messages sent by bot": "Nachrichten von Bots", "Filter results": "Ergebnisse filtern", "Members": "Mitglieder", - "No update available.": "Kein Update verfügbar.", + "No update available.": "Keine Aktualisierung verfügbar.", "Noisy": "Laut", "Collecting app version information": "App-Versionsinformationen werden abgerufen", "Keywords": "Schlüsselwörter", @@ -738,13 +738,13 @@ "Send logs": "Logdateien übermitteln", "All messages": "Alle Nachrichten", "Call invitation": "Anrufe", - "Downloading update...": "Update wird heruntergeladen...", + "Downloading update...": "Aktualisierung wird heruntergeladen...", "State Key": "Status-Schlüssel", "Failed to send custom event.": "Senden des benutzerdefinierten Events fehlgeschlagen.", "What's new?": "Was ist neu?", "Notify me for anything else": "Über alles andere benachrichtigen", "When I'm invited to a room": "Einladungen", - "Can't update user notification settings": "Benachrichtigungs-Einstellungen des Benutzers konnten nicht aktualisiert werden", + "Can't update user notification settings": "Benachrichtigungseinstellungen des Benutzers konnten nicht aktualisiert werden", "Notify for all other messages/rooms": "Benachrichtigungen für alle anderen Mitteilungen/Räume aktivieren", "Unable to look up room ID from server": "Es ist nicht möglich, die Raum-ID auf dem Server nachzuschlagen", "Couldn't find a matching Matrix room": "Konnte keinen entsprechenden Matrix-Raum finden", @@ -781,7 +781,7 @@ "Thank you!": "Danke!", "Uploaded on %(date)s by %(user)s": "Hochgeladen: %(date)s von %(user)s", "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "In deinem aktuell verwendeten Browser können Aussehen und Handhabung der Anwendung unter Umständen noch komplett fehlerhaft sein, so dass einige bzw. im Extremfall alle Funktionen nicht zur Verfügung stehen. Du kannst es trotzdem versuchen und fortfahren, bist dabei aber bezüglich aller auftretenden Probleme auf dich allein gestellt!", - "Checking for an update...": "Nach Updates suchen...", + "Checking for an update...": "Nach Aktualisierung suchen...", "Missing roomId.": "Fehlende Raum-ID.", "Every page you use in the app": "Jede Seite, die du in der App benutzt", "e.g. ": "z. B. ", @@ -821,7 +821,7 @@ "Share Message": "Nachricht teilen", "No Audio Outputs detected": "Keine Audioausgabe erkannt", "Audio Output": "Audioausgabe", - "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "In verschlüsselten Räumen wie diesem ist die Link-Vorschau standardmäßig deaktiviert, damit dein Heimserver (der die Vorschau erzeugt) keine Informationen über Links in diesem Raum bekommt.", + "In encrypted rooms, like this one, URL previews are disabled by default to ensure that your homeserver (where the previews are generated) cannot gather information about links you see in this room.": "In verschlüsselten Räumen wie diesem ist die Linkvorschau standardmäßig deaktiviert, damit dein Heimserver (der die Vorschau erzeugt) keine Informationen über Links in diesem Raum bekommt.", "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "Die URL-Vorschau kann Informationen wie den Titel, die Beschreibung sowie ein Vorschaubild der Website enthalten.", "The email field must not be blank.": "Das E-Mail-Feld darf nicht leer sein.", "The phone number field must not be blank.": "Das Telefonnummern-Feld darf nicht leer sein.", @@ -838,7 +838,7 @@ "Failed to remove widget": "Widget konnte nicht entfernt werden", "An error ocurred whilst trying to remove the widget from the room": "Ein Fehler trat auf während versucht wurde, das Widget aus diesem Raum zu entfernen", "System Alerts": "Systembenachrichtigung", - "Only room administrators will see this warning": "Nur Raum-Administratoren werden diese Nachricht sehen", + "Only room administrators will see this warning": "Nur Raumadministratoren werden diese Nachricht sehen", "Please contact your service administrator to continue using the service.": "Bitte kontaktiere deinen Systemadministrator, um diesen Dienst weiter zu nutzen.", "This homeserver has hit its Monthly Active User limit.": "Dieser Heimserver hat seinen Grenzwert an monatlich aktiven Nutzern erreicht.", "This homeserver has exceeded one of its resource limits.": "Dieser Heimserver hat einen seiner Ressourcengrenzwert überschritten.", @@ -1020,11 +1020,11 @@ "For help with using %(brand)s, click here.": "Um Hilfe zur Benutzung von %(brand)s zu erhalten, klicke hier.", "For help with using %(brand)s, click here or start a chat with our bot using the button below.": "Um Hilfe zur Benutzung von %(brand)s zu erhalten, klicke hier oder beginne einen Chat mit unserem Bot. Klicke dazu auf den unteren Knopf.", "Chat with %(brand)s Bot": "Chatte mit dem %(brand)s-Bot", - "Help & About": "Hilfe & Über", + "Help & About": "Hilfe und Über", "Bug reporting": "Fehler melden", "FAQ": "Häufige Fragen", "Versions": "Versionen", - "Room Addresses": "Raum-Adressen", + "Room Addresses": "Raumadressen", "Deactivating your account is a permanent action - be careful!": "Die Deaktivierung deines Kontos ist unwiderruflich - sei vorsichtig!", "Preferences": "Chats", "Room list": "Raumliste", @@ -1102,7 +1102,7 @@ "Pin": "Anheften", "Timeline": "Chatverlauf", "Autocomplete delay (ms)": "Verzögerung zur Autovervollständigung (ms)", - "Roles & Permissions": "Rollen & Berechtigungen", + "Roles & Permissions": "Rollen und Berechtigungen", "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Änderungen an der Sichtbarkeit des Chatverlaufs gelten nur für zukünftige Nachrichten. Die Sichtbarkeit des existierenden Verlaufs bleibt unverändert.", "Security & Privacy": "Sicherheit", "Encryption": "Verschlüsselung", @@ -1207,11 +1207,11 @@ "Change permissions": "Ändere Berechtigungen", "Change topic": "Ändere das Thema", "Modify widgets": "Widgets bearbeiten", - "Default role": "Standard Rolle", + "Default role": "Standard-Rolle", "Send messages": "Nachrichten senden", "Invite users": "Benutzer einladen", "Change settings": "Einstellungen ändern", - "Kick users": "Benutzer kicken", + "Kick users": "Benutzer rauswerfen", "Ban users": "Benutzer verbannen", "Remove messages": "Nachrichten löschen", "Notify everyone": "Jeden benachrichtigen", @@ -1221,7 +1221,7 @@ "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "Sobald aktiviert, kann die Verschlüsselung für einen Raum nicht mehr deaktiviert werden. Nachrichten in einem verschlüsselten Raum können nur noch von Teilnehmern aber nicht mehr vom Server gelesen werden. Einige Bots und Brücken werden vielleicht nicht mehr funktionieren. Erfahre mehr über Verschlüsselung.", "Error updating main address": "Fehler beim Aktualisieren der Hauptadresse", "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "Es gab ein Problem beim Aktualisieren der Raum-Hauptadresse. Es kann sein, dass es vom Server verboten ist oder ein temporäres Problem auftrat.", - "Error updating flair": "Abzeichen-Aktualisierung fehlgeschlagen", + "Error updating flair": "Abzeichenaktualisierung fehlgeschlagen", "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Es gab ein Problem beim Aktualisieren des Abzeichens für diesen Raum. Es kann sein, dass der Server es nicht erlaubt oder ein temporäres Problem auftrat.", "Power level": "Berechtigungsstufe", "Room Settings - %(roomName)s": "Raumeinstellungen - %(roomName)s", @@ -1238,7 +1238,7 @@ "You cannot modify widgets in this room.": "Du darfst in diesem Raum keine Widgets verändern.", "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Ob du die \"Breadcrumbs\"-Funktion nutzt oder nicht (Avatare oberhalb der Raumliste)", "The server does not support the room version specified.": "Der Server unterstützt die angegebene Raumversion nicht.", - "Warning: Upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "Achtung: Ein Raum-Upgrade wird die Mitglieder des Raumes nicht automatisch auf die neue Version migrieren. Wir werden in der alten Raumversion einen Link zum neuen Raum posten - Raum-Mitglieder müssen dann auf diesen Link klicken um dem neuen Raum beizutreten.", + "Warning: Upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "Achtung: Ein Raum-Upgrade wird die Mitglieder des Raumes nicht automatisch auf die neue Version migrieren. Wir werden in der alten Raumversion einen Link zum neuen Raum posten - Raummitglieder müssen dann auf diesen Link klicken um dem neuen Raum beizutreten.", "Replying With Files": "Mit Dateien antworten", "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Momentan ist es nicht möglich mit einer Datei zu antworten. Möchtest Du die Datei hochladen, ohne zu antworten?", "The file '%(fileName)s' failed to upload.": "Die Datei \"%(fileName)s\" konnte nicht hochgeladen werden.", @@ -1300,7 +1300,7 @@ "You do not have the required permissions to use this command.": "Du hast nicht die erforderlichen Berechtigungen, diesen Befehl zu verwenden.", "Multiple integration managers": "Mehrere Integrationsverwalter", "Public Name": "Öffentlicher Name", - "Identity Server URL must be HTTPS": "Die Identity-Server-URL über HTTPS erreichbar sein", + "Identity Server URL must be HTTPS": "Identitätsserver-URL muss HTTPS sein", "Could not connect to Identity Server": "Verbindung zum Identitätsserver konnte nicht hergestellt werden", "Checking server": "Server wird überprüft", "Identity server has no terms of service": "Der Identitätsserver hat keine Nutzungsbedingungen", @@ -1380,9 +1380,9 @@ "Manage": "Verwalten", "Securely cache encrypted messages locally for them to appear in search results.": "Speichere verschlüsselte Nachrichten lokal, sodass sie deinen Suchergebnissen erscheinen können.", "Enable": "Aktivieren", - "Connecting to integration manager...": "Verbinde mit Integrationsmanager...", - "Cannot connect to integration manager": "Verbindung zum Integrationsmanager fehlgeschlagen", - "The integration manager is offline or it cannot reach your homeserver.": "Der Integrationsmanager ist offline oder er kann den Heimserver nicht erreichen.", + "Connecting to integration manager...": "Verbinde mit Integrationsverwalter...", + "Cannot connect to integration manager": "Verbindung zum Integrationsverwalter fehlgeschlagen", + "The integration manager is offline or it cannot reach your homeserver.": "Der Integrationsverwalter ist offline oder er kann den Heimserver nicht erreichen.", "not stored": "nicht gespeichert", "Backup has a signature from unknown user with ID %(deviceId)s": "Die Sicherung hat eine Signatur von unbekanntem Nutzer mit ID %(deviceId)s", "Backup key stored: ": "Backup Schlüssel gespeichert: ", @@ -1394,10 +1394,10 @@ "wait and try again later": "warte und versuche es später erneut", "Disconnect anyway": "Verbindung trotzdem trennen", "You are still sharing your personal data on the identity server .": "Du teilst deine persönlichen Daten immer noch auf dem Identitätsserver .", - "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Wir empfehlen, dass du deine Email Adressen und Telefonnummern vom Identitätsserver löschst, bevor du die Verbindung trennst.", + "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Wir empfehlen, dass du deine E-Mail-Adressen und Telefonnummern vom Identitätsserver löschst, bevor du die Verbindung trennst.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Zur Zeit benutzt du keinen Identitätsserver. Trage unten einen Server ein, um Kontakte finden und von anderen gefunden zu werden.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Nutze einen Integrationsmanager (%(serverName)s), um Bots, Widgets und Stickerpacks zu verwalten.", - "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Verwende einen Integrationsmanager, um Bots, Widgets und Sticker Packs zu verwalten.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Nutze einen Integrationsverwalter (%(serverName)s), um Bots, Widgets und Stickerpakete zu verwalten.", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "Verwende einen Integrationsverwalter, um Bots, Widgets und Stickerpakete zu verwalten.", "Manage integrations": "Integrationen verwalten", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Stimme den Nutzungsbedingungen des Identitätsservers %(serverName)s zu, um dich per E-Mail-Adresse und Telefonnummer auffindbar zu machen.", "Clear cache and reload": "Zwischenspeicher löschen und neu laden", @@ -1434,7 +1434,7 @@ "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Durch die Änderung des Passworts werden derzeit alle Ende-zu-Ende-Verschlüsselungsschlüssel in allen Sitzungen zurückgesetzt, sodass der verschlüsselte Chatverlauf nicht mehr lesbar ist, es sei denn, du exportierst zuerst deine Raumschlüssel und importierst sie anschließend wieder. In Zukunft wird dies verbessert werden.", "Delete %(count)s sessions|other": "%(count)s Sitzungen löschen", "Backup is not signed by any of your sessions": "Die Sicherung wurde von keiner deiner Sitzungen bestätigt", - "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Dein Passwort wurde erfolgreich geändert. Du erhältst keine Push-Benachrichtigungen zu anderen Sitzungen, bis du dich wieder bei diesen anmeldest", + "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "Dein Passwort wurde erfolgreich geändert. Du erhältst keine Puschbenachrichtigungen zu anderen Sitzungen, bis du dich wieder bei diesen anmeldest", "Notification sound": "Benachrichtigungston", "Set a new custom sound": "Benutzerdefinierten Ton setzen", "Browse": "Durchsuchen", @@ -1594,7 +1594,7 @@ "This backup is trusted because it has been restored on this session": "Dieser Sicherung wird vertraut, da sie während dieser Sitzung wiederhergestellt wurde", "Enable desktop notifications for this session": "Desktopbenachrichtigungen in dieser Sitzung", "Enable audible notifications for this session": "Benachrichtigungstöne in dieser Sitzung", - "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrationsmanager erhalten Konfigurationsdaten und können Widgets modifizieren, Raumeinladungen verschicken und in deinem Namen Berechtigungslevel setzen.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integrationsverwalter erhalten Konfigurationsdaten und können Widgets modifizieren, Raumeinladungen verschicken und in deinem Namen Berechtigungslevel setzen.", "Read Marker lifetime (ms)": "Gültigkeitsdauer der Gelesen-Markierung (ms)", "Read Marker off-screen lifetime (ms)": "Gültigkeitsdauer der Gelesen-Markierung außerhalb des Bildschirms (ms)", "Session key:": "Sitzungsschlüssel:", @@ -1677,7 +1677,7 @@ "You're signed out": "Du wurdest abgemeldet", "Warning: Your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Achtung: Deine persönlichen Daten (einschließlich Verschlüsselungsschlüssel) sind noch in dieser Sitzung gespeichert. Lösche diese Daten, wenn du diese Sitzung nicht mehr benötigst, oder dich mit einem anderen Konto anmelden möchtest.", "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Melde dich mittels Einmalanmeldung an, um das Löschen der Sitzungen zu bestätigen.", - "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Bestätige das Löschen dieser Sitzung indem du dich mittels „Single Sign-On“ anmeldest um deine Identität nachzuweisen.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Bestätige das Löschen dieser Sitzung mittels Einmalanmeldung um deine Identität nachzuweisen.", "Confirm deleting these sessions": "Bestätige das Löschen dieser Sitzungen", "Click the button below to confirm deleting these sessions.|other": "Klicke den Knopf, um das Löschen dieser Sitzungen zu bestätigen.", "Click the button below to confirm deleting these sessions.|one": "Klicke den Knopf, um das Löschen dieser Sitzung zu bestätigen.", @@ -1710,16 +1710,16 @@ "eg: @bot:* or example.org": "z.B. @bot:* oder example.org", "Subscribed lists": "Abonnierte Listen", "Subscribing to a ban list will cause you to join it!": "Eine Verbotsliste abonnieren bedeutet ihr beizutreten!", - "If this isn't what you want, please use a different tool to ignore users.": "Wenn dies nicht das ist, was du willst, verwende ein anderes Tool, um Benutzer zu blockieren.", + "If this isn't what you want, please use a different tool to ignore users.": "Wenn dies nicht das ist, was du willst, verwende ein anderes Werkzeug, um Benutzer zu blockieren.", "Subscribe": "Abonnieren", "Always show the window menu bar": "Fenstermenüleiste immer anzeigen", "Show tray icon and minimize window to it on close": "Beim Schließen des Fensters in die Taskleiste minimieren", "Session ID:": "Sitzungs-ID:", "Message search": "Nachrichtensuche", - "Cross-signing": "Cross-Signing", + "Cross-signing": "Quersignierung", "This room is bridging messages to the following platforms. Learn more.": "Dieser Raum verbindet Nachrichten mit den folgenden Plattformen. Mehr erfahren.", "This room isn’t bridging messages to any platforms. Learn more.": "Dieser Raum verbindet keine Nachrichten mit anderen Plattformen. Mehr erfahren.", - "Bridges": "Bridges", + "Bridges": "Brücken", "Uploaded sound": "Hochgeladener Ton", "Upgrade this room to the recommended room version": "Aktualisiere diesen Raum auf die empfohlene Raumversion", "this room": "Dieser Raum", @@ -1754,7 +1754,7 @@ "exists": "existiert", "Delete sessions|other": "Sitzungen löschen", "Delete sessions|one": "Sitzung löschen", - "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Alle Sitzungen einzeln verifizieren, anstatt auch Sitzungen zu vertrauen, die durch Cross-Signing verifiziert sind.", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Alle Sitzungen einzeln verifizieren, anstatt auch Sitzungen zu vertrauen, die durch Quersignierungen verifiziert sind.", "Securely cache encrypted messages locally for them to appear in search results, using ": "Der Zwischenspeicher für die lokale Suche in verschlüsselten Nachrichten benötigt ", " to store messages from ": " um Nachrichten von ", "%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with search components added.": "Um verschlüsselte Nachrichten lokal zu durchsuchen, benötigt %(brand)s weitere Komponenten. Wenn du diese Funktion testen möchtest, kannst du dir deine eigene Version von %(brand)s Desktop mit der integrierten Suchfunktion kompilieren.", @@ -1783,7 +1783,7 @@ "Share": "Teilen", "You have not verified this user.": "Du hast diesen Nutzer nicht verifiziert.", "Everyone in this room is verified": "Alle in diesem Raum sind verifiziert", - "Mod": "Mod", + "Mod": "Moderator", "Invite only": "Nur auf Einladung", "Scroll to most recent messages": "Zur neusten Nachricht springen", "No recent messages by %(user)s found": "Keine neuen Nachrichten von %(user)s gefunden", @@ -1806,7 +1806,7 @@ "Re-join": "Wieder beitreten", "You were banned from %(roomName)s by %(memberName)s": "Du wurdest von %(memberName)s aus %(roomName)s verbannt", "Something went wrong with your invite to %(roomName)s": "Bei deiner Einladung zu %(roomName)s ist ein Fehler aufgetreten", - "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "Während der Verifizierung deiner Einladung ist ein Fehler (%(errcode)s) aufgetreten. Du kannst diese Information einem Raum-Administrator weitergeben.", + "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "Während der Verifizierung deiner Einladung ist ein Fehler (%(errcode)s) aufgetreten. Du kannst diese Information einem Raumadministrator weitergeben.", "You can only join it with a working invite.": "Du kannst nur mit einer gültigen Einladung beitreten.", "Try to join anyway": "Dennoch versuchen beizutreten", "You can still join it because this is a public room.": "Du kannst trotzdem beitreten, weil es ein öffentlicher Raum ist.", @@ -2149,7 +2149,7 @@ "Unable to query secret storage status": "Status des sicheren Speichers kann nicht gelesen werden", "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Wir werden eine verschlüsselte Kopie deiner Schlüssel auf unserem Server speichern. Schütze deine Sicherung mit einer Wiederherstellungspassphrase.", "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Ohne eine Schlüsselsicherung kann dein verschlüsselter Nachrichtenverlauf nicht wiederhergestellt werden wenn du dich abmeldest oder eine andere Sitzung verwendest.", - "There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "Es gab einen Fehler beim Ändern des Raum-Aliases. Entweder erlaubt es der Server nicht oder es gab ein temporäres Problem.", + "There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "Es gab einen Fehler beim Ändern des Raumaliases. Entweder erlaubt es der Server nicht oder es gab ein temporäres Problem.", "Self-verification request": "Selbstverifikationsanfrage", "or another cross-signing capable Matrix client": "oder einen anderen Matrix Client der Cross-signing fähig ist", "%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "%(brand)s verwendet einen sicheren Zwischenspeicher für verschlüsselte Nachrichten, damit sie in den Suchergebnissen angezeigt werden:", @@ -2225,7 +2225,7 @@ "Address (optional)": "Adresse (optional)", "delete the address.": "lösche die Adresse.", "Use a different passphrase?": "Eine andere Passphrase verwenden?", - "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Deine Server-Administration hat die Ende-zu-Ende-Verschlüsselung für private Räume und Direktnachrichten standardmäßig deaktiviert.", + "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Deine Serveradministration hat die Ende-zu-Ende-Verschlüsselung für private Räume und Direktnachrichten standardmäßig deaktiviert.", "People": "Personen", "There was an error removing that address. It may no longer exist or a temporary error occurred.": "Beim Entfernen dieser Adresse ist ein Fehler aufgetreten. Vielleicht existiert sie nicht mehr oder es kam zu einem temporären Fehler.", "Set a room address to easily share your room with other people.": "Vergebe eine Raum-Adresse, um diesen Raum auf einfache Weise mit anderen Personen teilen zu können.", @@ -2429,7 +2429,7 @@ "Send %(count)s invites|other": "%(count)s Einladungen senden", "There was an error creating your community. The name may be taken or the server is unable to process your request.": "Beim Erstellen deiner Community ist ein Fehler aufgetreten. Entweder ist der Name schon vergeben oder der Server kann die Anfrage nicht verarbeiten.", "Community ID: +:%(domain)s": "Community-ID: +:%(domain)s", - "Explore community rooms": "Entdecke Community Räume", + "Explore community rooms": "Entdecke Communityräume", "You can change this later if needed.": "Falls nötig, kannst du es später noch ändern.", "What's the name of your community or team?": "Welchen Namen hat deine Community oder dein Team?", "Enter name": "Namen eingeben", @@ -2480,7 +2480,7 @@ "Group call ended by %(senderName)s": "Gruppenanruf wurde von %(senderName)s beendet", "Cross-signing is ready for use.": "Quersignaturen sind bereits in Anwendung.", "Cross-signing is not set up.": "Quersignierung wurde nicht eingerichtet.", - "Backup version:": "Backup-Version:", + "Backup version:": "Version der Sicherung:", "Algorithm:": "Algorithmus:", "Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key.": "Sichere deine Verschlüsselungsschlüssel mit deinen Kontodaten, falls du den Zugriff auf deine Sitzungen verlierst. Deine Schlüssel werden mit einem eindeutigen Wiederherstellungsschlüssel gesichert.", "Backup key stored:": "Sicherungsschlüssel gespeichert:", @@ -2488,7 +2488,7 @@ "Secret storage:": "Sicherer Speicher:", "ready": "bereit", "not ready": "nicht bereit", - "Secure Backup": "Sicheres Backup", + "Secure Backup": "Sichere Aufbewahrungskopie", "End Call": "Anruf beenden", "Remove the group call from the room?": "Konferenzgespräch aus diesem Raum entfernen?", "You don't have permission to remove the call from the room": "Du hast keine Berechtigung um den Konferenzanruf aus dem Raum zu entfernen", @@ -3226,5 +3226,6 @@ "%(deviceId)s from %(ip)s": "%(deviceId)s von %(ip)s", "This homeserver has been blocked by it's administrator.": "Dieser Heimserver wurde von seiner Administration blockiert.", "You have unverified logins": "Du hast nicht-bestätigte Anmeldungen", - "Review to ensure your account is safe": "Überprüfen, um sicher zu sein, dass dein Konto sicher ist" + "Review to ensure your account is safe": "Überprüfen, um sicher zu sein, dass dein Konto sicher ist", + "Message search initilisation failed": "Initialisierung der Nachrichtensuche fehlgeschlagen" } From 7927170f92676f602e6c9024d5641b8e14b0b708 Mon Sep 17 00:00:00 2001 From: libexus Date: Wed, 14 Apr 2021 22:05:42 +0000 Subject: [PATCH 101/154] Translated using Weblate (German) Currently translated at 98.0% (2860 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 153519a643..7166433caf 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1125,7 +1125,7 @@ "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Bist du sicher? Du wirst alle deine verschlüsselten Nachrichten verlieren, wenn deine Schlüssel nicht gut gesichert sind.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Verschlüsselte Nachrichten sind mit Ende-zu-Ende-Verschlüsselung gesichert. Nur du und der/die Empfänger haben die Schlüssel um diese Nachrichten zu lesen.", "Restore from Backup": "Von Sicherung wiederherstellen", - "Back up your keys before signing out to avoid losing them.": "Damit du deine Schlüssel nicht verlierst, sichere sie, bevor du dich abmeldest.", + "Back up your keys before signing out to avoid losing them.": "Um deine Schlüssel nicht zu verlieren, musst du sie vor der Abmeldung sichern.", "Start using Key Backup": "Beginne Schlüsselsicherung zu nutzen", "Credits": "Danksagungen", "Starting backup...": "Starte Sicherung...", From 4cf88fc69f8f9d9dce021167d4d2fbc6f3f1ad04 Mon Sep 17 00:00:00 2001 From: Thai Localization Date: Mon, 12 Apr 2021 08:07:43 +0000 Subject: [PATCH 102/154] Translated using Weblate (Thai) Currently translated at 11.7% (344 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/th/ --- src/i18n/strings/th.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index a5b641921c..16a9e521c2 100644 --- a/src/i18n/strings/th.json +++ b/src/i18n/strings/th.json @@ -26,7 +26,7 @@ "Results from DuckDuckGo": "ผลจาก DuckDuckGo", "%(brand)s version:": "เวอร์ชัน %(brand)s:", "Cancel": "ยกเลิก", - "Dismiss": "ไม่สนใจ", + "Dismiss": "ปิด", "Mute": "เงียบ", "Notifications": "การแจ้งเตือน", "Operation failed": "การดำเนินการล้มเหลว", @@ -380,6 +380,8 @@ "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "การแสดงผลของโปรแกรมอาจผิดพลาด ฟังก์ชันบางอย่างหรือทั้งหมดอาจไม่ทำงานในเบราว์เซอร์ปัจจุบันของคุณ หากคุณต้องการลองดำเนินการต่อ คุณต้องรับมือกับปัญหาที่อาจจะเกิดขึ้นด้วยตัวคุณเอง!", "Checking for an update...": "กำลังตรวจหาอัปเดต...", "Explore rooms": "สำรวจห้อง", - "Sign In": "เข้าสู่ระบบ", - "Create Account": "สร้างบัญชี" + "Sign In": "ลงชื่อเข้า", + "Create Account": "สร้างบัญชี", + "Add Email Address": "เพิ่มที่อยู่อีเมล", + "Confirm": "ยืนยัน" } From 8f5a74779afa7ed64bd7ba71b275d563cacf45cb Mon Sep 17 00:00:00 2001 From: Andrejs Date: Sun, 11 Apr 2021 17:33:37 +0000 Subject: [PATCH 103/154] Translated using Weblate (Latvian) Currently translated at 50.8% (1482 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/lv/ --- src/i18n/strings/lv.json | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index 4b07a93ea6..da167399d4 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -1559,5 +1559,24 @@ "Verify this session": "Verificēt šo sesiju", "You signed in to a new session without verifying it:": "Jūs pierakstījāties jaunā sesijā, neveicot tās verifikāciju:", "You're already in a call with this person.": "Jums jau notiek zvans ar šo personu.", - "Already in call": "Notiek zvans" + "Already in call": "Notiek zvans", + "%(deviceId)s from %(ip)s": "%(deviceId)s no %(ip)s", + "%(count)s people you know have already joined|other": "%(count)s pazīstami cilvēki ir jau pievienojusies", + "%(count)s people you know have already joined|one": "%(count)s pazīstama persona ir jau pievienojusies", + "Saving...": "Saglabā…", + "%(count)s members|one": "%(count)s dalībnieks", + "Save Changes": "Saglabāt izmaiņas", + "%(count)s messages deleted.|other": "%(count)s ziņas ir dzēstas.", + "%(count)s messages deleted.|one": "%(count)s ziņa ir dzēsta.", + "Welcome to ": "Laipni lūdzam uz ", + "Room name": "Istabas nosaukums", + "%(count)s members|other": "%(count)s dalībnieki", + "Room List": "Istabu saraksts", + "Send as message": "Nosūtīt kā ziņu", + "%(brand)s URL": "%(brand)s URL", + "Send a message…": "Nosūtīt ziņu…", + "Send a reply…": "Nosūtīt atbildi…", + "Room version": "Istabas versija", + "Room list": "Istabu saraksts", + "Failed to set topic": "Neizdevās iestatīt tematu" } From 4a6a53a1ca6486452bb6c414c052470a434e4b0c Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Thu, 15 Apr 2021 07:25:30 +0000 Subject: [PATCH 104/154] Translated using Weblate (Swedish) Currently translated at 100.0% (2916 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index a3147634c7..42a7f78268 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -3180,5 +3180,41 @@ "From %(deviceName)s (%(deviceId)s) at %(ip)s": "Från %(deviceName)s %(deviceId)s på %(ip)s", "Check your devices": "Kolla dina enheter", "A new login is accessing your account: %(name)s (%(deviceID)s) at %(ip)s": "En ny inloggning kommer åt ditt konto: %(name)s %(deviceID)s på %(ip)s", - "You have unverified logins": "Du har overifierade inloggningar" + "You have unverified logins": "Du har overifierade inloggningar", + "%(count)s people you know have already joined|other": "%(count)s personer du känner har redan gått med", + "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Om du gör det, observera att inga av dina meddelanden kommer att raderas, men din sökupplevelse kommer att degraderas en stund medans registret byggs upp igen", + "What are some things you want to discuss in %(spaceName)s?": "Vad är några saker du vill diskutera i %(spaceName)s?", + "You can add more later too, including already existing ones.": "Du kan lägga till flera senare också, inklusive redan existerande.", + "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Tillfrågar %(transferTarget)s. %(transferTarget)sÖverför till %(transferee)s", + "Review to ensure your account is safe": "Granska för att försäkra dig om att ditt konto är säkert", + "%(deviceId)s from %(ip)s": "%(deviceId)s från %(ip)s", + "Send and receive voice messages (in development)": "Skicka och ta emot röstmeddelanden (under utveckling)", + "unknown person": "okänd person", + "Warn before quitting": "Varna innan avslutning", + "Invite to just this room": "Bjud in till bara det här rummet", + "Invite messages are hidden by default. Click to show the message.": "Inbjudningsmeddelanden är dolda som förval. Klicka för att visa meddelandet.", + "Record a voice message": "Spela in ett röstmeddelande", + "Stop & send recording": "Stoppa och skicka inspelning", + "Accept on your other login…": "Acceptera på din andra inloggning…", + "%(count)s people you know have already joined|one": "%(count)s person du känner har redan gått med", + "Quick actions": "Snabbhandlingar", + "Add existing rooms": "Lägg till existerande rum", + "Adding...": "Lägger till…", + "We couldn't create your DM.": "Vi kunde inte skapa ditt DM.", + "Reset event store": "Återställ händelselagring", + "Invited people will be able to read old messages.": "Inbjudna personer kommer att kunna läsa gamla meddelanden.", + "Reset event store?": "Återställ händelselagring?", + "You most likely do not want to reset your event index store": "Du vill troligen inte återställa din händelseregisterlagring", + "Consult first": "Tillfråga först", + "Verify other login": "Verifiera annan inloggning", + "Avatar": "Avatar", + "Let's create a room for each of them.": "Låt oss skapa ett rum för varje.", + "Verification requested": "Verifiering begärd", + "Sends the given message as a spoiler": "Skickar det angivna meddelandet som en spoiler", + "Manage & explore rooms": "Hantera och utforska rum", + "Message search initilisation failed": "Initialisering av meddelandesökning misslyckades", + "Please choose a strong password": "Vänligen välj ett starkt lösenord", + "Use another login": "Använd annan inloggning", + "Verify your identity to access encrypted messages and prove your identity to others.": "Verifiera din identitet för att komma åt krypterade meddelanden och bevisa din identitet för andra.", + "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Om du inte verifierar så kommer du inte ha åtkomst till alla dina meddelanden och kan synas som ej betrodd för andra." } From 3a91dff7112f4b1e653e76ab0df460cd5723c883 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Thu, 15 Apr 2021 14:13:37 +0100 Subject: [PATCH 105/154] Check if address type is mx-user-id --- src/components/views/dialogs/InviteDialog.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index 5ca7e3aec2..2ebc84ec7c 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -666,14 +666,15 @@ export default class InviteDialog extends React.PureComponent 1) { createRoomOptions.createOpts = targetIds.reduce( (roomOptions, address) => { - if (getAddressType(address) === 'email') { + const type = getAddressType(address); + if (type === 'email') { const invite: IInvite3PID = { id_server: client.getIdentityServerUrl(true), medium: 'email', address, }; roomOptions.invite_3pid.push(invite); - } else { + } else if (type === 'mx-user-id') { roomOptions.invite.push(address); } return roomOptions; From a59873df0bd813e3b7f3eb7844dbd7d610bf035a Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Thu, 15 Apr 2021 15:51:00 +0100 Subject: [PATCH 106/154] Set rooms event listeners during the correct life cycle hook --- src/components/views/rooms/RoomList.tsx | 5 +-- src/components/views/rooms/RoomSublist.tsx | 7 ++- src/components/views/rooms/RoomTile.tsx | 51 ++++++++++++---------- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/src/components/views/rooms/RoomList.tsx b/src/components/views/rooms/RoomList.tsx index 963e94ebbb..93c72621af 100644 --- a/src/components/views/rooms/RoomList.tsx +++ b/src/components/views/rooms/RoomList.tsx @@ -289,12 +289,11 @@ export default class RoomList extends React.PureComponent { // shallow-copy from the template as we need to make modifications to it this.tagAesthetics = objectShallowClone(TAG_AESTHETICS); this.updateDmAddRoomAction(); - - this.dispatcherRef = defaultDispatcher.register(this.onAction); - this.roomStoreToken = RoomViewStore.addListener(this.onRoomViewStoreUpdate); } public componentDidMount(): void { + this.dispatcherRef = defaultDispatcher.register(this.onAction); + this.roomStoreToken = RoomViewStore.addListener(this.onRoomViewStoreUpdate); SpaceStore.instance.on(SUGGESTED_ROOMS, this.updateSuggestedRooms); RoomListStore.instance.on(LISTS_UPDATE_EVENT, this.updateLists); this.customTagStoreRef = CustomRoomTagStore.addListener(this.updateLists); diff --git a/src/components/views/rooms/RoomSublist.tsx b/src/components/views/rooms/RoomSublist.tsx index 74052e8ba1..410325ef46 100644 --- a/src/components/views/rooms/RoomSublist.tsx +++ b/src/components/views/rooms/RoomSublist.tsx @@ -125,8 +125,6 @@ export default class RoomSublist extends React.Component { }; // Why Object.assign() and not this.state.height? Because TypeScript says no. this.state = Object.assign(this.state, {height: this.calculateInitialHeight()}); - this.dispatcherRef = defaultDispatcher.register(this.onAction); - RoomListStore.instance.on(LISTS_UPDATE_EVENT, this.onListsUpdated); } private calculateInitialHeight() { @@ -242,6 +240,11 @@ export default class RoomSublist extends React.Component { return false; } + public componentDidMount() { + this.dispatcherRef = defaultDispatcher.register(this.onAction); + RoomListStore.instance.on(LISTS_UPDATE_EVENT, this.onListsUpdated); + } + public componentWillUnmount() { defaultDispatcher.unregister(this.dispatcherRef); RoomListStore.instance.off(LISTS_UPDATE_EVENT, this.onListsUpdated); diff --git a/src/components/views/rooms/RoomTile.tsx b/src/components/views/rooms/RoomTile.tsx index a32fc46a80..ad923138df 100644 --- a/src/components/views/rooms/RoomTile.tsx +++ b/src/components/views/rooms/RoomTile.tsx @@ -97,22 +97,6 @@ export default class RoomTile extends React.PureComponent { // generatePreview() will return nothing if the user has previews disabled messagePreview: this.generatePreview(), }; - - ActiveRoomObserver.addListener(this.props.room.roomId, this.onActiveRoomUpdate); - this.dispatcherRef = defaultDispatcher.register(this.onAction); - MessagePreviewStore.instance.on( - MessagePreviewStore.getPreviewChangedEventName(this.props.room), - this.onRoomPreviewChanged, - ); - this.notificationState = RoomNotificationStateStore.instance.getRoomState(this.props.room); - this.notificationState.on(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate); - this.roomProps = EchoChamber.forRoom(this.props.room); - this.roomProps.on(PROPERTY_UPDATED, this.onRoomPropertyUpdate); - CommunityPrototypeStore.instance.on( - CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId), - this.onCommunityUpdate, - ); - this.props.room.on("Room.name", this.onRoomNameUpdate); } private onRoomNameUpdate = (room) => { @@ -167,6 +151,22 @@ export default class RoomTile extends React.PureComponent { if (this.state.selected) { this.scrollIntoView(); } + + ActiveRoomObserver.addListener(this.props.room.roomId, this.onActiveRoomUpdate); + this.dispatcherRef = defaultDispatcher.register(this.onAction); + MessagePreviewStore.instance.on( + MessagePreviewStore.getPreviewChangedEventName(this.props.room), + this.onRoomPreviewChanged, + ); + this.notificationState = RoomNotificationStateStore.instance.getRoomState(this.props.room); + this.notificationState.on(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate); + this.roomProps = EchoChamber.forRoom(this.props.room); + this.roomProps.on(PROPERTY_UPDATED, this.onRoomPropertyUpdate); + this.roomProps.on("Room.name", this.onRoomNameUpdate); + CommunityPrototypeStore.instance.on( + CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId), + this.onCommunityUpdate, + ); } public componentWillUnmount() { @@ -182,8 +182,15 @@ export default class RoomTile extends React.PureComponent { ); this.props.room.off("Room.name", this.onRoomNameUpdate); } + ActiveRoomObserver.removeListener(this.props.room.roomId, this.onActiveRoomUpdate); defaultDispatcher.unregister(this.dispatcherRef); this.notificationState.off(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate); + this.roomProps.off(PROPERTY_UPDATED, this.onRoomPropertyUpdate); + this.roomProps.off("Room.name", this.onRoomNameUpdate); + CommunityPrototypeStore.instance.off( + CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId), + this.onCommunityUpdate, + ); } private onAction = (payload: ActionPayload) => { @@ -371,7 +378,7 @@ export default class RoomTile extends React.PureComponent { return null; } - const state = this.roomProps.notificationVolume; + const state = this.roomProps?.notificationVolume; let contextMenu = null; if (this.state.notificationsMenuPosition) { @@ -547,7 +554,7 @@ export default class RoomTile extends React.PureComponent { />; let badge: React.ReactNode; - if (!this.props.isMinimized) { + if (!this.props.isMinimized && this.notificationState) { // aria-hidden because we summarise the unread count/highlight status in a manual aria-label below badge = ( ) : null } - { spaces.length + rooms.length < 1 ? + { dms.length > 0 ? ( +
+

{ _t("Direct Messages") }

+ { dms.map(space => { + return { + if (checked) { + selectedToAdd.add(space); + } else { + selectedToAdd.delete(space); + } + setSelectedToAdd(new Set(selectedToAdd)); + }} + />; + }) } +
+ ) : null } + + { spaces.length + rooms.length + dms.length < 1 ? { _t("No results") } : undefined } From 64e0626693a2e007157ad0e7caffdb9b17c20b4b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 19 Apr 2021 11:13:08 +0100 Subject: [PATCH 124/154] i18n --- src/i18n/strings/en_EN.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 6ac73611f1..067edec4cf 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2015,6 +2015,7 @@ "Add existing rooms": "Add existing rooms", "Filter your rooms and spaces": "Filter your rooms and spaces", "Spaces": "Spaces", + "Direct Messages": "Direct Messages", "Don't want to add an existing room?": "Don't want to add an existing room?", "Create a new room": "Create a new room", "Failed to add rooms to space": "Failed to add rooms to space", @@ -2205,7 +2206,6 @@ "Suggestions": "Suggestions", "May include members not in %(communityName)s": "May include members not in %(communityName)s", "Recently Direct Messaged": "Recently Direct Messaged", - "Direct Messages": "Direct Messages", "Start a conversation with someone using their name, email address or username (like ).": "Start a conversation with someone using their name, email address or username (like ).", "Start a conversation with someone using their name or username (like ).": "Start a conversation with someone using their name or username (like ).", "This won't invite them to %(communityName)s. To invite someone to %(communityName)s, click here": "This won't invite them to %(communityName)s. To invite someone to %(communityName)s, click here", From 71d5f03a25285cb43e024c31fd29c3305402084f Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 19 Apr 2021 11:36:40 +0100 Subject: [PATCH 125/154] delint --- src/components/structures/MatrixChat.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index dd64dd76f9..2328481b40 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -1098,7 +1098,8 @@ export default class MatrixChat extends React.PureComponent { warnings.push(( {' '/* Whitespace, otherwise the sentences get smashed together */ } - { _t("You are the only person here. If you leave, no one will be able to join in the future, including you.") } + { _t("You are the only person here. " + + "If you leave, no one will be able to join in the future, including you.") } )); From db646d5987ab5dbba957e7a245a2cf74346f6bd5 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Mon, 19 Apr 2021 15:07:11 +0100 Subject: [PATCH 126/154] Fix end to end tests for DM creation --- .../src/usecases/create-room.js | 10 +- test/end-to-end-tests/src/usecases/signup.js | 1 + test/end-to-end-tests/yarn.lock | 142 ++++++++++-------- 3 files changed, 81 insertions(+), 72 deletions(-) diff --git a/test/end-to-end-tests/src/usecases/create-room.js b/test/end-to-end-tests/src/usecases/create-room.js index 35b9d5879e..3830e3e0da 100644 --- a/test/end-to-end-tests/src/usecases/create-room.js +++ b/test/end-to-end-tests/src/usecases/create-room.js @@ -21,15 +21,7 @@ async function openRoomDirectory(session) { } async function findSublist(session, name) { - const sublists = await session.queryAll('.mx_RoomSublist'); - for (const sublist of sublists) { - const header = await sublist.$('.mx_RoomSublist_headerText'); - const headerText = await session.innerText(header); - if (headerText.toLowerCase().includes(name.toLowerCase())) { - return sublist; - } - } - throw new Error(`could not find room list section that contains '${name}' in header`); + return await session.query(`.mx_RoomSublist[aria-label="${name}" i]`); } async function createRoom(session, roomName, encrypted=false) { diff --git a/test/end-to-end-tests/src/usecases/signup.js b/test/end-to-end-tests/src/usecases/signup.js index 804cee9599..c0ab82be33 100644 --- a/test/end-to-end-tests/src/usecases/signup.js +++ b/test/end-to-end-tests/src/usecases/signup.js @@ -32,6 +32,7 @@ module.exports = async function signup(session, username, password, homeserver) await nextButton.click(); } //fill out form + await session.delay(100); const usernameField = await session.query("#mx_RegistrationForm_username"); const passwordField = await session.query("#mx_RegistrationForm_password"); const passwordRepeatField = await session.query("#mx_RegistrationForm_passwordConfirm"); diff --git a/test/end-to-end-tests/yarn.lock b/test/end-to-end-tests/yarn.lock index 2f4d9979fb..7f2cefb92e 100644 --- a/test/end-to-end-tests/yarn.lock +++ b/test/end-to-end-tests/yarn.lock @@ -37,9 +37,9 @@ assert-plus@1.0.0, assert-plus@^1.0.0: integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== asynckit@^0.4.0: version "0.4.0" @@ -57,9 +57,9 @@ aws4@^1.8.0: integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== bcrypt-pbkdf@^1.0.0: version "1.0.2" @@ -81,6 +81,11 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -120,7 +125,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.2: +concat-stream@^1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -157,7 +162,7 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@2.6.9: +debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -165,18 +170,18 @@ debug@2.6.9: ms "2.0.0" debug@^3.1.0: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" debug@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: - ms "^2.1.1" + ms "2.1.2" delayed-stream@~1.0.0: version "1.0.0" @@ -250,14 +255,14 @@ extend@~3.0.2: integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== extract-zip@^1.6.6: - version "1.6.7" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" - integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= + version "1.7.0" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.7.0.tgz#556cc3ae9df7f452c493a0cfb51cc30277940927" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== dependencies: - concat-stream "1.6.2" - debug "2.6.9" - mkdirp "0.5.1" - yauzl "2.4.1" + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" extsprintf@1.3.0: version "1.3.0" @@ -279,10 +284,10 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" - integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= dependencies: pend "~1.2.0" @@ -313,9 +318,9 @@ getpass@^0.1.1: assert-plus "^1.0.0" glob@^7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -374,7 +379,12 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@2, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -442,9 +452,9 @@ mime-types@^2.1.12, mime-types@~2.1.19: mime-db "~1.38.0" mime@^2.0.3: - version "2.4.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" - integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w== + version "2.5.2" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" + integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== minimatch@^3.0.4: version "3.0.4" @@ -453,28 +463,33 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -mkdirp@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= +mkdirp@^0.5.4: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: - minimist "0.0.8" + minimist "^1.2.5" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -517,9 +532,9 @@ performance-now@^2.1.0: integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== progress@^2.0.1: version "2.0.3" @@ -527,9 +542,9 @@ progress@^2.0.1: integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== proxy-from-env@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" - integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== psl@^1.1.24, psl@^1.1.28: version "1.1.31" @@ -547,9 +562,9 @@ punycode@^2.1.0, punycode@^2.1.1: integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== puppeteer@^1.14.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.14.0.tgz#828c1926b307200d5fc8289b99df4e13e962d339" - integrity sha512-SayS2wUX/8LF8Yo2Rkpc5nkAu4Jg3qu+OLTDSOZtisVQMB2Z5vjlY2TdPi/5CgZKiZroYIiyUN3sRX63El9iaw== + version "1.20.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.20.0.tgz#e3d267786f74e1d87cf2d15acc59177f471bbe38" + integrity sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ== dependencies: debug "^4.1.0" extract-zip "^1.6.6" @@ -566,9 +581,9 @@ qs@~6.5.2: integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== readable-stream@^2.2.2: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -630,9 +645,9 @@ request@^2.88.0: uuid "^3.3.2" rimraf@^2.6.1: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" @@ -751,9 +766,10 @@ ws@^6.1.0: dependencies: async-limiter "~1.0.0" -yauzl@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" - integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= dependencies: - fd-slicer "~1.0.1" + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" From 344e4b6c5bfa105bb03046b08dc99e7803d47bba Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 19 Apr 2021 16:15:24 +0100 Subject: [PATCH 127/154] Trigger lazy loading when filtering using spaces so that the filtered DMs are correct --- src/stores/SpaceStore.tsx | 20 ++++++++++++++++++++ src/stores/room-list/SpaceWatcher.ts | 16 +++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 52060f86a5..dcdbc73cb7 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -525,6 +525,26 @@ export class SpaceStoreClass extends AsyncStoreWithClient { this.notificationStateMap.set(key, state); return state; } + + // traverse space tree with DFS calling fn on each space including the given root one + public traverseSpace( + spaceId: string, + fn: (roomId: string) => void, + includeRooms = false, + parentPath?: Set, + ) { + if (parentPath && parentPath.has(spaceId)) return; // prevent cycles + + fn(spaceId); + + const newPath = new Set(parentPath).add(spaceId); + const [childSpaces, childRooms] = partitionSpacesAndRooms(this.getChildren(spaceId)); + + if (includeRooms) { + childRooms.forEach(r => fn(r.roomId)); + } + childSpaces.forEach(s => this.traverseSpace(s.roomId, fn, includeRooms, newPath)); + } } export default class SpaceStore { diff --git a/src/stores/room-list/SpaceWatcher.ts b/src/stores/room-list/SpaceWatcher.ts index d26f563a91..13e1d83901 100644 --- a/src/stores/room-list/SpaceWatcher.ts +++ b/src/stores/room-list/SpaceWatcher.ts @@ -28,12 +28,22 @@ export class SpaceWatcher { private activeSpace: Room = SpaceStore.instance.activeSpace; constructor(private store: RoomListStoreClass) { - this.filter.updateSpace(this.activeSpace); // get the filter into a consistent state + this.updateFilter(); // get the filter into a consistent state store.addFilter(this.filter); SpaceStore.instance.on(UPDATE_SELECTED_SPACE, this.onSelectedSpaceUpdated); } - private onSelectedSpaceUpdated = (activeSpace) => { - this.filter.updateSpace(this.activeSpace = activeSpace); + private onSelectedSpaceUpdated = (activeSpace: Room) => { + this.activeSpace = activeSpace; + this.updateFilter(); + }; + + private updateFilter = () => { + if (this.activeSpace) { + SpaceStore.instance.traverseSpace(this.activeSpace.roomId, roomId => { + this.store.matrixClient?.getRoom(roomId)?.loadMembersIfNeeded(); + }); + } + this.filter.updateSpace(this.activeSpace); }; } From 20586e52bc1d4e3598dc96660a7b987920124837 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 19 Apr 2021 10:13:22 -0600 Subject: [PATCH 128/154] Update src/utils/Singleflight.ts to support English Co-authored-by: J. Ryan Stinnett --- src/utils/Singleflight.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/Singleflight.ts b/src/utils/Singleflight.ts index 1c2af4278d..c2a564ea3e 100644 --- a/src/utils/Singleflight.ts +++ b/src/utils/Singleflight.ts @@ -30,7 +30,7 @@ const keyMap = new EnhancedMap>(); * to disable a button, however it would be capable of returning a Promise * from the first call. * - * The result of the function call are cached indefinitely, just in case a + * The result of the function call is cached indefinitely, just in case a * second call comes through late. There are various functions named "forget" * to have the cache be cleared of a result. * From 4082a037697e559938c8163a5e19d10a96f806eb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 19 Apr 2021 17:32:15 +0100 Subject: [PATCH 129/154] Fix typo in method call in add existing to space dialog --- src/components/views/dialogs/AddExistingToSpaceDialog.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/dialogs/AddExistingToSpaceDialog.tsx b/src/components/views/dialogs/AddExistingToSpaceDialog.tsx index 7ea6b43194..0f58a624f3 100644 --- a/src/components/views/dialogs/AddExistingToSpaceDialog.tsx +++ b/src/components/views/dialogs/AddExistingToSpaceDialog.tsx @@ -59,6 +59,7 @@ const AddExistingToSpaceDialog: React.FC = ({ matrixClient: cli, space, const existingSubspacesSet = new Set(existingSubspaces); const existingRoomsSet = new Set(SpaceStore.instance.getChildRooms(space.roomId)); + const joinRule = selectedSpace.getJoinRule(); const [spaces, rooms, dms] = cli.getVisibleRooms().reduce((arr, room) => { if (room.getMyMembership() !== "join") return arr; if (!room.name.toLowerCase().includes(lcQuery)) return arr; @@ -67,7 +68,7 @@ const AddExistingToSpaceDialog: React.FC = ({ matrixClient: cli, space, if (room !== space && room !== selectedSpace && !existingSubspacesSet.has(room)) { arr[0].push(room); } - } else if (!existingRoomsSet.has(room) && selectedSpace.joinRule() !== "public") { + } else if (!existingRoomsSet.has(room) && joinRule !== "public") { // Only show DMs for non-public spaces as they make very little sense in spaces other than "Just Me" ones. arr[DMRoomMap.shared().getUserIdForRoomId(room.roomId) ? 2 : 1].push(room); } From 33eebb84a6c718d2fc14962dc467c01498a278ab Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Mon, 19 Apr 2021 17:57:20 +0100 Subject: [PATCH 130/154] Ensure PersistedElement are unmounted on application logout --- src/components/structures/MatrixChat.tsx | 1 + src/components/views/elements/PersistedElement.js | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index d9ed7d061b..b8e591943b 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -586,6 +586,7 @@ export default class MatrixChat extends React.PureComponent { break; case 'logout': dis.dispatch({action: "hangup_all"}); + dis.dispatch({action: "logout"}); Lifecycle.logout(); break; case 'require_registration': diff --git a/src/components/views/elements/PersistedElement.js b/src/components/views/elements/PersistedElement.js index f504b3e97f..701c140a19 100644 --- a/src/components/views/elements/PersistedElement.js +++ b/src/components/views/elements/PersistedElement.js @@ -139,6 +139,8 @@ export default class PersistedElement extends React.Component { _onAction(payload) { if (payload.action === 'timeline_resize') { this._repositionChild(); + } else if (payload.action === 'logout') { + PersistedElement.destroyElement(this.props.persistKey); } } From de5ca92e4e03913b1c19d51c47dc36b502a867cd Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Mon, 19 Apr 2021 18:01:19 +0100 Subject: [PATCH 131/154] add e2e session.delay explainer --- test/end-to-end-tests/src/usecases/signup.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/end-to-end-tests/src/usecases/signup.js b/test/end-to-end-tests/src/usecases/signup.js index c0ab82be33..a3391e99f3 100644 --- a/test/end-to-end-tests/src/usecases/signup.js +++ b/test/end-to-end-tests/src/usecases/signup.js @@ -31,8 +31,10 @@ module.exports = async function signup(session, username, password, homeserver) // accept homeserver await nextButton.click(); } - //fill out form + // Delay required because of local race condition on macOs + // Where the form is not query-able despite being present in the DOM await session.delay(100); + //fill out form const usernameField = await session.query("#mx_RegistrationForm_username"); const passwordField = await session.query("#mx_RegistrationForm_password"); const passwordRepeatField = await session.query("#mx_RegistrationForm_passwordConfirm"); From b52d6e3d976ed0f7464992b744348b1ab508ec78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Mon, 19 Apr 2021 20:52:40 +0200 Subject: [PATCH 132/154] A tiny change to make the dialog a little nicer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/dialogs/_AddExistingToSpaceDialog.scss | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/res/css/views/dialogs/_AddExistingToSpaceDialog.scss b/res/css/views/dialogs/_AddExistingToSpaceDialog.scss index a7cfd7bde6..dd5a6d618b 100644 --- a/res/css/views/dialogs/_AddExistingToSpaceDialog.scss +++ b/res/css/views/dialogs/_AddExistingToSpaceDialog.scss @@ -102,6 +102,7 @@ limitations under the License. .mx_SearchBox { margin: 0; + margin-bottom: 24px; flex-grow: 0; } @@ -123,7 +124,9 @@ limitations under the License. } .mx_AddExistingToSpaceDialog_section { - margin-top: 24px; + &:not(:first-child) { + margin-top: 24px; + } > h3 { margin: 0; From 910a3e5f3104ac769e5c1b7bf877362251ba32f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Mon, 19 Apr 2021 20:59:54 +0200 Subject: [PATCH 133/154] A little nicer spacing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/dialogs/_AddExistingToSpaceDialog.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/css/views/dialogs/_AddExistingToSpaceDialog.scss b/res/css/views/dialogs/_AddExistingToSpaceDialog.scss index dd5a6d618b..80ad4d6c0e 100644 --- a/res/css/views/dialogs/_AddExistingToSpaceDialog.scss +++ b/res/css/views/dialogs/_AddExistingToSpaceDialog.scss @@ -101,8 +101,8 @@ limitations under the License. } .mx_SearchBox { - margin: 0; - margin-bottom: 24px; + // To match the space around the title + margin: 0 0 15px 0; flex-grow: 0; } From 548cd38a5c1af71b666603189bafebf6d499d181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 20 Apr 2021 08:22:43 +0200 Subject: [PATCH 134/154] Remove weird margin from the file panel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/structures/_FilePanel.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/res/css/structures/_FilePanel.scss b/res/css/structures/_FilePanel.scss index 2aa068b674..7b975110e1 100644 --- a/res/css/structures/_FilePanel.scss +++ b/res/css/structures/_FilePanel.scss @@ -22,7 +22,6 @@ limitations under the License. } .mx_FilePanel .mx_RoomView_messageListWrapper { - margin-right: 20px; flex-direction: row; align-items: center; justify-content: center; From a3617fa3cdc0545e94421d73d0d108e64ab3e007 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Tue, 20 Apr 2021 08:51:14 +0100 Subject: [PATCH 135/154] Remove unnecessary logout action --- src/components/structures/MatrixChat.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index b8e591943b..d9ed7d061b 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -586,7 +586,6 @@ export default class MatrixChat extends React.PureComponent { break; case 'logout': dis.dispatch({action: "hangup_all"}); - dis.dispatch({action: "logout"}); Lifecycle.logout(); break; case 'require_registration': From 97c775c203eae11cd6327c83af74f34d569272a1 Mon Sep 17 00:00:00 2001 From: Hannah Rittich Date: Sun, 18 Apr 2021 09:09:48 +0000 Subject: [PATCH 136/154] Translated using Weblate (German) Currently translated at 98.5% (2875 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 027f1be177..7a73e8d761 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2258,7 +2258,7 @@ "Dark": "Dunkel", "Use the improved room list (will refresh to apply changes)": "Verwende die verbesserte Raumliste (lädt die Anwendung neu)", "Use custom size": "Verwende individuelle Größe", - "Hey you. You're the best!": "Hey du. Du bist der Beste!", + "Hey you. You're the best!": "Hey du. Du bist großartig.", "Message layout": "Nachrichtenlayout", "Compact": "Kompakt", "Modern": "Modern", @@ -3238,5 +3238,13 @@ "Sends the given message as a spoiler": "Die gegebene Nachricht als Spoiler senden", "Values at explicit levels in this room:": "Werte für explizite Stufen in diesem Raum:", "Values at explicit levels:": "Werte für explizite Stufen:", - "Values at explicit levels in this room": "Werte für explizite Stufen in diesem Raum" + "Values at explicit levels in this room": "Werte für explizite Stufen in diesem Raum", + "Confirm abort of host creation": "Bestätige das Abbrechen der Host-Erstellung", + "Are you sure you wish to abort creation of the host? The process cannot be continued.": "Soll die Host-Erstellung wirklich abgebrochen werden? Dieser Prozess kann nicht wieder fortgesetzt werden.", + "Invite to just this room": "Nur für diesen Raum einladen", + "Consult first": "Konsultiere zuerst", + "Reset event store?": "Ereigniss-Speicher zurück setzen?", + "You most likely do not want to reset your event index store": "Es ist wahrscheinlich, dass du den Ereigniss-Index-Speicher nicht zurück setzen möchtest", + "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few momentswhilst the index is recreated": "Falls du dies tust, werden keine deiner Nachrichten gelöscht. Allerdings wird die Such-Funktion eine Weile lang schlecht funktionieren, bis der Index wieder hergestellt ist", + "Reset event store": "Ereignis-Speicher zurück setzen" } From 0de0a3028393a71fc2c0dea2379fc8659b6863a4 Mon Sep 17 00:00:00 2001 From: libexus Date: Fri, 16 Apr 2021 13:29:08 +0000 Subject: [PATCH 137/154] Translated using Weblate (German) Currently translated at 98.5% (2875 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 7a73e8d761..bfb226aa3c 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -11,7 +11,7 @@ "The email address linked to your account must be entered.": "Es muss die mit dem Benutzerkonto verbundene E-Mail-Adresse eingegeben werden.", "Name": "Name", "Session ID": "Sitzungs-ID", - "Displays action": "Zeigt Aktionen an", + "Displays action": "Als Aktionen anzeigen", "Bans user with given id": "Verbannt den Benutzer mit der angegebenen ID", "Deops user with given id": "Setzt das Berechtigungslevel beim Benutzer mit der angegebenen ID zurück", "Invites user with given id to current room": "Lädt den Benutzer mit der angegebenen ID in den aktuellen Raum ein", @@ -302,7 +302,7 @@ "Idle": "Abwesend", "Ongoing conference call%(supportedText)s.": "Laufendes Konferenzgespräch%(supportedText)s.", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Um dein Konto für die Verwendung von %(integrationsUrl)s zu authentifizieren, wirst du jetzt auf die Website eines Drittanbieters weitergeleitet. Möchtest du fortfahren?", - "Start automatically after system login": "Nach Systemanmeldung automatisch starten", + "Start automatically after system login": "Nach Systemstart automatisch starten", "Jump to first unread message.": "Zur ersten ungelesenen Nachricht springen.", "Options": "Optionen", "Invited": "Eingeladen", @@ -795,7 +795,7 @@ "We encountered an error trying to restore your previous session.": "Wir haben ein Problem beim Wiederherstellen deiner vorherigen Sitzung festgestellt.", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Den Browser-Speicher zu löschen kann das Problem lösen, wird dich aber abmelden und verschlüsselte Chats unlesbar machen.", "Collapse Reply Thread": "Antwort-Thread zusammenklappen", - "Enable widget screenshots on supported widgets": "Widgetbildschirmfotos bei unterstützten Widgets aktivieren", + "Enable widget screenshots on supported widgets": "Bildschirmfotos bei unterstützten Widgets aktivieren", "Send analytics data": "Analysedaten senden", "e.g. %(exampleValue)s": "z.B. %(exampleValue)s", "Muted Users": "Stummgeschaltete Benutzer", @@ -850,7 +850,7 @@ "Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please contact your service administrator to continue using the service.": "Deine Nachricht wurde nicht gesendet, weil dieser Heimserver sein Limit an monatlich aktiven Benutzern erreicht hat. Bitte kontaktiere deinen Systemadministrator um diesen Dienst weiter zu nutzen.", "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Deine Nachricht wurde nicht gesendet, weil dieser Heimserver ein Ressourcen-Limit erreicht hat. Bitte kontaktiere deinen Systemadministrator um diesen Dienst weiter zu nutzen.", "Please contact your service administrator to continue using this service.": "Bitte kontaktiere deinen Systemadministrator um diesen Dienst weiter zu nutzen.", - "Sorry, your homeserver is too old to participate in this room.": "Tschuldige, dein Heimserver ist zu alt, um an diesem Raum teilzunehmen.", + "Sorry, your homeserver is too old to participate in this room.": "Leider ist dein Heimserver zu alt, um an diesem Raum teilzunehmen.", "Please contact your homeserver administrator.": "Bitte setze dich mit der Administration deines Heimservers in Verbindung.", "Legal": "Rechtliches", "This room has been replaced and is no longer active.": "Dieser Raum wurde ersetzt und ist nicht länger aktiv.", @@ -1149,7 +1149,7 @@ "Report bugs & give feedback": "Melde Fehler & gib Rückmeldungen", "Update status": "Aktualisiere Status", "Set status": "Setze Status", - "Hide": "Verberge", + "Hide": "Verbergen", "This homeserver would like to make sure you are not a robot.": "Dieser Heimserver möchte sicherstellen, dass du kein Roboter bist.", "Server Name": "Servername", "Your Modular server": "Dein Modular-Server", @@ -2535,7 +2535,7 @@ "Hide Widgets": "Widgets verstecken", "%(senderName)s declined the call.": "%(senderName)s hat den Anruf abgelehnt.", "(an error occurred)": "(ein Fehler ist aufgetreten)", - "(their device couldn't start the camera / microphone)": "(Gerät des Gegenübers konnte Kamera oder Mikrophon nicht starten)", + "(their device couldn't start the camera / microphone)": "(Gerät des Gegenübers konnte Kamera oder Mikrofon nicht starten)", "(connection failed)": "(Verbindung fehlgeschlagen)", "🎉 All servers are banned from participating! This room can no longer be used.": "🎉 Alle Server sind von der Teilnahme ausgeschlossen! Dieser Raum kann nicht mehr genutzt werden.", "%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s hat die Server-ACLs für diesen Raum geändert.", @@ -2617,7 +2617,7 @@ "You ended the call": "Du hast den Anruf beendet", "%(senderName)s ended the call": "%(senderName)s hat den Anruf beendet", "Use Command + Enter to send a message": "Benutze Betriebssystemtaste + Eingabe um eine Nachricht zu senden", - "Use Ctrl + Enter to send a message": "Nachrichten mit Strg + Eingabe senden", + "Use Ctrl + Enter to send a message": "Nachrichten mit Strg + Enter senden", "Call Paused": "Anruf pausiert", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Verschlüsselte Nachrichten sicher lokal zwischenspeichern, um sie in Suchergebnissen finden zu können. Es werden %(size)s benötigt, um die Nachrichten von %(rooms)s Räumen zu speichern.", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "Verschlüsselte Nachrichten sicher lokal zwischenspeichern, um sie in Suchergebnissen finden zu können. Es werden %(size)s benötigt, um die Nachrichten vom Raum %(rooms)s zu speichern.", @@ -3229,7 +3229,7 @@ "Review to ensure your account is safe": "Überprüfen, um sicher zu sein, dass dein Konto sicher ist", "Message search initilisation failed": "Initialisierung der Nachrichtensuche fehlgeschlagen", "Support": "Unterstützen", - "This room is suggested as a good one to join": "Dieser Raum wurde als einen guten zum Beitreten vorgeschlagen", + "This room is suggested as a good one to join": "Dieser Raum wurde als gut zum Beitreten vorgeschlagen", "Your message wasn't sent because this homeserver has been blocked by it's administrator. Please contact your service administrator to continue using the service.": "Deine Nachricht wurde nicht versendet, weil dieser Heimserver von dessen Administrator gesperrt wurde. Bitte kontaktiere deinen Dienstadministrator um den Dienst weiterzunutzen.", "Verification requested": "Verifizierung angefragt", "Avatar": "Avatar", From 4929247a5eb21cf437253c0c8513c7019648c6e9 Mon Sep 17 00:00:00 2001 From: Sven Grewe Date: Fri, 16 Apr 2021 14:19:37 +0000 Subject: [PATCH 138/154] Translated using Weblate (German) Currently translated at 98.5% (2875 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index bfb226aa3c..9551f00e55 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1424,7 +1424,7 @@ "Cancel entering passphrase?": "Eingabe der Passphrase abbrechen?", "Setting up keys": "Einrichten der Schlüssel", "Encryption upgrade available": "Verschlüsselungsaufstufung verfügbar", - "Verifies a user, session, and pubkey tuple": "Verifiziert einen Benutzer, eine Sitzung und die Endlichkeit eines öffentlichen Schlüssels", + "Verifies a user, session, and pubkey tuple": "Verifiziert einen Benutzer, eine Sitzung und die öffentlichen Schlüsselpaare", "Unknown (user, session) pair:": "Unbekanntes Nutzer-/Sitzungspaar:", "Session already verified!": "Sitzung bereits verifiziert!", "WARNING: Session already verified, but keys do NOT MATCH!": "WARNUNG: Die Sitzung wurde bereits verifiziert, aber die Schlüssel passen NICHT ZUSAMMEN!", From 0eee2149662ef62b54cde30161ab73ba1f0bf53b Mon Sep 17 00:00:00 2001 From: MamasLT Date: Sun, 18 Apr 2021 17:04:04 +0000 Subject: [PATCH 139/154] Translated using Weblate (Lithuanian) Currently translated at 65.1% (1901 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/lt/ --- src/i18n/strings/lt.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index d700b5e800..83b59681e7 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -1184,7 +1184,7 @@ "Manage integrations": "Valdyti integracijas", "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Integracijų Tvarkytuvai gauna konfigūracijos duomenis ir jūsų vardu gali keisti valdiklius, siųsti kambario pakvietimus ir nustatyti galios lygius.", "Invalid theme schema.": "Klaidinga temos schema.", - "Error downloading theme information.": "Klaida parsisiunčiant temos informaciją.", + "Error downloading theme information.": "Klaida atsisiunčiant temos informaciją.", "Theme added!": "Tema pridėta!", "Custom theme URL": "Pasirinktinės temos URL", "Add theme": "Pridėti temą", @@ -2101,5 +2101,6 @@ "Preparing to download logs": "Ruošiamasi parsiųsti žurnalus", "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use Element with an existing Matrix account on a different homeserver.": "Jūs galite naudoti serverio parinktis, norėdami prisijungti prie kitų Matrix serverių, nurodydami kitą serverio URL. Tai leidžia jums naudoti Element su egzistuojančia paskyra kitame serveryje.", "Server Options": "Serverio Parinktys", - "Your homeserver": "Jūsų serveris" + "Your homeserver": "Jūsų serveris", + "Download logs": "Parsisiųsti žurnalus" } From d0df0e9099e41cfa021ae5481809ba435b935bff Mon Sep 17 00:00:00 2001 From: Imre Kristoffer Eilertsen Date: Sun, 18 Apr 2021 10:39:37 +0000 Subject: [PATCH 140/154] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 63.0% (1839 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nb_NO/ --- src/i18n/strings/nb_NO.json | 429 +++++++++++++++++++++++++++++++++++- 1 file changed, 428 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index 9253f74fab..d3be9cd2ea 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -1554,5 +1554,432 @@ "Click the button below to confirm adding this phone number.": "Klikk knappen nedenfor for å bekrefte dette telefonnummeret.", "Single Sign On": "Single Sign On", "Confirm adding this phone number by using Single Sign On to prove your identity.": "Bekreft dette telefonnummeret ved å bruke Single Sign On for å bevise din identitet.", - "Confirm adding this email address by using Single Sign On to prove your identity.": "Befrekt denne e-postadressen ved å bruke Single Sign On for å bevise din identitet." + "Confirm adding this email address by using Single Sign On to prove your identity.": "Befrekt denne e-postadressen ved å bruke Single Sign On for å bevise din identitet.", + "Show stickers button": "Vis klistremerkeknappen", + "Recently visited rooms": "Nylig besøkte rom", + "Windows": "Vinduer", + "Abort": "Avbryt", + "You have unverified logins": "Du har uverifiserte pålogginger", + "Check your devices": "Sjekk enhetene dine", + "Record a voice message": "Send en stemmebeskjed", + "Edit devices": "Rediger enheter", + "Homeserver": "Hjemmetjener", + "Edit Values": "Rediger verdier", + "Add existing room": "Legg til et eksisterende rom", + "Spell check dictionaries": "Stavesjekk-ordbøker", + "Invite to this space": "Inviter til dette området", + "Send message": "Send melding", + "Cookie Policy": "Infokapselretningslinjer", + "Invite to %(roomName)s": "Inviter til %(roomName)s", + "Resume": "Fortsett", + "Avatar": "Profilbilde", + "A confirmation email has been sent to %(emailAddress)s": "En bekreftelses-E-post har blitt sendt til %(emailAddress)s", + "Suggested Rooms": "Foreslåtte rom", + "Welcome %(name)s": "Velkommen, %(name)s", + "Upgrade to %(hostSignupBrand)s": "Oppgrader til %(hostSignupBrand)s", + "Verification requested": "Verifisering ble forespurt", + "%(count)s members|one": "%(count)s medlem", + "Removing...": "Fjerner …", + "No results found": "Ingen resultater ble funnet", + "Public space": "Offentlig område", + "Private space": "Privat område", + "Support": "Support", + "What projects are you working on?": "Hvilke prosjekter jobber du på?", + "Suggested": "Anbefalte", + "%(deviceId)s from %(ip)s": "%(deviceId)s fra %(ip)s", + "Accept on your other login…": "Aksepter på din andre pålogging …", + "Value:": "Verdi:", + "Leave Space": "Forlat området", + "View dev tools": "Vis utviklerverktøy", + "Saving...": "Lagrer …", + "Save Changes": "Lagre endringer", + "Verify other login": "Verifiser en annen pålogging", + "You don't have permission": "Du har ikke tillatelse", + "%(count)s rooms|other": "%(count)s rom", + "%(count)s rooms|one": "%(count)s rom", + "Invite by username": "Inviter etter brukernavn", + "Delete": "Slett", + "Your public space": "Ditt offentlige område", + "Your private space": "Ditt private område", + "Invite to %(spaceName)s": "Inviter til %(spaceName)s", + "%(count)s members|other": "%(count)s medlemmer", + "Random": "Tilfeldig", + "unknown person": "ukjent person", + "Public": "Offentlig", + "Private": "Privat", + "Click to copy": "Klikk for å kopiere", + "Share invite link": "Del invitasjonslenke", + "Leave space": "Forlat området", + "Warn before quitting": "Advar før avslutning", + "Quick actions": "Hurtigvalg", + "Screens": "Skjermer", + "%(count)s people you know have already joined|other": "%(count)s personer du kjenner har allerede blitt med", + "Add existing rooms": "Legg til eksisterende rom", + "Don't want to add an existing room?": "Vil du ikke legge til et eksisterende rom?", + "Create a new room": "Opprett et nytt rom", + "Adding...": "Legger til …", + "Settings Explorer": "Innstillingsutforsker", + "Value": "Verdi", + "Setting:": "Innstilling:", + "Caution:": "Advarsel:", + "Level": "Nivå", + "Privacy Policy": "Personvern", + "You should know": "Du bør vite", + "Room name": "Rommets navn", + "Skip for now": "Hopp over for nå", + "Creating rooms...": "Oppretter rom …", + "Share %(name)s": "Del %(name)s", + "Just me": "Bare meg selv", + "Inviting...": "Inviterer …", + "Please choose a strong password": "Vennligst velg et sterkt passord", + "New? Create account": "Er du ny her? Opprett en konto", + "Use another login": "Bruk en annen pålogging", + "Use Security Key or Phrase": "Bruk sikkerhetsnøkkel eller -frase", + "Use Security Key": "Bruk sikkerhetsnøkkel", + "Upgrade private room": "Oppgrader privat rom", + "Upgrade public room": "Oppgrader offentlig rom", + "Decline All": "Avslå alle", + "Enter Security Key": "Skriv inn sikkerhetsnøkkel", + "Germany": "Tyskland", + "Malta": "Malta", + "Uruguay": "Uruguay", + "Community settings": "Fellesskapsinnstillinger", + "You’re all caught up": "Du har lest deg opp på alt det nye", + "Remember this": "Husk dette", + "Move right": "Gå til høyre", + "Notify the whole room": "Varsle hele rommet", + "Got an account? Sign in": "Har du en konto? Logg på", + "You created this room.": "Du opprettet dette rommet.", + "Security Phrase": "Sikkerhetsfrase", + "Start a Conversation": "Start en samtale", + "Open dial pad": "Åpne nummerpanelet", + "Message deleted on %(date)s": "Meldingen ble slettet den %(date)s", + "Approve": "Godkjenn", + "Create community": "Opprett fellesskap", + "Already have an account? Sign in here": "Har du allerede en konto? Logg på", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s eller %(usernamePassword)s", + "That username already exists, please try another.": "Det brukernavnet finnes allerede, vennligst prøv et annet et", + "New here? Create an account": "Er du ny her? Opprett en konto", + "Now, let's help you get started": "Nå, la oss hjelpe deg med å komme i gang", + "Forgot password?": "Glemt passord?", + "Enter email address": "Legg inn e-postadresse", + "Enter phone number": "Skriv inn telefonnummer", + "Please enter the code it contains:": "Vennligst skriv inn koden den inneholder:", + "Token incorrect": "Sjetongen er feil", + "A text message has been sent to %(msisdn)s": "En SMS har blitt sendt til %(msisdn)s", + "Open the link in the email to continue registration.": "Åpne lenken i E-posten for å fortsette registreringen.", + "This room is public": "Dette rommet er offentlig", + "Move left": "Gå til venstre", + "Take a picture": "Ta et bilde", + "Hold": "Hold", + "Enter Security Phrase": "Skriv inn sikkerhetsfrase", + "Security Key": "Sikkerhetsnøkkel", + "Invalid Security Key": "Ugyldig sikkerhetsnøkkel", + "Wrong Security Key": "Feil sikkerhetsnøkkel", + "About homeservers": "Om hjemmetjenere", + "New Recovery Method": "Ny gjenopprettingsmetode", + "Generate a Security Key": "Generer en sikkerhetsnøkkel", + "Confirm your Security Phrase": "Bekreft sikkerhetsfrasen din", + "Your Security Key": "Sikkerhetsnøkkelen din", + "Repeat your Security Phrase...": "Gjenta sikkerhetsfrasen din", + "Set up with a Security Key": "Sett opp med en sikkerhetsnøkkel", + "Use app": "Bruk app", + "Learn more": "Lær mer", + "Use app for a better experience": "Bruk appen for en bedre opplevelse", + "Continue with %(provider)s": "Fortsett med %(provider)s", + "This address is already in use": "Denne adressen er allerede i bruk", + "In reply to ": "Som svar på ", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)sendret navnet sitt %(count)s ganger", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)sfikk sin invitasjon trukket tilbake", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)sfikk sine invitasjoner trukket tilbake", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)savslo invitasjonen sin", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)sforlot og ble med igjen", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)sforlot og ble med igjen", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)sble med og forlot igjen", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)sble med og forlot igjen", + "Information": "Informasjon", + "Add rooms to this community": "Legg til rom i dette fellesskapet", + "%(name)s cancelled verifying": "%(name)s avbrøt verifiseringen", + "You cancelled verifying %(name)s": "Du avbrøt verifiseringen av %(name)s", + "Invalid file%(extra)s": "Ugyldig fil%(extra)s", + "Failed to ban user": "Mislyktes i å bannlyse brukeren", + "Room settings": "Rominnstillinger", + "Show files": "Vis filer", + "Not encrypted": "Ikke kryptert", + "About": "Om", + "Widgets": "Komponenter", + "Room Info": "Rominfo", + "Favourited": "Favorittmerket", + "Forget Room": "Glem rommet", + "Show previews of messages": "Vis forhåndsvisninger av meldinger", + "Invalid URL": "Ugyldig URL", + "Continuing without email": "Fortsetter uten E-post", + "Are you sure you want to sign out?": "Er du sikker på at du vil logge av?", + "Transfer": "Overfør", + "Invite by email": "Inviter gjennom E-post", + "Waiting for partner to confirm...": "Venter på at partneren skal bekrefte …", + "Report a bug": "Rapporter en feil", + "Comment": "Kommentar", + "Add comment": "Legg til kommentar", + "Active Widgets": "Aktive moduler", + "Create a room in %(communityName)s": "Opprett et rom i %(communityName)s", + "Reason (optional)": "Årsak (valgfritt)", + "Send %(count)s invites|one": "Send %(count)s invitasjon", + "Send %(count)s invites|other": "Send %(count)s invitasjoner", + "Add another email": "Legg til en annen E-postadresse", + "%(count)s results|one": "%(count)s resultat", + "%(count)s results|other": "%(count)s resultater", + "Start a new chat": "Start en ny chat", + "Custom Tag": "Egendefinert merkelapp", + "Explore public rooms": "Utforsk offentlige rom", + "Explore community rooms": "Utforsk samfunnsrom", + "Invite to this community": "Inviter til dette fellesskapet", + "Verify the link in your inbox": "Verifiser lenken i innboksen din", + "Bridges": "Broer", + "Privacy": "Personvern", + "Reject all %(invitedRooms)s invites": "Avslå alle %(invitedRooms)s-invitasjoner", + "Upgrade Room Version": "Oppgrader romversjon", + "You cancelled verification.": "Du avbrøt verifiseringen.", + "Ask %(displayName)s to scan your code:": "Be %(displayName)s om å skanne koden:", + "Role": "Rolle", + "Failed to deactivate user": "Mislyktes i å deaktivere brukeren", + "Accept all %(invitedRooms)s invites": "Aksepter alle %(invitedRooms)s-invitasjoner", + "": "", + "Custom theme URL": "URL-en til et selvvalgt tema", + "not ready": "ikke klar", + "ready": "klar", + "Algorithm:": "Algoritme:", + "Backing up %(sessionsRemaining)s keys...": "Sikkerhetskopierer %(sessionsRemaining)s nøkler …", + "Away": "Borte", + "Start chat": "Start chat", + "Show Widgets": "Vis moduler", + "Hide Widgets": "Skjul moduler", + "Unknown for %(duration)s": "Ukjent i %(duration)s", + "Update %(brand)s": "Oppdater %(brand)s", + "You are currently ignoring:": "Du ignorerer for øyeblikket:", + "Unknown caller": "Ukjent oppringer", + "Dial pad": "Nummerpanel", + "%(name)s on hold": "%(name)s står på vent", + "Fill Screen": "Fyll skjermen", + "Voice Call": "Taleanrop", + "Video Call": "Videoanrop", + "sends confetti": "sender konfetti", + "System font name": "Systemskrifttypenavn", + "Use a system font": "Bruk en systemskrifttype", + "Waiting for answer": "Venter på svar", + "Call in progress": "Anrop pågår", + "Channel: ": "Kanal: ", + "Enable desktop notifications": "Aktiver skrivebordsvarsler", + "Don't miss a reply": "Ikke gå glipp av noen svar", + "Help us improve %(brand)s": "Hjelp oss å forbedre %(brand)s", + "Unknown App": "Ukjent app", + "Short keyboard patterns are easy to guess": "Korte tastatur mønstre er lett å gjette", + "This is similar to a commonly used password": "Dette ligner på et passord som er brukt mye", + "Predictable substitutions like '@' instead of 'a' don't help very much": "Forutsigbar erstatninger som ‘ @‘ istedet for ‘a’ hjelper ikke mye", + "Reversed words aren't much harder to guess": "Ord som er skrevet baklengs er vanskeligere å huske.", + "All-uppercase is almost as easy to guess as all-lowercase": "Bare store bokstaver er nesten like enkelt å gjette som bare små bokstaver", + "Capitalization doesn't help very much": "Store bokstaver er ikke spesielt nyttig", + "Use a longer keyboard pattern with more turns": "Bruke et lengre og mer uventet tastatur mønster", + "No need for symbols, digits, or uppercase letters": "Ikke nødvendig med symboler, sifre eller bokstaver", + "See images posted to this room": "Se bilder som er lagt ut i dette rommet", + "%(senderName)s declined the call.": "%(senderName)s avslo oppringingen.", + "(an error occurred)": "(en feil oppstod)", + "(connection failed)": "(tilkobling mislyktes)", + "Change the topic of this room": "Endre dette rommets tema", + "Effects": "Effekter", + "Zimbabwe": "Zimbabwe", + "Yemen": "Jemen", + "Zambia": "Zambia", + "Western Sahara": "Vest-Sahara", + "Wallis & Futuna": "Wallis og Futuna", + "Venezuela": "Venezuela", + "Vietnam": "Vietnam", + "Vatican City": "Vatikanstaten", + "Vanuatu": "Vanuatu", + "Uzbekistan": "Usbekistan", + "United Arab Emirates": "De forente arabiske emirater", + "Ukraine": "Ukraina", + "U.S. Virgin Islands": "De amerikanske jomfruøyene", + "Uganda": "Uganda", + "Tuvalu": "Tuvalu", + "Turks & Caicos Islands": "Turks- og Caicosøyene", + "Turkmenistan": "Turkmenistan", + "Tunisia": "Tunis", + "Turkey": "Tyrkia", + "Trinidad & Tobago": "Trinidad og Tobago", + "Tonga": "Tonga", + "Tokelau": "Tokelau", + "Togo": "Togo", + "Timor-Leste": "Timor-Leste", + "Thailand": "Thailand", + "Tanzania": "Tanzania", + "Tajikistan": "Tadsjikistan", + "Taiwan": "Taiwan", + "São Tomé & Príncipe": "São Tomé og Príncipe", + "Syria": "Syria", + "Sweden": "Sverige", + "Switzerland": "Sveits", + "Swaziland": "Swaziland", + "Svalbard & Jan Mayen": "Svalbard og Jan Mayen", + "Suriname": "Surinam", + "Sudan": "Sudan", + "St. Vincent & Grenadines": "St. Vincent og Grenadinene", + "St. Kitts & Nevis": "St. Kitts og Nevis", + "St. Helena": "St. Helena", + "Sri Lanka": "Sri Lanka", + "Spain": "Spania", + "South Sudan": "Sør-Sudan", + "South Korea": "Syd-Korea", + "Somalia": "Somalia", + "South Africa": "Sør-Afrika", + "Solomon Islands": "Solomonøyene", + "Slovenia": "Slovenia", + "Slovakia": "Slovakia", + "Sint Maarten": "Sint Maarten", + "Singapore": "Singapore", + "Sierra Leone": "Sierra Leone", + "Seychelles": "Seyschellene", + "Serbia": "Serbia", + "Saudi Arabia": "Saudi-Arabia", + "Senegal": "Senegal", + "San Marino": "San Marino", + "Samoa": "Samoa", + "Réunion": "Réunion", + "Rwanda": "Rwanda", + "Russia": "Russland", + "Qatar": "Qatar", + "Romania": "Romania", + "Puerto Rico": "Puerto Rico", + "Portugal": "Portugal", + "Poland": "Polen", + "Pitcairn Islands": "Pitcairn-øyene", + "Philippines": "Filippinene", + "Peru": "Peru", + "Papua New Guinea": "Papua New Guinea", + "Paraguay": "Paraguay", + "Panama": "Panama", + "Palestine": "Palestina", + "Pakistan": "Pakistan", + "Palau": "Palau", + "Oman": "Oman", + "Norway": "Norge", + "Northern Mariana Islands": "Northern Mariana Islands", + "North Korea": "Nord-Korea", + "Norfolk Island": "Norfolkøyene", + "Niue": "Niue", + "Nigeria": "Nigeria", + "Niger": "Niger", + "New Zealand": "New Zealand", + "Nicaragua": "Nicaragua", + "New Caledonia": "New Caledonia", + "Netherlands": "Nederland", + "Nepal": "Nepal", + "Nauru": "Nauru", + "Namibia": "Namibia", + "Myanmar": "Myanmar", + "Mozambique": "Mosambik", + "Morocco": "Marokko", + "Montenegro": "Montenegro", + "Montserrat": "Montserrat", + "Mongolia": "Mongolia", + "Monaco": "Monaco", + "Moldova": "Moldova", + "Micronesia": "Mikronesia", + "Mexico": "Mexico", + "Mayotte": "Mayotte", + "Mauritius": "Mauritius", + "Mauritania": "Mauretania", + "Martinique": "Martinique", + "Marshall Islands": "Marshall Islands", + "Maldives": "Maldivene", + "Mali": "Mali", + "Malaysia": "Malaysia", + "Malawi": "Malawi", + "Madagascar": "Madagaskar", + "Macedonia": "Nord-Makedonia", + "Macau": "Macau", + "Luxembourg": "Luxemburg", + "Lithuania": "Litauen", + "Liechtenstein": "Liechtenstein", + "Libya": "Libya", + "Liberia": "Liberia", + "Lesotho": "Lesotho", + "Lebanon": "Libanon", + "Latvia": "Latvia", + "Laos": "Laos", + "Kyrgyzstan": "Kirgistan", + "Kuwait": "Kuwait", + "Kosovo": "Kosovo", + "Kiribati": "Kiribati", + "Kazakhstan": "Kasakstan", + "Kenya": "Kenya", + "Jamaica": "Jamaica", + "Isle of Man": "Man", + "Iceland": "Island", + "Hungary": "Ungarn", + "Hong Kong": "Hong Kong", + "Honduras": "Honduras", + "Haiti": "Haiti", + "Guinea-Bissau": "Guinea-Bissau", + "Guyana": "Guyana", + "Guinea": "Guinea", + "Guernsey": "Guernsey", + "Guatemala": "Guatemala", + "Guam": "Guam", + "Guadeloupe": "Guadeloupe", + "Grenada": "Grenada", + "Greece": "Hellas", + "Greenland": "Grønland", + "Gibraltar": "Gibraltar", + "Ghana": "Ghana", + "Georgia": "Georgia", + "Gambia": "Gambia", + "Gabon": "Gabon", + "French Southern Territories": "De franske sørterritoriene", + "French Polynesia": "Fransk polynesia", + "French Guiana": "Fransk Guyana", + "France": "Frankrike", + "Finland": "Finnland", + "Fiji": "Fiji", + "Falkland Islands": "Falklandsøyene", + "Faroe Islands": "Færøyene", + "Ethiopia": "Etiopia", + "Estonia": "Estland", + "Eritrea": "Eritrea", + "Equatorial Guinea": "Ekvatorial-Guinea", + "El Salvador": "El Salvador", + "Egypt": "Egypt", + "Ecuador": "Ecuador", + "Dominican Republic": "Dominikanske republikk", + "Djibouti": "Djibouti", + "Dominica": "Dominica", + "Denmark": "Danmark", + "Côte d’Ivoire": "Elfenbenskysten", + "Czech Republic": "Tsjekkia", + "Cyprus": "Kypros", + "Curaçao": "Curaçao", + "Cuba": "Kuba", + "Colombia": "Colombia", + "Comoros": "Komorene", + "Cocos (Keeling) Islands": "Cocos- (Keeling) øyene", + "Christmas Island": "Juløya", + "China": "Kina", + "Chad": "Tsjad", + "Chile": "Chile", + "Central African Republic": "Sentralafrikanske republikk", + "Cayman Islands": "Caymanøyene", + "Caribbean Netherlands": "Karibisk Nederland", + "Cape Verde": "Kapp Verde", + "Canada": "Canada", + "Cameroon": "Kamerun", + "Cambodia": "Kambodsja", + "British Virgin Islands": "De britiske jomfruøyer", + "British Indian Ocean Territory": "Britiske havområder i det indiske hav", + "Bouvet Island": "Bouvetøya", + "Bosnia": "Bosnia", + "Croatia": "Kroatia", + "Costa Rica": "Costa Rica", + "Cook Islands": "Cook-øyene", + "All keys backed up": "Alle nøkler er sikkerhetskopiert", + "Secret storage:": "Hemmelig lagring:" } From 8e2afcb5c20deec7803bfe09326302c7befcc7cf Mon Sep 17 00:00:00 2001 From: iaiz Date: Fri, 16 Apr 2021 09:56:09 +0000 Subject: [PATCH 141/154] Translated using Weblate (Spanish) Currently translated at 100.0% (2916 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/es/ --- src/i18n/strings/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 785ac28f37..d396cc318f 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -3224,5 +3224,6 @@ "Please choose a strong password": "Por favor, elige una contraseña segura", "Use another login": "Usar otro inicio de sesión", "Verify your identity to access encrypted messages and prove your identity to others.": "Verifica tu identidad para acceder a mensajes cifrados y probar tu identidad a otros.", - "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Si no verificas no tendrás acceso a todos tus mensajes y puede que aparezcas como no confiable para otros usuarios." + "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Si no verificas no tendrás acceso a todos tus mensajes y puede que aparezcas como no confiable para otros usuarios.", + "Invite messages are hidden by default. Click to show the message.": "Los mensajes de invitación no se muestran por defecto. Haz clic para mostrarlo." } From b3168e479e2a21ad4e973ce41b2cf9756e930ceb Mon Sep 17 00:00:00 2001 From: Sagititi Date: Fri, 16 Apr 2021 16:43:26 +0000 Subject: [PATCH 142/154] Translated using Weblate (Occitan) Currently translated at 11.3% (331 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/oc/ --- src/i18n/strings/oc.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/oc.json b/src/i18n/strings/oc.json index 1fcea5a976..d882b04ac9 100644 --- a/src/i18n/strings/oc.json +++ b/src/i18n/strings/oc.json @@ -340,5 +340,11 @@ "Space": "Espaci", "End": "Fin", "Explore rooms": "Percórrer las salas", - "Create Account": "Crear un compte" + "Create Account": "Crear un compte", + "Click the button below to confirm adding this email address.": "Clicatz sus lo boton aicí dejós per confirmar l'adicion de l'adreça e-mail.", + "Confirm adding email": "Confirmar l'adicion de l'adressa e-mail", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Confirmatz l'adicion d'aquela adreça e-mail en utilizant l'autentificacion unica per provar la vòstra identitat.", + "Use Single Sign On to continue": "Utilizar l'autentificacion unica (SSO) per contunhar", + "This phone number is already in use": "Aquel numèro de telefòn es ja utilizat", + "This email address is already in use": "Aquela adreça e-mail es ja utilizada" } From 08c0f0a67ef2068b64f0028279be7a53d4d82a50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 20 Apr 2021 12:18:46 +0200 Subject: [PATCH 143/154] Remove unnecessary check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 3585c803c1..ce174d9538 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -513,9 +513,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { // persist last viewed room from a space - // We don't want to save if the room is a - // space room since it can cause problems - if (room && !room.isSpaceRoom()) { + if (room) { const activeSpaceId = this.activeSpace?.roomId || LAST_VIEWED_ROOMS_HOME; window.localStorage.setItem(`${LAST_VIEWED_ROOMS}_${activeSpaceId}`, payload.room_id); } From f9292c364caa2570b351939017f495dc820d43d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 20 Apr 2021 12:25:56 +0200 Subject: [PATCH 144/154] Check if we are joined MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index ce174d9538..615007af20 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -118,7 +118,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { const spaceId = space?.roomId || LAST_VIEWED_ROOMS_HOME; const roomId = window.localStorage.getItem(`${LAST_VIEWED_ROOMS}_${spaceId}`); - if (roomId) { + if (roomId && this.matrixClient.getRoom(roomId).getMyMembership() === "join") { defaultDispatcher.dispatch({ action: "view_room", room_id: roomId, From 1934c4a32f5d9cd9828d36e75fd8dd0900caea59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 20 Apr 2021 12:39:11 +0200 Subject: [PATCH 145/154] Add getLastViewedRoomsStorageKey() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 615007af20..a7efbafd1e 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -41,7 +41,7 @@ type SpaceKey = string | symbol; interface IState {} const ACTIVE_SPACE_LS_KEY = "mx_active_space"; -const LAST_VIEWED_ROOMS = "mx_last_viewed_rooms"; + const LAST_VIEWED_ROOMS_HOME = "home_space"; @@ -54,6 +54,11 @@ export const UPDATE_SELECTED_SPACE = Symbol("selected-space"); const MAX_SUGGESTED_ROOMS = 20; +const getLastViewedRoomsStorageKey = (spaceId?) => { + if (!spaceId) return null; + return `mx_last_viewed_rooms_${spaceId}`; +} + const partitionSpacesAndRooms = (arr: Room[]): [Room[], Room[]] => { // [spaces, rooms] return arr.reduce((result, room: Room) => { result[room.isSpaceRoom() ? 0 : 1].push(room); @@ -116,7 +121,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { // view last selected room from space const spaceId = space?.roomId || LAST_VIEWED_ROOMS_HOME; - const roomId = window.localStorage.getItem(`${LAST_VIEWED_ROOMS}_${spaceId}`); + const roomId = window.localStorage.getItem(getLastViewedRoomsStorageKey(spaceId)); if (roomId && this.matrixClient.getRoom(roomId).getMyMembership() === "join") { defaultDispatcher.dispatch({ @@ -515,7 +520,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { if (room) { const activeSpaceId = this.activeSpace?.roomId || LAST_VIEWED_ROOMS_HOME; - window.localStorage.setItem(`${LAST_VIEWED_ROOMS}_${activeSpaceId}`, payload.room_id); + window.localStorage.setItem(getLastViewedRoomsStorageKey(activeSpaceId), payload.room_id); } if (room?.getMyMembership() === "join") { From d4ca087c2eb6fe342a89cdb7ed7491edb2f7dd25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 20 Apr 2021 13:24:23 +0200 Subject: [PATCH 146/154] Make getLastViewedRoomsStorageKey() make sense MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index a7efbafd1e..eeecbbeba1 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -42,9 +42,6 @@ interface IState {} const ACTIVE_SPACE_LS_KEY = "mx_active_space"; - -const LAST_VIEWED_ROOMS_HOME = "home_space"; - export const HOME_SPACE = Symbol("home-space"); export const SUGGESTED_ROOMS = Symbol("suggested-rooms"); @@ -54,9 +51,10 @@ export const UPDATE_SELECTED_SPACE = Symbol("selected-space"); const MAX_SUGGESTED_ROOMS = 20; -const getLastViewedRoomsStorageKey = (spaceId?) => { - if (!spaceId) return null; - return `mx_last_viewed_rooms_${spaceId}`; +const getLastViewedRoomsStorageKey = (space?: Room) => { + const lastViewRooms = "mx_last_viewed_rooms"; + const homeSpace = "home_space"; + return `${lastViewRooms}_${space?.roomId || homeSpace}`; } const partitionSpacesAndRooms = (arr: Room[]): [Room[], Room[]] => { // [spaces, rooms] @@ -120,8 +118,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { this.emit(SUGGESTED_ROOMS, this._suggestedRooms = []); // view last selected room from space - const spaceId = space?.roomId || LAST_VIEWED_ROOMS_HOME; - const roomId = window.localStorage.getItem(getLastViewedRoomsStorageKey(spaceId)); + const roomId = window.localStorage.getItem(getLastViewedRoomsStorageKey(this.activeSpace)); if (roomId && this.matrixClient.getRoom(roomId).getMyMembership() === "join") { defaultDispatcher.dispatch({ @@ -517,10 +514,8 @@ export class SpaceStoreClass extends AsyncStoreWithClient { const room = this.matrixClient?.getRoom(payload.room_id); // persist last viewed room from a space - if (room) { - const activeSpaceId = this.activeSpace?.roomId || LAST_VIEWED_ROOMS_HOME; - window.localStorage.setItem(getLastViewedRoomsStorageKey(activeSpaceId), payload.room_id); + window.localStorage.setItem(getLastViewedRoomsStorageKey(this.activeSpace), payload.room_id); } if (room?.getMyMembership() === "join") { From 4344ff909714d6550f38acd28af253bcccef777f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 20 Apr 2021 13:31:50 +0200 Subject: [PATCH 147/154] Update src/stores/SpaceStore.tsx Co-authored-by: Michael Telatynski <7t3chguy@googlemail.com> --- src/stores/SpaceStore.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index eeecbbeba1..290caba9d4 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -120,7 +120,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { // view last selected room from space const roomId = window.localStorage.getItem(getLastViewedRoomsStorageKey(this.activeSpace)); - if (roomId && this.matrixClient.getRoom(roomId).getMyMembership() === "join") { + if (roomId && this.matrixClient?.getRoom(roomId)?.getMyMembership() === "join") { defaultDispatcher.dispatch({ action: "view_room", room_id: roomId, From ace8d59a2af11c8dcd78d1c0a63a292ee4e9124e Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 20 Apr 2021 13:12:28 +0100 Subject: [PATCH 148/154] Fix Spaces NPE when a room with no tags gains its first tag --- src/stores/SpaceStore.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 290caba9d4..63a95d90c7 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -446,11 +446,11 @@ export class SpaceStoreClass extends AsyncStoreWithClient { } }; - private onRoomAccountData = (ev: MatrixEvent, room: Room, lastEvent: MatrixEvent) => { + private onRoomAccountData = (ev: MatrixEvent, room: Room, lastEvent?: MatrixEvent) => { if (ev.getType() === EventType.Tag && !room.isSpaceRoom()) { // If the room was in favourites and now isn't or the opposite then update its position in the trees - const oldTags = lastEvent.getContent()?.tags; - const newTags = ev.getContent()?.tags; + const oldTags = lastEvent?.getContent()?.tags || {}; + const newTags = ev.getContent()?.tags || {}; if (!!oldTags[DefaultTagID.Favourite] !== !!newTags[DefaultTagID.Favourite]) { this.onRoomUpdate(room); } From 3adb2635bac73810ae27eaf8bfbd586ab0ceb725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 20 Apr 2021 15:40:32 +0200 Subject: [PATCH 149/154] Revert "Remove unnecessary check" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 08c0f0a67ef2068b64f0028279be7a53d4d82a50. Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 290caba9d4..e9be7c1e5e 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -514,7 +514,7 @@ export class SpaceStoreClass extends AsyncStoreWithClient { const room = this.matrixClient?.getRoom(payload.room_id); // persist last viewed room from a space - if (room) { + if (room && !room.isSpaceRoom()) { window.localStorage.setItem(getLastViewedRoomsStorageKey(this.activeSpace), payload.room_id); } From 9b81f5b4a034c3f791f7083bb0607e4ca7b9ab10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 20 Apr 2021 16:11:34 +0200 Subject: [PATCH 150/154] Add a comment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/stores/SpaceStore.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index e9be7c1e5e..dc0c691505 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -514,6 +514,12 @@ export class SpaceStoreClass extends AsyncStoreWithClient { const room = this.matrixClient?.getRoom(payload.room_id); // persist last viewed room from a space + + // Don't save if the room is a space room. This would cause a problem: + // When switching to a space home, we first view that room and + // only after that we switch to that space. This causes us to + // save the space home to be the last viewed room in the home + // space. if (room && !room.isSpaceRoom()) { window.localStorage.setItem(getLastViewedRoomsStorageKey(this.activeSpace), payload.room_id); } From 1507f64f2bf954260460ee6ac518dc13537b5dc4 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 21 Apr 2021 08:52:56 +0100 Subject: [PATCH 151/154] Fix spaces filtering sometimes lagging behind or behaving oddly --- src/stores/room-list/filters/SpaceFilterCondition.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/stores/room-list/filters/SpaceFilterCondition.ts b/src/stores/room-list/filters/SpaceFilterCondition.ts index ad0ab88868..43bdcb3879 100644 --- a/src/stores/room-list/filters/SpaceFilterCondition.ts +++ b/src/stores/room-list/filters/SpaceFilterCondition.ts @@ -42,10 +42,16 @@ export class SpaceFilterCondition extends EventEmitter implements IFilterConditi private onStoreUpdate = async (): Promise => { const beforeRoomIds = this.roomIds; - this.roomIds = SpaceStore.instance.getSpaceFilteredRoomIds(this.space); + // clone the set as it may be mutated by the space store internally + this.roomIds = new Set(SpaceStore.instance.getSpaceFilteredRoomIds(this.space)); if (setHasDiff(beforeRoomIds, this.roomIds)) { this.emit(FILTER_CHANGED); + // XXX: Room List Store has a bug where updates to the pre-filter during a local echo of a + // tags transition seem to be ignored, so refire in the next tick to work around it + setImmediate(() => { + this.emit(FILTER_CHANGED); + }); } }; From ecd9b8d6deb03bd1b9ed2e6863e2bdc5b82f0b4b Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Wed, 21 Apr 2021 09:01:22 +0100 Subject: [PATCH 152/154] Fix issue with spaces context switching looping and breaking --- src/stores/SpaceStore.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/stores/SpaceStore.tsx b/src/stores/SpaceStore.tsx index 290caba9d4..6ec60600a0 100644 --- a/src/stores/SpaceStore.tsx +++ b/src/stores/SpaceStore.tsx @@ -124,11 +124,13 @@ export class SpaceStoreClass extends AsyncStoreWithClient { defaultDispatcher.dispatch({ action: "view_room", room_id: roomId, + context_switch: true, }); } else if (space) { defaultDispatcher.dispatch({ action: "view_room", room_id: space.roomId, + context_switch: true, }); } else { defaultDispatcher.dispatch({ @@ -513,6 +515,10 @@ export class SpaceStoreClass extends AsyncStoreWithClient { case "view_room": { const room = this.matrixClient?.getRoom(payload.room_id); + // Don't auto-switch rooms when reacting to a context-switch + // as this is not helpful and can create loops of rooms/space switching + if (payload.context_switch) break; + // persist last viewed room from a space if (room) { window.localStorage.setItem(getLastViewedRoomsStorageKey(this.activeSpace), payload.room_id); From c5a1bb2d2ce91b416e504ceb37a8e2a2a9f4c766 Mon Sep 17 00:00:00 2001 From: Germain Souquet Date: Wed, 21 Apr 2021 10:44:20 +0100 Subject: [PATCH 153/154] fix sticky tags header in room list --- res/css/views/rooms/_RoomSublist.scss | 4 +++- src/components/structures/LeftPanel.tsx | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/res/css/views/rooms/_RoomSublist.scss b/res/css/views/rooms/_RoomSublist.scss index a0a40c0239..9d52e40819 100644 --- a/res/css/views/rooms/_RoomSublist.scss +++ b/res/css/views/rooms/_RoomSublist.scss @@ -41,7 +41,9 @@ limitations under the License. // The combined height must be set in the LeftPanel component for sticky headers // to work correctly. padding-bottom: 8px; - height: 24px; + // Allow the container to collapse on itself if its children + // are not in the normal document flow + max-height: 24px; color: $roomlist-header-color; .mx_RoomSublist_stickable { diff --git a/src/components/structures/LeftPanel.tsx b/src/components/structures/LeftPanel.tsx index cbfc7b476b..e4762e35ad 100644 --- a/src/components/structures/LeftPanel.tsx +++ b/src/components/structures/LeftPanel.tsx @@ -154,7 +154,7 @@ export default class LeftPanel extends React.Component { private doStickyHeaders(list: HTMLDivElement) { const topEdge = list.scrollTop; const bottomEdge = list.offsetHeight + list.scrollTop; - const sublists = list.querySelectorAll(".mx_RoomSublist"); + const sublists = list.querySelectorAll(".mx_RoomSublist:not(.mx_RoomSublist_hidden)"); const headerRightMargin = 15; // calculated from margins and widths to align with non-sticky tiles const headerStickyWidth = list.clientWidth - headerRightMargin; From 8e0b514dc64c5411a015961a4d59a730da727f55 Mon Sep 17 00:00:00 2001 From: Andrejs Date: Tue, 20 Apr 2021 10:54:53 +0000 Subject: [PATCH 154/154] Translated using Weblate (Latvian) Currently translated at 50.9% (1485 of 2916 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/lv/ --- src/i18n/strings/lv.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index da167399d4..ed7da7dc6b 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -300,7 +300,7 @@ "You need to be logged in.": "Tev ir jāpierakstās.", "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "Jūsu epasta adrese nav piesaistīta nevienam Matrix ID šajā bāzes serverī.", "You seem to be in a call, are you sure you want to quit?": "Izskatās, ka atrodies zvana režīmā. Vai tiešām vēlies iziet?", - "You seem to be uploading files, are you sure you want to quit?": "Izskatās, ka šobrīd augšuplādē failus. Vai tiešām vēlies iziet?", + "You seem to be uploading files, are you sure you want to quit?": "Izskatās, ka šobrīd notiek failu augšupielāde. Vai tiešām vēlaties iziet?", "Sun": "Sv.", "Mon": "P.", "Tue": "O.", @@ -747,7 +747,7 @@ "Unhide Preview": "Rādīt priekšskatījumu", "Unable to join network": "Neizdodas pievienoties tīklam", "Sorry, your browser is not able to run %(brand)s.": "Atvaino, diemžēl tavs tīmekļa pārlūks nespēj darbināt %(brand)s.", - "Uploaded on %(date)s by %(user)s": "Augšuplādēja %(user)s %(date)s", + "Uploaded on %(date)s by %(user)s": "Augšupielādēja %(user)s %(date)s", "Messages in group chats": "Ziņas grupas čatos", "Yesterday": "Vakardien", "Error encountered (%(errorDetail)s).": "Gadījās kļūda (%(errorDetail)s).", @@ -1578,5 +1578,8 @@ "Send a reply…": "Nosūtīt atbildi…", "Room version": "Istabas versija", "Room list": "Istabu saraksts", - "Failed to set topic": "Neizdevās iestatīt tematu" + "Failed to set topic": "Neizdevās iestatīt tematu", + "Upload files": "Failu augšupielāde", + "These files are too large to upload. The file size limit is %(limit)s.": "Šie faili pārsniedz augšupielādes izmēra limitu %(limit)s.", + "Upload files (%(current)s of %(total)s)": "Failu augšupielāde (%(current)s no %(total)s)" }