From d8e22f91671ccb0445cbd499b2474504629489b8 Mon Sep 17 00:00:00 2001 From: Ayush Kumar <2580ayush2580@gmail.com> Date: Tue, 19 Jan 2021 19:41:18 +0530 Subject: [PATCH 001/256] Improve room directory UX for mobile devices --- res/css/structures/_RoomDirectory.scss | 37 ++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/res/css/structures/_RoomDirectory.scss b/res/css/structures/_RoomDirectory.scss index 29e6fecd34..a683c1d8f7 100644 --- a/res/css/structures/_RoomDirectory.scss +++ b/res/css/structures/_RoomDirectory.scss @@ -161,3 +161,40 @@ limitations under the License. padding: 0; } } + +@media screen and (max-width: 600px) { + .mx_RoomDirectory_table tr { + margin-bottom: 15px !important; + } + + .mx_RoomDirectory_roomMemberCount { + padding: 0px; + } + + .mx_AccessibleButton_kind_secondary { + padding: 0px !important; + } + + .mx_RoomDirectory_join { + margin-left: 0px; + } + + .mx_RoomDirectory_alias { + margin-top: 10px; + margin-bottom: 10px; + } + + .mx_RoomDirectory_roomDescription { + padding-bottom: 0px; + } + + .mx_RoomDirectory_name { + margin-bottom: 5px; + } + + .mx_RoomDirectory_table tr td { + margin-top: 5px !important; + display: block; + text-align: left; + } +} \ No newline at end of file From 498bcafd88344389e46927318ff17d263072e716 Mon Sep 17 00:00:00 2001 From: Ayush Kumar <2580ayush2580@gmail.com> Date: Tue, 19 Jan 2021 20:45:25 +0530 Subject: [PATCH 002/256] removed style-link error --- res/css/structures/_RoomDirectory.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/structures/_RoomDirectory.scss b/res/css/structures/_RoomDirectory.scss index a683c1d8f7..c7a660da43 100644 --- a/res/css/structures/_RoomDirectory.scss +++ b/res/css/structures/_RoomDirectory.scss @@ -197,4 +197,4 @@ limitations under the License. display: block; text-align: left; } -} \ No newline at end of file +} From fec375a40e5a245f56a74f229ed00dbe0fbe1e14 Mon Sep 17 00:00:00 2001 From: Ayush Kumar <2580ayush2580@gmail.com> Date: Sun, 28 Feb 2021 11:28:16 +0530 Subject: [PATCH 003/256] fix width of grid --- res/css/structures/_RoomDirectory.scss | 38 +------------------------- 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/res/css/structures/_RoomDirectory.scss b/res/css/structures/_RoomDirectory.scss index 48c03a5f96..59383605aa 100644 --- a/res/css/structures/_RoomDirectory.scss +++ b/res/css/structures/_RoomDirectory.scss @@ -71,6 +71,7 @@ limitations under the License. row-gap: 24px; text-align: left; width: 100%; + min-width: 400px; } .mx_RoomDirectory_roomAvatar { @@ -155,40 +156,3 @@ limitations under the License. padding: 0; } } - -@media screen and (max-width: 600px) { - .mx_RoomDirectory_table tr { - margin-bottom: 15px !important; - } - - .mx_RoomDirectory_roomMemberCount { - padding: 0px; - } - - .mx_AccessibleButton_kind_secondary { - padding: 0px !important; - } - - .mx_RoomDirectory_join { - margin-left: 0px; - } - - .mx_RoomDirectory_alias { - margin-top: 10px; - margin-bottom: 10px; - } - - .mx_RoomDirectory_roomDescription { - padding-bottom: 0px; - } - - .mx_RoomDirectory_name { - margin-bottom: 5px; - } - - .mx_RoomDirectory_table tr td { - margin-top: 5px !important; - display: block; - text-align: left; - } -} From c883bd0cbf57c4a0bb8812e0303edb0ef54c2aaf Mon Sep 17 00:00:00 2001 From: Ayush Kumar <2580ayush2580@gmail.com> Date: Wed, 10 Mar 2021 15:00:53 +0530 Subject: [PATCH 004/256] Fix _RoomDirectory.scss for mobile screen --- res/css/structures/_RoomDirectory.scss | 38 +++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/res/css/structures/_RoomDirectory.scss b/res/css/structures/_RoomDirectory.scss index 59383605aa..8c5c343a20 100644 --- a/res/css/structures/_RoomDirectory.scss +++ b/res/css/structures/_RoomDirectory.scss @@ -71,7 +71,6 @@ limitations under the License. row-gap: 24px; text-align: left; width: 100%; - min-width: 400px; } .mx_RoomDirectory_roomAvatar { @@ -156,3 +155,40 @@ limitations under the License. padding: 0; } } + +@media screen and (max-width: 700px) { + .mx_RoomDirectory_roomMemberCount { + padding: 0px; + } + + .mx_AccessibleButton_kind_secondary { + padding: 0px !important; + } + + .mx_RoomDirectory_join { + margin-left: 0px; + } + + .mx_RoomDirectory_alias { + margin-top: 10px; + margin-bottom: 10px; + } + + .mx_RoomDirectory_roomDescription { + padding-bottom: 0px; + } + + .mx_RoomDirectory_name { + margin-bottom: 5px; + } + + .mx_RoomDirectory_roomAvatar{ + margin-top: 10px; + } + + .mx_RoomDirectory_table { + grid-template-columns: auto; + row-gap: 14px; + margin-top: 5px; + } +} \ No newline at end of file From 35e04645364d3e68dde4ebb0e93120e3cdda6977 Mon Sep 17 00:00:00 2001 From: Ayush Kumar <2580ayush2580@gmail.com> Date: Wed, 10 Mar 2021 15:12:00 +0530 Subject: [PATCH 005/256] Fix Style-lint error --- res/css/structures/_RoomDirectory.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/structures/_RoomDirectory.scss b/res/css/structures/_RoomDirectory.scss index 8c5c343a20..09e978b9e1 100644 --- a/res/css/structures/_RoomDirectory.scss +++ b/res/css/structures/_RoomDirectory.scss @@ -191,4 +191,4 @@ limitations under the License. row-gap: 14px; margin-top: 5px; } -} \ No newline at end of file +} From 54bbc2c2b1309a869d94ea661c6fb4e7149dbcc6 Mon Sep 17 00:00:00 2001 From: Ayush Kumar <2580ayush2580@gmail.com> Date: Wed, 10 Mar 2021 15:23:29 +0530 Subject: [PATCH 006/256] Fix Style-lint error --- res/css/structures/_RoomDirectory.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/structures/_RoomDirectory.scss b/res/css/structures/_RoomDirectory.scss index 09e978b9e1..15b5297d62 100644 --- a/res/css/structures/_RoomDirectory.scss +++ b/res/css/structures/_RoomDirectory.scss @@ -182,7 +182,7 @@ limitations under the License. margin-bottom: 5px; } - .mx_RoomDirectory_roomAvatar{ + .mx_RoomDirectory_roomAvatar { margin-top: 10px; } From 2529b88bf61f6169634b92911a185be10a4b96bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 22 Jul 2021 21:24:24 +0200 Subject: [PATCH 007/256] Give lightbox a background load animation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/_common.scss | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/res/css/_common.scss b/res/css/_common.scss index b128a82442..066bbea510 100644 --- a/res/css/_common.scss +++ b/res/css/_common.scss @@ -315,9 +315,20 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { opacity: 0.4; } +@keyframes mx_Dialog_lightbox_background_keyframes { + from { + opacity: 0; + } + to { + opacity: $lightbox-background-bg-opacity; + } +} + .mx_Dialog_lightbox .mx_Dialog_background { opacity: $lightbox-background-bg-opacity; background-color: $lightbox-background-bg-color; + animation-name: mx_Dialog_lightbox_background_keyframes; + animation-duration: 0.25s; } .mx_Dialog_lightbox .mx_Dialog { From ce7f387dd6b8efd10b2704ce576d41dee4168af3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 22 Jul 2021 21:24:46 +0200 Subject: [PATCH 008/256] Extends IMediaEventContent by thumbnail info MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/customisations/models/IMediaEventContent.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/customisations/models/IMediaEventContent.ts b/src/customisations/models/IMediaEventContent.ts index 62dfe4ee19..d4f6340ccb 100644 --- a/src/customisations/models/IMediaEventContent.ts +++ b/src/customisations/models/IMediaEventContent.ts @@ -38,6 +38,10 @@ export interface IMediaEventContent { info?: { thumbnail_url?: string; // eslint-disable-line camelcase thumbnail_file?: IEncryptedFile; // eslint-disable-line camelcase + thumbnail_info?: { // eslint-disable-line camelcase + w: number; + h: number; + }; mimetype: string; w?: number; h?: number; From 1b00b304bbe8fb8942ab0b4bf6a0de8deb63398a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 22 Jul 2021 21:25:11 +0200 Subject: [PATCH 009/256] Give image view panel a loading animation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/elements/_ImageView.scss | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/res/css/views/elements/_ImageView.scss b/res/css/views/elements/_ImageView.scss index cf92ffec64..41d24ac051 100644 --- a/res/css/views/elements/_ImageView.scss +++ b/res/css/views/elements/_ImageView.scss @@ -38,12 +38,23 @@ $button-gap: 24px; flex-shrink: 0; } +@keyframes mx_ImageView_panel_keyframes { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + .mx_ImageView_panel { width: 100%; height: 68px; display: flex; justify-content: space-between; align-items: center; + animation-name: mx_ImageView_panel_keyframes; + animation-duration: 0.25s; } .mx_ImageView_info_wrapper { From d421c3203f7c823b9359cc781d0d469678405b04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 22 Jul 2021 21:26:15 +0200 Subject: [PATCH 010/256] Initial implementation of loading animation 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 | 35 ++++++++++++++----- src/components/views/messages/MImageBody.tsx | 11 ++++++ .../views/rooms/LinkPreviewWidget.tsx | 18 ++++++++-- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/components/views/elements/ImageView.tsx b/src/components/views/elements/ImageView.tsx index db63dbbfc2..56c81c937e 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/src/components/views/elements/ImageView.tsx @@ -34,6 +34,7 @@ import { RoomPermalinkCreator } from "../../../utils/permalinks/Permalinks"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { normalizeWheelEvent } from "../../../utils/Mouse"; import { IDialogProps } from '../dialogs/IDialogProps'; +import UIStore from '../../../stores/UIStore'; // Max scale to keep gaps around the image const MAX_SCALE = 0.95; @@ -56,8 +57,15 @@ interface IProps extends IDialogProps { // redactions, senders, timestamps etc. Other descriptors are taken from the explicit // properties above, which let us use lightboxes to display images which aren't associated // with events. - mxEvent: MatrixEvent; - permalinkCreator: RoomPermalinkCreator; + mxEvent?: MatrixEvent; + permalinkCreator?: RoomPermalinkCreator; + + thumbnailInfo?: { + positionX: number; + positionY: number; + width: number; + height: number; + }; } interface IState { @@ -75,13 +83,16 @@ interface IState { export default class ImageView extends React.Component { constructor(props) { super(props); + + const { thumbnailInfo, width } = this.props; + this.state = { - zoom: 0, + zoom: thumbnailInfo?.width / width ?? 0, minZoom: MAX_SCALE, maxZoom: MAX_SCALE, rotation: 0, - translationX: 0, - translationY: 0, + translationX: thumbnailInfo?.positionX + (thumbnailInfo?.width / 2) - (UIStore.instance.windowWidth / 2), + translationY: thumbnailInfo?.positionY + (thumbnailInfo?.height / 2) - (UIStore.instance.windowHeight / 2), moving: false, contextMenuDisplayed: false, }; @@ -105,15 +116,23 @@ export default class ImageView extends React.Component { // We want to recalculate zoom whenever the window's size changes window.addEventListener("resize", this.recalculateZoom); // After the image loads for the first time we want to calculate the zoom - this.image.current.addEventListener("load", this.recalculateZoom); + this.image.current.addEventListener("load", this.imageLoaded); } componentWillUnmount() { this.focusLock.current.removeEventListener('wheel', this.onWheel); window.removeEventListener("resize", this.recalculateZoom); - this.image.current.removeEventListener("load", this.recalculateZoom); + this.image.current.removeEventListener("load", this.imageLoaded); } + private imageLoaded =() => { + this.setZoomAndRotation(); + this.setState({ + translationX: 0, + translationY: 0, + }); + }; + private recalculateZoom = () => { this.setZoomAndRotation(); }; @@ -380,7 +399,7 @@ export default class ImageView extends React.Component { // image causing it translate in the wrong direction. const style = { cursor: cursor, - transition: this.state.moving ? null : "transform 200ms ease 0s", + transition: this.state.moving ? null : "transform 250ms ease 0s", transform: `translateX(${translatePixelsX}) translateY(${translatePixelsY}) scale(${zoom}) diff --git a/src/components/views/messages/MImageBody.tsx b/src/components/views/messages/MImageBody.tsx index 44c15d50e7..c433ddb8e3 100644 --- a/src/components/views/messages/MImageBody.tsx +++ b/src/components/views/messages/MImageBody.tsx @@ -112,6 +112,17 @@ export default class MImageBody extends React.Component { params.fileSize = content.info.size; } + if (this.image.current) { + const clientRect = this.image.current.getBoundingClientRect(); + + params.thumbnailInfo = { + width: clientRect.width, + height: clientRect.height, + positionX: clientRect.x, + positionY: clientRect.y, + }; + } + Modal.createDialog(ImageView, params, "mx_Dialog_lightbox", null, true); } }; diff --git a/src/components/views/rooms/LinkPreviewWidget.tsx b/src/components/views/rooms/LinkPreviewWidget.tsx index 55e123f4e0..5e7154dc8a 100644 --- a/src/components/views/rooms/LinkPreviewWidget.tsx +++ b/src/components/views/rooms/LinkPreviewWidget.tsx @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { createRef } from 'react'; +import React, { ComponentProps, createRef } from 'react'; import { AllHtmlEntities } from 'html-entities'; import { MatrixEvent } from 'matrix-js-sdk/src/models/event'; import { IPreviewUrlResponse } from 'matrix-js-sdk/src/client'; @@ -36,6 +36,7 @@ interface IProps { @replaceableComponent("views.rooms.LinkPreviewWidget") export default class LinkPreviewWidget extends React.Component { private readonly description = createRef(); + private image = createRef(); componentDidMount() { if (this.description.current) { @@ -59,7 +60,7 @@ export default class LinkPreviewWidget extends React.Component { src = mediaFromMxc(src).srcHttp; } - const params = { + const params: Omit, "onFinished"> = { src: src, width: p["og:image:width"], height: p["og:image:height"], @@ -68,6 +69,17 @@ export default class LinkPreviewWidget extends React.Component { link: this.props.link, }; + if (this.image.current) { + const clientRect = this.image.current.getBoundingClientRect(); + + params.thumbnailInfo = { + width: clientRect.width, + height: clientRect.height, + positionX: clientRect.x, + positionY: clientRect.y, + }; + } + Modal.createDialog(ImageView, params, "mx_Dialog_lightbox", null, true); }; @@ -100,7 +112,7 @@ export default class LinkPreviewWidget extends React.Component { let img; if (image) { img =
- +
; } From 7c81526805e97e45b7faf88718874c77e705b941 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 22 Jul 2021 21:52:36 +0200 Subject: [PATCH 011/256] Take panel height into account 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 | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/components/views/elements/ImageView.tsx b/src/components/views/elements/ImageView.tsx index 56c81c937e..f589ba7dc0 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/src/components/views/elements/ImageView.tsx @@ -45,6 +45,8 @@ const ZOOM_COEFFICIENT = 0.0025; // If we have moved only this much we can zoom const ZOOM_DISTANCE = 10; +const PANEL_HEIGHT = 68; + interface IProps extends IDialogProps { src: string; // the source of the image being displayed name?: string; // the main title ('name') for the image @@ -91,8 +93,17 @@ export default class ImageView extends React.Component { minZoom: MAX_SCALE, maxZoom: MAX_SCALE, rotation: 0, - translationX: thumbnailInfo?.positionX + (thumbnailInfo?.width / 2) - (UIStore.instance.windowWidth / 2), - translationY: thumbnailInfo?.positionY + (thumbnailInfo?.height / 2) - (UIStore.instance.windowHeight / 2), + translationX: ( + thumbnailInfo?.positionX + + (thumbnailInfo?.width / 2) - + (UIStore.instance.windowWidth / 2) + ), + translationY: ( + thumbnailInfo?.positionY + + (thumbnailInfo?.height / 2) - + (UIStore.instance.windowHeight / 2) - + (PANEL_HEIGHT / 2) + ), moving: false, contextMenuDisplayed: false, }; @@ -125,7 +136,7 @@ export default class ImageView extends React.Component { this.image.current.removeEventListener("load", this.imageLoaded); } - private imageLoaded =() => { + private imageLoaded = () => { this.setZoomAndRotation(); this.setState({ translationX: 0, From 2fd221bc1807fa2e891053e4265508c8583e1b4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 23 Jul 2021 08:00:51 +0200 Subject: [PATCH 012/256] Update animation speed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/_common.scss | 2 +- res/css/views/elements/_ImageView.scss | 2 +- src/components/views/elements/ImageView.tsx | 28 ++++++++++++--------- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/res/css/_common.scss b/res/css/_common.scss index 066bbea510..c85a2a74e5 100644 --- a/res/css/_common.scss +++ b/res/css/_common.scss @@ -328,7 +328,7 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { opacity: $lightbox-background-bg-opacity; background-color: $lightbox-background-bg-color; animation-name: mx_Dialog_lightbox_background_keyframes; - animation-duration: 0.25s; + animation-duration: 300ms; } .mx_Dialog_lightbox .mx_Dialog { diff --git a/res/css/views/elements/_ImageView.scss b/res/css/views/elements/_ImageView.scss index 41d24ac051..4bf957b93b 100644 --- a/res/css/views/elements/_ImageView.scss +++ b/res/css/views/elements/_ImageView.scss @@ -54,7 +54,7 @@ $button-gap: 24px; justify-content: space-between; align-items: center; animation-name: mx_ImageView_panel_keyframes; - animation-duration: 0.25s; + animation-duration: 300ms; } .mx_ImageView_info_wrapper { diff --git a/src/components/views/elements/ImageView.tsx b/src/components/views/elements/ImageView.tsx index f589ba7dc0..d09062f3ab 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/src/components/views/elements/ImageView.tsx @@ -120,6 +120,8 @@ export default class ImageView extends React.Component { private previousX = 0; private previousY = 0; + private loaded = false; + componentDidMount() { // We have to use addEventListener() because the listener // needs to be passive in order to work with Chromium @@ -136,12 +138,13 @@ export default class ImageView extends React.Component { this.image.current.removeEventListener("load", this.imageLoaded); } - private imageLoaded = () => { + private imageLoaded = async () => { this.setZoomAndRotation(); - this.setState({ + await this.setState({ translationX: 0, translationY: 0, }); + this.loaded = true; }; private recalculateZoom = () => { @@ -390,16 +393,17 @@ export default class ImageView extends React.Component { const showEventMeta = !!this.props.mxEvent; const zoomingDisabled = this.state.maxZoom === this.state.minZoom; + let transition; + if (!this.loaded) transition = "transform 300ms ease 0s"; + else if (this.state.moving) transition = null; + else transition = "transform 200ms ease 0s"; + let cursor; - if (this.state.moving) { - cursor= "grabbing"; - } else if (zoomingDisabled) { - cursor = "default"; - } else if (this.state.zoom === this.state.minZoom) { - cursor = "zoom-in"; - } else { - cursor = "zoom-out"; - } + if (this.state.moving) cursor = "grabbing"; + else if (zoomingDisabled) cursor = "default"; + else if (this.state.zoom === this.state.minZoom) cursor = "zoom-in"; + else cursor = "zoom-out"; + const rotationDegrees = this.state.rotation + "deg"; const zoom = this.state.zoom; const translatePixelsX = this.state.translationX + "px"; @@ -410,7 +414,7 @@ export default class ImageView extends React.Component { // image causing it translate in the wrong direction. const style = { cursor: cursor, - transition: this.state.moving ? null : "transform 250ms ease 0s", + transition: transition, transform: `translateX(${translatePixelsX}) translateY(${translatePixelsY}) scale(${zoom}) From 8d5fd9306f42ed2e10549c291e24d1b17af92c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 23 Jul 2021 10:07:09 +0200 Subject: [PATCH 013/256] Add some null guards 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, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/elements/ImageView.tsx b/src/components/views/elements/ImageView.tsx index d09062f3ab..bc559603e0 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/src/components/views/elements/ImageView.tsx @@ -97,13 +97,13 @@ export default class ImageView extends React.Component { thumbnailInfo?.positionX + (thumbnailInfo?.width / 2) - (UIStore.instance.windowWidth / 2) - ), + ) ?? 0, translationY: ( thumbnailInfo?.positionY + (thumbnailInfo?.height / 2) - (UIStore.instance.windowHeight / 2) - (PANEL_HEIGHT / 2) - ), + ) ?? 0, moving: false, contextMenuDisplayed: false, }; From 91a11b6997ad29e3517be3f866865d968ca399f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 23 Jul 2021 13:52:29 +0200 Subject: [PATCH 014/256] Fix animation issues 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 | 26 ++++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/components/views/elements/ImageView.tsx b/src/components/views/elements/ImageView.tsx index bc559603e0..90920ff67f 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/src/components/views/elements/ImageView.tsx @@ -86,10 +86,10 @@ export default class ImageView extends React.Component { constructor(props) { super(props); - const { thumbnailInfo, width } = this.props; + const { thumbnailInfo } = this.props; this.state = { - zoom: thumbnailInfo?.width / width ?? 0, + zoom: 0, // We default to 0 and override this in imageLoaded once we have naturalSize minZoom: MAX_SCALE, maxZoom: MAX_SCALE, rotation: 0, @@ -120,7 +120,8 @@ export default class ImageView extends React.Component { private previousX = 0; private previousY = 0; - private loaded = false; + private animatingLoading = false; + private imageIsLoaded = false; componentDidMount() { // We have to use addEventListener() because the listener @@ -139,12 +140,25 @@ export default class ImageView extends React.Component { } private imageLoaded = async () => { + // First, we calculate the zoom, so that the image has the same size as + // the thumbnail + const { thumbnailInfo } = this.props; + if (thumbnailInfo?.width) { + await this.setState({ zoom: thumbnailInfo.width / this.image.current.naturalWidth }); + } + + // Once the zoom is set, we the image is considered loaded and we can + // start animating it into the center of the screen + this.imageIsLoaded = true; + this.animatingLoading = true; this.setZoomAndRotation(); await this.setState({ translationX: 0, translationY: 0, }); - this.loaded = true; + + // Once the position is set, there is no need to animate anymore + this.animatingLoading = false; }; private recalculateZoom = () => { @@ -394,8 +408,8 @@ export default class ImageView extends React.Component { const zoomingDisabled = this.state.maxZoom === this.state.minZoom; let transition; - if (!this.loaded) transition = "transform 300ms ease 0s"; - else if (this.state.moving) transition = null; + if (this.animatingLoading) transition = "transform 300ms ease 0s"; + else if (this.state.moving || !this.imageIsLoaded) transition = null; else transition = "transform 200ms ease 0s"; let cursor; From 6aefd9318ffa9801f188e6d7b1ccd70d5dbb6617 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 4 Sep 2021 16:16:21 +0200 Subject: [PATCH 015/256] Convert BaseDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../dialogs/{BaseDialog.js => BaseDialog.tsx} | 112 +++++++++--------- .../security/SetupEncryptionDialog.tsx | 2 +- 2 files changed, 57 insertions(+), 57 deletions(-) rename src/components/views/dialogs/{BaseDialog.js => BaseDialog.tsx} (61%) diff --git a/src/components/views/dialogs/BaseDialog.js b/src/components/views/dialogs/BaseDialog.tsx similarity index 61% rename from src/components/views/dialogs/BaseDialog.js rename to src/components/views/dialogs/BaseDialog.tsx index 42b21ec743..91cceb3123 100644 --- a/src/components/views/dialogs/BaseDialog.js +++ b/src/components/views/dialogs/BaseDialog.tsx @@ -18,15 +18,59 @@ limitations under the License. import React from 'react'; import FocusLock from 'react-focus-lock'; -import PropTypes from 'prop-types'; import classNames from 'classnames'; import { Key } from '../../../Keyboard'; -import AccessibleButton from '../elements/AccessibleButton'; +import AccessibleButton, { ButtonEvent } from '../elements/AccessibleButton'; import { MatrixClientPeg } from '../../../MatrixClientPeg'; import { _t } from "../../../languageHandler"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import { MatrixClient } from "matrix-js-sdk/src/client"; + +interface IProps { + // onFinished callback to call when Escape is pressed + // Take a boolean which is true if the dialog was dismissed + // with a positive / confirm action or false if it was + // cancelled (BaseDialog itself only calls this with false). + onFinished: (confirm: any) => void; + + // Whether the dialog should have a 'close' button that will + // cause the dialog to be cancelled. This should only be set + // to false if there is nothing the app can sensibly do if the + // dialog is cancelled, eg. "We can't restore your session and + // the app cannot work". Default: true. + hasCancel?: boolean; + + // called when a key is pressed + onKeyDown?: (e: KeyboardEvent | React.KeyboardEvent) => void; + + // CSS class to apply to dialog div + className?: string; + + // if true, dialog container is 60% of the viewport width. Otherwise, + // the container will have no fixed size, allowing its contents to + // determine its size. Default: true. + fixedWidth?: boolean; + + // Title for the dialog. + title?: JSX.Element | string; + + // Path to an icon to put in the header + headerImage?: string; + + // children should be the content of the dialog + children?: React.ReactNode; + + // Id of content element + // If provided, this is used to add a aria-describedby attribute + contentId?: string; + + // optional additional class for the title element (basically anything that can be passed to classnames) + titleClass?: string | string[]; + + headerButton?: JSX.Element; +} /* * Basic container for modal dialogs. @@ -35,54 +79,10 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; * dialog on escape. */ @replaceableComponent("views.dialogs.BaseDialog") -export default class BaseDialog extends React.Component { - static propTypes = { - // onFinished callback to call when Escape is pressed - // Take a boolean which is true if the dialog was dismissed - // with a positive / confirm action or false if it was - // cancelled (BaseDialog itself only calls this with false). - onFinished: PropTypes.func.isRequired, +export default class BaseDialog extends React.Component { + private matrixClient: MatrixClient; - // Whether the dialog should have a 'close' button that will - // cause the dialog to be cancelled. This should only be set - // to false if there is nothing the app can sensibly do if the - // dialog is cancelled, eg. "We can't restore your session and - // the app cannot work". Default: true. - hasCancel: PropTypes.bool, - - // called when a key is pressed - onKeyDown: PropTypes.func, - - // CSS class to apply to dialog div - className: PropTypes.string, - - // if true, dialog container is 60% of the viewport width. Otherwise, - // the container will have no fixed size, allowing its contents to - // determine its size. Default: true. - fixedWidth: PropTypes.bool, - - // Title for the dialog. - title: PropTypes.node.isRequired, - - // Path to an icon to put in the header - headerImage: PropTypes.string, - - // children should be the content of the dialog - children: PropTypes.node, - - // Id of content element - // If provided, this is used to add a aria-describedby attribute - contentId: PropTypes.string, - - // optional additional class for the title element (basically anything that can be passed to classnames) - titleClass: PropTypes.oneOfType([ - PropTypes.string, - PropTypes.object, - PropTypes.arrayOf(PropTypes.string), - ]), - }; - - static defaultProps = { + public static defaultProps = { hasCancel: true, fixedWidth: true, }; @@ -90,10 +90,10 @@ export default class BaseDialog extends React.Component { constructor(props) { super(props); - this._matrixClient = MatrixClientPeg.get(); + this.matrixClient = MatrixClientPeg.get(); } - _onKeyDown = (e) => { + private onKeyDown = (e: KeyboardEvent | React.KeyboardEvent): void => { if (this.props.onKeyDown) { this.props.onKeyDown(e); } @@ -104,15 +104,15 @@ export default class BaseDialog extends React.Component { } }; - _onCancelClick = (e) => { + private onCancelClick = (e: ButtonEvent): void => { this.props.onFinished(false); }; - render() { + public render(): JSX.Element { let cancelButton; if (this.props.hasCancel) { cancelButton = ( - + ); } @@ -122,11 +122,11 @@ export default class BaseDialog extends React.Component { } return ( - + Date: Sat, 4 Sep 2021 16:36:01 +0200 Subject: [PATCH 016/256] Convert FeedbackDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/CountlyAnalytics.ts | 4 +++- .../{FeedbackDialog.js => FeedbackDialog.tsx} | 20 ++++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) rename src/components/views/dialogs/{FeedbackDialog.js => FeedbackDialog.tsx} (90%) diff --git a/src/CountlyAnalytics.ts b/src/CountlyAnalytics.ts index 72b0462bcd..be35597734 100644 --- a/src/CountlyAnalytics.ts +++ b/src/CountlyAnalytics.ts @@ -30,6 +30,8 @@ const HEARTBEAT_INTERVAL = 5_000; // ms const SESSION_UPDATE_INTERVAL = 60; // seconds const MAX_PENDING_EVENTS = 1000; +export type Rating = 1 | 2 | 3 | 4 | 5; + enum Orientation { Landscape = "landscape", Portrait = "portrait", @@ -451,7 +453,7 @@ export default class CountlyAnalytics { window.removeEventListener("scroll", this.onUserActivity); } - public reportFeedback(rating: 1 | 2 | 3 | 4 | 5, comment: string) { + public reportFeedback(rating: Rating, comment: string) { this.track("[CLY]_star_rating", { rating, comment }, null, {}, true); } diff --git a/src/components/views/dialogs/FeedbackDialog.js b/src/components/views/dialogs/FeedbackDialog.tsx similarity index 90% rename from src/components/views/dialogs/FeedbackDialog.js rename to src/components/views/dialogs/FeedbackDialog.tsx index ceb8cb2175..00112ab0c7 100644 --- a/src/components/views/dialogs/FeedbackDialog.js +++ b/src/components/views/dialogs/FeedbackDialog.tsx @@ -19,7 +19,7 @@ import QuestionDialog from './QuestionDialog'; import { _t } from '../../../languageHandler'; import Field from "../elements/Field"; import AccessibleButton from "../elements/AccessibleButton"; -import CountlyAnalytics from "../../../CountlyAnalytics"; +import CountlyAnalytics, { Rating } from "../../../CountlyAnalytics"; import SdkConfig from "../../../SdkConfig"; import Modal from "../../../Modal"; import BugReportDialog from "./BugReportDialog"; @@ -30,19 +30,23 @@ const existingIssuesUrl = "https://github.com/vector-im/element-web/issues" + "?q=is%3Aopen+is%3Aissue+sort%3Areactions-%2B1-desc"; const newIssueUrl = "https://github.com/vector-im/element-web/issues/new/choose"; -export default (props) => { - const [rating, setRating] = useState(""); - const [comment, setComment] = useState(""); +interface IProps { + onFinished: () => void; +} - const onDebugLogsLinkClick = () => { +const FeedbackDialog: React.FC = (props: IProps) => { + const [rating, setRating] = useState(); + const [comment, setComment] = useState(""); + + const onDebugLogsLinkClick = (): void => { props.onFinished(); Modal.createTrackedDialog('Bug Report Dialog', '', BugReportDialog, {}); }; const hasFeedback = CountlyAnalytics.instance.canEnable(); - const onFinished = (sendFeedback) => { + const onFinished = (sendFeedback: boolean): void => { if (hasFeedback && sendFeedback) { - CountlyAnalytics.instance.reportFeedback(parseInt(rating, 10), comment); + CountlyAnalytics.instance.reportFeedback((parseInt(rating) as Rating), comment); Modal.createTrackedDialog('Feedback sent', '', InfoDialog, { title: _t('Feedback sent'), description: _t('Thank you!'), @@ -142,3 +146,5 @@ export default (props) => { onFinished={onFinished} />); }; + +export default FeedbackDialog; From 3c9ded5a9acb165cfb061513ad1f62e9532273a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sat, 4 Sep 2021 18:40:54 +0200 Subject: [PATCH 017/256] Convert RestoreKeyBackupDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...upDialog.js => RestoreKeyBackupDialog.tsx} | 175 +++++++++++------- 1 file changed, 103 insertions(+), 72 deletions(-) rename src/components/views/dialogs/security/{RestoreKeyBackupDialog.js => RestoreKeyBackupDialog.tsx} (77%) diff --git a/src/components/views/dialogs/security/RestoreKeyBackupDialog.js b/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx similarity index 77% rename from src/components/views/dialogs/security/RestoreKeyBackupDialog.js rename to src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx index 2b272a3b88..d2b850eb85 100644 --- a/src/components/views/dialogs/security/RestoreKeyBackupDialog.js +++ b/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx @@ -16,30 +16,64 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; -import * as sdk from '../../../../index'; import { MatrixClientPeg } from '../../../../MatrixClientPeg'; import { MatrixClient } from 'matrix-js-sdk/src/client'; import { _t } from '../../../../languageHandler'; import { accessSecretStorage } from '../../../../SecurityManager'; +import { IKeyBackupInfo, IKeyBackupRestoreResult } from "matrix-js-sdk/src/crypto/keybackup"; +import { ISecretStorageKeyInfo } from "matrix-js-sdk/src/crypto/api"; +import * as sdk from '../../../../index'; -const RESTORE_TYPE_PASSPHRASE = 0; -const RESTORE_TYPE_RECOVERYKEY = 1; -const RESTORE_TYPE_SECRET_STORAGE = 2; +enum RestoreType { + Passphrase = "passphrase", + RecoveryKey = "recovery_key", + SecretStorage = "secret_storage" +} + +enum ProgressState { + PreFetch = "prefetch", + Fetch = "fetch", + LoadKeys = "load_keys", + +} + +interface IProps { + // if false, will close the dialog as soon as the restore completes succesfully + // default: true + showSummary?: boolean; + // If specified, gather the key from the user but then call the function with the backup + // key rather than actually (necessarily) restoring the backup. + keyCallback?: (key: Uint8Array) => void; + + onFinished: (success: boolean) => void; +} + +interface IState { + backupInfo: IKeyBackupInfo; + backupKeyStored: Record; + loading: boolean; + loadError: string; + restoreError: { + errcode: string; + }; + recoveryKey: string; + recoverInfo: IKeyBackupRestoreResult; + recoveryKeyValid: boolean; + forceRecoveryKey: boolean; + passPhrase: ""; + restoreType: RestoreType; + progress: { + stage: ProgressState; + total?: number; + successes?: number; + failures?: number; + }; +} /* * Dialog for restoring e2e keys from a backup and the user's recovery key */ -export default class RestoreKeyBackupDialog extends React.PureComponent { - static propTypes = { - // if false, will close the dialog as soon as the restore completes succesfully - // default: true - showSummary: PropTypes.bool, - // If specified, gather the key from the user but then call the function with the backup - // key rather than actually (necessarily) restoring the backup. - keyCallback: PropTypes.func, - }; - +export default class RestoreKeyBackupDialog extends React.PureComponent { static defaultProps = { showSummary: true, }; @@ -58,58 +92,58 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { forceRecoveryKey: false, passPhrase: '', restoreType: null, - progress: { stage: "prefetch" }, + progress: { stage: ProgressState.PreFetch }, }; } - componentDidMount() { - this._loadBackupStatus(); + public componentDidMount(): void { + this.loadBackupStatus(); } - _onCancel = () => { + private onCancel = (): void => { this.props.onFinished(false); - } + }; - _onDone = () => { + private onDone = (): void => { this.props.onFinished(true); - } + }; - _onUseRecoveryKeyClick = () => { + private onUseRecoveryKeyClick = (): void => { this.setState({ forceRecoveryKey: true, }); - } + }; - _progressCallback = (data) => { + private progressCallback = (data): void => { this.setState({ progress: data, }); - } + }; - _onResetRecoveryClick = () => { + private onResetRecoveryClick = (): void => { this.props.onFinished(false); - accessSecretStorage(() => {}, /* forceReset = */ true); - } + accessSecretStorage(async () => {}, /* forceReset = */ true); + }; - _onRecoveryKeyChange = (e) => { + private onRecoveryKeyChange = (e): void => { this.setState({ recoveryKey: e.target.value, recoveryKeyValid: MatrixClientPeg.get().isValidRecoveryKey(e.target.value), }); - } + }; - _onPassPhraseNext = async () => { + private onPassPhraseNext = async (): Promise => { this.setState({ loading: true, restoreError: null, - restoreType: RESTORE_TYPE_PASSPHRASE, + restoreType: RestoreType.Passphrase, }); try { // We do still restore the key backup: we must ensure that the key backup key // is the right one and restoring it is currently the only way we can do this. const recoverInfo = await MatrixClientPeg.get().restoreKeyBackupWithPassword( this.state.passPhrase, undefined, undefined, this.state.backupInfo, - { progressCallback: this._progressCallback }, + { progressCallback: this.progressCallback }, ); if (this.props.keyCallback) { const key = await MatrixClientPeg.get().keyBackupKeyFromPassword( @@ -133,20 +167,20 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { restoreError: e, }); } - } + }; - _onRecoveryKeyNext = async () => { + private onRecoveryKeyNext = async (): Promise => { if (!this.state.recoveryKeyValid) return; this.setState({ loading: true, restoreError: null, - restoreType: RESTORE_TYPE_RECOVERYKEY, + restoreType: RestoreType.RecoveryKey, }); try { const recoverInfo = await MatrixClientPeg.get().restoreKeyBackupWithRecoveryKey( this.state.recoveryKey, undefined, undefined, this.state.backupInfo, - { progressCallback: this._progressCallback }, + { progressCallback: this.progressCallback }, ); if (this.props.keyCallback) { const key = MatrixClientPeg.get().keyBackupKeyFromRecoveryKey(this.state.recoveryKey); @@ -167,31 +201,30 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { restoreError: e, }); } - } + }; - _onPassPhraseChange = (e) => { + private onPassPhraseChange = (e): void => { this.setState({ passPhrase: e.target.value, }); - } + }; - async _restoreWithSecretStorage() { + private async restoreWithSecretStorage(): Promise { this.setState({ loading: true, restoreError: null, - restoreType: RESTORE_TYPE_SECRET_STORAGE, + restoreType: RestoreType.SecretStorage, }); try { // `accessSecretStorage` may prompt for storage access as needed. - const recoverInfo = await accessSecretStorage(async () => { - return MatrixClientPeg.get().restoreKeyBackupWithSecretStorage( + await accessSecretStorage(async () => { + await MatrixClientPeg.get().restoreKeyBackupWithSecretStorage( this.state.backupInfo, undefined, undefined, - { progressCallback: this._progressCallback }, + { progressCallback: this.progressCallback }, ); }); this.setState({ loading: false, - recoverInfo, }); } catch (e) { console.log("Error restoring backup", e); @@ -202,14 +235,14 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { } } - async _restoreWithCachedKey(backupInfo) { + private async restoreWithCachedKey(backupInfo): Promise { if (!backupInfo) return false; try { const recoverInfo = await MatrixClientPeg.get().restoreKeyBackupWithCache( undefined, /* targetRoomId */ undefined, /* targetSessionId */ backupInfo, - { progressCallback: this._progressCallback }, + { progressCallback: this.progressCallback }, ); this.setState({ recoverInfo, @@ -221,7 +254,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { } } - async _loadBackupStatus() { + private async loadBackupStatus(): Promise { this.setState({ loading: true, loadError: null, @@ -236,7 +269,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { backupKeyStored, }); - const gotCache = await this._restoreWithCachedKey(backupInfo); + const gotCache = await this.restoreWithCachedKey(backupInfo); if (gotCache) { console.log("RestoreKeyBackupDialog: found cached backup key"); this.setState({ @@ -247,7 +280,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { // If the backup key is stored, we can proceed directly to restore. if (backupKeyStored) { - return this._restoreWithSecretStorage(); + return this.restoreWithSecretStorage(); } this.setState({ @@ -263,7 +296,10 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { } } - render() { + public render(): JSX.Element { + // FIXME: Making these into imports will break tests + const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); + const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); const Spinner = sdk.getComponent("elements.Spinner"); @@ -279,12 +315,12 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { if (this.state.loading) { title = _t("Restoring keys from backup"); let details; - if (this.state.progress.stage === "fetch") { + if (this.state.progress.stage === ProgressState.Fetch) { details = _t("Fetching keys from server..."); - } else if (this.state.progress.stage === "load_keys") { + } else if (this.state.progress.stage === ProgressState.LoadKeys) { const { total, successes, failures } = this.state.progress; details = _t("%(completed)s of %(total)s keys restored", { total, completed: successes + failures }); - } else if (this.state.progress.stage === "prefetch") { + } else if (this.state.progress.stage === ProgressState.PreFetch) { details = _t("Fetching keys from server..."); } content =
@@ -296,7 +332,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { content = _t("Unable to load backup status"); } else if (this.state.restoreError) { if (this.state.restoreError.errcode === MatrixClient.RESTORE_BACKUP_ERROR_BAD_KEY) { - if (this.state.restoreType === RESTORE_TYPE_RECOVERYKEY) { + if (this.state.restoreType === RestoreType.RecoveryKey) { title = _t("Security Key mismatch"); content =

{ _t( @@ -321,7 +357,6 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { title = _t("Error"); content = _t("No backup found!"); } else if (this.state.recoverInfo) { - const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); title = _t("Keys restored"); let failedToDecrypt; if (this.state.recoverInfo.total > this.state.recoverInfo.imported) { @@ -334,14 +369,12 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {

{ _t("Successfully restored %(sessionCount)s keys", { sessionCount: this.state.recoverInfo.imported }) }

{ failedToDecrypt }
; } else if (backupHasPassphrase && !this.state.forceRecoveryKey) { - const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); title = _t("Enter Security Phrase"); content =

{ _t( @@ -357,16 +390,16 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {

@@ -379,14 +412,14 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { button1: s => { s } , button2: s => { s } , @@ -394,8 +427,6 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
; } else { title = _t("Enter Security Key"); - const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); let keyStatus; if (this.state.recoveryKey.length === 0) { @@ -423,15 +454,15 @@ export default class RestoreKeyBackupDialog extends React.PureComponent {
{ keyStatus } @@ -443,7 +474,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { { button: s => { s } , From 0b9255f5eecb2a8c0ea8f9804c03704e81de620a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 08:31:06 +0200 Subject: [PATCH 018/256] Convert UploadFailureDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...ilureDialog.js => UploadFailureDialog.tsx} | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) rename src/components/views/dialogs/{UploadFailureDialog.js => UploadFailureDialog.tsx} (80%) diff --git a/src/components/views/dialogs/UploadFailureDialog.js b/src/components/views/dialogs/UploadFailureDialog.tsx similarity index 80% rename from src/components/views/dialogs/UploadFailureDialog.js rename to src/components/views/dialogs/UploadFailureDialog.tsx index 224098f935..807cb08195 100644 --- a/src/components/views/dialogs/UploadFailureDialog.js +++ b/src/components/views/dialogs/UploadFailureDialog.tsx @@ -17,11 +17,18 @@ limitations under the License. import filesize from 'filesize'; import React from 'react'; -import PropTypes from 'prop-types'; -import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import ContentMessages from '../../../ContentMessages'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import BaseDialog from "./BaseDialog"; +import DialogButtons from "../elements/DialogButtons"; + +interface IProps { + badFiles: File[]; + totalFiles: number; + contentMessages: ContentMessages; + onFinished: (success: boolean) => void; +} /* * Tells the user about files we know cannot be uploaded before we even try uploading @@ -29,26 +36,16 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; * the size of the file. */ @replaceableComponent("views.dialogs.UploadFailureDialog") -export default class UploadFailureDialog extends React.Component { - static propTypes = { - badFiles: PropTypes.arrayOf(PropTypes.object).isRequired, - totalFiles: PropTypes.number.isRequired, - contentMessages: PropTypes.instanceOf(ContentMessages).isRequired, - onFinished: PropTypes.func.isRequired, - } - - _onCancelClick = () => { +export default class UploadFailureDialog extends React.Component { + private onCancelClick = (): void => { this.props.onFinished(false); - } + }; - _onUploadClick = () => { + private onUploadClick = (): void => { this.props.onFinished(true); - } - - render() { - const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); + }; + public render(): JSX.Element { let message; let preview; let buttons; @@ -65,7 +62,7 @@ export default class UploadFailureDialog extends React.Component { ); buttons = ; } else if (this.props.totalFiles === this.props.badFiles.length) { @@ -80,7 +77,7 @@ export default class UploadFailureDialog extends React.Component { ); buttons = ; } else { @@ -96,17 +93,17 @@ export default class UploadFailureDialog extends React.Component { const howManyOthers = this.props.totalFiles - this.props.badFiles.length; buttons = ; } return ( From 37099fd188c585fce7867a75df74d0dd3b84d64d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 08:35:24 +0200 Subject: [PATCH 019/256] Convert TextInputDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...TextInputDialog.js => TextInputDialog.tsx} | 79 ++++++++++--------- 1 file changed, 40 insertions(+), 39 deletions(-) rename src/components/views/dialogs/{TextInputDialog.js => TextInputDialog.tsx} (67%) diff --git a/src/components/views/dialogs/TextInputDialog.js b/src/components/views/dialogs/TextInputDialog.tsx similarity index 67% rename from src/components/views/dialogs/TextInputDialog.js rename to src/components/views/dialogs/TextInputDialog.tsx index 3d37c89424..624e2a58cb 100644 --- a/src/components/views/dialogs/TextInputDialog.js +++ b/src/components/views/dialogs/TextInputDialog.tsx @@ -14,33 +14,39 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { createRef } from 'react'; -import PropTypes from 'prop-types'; -import * as sdk from '../../../index'; +import React, { ChangeEvent, createRef } from 'react'; import Field from "../elements/Field"; import { _t, _td } from '../../../languageHandler'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import { IFieldState, IValidationResult } from "../elements/Validation"; +import BaseDialog from "./BaseDialog"; +import DialogButtons from "../elements/DialogButtons"; + + interface IProps { + title?: string; + description?: string | JSX.Element; + value?: string; + placeholder?: string; + button?: string; + busyMessage?: string; // pass _td string + focus?: boolean; + onFinished: (success: boolean, value?: string) => void; + hasCancel?: boolean; + validator?: (fieldState: IFieldState) => IValidationResult; // result of withValidation + fixedWidth?: boolean; +} + +interface IState { + value: string; + busy: boolean; + valid: boolean; +} @replaceableComponent("views.dialogs.TextInputDialog") -export default class TextInputDialog extends React.Component { - static propTypes = { - title: PropTypes.string, - description: PropTypes.oneOfType([ - PropTypes.element, - PropTypes.string, - ]), - value: PropTypes.string, - placeholder: PropTypes.string, - button: PropTypes.string, - busyMessage: PropTypes.string, // pass _td string - focus: PropTypes.bool, - onFinished: PropTypes.func.isRequired, - hasCancel: PropTypes.bool, - validator: PropTypes.func, // result of withValidation - fixedWidth: PropTypes.bool, - }; +export default class TextInputDialog extends React.Component { + private field = createRef(); - static defaultProps = { + public static defaultProps = { title: "", value: "", description: "", @@ -49,11 +55,9 @@ export default class TextInputDialog extends React.Component { hasCancel: true, }; - constructor(props) { + constructor(props: IProps) { super(props); - this._field = createRef(); - this.state = { value: this.props.value, busy: false, @@ -61,23 +65,23 @@ export default class TextInputDialog extends React.Component { }; } - componentDidMount() { + public componentDidMount(): void { if (this.props.focus) { // Set the cursor at the end of the text input // this._field.current.value = this.props.value; - this._field.current.focus(); + this.field.current.focus(); } } - onOk = async ev => { + private onOk = async (ev: React.FormEvent): Promise => { ev.preventDefault(); if (this.props.validator) { this.setState({ busy: true }); - await this._field.current.validate({ allowEmpty: false }); + await this.field.current.validate({ allowEmpty: false }); - if (!this._field.current.state.valid) { - this._field.current.focus(); - this._field.current.validate({ allowEmpty: false, focused: true }); + if (!this.field.current.state.valid) { + this.field.current.focus(); + this.field.current.validate({ allowEmpty: false, focused: true }); this.setState({ busy: false }); return; } @@ -85,17 +89,17 @@ export default class TextInputDialog extends React.Component { this.props.onFinished(true, this.state.value); }; - onCancel = () => { + private onCancel = (): void => { this.props.onFinished(false); }; - onChange = ev => { + private onChange = (ev: ChangeEvent): void => { this.setState({ value: ev.target.value, }); }; - onValidate = async fieldState => { + private onValidate = async (fieldState: IFieldState): Promise => { const result = await this.props.validator(fieldState); this.setState({ valid: result.valid, @@ -103,9 +107,7 @@ export default class TextInputDialog extends React.Component { return result; }; - render() { - const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); + public render(): JSX.Element { return (
From 161937ac924311f87cc1aa95d932f7e53cc25e6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 09:11:08 +0200 Subject: [PATCH 020/256] Convert TabbedIntegrationManagerDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ....js => TabbedIntegrationManagerDialog.tsx} | 84 ++++++++++--------- 1 file changed, 46 insertions(+), 38 deletions(-) rename src/components/views/dialogs/{TabbedIntegrationManagerDialog.js => TabbedIntegrationManagerDialog.tsx} (76%) diff --git a/src/components/views/dialogs/TabbedIntegrationManagerDialog.js b/src/components/views/dialogs/TabbedIntegrationManagerDialog.tsx similarity index 76% rename from src/components/views/dialogs/TabbedIntegrationManagerDialog.js rename to src/components/views/dialogs/TabbedIntegrationManagerDialog.tsx index 8723d4a453..c8ab25b1bb 100644 --- a/src/components/views/dialogs/TabbedIntegrationManagerDialog.js +++ b/src/components/views/dialogs/TabbedIntegrationManagerDialog.tsx @@ -15,42 +15,53 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import { IntegrationManagers } from "../../../integrations/IntegrationManagers"; import { Room } from "matrix-js-sdk/src/models/room"; -import * as sdk from '../../../index'; import { dialogTermsInteractionCallback, TermsNotSignedError } from "../../../Terms"; import classNames from 'classnames'; import * as ScalarMessaging from "../../../ScalarMessaging"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import { IntegrationManagerInstance } from "../../../integrations/IntegrationManagerInstance"; +import ScalarAuthClient from "../../../ScalarAuthClient"; +import AccessibleButton from "../elements/AccessibleButton"; +import IntegrationManager from "../settings/IntegrationManager"; + +interface IProps { + /** + * Called with: + * * success {bool} True if the user accepted any douments, false if cancelled + * * agreedUrls {string[]} List of agreed URLs + */ + onFinished: () => void; + + /** + * Optional room where the integration manager should be open to + */ + room: Room; + + /** + * Optional screen to open on the integration manager + */ + screen?: string; + + /** + * Optional integration ID to open in the integration manager + */ + integrationId?: string; +} + +interface IState { + managers: IntegrationManagerInstance[]; + busy: boolean; + currentIndex: number; + currentConnected: boolean; + currentLoading: boolean; + currentScalarClient: ScalarAuthClient; +} @replaceableComponent("views.dialogs.TabbedIntegrationManagerDialog") -export default class TabbedIntegrationManagerDialog extends React.Component { - static propTypes = { - /** - * Called with: - * * success {bool} True if the user accepted any douments, false if cancelled - * * agreedUrls {string[]} List of agreed URLs - */ - onFinished: PropTypes.func.isRequired, - - /** - * Optional room where the integration manager should be open to - */ - room: PropTypes.instanceOf(Room), - - /** - * Optional screen to open on the integration manager - */ - screen: PropTypes.string, - - /** - * Optional integration ID to open in the integration manager - */ - integrationId: PropTypes.string, - }; - - constructor(props) { +export default class TabbedIntegrationManagerDialog extends React.Component { + constructor(props: IProps) { super(props); this.state = { @@ -63,11 +74,11 @@ export default class TabbedIntegrationManagerDialog extends React.Component { }; } - componentDidMount() { + public componentDidMount(): void { this.openManager(0, true); } - openManager = async (i, force = false) => { + private openManager = async (i: number, force = false): Promise => { if (i === this.state.currentIndex && !force) return; const manager = this.state.managers[i]; @@ -120,8 +131,7 @@ export default class TabbedIntegrationManagerDialog extends React.Component { } }; - _renderTabs() { - const AccessibleButton = sdk.getComponent("views.elements.AccessibleButton"); + private renderTabs(): JSX.Element[] { return this.state.managers.map((m, i) => { const classes = classNames({ 'mx_TabbedIntegrationManagerDialog_tab': true, @@ -140,8 +150,7 @@ export default class TabbedIntegrationManagerDialog extends React.Component { }); } - _renderTab() { - const IntegrationManager = sdk.getComponent("views.settings.IntegrationManager"); + public renderTab(): JSX.Element { let uiUrl = null; if (this.state.currentScalarClient) { uiUrl = this.state.currentScalarClient.getScalarInterfaceUrlForRoom( @@ -151,7 +160,6 @@ export default class TabbedIntegrationManagerDialog extends React.Component { ); } return ; } - render() { + public render(): JSX.Element { return (
- { this._renderTabs() } + { this.renderTabs() }
- { this._renderTab() } + { this.renderTab() }
); From 1f670e225c0c71d3afc15be8d289860556f8df00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 10:53:57 +0200 Subject: [PATCH 021/256] Convert StorageEvictedDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...ctedDialog.js => StorageEvictedDialog.tsx} | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) rename src/components/views/dialogs/{StorageEvictedDialog.js => StorageEvictedDialog.tsx} (79%) diff --git a/src/components/views/dialogs/StorageEvictedDialog.js b/src/components/views/dialogs/StorageEvictedDialog.tsx similarity index 79% rename from src/components/views/dialogs/StorageEvictedDialog.js rename to src/components/views/dialogs/StorageEvictedDialog.tsx index 507ee09e75..60ae049bf6 100644 --- a/src/components/views/dialogs/StorageEvictedDialog.js +++ b/src/components/views/dialogs/StorageEvictedDialog.tsx @@ -15,40 +15,37 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; -import * as sdk from '../../../index'; import SdkConfig from '../../../SdkConfig'; import Modal from '../../../Modal'; import { _t } from '../../../languageHandler'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import BaseDialog from "./BaseDialog"; +import DialogButtons from "../elements/DialogButtons"; +import BugReportDialog from "./BugReportDialog"; + +interface IProps { + onFinished: (confirmed: boolean) => void; +} @replaceableComponent("views.dialogs.StorageEvictedDialog") -export default class StorageEvictedDialog extends React.Component { - static propTypes = { - onFinished: PropTypes.func.isRequired, - }; - - _sendBugReport = ev => { +export default class StorageEvictedDialog extends React.Component { + private sendBugReport = (ev: React.MouseEvent): void => { ev.preventDefault(); - const BugReportDialog = sdk.getComponent("dialogs.BugReportDialog"); Modal.createTrackedDialog('Storage evicted', 'Send Bug Report Dialog', BugReportDialog, {}); }; - _onSignOutClick = () => { + private onSignOutClick = (): void => { this.props.onFinished(true); }; - render() { - const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - + public render(): JSX.Element { let logRequest; if (SdkConfig.get().bug_report_endpoint_url) { logRequest = _t( "To help us prevent this in future, please send us logs.", {}, { - a: text => { text }, + a: text => { text }, }, ); } @@ -73,7 +70,7 @@ export default class StorageEvictedDialog extends React.Component { ) } { logRequest }

From 444a0da2973a44e33d186e4fcfed432d6de90a26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 11:58:38 +0200 Subject: [PATCH 022/256] Convert SlashCommandHelpDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...CommandHelpDialog.js => SlashCommandHelpDialog.tsx} | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) rename src/components/views/dialogs/{SlashCommandHelpDialog.js => SlashCommandHelpDialog.tsx} (90%) diff --git a/src/components/views/dialogs/SlashCommandHelpDialog.js b/src/components/views/dialogs/SlashCommandHelpDialog.tsx similarity index 90% rename from src/components/views/dialogs/SlashCommandHelpDialog.js rename to src/components/views/dialogs/SlashCommandHelpDialog.tsx index d21ccbe47f..c47555567e 100644 --- a/src/components/views/dialogs/SlashCommandHelpDialog.js +++ b/src/components/views/dialogs/SlashCommandHelpDialog.tsx @@ -17,11 +17,13 @@ limitations under the License. import React from 'react'; import { _t } from "../../../languageHandler"; import { CommandCategories, Commands } from "../../../SlashCommands"; -import * as sdk from "../../../index"; +import InfoDialog from "./InfoDialog"; -export default ({ onFinished }) => { - const InfoDialog = sdk.getComponent('dialogs.InfoDialog'); +interface IProps { + onFinished: () => void; +} +const SlashCommandHelpDialog: React.FC = ({ onFinished }) => { const categories = {}; Commands.forEach(cmd => { if (!cmd.isEnabled()) return; @@ -62,3 +64,5 @@ export default ({ onFinished }) => { hasCloseButton={true} onFinished={onFinished} />; }; + +export default SlashCommandHelpDialog; From 02f672570a5c5bc9421c76dc5167464be22d269a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 12:02:43 +0200 Subject: [PATCH 023/256] Convert WidgetOpenIDPermissionsDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...g.js => WidgetOpenIDPermissionsDialog.tsx} | 53 ++++++++++--------- 1 file changed, 27 insertions(+), 26 deletions(-) rename src/components/views/dialogs/{WidgetOpenIDPermissionsDialog.js => WidgetOpenIDPermissionsDialog.tsx} (71%) diff --git a/src/components/views/dialogs/WidgetOpenIDPermissionsDialog.js b/src/components/views/dialogs/WidgetOpenIDPermissionsDialog.tsx similarity index 71% rename from src/components/views/dialogs/WidgetOpenIDPermissionsDialog.js rename to src/components/views/dialogs/WidgetOpenIDPermissionsDialog.tsx index 1bc6444ac1..81bd53a32e 100644 --- a/src/components/views/dialogs/WidgetOpenIDPermissionsDialog.js +++ b/src/components/views/dialogs/WidgetOpenIDPermissionsDialog.tsx @@ -15,42 +15,46 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import { _t } from "../../../languageHandler"; -import * as sdk from "../../../index"; import LabelledToggleSwitch from "../elements/LabelledToggleSwitch"; -import { Widget } from "matrix-widget-api"; +import { Widget, WidgetKind } from "matrix-widget-api"; import { OIDCState, WidgetPermissionStore } from "../../../stores/widgets/WidgetPermissionStore"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import DialogButtons from "../elements/DialogButtons"; +import BaseDialog from "./BaseDialog"; + +interface IProps { + onFinished: (confirmed: boolean) => void; + widget: Widget; + widgetKind: WidgetKind; // WidgetKind from widget-api + inRoomId?: string; +} + +interface IState { + rememberSelection: boolean; +} @replaceableComponent("views.dialogs.WidgetOpenIDPermissionsDialog") -export default class WidgetOpenIDPermissionsDialog extends React.Component { - static propTypes = { - onFinished: PropTypes.func.isRequired, - widget: PropTypes.objectOf(Widget).isRequired, - widgetKind: PropTypes.string.isRequired, // WidgetKind from widget-api - inRoomId: PropTypes.string, - }; - - constructor() { - super(); +export default class WidgetOpenIDPermissionsDialog extends React.Component { + constructor(props: IProps) { + super(props); this.state = { rememberSelection: false, }; } - _onAllow = () => { - this._onPermissionSelection(true); + private onAllow = (): void => { + this.onPermissionSelection(true); }; - _onDeny = () => { - this._onPermissionSelection(false); + private onDeny = (): void => { + this.onPermissionSelection(false); }; - _onPermissionSelection(allowed) { + private onPermissionSelection(allowed: boolean): void { if (this.state.rememberSelection) { - console.log(`Remembering ${this.props.widgetId} as allowed=${allowed} for OpenID`); + console.log(`Remembering ${this.props.widget.id} as allowed=${allowed} for OpenID`); WidgetPermissionStore.instance.setOIDCState( this.props.widget, this.props.widgetKind, this.props.inRoomId, @@ -61,14 +65,11 @@ export default class WidgetOpenIDPermissionsDialog extends React.Component { this.props.onFinished(allowed); } - _onRememberSelectionChange = (newVal) => { + private onRememberSelectionChange = (newVal: boolean): void => { this.setState({ rememberSelection: newVal }); }; render() { - const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - return ( } /> From 5bf64c2075e5e09183e89a392cb9478d703fb197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 12:42:18 +0200 Subject: [PATCH 024/256] Convert SetEmailDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../{SetEmailDialog.js => SetEmailDialog.tsx} | 62 ++++++++++--------- 1 file changed, 34 insertions(+), 28 deletions(-) rename src/components/views/dialogs/{SetEmailDialog.js => SetEmailDialog.tsx} (81%) diff --git a/src/components/views/dialogs/SetEmailDialog.js b/src/components/views/dialogs/SetEmailDialog.tsx similarity index 81% rename from src/components/views/dialogs/SetEmailDialog.js rename to src/components/views/dialogs/SetEmailDialog.tsx index 3dad3821fb..506399d15d 100644 --- a/src/components/views/dialogs/SetEmailDialog.js +++ b/src/components/views/dialogs/SetEmailDialog.tsx @@ -16,13 +16,26 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; -import * as sdk from '../../../index'; import * as Email from '../../../email'; import AddThreepid from '../../../AddThreepid'; import { _t } from '../../../languageHandler'; import Modal from '../../../Modal'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import Spinner from "../elements/Spinner"; +import ErrorDialog from "./ErrorDialog"; +import QuestionDialog from "./QuestionDialog"; +import BaseDialog from "./BaseDialog"; +import EditableText from "../elements/EditableText"; + +interface IProps { + title: string; + onFinished: (confirmed: boolean) => void; +} + +interface IState { + emailAddress: string; + emailBusy: boolean; +} /* * Prompt the user to set an email address. @@ -30,26 +43,25 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; * On success, `onFinished(true)` is called. */ @replaceableComponent("views.dialogs.SetEmailDialog") -export default class SetEmailDialog extends React.Component { - static propTypes = { - onFinished: PropTypes.func.isRequired, - }; +export default class SetEmailDialog extends React.Component { + private addThreepid: AddThreepid; - state = { - emailAddress: '', - emailBusy: false, - }; + constructor(props: IProps) { + super(props); - onEmailAddressChanged = value => { + this.state = { + emailAddress: '', + emailBusy: false, + }; + } + + private onEmailAddressChanged = (value: string): void => { this.setState({ emailAddress: value, }); }; - onSubmit = () => { - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); - const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); - + private onSubmit = (): void => { const emailAddress = this.state.emailAddress; if (!Email.looksValid(emailAddress)) { Modal.createTrackedDialog('Invalid Email Address', '', ErrorDialog, { @@ -58,8 +70,8 @@ export default class SetEmailDialog extends React.Component { }); return; } - this._addThreepid = new AddThreepid(); - this._addThreepid.addEmailAddress(emailAddress).then(() => { + this.addThreepid = new AddThreepid(); + this.addThreepid.addEmailAddress(emailAddress).then(() => { Modal.createTrackedDialog('Verification Pending', '', QuestionDialog, { title: _t("Verification Pending"), description: _t( @@ -80,11 +92,11 @@ export default class SetEmailDialog extends React.Component { this.setState({ emailBusy: true }); }; - onCancelled = () => { + private onCancelled = (): void => { this.props.onFinished(false); }; - onEmailDialogFinished = ok => { + private onEmailDialogFinished = (ok: boolean): void => { if (ok) { this.verifyEmailAddress(); } else { @@ -92,13 +104,12 @@ export default class SetEmailDialog extends React.Component { } }; - verifyEmailAddress() { - this._addThreepid.checkEmailLinkClicked().then(() => { + private verifyEmailAddress(): void { + this.addThreepid.checkEmailLinkClicked().then(() => { this.props.onFinished(true); }, (err) => { this.setState({ emailBusy: false }); if (err.errcode == 'M_THREEPID_AUTH_FAILED') { - const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); const message = _t("Unable to verify email address.") + " " + _t("Please check your email and click on the link it contains. Once this is done, click continue."); Modal.createTrackedDialog('Verification Pending', '3pid Auth Failed', QuestionDialog, { @@ -108,7 +119,6 @@ export default class SetEmailDialog extends React.Component { onFinished: this.onEmailDialogFinished, }); } else { - const ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); console.error("Unable to verify email address: " + err); Modal.createTrackedDialog('Unable to verify email address', '', ErrorDialog, { title: _t("Unable to verify email address."), @@ -118,11 +128,7 @@ export default class SetEmailDialog extends React.Component { }); } - render() { - const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - const Spinner = sdk.getComponent('elements.Spinner'); - const EditableText = sdk.getComponent('elements.EditableText'); - + public render(): JSX.Element { const emailInput = this.state.emailBusy ? : Date: Sun, 5 Sep 2021 12:57:41 +0200 Subject: [PATCH 025/256] Convert QuestionDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../{QuestionDialog.js => QuestionDialog.tsx} | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) rename src/components/views/dialogs/{QuestionDialog.js => QuestionDialog.tsx} (76%) diff --git a/src/components/views/dialogs/QuestionDialog.js b/src/components/views/dialogs/QuestionDialog.tsx similarity index 76% rename from src/components/views/dialogs/QuestionDialog.js rename to src/components/views/dialogs/QuestionDialog.tsx index 3d90236b08..df036293f0 100644 --- a/src/components/views/dialogs/QuestionDialog.js +++ b/src/components/views/dialogs/QuestionDialog.tsx @@ -16,29 +16,30 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import classNames from "classnames"; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; -export default class QuestionDialog extends React.Component { - static propTypes = { - title: PropTypes.string, - description: PropTypes.node, - extraButtons: PropTypes.node, - button: PropTypes.string, - buttonDisabled: PropTypes.bool, - danger: PropTypes.bool, - focus: PropTypes.bool, - onFinished: PropTypes.func.isRequired, - headerImage: PropTypes.string, - quitOnly: PropTypes.bool, // quitOnly doesn't show the cancel button just the quit [x]. - fixedWidth: PropTypes.bool, - className: PropTypes.string, - }; +interface IProps { + title?: string; + description?: React.ReactNode; + extraButtons?: React.ReactNode; + button?: string; + buttonDisabled?: boolean; + danger?: boolean; + focus?: boolean; + onFinished: (confirmed: boolean) => void; + headerImage?: string; + quitOnly?: boolean; // quitOnly doesn't show the cancel button just the quit [x]. + fixedWidth?: boolean; + className?: string; + hasCancelButton?: boolean; + cancelButton?: JSX.Element; +} - static defaultProps = { +export default class QuestionDialog extends React.Component { + public static defaultProps: Partial = { title: "", description: "", extraButtons: null, @@ -48,17 +49,19 @@ export default class QuestionDialog extends React.Component { quitOnly: false, }; - onOk = () => { + private onOk = (): void => { this.props.onFinished(true); }; - onCancel = () => { + private onCancel = (): void => { this.props.onFinished(false); }; - render() { + public render(): JSX.Element { + // Converting these to imports breaks wrench tests const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); + let primaryButtonClass = ""; if (this.props.danger) { primaryButtonClass = "danger"; From b396383e06c00877f1fc531d957afdd817158f04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 13:09:29 +0200 Subject: [PATCH 026/256] Convert LazyLoadingResyncDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...LoadingResyncDialog.js => LazyLoadingResyncDialog.tsx} | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) rename src/components/views/dialogs/{LazyLoadingResyncDialog.js => LazyLoadingResyncDialog.tsx} (89%) diff --git a/src/components/views/dialogs/LazyLoadingResyncDialog.js b/src/components/views/dialogs/LazyLoadingResyncDialog.tsx similarity index 89% rename from src/components/views/dialogs/LazyLoadingResyncDialog.js rename to src/components/views/dialogs/LazyLoadingResyncDialog.tsx index a5db15ebbe..c942126d12 100644 --- a/src/components/views/dialogs/LazyLoadingResyncDialog.js +++ b/src/components/views/dialogs/LazyLoadingResyncDialog.tsx @@ -20,7 +20,11 @@ import QuestionDialog from './QuestionDialog'; import { _t } from '../../../languageHandler'; import SdkConfig from '../../../SdkConfig'; -export default (props) => { +interface IProps { + onFinished: () => void; +} + +const LazyLoadingResyncDialog: React.FC = (props: IProps) => { const brand = SdkConfig.get().brand; const description = _t( @@ -38,3 +42,5 @@ export default (props) => { onFinished={props.onFinished} />); }; + +export default LazyLoadingResyncDialog; From b2331d1e21a7d989896560595432974a463a9518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 16:03:08 +0200 Subject: [PATCH 027/256] Convert MessageEditHistoryDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...Dialog.js => MessageEditHistoryDialog.tsx} | 55 +++++++++++-------- 1 file changed, 33 insertions(+), 22 deletions(-) rename src/components/views/dialogs/{MessageEditHistoryDialog.js => MessageEditHistoryDialog.tsx} (84%) diff --git a/src/components/views/dialogs/MessageEditHistoryDialog.js b/src/components/views/dialogs/MessageEditHistoryDialog.tsx similarity index 84% rename from src/components/views/dialogs/MessageEditHistoryDialog.js rename to src/components/views/dialogs/MessageEditHistoryDialog.tsx index 6fce8aecd4..30c16b03bd 100644 --- a/src/components/views/dialogs/MessageEditHistoryDialog.js +++ b/src/components/views/dialogs/MessageEditHistoryDialog.tsx @@ -15,21 +15,37 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import { MatrixClientPeg } from "../../../MatrixClientPeg"; import { _t } from '../../../languageHandler'; -import * as sdk from "../../../index"; import { wantsDateSeparator } from '../../../DateUtils'; import SettingsStore from '../../../settings/SettingsStore'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import { MatrixEvent } from "matrix-js-sdk/src/models/event"; +import BaseDialog from "./BaseDialog"; +import ScrollPanel from "../../structures/ScrollPanel"; +import Spinner from "../elements/Spinner"; +import EditHistoryMessage from "../messages/EditHistoryMessage"; +import DateSeparator from "../messages/DateSeparator"; + +interface IProps { + mxEvent: MatrixEvent; + onFinished: () => void; +} + +interface IState { + originalEvent: MatrixEvent; + error: { + errcode: string; + }; + events: MatrixEvent[]; + nextBatch: string; + isLoading: boolean; + isTwelveHour: boolean; +} @replaceableComponent("views.dialogs.MessageEditHistoryDialog") -export default class MessageEditHistoryDialog extends React.PureComponent { - static propTypes = { - mxEvent: PropTypes.object.isRequired, - }; - - constructor(props) { +export default class MessageEditHistoryDialog extends React.PureComponent { + constructor(props: IProps) { super(props); this.state = { originalEvent: null, @@ -41,7 +57,7 @@ export default class MessageEditHistoryDialog extends React.PureComponent { }; } - loadMoreEdits = async (backwards) => { + private loadMoreEdits = async (backwards?: boolean): Promise => { if (backwards || (!this.state.nextBatch && !this.state.isLoading)) { // bail out on backwards as we only paginate in one direction return false; @@ -53,7 +69,7 @@ export default class MessageEditHistoryDialog extends React.PureComponent { let result; let resolve; let reject; - const promise = new Promise((_resolve, _reject) => {resolve = _resolve; reject = _reject;}); + const promise = new Promise((_resolve, _reject) => {resolve = _resolve; reject = _reject;}); try { result = await client.relations( roomId, eventId, "m.replace", "m.room.message", opts); @@ -67,7 +83,7 @@ export default class MessageEditHistoryDialog extends React.PureComponent { } const newEvents = result.events; - this._locallyRedactEventsIfNeeded(newEvents); + this.locallyRedactEventsIfNeeded(newEvents); this.setState({ originalEvent: this.state.originalEvent || result.originalEvent, events: this.state.events.concat(newEvents), @@ -78,9 +94,9 @@ export default class MessageEditHistoryDialog extends React.PureComponent { resolve(hasMoreResults); }); return promise; - } + }; - _locallyRedactEventsIfNeeded(newEvents) { + private locallyRedactEventsIfNeeded(newEvents: MatrixEvent[]): void { const roomId = this.props.mxEvent.getRoomId(); const client = MatrixClientPeg.get(); const room = client.getRoom(roomId); @@ -95,13 +111,11 @@ export default class MessageEditHistoryDialog extends React.PureComponent { } } - componentDidMount() { + public componentDidMount(): void { this.loadMoreEdits(); } - _renderEdits() { - const EditHistoryMessage = sdk.getComponent('messages.EditHistoryMessage'); - const DateSeparator = sdk.getComponent('messages.DateSeparator'); + private renderEdits(): JSX.Element[] { const nodes = []; let lastEvent; let allEvents = this.state.events; @@ -128,7 +142,7 @@ export default class MessageEditHistoryDialog extends React.PureComponent { return nodes; } - render() { + public render(): JSX.Element { let content; if (this.state.error) { const { error } = this.state; @@ -149,20 +163,17 @@ export default class MessageEditHistoryDialog extends React.PureComponent {

); } } else if (this.state.isLoading) { - const Spinner = sdk.getComponent("elements.Spinner"); content = ; } else { - const ScrollPanel = sdk.getComponent("structures.ScrollPanel"); content = ( -
    { this._renderEdits() }
+
    { this.renderEdits() }
); } - const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); return ( Date: Sun, 5 Sep 2021 16:09:33 +0200 Subject: [PATCH 028/256] Convert IntegrationsDisabledDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...alog.js => IntegrationsDisabledDialog.tsx} | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) rename src/components/views/dialogs/{IntegrationsDisabledDialog.js => IntegrationsDisabledDialog.tsx} (76%) diff --git a/src/components/views/dialogs/IntegrationsDisabledDialog.js b/src/components/views/dialogs/IntegrationsDisabledDialog.tsx similarity index 76% rename from src/components/views/dialogs/IntegrationsDisabledDialog.js rename to src/components/views/dialogs/IntegrationsDisabledDialog.tsx index 6a5b2f08f9..f76ed46577 100644 --- a/src/components/views/dialogs/IntegrationsDisabledDialog.js +++ b/src/components/views/dialogs/IntegrationsDisabledDialog.tsx @@ -15,32 +15,29 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import { _t } from "../../../languageHandler"; -import * as sdk from "../../../index"; import dis from '../../../dispatcher/dispatcher'; import { Action } from "../../../dispatcher/actions"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import BaseDialog from "./BaseDialog"; +import DialogButtons from "../elements/DialogButtons"; + +interface IProps { + onFinished: () => void; +} @replaceableComponent("views.dialogs.IntegrationsDisabledDialog") -export default class IntegrationsDisabledDialog extends React.Component { - static propTypes = { - onFinished: PropTypes.func.isRequired, - }; - - _onAcknowledgeClick = () => { +export default class IntegrationsDisabledDialog extends React.Component { + private onAcknowledgeClick = (): void => { this.props.onFinished(); }; - _onOpenSettingsClick = () => { + private onOpenSettingsClick = (): void => { this.props.onFinished(); dis.fire(Action.ViewUserSettings); }; - render() { - const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - + public render(): JSX.Element { return ( ); From 9e74477771a5b50de721f9c5a57021c6d6097370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 16:11:10 +0200 Subject: [PATCH 029/256] Convert IntegrationsImpossibleDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...log.js => IntegrationsImpossibleDialog.tsx} | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) rename src/components/views/dialogs/{IntegrationsImpossibleDialog.js => IntegrationsImpossibleDialog.tsx} (89%) diff --git a/src/components/views/dialogs/IntegrationsImpossibleDialog.js b/src/components/views/dialogs/IntegrationsImpossibleDialog.tsx similarity index 89% rename from src/components/views/dialogs/IntegrationsImpossibleDialog.js rename to src/components/views/dialogs/IntegrationsImpossibleDialog.tsx index 6cfb96a1b4..36dc42b783 100644 --- a/src/components/views/dialogs/IntegrationsImpossibleDialog.js +++ b/src/components/views/dialogs/IntegrationsImpossibleDialog.tsx @@ -15,23 +15,23 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import { _t } from "../../../languageHandler"; import SdkConfig from "../../../SdkConfig"; import * as sdk from "../../../index"; import { replaceableComponent } from "../../../utils/replaceableComponent"; -@replaceableComponent("views.dialogs.IntegrationsImpossibleDialog") -export default class IntegrationsImpossibleDialog extends React.Component { - static propTypes = { - onFinished: PropTypes.func.isRequired, - }; +interface IProps { + onFinished: () => void; - _onAcknowledgeClick = () => { +} + +@replaceableComponent("views.dialogs.IntegrationsImpossibleDialog") +export default class IntegrationsImpossibleDialog extends React.Component { + private onAcknowledgeClick = (): void => { this.props.onFinished(); }; - render() { + public render(): JSX.Element { const brand = SdkConfig.get().brand; const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); @@ -54,7 +54,7 @@ export default class IntegrationsImpossibleDialog extends React.Component { From aba966034e5dc173637385e9354ff0aec298989f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 16:17:44 +0200 Subject: [PATCH 030/256] Convert LazyLoadingDisabledDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...ngDisabledDialog.js => LazyLoadingDisabledDialog.tsx} | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) rename src/components/views/dialogs/{LazyLoadingDisabledDialog.js => LazyLoadingDisabledDialog.tsx} (90%) diff --git a/src/components/views/dialogs/LazyLoadingDisabledDialog.js b/src/components/views/dialogs/LazyLoadingDisabledDialog.tsx similarity index 90% rename from src/components/views/dialogs/LazyLoadingDisabledDialog.js rename to src/components/views/dialogs/LazyLoadingDisabledDialog.tsx index e43cb28a22..32aaf9c531 100644 --- a/src/components/views/dialogs/LazyLoadingDisabledDialog.js +++ b/src/components/views/dialogs/LazyLoadingDisabledDialog.tsx @@ -20,7 +20,12 @@ import QuestionDialog from './QuestionDialog'; import { _t } from '../../../languageHandler'; import SdkConfig from '../../../SdkConfig'; -export default (props) => { +interface IProps { + onFinished: () => void; + host: string; +} + +const LazyLoadingDisabledDialog: React.FC = (props: IProps) => { const brand = SdkConfig.get().brand; const description1 = _t( "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. " + @@ -49,3 +54,5 @@ export default (props) => { onFinished={props.onFinished} />); }; + +export default LazyLoadingDisabledDialog; From e80939d3e25a4cde9d8938ecefafd951562dab01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 16:27:46 +0200 Subject: [PATCH 031/256] Convert KeySignatureUploadFailedDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ....js => KeySignatureUploadFailedDialog.tsx} | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) rename src/components/views/dialogs/{KeySignatureUploadFailedDialog.js => KeySignatureUploadFailedDialog.tsx} (88%) diff --git a/src/components/views/dialogs/KeySignatureUploadFailedDialog.js b/src/components/views/dialogs/KeySignatureUploadFailedDialog.tsx similarity index 88% rename from src/components/views/dialogs/KeySignatureUploadFailedDialog.js rename to src/components/views/dialogs/KeySignatureUploadFailedDialog.tsx index 6b36c19977..20841c46f4 100644 --- a/src/components/views/dialogs/KeySignatureUploadFailedDialog.js +++ b/src/components/views/dialogs/KeySignatureUploadFailedDialog.tsx @@ -15,20 +15,29 @@ limitations under the License. */ import React, { useState, useCallback, useRef } from 'react'; -import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import SdkConfig from '../../../SdkConfig'; +import BaseDialog from "./BaseDialog"; +import DialogButtons from "../elements/DialogButtons"; +import Spinner from "../elements/Spinner"; -export default function KeySignatureUploadFailedDialog({ +interface IProps { + failures: Record>; + source: string; + continuation: () => void; + onFinished: () => void; +} + +const KeySignatureUploadFailedDialog: React.FC = ({ failures, source, continuation, onFinished, -}) { +}) => { const RETRIES = 2; - const BaseDialog = sdk.getComponent('dialogs.BaseDialog'); - const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - const Spinner = sdk.getComponent('elements.Spinner'); const [retry, setRetry] = useState(RETRIES); const [cancelled, setCancelled] = useState(false); const [retrying, setRetrying] = useState(false); @@ -107,4 +116,6 @@ export default function KeySignatureUploadFailedDialog({ { body } ); -} +}; + +export default KeySignatureUploadFailedDialog; From 4ca2ab11fbac3fdceac6ac8a36c07be73c7b3a7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 16:36:36 +0200 Subject: [PATCH 032/256] Convert ManualDeviceKeyVerificationDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ... => ManualDeviceKeyVerificationDialog.tsx} | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) rename src/components/views/dialogs/{ManualDeviceKeyVerificationDialog.js => ManualDeviceKeyVerificationDialog.tsx} (84%) diff --git a/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.js b/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx similarity index 84% rename from src/components/views/dialogs/ManualDeviceKeyVerificationDialog.js rename to src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx index 4387108fac..a4c989d7b5 100644 --- a/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.js +++ b/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx @@ -19,37 +19,31 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import { MatrixClientPeg } from '../../../MatrixClientPeg'; -import * as sdk from '../../../index'; import * as FormattingUtils from '../../../utils/FormattingUtils'; import { _t } from '../../../languageHandler'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import QuestionDialog from "./QuestionDialog"; +import { DeviceInfo } from "matrix-js-sdk/src/crypto/deviceinfo"; + +interface IProps { + userId: string; + device: DeviceInfo; + onFinished: (confirmed: boolean) => void; +} @replaceableComponent("views.dialogs.ManualDeviceKeyVerificationDialog") -export default class ManualDeviceKeyVerificationDialog extends React.Component { - static propTypes = { - userId: PropTypes.string.isRequired, - device: PropTypes.object.isRequired, - onFinished: PropTypes.func.isRequired, - }; - - _onCancelClick = () => { - this.props.onFinished(false); - } - - _onLegacyFinished = (confirm) => { +export default class ManualDeviceKeyVerificationDialog extends React.Component { + private onLegacyFinished = (confirm: boolean): void => { if (confirm) { MatrixClientPeg.get().setDeviceVerified( this.props.userId, this.props.device.deviceId, true, ); } this.props.onFinished(confirm); - } - - render() { - const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + }; + public render(): JSX.Element { let text; if (MatrixClientPeg.get().getUserId() === this.props.userId) { text = _t("Confirm by comparing the following with the User Settings in your other session:"); @@ -81,7 +75,7 @@ export default class ManualDeviceKeyVerificationDialog extends React.Component { title={_t("Verify session")} description={body} button={_t("Verify session")} - onFinished={this._onLegacyFinished} + onFinished={this.onLegacyFinished} /> ); } From 0285bb555fa2a9530b42ec4221d1ebff851957f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 16:40:46 +0200 Subject: [PATCH 033/256] Convert SessionRestoreErrorDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...ialog.js => SessionRestoreErrorDialog.tsx} | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) rename src/components/views/dialogs/{SessionRestoreErrorDialog.js => SessionRestoreErrorDialog.tsx} (80%) diff --git a/src/components/views/dialogs/SessionRestoreErrorDialog.js b/src/components/views/dialogs/SessionRestoreErrorDialog.tsx similarity index 80% rename from src/components/views/dialogs/SessionRestoreErrorDialog.js rename to src/components/views/dialogs/SessionRestoreErrorDialog.tsx index eeeadbbfe5..752b023f0b 100644 --- a/src/components/views/dialogs/SessionRestoreErrorDialog.js +++ b/src/components/views/dialogs/SessionRestoreErrorDialog.tsx @@ -17,27 +17,27 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; -import * as sdk from '../../../index'; import SdkConfig from '../../../SdkConfig'; import Modal from '../../../Modal'; import { _t } from '../../../languageHandler'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import QuestionDialog from "./QuestionDialog"; +import BugReportDialog from "./BugReportDialog"; +import BaseDialog from "./BaseDialog"; +import DialogButtons from "../elements/DialogButtons"; + +interface IProps { + error: string; + onFinished: () => void; +} @replaceableComponent("views.dialogs.SessionRestoreErrorDialog") -export default class SessionRestoreErrorDialog extends React.Component { - static propTypes = { - error: PropTypes.string.isRequired, - onFinished: PropTypes.func.isRequired, - }; - - _sendBugReport = () => { - const BugReportDialog = sdk.getComponent("dialogs.BugReportDialog"); +export default class SessionRestoreErrorDialog extends React.Component { + private sendBugReport = (): void => { Modal.createTrackedDialog('Session Restore Error', 'Send Bug Report Dialog', BugReportDialog, {}); }; - _onClearStorageClick = () => { - const QuestionDialog = sdk.getComponent("dialogs.QuestionDialog"); + private onClearStorageClick = (): void => { Modal.createTrackedDialog('Session Restore Confirm Logout', '', QuestionDialog, { title: _t("Sign out"), description: @@ -48,19 +48,17 @@ export default class SessionRestoreErrorDialog extends React.Component { }); }; - _onRefreshClick = () => { + private onRefreshClick = (): void => { // Is this likely to help? Probably not, but giving only one button // that clears your storage seems awful. - window.location.reload(true); + window.location.reload(); }; - render() { + public render(): JSX.Element { const brand = SdkConfig.get().brand; - const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); const clearStorageButton = ( - ); @@ -68,7 +66,7 @@ export default class SessionRestoreErrorDialog extends React.Component { let dialogButtons; if (SdkConfig.get().bug_report_endpoint_url) { dialogButtons = @@ -76,7 +74,7 @@ export default class SessionRestoreErrorDialog extends React.Component { ; } else { dialogButtons = From 5967811cda85c00f00d788a28147b78768a77abc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 16:57:36 +0200 Subject: [PATCH 034/256] Convert InteractiveAuthDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...uthDialog.js => InteractiveAuthDialog.tsx} | 139 ++++++++++-------- 1 file changed, 74 insertions(+), 65 deletions(-) rename src/components/views/dialogs/{InteractiveAuthDialog.js => InteractiveAuthDialog.tsx} (65%) diff --git a/src/components/views/dialogs/InteractiveAuthDialog.js b/src/components/views/dialogs/InteractiveAuthDialog.tsx similarity index 65% rename from src/components/views/dialogs/InteractiveAuthDialog.js rename to src/components/views/dialogs/InteractiveAuthDialog.tsx index e5f4887f06..e9667c84b5 100644 --- a/src/components/views/dialogs/InteractiveAuthDialog.js +++ b/src/components/views/dialogs/InteractiveAuthDialog.tsx @@ -17,69 +17,82 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; -import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import AccessibleButton from '../elements/AccessibleButton'; -import { ERROR_USER_CANCELLED } from "../../structures/InteractiveAuth"; +import InteractiveAuth, { ERROR_USER_CANCELLED } from "../../structures/InteractiveAuth"; import { SSOAuthEntry } from "../auth/InteractiveAuthEntryComponents"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import { MatrixClient } from "matrix-js-sdk/src/client"; +import BaseDialog from "./BaseDialog"; +import { IAuthData } from "matrix-js-sdk/src/interactive-auth"; + +interface IProps { + // matrix client to use for UI auth requests + matrixClient: MatrixClient; + + // response from initial request. If not supplied, will do a request on + // mount. + authData?: { + flows: []; + params: {}; + session: string; + }; + + // callback + makeRequest: (auth: IAuthData) => Promise; + + onFinished: (confirmed: boolean, result?) => void; + + // Optional title and body to show when not showing a particular stage + title?: string; + body?: string; + + // Optional title and body pairs for particular stages and phases within + // those stages. Object structure/example is: + // { + // "org.example.stage_type": { + // 1: { + // "body": "This is a body for phase 1" of org.example.stage_type, + // "title": "Title for phase 1 of org.example.stage_type" + // }, + // 2: { + // "body": "This is a body for phase 2 of org.example.stage_type", + // "title": "Title for phase 2 of org.example.stage_type" + // "continueText": "Confirm identity with Example Auth", + // "continueKind": "danger" + // } + // } + // } + // + // Default is defined in _getDefaultDialogAesthetics() + aestheticsForStagePhases?: {}; +} + +interface IState { + authError: Error; + + // See _onUpdateStagePhase() + uiaStage: number; + uiaStagePhase: number; +} @replaceableComponent("views.dialogs.InteractiveAuthDialog") -export default class InteractiveAuthDialog extends React.Component { - static propTypes = { - // matrix client to use for UI auth requests - matrixClient: PropTypes.object.isRequired, +export default class InteractiveAuthDialog extends React.Component { + constructor(props: IProps) { + super(props); - // response from initial request. If not supplied, will do a request on - // mount. - authData: PropTypes.shape({ - flows: PropTypes.array, - params: PropTypes.object, - session: PropTypes.string, - }), + this.state = { + authError: null, - // callback - makeRequest: PropTypes.func.isRequired, + // See _onUpdateStagePhase() + uiaStage: null, + uiaStagePhase: null, + }; + } - onFinished: PropTypes.func.isRequired, - - // Optional title and body to show when not showing a particular stage - title: PropTypes.string, - body: PropTypes.string, - - // Optional title and body pairs for particular stages and phases within - // those stages. Object structure/example is: - // { - // "org.example.stage_type": { - // 1: { - // "body": "This is a body for phase 1" of org.example.stage_type, - // "title": "Title for phase 1 of org.example.stage_type" - // }, - // 2: { - // "body": "This is a body for phase 2 of org.example.stage_type", - // "title": "Title for phase 2 of org.example.stage_type" - // "continueText": "Confirm identity with Example Auth", - // "continueKind": "danger" - // } - // } - // } - // - // Default is defined in _getDefaultDialogAesthetics() - aestheticsForStagePhases: PropTypes.object, - }; - - state = { - authError: null, - - // See _onUpdateStagePhase() - uiaStage: null, - uiaStagePhase: null, - }; - - _getDefaultDialogAesthetics() { + private getDefaultDialogAesthetics() { const ssoAesthetics = { [SSOAuthEntry.PHASE_PREAUTH]: { title: _t("Use Single Sign On to continue"), @@ -101,7 +114,7 @@ export default class InteractiveAuthDialog extends React.Component { }; } - _onAuthFinished = (success, result) => { + private onAuthFinished = (success: boolean, result: Error): void => { if (success) { this.props.onFinished(true, result); } else { @@ -115,19 +128,16 @@ export default class InteractiveAuthDialog extends React.Component { } }; - _onUpdateStagePhase = (newStage, newPhase) => { + private onUpdateStagePhase = (newStage, newPhase): void => { // We copy the stage and stage phase params into state for title selection in render() this.setState({ uiaStage: newStage, uiaStagePhase: newPhase }); }; - _onDismissClick = () => { + private onDismissClick = (): void => { this.props.onFinished(false); }; - render() { - const InteractiveAuth = sdk.getComponent("structures.InteractiveAuth"); - const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); - + public render(): JSX.Element { // Let's pick a title, body, and other params text that we'll show to the user. The order // is most specific first, so stagePhase > our props > defaults. @@ -135,7 +145,7 @@ export default class InteractiveAuthDialog extends React.Component { let body = this.state.authError ? null : this.props.body; let continueText = null; let continueKind = null; - const dialogAesthetics = this.props.aestheticsForStagePhases || this._getDefaultDialogAesthetics(); + const dialogAesthetics = this.props.aestheticsForStagePhases || this.getDefaultDialogAesthetics(); if (!this.state.authError && dialogAesthetics) { if (dialogAesthetics[this.state.uiaStage]) { const aesthetics = dialogAesthetics[this.state.uiaStage][this.state.uiaStagePhase]; @@ -152,9 +162,9 @@ export default class InteractiveAuthDialog extends React.Component {
{ this.state.authError.message || this.state.authError.toString() }

- { _t("Dismiss") } @@ -165,12 +175,11 @@ export default class InteractiveAuthDialog extends React.Component {
{ body } From ae631f9fce392987d6e5dfaa37ee9e39b24a4968 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Sun, 5 Sep 2021 17:15:33 +0200 Subject: [PATCH 035/256] Convert IncomingSasDialog to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...mingSasDialog.js => IncomingSasDialog.tsx} | 133 ++++++++++-------- 1 file changed, 73 insertions(+), 60 deletions(-) rename src/components/views/dialogs/{IncomingSasDialog.js => IncomingSasDialog.tsx} (69%) diff --git a/src/components/views/dialogs/IncomingSasDialog.js b/src/components/views/dialogs/IncomingSasDialog.tsx similarity index 69% rename from src/components/views/dialogs/IncomingSasDialog.js rename to src/components/views/dialogs/IncomingSasDialog.tsx index a5c9f2107f..8903b00221 100644 --- a/src/components/views/dialogs/IncomingSasDialog.js +++ b/src/components/views/dialogs/IncomingSasDialog.tsx @@ -15,12 +15,17 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import { MatrixClientPeg } from '../../../MatrixClientPeg'; -import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; import { replaceableComponent } from "../../../utils/replaceableComponent"; import { mediaFromMxc } from "../../../customisations/Media"; +import VerificationComplete from "../verification/VerificationComplete"; +import VerificationCancelled from "../verification/VerificationCancelled"; +import BaseAvatar from "../avatars/BaseAvatar"; +import Spinner from "../elements/Spinner"; +import VerificationShowSas from "../verification/VerificationShowSas"; +import BaseDialog from "./BaseDialog"; +import DialogButtons from "../elements/DialogButtons"; const PHASE_START = 0; const PHASE_SHOW_SAS = 1; @@ -28,13 +33,28 @@ const PHASE_WAIT_FOR_PARTNER_TO_CONFIRM = 2; const PHASE_VERIFIED = 3; const PHASE_CANCELLED = 4; -@replaceableComponent("views.dialogs.IncomingSasDialog") -export default class IncomingSasDialog extends React.Component { - static propTypes = { - verifier: PropTypes.object.isRequired, - }; +interface IProps { + verifier: any; // TODO types + onFinished: (confirmed: boolean) => void; +} - constructor(props) { +interface IState { + phase: number; + sasVerified: boolean; + opponentProfile: { + // eslint-disable-next-line camelcase + avatar_url?: string; + displayname?: string; + }; + opponentProfileError: Error; + sas: any; // TODO types +} + +@replaceableComponent("views.dialogs.IncomingSasDialog") +export default class IncomingSasDialog extends React.Component { + private showSasEvent: any; // TODO: Types + + constructor(props: IProps) { super(props); let phase = PHASE_START; @@ -43,26 +63,27 @@ export default class IncomingSasDialog extends React.Component { phase = PHASE_CANCELLED; } - this._showSasEvent = null; + this.showSasEvent = null; this.state = { phase: phase, sasVerified: false, opponentProfile: null, opponentProfileError: null, + sas: null, }; - this.props.verifier.on('show_sas', this._onVerifierShowSas); - this.props.verifier.on('cancel', this._onVerifierCancel); - this._fetchOpponentProfile(); + this.props.verifier.on('show_sas', this.onVerifierShowSas); + this.props.verifier.on('cancel', this.onVerifierCancel); + this.fetchOpponentProfile(); } - componentWillUnmount() { + public componentWillUnmount(): void { if (this.state.phase !== PHASE_CANCELLED && this.state.phase !== PHASE_VERIFIED) { this.props.verifier.cancel('User cancel'); } - this.props.verifier.removeListener('show_sas', this._onVerifierShowSas); + this.props.verifier.removeListener('show_sas', this.onVerifierShowSas); } - async _fetchOpponentProfile() { + private async fetchOpponentProfile(): Promise { try { const prof = await MatrixClientPeg.get().getProfileInfo( this.props.verifier.userId, @@ -77,53 +98,51 @@ export default class IncomingSasDialog extends React.Component { } } - _onFinished = () => { + private onFinished = (): void => { this.props.onFinished(this.state.phase === PHASE_VERIFIED); - } + }; - _onCancelClick = () => { + private onCancelClick = (): void => { this.props.onFinished(this.state.phase === PHASE_VERIFIED); - } + }; - _onContinueClick = () => { + private onContinueClick = (): void => { this.setState({ phase: PHASE_WAIT_FOR_PARTNER_TO_CONFIRM }); this.props.verifier.verify().then(() => { this.setState({ phase: PHASE_VERIFIED }); }).catch((e) => { console.log("Verification failed", e); }); - } + }; - _onVerifierShowSas = (e) => { - this._showSasEvent = e; + // TODO: Types + private onVerifierShowSas = (e): void => { + this.showSasEvent = e; this.setState({ phase: PHASE_SHOW_SAS, sas: e.sas, }); - } + }; - _onVerifierCancel = (e) => { + // TODO: Types + private onVerifierCancel = (e): void => { this.setState({ phase: PHASE_CANCELLED, }); - } + }; - _onSasMatchesClick = () => { - this._showSasEvent.confirm(); + private onSasMatchesClick = (): void => { + this.showSasEvent.confirm(); this.setState({ phase: PHASE_WAIT_FOR_PARTNER_TO_CONFIRM, }); - } + }; - _onVerifiedDoneClick = () => { + private onVerifiedDoneClick = (): void => { this.props.onFinished(true); - } - - _renderPhaseStart() { - const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); - const Spinner = sdk.getComponent("views.elements.Spinner"); - const BaseAvatar = sdk.getComponent("avatars.BaseAvatar"); + }; + private renderPhaseStart(): JSX.Element { const isSelf = this.props.verifier.userId === MatrixClientPeg.get().getUserId(); let profile; @@ -190,27 +209,24 @@ export default class IncomingSasDialog extends React.Component {
); } - _renderPhaseShowSas() { - const VerificationShowSas = sdk.getComponent('views.verification.VerificationShowSas'); + private renderPhaseShowSas(): JSX.Element { return ; } - _renderPhaseWaitForPartnerToConfirm() { - const Spinner = sdk.getComponent("views.elements.Spinner"); - + private renderPhaseWaitForPartnerToConfirm(): JSX.Element { return (
@@ -219,41 +235,38 @@ export default class IncomingSasDialog extends React.Component { ); } - _renderPhaseVerified() { - const VerificationComplete = sdk.getComponent('views.verification.VerificationComplete'); - return ; + private renderPhaseVerified(): JSX.Element { + return ; } - _renderPhaseCancelled() { - const VerificationCancelled = sdk.getComponent('views.verification.VerificationCancelled'); - return ; + private renderPhaseCancelled(): JSX.Element { + return ; } - render() { + public render(): JSX.Element { let body; switch (this.state.phase) { case PHASE_START: - body = this._renderPhaseStart(); + body = this.renderPhaseStart(); break; case PHASE_SHOW_SAS: - body = this._renderPhaseShowSas(); + body = this.renderPhaseShowSas(); break; case PHASE_WAIT_FOR_PARTNER_TO_CONFIRM: - body = this._renderPhaseWaitForPartnerToConfirm(); + body = this.renderPhaseWaitForPartnerToConfirm(); break; case PHASE_VERIFIED: - body = this._renderPhaseVerified(); + body = this.renderPhaseVerified(); break; case PHASE_CANCELLED: - body = this._renderPhaseCancelled(); + body = this.renderPhaseCancelled(); break; } - const BaseDialog = sdk.getComponent("dialogs.BaseDialog"); return ( { body } From 4126d7ec69754685d4cb8df32ccb16e2212b044d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9E=D0=BB=D0=B5=D0=B3=20=D0=9A=D0=BE=D1=80=D0=B0=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=80=D0=B0?= Date: Tue, 7 Sep 2021 12:00:25 +0000 Subject: [PATCH 036/256] Translated using Weblate (Ukrainian) Currently translated at 51.5% (1624 of 3151 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index f559f78d7d..282d55218a 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1120,7 +1120,7 @@ "%(brand)s can't securely cache encrypted messages locally while running in a web browser. Use %(brand)s Desktop for encrypted messages to appear in search results.": "%(brand)s не може безпечно локально кешувати зашифровані повідомлення під час виконання у переглядачі. Користуйтесь %(brand)s Desktop, в якому зашифровані повідомлення з'являються у результатах пошуку.", "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Ви впевнені? Ви загубите ваші зашифровані повідомлення якщо копія ключів не була зроблена коректно.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Зашифровані повідомлення захищені наскрізним шифруванням. Лише ви та отримувачі повідомлень мають ключі для їх читання.", - "Display Name": "Видиме ім'я", + "Display Name": "Псевдонім", "wait and try again later": "зачекайте та спопробуйте ще раз пізніше", "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.": "Якщо ви увімкнете шифрування для кімнати, його неможливо буде вимкнути. Надіслані у зашифровану кімнату повідомлення будуть прочитними тільки для учасників кімнати, натомість для сервера вони будуть непрочитними. Увімкнення шифрування може унеможливити роботу ботів та мостів. Дізнатись більше про шифрування.", "Encrypted": "Зашифроване", From bff80cae0f0697d7a3b6a41c0d678bfc35607f98 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 7 Sep 2021 12:00:40 +0000 Subject: [PATCH 037/256] Translated using Weblate (Ukrainian) Currently translated at 51.5% (1624 of 3151 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 282d55218a..15f55d3d19 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1120,7 +1120,7 @@ "%(brand)s can't securely cache encrypted messages locally while running in a web browser. Use %(brand)s Desktop for encrypted messages to appear in search results.": "%(brand)s не може безпечно локально кешувати зашифровані повідомлення під час виконання у переглядачі. Користуйтесь %(brand)s Desktop, в якому зашифровані повідомлення з'являються у результатах пошуку.", "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Ви впевнені? Ви загубите ваші зашифровані повідомлення якщо копія ключів не була зроблена коректно.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Зашифровані повідомлення захищені наскрізним шифруванням. Лише ви та отримувачі повідомлень мають ключі для їх читання.", - "Display Name": "Псевдонім", + "Display Name": "Показуване ім'я", "wait and try again later": "зачекайте та спопробуйте ще раз пізніше", "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.": "Якщо ви увімкнете шифрування для кімнати, його неможливо буде вимкнути. Надіслані у зашифровану кімнату повідомлення будуть прочитними тільки для учасників кімнати, натомість для сервера вони будуть непрочитними. Увімкнення шифрування може унеможливити роботу ботів та мостів. Дізнатись більше про шифрування.", "Encrypted": "Зашифроване", From 0794bc01855155d15a2444410678bb453c86c880 Mon Sep 17 00:00:00 2001 From: random Date: Tue, 7 Sep 2021 09:36:38 +0000 Subject: [PATCH 038/256] Translated using Weblate (Italian) Currently translated at 99.9% (3150 of 3151 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 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 1ea18cd5ac..c8c2bfe999 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -3693,5 +3693,13 @@ "Show threads": "Mostra argomenti", "Threaded messaging": "Messaggi raggruppati", "The above, but in any room you are joined or invited to as well": "Quanto sopra, ma anche in qualsiasi stanza tu sia entrato o invitato", - "The above, but in as well": "Quanto sopra, ma anche in " + "The above, but in as well": "Quanto sopra, ma anche in ", + "Currently, %(count)s spaces have access|one": "Attualmente, uno spazio ha accesso", + "& %(count)s more|one": "e altri %(count)s", + "Autoplay videos": "Auto-riproduci i video", + "Autoplay GIFs": "Auto-riproduci le GIF", + "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s ha tolto un messaggio ancorato da questa stanza. Vedi tutti i messaggi ancorati.", + "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s ha tolto un messaggio ancorato da questa stanza. Vedi tutti i messaggi ancorati.", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s ha ancorato un messaggio a questa stanza. Vedi tutti i messaggi ancorati.", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s ha ancorato un messaggio a questa stanza. Vedi tutti i messaggi ancorati." } From 4f1c16873ad02bb3b8121d7454ded9aeae2ca75b Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Tue, 7 Sep 2021 09:37:17 +0000 Subject: [PATCH 039/256] Translated using Weblate (Albanian) Currently translated at 99.6% (3141 of 3151 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 937461dbc7..f74108bbd5 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -3672,7 +3672,7 @@ "Are you sure you want to add encryption to this public room?": "A jeni i sigurt se doni të shtohet fshehtëzim në këtë dhomë publike?", "Thumbs up": "", "Remain on your screen while running": "Rrini në ekran për deri sa është hapur", - "Remain on your screen when viewing another room, when running": "Rrini në ekran për deri sa jeni duke shikuar një dhomë tjetër", + "Remain on your screen when viewing another room, when running": "", "It's not recommended to make encrypted rooms public. It will mean anyone can find and join the room, so anyone can read messages. You'll get none of the benefits of encryption. Encrypting messages in a public room will make receiving and sending messages slower.": "Nuk rekomandohet të bëhen publike dhoma të fshehtëzuara. Kjo do të thoshte se cilido mund të gjejë dhe hyjë te dhoma, pra cilido mund të lexojë mesazhet. S’do të përfitoni asnjë nga të mirat e fshehtëzimit. Fshehtëzimi i mesazheve në një dhomë publike do ta ngadalësojë marrjen dhe dërgimin e tyre.", "Are you sure you want to make this encrypted room public?": "Jeni i sigurt se doni ta bëni publike këtë dhomë të fshehtëzuar?", "To avoid these issues, create a new encrypted room for the conversation you plan to have.": "Për të shmangur këto probleme, krijoni një dhomë të re të fshehtëzuar për bisedën që keni në plan të bëni.", From 792d1cd3771cf801fa5b0e63b7c917e96b8dab12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sim=C3=B3=20Albert=20i=20Beltran?= Date: Tue, 7 Sep 2021 13:59:45 +0000 Subject: [PATCH 040/256] Translated using Weblate (Catalan) Currently translated at 23.9% (756 of 3151 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index 01d082b6a2..527176e17d 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -594,7 +594,7 @@ "Files": "Fitxers", "You are not receiving desktop notifications": "No esteu rebent notificacions d'escriptori", "Friday": "Divendres", - "Update": "Actualització", + "Update": "Actualitzar", "What's New": "Novetats", "On": "Engegat", "Changelog": "Registre de canvis", From b7490f6a8af8c07c4921d0c279ce34ca41304a6c Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 7 Sep 2021 15:53:39 +0000 Subject: [PATCH 041/256] Translated using Weblate (Ukrainian) Currently translated at 52.6% (1660 of 3151 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 66 +++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 15f55d3d19..3cc26576aa 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -74,7 +74,7 @@ "Email": "е-пошта", "Email address": "Адреса е-пошти", "Failed to send email": "Помилка надсилання електронного листа", - "Edit": "Відредагувати", + "Edit": "Змінити", "Unpin Message": "Відкріпити повідомлення", "Register": "Зареєструватися", "Rooms": "Кімнати", @@ -392,8 +392,8 @@ "Incorrect verification code": "Неправильний код перевірки", "Submit": "Надіслати", "Phone": "Телефон", - "Failed to upload profile picture!": "Не вдалося відвантажити зображення профілю!", - "Upload new:": "Відвантажити нову:", + "Failed to upload profile picture!": "Не вдалося вивантажити зображення профілю!", + "Upload new:": "Вивантажити нову:", "No display name": "Немає видимого імені", "New passwords don't match": "Нові паролі не збігаються", "Passwords can't be empty": "Пароль не може бути пустим", @@ -407,7 +407,7 @@ "Failed to set display name": "Не вдалося зазначити видиме ім'я", "The maximum permitted number of widgets have already been added to this room.": "Максимально дозволену кількість віджетів уже додано до цієї кімнати.", "Drop File Here": "Киньте файл сюди", - "Drop file here to upload": "Киньте файл сюди, щоб відвантажити", + "Drop file here to upload": "Перетягніть сюди файл, щоб вивантажити", " (unsupported)": " (не підтримується)", "Join as voice or video.": "Приєднатися голосом або відео.", "Ongoing conference call%(supportedText)s.": "Триває дзвінок-конференція%(supportedText)s.", @@ -434,7 +434,7 @@ "Failed to change power level": "Не вдалося змінити рівень повноважень", "Chat with %(brand)s Bot": "Бесіда з %(brand)s-ботом", "Whether or not you're logged in (we don't record your username)": "Незалежно від того, увійшли ви чи ні (ми не записуємо ваше ім'я користувача)", - "The file '%(fileName)s' failed to upload.": "Файл '%(fileName)s' не вийшло відвантажити.", + "The file '%(fileName)s' failed to upload.": "Не вдалося вивантажити файл '%(fileName)s'.", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Файл '%(fileName)s' перевищує ліміт розміру для відвантажень домашнього сервера", "The server does not support the room version specified.": "Сервер не підтримує вказану версію кімнати.", "Add Email Address": "Додати адресу е-пошти", @@ -445,7 +445,7 @@ "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.": "Також ви можете спробувати використати публічний сервер turn.matrix.org, але це буде не настільки надійно, а також цей сервер матиме змогу бачити вашу IP-адресу. Ви можете керувати цим у налаштуваннях.", "Try using turn.matrix.org": "Спробуйте використати turn.matrix.org", "Replying With Files": "Відповісти файлами", - "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Зараз неможливо відповісти файлом. Хочете відвантажити цей файл без відповіді?", + "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Зараз неможливо відповісти з файлом. Хочете вивантажити цей файл без відповіді?", "Name or Matrix ID": "Імʼя або Matrix ID", "Identity server has no terms of service": "Сервер ідентифікації не має умов надання послуг", "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.": "Щоб підтвердити адресу е-пошти або телефон ця дія потребує доступу до типового серверу ідентифікації , але сервер не має жодних умов надання послуг.", @@ -479,7 +479,7 @@ "Your %(brand)s is misconfigured": "Ваш %(brand)s налаштовано неправильно", "Join the discussion": "Приєднатися до обговорення", "Upload": "Обрати", - "Upload file": "Відвантажити файл", + "Upload file": "Вивантажити файл", "Send an encrypted message…": "Надіслати зашифроване повідомлення…", "The conversation continues here.": "Розмова триває тут.", "This room has been replaced and is no longer active.": "Ця кімната була замінена і не є активною.", @@ -496,15 +496,15 @@ "Clear Storage and Sign Out": "Очистити сховище та вийти", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Очищення сховища вашого переглядача може усунути проблему, але воно виведе вас з системи та зробить непрочитною історію ваших зашифрованих листувань.", "Verification Pending": "Очікується перевірка", - "Upload files (%(current)s of %(total)s)": "Відвантажити файли (%(current)s з %(total)s)", - "Upload files": "Відвантажити файли", - "Upload all": "Відвантажити всі", + "Upload files (%(current)s of %(total)s)": "Вивантажити файли (%(current)s з %(total)s)", + "Upload files": "Вивантажити файли", + "Upload all": "Вивантажити всі", "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "Файл є надто великим для відвантаження. Допустимий розмір файлів — %(limit)s, але цей файл займає %(sizeOfThisFile)s.", "These files are too large to upload. The file size limit is %(limit)s.": "Ці файли є надто великими для відвантаження. Допустимий розмір файлів — %(limit)s.", "Some files are too large to be uploaded. The file size limit is %(limit)s.": "Деякі файли є надто великими для відвантаження. Допустимий розмір файлів — %(limit)s.", - "Upload %(count)s other files|other": "Відвантажити %(count)s інших файли(ів)", + "Upload %(count)s other files|other": "Вивантажити %(count)s інших файлів", "Upload Error": "Помилка відвантаження", - "Failed to upload image": "Не вдалось відвантажити зображення", + "Failed to upload image": "Не вдалось вивантажити зображення", "Upload avatar": "Завантажити аватар", "For security, this session has been signed out. Please sign in again.": "З метою безпеки ваш сеанс було завершено. Увійдіть знову.", "Upload an avatar:": "Завантажити аватар:", @@ -543,7 +543,7 @@ "Setting up keys": "Налаштовування ключів", "Verify this session": "Звірити цей сеанс", "Sign In or Create Account": "Увійти або створити обліковий запис", - "Use your account or create a new one to continue.": "Скористайтесь вашим обліковим записом або створіть нову, щоб продовжити.", + "Use your account or create a new one to continue.": "Скористайтесь вашим обліковим записом або створіть новий, щоб продовжити.", "Create Account": "Створити обліковий запис", "Sign In": "Увійти", "Verify all your sessions to ensure your account & messages are safe": "Звірте усі ваші сеанси, аби переконатись, що ваш обліковий запис і повідомлення у безпеці", @@ -630,7 +630,7 @@ "Please enter verification code sent via text.": "Введіть код перевірки, надісланий у текстовому повідомленні.", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Текстове повідомлення надіслано на номер +%(msisdn)s. Введіть код перевірки з нього.", "Messages in this room are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Повідомлення у цій кімнаті захищені наскрізним шифруванням. Тільки ви та одержувачі мають ключі для прочитання цих повідомлень.", - "Messages in this room are end-to-end encrypted.": "Повідомлення у цій кімнаті наскрізно зашифровані.", + "Messages in this room are end-to-end encrypted.": "Повідомлення у цій кімнаті захищено наскрізним шифруванням.", "Messages in this room are not end-to-end encrypted.": "Повідомлення у цій кімнаті не захищено наскрізним шифруванням.", "Encryption enabled": "Шифрування увімкнено", "Messages in this room are end-to-end encrypted. Learn more & verify this user in their user profile.": "Повідомлення у цій кімнаті наскрізно зашифровані. Дізнайтеся більше та звіртеся з цим користувачем через його профіль.", @@ -1848,5 +1848,41 @@ "Safeguard against losing access to encrypted messages & data by backing up encryption keys on your server.": "Захистіться від втрати доступу до зашифрованих повідомлень і даних створенням резервної копії ключів шифрування на своєму сервері.", "Secure Backup": "Безпечне резервне копіювання", "Give feedback.": "Надіслати відгук.", - "You may contact me if you have any follow up questions": "Можете зв’язатися зі мною, якщо у вас виникнуть додаткові запитання" + "You may contact me if you have any follow up questions": "Можете зв’язатися зі мною, якщо у вас виникнуть додаткові запитання", + "We sent the others, but the below people couldn't be invited to ": "Ми надіслали іншим, але вказаних людей, не вдалося запросити до ", + "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.": "Ваш домашній сервер намагався відхилити спробу вашого входу. Це може бути пов'язано з занадто тривалим часом входу. Повторіть спробу. Якщо це триватиме й далі, зверніться до адміністратора домашнього сервера.", + "Your homeserver was unreachable and was not able to log you in. Please try again. If this continues, please contact your homeserver administrator.": "Ваш домашній сервер був недоступний і вхід не виконано. Повторіть спробу. Якщо це триватиме й далі, зверніться до адміністратора свого домашнього сервера.", + "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.": "Ми попросили переглядач запам’ятати, який домашній сервер ви використовуєте, щоб дозволити вам увійти, але, на жаль, ваш переглядач забув його. Перейдіть на сторінку входу та повторіть спробу.", + "You've successfully verified %(deviceName)s (%(deviceId)s)!": "Ви успішно підтвердили %(deviceName)s (%(deviceId)s)!", + "You've successfully verified your device!": "Ви успішно підтвердили свій пристрій!", + "You've successfully verified %(displayName)s!": "Ви успішно підтвердили %(displayName)s!", + "Almost there! Is %(displayName)s showing the same shield?": "Майже готово! Ваш %(displayName)s показує той самий щит?", + "Almost there! Is your other session showing the same shield?": "Майже готово! Ваш інший сеанс показує той самий щит?", + "Verify by scanning": "Підтвердити скануванням", + "Remove recent messages by %(user)s": "Вилучити останні повідомлення від %(user)s", + "Remove recent messages": "Видалити останні повідомлення", + "Edit devices": "Керувати пристроями", + "Home": "Домівка", + "New here? Create an account": "Вперше тут? Створіть обліковий запис", + "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.": "Ви можете використовувати власні опції сервера для входу на інші сервери Matrix, вказавши іншу URL-адресу домашнього сервера. Це дозволяє користуватись Element із наявним обліковим записом Matrix на іншому домашньому сервері.", + "Server Options": "Опції сервера", + "Verify your identity to access encrypted messages and prove your identity to others.": "Підтвердьте свою особу, щоб отримати доступ до зашифрованих повідомлень і довести свою справжність іншим.", + "Allow this widget to verify your identity": "Дозволити цьому віджету перевіряти вашу особу", + "Verify this login": "Підтвердити цей вхід", + "Verify other login": "Підтвердити інший вхід", + "Use another login": "Інший обліковий запис", + "Use Security Key": "Використати ключ безпеки", + "Without verifying, you won’t have access to all your messages and may appear as untrusted to others.": "Без підтвердження ви не матимете доступу до всіх своїх повідомлень, а інші бачитимуть вас ненадійними.", + "New? Create account": "Вперше тут? Створіть обліковий запис", + "Forgotten your password?": "Забули свій пароль?", + "Forgot password?": "Забули пароль?", + " invited you": " запрошує вас", + "Username": "Ім'я користувача", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s або %(usernamePassword)s", + "Sign in with": "Увійти за допомогою", + "Sign in with SSO": "Увійти за допомогою SSO", + "Sign in": "Увійти", + "Got an account? Sign in": "Маєте обліковий запис? Увійти", + "Sign in instead": "Натомість увійти", + "Homeserver": "Домашній сервер" } From 0d4455551ce5ac4a33f68148849b3ddb8a7a1e56 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 7 Sep 2021 18:20:34 +0000 Subject: [PATCH 042/256] Translated using Weblate (Ukrainian) Currently translated at 52.8% (1664 of 3151 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 3cc26576aa..a4e24b02ec 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -1884,5 +1884,9 @@ "Sign in": "Увійти", "Got an account? Sign in": "Маєте обліковий запис? Увійти", "Sign in instead": "Натомість увійти", - "Homeserver": "Домашній сервер" + "Homeserver": "Домашній сервер", + "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s відкріплює повідомлення з цієї кімнати. Перегляньте всі прикріплені повідомлення.", + "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s відкріплює повідомлення з цієї кімнати. Перегляньте всі прикріплені повідомлення.", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s прикріплює повідомлення до цієї кімнати. Перегляньте всі прикріплені повідомлення.", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s прикріплює повідомлення до цієї кімнати. Перегляньте всі прикріплені повідомлення." } From 1583a6203b358abe76d581f2647f9726ebad5f43 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 8 Sep 2021 03:40:03 +0000 Subject: [PATCH 043/256] Translated using Weblate (Ukrainian) Currently translated at 52.8% (1664 of 3151 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index a4e24b02ec..a4e02673a5 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -294,7 +294,7 @@ "Failed to invite the following users to the %(roomName)s room:": "Не вдалося запросити таких користувачів до кімнати %(roomName)s:", "You need to be logged in.": "Вам потрібно увійти.", "You need to be able to invite users to do that.": "Щоб це зробити, вам необхідно мати можливість запрошувати людей.", - "Unable to create widget.": "Неможливо створити віджет.", + "Unable to create widget.": "Неможливо створити розширення.", "Missing roomId.": "Бракує ID кімнати.", "Failed to send request.": "Не вдалося надіслати запит.", "This room is not recognised.": "Кімнату не знайдено.", @@ -358,9 +358,9 @@ "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s зробив(-ла) майбутню історію видимою для невідомого значення (%(visibility)s).", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s з %(fromPowerLevel)s до %(toPowerLevel)s", "%(senderName)s changed the pinned messages for the room.": "%(senderName)s змінює прикріплені повідомлення у кімнаті.", - "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s змінює знадіб %(widgetName)s", - "%(widgetName)s widget added by %(senderName)s": "%(senderName)s додав(-ла) знадіб %(widgetName)s", - "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s вилучив(-ла) знадіб %(widgetName)s", + "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s змінює розширення %(widgetName)s", + "%(widgetName)s widget added by %(senderName)s": "%(senderName)s додає розширення %(widgetName)s", + "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s вилучає розширення %(widgetName)s", "Failure to create room": "Не вдалося створити кімнату", "Server may be unavailable, overloaded, or you hit a bug.": "Сервер може бути недоступний, перевантажений, або ж ви натрапили на ваду.", "Unnamed Room": "Кімната без назви", @@ -471,9 +471,9 @@ "Use an identity server": "Використовувати сервер ідентифікації", "Use an identity server to invite by email. Manage in Settings.": "Використовувати сервер ідентифікації для запрошень через е-пошту. Керуйте у налаштуваннях.", "Unbans user with given ID": "Розблоковує користувача зі вказаним ID", - "Adds a custom widget by URL to the room": "Додає власний віджет до кімнати за посиланням", - "Please supply a https:// or http:// widget URL": "Вкажіть посилання на віджет — https:// або http://", - "You cannot modify widgets in this room.": "Ви не можете змінювати віджети у цій кімнаті.", + "Adds a custom widget by URL to the room": "Додає власне розширення до кімнати за посиланням", + "Please supply a https:// or http:// widget URL": "Вкажіть посилання на розширення — https:// або http://", + "You cannot modify widgets in this room.": "Ви не можете змінювати розширення у цій кімнаті.", "Forces the current outbound group session in an encrypted room to be discarded": "Примусово відкидає поточний вихідний груповий сеанс у зашифрованій кімнаті", "Sends the given message coloured as a rainbow": "Надсилає вказане повідомлення, розфарбоване веселкою", "Your %(brand)s is misconfigured": "Ваш %(brand)s налаштовано неправильно", @@ -644,7 +644,7 @@ "Unrecognised room address:": "Невпізнана адреса кімнати:", "Command failed": "Не вдалося виконати команду", "Could not find user in room": "Не вдалося знайти користувача в кімнаті", - "Please supply a widget URL or embed code": "Вкажіть URL або код вставки віджету", + "Please supply a widget URL or embed code": "Вкажіть URL або код вбудовування розширення", "Verifies a user, session, and pubkey tuple": "Звіряє користувача, сеанс та кортеж відкритого ключа", "Unknown (user, session) pair:": "Невідома пара (користувача, сеансу):", "Session already verified!": "Сеанс вже підтверджений!", @@ -1248,7 +1248,7 @@ "Use a system font": "Використовувати системний шрифт", "System font name": "Ім’я системного шрифту", "Allow Peer-to-Peer for 1:1 calls": "Дозволити Peer-to-Peer для дзвінків 1:1", - "Enable widget screenshots on supported widgets": "Увімкнути скріншоти віджетів для віджетів, що підтримуються", + "Enable widget screenshots on supported widgets": "Увімкнути знімки екрана розширень для підтримуваних розширень", "Prompt before sending invites to potentially invalid matrix IDs": "Запитувати перед надсиланням запрошень на потенційно недійсні matrix ID", "Order rooms by name": "Сортувати кімнати за назвою", "Low bandwidth mode": "Режим для низької пропускної здатності", @@ -1588,7 +1588,7 @@ "Confirm encryption setup": "Підтвердити налаштування шифрування", "Enable end-to-end encryption": "Увімкнути наскрізне шифрування", "Your server requires encryption to be enabled in private rooms.": "Ваш сервер вимагає увімкнення шифрування приватних кімнат.", - "Widgets do not use message encryption.": "Віджети не використовують шифрування повідомлень.", + "Widgets do not use message encryption.": "Розширення не використовують шифрування повідомлень.", "The encryption used by this room isn't supported.": "Шифрування, використане цією кімнатою не підтримується.", "Encryption not enabled": "Шифрування не ввімкнено", "Ignored attempt to disable encryption": "Знехтувані спроби вимкнути шифрування", @@ -1633,10 +1633,10 @@ "Sends the given message as a spoiler": "Надсилає вказане повідомлення згорненим", "Integration manager": "Менеджер інтеграцій", "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "Ваш %(brand)s не дозволяє вам користуватись для цього менеджером інтеграцій. Зверніться до адміністратора.", - "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Користування цим віджетом може призвести до поширення ваших даних через %(widgetDomain)s і ваш менеджер інтеграцій.", - "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Менеджери інтеграцій отримують дані конфігурації та можуть змінювати знадоби, надсилати запрошення у кімнати й встановлювати рівні повноважень від вашого імені.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій для керування ботами, віджетами й пакунками наліпок.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій %(serverName)s для керування ботами, віджетами й пакунками наліпок.", + "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Користування цим розширенням може призвести до поширення ваших даних через %(widgetDomain)s і ваш менеджер інтеграцій.", + "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Менеджери інтеграцій отримують дані конфігурації та можуть змінювати розширення, надсилати запрошення у кімнати й встановлювати рівні повноважень від вашого імені.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій для керування ботами, розширеннями й пакунками наліпок.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій %(serverName)s для керування ботами, розширеннями й пакунками наліпок.", "Identity server": "Сервер ідентифікації", "Identity server (%(server)s)": "Сервер ідентифікації (%(server)s)", "Could not connect to identity server": "Не вдалося під'єднатись до сервера ідентифікації", @@ -1727,7 +1727,7 @@ "No results": "Немає результатів", "Application window": "Вікно застосунку", "Error - Mixed content": "Помилка — змішаний вміст", - "Widget ID": "ID віджета", + "Widget ID": "ID розширення", "%(brand)s URL": "URL-адреса %(brand)s", "Your theme": "Ваша тема", "Your user ID": "Ваш ID користувача", @@ -1779,7 +1779,7 @@ "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s змінює аватар %(roomName)s", "Change room avatar": "Змінити аватар кімнати", "Change the avatar of this room": "Змінює аватар цієї кімнати", - "Modify widgets": "Змінити віджети", + "Modify widgets": "Змінити розширення", "Notify everyone": "Сповістити всіх", "Remove messages sent by others": "Вилучити повідомлення надіслані іншими", "Kick users": "Викинути користувачів", @@ -1867,7 +1867,7 @@ "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.": "Ви можете використовувати власні опції сервера для входу на інші сервери Matrix, вказавши іншу URL-адресу домашнього сервера. Це дозволяє користуватись Element із наявним обліковим записом Matrix на іншому домашньому сервері.", "Server Options": "Опції сервера", "Verify your identity to access encrypted messages and prove your identity to others.": "Підтвердьте свою особу, щоб отримати доступ до зашифрованих повідомлень і довести свою справжність іншим.", - "Allow this widget to verify your identity": "Дозволити цьому віджету перевіряти вашу особу", + "Allow this widget to verify your identity": "Дозволити цьому розширенню перевіряти вашу особу", "Verify this login": "Підтвердити цей вхід", "Verify other login": "Підтвердити інший вхід", "Use another login": "Інший обліковий запис", From 6119ec17513c693b58b5af3760b38cb805e9867c Mon Sep 17 00:00:00 2001 From: sr093906 Date: Wed, 8 Sep 2021 14:05:41 +0000 Subject: [PATCH 044/256] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3152 of 3152 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 62749185ac..764fc88f5b 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -3594,5 +3594,6 @@ "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s将一条消息固定到此聊天室。查看所有固定信息。", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s 将一条消息固定到此聊天室。查看所有固定消息。", "Currently, %(count)s spaces have access|one": "目前,一个空间有访问权限", - "& %(count)s more|one": "& 另外 %(count)s" + "& %(count)s more|one": "& 另外 %(count)s", + "Some encryption parameters have been changed.": "一些加密参数已更改。" } From f634e6544d6e623d91282da7a7a790c52abb756a Mon Sep 17 00:00:00 2001 From: Szimszon Date: Wed, 8 Sep 2021 17:33:12 +0000 Subject: [PATCH 045/256] Translated using Weblate (Hungarian) Currently translated at 100.0% (3152 of 3152 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index df48f631cf..078080401b 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -3696,5 +3696,6 @@ "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s kitűzött egy üzenetet ebben a szobában. Minden kitűzött üzenet megjelenítése.", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s kitűzött egy üzenetet ebben a szobában. Minden kitűzött üzenet megjelenítése.", "Currently, %(count)s spaces have access|one": "Jelenleg a Térnek hozzáférése van", - "& %(count)s more|one": "és még %(count)s" + "& %(count)s more|one": "és még %(count)s", + "Some encryption parameters have been changed.": "Néhány titkosítási paraméter megváltozott." } From 5bd369f8d489bdbe0f4709c699f0ee384280e7c6 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Wed, 8 Sep 2021 18:22:07 +0000 Subject: [PATCH 046/256] Translated using Weblate (Ukrainian) Currently translated at 52.7% (1664 of 3152 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index a4e02673a5..369d61bf3f 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -54,7 +54,7 @@ "Anyone who knows the room's link, apart from guests": "Кожний, хто знає посилання на кімнату, окрім гостей", "Anyone who knows the room's link, including guests": "Кожний, хто знає посилання на кімнату, включно гостей", "Are you sure?": "Ви впевнені?", - "Are you sure you want to leave the room '%(roomName)s'?": "Ви впевнені, що хочете залишити '%(roomName)s'?", + "Are you sure you want to leave the room '%(roomName)s'?": "Ви впевнені, що хочете вийти з «%(roomName)s»?", "Are you sure you want to reject the invitation?": "Ви впевнені, що ви хочете відхилити запрошення?", "Attachment": "Прикріплення", "Autoplay GIFs and videos": "Автовідтворення GIF і відео", @@ -310,7 +310,7 @@ "To use it, just wait for autocomplete results to load and tab through them.": "Щоб цим скористатися, просто почекайте на підказки автодоповнення й перемикайтеся між ними клавішею TAB.", "Changes your display nickname": "Змінює ваш нік", "Invites user with given id to current room": "Запрошує користувача зі вказаним ID до кімнати", - "Leave room": "Залишити кімнату", + "Leave room": "Вийти з кімнати", "Kicks user with given id": "Викидає з кімнати користувача зі вказаним ID", "Ignores a user, hiding their messages from you": "Ігнорує користувача, приховуючи його повідомлення від вас", "Ignored user": "Зігнорований користувач", @@ -521,8 +521,8 @@ "Failed to reject invitation": "Не вдалось відхилити запрошення", "This room is not public. You will not be able to rejoin without an invite.": "Ця кімната не є прилюдною. Ви не зможете перепід'єднатись без запрошення.", "Failed to leave room": "Не вдалось залишити кімнату", - "Can't leave Server Notices room": "Неможливо залишити кімнату Оголошення Сервера", - "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ця кімната використовується для важливих повідомлень з домашнього сервера, тож ви не можете її залишити.", + "Can't leave Server Notices room": "Неможливо вийти з кімнати сповіщень сервера", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ця кімната використовується для важливих повідомлень з домашнього сервера, тож ви не можете з неї вийти.", "Use Single Sign On to continue": "Використати Single Sign On для продовження", "Confirm adding this email address by using Single Sign On to prove your identity.": "Підтвердьте додавання цієї адреси е-пошти через використання Single Sign On аби довести вашу ідентичність.", "Single Sign On": "Єдиний вхід", @@ -584,7 +584,7 @@ "Are you sure you want to deactivate your account? This is irreversible.": "Ви впевнені у тому, що бажаєте знедіяти ваш обліковий запис? Ця дія безповоротна.", "Confirm account deactivation": "Підтвердьте знедіювання облікового запису", "To continue, please enter your password:": "Щоб продовжити, введіть, будь ласка, ваш пароль:", - "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.": "Ваш обліковий запис стане назавжди невикористовним. Ви не матимете змоги увійти в нього і ніхто не зможе перереєструватись під цим користувацьким ID. Це призведе до виходу вашого облікового запису з усіх кімнат та до видалення деталей вашого облікового запису з вашого серверу ідентифікації. Ця дія є безповоротною.", + "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.": "Ви більше ніколи не зможете скористатися цим обліковим записом. Ви не зможете ввійти в нього і ніхто не зможе перереєструватись за цим користувацьким ID. Це призведе до виходу вашого облікового запису з усіх кімнат та до вилучення подробиць вашого облікового запису з вашого сервера ідентифікації. Ця дія є безповоротною.", "Verify session": "Звірити сеанс", "Session name": "Назва сеансу", "Session ID": "ID сеансу", @@ -609,7 +609,7 @@ "You have %(count)s unread notifications in a prior version of this room.|other": "Ви маєте %(count)s непрочитаних сповіщень у попередній версії цієї кімнати.", "You have %(count)s unread notifications in a prior version of this room.|one": "У вас %(count)s непрочитане сповіщення у попередній версії цієї кімнати.", "Deactivate user?": "Знедіяти користувача?", - "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "Знедіювання цього користувача виведе їх з системи й унеможливить вхід у майбутньому. До того ж, вони залишать усі кімнати, в яких перебувають. Ця дія є безповоротною. Ви впевнені, що хочете знедіяти цього користувача?", + "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "Знедіювання цього користувача виведе їх з системи й унеможливить вхід у майбутньому. До того ж вони вийдуть з усіх кімнат, у яких перебувають. Ця дія є безповоротною. Ви впевнені, що хочете знедіяти цього користувача?", "Deactivate user": "Знедіяти користувача", "Failed to deactivate user": "Не вдалось знедіяти користувача", "Deactivating your account does not by default cause us to forget messages you have sent. If you would like us to forget your messages, please tick the box below.": "Знедіювання вашого облікового запису типово не призводить до забуття надісланих вами повідомлень. Якщо ви бажаєте, щоб ми забули ваші повідомлення, поставте прапорець внизу.", @@ -840,7 +840,7 @@ "⚠ These settings are meant for advanced users.": "⚠ Ці налаштування розраховані на досвідчених користувачів.", "Ignoring people is done through ban lists which contain rules for who to ban. Subscribing to a ban list means the users/servers blocked by that list will be hidden from you.": "Нехтування людей реалізовано через списки правил блокування. Підписка на список блокування призведе до приховування від вас перелічених у ньому користувачів і серверів.", "Personal ban list": "Особистий список блокування", - "Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.": "Ваш особистий список блокування містить усіх користувачів і сервери, повідомлення яких ви не хочете бачити. Після внесення туди першого користувача/сервера в списку кімнат з'явиться нова кімната «Мій список блокування» — не залишайте цю кімнату, щоб список блокування працював.", + "Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.": "Ваш особистий список блокування містить усіх користувачів і сервери, повідомлення яких ви не хочете бачити. Після внесення туди першого користувача/сервера в списку кімнат з'явиться нова кімната «Мій список блокування» — не виходьте з неї, щоб список блокування працював.", "Server or user ID to ignore": "Сервер або ID користувача для ігнорування", "eg: @bot:* or example.org": "наприклад: @bot:* або example.org", "Ignore": "Ігнорувати", @@ -1032,7 +1032,7 @@ "Use default": "Типово", "Mentions & Keywords": "Згадки та ключові слова", "Notification options": "Параметри сповіщень", - "Leave Room": "Залишити кімнату", + "Leave Room": "Вийти з кімнати", "Forget Room": "Забути кімнату", "Favourited": "Улюблено", "%(count)s unread messages including mentions.|other": "%(count)s непрочитаних повідомлень включно зі згадками.", @@ -1102,7 +1102,7 @@ "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Поліпште цей сеанс щоб уможливити звіряння інших сеансів, надаючи їм доступ до зашифрованих повідомлень та позначуючи їх довіреними для інших користувачів.", "Upgrade your encryption": "Поліпшити ваше шифрування", "Show a placeholder for removed messages": "Показувати замісну позначку замість видалених повідомлень", - "Show join/leave messages (invites/kicks/bans unaffected)": "Показувати повідомлення про приєднання/залишення (не впливає на запрошення/викидання/блокування)", + "Show join/leave messages (invites/kicks/bans unaffected)": "Показувати повідомлення про приєднання/вихід (не впливає на запрошення/викидання/блокування)", "Show avatar changes": "Показувати зміни личини", "Show display name changes": "Показувати зміни видимого імені", "Show read receipts sent by other users": "Показувати мітки прочитання, надіслані іншими користувачами", @@ -1235,13 +1235,13 @@ "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Додає ( ͡° ͜ʖ ͡°) на початку текстового повідомлення", "about a day ago": "близько доби тому", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", - "Unexpected server error trying to leave the room": "Виникла неочікувана помилка серверу під час спроби залишити кімнату", + "Unexpected server error trying to leave the room": "Під час спроби вийти з кімнати виникла неочікувана помилка сервера", "Unknown App": "Невідомий додаток", "Send anonymous usage data which helps us improve %(brand)s. This will use a cookie.": "Надсилати анонімну статистику користування, що дозволяє нам вдосконалювати %(brand)s. Це використовує кукі.", "Set up Secure Backup": "Налаштувати захищене резервне копіювання", "Safeguard against losing access to encrypted messages & data": "Захистіться від втрати доступу до зашифрованих повідомлень і даних", - "The person who invited you already left the room.": "Особа, що вас запросила, вже залишила кімнату.", - "The person who invited you already left the room, or their server is offline.": "Особа, що вас запросила вже залишила кімнату, або її сервер відімкнено.", + "The person who invited you already left the room.": "Особа, що вас запросила, вже вийшла з кімнати.", + "The person who invited you already left the room, or their server is offline.": "Особа, що вас запросила вже вийшла з кімнати, або її сервер вимкнено.", "Change notification settings": "Змінити налаштування сповіщень", "Render simple counters in room header": "Показувати звичайні лічильники у заголовку кімнати", "Send typing notifications": "Надсилати сповіщення про набирання тексту", @@ -1259,7 +1259,7 @@ "Uploading logs": "Відвантаження журналів", "Downloading logs": "Завантаження журналів", "My Ban List": "Мій список блокувань", - "This is your list of users/servers you have blocked - don't leave the room!": "Це ваш список користувачів/серверів, які ви заблокували – не залишайте кімнату!", + "This is your list of users/servers you have blocked - don't leave the room!": "Це ваш список користувачів/серверів, які ви заблокували – не виходьте з кімнати!", "Incoming call": "Вхідний виклик", "The other party cancelled the verification.": "Друга сторона скасувала звірення.", "Verified!": "Звірено!", @@ -1680,8 +1680,8 @@ "%(senderName)s withdrew %(targetName)s's invitation": "%(senderName)s відкликає запрошення %(targetName)s", "%(senderName)s withdrew %(targetName)s's invitation: %(reason)s": "%(senderName)s відкликає запрошення %(targetName)s: %(reason)s", "%(senderName)s unbanned %(targetName)s": "%(senderName)s розблоковує %(targetName)s", - "%(targetName)s left the room": "%(targetName)s залишає кімнату", - "%(targetName)s left the room: %(reason)s": "%(targetName)s залишає кімнату: %(reason)s", + "%(targetName)s left the room": "%(targetName)s виходить з кімнати", + "%(targetName)s left the room: %(reason)s": "%(targetName)s виходить з кімнати: %(reason)s", "%(targetName)s rejected the invitation": "%(targetName)s відхиляє запрошення", "%(senderName)s made no change": "%(senderName)s нічого не змінює", "%(senderName)s set a profile picture": "%(senderName)s встановлює зображення профілю", From d87a1967a8c01fbcae4291c2c78b7aba6d744e3c Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Wed, 8 Sep 2021 17:31:02 +0000 Subject: [PATCH 047/256] Translated using Weblate (Czech) Currently translated at 100.0% (3152 of 3152 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 65a1fc4040..4f48cfeab8 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -3620,5 +3620,6 @@ "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s připnul zprávu k této místnosti. Zobrazit všechny připnuté zprávy.", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s připnul zprávu k této místnosti. Zobrazit všechny připnuté zprávy.", "Currently, %(count)s spaces have access|one": "V současné době má prostor přístup", - "& %(count)s more|one": "a %(count)s další" + "& %(count)s more|one": "a %(count)s další", + "Some encryption parameters have been changed.": "Byly změněny některé parametry šifrování." } From e14caf8084d034bfe38b1aa8f44ca639bba766f1 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Thu, 9 Sep 2021 05:27:32 +0000 Subject: [PATCH 048/256] Translated using Weblate (Hungarian) Currently translated at 100.0% (3152 of 3152 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 078080401b..a9d1b65057 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -3697,5 +3697,6 @@ "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s kitűzött egy üzenetet ebben a szobában. Minden kitűzött üzenet megjelenítése.", "Currently, %(count)s spaces have access|one": "Jelenleg a Térnek hozzáférése van", "& %(count)s more|one": "és még %(count)s", - "Some encryption parameters have been changed.": "Néhány titkosítási paraméter megváltozott." + "Some encryption parameters have been changed.": "Néhány titkosítási paraméter megváltozott.", + "Role in ": "Szerep itt: " } From 1ad653e6cc85df84723826f482e0376c21ab0440 Mon Sep 17 00:00:00 2001 From: sr093906 Date: Thu, 9 Sep 2021 00:40:21 +0000 Subject: [PATCH 049/256] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3152 of 3152 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 764fc88f5b..647fd692de 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -3595,5 +3595,6 @@ "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s 将一条消息固定到此聊天室。查看所有固定消息。", "Currently, %(count)s spaces have access|one": "目前,一个空间有访问权限", "& %(count)s more|one": "& 另外 %(count)s", - "Some encryption parameters have been changed.": "一些加密参数已更改。" + "Some encryption parameters have been changed.": "一些加密参数已更改。", + "Role in ": " 中的角色" } From 48b3009c7318d323c3a4946c55a36d57ab583276 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 9 Sep 2021 03:07:12 +0000 Subject: [PATCH 050/256] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (3152 of 3152 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 869a9f6e75..947e6f77e2 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -3705,5 +3705,7 @@ "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s 釘選了訊息到此聊天室。檢視所有已釘選的訊息。", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s 釘選了訊息到此聊天室。檢視所有釘選的訊息。", "Currently, %(count)s spaces have access|one": "目前,1 個空間可存取", - "& %(count)s more|one": "與其他 %(count)s 個" + "& %(count)s more|one": "與其他 %(count)s 個", + "Some encryption parameters have been changed.": "部份加密參數已變更。", + "Role in ": " 中的角色" } From 05f8960170206c07cab9676882e320e1996ea8f7 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Thu, 9 Sep 2021 05:11:07 +0000 Subject: [PATCH 051/256] Translated using Weblate (Czech) Currently translated at 100.0% (3152 of 3152 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 4f48cfeab8..557e9e5250 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -3621,5 +3621,6 @@ "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s připnul zprávu k této místnosti. Zobrazit všechny připnuté zprávy.", "Currently, %(count)s spaces have access|one": "V současné době má prostor přístup", "& %(count)s more|one": "a %(count)s další", - "Some encryption parameters have been changed.": "Byly změněny některé parametry šifrování." + "Some encryption parameters have been changed.": "Byly změněny některé parametry šifrování.", + "Role in ": "Role v " } From 1159aa40377fbfda55015e70bbf72ee50ffed54d Mon Sep 17 00:00:00 2001 From: random Date: Thu, 9 Sep 2021 08:34:02 +0000 Subject: [PATCH 052/256] Translated using Weblate (Italian) Currently translated at 99.9% (3151 of 3152 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index c8c2bfe999..7e89bdf00c 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -3701,5 +3701,7 @@ "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s ha tolto un messaggio ancorato da questa stanza. Vedi tutti i messaggi ancorati.", "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s ha tolto un messaggio ancorato da questa stanza. Vedi tutti i messaggi ancorati.", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s ha ancorato un messaggio a questa stanza. Vedi tutti i messaggi ancorati.", - "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s ha ancorato un messaggio a questa stanza. Vedi tutti i messaggi ancorati." + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s ha ancorato un messaggio a questa stanza. Vedi tutti i messaggi ancorati.", + "Some encryption parameters have been changed.": "Alcuni parametri di crittografia sono stati modificati.", + "Role in ": "Ruolo in " } From 2e4fca1414759cb23971341ba60e1d4b79c0dc12 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Thu, 9 Sep 2021 09:07:17 +0000 Subject: [PATCH 053/256] Translated using Weblate (Albanian) Currently translated at 99.7% (3144 of 3152 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 | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index f74108bbd5..4fcf5634fa 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -3690,5 +3690,9 @@ "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s hoqi fiksimin e një mesazhi nga kjo dhomë. Shihni krejt mesazhet e fiksuar.", "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s hoqi fiksimin e një mesazhi nga kjo dhomë. Shihni krejt mesazhet e fiksuar.", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s fiksoi një mesazh te kjo dhomë. Shihni krejt mesazhet e fiksuar.", - "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s fiksoi një mesazh te kjo dhomë. Shini krejt mesazhet e fiksuar." + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s fiksoi një mesazh te kjo dhomë. Shini krejt mesazhet e fiksuar.", + "Some encryption parameters have been changed.": "Janë ndryshuar disa parametra fshehtëzimi.", + "Role in ": "Rol në ", + "Currently, %(count)s spaces have access|one": "Aktualisht një hapësirë ka hyrje", + "& %(count)s more|one": "& %(count)s më tepër" } From 03160a968d335c42472d2b05c7457e5911e54aff Mon Sep 17 00:00:00 2001 From: iaiz Date: Thu, 9 Sep 2021 09:12:44 +0000 Subject: [PATCH 054/256] Translated using Weblate (Spanish) Currently translated at 99.9% (3150 of 3152 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 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 69110f4aea..72e6f4fdb6 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -3638,5 +3638,11 @@ "The above, but in any room you are joined or invited to as well": "Lo de arriba, pero en cualquier sala en la que estés o te inviten", "The above, but in as well": "Lo de arriba, pero también en ", "Autoplay videos": "Reproducir automáticamente los vídeos", - "Autoplay GIFs": "Reproducir automáticamente los GIFs" + "Autoplay GIFs": "Reproducir automáticamente los GIFs", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s ha anclado un mensaje en esta sala. Mira todos los mensajes anclados.", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s ha anclado un mensaje en esta sala. Mira todos los mensajes anclados.", + "Some encryption parameters have been changed.": "Algunos parámetros del cifrado han cambiado.", + "Role in ": "Rol en ", + "Currently, %(count)s spaces have access|one": "Ahora mismo, un espacio tiene acceso", + "& %(count)s more|one": "y %(count)s más" } From 74a67ab2b67d99a95fc70308b6d89119bc8fae76 Mon Sep 17 00:00:00 2001 From: jelv Date: Thu, 9 Sep 2021 13:52:22 +0000 Subject: [PATCH 055/256] Translated using Weblate (Dutch) Currently translated at 100.0% (3152 of 3152 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, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 573ed6922a..373a017bd8 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -3590,5 +3590,7 @@ "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s prikte een bericht vast aan deze kamer. Bekijk alle vastgeprikte berichten.", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s prikte een bericht aan deze kamer. Bekijk alle vastgeprikte berichten.", "Currently, %(count)s spaces have access|one": "Momenteel heeft één ruimte toegang", - "& %(count)s more|one": "& %(count)s meer" + "& %(count)s more|one": "& %(count)s meer", + "Some encryption parameters have been changed.": "Enkele versleutingsparameters zijn gewijzigd.", + "Role in ": "Rol in " } From 2e290b2e9d14a94242520f65d65229dea4a7f2b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 9 Sep 2021 16:00:51 +0000 Subject: [PATCH 056/256] Translated using Weblate (Estonian) Currently translated at 99.9% (3149 of 3152 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 817ff8d312..4e3caab5e6 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -3674,5 +3674,7 @@ "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s eemaldas siin jututoas klammerduse ühelt sõnumilt. Vaata kõiki klammerdatud sõnumeid.", "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s eemaldas siin jututoas klammerduse ühelt sõnumilt. Vaata kõiki klammerdatud sõnumeid.", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s klammerdas siin jututoas ühe sõnumi. Vaata kõiki klammerdatud sõnumeid.", - "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s klammerdas siin jututoas ühe sõnumi. Vaata kõiki klammerdatud sõnumeid." + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s klammerdas siin jututoas ühe sõnumi. Vaata kõiki klammerdatud sõnumeid.", + "Some encryption parameters have been changed.": "Mõned krüptimise parameetrid on muutunud.", + "Role in ": "Roll jututoas " } From 13fd5c6555938146ce31d70bcec7f8c12a2bf80c Mon Sep 17 00:00:00 2001 From: Glandos Date: Thu, 9 Sep 2021 21:35:57 +0000 Subject: [PATCH 057/256] Translated using Weblate (French) Currently translated at 99.9% (3155 of 3158 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 | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 862cefe06d..21e5f04c3a 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -3678,5 +3678,12 @@ "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s a désépinglé un message de ce salon. Voir tous les messages épinglés.", "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s a désépinglé un message de ce salon. Voir tous les messages épinglés.", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s a épinglé un message dans ce salon. Voir tous les messages épinglés.", - "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s a épinglé un message dans ce salon. Voir tous les messages épinglés." + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s a épinglé un message dans ce salon. Voir tous les messages épinglés.", + "Some encryption parameters have been changed.": "Certains paramètres de chiffrement ont été changés.", + "Role in ": "Rôle dans ", + "Explore %(spaceName)s": "Explorer %(spaceName)s", + "Send a sticker": "Envoyer un autocollant", + "Reply to thread…": "Répondre au fil…", + "Reply to encrypted thread…": "Répondre au fil chiffré…", + "Add emoji": "Ajouter une émoticône" } From ed2253938587711b07728fc422051a4602bd964f Mon Sep 17 00:00:00 2001 From: Szimszon Date: Fri, 10 Sep 2021 07:48:16 +0000 Subject: [PATCH 058/256] Translated using Weblate (Hungarian) Currently translated at 100.0% (3158 of 3158 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 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index a9d1b65057..79b79130bd 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -3698,5 +3698,10 @@ "Currently, %(count)s spaces have access|one": "Jelenleg a Térnek hozzáférése van", "& %(count)s more|one": "és még %(count)s", "Some encryption parameters have been changed.": "Néhány titkosítási paraméter megváltozott.", - "Role in ": "Szerep itt: " + "Role in ": "Szerep itt: ", + "Explore %(spaceName)s": "%(spaceName)s feltérképezése", + "Send a sticker": "Matrica küldése", + "Reply to thread…": "Válasz az üzenetszálra…", + "Reply to encrypted thread…": "Válasz a titkosított üzenetszálra…", + "Add emoji": "Emodzsi hozzáadás" } From 4b91976f2712d1acd6b048978f36634b8a90eaa1 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Fri, 10 Sep 2021 05:39:39 +0000 Subject: [PATCH 059/256] Translated using Weblate (Swedish) Currently translated at 99.7% (3150 of 3158 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index fdd5ab36ba..237e3d182e 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -3619,5 +3619,6 @@ "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s avfäste ett meddelande i det här rummet. Se alla fästa meddelanden.", "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s avfäste ett meddelande i det här rummet. Se alla fästa meddelanden.", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s fäste ett meddelande i det här rummet. Se alla fästa meddelanden.", - "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s fäste ett meddelande i det här rummet. Se alla fästa meddelanden." + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s fäste ett meddelande i det här rummet. Se alla fästa meddelanden.", + "& %(count)s more|one": "& %(count)s till" } From 2c61e237de300a54b5aa062dca9187e85c3ea853 Mon Sep 17 00:00:00 2001 From: sr093906 Date: Thu, 9 Sep 2021 23:14:14 +0000 Subject: [PATCH 060/256] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3158 of 3158 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 647fd692de..6ca4827a34 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -3596,5 +3596,10 @@ "Currently, %(count)s spaces have access|one": "目前,一个空间有访问权限", "& %(count)s more|one": "& 另外 %(count)s", "Some encryption parameters have been changed.": "一些加密参数已更改。", - "Role in ": " 中的角色" + "Role in ": " 中的角色", + "Explore %(spaceName)s": "探索 %(spaceName)s", + "Send a sticker": "发送贴纸", + "Reply to thread…": "回复主题帖…", + "Reply to encrypted thread…": "回复加密的主题帖…", + "Add emoji": "添加表情" } From b28688f0c6cf2b4edd8779270dd3bbb4ad49f633 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Fri, 10 Sep 2021 01:43:10 +0000 Subject: [PATCH 061/256] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (3158 of 3158 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 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 947e6f77e2..79d385c97a 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -3707,5 +3707,10 @@ "Currently, %(count)s spaces have access|one": "目前,1 個空間可存取", "& %(count)s more|one": "與其他 %(count)s 個", "Some encryption parameters have been changed.": "部份加密參數已變更。", - "Role in ": " 中的角色" + "Role in ": " 中的角色", + "Explore %(spaceName)s": "探索 %(spaceName)s", + "Send a sticker": "傳送貼圖", + "Reply to thread…": "回覆討論串……", + "Reply to encrypted thread…": "回覆給已加密的討論串……", + "Add emoji": "新增表情符號" } From 1e36cebfd8cc93c98adbbc75ff9b3c3541393684 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Fri, 10 Sep 2021 01:54:10 +0000 Subject: [PATCH 062/256] Translated using Weblate (Ukrainian) Currently translated at 54.2% (1713 of 3158 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 57 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 369d61bf3f..793e40fc4c 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -764,8 +764,8 @@ "No": "НІ", "Review where you’re logged in": "Перевірте, де ви ввійшли", "Your homeserver has exceeded its user limit.": "Ваш домашній сервер перевищив свій ліміт користувачів.", - "Your homeserver has exceeded one of its resource limits.": "Ваш домашній сервер перевищив один із своїх ресурсних лімітів.", - "Contact your server admin.": "Зверніться до адміністратора серверу.", + "Your homeserver has exceeded one of its resource limits.": "Ваш домашній сервер перевищив одне із своїх обмежень ресурсів.", + "Contact your server admin.": "Зверніться до адміністратора сервера.", "Ok": "Гаразд", "Set password": "Встановити пароль", "Set up encryption": "Налаштування шифрування", @@ -982,7 +982,7 @@ " to store messages from ": " зберігання повідомлень від ", "rooms.": "кімнати.", "Manage": "Керування", - "Enable": "Дозволити", + "Enable": "Увімкнути", "Connecting to integration manager...": "З'єднання з менджером інтеграцій...", "Cannot connect to integration manager": "Не вдалося з'єднатися з менджером інтеграцій", "Delete Backup": "Видалити резервну копію", @@ -1888,5 +1888,54 @@ "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s відкріплює повідомлення з цієї кімнати. Перегляньте всі прикріплені повідомлення.", "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s відкріплює повідомлення з цієї кімнати. Перегляньте всі прикріплені повідомлення.", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s прикріплює повідомлення до цієї кімнати. Перегляньте всі прикріплені повідомлення.", - "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s прикріплює повідомлення до цієї кімнати. Перегляньте всі прикріплені повідомлення." + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s прикріплює повідомлення до цієї кімнати. Перегляньте всі прикріплені повідомлення.", + "Verify this user by confirming the following number appears on their screen.": "Перевірте цього користувача, підтвердивши, що на екрані з'явилося таке число.", + "Verify this session by confirming the following number appears on its screen.": "Перевірте цей сеанс, підтвердивши, що на екрані з'явилося це число.", + "They don't match": "Вони не збігаються", + "They match": "Вони збігаються", + "Return to call": "Повернутися до виклику", + "Voice Call": "Голосовий виклик", + "Video Call": "Відеовиклик", + "Connecting": "З'єднання", + "All rooms you're in will appear in Home.": "Всі кімнати, до яких ви приєднались, з'являться в домівці.", + "Show all rooms in Home": "Показати всі кімнати в Домівці", + "Show chat effects (animations when receiving e.g. confetti)": "Показувати ефекти бесід (анімації отримання, наприклад, конфеті)", + "Autoplay videos": "Автовідтворення відео", + "Autoplay GIFs": "Автовідтворення GIF", + "Show stickers button": "Показати кнопку наліпок", + "%(senderName)s ended the call": "%(senderName)s завершує виклик", + "You ended the call": "Ви завершили виклик", + "Help space members find private rooms": "Допоможіть учасникам просторів знайти приватні кімнати", + "Learn more": "Докладніше", + "Help people in spaces to find and join private rooms": "Допоможіть людям у просторах знайти приватні кімнати та приєднатися до них", + "New in the Spaces beta": "Нове у бета-версії Просторів", + "New version of %(brand)s is available": "Доступна нова версія %(brand)s", + "Update %(brand)s": "Оновити %(brand)s", + "Check your devices": "Перевірити свої пристрої", + "%(deviceId)s from %(ip)s": "%(deviceId)s з %(ip)s", + "This homeserver has been blocked by it's administrator.": "Цей домашній сервер заблокований його адміністратором.", + "Use app": "Використовувати застосунок", + "Element Web is experimental on mobile. For a better experience and the latest features, use our free native app.": "Element Web — експериментальна версія на мобільних телефонах. Для зручності та найновіших можливостей, скористайтеся нашим безплатним застосунком.", + "Use app for a better experience": "Використовуйте застосунок для зручності", + "Silence call": "Тихий виклик", + "Sound on": "Звук увімкнено", + "Enable desktop notifications": "Увімкнути сповіщення стільниці", + "Don't miss a reply": "Не пропустіть відповідей", + "Review to ensure your account is safe": "Перевірте, щоб переконатися, що ваш обліковий запис у безпеці", + "You have unverified logins": "У вас є не підтверджені сеанси", + "Error leaving room": "Помилка під час виходу з кімнати", + "This homeserver has been blocked by its administrator.": "Цей домашній сервер заблокований адміністратором.", + "See when the name changes in your active room": "Бачити, коли зміниться назва активної кімнати", + "Change the name of your active room": "Змінити назву активної кімнати", + "See when the name changes in this room": "Бачити, коли зміниться назва в цій кімнаті", + "See when the topic changes in your active room": "Бачити, коли тема зміниться у активній кімнаті", + "Change the topic of your active room": "Змінити тему активної кімнати", + "See when the topic changes in this room": "Бачити, коли тема в цій кімнаті зміниться", + "Change which room, message, or user you're viewing": "Змініть кімнату, повідомлення чи користувача, які ви переглядаєте", + "Change which room you're viewing": "Змінити кімнату, яку ви переглядаєте", + "Send stickers into your active room": "Надіслати наліпки до активної кімнати", + "Send stickers into this room": "Надіслати наліпки до цієї кімнати", + "Remain on your screen while running": "Залишати на екрані під час роботи", + "Remain on your screen when viewing another room, when running": "Залишати на екрані під час перегляду іншої кімнати, під час роботи", + "%(senderName)s has updated the widget layout": "%(senderName)s оновлює макет розширення" } From 880d7ecc07ac15f8f2bdb7e46f8e9ecfa0a7799e Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Fri, 10 Sep 2021 08:42:44 +0000 Subject: [PATCH 063/256] Translated using Weblate (Albanian) Currently translated at 99.7% (3150 of 3158 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 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 4fcf5634fa..3fc306a456 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -3694,5 +3694,10 @@ "Some encryption parameters have been changed.": "Janë ndryshuar disa parametra fshehtëzimi.", "Role in ": "Rol në ", "Currently, %(count)s spaces have access|one": "Aktualisht një hapësirë ka hyrje", - "& %(count)s more|one": "& %(count)s më tepër" + "& %(count)s more|one": "& %(count)s më tepër", + "Explore %(spaceName)s": "Eksploroni %(spaceName)s", + "Send a sticker": "Dërgoni një ngjitës", + "Reply to thread…": "Përgjigjuni te rrjedhë…", + "Reply to encrypted thread…": "Përgjigjuni te rrjedhë e fshehtëzuar…", + "Add emoji": "Shtoni emoji" } From 54a899b4fca81db19d4cdc2584cf11d04333d4ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Fri, 10 Sep 2021 07:44:08 +0000 Subject: [PATCH 064/256] Translated using Weblate (Estonian) Currently translated at 99.9% (3155 of 3158 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 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 4e3caab5e6..f90185cae9 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -3676,5 +3676,10 @@ "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s klammerdas siin jututoas ühe sõnumi. Vaata kõiki klammerdatud sõnumeid.", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s klammerdas siin jututoas ühe sõnumi. Vaata kõiki klammerdatud sõnumeid.", "Some encryption parameters have been changed.": "Mõned krüptimise parameetrid on muutunud.", - "Role in ": "Roll jututoas " + "Role in ": "Roll jututoas ", + "Add emoji": "Lisa emoji", + "Reply to encrypted thread…": "Vasta krüptitud jutulõngas…", + "Reply to thread…": "Vasta jutulõngas…", + "Send a sticker": "Saada kleeps", + "Explore %(spaceName)s": "Tutvu kogukonnaga - %(spaceName)s" } From c1b8efd530f61b6727d60c13d5ce16a44d42a863 Mon Sep 17 00:00:00 2001 From: sr093906 Date: Fri, 10 Sep 2021 09:13:13 +0000 Subject: [PATCH 065/256] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3157 of 3157 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 6ca4827a34..ed9a6eff72 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -3601,5 +3601,8 @@ "Send a sticker": "发送贴纸", "Reply to thread…": "回复主题帖…", "Reply to encrypted thread…": "回复加密的主题帖…", - "Add emoji": "添加表情" + "Add emoji": "添加表情", + "Unknown failure": "未知失败", + "Failed to update the join rules": "未能更新加入列表", + "Anyone in can find and join. You can select other spaces too.": " 中的任何人都可以寻找和加入。你也可以选择其他空间。" } From 48460349a55c8d7ef30fc750c0c0139b23348e95 Mon Sep 17 00:00:00 2001 From: random Date: Fri, 10 Sep 2021 09:12:05 +0000 Subject: [PATCH 066/256] Translated using Weblate (Italian) Currently translated at 99.9% (3156 of 3157 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 | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 7e89bdf00c..72cd653679 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -3689,8 +3689,8 @@ "Are you sure you want to add encryption to this public room?": "Vuoi veramente aggiungere la crittografia a questa stanza pubblica?", "Low bandwidth mode (requires compatible homeserver)": "Modalità a connessione lenta (richiede un homeserver compatibile)", "Multiple integration managers (requires manual setup)": "Gestori di integrazione multipli (richiede configurazione manuale)", - "Thread": "Argomento", - "Show threads": "Mostra argomenti", + "Thread": "Conversazione", + "Show threads": "Mostra conversazioni", "Threaded messaging": "Messaggi raggruppati", "The above, but in any room you are joined or invited to as well": "Quanto sopra, ma anche in qualsiasi stanza tu sia entrato o invitato", "The above, but in as well": "Quanto sopra, ma anche in ", @@ -3703,5 +3703,13 @@ "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s ha ancorato un messaggio a questa stanza. Vedi tutti i messaggi ancorati.", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s ha ancorato un messaggio a questa stanza. Vedi tutti i messaggi ancorati.", "Some encryption parameters have been changed.": "Alcuni parametri di crittografia sono stati modificati.", - "Role in ": "Ruolo in " + "Role in ": "Ruolo in ", + "Explore %(spaceName)s": "Esplora %(spaceName)s", + "Send a sticker": "Invia uno sticker", + "Reply to thread…": "Rispondi alla conversazione…", + "Reply to encrypted thread…": "Rispondi alla conversazione cifrata…", + "Add emoji": "Aggiungi emoji", + "Unknown failure": "Errore sconosciuto", + "Failed to update the join rules": "Modifica delle regole di accesso fallita", + "Anyone in can find and join. You can select other spaces too.": "Chiunque in può trovare ed entrare. Puoi selezionare anche altri spazi." } From bb6ccfa65aae7f6d8cae0a3e16ee16061100c37f Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Fri, 10 Sep 2021 09:33:17 +0000 Subject: [PATCH 067/256] Translated using Weblate (Albanian) Currently translated at 99.7% (3149 of 3157 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 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 3fc306a456..428ac23c28 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -3699,5 +3699,8 @@ "Send a sticker": "Dërgoni një ngjitës", "Reply to thread…": "Përgjigjuni te rrjedhë…", "Reply to encrypted thread…": "Përgjigjuni te rrjedhë e fshehtëzuar…", - "Add emoji": "Shtoni emoji" + "Add emoji": "Shtoni emoji", + "Unknown failure": "Dështim i panjohur", + "Failed to update the join rules": "S’u arrit të përditësohen rregulla hyrjeje", + "Anyone in can find and join. You can select other spaces too.": "Cilido te mund ta gjejë dhe hyjë në të. Mund të përzgjidhni gjithashtu hapësira të tjera." } From ae9726abb6c3bb7eaaf3e935cca87133cf426278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Fri, 10 Sep 2021 11:38:42 +0000 Subject: [PATCH 068/256] Translated using Weblate (Estonian) Currently translated at 99.9% (3154 of 3157 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 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index f90185cae9..234a5902e2 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -3681,5 +3681,8 @@ "Reply to encrypted thread…": "Vasta krüptitud jutulõngas…", "Reply to thread…": "Vasta jutulõngas…", "Send a sticker": "Saada kleeps", - "Explore %(spaceName)s": "Tutvu kogukonnaga - %(spaceName)s" + "Explore %(spaceName)s": "Tutvu kogukonnaga - %(spaceName)s", + "Unknown failure": "Määratlemata viga", + "Failed to update the join rules": "Liitumisreeglite uuendamine ei õnnestunud", + "Anyone in can find and join. You can select other spaces too.": "Kõik kogukonnakeskuse liikmed saavad leida ja liituda. Sa võid valida ka muid kogukonnakeskuseid." } From 6e11f2478cb092ad55abd3b657e11d61f1996ccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 10 Sep 2021 19:01:05 +0200 Subject: [PATCH 069/256] Use IDialogProps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/dialogs/BaseDialog.tsx | 9 ++------- src/components/views/dialogs/FeedbackDialog.tsx | 5 ++--- src/components/views/dialogs/IncomingSasDialog.tsx | 4 ++-- .../views/dialogs/IntegrationsDisabledDialog.tsx | 5 ++--- .../views/dialogs/IntegrationsImpossibleDialog.tsx | 6 ++---- src/components/views/dialogs/InteractiveAuthDialog.tsx | 5 ++--- .../views/dialogs/KeySignatureUploadFailedDialog.tsx | 4 ++-- .../views/dialogs/LazyLoadingDisabledDialog.tsx | 3 +-- .../views/dialogs/LazyLoadingResyncDialog.tsx | 5 ++--- .../dialogs/ManualDeviceKeyVerificationDialog.tsx | 4 ++-- .../views/dialogs/MessageEditHistoryDialog.tsx | 4 ++-- src/components/views/dialogs/QuestionDialog.tsx | 4 ++-- .../views/dialogs/SessionRestoreErrorDialog.tsx | 4 ++-- src/components/views/dialogs/SetEmailDialog.tsx | 4 ++-- .../views/dialogs/SlashCommandHelpDialog.tsx | 5 ++--- src/components/views/dialogs/StorageEvictedDialog.tsx | 5 ++--- .../views/dialogs/TabbedIntegrationManagerDialog.tsx | 10 ++-------- src/components/views/dialogs/TextInputDialog.tsx | 4 ++-- src/components/views/dialogs/UploadFailureDialog.tsx | 4 ++-- .../views/dialogs/security/RestoreKeyBackupDialog.tsx | 5 ++--- .../views/dialogs/security/SetupEncryptionDialog.tsx | 6 ++---- 21 files changed, 41 insertions(+), 64 deletions(-) diff --git a/src/components/views/dialogs/BaseDialog.tsx b/src/components/views/dialogs/BaseDialog.tsx index 91cceb3123..0af494f53e 100644 --- a/src/components/views/dialogs/BaseDialog.tsx +++ b/src/components/views/dialogs/BaseDialog.tsx @@ -27,14 +27,9 @@ import { _t } from "../../../languageHandler"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import { replaceableComponent } from "../../../utils/replaceableComponent"; import { MatrixClient } from "matrix-js-sdk/src/client"; +import { IDialogProps } from "./IDialogProps"; -interface IProps { - // onFinished callback to call when Escape is pressed - // Take a boolean which is true if the dialog was dismissed - // with a positive / confirm action or false if it was - // cancelled (BaseDialog itself only calls this with false). - onFinished: (confirm: any) => void; - +interface IProps extends IDialogProps { // Whether the dialog should have a 'close' button that will // cause the dialog to be cancelled. This should only be set // to false if there is nothing the app can sensibly do if the diff --git a/src/components/views/dialogs/FeedbackDialog.tsx b/src/components/views/dialogs/FeedbackDialog.tsx index 00112ab0c7..6f957452bc 100644 --- a/src/components/views/dialogs/FeedbackDialog.tsx +++ b/src/components/views/dialogs/FeedbackDialog.tsx @@ -25,14 +25,13 @@ import Modal from "../../../Modal"; import BugReportDialog from "./BugReportDialog"; import InfoDialog from "./InfoDialog"; import StyledRadioGroup from "../elements/StyledRadioGroup"; +import { IDialogProps } from "./IDialogProps"; const existingIssuesUrl = "https://github.com/vector-im/element-web/issues" + "?q=is%3Aopen+is%3Aissue+sort%3Areactions-%2B1-desc"; const newIssueUrl = "https://github.com/vector-im/element-web/issues/new/choose"; -interface IProps { - onFinished: () => void; -} +interface IProps extends IDialogProps {} const FeedbackDialog: React.FC = (props: IProps) => { const [rating, setRating] = useState(); diff --git a/src/components/views/dialogs/IncomingSasDialog.tsx b/src/components/views/dialogs/IncomingSasDialog.tsx index 8903b00221..0c689e198d 100644 --- a/src/components/views/dialogs/IncomingSasDialog.tsx +++ b/src/components/views/dialogs/IncomingSasDialog.tsx @@ -26,6 +26,7 @@ import Spinner from "../elements/Spinner"; import VerificationShowSas from "../verification/VerificationShowSas"; import BaseDialog from "./BaseDialog"; import DialogButtons from "../elements/DialogButtons"; +import { IDialogProps } from "./IDialogProps"; const PHASE_START = 0; const PHASE_SHOW_SAS = 1; @@ -33,9 +34,8 @@ const PHASE_WAIT_FOR_PARTNER_TO_CONFIRM = 2; const PHASE_VERIFIED = 3; const PHASE_CANCELLED = 4; -interface IProps { +interface IProps extends IDialogProps { verifier: any; // TODO types - onFinished: (confirmed: boolean) => void; } interface IState { diff --git a/src/components/views/dialogs/IntegrationsDisabledDialog.tsx b/src/components/views/dialogs/IntegrationsDisabledDialog.tsx index f76ed46577..7da4bb84b9 100644 --- a/src/components/views/dialogs/IntegrationsDisabledDialog.tsx +++ b/src/components/views/dialogs/IntegrationsDisabledDialog.tsx @@ -21,10 +21,9 @@ import { Action } from "../../../dispatcher/actions"; import { replaceableComponent } from "../../../utils/replaceableComponent"; import BaseDialog from "./BaseDialog"; import DialogButtons from "../elements/DialogButtons"; +import { IDialogProps } from "./IDialogProps"; -interface IProps { - onFinished: () => void; -} +interface IProps extends IDialogProps {} @replaceableComponent("views.dialogs.IntegrationsDisabledDialog") export default class IntegrationsDisabledDialog extends React.Component { diff --git a/src/components/views/dialogs/IntegrationsImpossibleDialog.tsx b/src/components/views/dialogs/IntegrationsImpossibleDialog.tsx index 36dc42b783..52e3a2fbb8 100644 --- a/src/components/views/dialogs/IntegrationsImpossibleDialog.tsx +++ b/src/components/views/dialogs/IntegrationsImpossibleDialog.tsx @@ -19,11 +19,9 @@ import { _t } from "../../../languageHandler"; import SdkConfig from "../../../SdkConfig"; import * as sdk from "../../../index"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import { IDialogProps } from "./IDialogProps"; -interface IProps { - onFinished: () => void; - -} +interface IProps extends IDialogProps {} @replaceableComponent("views.dialogs.IntegrationsImpossibleDialog") export default class IntegrationsImpossibleDialog extends React.Component { diff --git a/src/components/views/dialogs/InteractiveAuthDialog.tsx b/src/components/views/dialogs/InteractiveAuthDialog.tsx index e9667c84b5..ededfa3bc0 100644 --- a/src/components/views/dialogs/InteractiveAuthDialog.tsx +++ b/src/components/views/dialogs/InteractiveAuthDialog.tsx @@ -27,8 +27,9 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; import { MatrixClient } from "matrix-js-sdk/src/client"; import BaseDialog from "./BaseDialog"; import { IAuthData } from "matrix-js-sdk/src/interactive-auth"; +import { IDialogProps } from "./IDialogProps"; -interface IProps { +interface IProps extends IDialogProps { // matrix client to use for UI auth requests matrixClient: MatrixClient; @@ -43,8 +44,6 @@ interface IProps { // callback makeRequest: (auth: IAuthData) => Promise; - onFinished: (confirmed: boolean, result?) => void; - // Optional title and body to show when not showing a particular stage title?: string; body?: string; diff --git a/src/components/views/dialogs/KeySignatureUploadFailedDialog.tsx b/src/components/views/dialogs/KeySignatureUploadFailedDialog.tsx index 20841c46f4..28e4d1ca80 100644 --- a/src/components/views/dialogs/KeySignatureUploadFailedDialog.tsx +++ b/src/components/views/dialogs/KeySignatureUploadFailedDialog.tsx @@ -20,15 +20,15 @@ import SdkConfig from '../../../SdkConfig'; import BaseDialog from "./BaseDialog"; import DialogButtons from "../elements/DialogButtons"; import Spinner from "../elements/Spinner"; +import { IDialogProps } from "./IDialogProps"; -interface IProps { +interface IProps extends IDialogProps { failures: Record>; source: string; continuation: () => void; - onFinished: () => void; } const KeySignatureUploadFailedDialog: React.FC = ({ diff --git a/src/components/views/dialogs/LazyLoadingDisabledDialog.tsx b/src/components/views/dialogs/LazyLoadingDisabledDialog.tsx index 32aaf9c531..79b8306989 100644 --- a/src/components/views/dialogs/LazyLoadingDisabledDialog.tsx +++ b/src/components/views/dialogs/LazyLoadingDisabledDialog.tsx @@ -20,8 +20,7 @@ import QuestionDialog from './QuestionDialog'; import { _t } from '../../../languageHandler'; import SdkConfig from '../../../SdkConfig'; -interface IProps { - onFinished: () => void; +interface IProps extends IDialogProps { host: string; } diff --git a/src/components/views/dialogs/LazyLoadingResyncDialog.tsx b/src/components/views/dialogs/LazyLoadingResyncDialog.tsx index c942126d12..3acedc77e4 100644 --- a/src/components/views/dialogs/LazyLoadingResyncDialog.tsx +++ b/src/components/views/dialogs/LazyLoadingResyncDialog.tsx @@ -19,10 +19,9 @@ import React from 'react'; import QuestionDialog from './QuestionDialog'; import { _t } from '../../../languageHandler'; import SdkConfig from '../../../SdkConfig'; +import { IDialogProps } from "./IDialogProps"; -interface IProps { - onFinished: () => void; -} +interface IProps extends IDialogProps {} const LazyLoadingResyncDialog: React.FC = (props: IProps) => { const brand = SdkConfig.get().brand; diff --git a/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx b/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx index a4c989d7b5..88419d26b8 100644 --- a/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx +++ b/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx @@ -25,11 +25,11 @@ import { _t } from '../../../languageHandler'; import { replaceableComponent } from "../../../utils/replaceableComponent"; import QuestionDialog from "./QuestionDialog"; import { DeviceInfo } from "matrix-js-sdk/src/crypto/deviceinfo"; +import { IDialogProps } from "./IDialogProps"; -interface IProps { +interface IProps extends IDialogProps { userId: string; device: DeviceInfo; - onFinished: (confirmed: boolean) => void; } @replaceableComponent("views.dialogs.ManualDeviceKeyVerificationDialog") diff --git a/src/components/views/dialogs/MessageEditHistoryDialog.tsx b/src/components/views/dialogs/MessageEditHistoryDialog.tsx index 30c16b03bd..04313ed9a0 100644 --- a/src/components/views/dialogs/MessageEditHistoryDialog.tsx +++ b/src/components/views/dialogs/MessageEditHistoryDialog.tsx @@ -26,10 +26,10 @@ import ScrollPanel from "../../structures/ScrollPanel"; import Spinner from "../elements/Spinner"; import EditHistoryMessage from "../messages/EditHistoryMessage"; import DateSeparator from "../messages/DateSeparator"; +import { IDialogProps } from "./IDialogProps"; -interface IProps { +interface IProps extends IDialogProps { mxEvent: MatrixEvent; - onFinished: () => void; } interface IState { diff --git a/src/components/views/dialogs/QuestionDialog.tsx b/src/components/views/dialogs/QuestionDialog.tsx index df036293f0..8c6334bac1 100644 --- a/src/components/views/dialogs/QuestionDialog.tsx +++ b/src/components/views/dialogs/QuestionDialog.tsx @@ -20,8 +20,9 @@ import classNames from "classnames"; import * as sdk from '../../../index'; import { _t } from '../../../languageHandler'; +import { IDialogProps } from "./IDialogProps"; -interface IProps { +interface IProps extends IDialogProps { title?: string; description?: React.ReactNode; extraButtons?: React.ReactNode; @@ -29,7 +30,6 @@ interface IProps { buttonDisabled?: boolean; danger?: boolean; focus?: boolean; - onFinished: (confirmed: boolean) => void; headerImage?: string; quitOnly?: boolean; // quitOnly doesn't show the cancel button just the quit [x]. fixedWidth?: boolean; diff --git a/src/components/views/dialogs/SessionRestoreErrorDialog.tsx b/src/components/views/dialogs/SessionRestoreErrorDialog.tsx index 752b023f0b..b36dbf548e 100644 --- a/src/components/views/dialogs/SessionRestoreErrorDialog.tsx +++ b/src/components/views/dialogs/SessionRestoreErrorDialog.tsx @@ -25,10 +25,10 @@ import QuestionDialog from "./QuestionDialog"; import BugReportDialog from "./BugReportDialog"; import BaseDialog from "./BaseDialog"; import DialogButtons from "../elements/DialogButtons"; +import { IDialogProps } from "./IDialogProps"; -interface IProps { +interface IProps extends IDialogProps { error: string; - onFinished: () => void; } @replaceableComponent("views.dialogs.SessionRestoreErrorDialog") diff --git a/src/components/views/dialogs/SetEmailDialog.tsx b/src/components/views/dialogs/SetEmailDialog.tsx index 506399d15d..0fa898f1b9 100644 --- a/src/components/views/dialogs/SetEmailDialog.tsx +++ b/src/components/views/dialogs/SetEmailDialog.tsx @@ -26,10 +26,10 @@ import ErrorDialog from "./ErrorDialog"; import QuestionDialog from "./QuestionDialog"; import BaseDialog from "./BaseDialog"; import EditableText from "../elements/EditableText"; +import { IDialogProps } from "./IDialogProps"; -interface IProps { +interface IProps extends IDialogProps { title: string; - onFinished: (confirmed: boolean) => void; } interface IState { diff --git a/src/components/views/dialogs/SlashCommandHelpDialog.tsx b/src/components/views/dialogs/SlashCommandHelpDialog.tsx index c47555567e..ccb157f025 100644 --- a/src/components/views/dialogs/SlashCommandHelpDialog.tsx +++ b/src/components/views/dialogs/SlashCommandHelpDialog.tsx @@ -17,11 +17,10 @@ limitations under the License. import React from 'react'; import { _t } from "../../../languageHandler"; import { CommandCategories, Commands } from "../../../SlashCommands"; +import { IDialogProps } from "./IDialogProps"; import InfoDialog from "./InfoDialog"; -interface IProps { - onFinished: () => void; -} +interface IProps extends IDialogProps {} const SlashCommandHelpDialog: React.FC = ({ onFinished }) => { const categories = {}; diff --git a/src/components/views/dialogs/StorageEvictedDialog.tsx b/src/components/views/dialogs/StorageEvictedDialog.tsx index 60ae049bf6..bdbbf815e6 100644 --- a/src/components/views/dialogs/StorageEvictedDialog.tsx +++ b/src/components/views/dialogs/StorageEvictedDialog.tsx @@ -22,10 +22,9 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; import BaseDialog from "./BaseDialog"; import DialogButtons from "../elements/DialogButtons"; import BugReportDialog from "./BugReportDialog"; +import { IDialogProps } from "./IDialogProps"; -interface IProps { - onFinished: (confirmed: boolean) => void; -} +interface IProps extends IDialogProps { } @replaceableComponent("views.dialogs.StorageEvictedDialog") export default class StorageEvictedDialog extends React.Component { diff --git a/src/components/views/dialogs/TabbedIntegrationManagerDialog.tsx b/src/components/views/dialogs/TabbedIntegrationManagerDialog.tsx index c8ab25b1bb..7ee54403bd 100644 --- a/src/components/views/dialogs/TabbedIntegrationManagerDialog.tsx +++ b/src/components/views/dialogs/TabbedIntegrationManagerDialog.tsx @@ -25,15 +25,9 @@ import { IntegrationManagerInstance } from "../../../integrations/IntegrationMan import ScalarAuthClient from "../../../ScalarAuthClient"; import AccessibleButton from "../elements/AccessibleButton"; import IntegrationManager from "../settings/IntegrationManager"; +import { IDialogProps } from "./IDialogProps"; -interface IProps { - /** - * Called with: - * * success {bool} True if the user accepted any douments, false if cancelled - * * agreedUrls {string[]} List of agreed URLs - */ - onFinished: () => void; - +interface IProps extends IDialogProps { /** * Optional room where the integration manager should be open to */ diff --git a/src/components/views/dialogs/TextInputDialog.tsx b/src/components/views/dialogs/TextInputDialog.tsx index 624e2a58cb..cc321a0af6 100644 --- a/src/components/views/dialogs/TextInputDialog.tsx +++ b/src/components/views/dialogs/TextInputDialog.tsx @@ -21,8 +21,9 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; import { IFieldState, IValidationResult } from "../elements/Validation"; import BaseDialog from "./BaseDialog"; import DialogButtons from "../elements/DialogButtons"; +import { IDialogProps } from "./IDialogProps"; - interface IProps { +interface IProps extends IDialogProps { title?: string; description?: string | JSX.Element; value?: string; @@ -30,7 +31,6 @@ import DialogButtons from "../elements/DialogButtons"; button?: string; busyMessage?: string; // pass _td string focus?: boolean; - onFinished: (success: boolean, value?: string) => void; hasCancel?: boolean; validator?: (fieldState: IFieldState) => IValidationResult; // result of withValidation fixedWidth?: boolean; diff --git a/src/components/views/dialogs/UploadFailureDialog.tsx b/src/components/views/dialogs/UploadFailureDialog.tsx index 807cb08195..bb8d14e161 100644 --- a/src/components/views/dialogs/UploadFailureDialog.tsx +++ b/src/components/views/dialogs/UploadFailureDialog.tsx @@ -22,12 +22,12 @@ import ContentMessages from '../../../ContentMessages'; import { replaceableComponent } from "../../../utils/replaceableComponent"; import BaseDialog from "./BaseDialog"; import DialogButtons from "../elements/DialogButtons"; +import { IDialogProps } from "./IDialogProps"; -interface IProps { +interface IProps extends IDialogProps { badFiles: File[]; totalFiles: number; contentMessages: ContentMessages; - onFinished: (success: boolean) => void; } /* diff --git a/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx b/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx index d2b850eb85..7d5c3cf857 100644 --- a/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx +++ b/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx @@ -23,6 +23,7 @@ import { accessSecretStorage } from '../../../../SecurityManager'; import { IKeyBackupInfo, IKeyBackupRestoreResult } from "matrix-js-sdk/src/crypto/keybackup"; import { ISecretStorageKeyInfo } from "matrix-js-sdk/src/crypto/api"; import * as sdk from '../../../../index'; +import { IDialogProps } from "../IDialogProps"; enum RestoreType { Passphrase = "passphrase", @@ -37,15 +38,13 @@ enum ProgressState { } -interface IProps { +interface IProps extends IDialogProps { // if false, will close the dialog as soon as the restore completes succesfully // default: true showSummary?: boolean; // If specified, gather the key from the user but then call the function with the backup // key rather than actually (necessarily) restoring the backup. keyCallback?: (key: Uint8Array) => void; - - onFinished: (success: boolean) => void; } interface IState { diff --git a/src/components/views/dialogs/security/SetupEncryptionDialog.tsx b/src/components/views/dialogs/security/SetupEncryptionDialog.tsx index b601353d1d..0323769536 100644 --- a/src/components/views/dialogs/security/SetupEncryptionDialog.tsx +++ b/src/components/views/dialogs/security/SetupEncryptionDialog.tsx @@ -20,6 +20,7 @@ import BaseDialog from '../BaseDialog'; import { _t } from '../../../../languageHandler'; import { SetupEncryptionStore, Phase } from '../../../../stores/SetupEncryptionStore'; import { replaceableComponent } from "../../../../utils/replaceableComponent"; +import { IDialogProps } from "../IDialogProps"; function iconFromPhase(phase: Phase) { if (phase === Phase.Done) { @@ -29,10 +30,7 @@ function iconFromPhase(phase: Phase) { } } -interface IProps { - onFinished: (success: boolean) => void; -} - +interface IProps extends IDialogProps {} interface IState { icon: string; } From f2b2a04a217104429db4024937df01016d9a16b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 10 Sep 2021 19:03:29 +0200 Subject: [PATCH 070/256] Make room optional MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/dialogs/TabbedIntegrationManagerDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/TabbedIntegrationManagerDialog.tsx b/src/components/views/dialogs/TabbedIntegrationManagerDialog.tsx index 7ee54403bd..0f87b5c18d 100644 --- a/src/components/views/dialogs/TabbedIntegrationManagerDialog.tsx +++ b/src/components/views/dialogs/TabbedIntegrationManagerDialog.tsx @@ -31,7 +31,7 @@ interface IProps extends IDialogProps { /** * Optional room where the integration manager should be open to */ - room: Room; + room?: Room; /** * Optional screen to open on the integration manager From 6568e22d70fc127010a21e7ee338fd948fc3487d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 10 Sep 2021 19:06:09 +0200 Subject: [PATCH 071/256] Add missing import MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/dialogs/LazyLoadingDisabledDialog.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/dialogs/LazyLoadingDisabledDialog.tsx b/src/components/views/dialogs/LazyLoadingDisabledDialog.tsx index 79b8306989..76e7407173 100644 --- a/src/components/views/dialogs/LazyLoadingDisabledDialog.tsx +++ b/src/components/views/dialogs/LazyLoadingDisabledDialog.tsx @@ -19,6 +19,7 @@ import React from 'react'; import QuestionDialog from './QuestionDialog'; import { _t } from '../../../languageHandler'; import SdkConfig from '../../../SdkConfig'; +import { IDialogProps } from "./IDialogProps"; interface IProps extends IDialogProps { host: string; From 52d203dd8e1033325be8681bf629fdf734127dd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 10 Sep 2021 19:07:55 +0200 Subject: [PATCH 072/256] Add missing types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/dialogs/InteractiveAuthDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/InteractiveAuthDialog.tsx b/src/components/views/dialogs/InteractiveAuthDialog.tsx index ededfa3bc0..9a1bec70c9 100644 --- a/src/components/views/dialogs/InteractiveAuthDialog.tsx +++ b/src/components/views/dialogs/InteractiveAuthDialog.tsx @@ -127,7 +127,7 @@ export default class InteractiveAuthDialog extends React.Component { + private onUpdateStagePhase = (newStage: number, newPhase: number): void => { // We copy the stage and stage phase params into state for title selection in render() this.setState({ uiaStage: newStage, uiaStagePhase: newPhase }); }; From 0efd59901420572e1cb5e0086fa99e903936837b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 10 Sep 2021 19:12:33 +0200 Subject: [PATCH 073/256] Fix types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/dialogs/InteractiveAuthDialog.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/views/dialogs/InteractiveAuthDialog.tsx b/src/components/views/dialogs/InteractiveAuthDialog.tsx index 9a1bec70c9..e6cf72cf9a 100644 --- a/src/components/views/dialogs/InteractiveAuthDialog.tsx +++ b/src/components/views/dialogs/InteractiveAuthDialog.tsx @@ -73,8 +73,8 @@ interface IState { authError: Error; // See _onUpdateStagePhase() - uiaStage: number; - uiaStagePhase: number; + uiaStage: number | string; + uiaStagePhase: number | string; } @replaceableComponent("views.dialogs.InteractiveAuthDialog") @@ -127,7 +127,7 @@ export default class InteractiveAuthDialog extends React.Component { + private onUpdateStagePhase = (newStage: string | number, newPhase: string | number): void => { // We copy the stage and stage phase params into state for title selection in render() this.setState({ uiaStage: newStage, uiaStagePhase: newPhase }); }; From 3fffbb084537635b5897b9b1ba0bbc272724259d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 10 Sep 2021 19:19:29 +0200 Subject: [PATCH 074/256] Use ISasEvent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/dialogs/IncomingSasDialog.tsx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/components/views/dialogs/IncomingSasDialog.tsx b/src/components/views/dialogs/IncomingSasDialog.tsx index 0c689e198d..e81a233055 100644 --- a/src/components/views/dialogs/IncomingSasDialog.tsx +++ b/src/components/views/dialogs/IncomingSasDialog.tsx @@ -27,6 +27,7 @@ import VerificationShowSas from "../verification/VerificationShowSas"; import BaseDialog from "./BaseDialog"; import DialogButtons from "../elements/DialogButtons"; import { IDialogProps } from "./IDialogProps"; +import { IGeneratedSas, ISasEvent } from "matrix-js-sdk/src/crypto/verification/SAS"; const PHASE_START = 0; const PHASE_SHOW_SAS = 1; @@ -47,12 +48,12 @@ interface IState { displayname?: string; }; opponentProfileError: Error; - sas: any; // TODO types + sas: IGeneratedSas; } @replaceableComponent("views.dialogs.IncomingSasDialog") export default class IncomingSasDialog extends React.Component { - private showSasEvent: any; // TODO: Types + private showSasEvent: ISasEvent; constructor(props: IProps) { super(props); @@ -115,8 +116,7 @@ export default class IncomingSasDialog extends React.Component { }); }; - // TODO: Types - private onVerifierShowSas = (e): void => { + private onVerifierShowSas = (e: ISasEvent): void => { this.showSasEvent = e; this.setState({ phase: PHASE_SHOW_SAS, @@ -124,8 +124,7 @@ export default class IncomingSasDialog extends React.Component { }); }; - // TODO: Types - private onVerifierCancel = (e): void => { + private onVerifierCancel = (): void => { this.setState({ phase: PHASE_CANCELLED, }); From e49aac9802de37127bee651b7d40063646532ffc Mon Sep 17 00:00:00 2001 From: libexus Date: Sat, 11 Sep 2021 07:35:44 +0000 Subject: [PATCH 075/256] Translated using Weblate (German) Currently translated at 99.1% (3135 of 3162 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 | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 9ee1f56d55..c14c160cb2 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -3642,5 +3642,37 @@ "Your private messages are normally encrypted, but this room isn't. Usually this is due to an unsupported device or method being used, like email invites.": "Dieser Raum ist nicht verschlüsselt. Oft ist dies aufgrund eines nicht unterstützten Geräts oder Methode wie E-Mail-Einladungen der Fall.", "Cross-signing is ready but keys are not backed up.": "Quersignatur ist bereit, die Schlüssel sind aber nicht gesichert.", "Help people in spaces to find and join private rooms": "Hilf Personen in Spaces, privaten Räumen beizutreten", - "Use Command + F to search timeline": "Nutze Command + F um den Verlauf zu durchsuchen" + "Use Command + F to search timeline": "Nutze Command + F um den Verlauf zu durchsuchen", + "Reply to thread…": "Nachricht an Thread senden…", + "Reply to encrypted thread…": "Verschlüsselte Nachricht an Thread senden…", + "Role in ": "Rolle in ", + "Results": "Ergebnisse", + "Rooms and spaces": "Räume und Spaces", + "Thread": "Thread", + "Show threads": "Threads anzeigen", + "Explore %(spaceName)s": "%(spaceName)s erkunden", + "Send a sticker": "Sticker senden", + "Add emoji": "Emoji hinzufügen", + "Are you sure you want to make this encrypted room public?": "Willst du diesen verschlüsselten Raum wirklich öffentlich machen?", + "Unknown failure": "Unbekannter Fehler", + "Failed to update the join rules": "Fehler beim updaten der Beitrittsregeln", + "To avoid these issues, create a new encrypted room for the conversation you plan to have.": "Um dieses Problem zu vermeiden, erstelle einen neuen verschlüsselten Raum für deine Konversation.", + "It's not recommended to add encryption to public rooms.Anyone can find and join public rooms, so anyone can read messages in them. You'll get none of the benefits of encryption, and you won't be able to turn it off later. Encrypting messages in a public room will make receiving and sending messages slower.": "Verschlüsselung ist für öffentliche Räume nicht empfohlen. Jeder kann den Raum betreten und so auch Nachrichten lesen und Senden und Empfangen wird langsamer. Du hast daher von der Verschlüsselung keinen Vorteil und kannst sie später nicht mehr ausschalten.", + "Are you sure you want to add encryption to this public room?": "Dieser Raum ist öffentlich. Willst du die Verschlüsselung wirklich aktivieren?", + "Change description": "Beschreibung bearbeiten", + "Change main address for the space": "Hauptadresse des Space ändern", + "Change space name": "Name des Space ändern", + "Change space avatar": "Space-Icon ändern", + "Anyone in can find and join. You can select other spaces too.": "Alle in kann beitreten. Du kannst auch weitere Spaces auswählen.", + "Currently, %(count)s spaces have access|one": "Derzeit hat ein Space Zugriff", + "& %(count)s more|one": "und %(count)s weitere", + "Low bandwidth mode (requires compatible homeserver)": "Modus für niedrige Bandweite (kompatibler Heimserver benötigt)", + "Autoplay videos": "Videos automatisch abspielen", + "Autoplay GIFs": "GIFs automatisch abspielen", + "Multiple integration managers (requires manual setup)": "Mehrere Integrationsmanager (benötigt manuelles Einrichten)", + "Threaded messaging": "Threads", + "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s hat eine Nachricht losgelöst. Alle angepinnten Nachrichten anzeigen.", + "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s hat eine Nachricht losgeheftet. Alle angehefteten Nachrichten anzeigen.", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s hat eine Nachricht angeheftet. Alle angehefteten Nachrichten anzeigen.", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s hat eine Nachricht angeheftet. Alle angehefteten Nachrichten anzeigen." } From 8b3ff8096d7a1d6b189b5498dd1aa792d5020702 Mon Sep 17 00:00:00 2001 From: iaiz Date: Sun, 12 Sep 2021 12:47:17 +0000 Subject: [PATCH 076/256] Translated using Weblate (Spanish) Currently translated at 99.9% (3160 of 3162 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 72e6f4fdb6..bc604e938c 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -3644,5 +3644,18 @@ "Some encryption parameters have been changed.": "Algunos parámetros del cifrado han cambiado.", "Role in ": "Rol en ", "Currently, %(count)s spaces have access|one": "Ahora mismo, un espacio tiene acceso", - "& %(count)s more|one": "y %(count)s más" + "& %(count)s more|one": "y %(count)s más", + "Select the roles required to change various parts of the space": "Selecciona los roles necesarios para cambiar varios ajustes del espacio", + "Failed to update the join rules": "Fallo al actualizar las reglas para unirse", + "Anyone in can find and join. You can select other spaces too.": "Cualquiera en puede encontrar y unirse. También puedes seleccionar otros espacios.", + "Explore %(spaceName)s": "Explorar %(spaceName)s", + "Send a sticker": "Enviar una pegatina", + "Reply to encrypted thread…": "Responder al tema cifrado…", + "Reply to thread…": "Responder al tema…", + "Add emoji": "Añadir emojis", + "Unknown failure": "Fallo desconocido", + "Change space avatar": "Cambiar la imagen del espacio", + "Change space name": "Cambiar el nombre del espacio", + "Change main address for the space": "Cambiar dirección principal del espacio", + "Change description": "Cambiar descripción" } From 574ec26ee823a4e6685043ce2e3ed9845c48b4b5 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Sun, 12 Sep 2021 07:56:18 +0000 Subject: [PATCH 077/256] Translated using Weblate (Hungarian) Currently translated at 100.0% (3162 of 3162 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 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 79b79130bd..cd3779a3a3 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -3703,5 +3703,13 @@ "Send a sticker": "Matrica küldése", "Reply to thread…": "Válasz az üzenetszálra…", "Reply to encrypted thread…": "Válasz a titkosított üzenetszálra…", - "Add emoji": "Emodzsi hozzáadás" + "Add emoji": "Emodzsi hozzáadás", + "Unknown failure": "Ismeretlen hiba", + "Failed to update the join rules": "A csatlakozási szabályokat nem sikerült frissíteni", + "Select the roles required to change various parts of the space": "A tér bizonyos beállításainak megváltoztatásához szükséges szerep kiválasztása", + "Change description": "Leírás megváltoztatása", + "Change main address for the space": "Tér elsődleges címének megváltoztatása", + "Change space name": "Tér nevének megváltoztatása", + "Change space avatar": "Tér profilkép megváltoztatása", + "Anyone in can find and join. You can select other spaces too.": " téren bárki megtalálhatja és beléphet. Kiválaszthat más tereket is." } From 3d140154048890475a8b79ec2c4f91b2d90a2218 Mon Sep 17 00:00:00 2001 From: jelv Date: Mon, 13 Sep 2021 08:19:38 +0000 Subject: [PATCH 078/256] Translated using Weblate (Dutch) Currently translated at 100.0% (3162 of 3162 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 | 101 ++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 44 deletions(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 373a017bd8..33165a11d1 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -422,7 +422,7 @@ "Delete Widget": "Widget verwijderen", "Who would you like to add to this community?": "Wie wil je toevoegen aan deze gemeenschap?", "Invite to Community": "Uitnodigen tot gemeenschap", - "Show these rooms to non-members on the community page and room list?": "Deze kamers tonen aan niet-leden op de gemeenschapspagina en openbare kamerlijst?", + "Show these rooms to non-members on the community page and room list?": "Deze kamers tonen aan niet-leden op de gemeenschapspagina en publieke kamersgids?", "Add rooms to the community": "Voeg kamers toe aan de gemeenschap", "Add to community": "Toevoegen aan gemeenschap", "Failed to invite the following users to %(groupId)s:": "Uitnodigen van volgende personen tot %(groupId)s is mislukt:", @@ -1177,7 +1177,7 @@ "Homeserver URL": "Thuisserver-URL", "Identity Server URL": "Identiteitsserver-URL", "Free": "Gratis", - "Join millions for free on the largest public server": "Neem deel aan de grootste openbare server met miljoenen anderen", + "Join millions for free on the largest public server": "Neem deel aan de grootste publieke server samen met miljoenen anderen", "Premium": "Premium", "Premium hosting for organisations Learn more": "Premium hosting voor organisaties Lees meer", "Other": "Overige", @@ -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 u al dan niet de afbeeldingen voor recent bekeken kamers (boven de kamerlijst) gebruikt", + "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Of u al dan niet de afbeeldingen voor recent bekeken kamers (boven de lijst met kamers) 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.", @@ -1454,7 +1454,7 @@ "Send read receipts for messages (requires compatible homeserver to disable)": "Verstuur leesbevestigingen voor berichten (uitschakelen vereist een compatibele thuisserver)", "Accept to continue:": "Aanvaard om door te gaan:", "ID": "ID", - "Public Name": "Openbare naam", + "Public Name": "Publieke naam", "Change identity server": "Identiteitsserver wisselen", "Disconnect from the identity server and connect to instead?": "Verbinding met identiteitsserver verbreken en in plaats daarvan verbinden met ?", "Disconnect identity server": "Verbinding met identiteitsserver verbreken", @@ -1698,7 +1698,7 @@ "Session ID:": "Sessie-ID:", "Session key:": "Sessiesleutel:", "Message search": "Berichten zoeken", - "A session's public name is visible to people you communicate with": "De openbare naam van een sessie is zichtbaar voor de personen waarmee u communiceert", + "A session's public name is visible to people you communicate with": "De publieke naam van een sessie is zichtbaar voor de personen waarmee u communiceert", "This room is bridging messages to the following platforms. Learn more.": "Dit gesprek wordt overbrugd naar de volgende platformen. Lees meer", "This room isn’t bridging messages to any platforms. Learn more.": "Dit gesprek wordt niet overbrugd naar andere platformen. Lees meer.", "Bridges": "Bruggen", @@ -2349,7 +2349,7 @@ "Show rooms with unread messages first": "Kamers met ongelezen berichten als eerste tonen", "%(count)s results|one": "%(count)s resultaten", "%(count)s results|other": "%(count)s resultaten", - "Explore all public rooms": "Verken alle openbare gespreken", + "Explore all public rooms": "Verken alle publieke kamers", "Start a new chat": "Nieuw gesprek beginnen", "Can't see what you’re looking for?": "Niet kunnen vinden waar u naar zocht?", "Custom Tag": "Aangepast label", @@ -2474,7 +2474,7 @@ "Matrix": "Matrix", "Are you sure you want to remove %(serverName)s": "Weet u zeker dat u %(serverName)s wilt verwijderen", "Your server": "Uw server", - "Can't find this server or its room list": "Kan de server of haar kamerlijst niet vinden", + "Can't find this server or its room list": "Kan de server of haar kamergids niet vinden", "Looks good": "Ziet er goed uit", "Enter a server name": "Geef een servernaam", "Continue with %(provider)s": "Doorgaan met %(provider)s", @@ -3027,11 +3027,11 @@ "Save Changes": "Wijzigingen opslaan", "Saving...": "Opslaan...", "View dev tools": "Bekijk dev tools", - "Leave Space": "Space verlaten", + "Leave Space": "Ruimte verlaten", "Make this space private": "Maak deze space privé", - "Failed to save space settings.": "Het opslaan van de space-instellingen is mislukt.", + "Failed to save space settings.": "Het opslaan van de ruimte-instellingen is mislukt.", "Space settings": "Space-instellingen", - "Edit settings relating to your space.": "Bewerk instellingen gerelateerd aan uw space.", + "Edit settings relating to your space.": "Bewerk instellingen gerelateerd aan uw ruimte.", "Invite someone using their name, username (like ) or share this space.": "Nodig iemand uit per naam, inlognaam (zoals ) of deel deze space.", "Invite someone using their name, email address, username (like ) or share this space.": "Nodig iemand uit per naam, e-mailadres, inlognaam (zoals ) of deel deze space.", "Unnamed Space": "Naamloze space", @@ -3041,7 +3041,7 @@ "Applying...": "Toepassen...", "Create a new room": "Nieuw gesprek aanmaken", "Don't want to add an existing room?": "Wilt u geen bestaand gesprek toevoegen?", - "Spaces": "Spaces", + "Spaces": "Ruimtes", "Filter your rooms and spaces": "Gesprekken en spaces filteren", "Add existing spaces/rooms": "Bestaande spaces/gesprekken toevoegen", "Space selection": "Space-selectie", @@ -3063,27 +3063,27 @@ "New room": "Nieuw gesprek", "Leave space": "Space verlaten", "Invite people": "Personen uitnodigen", - "Share your public space": "Deel uw openbare space", + "Share your public space": "Deel uw publieke ruimte", "Invite members": "Leden uitnodigen", "Invite by email or username": "Uitnodigen per e-mail of gebruikersnaam", "Share invite link": "Deel uitnodigingskoppeling", "Click to copy": "Klik om te kopiëren", - "Collapse space panel": "Space-paneel invouwen", - "Expand space panel": "Space-paneel uitvouwen", + "Collapse space panel": "Ruimte-paneel invouwen", + "Expand space panel": "Ruimte-paneel uitvouwen", "Creating...": "Aanmaken...", "You can change these at any point.": "U kan dit op elk moment aanpassen.", "Give it a photo, name and description to help you identify it.": "Geef het een foto, naam en omschrijving om u te helpen het te herkennen.", - "Your private space": "Uw privé space", - "Your public space": "Uw openbare space", + "Your private space": "Uw privéruimte", + "Your public space": "Uw publieke ruimte", "You can change this later": "U kan dit later aanpassen", "Invite only, best for yourself or teams": "Alleen op uitnodiging, geschikt voor uzelf of teams", "Private": "Privé", - "Open space for anyone, best for communities": "Openbare space voor iedereen, geschikt voor gemeenschappen", + "Open space for anyone, best for communities": "Publieke ruimte voor iedereen, geschikt voor gemeenschappen", "Public": "Openbaar", "Spaces are new ways to group rooms and people. To join an existing space you’ll need an invite": "Spaces is een nieuwe manier van groeperen van gesprekken en personen. Om deel te nemen aan een bestaande space heeft u een uitnodiging nodig", - "Create a space": "Space aanmaken", + "Create a space": "Ruimte maken", "Delete": "Verwijderen", - "Spaces prototype. Incompatible with Communities, Communities v2 and Custom Tags. Requires compatible homeserver for some features.": "Spaces prototype. Niet compatibel met Gemeenschappen, Gemeenschappen v2 en Aangepaste Labels. Vereist een geschikte homeserver voor sommige functies.", + "Spaces prototype. Incompatible with Communities, Communities v2 and Custom Tags. Requires compatible homeserver for some features.": "Ruimtes prototype. Niet compatibel met Gemeenschappen, Gemeenschappen v2 en Aangepaste Labels. Vereist een geschikte homeserver voor sommige functies.", "This homeserver has been blocked by it's administrator.": "Deze homeserver is geblokkeerd door zijn beheerder.", "This homeserver has been blocked by its administrator.": "Deze homeserver is geblokkeerd door uw beheerder.", "Already in call": "Al in de oproep", @@ -3100,7 +3100,7 @@ "It's just you at the moment, it will be even better with others.": "Het is alleen u op dit moment, het zal nog beter zijn met anderen.", "Share %(name)s": "Deel %(name)s", "Private space": "Privé space", - "Public space": "Openbare space", + "Public space": "Publieke ruimte", " invites you": " nodigt u uit", "Search names and description": "Zoek in namen en beschrijvingen", "Create room": "Gesprek aanmaken", @@ -3222,7 +3222,7 @@ "Not all selected were added": "Niet alle geselecteerden zijn toegevoegd", "You can add existing spaces to a space.": "U kunt bestaande spaces toevoegen aan een space.", "Feeling experimental?": "Zin in een experiment?", - "You are not allowed to view this server's rooms list": "U heeft geen toegang tot deze server zijn kamerlijst", + "You are not allowed to view this server's rooms list": "U heeft geen toegang tot deze server zijn kamergids", "Error processing voice message": "Fout bij verwerking spraakbericht", "We didn't find a microphone on your device. Please check your settings and try again.": "We hebben geen microfoon gevonden op uw apparaat. Controleer uw instellingen en probeer het opnieuw.", "No microphone found": "Geen microfoon gevonden", @@ -3232,15 +3232,15 @@ "Your access token gives full access to your account. Do not share it with anyone.": "Uw toegangstoken geeft u toegang to uw account. Deel hem niet met anderen.", "Access Token": "Toegangstoken", "Spaces are a new way to group rooms and people. To join an existing space you'll need an invite.": "Spaces zijn de nieuwe manier om gesprekken en personen te groeperen. Om aan een bestaande space deel te nemen heeft u een uitnodiging nodig.", - "Please enter a name for the space": "Vul een naam in voor deze space", + "Please enter a name for the space": "Vul een naam in voor deze ruimte", "Connecting": "Verbinden", "Allow Peer-to-Peer for 1:1 calls (if you enable this, the other party might be able to see your IP address)": "Peer-to-peer voor 1op1 oproepen toestaan (als u dit inschakelt kunnen andere personen mogelijk uw ipadres zien)", "Beta available for web, desktop and Android. Some features may be unavailable on your homeserver.": "De beta is beschikbaar voor web, desktop en Android. Sommige functies zijn nog niet beschikbaar op uw homeserver.", "You can leave the beta any time from settings or tapping on a beta badge, like the one above.": "U kunt de beta elk moment verlaten via instellingen of door op de beta badge hierboven te klikken.", - "%(brand)s will reload with Spaces enabled. Communities and custom tags will be hidden.": "%(brand)s zal herladen met Spaces ingeschakeld. Gemeenschappen en labels worden verborgen.", + "%(brand)s will reload with Spaces enabled. Communities and custom tags will be hidden.": "%(brand)s zal herladen met Ruimtes ingeschakeld. Gemeenschappen en labels worden verborgen.", "Beta available for web, desktop and Android. Thank you for trying the beta.": "De beta is beschikbaar voor web, desktop en Android. Bedankt dat u de beta wilt proberen.", "%(brand)s will reload with Spaces disabled. Communities and custom tags will be visible again.": "%(brand)s zal herladen met Spaces uitgeschakeld. Gemeenschappen en labels zullen weer zichtbaar worden.", - "Spaces are a new way to group rooms and people.": "Spaces zijn de nieuwe manier om kamers en personen te groeperen.", + "Spaces are a new way to group rooms and people.": "Ruimtes zijn de nieuwe manier om kamers en personen te groeperen.", "Message search initialisation failed": "Zoeken in berichten opstarten is mislukt", "Spaces are a beta feature.": "Spaces zijn een beta functie.", "Search names and descriptions": "Namen en beschrijvingen zoeken", @@ -3252,12 +3252,12 @@ "Beta feedback": "Beta feedback", "Add reaction": "Reactie toevoegen", "Send and receive voice messages": "Stuur en ontvang spraakberichten", - "Your feedback will help make spaces better. The more detail you can go into, the better.": "Uw feedback maakt spaces beter. Hoe meer details u kan geven, des te beter.", - "If you leave, %(brand)s will reload with Spaces disabled. Communities and custom tags will be visible again.": "Als u de pagina nu verlaat zal %(brand)s herladen met Spaces uitgeschakeld. Gemeenschappen en labels zullen weer zichtbaar worden.", + "Your feedback will help make spaces better. The more detail you can go into, the better.": "Uw feedback maakt ruimtes beter. Hoe meer details u kunt geven, hoe beter.", + "If you leave, %(brand)s will reload with Spaces disabled. Communities and custom tags will be visible again.": "Als u de pagina nu verlaat zal %(brand)s herladen met Ruimtes uitgeschakeld. Gemeenschappen en labels zullen weer zichtbaar worden.", "Space Autocomplete": "Space Autocomplete", "Go to my space": "Ga naar mijn space", "sends space invaders": "verstuur space invaders", - "Sends the given message with a space themed effect": "Verstuur het bericht met een space-thema-effect", + "Sends the given message with a space themed effect": "Verstuur het bericht met een ruimte-thema-effect", "See when people join, leave, or are invited to your active room": "Zie wanneer personen deelnemen, vertrekken of worden uitgenodigd in uw actieve kamer", "Kick, ban, or invite people to your active room, and make you leave": "Verwijder, verban of nodig personen uit voor uw actieve kamer en uzelf laten vertrekken", "See when people join, leave, or are invited to this room": "Zie wanneer personen deelnemen, vertrekken of worden uitgenodigd voor deze kamer", @@ -3324,21 +3324,21 @@ "Space information": "Spaceinformatie", "Collapse": "Invouwen", "Expand": "Uitvouwen", - "Recommended for public spaces.": "Aanbevolen voor openbare spaces.", + "Recommended for public spaces.": "Aanbevolen voor publieke ruimtes.", "Allow people to preview your space before they join.": "Personen toestaan een voorbeeld van uw space te zien voor deelname.", "Preview Space": "Voorbeeld Space", "only invited people can view and join": "alleen uitgenodigde personen kunnen lezen en deelnemen", "anyone with the link can view and join": "iedereen met een link kan lezen en deelnemen", "Decide who can view and join %(spaceName)s.": "Bepaal wie kan lezen en deelnemen aan %(spaceName)s.", "Visibility": "Zichtbaarheid", - "This may be useful for public spaces.": "Dit kan nuttig zijn voor openbare spaces.", + "This may be useful for public spaces.": "Dit kan nuttig zijn voor publieke ruimtes.", "Guests can join a space without having an account.": "Gasten kunnen deelnemen aan een space zonder een account.", "Enable guest access": "Gastentoegang inschakelen", - "Failed to update the history visibility of this space": "Het bijwerken van de geschiedenis leesbaarheid voor deze space is mislukt", - "Failed to update the guest access of this space": "Het bijwerken van de gastentoegang van deze space is niet gelukt", + "Failed to update the history visibility of this space": "Het bijwerken van de geschiedenis leesbaarheid voor deze ruimte is mislukt", + "Failed to update the guest access of this space": "Het bijwerken van de gastentoegang van deze ruimte is niet gelukt", "Failed to update the visibility of this space": "Het bijwerken van de zichtbaarheid van deze space is mislukt", "Address": "Adres", - "e.g. my-space": "v.b. mijn-space", + "e.g. my-space": "v.b. mijn-ruimte", "Silence call": "Oproep dempen", "Sound on": "Geluid aan", "Show notification badges for People in Spaces": "Toon meldingsbadge voor personen in spaces", @@ -3436,11 +3436,11 @@ "Only invited people can join.": "Alleen uitgenodigde personen kunnen deelnemen.", "Private (invite only)": "Privé (alleen op uitnodiging)", "This upgrade will allow members of selected spaces access to this room without an invite.": "Deze upgrade maakt het mogelijk voor leden van geselecteerde spaces om toegang te krijgen tot dit gesprek zonder een uitnodiging.", - "This makes it easy for rooms to stay private to a space, while letting people in the space find and join them. All new rooms in a space will have this option available.": "Dit maakt het makkelijk om kamers privé te houden voor een space, terwijl personen in de space hem kunnen vinden en aan deelnemen. Alle nieuwe kamers in deze space hebben deze optie beschikbaar.", - "To help space members find and join a private room, go to that room's Security & Privacy settings.": "Om space leden te helpen met het vinden van en deel te nemen aan privékamers, ga naar uw kamerinstellingen voor veiligheid & privacy.", - "Help space members find private rooms": "Help space leden privékamers te vinden", - "Help people in spaces to find and join private rooms": "Help personen in spaces om privékamers te vinden en aan deel te nemen", - "New in the Spaces beta": "Nieuw in de spaces beta", + "This makes it easy for rooms to stay private to a space, while letting people in the space find and join them. All new rooms in a space will have this option available.": "Dit maakt het makkelijk om kamers privé te houden voor een ruimte, terwijl personen in de ruimte hem kunnen vinden en aan deelnemen. Alle nieuwe kamers in deze ruimte hebben deze optie beschikbaar.", + "To help space members find and join a private room, go to that room's Security & Privacy settings.": "Om ruimte leden te helpen met het vinden van en deel te nemen aan privékamers, ga naar uw kamerinstellingen voor veiligheid & privacy.", + "Help space members find private rooms": "Help ruimte leden privékamers te vinden", + "Help people in spaces to find and join private rooms": "Help personen in ruimtes om privékamers te vinden en aan deel te nemen", + "New in the Spaces beta": "Nieuw in de ruimtes beta", "Everyone in will be able to find and join this room.": "Iedereen in kan dit gesprek vinden en aan deelnemen.", "Image": "Afbeelding", "Sticker": "Sticker", @@ -3483,9 +3483,9 @@ "Your camera is turned off": "Uw camera staat uit", "%(sharerName)s is presenting": "%(sharerName)s is aan het presenteren", "You are presenting": "U bent aan het presenteren", - "Thank you for trying Spaces. Your feedback will help inform the next versions.": "Dankuwel voor het gebruiken van Spaces. Uw feedback helpt ons volgende versies te maken.", - "Spaces feedback": "Spaces feedback", - "Spaces are a new feature.": "Spaces zijn een nieuwe functie.", + "Thank you for trying Spaces. Your feedback will help inform the next versions.": "Dankuwel voor het gebruiken van ruimtes. Uw feedback helpt ons volgende versies te maken.", + "Spaces feedback": "Ruimtes feedback", + "Spaces are a new feature.": "Ruimtes zijn een nieuwe functie.", "All rooms you're in will appear in Home.": "Alle kamers waar u in bent zullen in Home verschijnen.", "Send pseudonymous analytics data": "Pseudonieme analytische gegevens verzenden", "We're working on this, but just want to let you know.": "We zijn er nog mee bezig en wilde het u even laten weten.", @@ -3539,10 +3539,10 @@ "Communities have been archived to make way for Spaces but you can convert your communities into Spaces below. Converting will ensure your conversations get the latest features.": "Gemeenschappen zijn gearchiveerd om ruimte te maken voor Spaces, maar u kunt uw gemeenschap omzetten naar een space hieronder. Hierdoor bent u er zeker van dat uw gesprekken de nieuwste functies krijgen.", "Create Space": "Space aanmaken", "Open Space": "Space openen", - "To join an existing space you'll need an invite.": "Om deel te nemen aan een bestaande space heeft u een uitnodiging nodig.", - "You can also create a Space from a community.": "U kunt ook een Space maken van een gemeenschap.", + "To join an existing space you'll need an invite.": "Om deel te nemen aan een bestaande ruimte heeft u een uitnodiging nodig.", + "You can also create a Space from a community.": "U kunt ook een ruimte maken van een gemeenschap.", "You can change this later.": "U kan dit later aanpassen.", - "What kind of Space do you want to create?": "Wat voor soort Space wilt u maken?", + "What kind of Space do you want to create?": "Wat voor soort ruimte wilt u maken?", "Delete avatar": "Afbeelding verwijderen", "Don't send read receipts": "Geen leesbevestigingen versturen", "Created from ": "Gemaakt van ", @@ -3592,5 +3592,18 @@ "Currently, %(count)s spaces have access|one": "Momenteel heeft één ruimte toegang", "& %(count)s more|one": "& %(count)s meer", "Some encryption parameters have been changed.": "Enkele versleutingsparameters zijn gewijzigd.", - "Role in ": "Rol in " + "Role in ": "Rol in ", + "Explore %(spaceName)s": "Verken %(spaceName)s", + "Send a sticker": "Verstuur een sticker", + "Reply to thread…": "Reageer op draad…", + "Reply to encrypted thread…": "Reageer op versleutelde draad…", + "Add emoji": "Emoji toevoegen", + "Unknown failure": "Onbekende fout", + "Failed to update the join rules": "Het updaten van de deelname regels is mislukt", + "Select the roles required to change various parts of the space": "Selecteer de rollen die vereist zijn om onderdelen van de ruimte te wijzigen", + "Change description": "Omschrijving veranderen", + "Change main address for the space": "Hoofdadres van ruimte veranderen", + "Change space name": "Ruimtenaam veranderen", + "Change space avatar": "Ruimte-avatar veranderen", + "Anyone in can find and join. You can select other spaces too.": "Iedereen in kan zoeken en deelnemen. U kunt ook andere ruimtes selecteren." } From 588a6d1c41b0a391e1912b75687dfd8fbecf97fe Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Mon, 13 Sep 2021 08:55:11 +0000 Subject: [PATCH 079/256] Translated using Weblate (Russian) Currently translated at 98.2% (3107 of 3162 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 | 68 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 6d6bf86559..2b1d59c053 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -3581,5 +3581,71 @@ "%(oneUser)schanged the pinned messages for the room %(count)s times.|other": "%(oneUser)s изменил(а) прикреплённые сообщения в комнате %(count)s раз.", "%(severalUsers)schanged the pinned messages for the room %(count)s times.|other": "%(severalUsers)s изменили прикреплённые сообщения в комнате %(count)s раз.", "Delete avatar": "Удалить аватар", - "Don't send read receipts": "Не отправлять уведомления о прочтении" + "Don't send read receipts": "Не отправлять уведомления о прочтении", + "Created from ": "Создано из ", + "Rooms and spaces": "Комнаты и пространства", + "Results": "Результаты", + "Communities won't receive further updates.": "Сообщества не будут получать дальнейших обновлений.", + "Spaces are a new way to make a community, with new features coming.": "Пространства - это новый способ создания сообщества с новыми возможностями.", + "Communities can now be made into Spaces": "Сообщества теперь можно преобразовать в пространства", + "Ask the admins of this community to make it into a Space and keep a look out for the invite.": "Попросите администраторов этого сообщества сделать его пространством и следите за приглашением в него.", + "You can create a Space from this community here.": "Вы можете создать пространство из этого сообщества здесь.", + "This description will be shown to people when they view your space": "Это описание будет показано людям, когда они будут просматривать ваше пространство", + "Flair won't be available in Spaces for the foreseeable future.": "В ближайшем будущем значки не будут доступны в пространствах.", + "All rooms will be added and all community members will be invited.": "Будут добавлены все комнаты и приглашены все участники сообщества.", + "A link to the Space will be put in your community description.": "Ссылка на пространство будет размещена в описании вашего сообщества.", + "Create Space from community": "Создать пространство из сообщества", + "Failed to migrate community": "Не удалось преобразовать сообщество", + "To create a Space from another community, just pick the community in Preferences.": "Чтобы создать пространство из другого сообщества, просто выберите сообщество в настройках.", + " has been made and everyone who was a part of the community has been invited to it.": " было создано, и все, кто был частью сообщества, были приглашены в него.", + "Space created": "Пространство создано", + "To view Spaces, hide communities in Preferences": "Чтобы просмотреть Пространства, скройте сообщества в Параметрах", + "This community has been upgraded into a Space": "Это сообщество было обновлено в пространство", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Журналы отладки содержат данные об использовании приложения, включая ваше имя пользователя, идентификаторы или псевдонимы комнат или групп, которые вы посетили, с какими элементами пользовательского интерфейса вы взаимодействовали в последний раз, а также имена пользователей других пользователей. Они не содержат сообщений.", + "Some encryption parameters have been changed.": "Некоторые параметры шифрования были изменены.", + "Unknown failure: %(reason)s": "Неизвестная ошибка: %(reason)s", + "No answer": "Нет ответа", + "Role in ": "Роль в ", + "Explore %(spaceName)s": "Исследовать %(spaceName)s", + "Enable encryption in settings.": "Включите шифрование в настройках.", + "Your private messages are normally encrypted, but this room isn't. Usually this is due to an unsupported device or method being used, like email invites.": "Ваши личные сообщения обычно шифруются, но эта комната не шифруется. Обычно это связано с использованием неподдерживаемого устройства или метода, например, приглашения по электронной почте.", + "Send a sticker": "Отправить стикер", + "Add emoji": "Добавить смайлик", + "To avoid these issues, create a new public room for the conversation you plan to have.": "Чтобы избежать этих проблем, создайте новую публичную комнату для разговора, который вы планируете провести.", + "It's not recommended to make encrypted rooms public. It will mean anyone can find and join the room, so anyone can read messages. You'll get none of the benefits of encryption. Encrypting messages in a public room will make receiving and sending messages slower.": "Не рекомендуется делать зашифрованные комнаты публичными. Это означает, что любой может найти и присоединиться к комнате, а значит, любой может читать сообщения. Вы не получите ни одного из преимуществ шифрования. Шифрование сообщений в публичной комнате сделает получение и отправку сообщений более медленной.", + "Are you sure you want to make this encrypted room public?": "Вы уверены, что хотите сделать эту зашифрованную комнату публичной?", + "Unknown failure": "Неизвестная ошибка", + "Failed to update the join rules": "Не удалось обновить правила присоединения", + "To avoid these issues, create a new encrypted room for the conversation you plan to have.": "Чтобы избежать этих проблем, создайте новую зашифрованную комнату для разговора, который вы планируете провести.", + "It's not recommended to add encryption to public rooms.Anyone can find and join public rooms, so anyone can read messages in them. You'll get none of the benefits of encryption, and you won't be able to turn it off later. Encrypting messages in a public room will make receiving and sending messages slower.": "Не рекомендуется добавлять шифрование в публичные комнаты. Любой может найти и присоединиться к публичным комнатам, поэтому любой может прочитать сообщения в них. Вы не получите ни одного из преимуществ шифрования, и вы не сможете отключить его позже. Шифрование сообщений в публичной комнате замедляет получение и отправку сообщений.", + "Are you sure you want to add encryption to this public room?": "Вы уверены, что хотите добавить шифрование в эту публичную комнату?", + "Select the roles required to change various parts of the space": "Выберите роли, необходимые для изменения различных частей пространства", + "Change description": "Изменить описание", + "Change main address for the space": "Изменить основной адрес для пространства", + "Change space name": "Изменить название пространства", + "Change space avatar": "Изменить аватар пространства", + "If a community isn't shown you may not have permission to convert it.": "Если сообщество не показано, у вас может не быть разрешения на его преобразование.", + "Show my Communities": "Показать мои сообщества", + "Communities have been archived to make way for Spaces but you can convert your communities into Spaces below. Converting will ensure your conversations get the latest features.": "Сообщества были архивированы, чтобы освободить место для пространств, но вы можете преобразовать свои сообщества в пространства ниже. Преобразование позволит вашим беседам получить новейшие функции.", + "Create Space": "Создать пространство", + "Open Space": "Открыть пространство", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Если вы отправили ошибку через GitHub, журналы отладки могут помочь нам отследить проблему. Журналы отладки содержат данные об использовании приложения, включая ваше имя пользователя, идентификаторы или псевдонимы комнат или групп, которые вы посетили, с какими элементами пользовательского интерфейса вы взаимодействовали в последний раз, а также имена других пользователей. Они не содержат сообщений.", + "Anyone in can find and join. You can select other spaces too.": "Любой человек в может найти и присоединиться. Вы можете выбрать и другие пространства.", + "Currently, %(count)s spaces have access|one": "В настоящее время пространство имеет доступ", + "& %(count)s more|one": "и %(count)s еще", + "Cross-signing is ready but keys are not backed up.": "Кросс-подпись готова, но ключи не резервируются.", + "To join an existing space you'll need an invite.": "Чтобы присоединиться к существующему пространству, вам потребуется приглашение.", + "You can also create a Space from a community.": "Вы также можете создать пространство из сообщества.", + "You can change this later.": "Вы можете изменить это позже.", + "What kind of Space do you want to create?": "Какое пространство вы хотите создать?", + "Low bandwidth mode (requires compatible homeserver)": "Режим низкой пропускной способности (требуется совместимый домашний сервер)", + "Autoplay videos": "Автовоспроизведение видео", + "Autoplay GIFs": "Автовоспроизведение GIF", + "Multiple integration managers (requires manual setup)": "Несколько менеджеров интеграции (требуется ручная настройка)", + "The above, but in as well": "Вышеописанное, но также в ", + "The above, but in any room you are joined or invited to as well": "Вышеперечисленное, но также в любой комнате, в которую вы вошли или приглашены", + "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s открепляет сообщение из этой комнаты. Просмотрите все прикрепленые сообщения.", + "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s открепляет сообщение из этой комнаты. Просмотрите все прикрепленые сообщения.", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s прикрепляет сообщение в этой комнате. Просмотрите все прикрепленные сообщения.", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s прикрепляет сообщение в этой комнате. Просмотрите все прикрепленые сообщения." } From bfd3d9d8ec5c72ab9f71eeedf2acbbc72d5c6d68 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Sat, 11 Sep 2021 09:27:52 +0000 Subject: [PATCH 080/256] Translated using Weblate (Swedish) Currently translated at 100.0% (3162 of 3162 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 | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 237e3d182e..b5749fcc81 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -3620,5 +3620,21 @@ "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s avfäste ett meddelande i det här rummet. Se alla fästa meddelanden.", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s fäste ett meddelande i det här rummet. Se alla fästa meddelanden.", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s fäste ett meddelande i det här rummet. Se alla fästa meddelanden.", - "& %(count)s more|one": "& %(count)s till" + "& %(count)s more|one": "& %(count)s till", + "Some encryption parameters have been changed.": "Vissa krypteringsparametrar har ändrats.", + "Role in ": "Roll i ", + "Explore %(spaceName)s": "Utforska %(spaceName)s", + "Send a sticker": "Skicka en dekal", + "Reply to thread…": "Svara på tråd…", + "Reply to encrypted thread…": "Svara på krypterad tråd…", + "Add emoji": "Lägg till emoji", + "Unknown failure": "Okänt fel", + "Failed to update the join rules": "Misslyckades att uppdatera regler för att gå med", + "Select the roles required to change various parts of the space": "Välj de roller som krävs för att ändra olika delar av utrymmet", + "Change description": "Ändra beskrivningen", + "Change main address for the space": "Byt huvudadress för utrymmet", + "Change space name": "Byt utrymmesnamn", + "Change space avatar": "Byt utrymmesavatar", + "Anyone in can find and join. You can select other spaces too.": "Vem som helst i kan hitta och gå med. Du kan välja andra utrymmen också.", + "Currently, %(count)s spaces have access|one": "Just nu har ett utrymme åtkomst" } From 13b2c70947a019f32b94a88d7551cff5d290ae38 Mon Sep 17 00:00:00 2001 From: sr093906 Date: Fri, 10 Sep 2021 23:49:40 +0000 Subject: [PATCH 081/256] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3162 of 3162 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index ed9a6eff72..845409588f 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -3604,5 +3604,10 @@ "Add emoji": "添加表情", "Unknown failure": "未知失败", "Failed to update the join rules": "未能更新加入列表", - "Anyone in can find and join. You can select other spaces too.": " 中的任何人都可以寻找和加入。你也可以选择其他空间。" + "Anyone in can find and join. You can select other spaces too.": " 中的任何人都可以寻找和加入。你也可以选择其他空间。", + "Select the roles required to change various parts of the space": "选择改变空间各个部分所需的角色", + "Change description": "更改描述", + "Change main address for the space": "更改空间主地址", + "Change space name": "更改空间名称", + "Change space avatar": "更改空间头像" } From 20ab0067ff6a8ba575848dafb7ad3d8125578f60 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Sat, 11 Sep 2021 01:42:35 +0000 Subject: [PATCH 082/256] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (3162 of 3162 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 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 79d385c97a..bdf496fa8c 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -3712,5 +3712,13 @@ "Send a sticker": "傳送貼圖", "Reply to thread…": "回覆討論串……", "Reply to encrypted thread…": "回覆給已加密的討論串……", - "Add emoji": "新增表情符號" + "Add emoji": "新增表情符號", + "Unknown failure": "未知錯誤", + "Failed to update the join rules": "更新加入規則失敗", + "Select the roles required to change various parts of the space": "選取變更空間各個部份所需的角色", + "Change description": "變更描述", + "Change main address for the space": "變更空間的主要地址", + "Change space name": "變更空間名稱", + "Change space avatar": "變更空間大頭照", + "Anyone in can find and join. You can select other spaces too.": "在 中的任何人都可以找到並加入。您也可以選取其他空間。" } From d4c3aeebb8ca24f0612630d9af16886bf163026c Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Sat, 11 Sep 2021 21:47:24 +0000 Subject: [PATCH 083/256] Translated using Weblate (Ukrainian) Currently translated at 54.7% (1732 of 3162 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 793e40fc4c..785e1fabdf 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -527,11 +527,11 @@ "Confirm adding this email address by using Single Sign On to prove your identity.": "Підтвердьте додавання цієї адреси е-пошти через використання Single Sign On аби довести вашу ідентичність.", "Single Sign On": "Єдиний вхід", "Confirm adding email": "Підтвердити додавання е-пошти", - "Click the button below to confirm adding this email address.": "Клацніть на кнопці нижче щоб підтвердити додавання цієї адреси е-пошти.", + "Click the button below to confirm adding this email address.": "Клацніть на кнопку внизу, щоб підтвердити додавання цієї адреси е-пошти.", "Confirm": "Підтвердити", "Confirm adding this phone number by using Single Sign On to prove your identity.": "Підтвердьте додавання цього телефонного номера через використання Single Sign On аби довести вашу ідентичність.", "Confirm adding phone number": "Підтвердьте додавання телефонного номера", - "Click the button below to confirm adding this phone number.": "Клацніть на кнопці нижче щоб підтвердити додавання цього телефонного номера.", + "Click the button below to confirm adding this phone number.": "Клацніть на кнопку внизу, щоб підтвердити додавання цього номера телефону.", "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Чи використовуєте ви %(brand)s на пристрої, де основним засобом вводження є дотик", "Whether you're using %(brand)s as an installed Progressive Web App": "Чи використовуєте ви %(brand)s як встановлений Progressive Web App", "Your user agent": "Ваш user agent", @@ -1163,7 +1163,7 @@ "Show shortcuts to recently viewed rooms above the room list": "Показувати нещодавно бачені кімнати вгорі понад переліком кімнат", "Show hidden events in timeline": "Показувати приховані події у часоряді", "Show previews/thumbnails for images": "Показувати попередній перегляд зображень", - "Compare a unique set of emoji if you don't have a camera on either device": "Порівняйте унікальну низку емодзі якщо ви не маєте камери на жодному пристрої", + "Compare a unique set of emoji if you don't have a camera on either device": "Порівняйте унікальний набір емодзі якщо жоден ваш пристрій не має камери", "Confirm the emoji below are displayed on both sessions, in the same order:": "Підтвердьте, що емодзі внизу показано в обох сеансах в однаковому порядку:", "Verify this user by confirming the following emoji appear on their screen.": "Звірте цього користувача підтвердженням того, що наступні емодзі з'являються на його екрані.", "Emoji picker": "Обирач емодзі", @@ -1529,7 +1529,7 @@ "Find a room…": "Знайти кімнату…", "Can't find this server or its room list": "Не вдалось знайти цей сервер у переліку кімнат", "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Якщо ви не можете знайти потрібну кімнату, попросіть запрошення або Створіть нову кімнату власноруч.", - "Cannot reach homeserver": "Не вдається зв'язатися з домашнім сервером", + "Cannot reach homeserver": "Не вдалося зв'язатися з домашнім сервером", "Ensure you have a stable internet connection, or get in touch with the server admin": "Переконайтеся, що у ваше з'єднання з Інтернетом стабільне або зв’яжіться з системним адміністратором", "User %(user_id)s may or may not exist": "Користувач %(user_id)s можливо існує, а можливо й ні", "No need for symbols, digits, or uppercase letters": "Цифри або великі букви не вимагаються", @@ -1937,5 +1937,24 @@ "Send stickers into this room": "Надіслати наліпки до цієї кімнати", "Remain on your screen while running": "Залишати на екрані під час роботи", "Remain on your screen when viewing another room, when running": "Залишати на екрані під час перегляду іншої кімнати, під час роботи", - "%(senderName)s has updated the widget layout": "%(senderName)s оновлює макет розширення" + "%(senderName)s has updated the widget layout": "%(senderName)s оновлює макет розширення", + "See when the avatar changes in your active room": "Бачити, коли змінюється аватар вашої активної кімнати", + "Change the avatar of your active room": "Змінити аватар вашої активної кімнати", + "See when the avatar changes in this room": "Бачити, коли змінюється аватар цієї кімнати", + "Click the button below to confirm deleting these sessions.|other": "Клацніть на кнопку внизу, щоб підтвердити видалення цих сеансів.", + "Click the button below to confirm deleting these sessions.|one": "Клацніть на кнопку внизу, щоб підтвердити видалення цього сеансу.", + "Click the button below to confirm your identity.": "Клацніть на кнопку внизу, щоб підтвердити свою особу.", + "Confirm to continue": "Підтвердьте, щоб продовжити", + "Starting backup...": "Запуск резервного копіювання...", + "Now, let's help you get started": "Тепер допоможімо вам почати", + "Start authentication": "Почати автентифікацію", + "Start": "Почати", + "Start Verification": "Почати перевірку", + "Start chatting": "Почати спілкування", + "Start a new chat": "Почати нову бесіду", + "This is the start of .": "Це початок .", + "Start sharing your screen": "Почати показ екрана", + "Start the camera": "Запустити камеру", + "Scan this unique code": "Скануйте цей унікальний код", + "Verify this session by completing one of the following:": "Підтвердьте цей сеанс одним із запропонованих способів:" } From d9235108fd5072932c40ae394f5ee2a278a68d5d Mon Sep 17 00:00:00 2001 From: random Date: Mon, 13 Sep 2021 08:36:15 +0000 Subject: [PATCH 084/256] Translated using Weblate (Italian) Currently translated at 99.9% (3161 of 3162 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 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 72cd653679..5f93ba7684 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -3711,5 +3711,10 @@ "Add emoji": "Aggiungi emoji", "Unknown failure": "Errore sconosciuto", "Failed to update the join rules": "Modifica delle regole di accesso fallita", - "Anyone in can find and join. You can select other spaces too.": "Chiunque in può trovare ed entrare. Puoi selezionare anche altri spazi." + "Anyone in can find and join. You can select other spaces too.": "Chiunque in può trovare ed entrare. Puoi selezionare anche altri spazi.", + "Select the roles required to change various parts of the space": "Seleziona i ruoli necessari per cambiare varie parti dello spazio", + "Change description": "Cambia descrizione", + "Change main address for the space": "Cambia indirizzo principale dello spazio", + "Change space name": "Cambia nome dello spazio", + "Change space avatar": "Cambia avatar dello spazio" } From 5442f7483abaee365974f767e577c3500e82d776 Mon Sep 17 00:00:00 2001 From: XoseM Date: Sat, 11 Sep 2021 04:00:27 +0000 Subject: [PATCH 085/256] Translated using Weblate (Galician) Currently translated at 100.0% (3162 of 3162 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 | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 6d08bcb266..b351695462 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -3702,5 +3702,20 @@ "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s desafixou unha mensaxe desta sala. Mira tódalas mensaxes fixadas.", "%(senderName)s unpinned a message from this room. See all pinned messages.": "%(senderName)s deafixou unha mensaxe desta sala. Mira tódalas mensaxes fixadas.", "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s fixou unha mensaxe nesta sala. Mira tódalas mensaxes fixadas.", - "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s fixou unha mensaxe nesta sala. Mira tódalas mensaxes fixadas." + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s fixou unha mensaxe nesta sala. Mira tódalas mensaxes fixadas.", + "Some encryption parameters have been changed.": "Algún dos parámetros de cifrado foron cambiados.", + "Role in ": "Rol en ", + "Explore %(spaceName)s": "Explora %(spaceName)s", + "Send a sticker": "Enviar un adhesivo", + "Reply to thread…": "Responder á conversa…", + "Reply to encrypted thread…": "Responder á conversa cifrada…", + "Add emoji": "Engadir emoji", + "Unknown failure": "Fallo descoñecido", + "Failed to update the join rules": "Fallou a actualización das normas para unirse", + "Select the roles required to change various parts of the space": "Elexir os roles requeridos para cambiar varias partes do espazo", + "Change description": "Cambiar a descrición", + "Change main address for the space": "Cambiar o enderezo principal do espazo", + "Change space name": "Cambiar o nome do espazo", + "Change space avatar": "Cambiar o avatar do espazo", + "Anyone in can find and join. You can select other spaces too.": "Calquera en pode atopar e unirse. Tamén podes elexir outros espazos." } From cd7ab56cb57af76ff926e0a17fef5c554e2db81b Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Fri, 10 Sep 2021 21:36:28 +0000 Subject: [PATCH 086/256] Translated using Weblate (Albanian) Currently translated at 99.7% (3154 of 3162 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 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 428ac23c28..a340932457 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -3702,5 +3702,10 @@ "Add emoji": "Shtoni emoji", "Unknown failure": "Dështim i panjohur", "Failed to update the join rules": "S’u arrit të përditësohen rregulla hyrjeje", - "Anyone in can find and join. You can select other spaces too.": "Cilido te mund ta gjejë dhe hyjë në të. Mund të përzgjidhni gjithashtu hapësira të tjera." + "Anyone in can find and join. You can select other spaces too.": "Cilido te mund ta gjejë dhe hyjë në të. Mund të përzgjidhni gjithashtu hapësira të tjera.", + "Select the roles required to change various parts of the space": "Përzgjidhni rolet e domosdoshëm për të ndryshuar pjesë të ndryshme të hapësirës", + "Change description": "Ndryshoni përshkrimin", + "Change main address for the space": "Ndryshoni adresë kryesore për hapësirën", + "Change space name": "Ndryshoni emër hapësire", + "Change space avatar": "Ndryshoni avatar hapësire" } From d83d5563de797344e4aeb8a73d6b98dff44eb1cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Sun, 12 Sep 2021 07:48:22 +0000 Subject: [PATCH 087/256] Translated using Weblate (Estonian) Currently translated at 99.9% (3160 of 3162 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 | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 234a5902e2..8e86886b32 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -3684,5 +3684,11 @@ "Explore %(spaceName)s": "Tutvu kogukonnaga - %(spaceName)s", "Unknown failure": "Määratlemata viga", "Failed to update the join rules": "Liitumisreeglite uuendamine ei õnnestunud", - "Anyone in can find and join. You can select other spaces too.": "Kõik kogukonnakeskuse liikmed saavad leida ja liituda. Sa võid valida ka muid kogukonnakeskuseid." + "Anyone in can find and join. You can select other spaces too.": "Kõik kogukonnakeskuse liikmed saavad leida ja liituda. Sa võid valida ka muid kogukonnakeskuseid.", + "Select the roles required to change various parts of the space": "Vali rollid, mis on vajalikud kogukonna eri osade muutmiseks", + "Change description": "Muuda kirjeldust", + "Change main address for the space": "Muuda kogukonna põhiaadressi", + "Change space name": "Muuda kogukonna nime", + "Change space avatar": "Muuda kogukonna tunnuspilti", + "Displaying time": "Aegade kuvamine" } From 71e84ccb75aeb002b236d9c73c867496b5c89e84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Mon, 13 Sep 2021 18:03:05 +0200 Subject: [PATCH 088/256] Iterate PR first round MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/dialogs/IncomingSasDialog.tsx | 7 ++++--- src/components/views/dialogs/LazyLoadingDisabledDialog.tsx | 2 +- src/components/views/dialogs/LazyLoadingResyncDialog.tsx | 2 +- src/components/views/dialogs/QuestionDialog.tsx | 2 +- src/components/views/dialogs/TextInputDialog.tsx | 2 +- .../views/dialogs/security/RestoreKeyBackupDialog.tsx | 2 +- 6 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/components/views/dialogs/IncomingSasDialog.tsx b/src/components/views/dialogs/IncomingSasDialog.tsx index e81a233055..0e9d8cbf4e 100644 --- a/src/components/views/dialogs/IncomingSasDialog.tsx +++ b/src/components/views/dialogs/IncomingSasDialog.tsx @@ -28,6 +28,7 @@ import BaseDialog from "./BaseDialog"; import DialogButtons from "../elements/DialogButtons"; import { IDialogProps } from "./IDialogProps"; import { IGeneratedSas, ISasEvent } from "matrix-js-sdk/src/crypto/verification/SAS"; +import { VerificationBase } from "matrix-js-sdk/src/crypto/verification/Base"; const PHASE_START = 0; const PHASE_SHOW_SAS = 1; @@ -36,7 +37,7 @@ const PHASE_VERIFIED = 3; const PHASE_CANCELLED = 4; interface IProps extends IDialogProps { - verifier: any; // TODO types + verifier: VerificationBase; // TODO types } interface IState { @@ -59,7 +60,7 @@ export default class IncomingSasDialog extends React.Component { super(props); let phase = PHASE_START; - if (this.props.verifier.cancelled) { + if (this.props.verifier.hasBeenCancelled) { console.log("Verifier was cancelled in the background."); phase = PHASE_CANCELLED; } @@ -79,7 +80,7 @@ export default class IncomingSasDialog extends React.Component { public componentWillUnmount(): void { if (this.state.phase !== PHASE_CANCELLED && this.state.phase !== PHASE_VERIFIED) { - this.props.verifier.cancel('User cancel'); + this.props.verifier.cancel(new Error('User cancel')); } this.props.verifier.removeListener('show_sas', this.onVerifierShowSas); } diff --git a/src/components/views/dialogs/LazyLoadingDisabledDialog.tsx b/src/components/views/dialogs/LazyLoadingDisabledDialog.tsx index 76e7407173..ec30123436 100644 --- a/src/components/views/dialogs/LazyLoadingDisabledDialog.tsx +++ b/src/components/views/dialogs/LazyLoadingDisabledDialog.tsx @@ -25,7 +25,7 @@ interface IProps extends IDialogProps { host: string; } -const LazyLoadingDisabledDialog: React.FC = (props: IProps) => { +const LazyLoadingDisabledDialog: React.FC = (props) => { const brand = SdkConfig.get().brand; const description1 = _t( "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. " + diff --git a/src/components/views/dialogs/LazyLoadingResyncDialog.tsx b/src/components/views/dialogs/LazyLoadingResyncDialog.tsx index 3acedc77e4..e6a505511c 100644 --- a/src/components/views/dialogs/LazyLoadingResyncDialog.tsx +++ b/src/components/views/dialogs/LazyLoadingResyncDialog.tsx @@ -23,7 +23,7 @@ import { IDialogProps } from "./IDialogProps"; interface IProps extends IDialogProps {} -const LazyLoadingResyncDialog: React.FC = (props: IProps) => { +const LazyLoadingResyncDialog: React.FC = (props) => { const brand = SdkConfig.get().brand; const description = _t( diff --git a/src/components/views/dialogs/QuestionDialog.tsx b/src/components/views/dialogs/QuestionDialog.tsx index 8c6334bac1..aaddff34ed 100644 --- a/src/components/views/dialogs/QuestionDialog.tsx +++ b/src/components/views/dialogs/QuestionDialog.tsx @@ -35,7 +35,7 @@ interface IProps extends IDialogProps { fixedWidth?: boolean; className?: string; hasCancelButton?: boolean; - cancelButton?: JSX.Element; + cancelButton?: React.ReactNode; } export default class QuestionDialog extends React.Component { diff --git a/src/components/views/dialogs/TextInputDialog.tsx b/src/components/views/dialogs/TextInputDialog.tsx index cc321a0af6..7a5887f053 100644 --- a/src/components/views/dialogs/TextInputDialog.tsx +++ b/src/components/views/dialogs/TextInputDialog.tsx @@ -25,7 +25,7 @@ import { IDialogProps } from "./IDialogProps"; interface IProps extends IDialogProps { title?: string; - description?: string | JSX.Element; + description?: React.ReactNode; value?: string; placeholder?: string; button?: string; diff --git a/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx b/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx index 7d5c3cf857..afeec726b6 100644 --- a/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx +++ b/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx @@ -59,7 +59,7 @@ interface IState { recoverInfo: IKeyBackupRestoreResult; recoveryKeyValid: boolean; forceRecoveryKey: boolean; - passPhrase: ""; + passPhrase: string; restoreType: RestoreType; progress: { stage: ProgressState; From adb325b3bd9bcd889e25c2ed4de828aabd562bc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Mon, 13 Sep 2021 18:05:59 +0200 Subject: [PATCH 089/256] Use enums MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/dialogs/MessageEditHistoryDialog.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/dialogs/MessageEditHistoryDialog.tsx b/src/components/views/dialogs/MessageEditHistoryDialog.tsx index 04313ed9a0..427924e445 100644 --- a/src/components/views/dialogs/MessageEditHistoryDialog.tsx +++ b/src/components/views/dialogs/MessageEditHistoryDialog.tsx @@ -27,6 +27,7 @@ import Spinner from "../elements/Spinner"; import EditHistoryMessage from "../messages/EditHistoryMessage"; import DateSeparator from "../messages/DateSeparator"; import { IDialogProps } from "./IDialogProps"; +import { EventType, RelationType } from "matrix-js-sdk/src/@types/event"; interface IProps extends IDialogProps { mxEvent: MatrixEvent; @@ -72,7 +73,7 @@ export default class MessageEditHistoryDialog extends React.PureComponent((_resolve, _reject) => {resolve = _resolve; reject = _reject;}); try { result = await client.relations( - roomId, eventId, "m.replace", "m.room.message", opts); + roomId, eventId, RelationType.Replace, EventType.RoomMessage, opts); } catch (error) { // log if the server returned an error if (error.errcode) { From c9dea9948fb9a3affc79f38255e1e42b8f8ef45e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Mon, 13 Sep 2021 18:06:35 +0200 Subject: [PATCH 090/256] Use IAuthData MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/dialogs/InteractiveAuthDialog.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/components/views/dialogs/InteractiveAuthDialog.tsx b/src/components/views/dialogs/InteractiveAuthDialog.tsx index e6cf72cf9a..c0d108bf06 100644 --- a/src/components/views/dialogs/InteractiveAuthDialog.tsx +++ b/src/components/views/dialogs/InteractiveAuthDialog.tsx @@ -35,11 +35,7 @@ interface IProps extends IDialogProps { // response from initial request. If not supplied, will do a request on // mount. - authData?: { - flows: []; - params: {}; - session: string; - }; + authData?: IAuthData; // callback makeRequest: (auth: IAuthData) => Promise; From 27b9175ca347510422c5102c1578cee8f5e1bb89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Mon, 13 Sep 2021 18:09:45 +0200 Subject: [PATCH 091/256] Use defer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/dialogs/MessageEditHistoryDialog.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/views/dialogs/MessageEditHistoryDialog.tsx b/src/components/views/dialogs/MessageEditHistoryDialog.tsx index 427924e445..7753eba199 100644 --- a/src/components/views/dialogs/MessageEditHistoryDialog.tsx +++ b/src/components/views/dialogs/MessageEditHistoryDialog.tsx @@ -28,6 +28,7 @@ import EditHistoryMessage from "../messages/EditHistoryMessage"; import DateSeparator from "../messages/DateSeparator"; import { IDialogProps } from "./IDialogProps"; import { EventType, RelationType } from "matrix-js-sdk/src/@types/event"; +import { defer } from "matrix-js-sdk/src/utils"; interface IProps extends IDialogProps { mxEvent: MatrixEvent; @@ -67,10 +68,10 @@ export default class MessageEditHistoryDialog extends React.PureComponent(); let result; - let resolve; - let reject; - const promise = new Promise((_resolve, _reject) => {resolve = _resolve; reject = _reject;}); + try { result = await client.relations( roomId, eventId, RelationType.Replace, EventType.RoomMessage, opts); From 29ff5f3f9ce4b932cbb1adb5db769d61bdd395a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Mon, 13 Sep 2021 18:12:47 +0200 Subject: [PATCH 092/256] Add IDialogAesthetics MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../views/dialogs/InteractiveAuthDialog.tsx | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/components/views/dialogs/InteractiveAuthDialog.tsx b/src/components/views/dialogs/InteractiveAuthDialog.tsx index c0d108bf06..2ea97f91c3 100644 --- a/src/components/views/dialogs/InteractiveAuthDialog.tsx +++ b/src/components/views/dialogs/InteractiveAuthDialog.tsx @@ -29,6 +29,17 @@ import BaseDialog from "./BaseDialog"; import { IAuthData } from "matrix-js-sdk/src/interactive-auth"; import { IDialogProps } from "./IDialogProps"; +interface IDialogAesthetics { + [x: string]: { + [x: number]: { + title: string; + body: string; + continueText: string; + continueKind: string; + }; + }; +} + interface IProps extends IDialogProps { // matrix client to use for UI auth requests matrixClient: MatrixClient; @@ -62,7 +73,7 @@ interface IProps extends IDialogProps { // } // // Default is defined in _getDefaultDialogAesthetics() - aestheticsForStagePhases?: {}; + aestheticsForStagePhases?: IDialogAesthetics; } interface IState { @@ -87,7 +98,7 @@ export default class InteractiveAuthDialog extends React.Component Date: Mon, 13 Sep 2021 21:50:36 +0000 Subject: [PATCH 093/256] Translated using Weblate (Japanese) Currently translated at 71.2% (2254 of 3162 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index 3ce4a121d2..e4d8b662e0 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -1791,8 +1791,8 @@ "Cat": "猫", "Dog": "犬", "To be secure, do this in person or use a trusted way to communicate.": "安全を確保するため、1人でこれを行うか、または信頼できる方法で連携してください。", - "They don't match": "それらは一致しません", - "They match": "それらは一致します", + "They don't match": "異なる絵文字です", + "They match": "同じ絵文字です", "Cancelling…": "取り消し中…", "Waiting for your other session to verify…": "他のセッションによる検証を待っています…", "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "他のセッション %(deviceName)s (%(deviceId)s) による検証を待っています…", @@ -2542,5 +2542,13 @@ "Only invited people can join.": "招待された人のみ参加できます。", "Private (invite only)": "プライベート (招待者のみ)", "Decide who can join %(roomName)s.": "%(roomName)s に参加できる人を設定します。", - "%(senderName)s invited %(targetName)s": "%(senderName)s が %(targetName)s を招待しました" + "%(senderName)s invited %(targetName)s": "%(senderName)s が %(targetName)s を招待しました", + "Verify other login": "他のログインを使用した検証", + "Accept on your other login…": "他のログインで了承してください…", + "Use Security Key": "セキュリティキーで検証", + "Use another login": "他の端末から検証", + "Verify your identity to access encrypted messages and prove your identity to others.": "あなたが本人であることを検証し、暗号化されたメッセージにアクセスします。", + "New? Create account": "アカウント作成", + "Are you sure you want to sign out?": "サインアウトしてよろしいですか?", + "Upgrade to %(hostSignupBrand)s": "%(hostSignupBrand)s にアップグレード" } From 152f946eed09cc661e8c0ce18e6cebd8d225597f Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Mon, 13 Sep 2021 20:56:48 +0000 Subject: [PATCH 094/256] Translated using Weblate (Czech) Currently translated at 100.0% (3162 of 3162 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 | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 557e9e5250..fce7b00c25 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1535,7 +1535,7 @@ "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)s neudělal(a) %(count)s krát žádnou změnu", "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)s neudělal(a) žádnou změnu", "e.g. my-room": "např. moje-mistnost", - "Use bots, bridges, widgets and sticker packs": "Použít roboty, propojení, widgety a balíky samolepek", + "Use bots, bridges, widgets and sticker packs": "Použít roboty, propojení, widgety a balíky nálepek", "Terms of Service": "Podmínky použití", "To continue you need to accept the terms of this service.": "Musíte souhlasit s podmínkami použití, abychom mohli pokračovat.", "Service": "Služba", @@ -2832,7 +2832,7 @@ "There was an error creating your community. The name may be taken or the server is unable to process your request.": "Při vytváření vaší skupiny došlo k chybě. Název může být již obsazen nebo server nemůže zpracovat váš požadavek.", "See %(eventType)s events posted to this room": "Zobrazit události %(eventType)s zveřejněné v této místnosti", "Send stickers to your active room as you": "Poslat nálepky do vaší aktivní místnosti jako vy", - "Send stickers to this room as you": "Poslat samolepky jako vy do této místnosti", + "Send stickers to this room as you": "Poslat nálepky jako vy do této místnosti", "Change the topic of your active room": "Změnit téma vaší aktivní místnosti", "Change which room you're viewing": "Změnit kterou místnost si prohlížíte", "Send stickers into your active room": "Poslat nálepky do vaší aktivní místnosti", @@ -3415,8 +3415,8 @@ "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Použití tohoto widgetu může sdílet data s %(widgetDomain)s a vaším správcem integrací.", "Identity server is": "Server identity je", "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Správci integrace přijímají konfigurační data a mohou vaším jménem upravovat widgety, odesílat pozvánky do místností a nastavovat úrovně oprávnění.", - "Use an integration manager to manage bots, widgets, and sticker packs.": "Použít správce integrací na správu botů, widgetů a samolepek.", - "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Použít správce integrací (%(serverName)s) na správu botů, widgetů a samolepek.", + "Use an integration manager to manage bots, widgets, and sticker packs.": "Použít správce integrací na správu botů, widgetů a nálepek.", + "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Použít správce integrací (%(serverName)s) na správu botů, widgetů a nálepek.", "Identity server": "Server identit", "Identity server (%(server)s)": "Server identit (%(server)s)", "Could not connect to identity server": "Nepodařilo se připojit k serveru identit", @@ -3622,5 +3622,18 @@ "Currently, %(count)s spaces have access|one": "V současné době má prostor přístup", "& %(count)s more|one": "a %(count)s další", "Some encryption parameters have been changed.": "Byly změněny některé parametry šifrování.", - "Role in ": "Role v " + "Role in ": "Role v ", + "Send a sticker": "Odeslat nálepku", + "Explore %(spaceName)s": "Prozkoumat %(spaceName)s", + "Reply to encrypted thread…": "Odpovědět na zašifrované vlákno…", + "Reply to thread…": "Odpovědět na vlákno…", + "Add emoji": "Přidat emoji", + "Unknown failure": "Neznámá chyba", + "Failed to update the join rules": "Nepodařilo se aktualizovat pravidla pro připojení", + "Select the roles required to change various parts of the space": "Výbrat role potřebné ke změně různých částí prostoru", + "Change description": "Změnit popis", + "Change main address for the space": "Změnit hlavní adresu prostoru", + "Change space name": "Změnit název prostoru", + "Change space avatar": "Změnit avatar prostoru", + "Anyone in can find and join. You can select other spaces too.": "Kdokoli v může prostor najít a připojit se. Můžete vybrat i další prostory." } From 71462b49df987dd90bd6e9fc689b5d28f258b026 Mon Sep 17 00:00:00 2001 From: jelv Date: Tue, 14 Sep 2021 06:03:25 +0000 Subject: [PATCH 095/256] Translated using Weblate (Dutch) Currently translated at 100.0% (3162 of 3162 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 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 33165a11d1..8f2de31a01 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -3058,7 +3058,7 @@ "Encrypting your message...": "Uw bericht versleutelen...", "Sending your message...": "Uw bericht versturen...", "Spell check dictionaries": "Spellingscontrole woordenboeken", - "Space options": "Space-opties", + "Space options": "Ruimte-opties", "Space Home": "Space Thuis", "New room": "Nieuw gesprek", "Leave space": "Space verlaten", @@ -3325,18 +3325,18 @@ "Collapse": "Invouwen", "Expand": "Uitvouwen", "Recommended for public spaces.": "Aanbevolen voor publieke ruimtes.", - "Allow people to preview your space before they join.": "Personen toestaan een voorbeeld van uw space te zien voor deelname.", - "Preview Space": "Voorbeeld Space", + "Allow people to preview your space before they join.": "Personen toestaan een voorvertoning van uw ruimte te zien voor deelname.", + "Preview Space": "Ruimte voorvertoning", "only invited people can view and join": "alleen uitgenodigde personen kunnen lezen en deelnemen", "anyone with the link can view and join": "iedereen met een link kan lezen en deelnemen", "Decide who can view and join %(spaceName)s.": "Bepaal wie kan lezen en deelnemen aan %(spaceName)s.", "Visibility": "Zichtbaarheid", "This may be useful for public spaces.": "Dit kan nuttig zijn voor publieke ruimtes.", - "Guests can join a space without having an account.": "Gasten kunnen deelnemen aan een space zonder een account.", + "Guests can join a space without having an account.": "Gasten kunnen deelnemen aan een ruimte zonder een account.", "Enable guest access": "Gastentoegang inschakelen", "Failed to update the history visibility of this space": "Het bijwerken van de geschiedenis leesbaarheid voor deze ruimte is mislukt", "Failed to update the guest access of this space": "Het bijwerken van de gastentoegang van deze ruimte is niet gelukt", - "Failed to update the visibility of this space": "Het bijwerken van de zichtbaarheid van deze space is mislukt", + "Failed to update the visibility of this space": "Het bijwerken van de zichtbaarheid van deze ruimte is mislukt", "Address": "Adres", "e.g. my-space": "v.b. mijn-ruimte", "Silence call": "Oproep dempen", @@ -3429,7 +3429,7 @@ "Connected": "Verbonden", "Spaces with access": "Spaces met toegang", "Anyone in a space can find and join. Edit which spaces can access here.": "Iedereen in een space kan het gesprek vinden en aan deelnemen. Wijzig welke spaces toegang hebben hier.", - "Currently, %(count)s spaces have access|other": "Momenteel hebben %(count)s spaces toegang", + "Currently, %(count)s spaces have access|other": "Momenteel hebben %(count)s ruimtes toegang", "& %(count)s more|other": "& %(count)s meer", "Upgrade required": "Upgrade noodzakelijk", "Anyone can find and join.": "Iedereen kan hem vinden en deelnemen.", From d3b175f1dfc418a21c1c58218f682a37d8820cb5 Mon Sep 17 00:00:00 2001 From: random Date: Tue, 14 Sep 2021 07:46:25 +0000 Subject: [PATCH 096/256] Translated using Weblate (Italian) Currently translated at 99.9% (3161 of 3162 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 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 5f93ba7684..ac09c3303e 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -244,7 +244,7 @@ "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Non potrai annullare questa modifica dato che stai promuovendo l'utente al tuo stesso grado.", "Unignore": "Non ignorare più", "Ignore": "Ignora", - "Mention": "Cita", + "Mention": "Menziona", "Invite": "Invita", "Unmute": "Togli silenzio", "and %(count)s others...|other": "e altri %(count)s ...", @@ -1000,7 +1000,7 @@ "Show avatar changes": "Mostra i cambi di avatar", "Show display name changes": "Mostra i cambi di nomi visualizzati", "Show read receipts sent by other users": "Mostra ricevute di lettura inviate da altri utenti", - "Show avatars in user and room mentions": "Mostra gli avatar nelle citazioni di utenti e stanze", + "Show avatars in user and room mentions": "Mostra gli avatar nelle menzioni di utenti e stanze", "Enable big emoji in chat": "Attiva gli emoji grandi in chat", "Send typing notifications": "Invia notifiche di scrittura", "Enable Community Filter Panel": "Attiva il pannello dei filtri di comunità", @@ -1575,7 +1575,7 @@ "Room %(name)s": "Stanza %(name)s", "Recent rooms": "Stanze recenti", "No identity server is configured so you cannot add an email address in order to reset your password in the future.": "Nessun server di identità configurato, perciò non puoi aggiungere un indirizzo email per ripristinare la tua password in futuro.", - "%(count)s unread messages including mentions.|one": "1 citazione non letta.", + "%(count)s unread messages including mentions.|one": "1 menzione non letta.", "%(count)s unread messages.|one": "1 messaggio non letto.", "Unread messages.": "Messaggi non letti.", "Show tray icon and minimize window to it on close": "Mostra icona in tray e usala alla chiusura della finestra", @@ -2345,7 +2345,7 @@ "Make this room low priority": "Rendi questa stanza a bassa priorità", "Low priority rooms show up at the bottom of your room list in a dedicated section at the bottom of your room list": "Le stanze a bassa priorità vengono mostrate in fondo all'elenco stanze in una sezione dedicata", "Use default": "Usa predefinito", - "Mentions & Keywords": "Citazioni e parole chiave", + "Mentions & Keywords": "Menzioni e parole chiave", "Notification options": "Opzioni di notifica", "Favourited": "Preferito", "Forget Room": "Dimentica stanza", From d875e429cc1ee288115d61f46f44550a109db6ec Mon Sep 17 00:00:00 2001 From: sr093906 Date: Tue, 14 Sep 2021 13:52:48 +0000 Subject: [PATCH 097/256] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3163 of 3163 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 845409588f..f3d9ba5548 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -3609,5 +3609,6 @@ "Change description": "更改描述", "Change main address for the space": "更改空间主地址", "Change space name": "更改空间名称", - "Change space avatar": "更改空间头像" + "Change space avatar": "更改空间头像", + "Message didn't send. Click for info.": "消息没有发送。点击查看信息。" } From 047767bab0b8b457115515d912c634fcb25d95d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 14 Sep 2021 17:38:34 +0200 Subject: [PATCH 098/256] Improve typing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/dialogs/FeedbackDialog.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/views/dialogs/FeedbackDialog.tsx b/src/components/views/dialogs/FeedbackDialog.tsx index 6f957452bc..e7089283e4 100644 --- a/src/components/views/dialogs/FeedbackDialog.tsx +++ b/src/components/views/dialogs/FeedbackDialog.tsx @@ -34,7 +34,7 @@ const newIssueUrl = "https://github.com/vector-im/element-web/issues/new/choose" interface IProps extends IDialogProps {} const FeedbackDialog: React.FC = (props: IProps) => { - const [rating, setRating] = useState(); + const [rating, setRating] = useState(); const [comment, setComment] = useState(""); const onDebugLogsLinkClick = (): void => { @@ -45,7 +45,7 @@ const FeedbackDialog: React.FC = (props: IProps) => { const hasFeedback = CountlyAnalytics.instance.canEnable(); const onFinished = (sendFeedback: boolean): void => { if (hasFeedback && sendFeedback) { - CountlyAnalytics.instance.reportFeedback((parseInt(rating) as Rating), comment); + CountlyAnalytics.instance.reportFeedback(rating, comment); Modal.createTrackedDialog('Feedback sent', '', InfoDialog, { title: _t('Feedback sent'), description: _t('Thank you!'), @@ -68,8 +68,8 @@ const FeedbackDialog: React.FC = (props: IProps) => { setRating(parseInt(r, 10) as Rating)} definitions={[ { value: "1", label: "😠" }, { value: "2", label: "😞" }, @@ -141,7 +141,7 @@ const FeedbackDialog: React.FC = (props: IProps) => { { countlyFeedbackSection } } button={hasFeedback ? _t("Send feedback") : _t("Go back")} - buttonDisabled={hasFeedback && rating === ""} + buttonDisabled={hasFeedback && !rating} onFinished={onFinished} />); }; From 8e3be15365af599de094ead7038f01ae3c1215aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 14 Sep 2021 18:05:15 +0200 Subject: [PATCH 099/256] Move animations into _animations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/_animations.scss | 20 ++++++++++++++++++++ res/css/_common.scss | 9 --------- res/css/views/elements/_ImageView.scss | 9 --------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/res/css/_animations.scss b/res/css/_animations.scss index 4d3ad97141..89c406dd85 100644 --- a/res/css/_animations.scss +++ b/res/css/_animations.scss @@ -53,3 +53,23 @@ limitations under the License. transition: none; } } + + +@keyframes mx_Dialog_lightbox_background_keyframes { + from { + opacity: 0; + } + to { + opacity: $lightbox-background-bg-opacity; + } +} + + +@keyframes mx_ImageView_panel_keyframes { + from { + opacity: 0; + } + to { + opacity: 1; + } +} diff --git a/res/css/_common.scss b/res/css/_common.scss index 07f6c316b6..d7f8355d81 100644 --- a/res/css/_common.scss +++ b/res/css/_common.scss @@ -315,15 +315,6 @@ input[type=text]:focus, input[type=password]:focus, textarea:focus { opacity: 0.4; } -@keyframes mx_Dialog_lightbox_background_keyframes { - from { - opacity: 0; - } - to { - opacity: $lightbox-background-bg-opacity; - } -} - .mx_Dialog_lightbox .mx_Dialog_background { opacity: $lightbox-background-bg-opacity; background-color: $lightbox-background-bg-color; diff --git a/res/css/views/elements/_ImageView.scss b/res/css/views/elements/_ImageView.scss index 4bf957b93b..6510cc2ec6 100644 --- a/res/css/views/elements/_ImageView.scss +++ b/res/css/views/elements/_ImageView.scss @@ -38,15 +38,6 @@ $button-gap: 24px; flex-shrink: 0; } -@keyframes mx_ImageView_panel_keyframes { - from { - opacity: 0; - } - to { - opacity: 1; - } -} - .mx_ImageView_panel { width: 100%; height: 68px; From ccc042b7d7260dbcbbf81f31d8c2fc461c098790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 14 Sep 2021 18:06:01 +0200 Subject: [PATCH 100/256] Where does that magic number come from? 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 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/views/elements/ImageView.tsx b/src/components/views/elements/ImageView.tsx index 8dc2aee269..eedf492e1f 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/src/components/views/elements/ImageView.tsx @@ -45,6 +45,7 @@ const ZOOM_COEFFICIENT = 0.0025; // If we have moved only this much we can zoom const ZOOM_DISTANCE = 10; +// Height of mx_ImageView_panel const PANEL_HEIGHT = 68; interface IProps extends IDialogProps { From f5d8bb7cbe7bca3cb4bbc102a3959823b51c72f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 14 Sep 2021 18:15:27 +0200 Subject: [PATCH 101/256] Remove awaiting setState() 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 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/views/elements/ImageView.tsx b/src/components/views/elements/ImageView.tsx index eedf492e1f..362d1c7da9 100644 --- a/src/components/views/elements/ImageView.tsx +++ b/src/components/views/elements/ImageView.tsx @@ -140,12 +140,12 @@ export default class ImageView extends React.Component { this.image.current.removeEventListener("load", this.imageLoaded); } - private imageLoaded = async () => { + private imageLoaded = () => { // First, we calculate the zoom, so that the image has the same size as // the thumbnail const { thumbnailInfo } = this.props; if (thumbnailInfo?.width) { - await this.setState({ zoom: thumbnailInfo.width / this.image.current.naturalWidth }); + this.setState({ zoom: thumbnailInfo.width / this.image.current.naturalWidth }); } // Once the zoom is set, we the image is considered loaded and we can @@ -153,7 +153,7 @@ export default class ImageView extends React.Component { this.imageIsLoaded = true; this.animatingLoading = true; this.setZoomAndRotation(); - await this.setState({ + this.setState({ translationX: 0, translationY: 0, }); From f56afe219c6bafb877905be810d9c9fe17485e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 14 Sep 2021 19:32:29 +0000 Subject: [PATCH 102/256] Translated using Weblate (Estonian) Currently translated at 99.9% (3161 of 3163 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 8e86886b32..26905b70fe 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -3690,5 +3690,6 @@ "Change main address for the space": "Muuda kogukonna põhiaadressi", "Change space name": "Muuda kogukonna nime", "Change space avatar": "Muuda kogukonna tunnuspilti", - "Displaying time": "Aegade kuvamine" + "Displaying time": "Aegade kuvamine", + "Message didn't send. Click for info.": "Sõnum jäi saatmata. Lisateabe saamiseks klõpsi." } From dd7253e84826032984a47db52c3cd6275e879678 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Wed, 15 Sep 2021 06:44:19 +0000 Subject: [PATCH 103/256] Translated using Weblate (Hungarian) Currently translated at 100.0% (3163 of 3163 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index cd3779a3a3..c9c4e17b06 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -3711,5 +3711,6 @@ "Change main address for the space": "Tér elsődleges címének megváltoztatása", "Change space name": "Tér nevének megváltoztatása", "Change space avatar": "Tér profilkép megváltoztatása", - "Anyone in can find and join. You can select other spaces too.": " téren bárki megtalálhatja és beléphet. Kiválaszthat más tereket is." + "Anyone in can find and join. You can select other spaces too.": " téren bárki megtalálhatja és beléphet. Kiválaszthat más tereket is.", + "Message didn't send. Click for info.": "Az üzenet nincs elküldve. Kattintson az információkért." } From b24ad3a447d24b5f8284495e9bf818cb77e0e592 Mon Sep 17 00:00:00 2001 From: jelv Date: Wed, 15 Sep 2021 08:09:37 +0000 Subject: [PATCH 104/256] Translated using Weblate (Dutch) Currently translated at 100.0% (3163 of 3163 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 | 39 ++++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 8f2de31a01..67d52e319b 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -3045,15 +3045,15 @@ "Filter your rooms and spaces": "Gesprekken en spaces filteren", "Add existing spaces/rooms": "Bestaande spaces/gesprekken toevoegen", "Space selection": "Space-selectie", - "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the space it will be impossible to regain privileges.": "U kunt deze wijziging niet ongedaan maken, omdat u uzelf rechten ontneemt. Als u de laatste bevoegde persoon in de space bent zal het onmogelijk zijn om weer rechten te krijgen.", + "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the space it will be impossible to regain privileges.": "U kunt deze wijziging niet ongedaan maken, omdat u uzelf rechten ontneemt. Als u de laatste bevoegde persoon in de ruimte bent zal het onmogelijk zijn om weer rechten te krijgen.", "Empty room": "Leeg gesprek", "Suggested Rooms": "Gespreksuggesties", "Explore space rooms": "Space-gesprekken ontdekken", - "You do not have permissions to add rooms to this space": "U hebt geen toestemming om kamers toe te voegen in deze space", + "You do not have permissions to add rooms to this space": "U hebt geen toestemming om kamers toe te voegen in deze ruimte", "Add existing room": "Bestaande kamers toevoegen", - "You do not have permissions to create new rooms in this space": "U hebt geen toestemming om kamers te maken in deze space", + "You do not have permissions to create new rooms in this space": "U hebt geen toestemming om kamers te maken in deze ruimte", "Send message": "Bericht versturen", - "Invite to this space": "Uitnodigen voor deze space", + "Invite to this space": "Voor deze ruimte uitnodigen", "Your message was sent": "Uw bericht is verstuurd", "Encrypting your message...": "Uw bericht versleutelen...", "Sending your message...": "Uw bericht versturen...", @@ -3201,8 +3201,8 @@ "Filter all spaces": "Alle spaces filteren", "Delete recording": "Opname verwijderen", "Stop the recording": "Opname stoppen", - "%(count)s results in all spaces|one": "%(count)s resultaat in alle spaces", - "%(count)s results in all spaces|other": "%(count)s resultaten in alle spaces", + "%(count)s results in all spaces|one": "%(count)s resultaat in alle ruimtes", + "%(count)s results in all spaces|other": "%(count)s resultaten in alle ruimtes", "You have no ignored users.": "U heeft geen persoon genegeerd.", "Play": "Afspelen", "Pause": "Pauze", @@ -3316,12 +3316,12 @@ "%(severalUsers)schanged the server ACLs %(count)s times|one": "%(severalUsers)s veranderden de server ACLs", "%(severalUsers)schanged the server ACLs %(count)s times|other": "%(severalUsers)s veranderden de server ACLs %(count)s keer", "Message search initialisation failed, check your settings for more information": "Bericht zoeken initialisatie mislukt, controleer uw instellingen voor meer informatie", - "Set addresses for this space so users can find this space through your homeserver (%(localDomain)s)": "Stel adressen in voor deze space zodat personen deze ruimte kunnen vinden via uw homeserver (%(localDomain)s)", + "Set addresses for this space so users can find this space through your homeserver (%(localDomain)s)": "Stel adressen in voor deze ruimte zodat personen deze ruimte kunnen vinden via uw server (%(localDomain)s)", "To publish an address, it needs to be set as a local address first.": "Om een adres te publiceren, moet het eerst als een lokaaladres worden ingesteld.", "Published addresses can be used by anyone on any server to join your room.": "Gepubliceerde adressen kunnen door iedereen op elke server gebruikt worden om bij uw gesprek te komen.", - "Published addresses can be used by anyone on any server to join your space.": "Gepubliceerde adressen kunnen door iedereen op elke server gebruikt worden om uw space te betreden.", - "This space has no local addresses": "Deze space heeft geen lokaaladres", - "Space information": "Spaceinformatie", + "Published addresses can be used by anyone on any server to join your space.": "Gepubliceerde adressen kunnen door iedereen op elke server gebruikt worden om uw ruimte te betreden.", + "This space has no local addresses": "Deze ruimte heeft geen lokaaladres", + "Space information": "Ruimte-informatie", "Collapse": "Invouwen", "Expand": "Uitvouwen", "Recommended for public spaces.": "Aanbevolen voor publieke ruimtes.", @@ -3427,15 +3427,15 @@ "Could not connect media": "Mediaverbinding mislukt", "This call has ended": "Deze oproep is beëindigd", "Connected": "Verbonden", - "Spaces with access": "Spaces met toegang", - "Anyone in a space can find and join. Edit which spaces can access here.": "Iedereen in een space kan het gesprek vinden en aan deelnemen. Wijzig welke spaces toegang hebben hier.", + "Spaces with access": "Ruimtes met toegang", + "Anyone in a space can find and join. Edit which spaces can access here.": "Iedereen in een ruimte kan zoeken en deelnemen. Wijzig hier welke ruimtes toegang hebben.", "Currently, %(count)s spaces have access|other": "Momenteel hebben %(count)s ruimtes toegang", "& %(count)s more|other": "& %(count)s meer", "Upgrade required": "Upgrade noodzakelijk", "Anyone can find and join.": "Iedereen kan hem vinden en deelnemen.", "Only invited people can join.": "Alleen uitgenodigde personen kunnen deelnemen.", "Private (invite only)": "Privé (alleen op uitnodiging)", - "This upgrade will allow members of selected spaces access to this room without an invite.": "Deze upgrade maakt het mogelijk voor leden van geselecteerde spaces om toegang te krijgen tot dit gesprek zonder een uitnodiging.", + "This upgrade will allow members of selected spaces access to this room without an invite.": "Deze upgrade maakt het mogelijk voor leden van geselecteerde ruimtes om toegang te krijgen tot deze kamer zonder een uitnodiging.", "This makes it easy for rooms to stay private to a space, while letting people in the space find and join them. All new rooms in a space will have this option available.": "Dit maakt het makkelijk om kamers privé te houden voor een ruimte, terwijl personen in de ruimte hem kunnen vinden en aan deelnemen. Alle nieuwe kamers in deze ruimte hebben deze optie beschikbaar.", "To help space members find and join a private room, go to that room's Security & Privacy settings.": "Om ruimte leden te helpen met het vinden van en deel te nemen aan privékamers, ga naar uw kamerinstellingen voor veiligheid & privacy.", "Help space members find private rooms": "Help ruimte leden privékamers te vinden", @@ -3452,8 +3452,8 @@ "Access": "Toegang", "People with supported clients will be able to join the room without having a registered account.": "Personen met geschikte apps zullen aan de kamer kunnen deelnemen zonder een account te hebben.", "Decide who can join %(roomName)s.": "Kies wie kan deelnemen aan %(roomName)s.", - "Space members": "Space leden", - "Anyone in a space can find and join. You can select multiple spaces.": "Iedereen in een space kan zoeken en deelnemen. U kunt meerdere spaces selecteren.", + "Space members": "Ruimte leden", + "Anyone in a space can find and join. You can select multiple spaces.": "Iedereen in een ruimte kan zoeken en deelnemen. U kunt meerdere ruimtes selecteren.", "Anyone in %(spaceName)s can find and join. You can select other spaces too.": "Iedereen in %(spaceName)s kan zoeken en deelnemen. U kunt ook andere spaces selecteren.", "Visible to space members": "Zichtbaar voor space leden", "Public room": "Openbaar gesprek", @@ -3536,9 +3536,9 @@ "Start the camera": "Camera starten", "If a community isn't shown you may not have permission to convert it.": "Als een gemeenschap niet zichtbaar is heeft u geen rechten om hem om te zetten.", "Show my Communities": "Mijn gemeenschappen weergeven", - "Communities have been archived to make way for Spaces but you can convert your communities into Spaces below. Converting will ensure your conversations get the latest features.": "Gemeenschappen zijn gearchiveerd om ruimte te maken voor Spaces, maar u kunt uw gemeenschap omzetten naar een space hieronder. Hierdoor bent u er zeker van dat uw gesprekken de nieuwste functies krijgen.", - "Create Space": "Space aanmaken", - "Open Space": "Space openen", + "Communities have been archived to make way for Spaces but you can convert your communities into Spaces below. Converting will ensure your conversations get the latest features.": "Gemeenschappen zijn gearchiveerd voor de nieuwe functie ruimtes, maar u kunt uw gemeenschap nog omzetten naar een ruimte hieronder. Hierdoor bent u er zeker van dat uw gesprekken de nieuwste functies krijgen.", + "Create Space": "Ruimte maken", + "Open Space": "Ruimte openen", "To join an existing space you'll need an invite.": "Om deel te nemen aan een bestaande ruimte heeft u een uitnodiging nodig.", "You can also create a Space from a community.": "U kunt ook een ruimte maken van een gemeenschap.", "You can change this later.": "U kan dit later aanpassen.", @@ -3605,5 +3605,6 @@ "Change main address for the space": "Hoofdadres van ruimte veranderen", "Change space name": "Ruimtenaam veranderen", "Change space avatar": "Ruimte-avatar veranderen", - "Anyone in can find and join. You can select other spaces too.": "Iedereen in kan zoeken en deelnemen. U kunt ook andere ruimtes selecteren." + "Anyone in can find and join. You can select other spaces too.": "Iedereen in kan zoeken en deelnemen. U kunt ook andere ruimtes selecteren.", + "Message didn't send. Click for info.": "Bericht is niet verstuur. Klik voor meer info." } From 714af54be4918ab9952704c0c7847f0c110c122f Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 15 Sep 2021 02:20:56 +0000 Subject: [PATCH 105/256] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (3163 of 3163 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index bdf496fa8c..890e6cdb5e 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -3720,5 +3720,6 @@ "Change main address for the space": "變更空間的主要地址", "Change space name": "變更空間名稱", "Change space avatar": "變更空間大頭照", - "Anyone in can find and join. You can select other spaces too.": "在 中的任何人都可以找到並加入。您也可以選取其他空間。" + "Anyone in can find and join. You can select other spaces too.": "在 中的任何人都可以找到並加入。您也可以選取其他空間。", + "Message didn't send. Click for info.": "訊息未傳送。點擊以取得更多資訊。" } From f6f4daec000c255884b964256bcca78b51476b18 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Wed, 15 Sep 2021 05:50:40 +0000 Subject: [PATCH 106/256] Translated using Weblate (Czech) Currently translated at 100.0% (3163 of 3163 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 | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index fce7b00c25..85ab63159c 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -3606,7 +3606,7 @@ "It's not recommended to add encryption to public rooms.Anyone can find and join public rooms, so anyone can read messages in them. You'll get none of the benefits of encryption, and you won't be able to turn it off later. Encrypting messages in a public room will make receiving and sending messages slower.": "Nedoporučuje se šifrovat veřejné místnosti.Veřejné místnosti může najít a připojit se k nim kdokoli, takže si v nich může číst zprávy kdokoli. Nezískáte tak žádnou z výhod šifrování a nebudete ho moci později vypnout. Šifrování zpráv ve veřejné místnosti zpomalí příjem a odesílání zpráv.", "Are you sure you want to add encryption to this public room?": "Opravdu chcete šifrovat tuto veřejnou místnost?", "Cross-signing is ready but keys are not backed up.": "Křížové podepisování je připraveno, ale klíče nejsou zálohovány.", - "Low bandwidth mode (requires compatible homeserver)": "Režim malé šířky pásma (vyžaduje kompatibilní homeserver)", + "Low bandwidth mode (requires compatible homeserver)": "Režim malé šířky pásma (vyžaduje kompatibilní domovský server)", "Multiple integration managers (requires manual setup)": "Více správců integrace (vyžaduje ruční nastavení)", "Threaded messaging": "Zprávy ve vláknech", "Thread": "Vlákno", @@ -3635,5 +3635,6 @@ "Change main address for the space": "Změnit hlavní adresu prostoru", "Change space name": "Změnit název prostoru", "Change space avatar": "Změnit avatar prostoru", - "Anyone in can find and join. You can select other spaces too.": "Kdokoli v může prostor najít a připojit se. Můžete vybrat i další prostory." + "Anyone in can find and join. You can select other spaces too.": "Kdokoli v může prostor najít a připojit se. Můžete vybrat i další prostory.", + "Message didn't send. Click for info.": "Zpráva se neodeslala. Klikněte pro informace." } From fab788a709fce9fdf288a67fc0e3396ecbbb4bec Mon Sep 17 00:00:00 2001 From: jelv Date: Wed, 15 Sep 2021 14:54:52 +0000 Subject: [PATCH 107/256] Translated using Weblate (Dutch) Currently translated at 100.0% (3163 of 3163 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 | 62 ++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 67d52e319b..9d1287da0c 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -3032,9 +3032,9 @@ "Failed to save space settings.": "Het opslaan van de ruimte-instellingen is mislukt.", "Space settings": "Space-instellingen", "Edit settings relating to your space.": "Bewerk instellingen gerelateerd aan uw ruimte.", - "Invite someone using their name, username (like ) or share this space.": "Nodig iemand uit per naam, inlognaam (zoals ) of deel deze space.", - "Invite someone using their name, email address, username (like ) or share this space.": "Nodig iemand uit per naam, e-mailadres, inlognaam (zoals ) of deel deze space.", - "Unnamed Space": "Naamloze space", + "Invite someone using their name, username (like ) or share this space.": "Nodig iemand uit per naam, inlognaam (zoals ) of deel deze ruimte.", + "Invite someone using their name, email address, username (like ) or share this space.": "Nodig iemand uit per naam, e-mail, inlognaam (zoals ) of deel deze ruimte.", + "Unnamed Space": "Naamloze ruimte", "Invite to %(spaceName)s": "Voor %(spaceName)s uitnodigen", "Failed to add rooms to space": "Het toevoegen van gesprekken aan de space is mislukt", "Apply": "Toepassen", @@ -3044,7 +3044,7 @@ "Spaces": "Ruimtes", "Filter your rooms and spaces": "Gesprekken en spaces filteren", "Add existing spaces/rooms": "Bestaande spaces/gesprekken toevoegen", - "Space selection": "Space-selectie", + "Space selection": "Ruimte-selectie", "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the space it will be impossible to regain privileges.": "U kunt deze wijziging niet ongedaan maken, omdat u uzelf rechten ontneemt. Als u de laatste bevoegde persoon in de ruimte bent zal het onmogelijk zijn om weer rechten te krijgen.", "Empty room": "Leeg gesprek", "Suggested Rooms": "Gespreksuggesties", @@ -3061,7 +3061,7 @@ "Space options": "Ruimte-opties", "Space Home": "Space Thuis", "New room": "Nieuw gesprek", - "Leave space": "Space verlaten", + "Leave space": "Ruimte verlaten", "Invite people": "Personen uitnodigen", "Share your public space": "Deel uw publieke ruimte", "Invite members": "Leden uitnodigen", @@ -3441,7 +3441,7 @@ "Help space members find private rooms": "Help ruimte leden privékamers te vinden", "Help people in spaces to find and join private rooms": "Help personen in ruimtes om privékamers te vinden en aan deel te nemen", "New in the Spaces beta": "Nieuw in de ruimtes beta", - "Everyone in will be able to find and join this room.": "Iedereen in kan dit gesprek vinden en aan deelnemen.", + "Everyone in will be able to find and join this room.": "Iedereen in kan deze kamer vinden en aan deelnemen.", "Image": "Afbeelding", "Sticker": "Sticker", "They didn't pick up": "Ze hebben niet opgenomen", @@ -3455,12 +3455,12 @@ "Space members": "Ruimte leden", "Anyone in a space can find and join. You can select multiple spaces.": "Iedereen in een ruimte kan zoeken en deelnemen. U kunt meerdere ruimtes selecteren.", "Anyone in %(spaceName)s can find and join. You can select other spaces too.": "Iedereen in %(spaceName)s kan zoeken en deelnemen. U kunt ook andere spaces selecteren.", - "Visible to space members": "Zichtbaar voor space leden", + "Visible to space members": "Zichtbaar voor ruimte leden", "Public room": "Openbaar gesprek", "Private room (invite only)": "Privégesprek (alleen op uitnodiging)", "Create a room": "Gesprek aanmaken", "Only people invited will be able to find and join this room.": "Alleen uitgenodigde personen kunnen dit gesprek vinden en aan deelnemen.", - "Anyone will be able to find and join this room, not just members of .": "Iedereen kan dit gesprek vinden en aan deelnemen, niet alleen leden van .", + "Anyone will be able to find and join this room, not just members of .": "Iedereen kan deze kamer vinden en aan deelnemen, niet alleen leden van .", "You can change this at any time from room settings.": "U kan dit op elk moment wijzigen vanuit de gespreksinstellingen.", "Error downloading audio": "Fout bij downloaden van audio", "Please note upgrading will make a new version of the room. All current messages will stay in this archived room.": "Let op bijwerken maakt een nieuwe versie van dit gesprek. Alle huidige berichten blijven in dit gearchiveerde gesprek.", @@ -3470,8 +3470,8 @@ "Spaces you know that contain this room": "Spaces die u kent met dit gesprek", "Search spaces": "Spaces zoeken", "Decide which spaces can access this room. If a space is selected, its members can find and join .": "Kies welke spaces toegang hebben tot dit gesprek. Als een space is geselecteerd kunnen deze leden vinden en aan deelnemen.", - "Select spaces": "Spaces selecteren", - "You're removing all spaces. Access will default to invite only": "U verwijderd alle spaces. De toegang zal standaard alleen op uitnodiging zijn", + "Select spaces": "Ruimte selecteren", + "You're removing all spaces. Access will default to invite only": "U verwijderd alle ruimtes. De toegang zal teruggezet worden naar alleen op uitnodiging", "Room visibility": "Gesprekszichtbaarheid", "Anyone will be able to find and join this room.": "Iedereen kan de kamer vinden en aan deelnemen.", "Share content": "Deel inhoud", @@ -3494,25 +3494,25 @@ "Are you sure you want to leave ?": "Weet u zeker dat u wilt verlaten?", "Leave %(spaceName)s": "%(spaceName)s verlaten", "You're the only admin of some of the rooms or spaces you wish to leave. Leaving them will leave them without any admins.": "U bent de enige beheerder van sommige kamers of spaces die u wilt verlaten. Door deze te verlaten hebben ze geen beheerder meer.", - "You're the only admin of this space. Leaving it will mean no one has control over it.": "U bent de enige beheerder van deze space. Door te verlaten zal niemand er meer controle over hebben.", + "You're the only admin of this space. Leaving it will mean no one has control over it.": "U bent de enige beheerder van deze ruimte. Door het te verlaten zal er niemand meer controle over hebben.", "You won't be able to rejoin unless you are re-invited.": "U kunt niet opnieuw deelnemen behalve als u opnieuw wordt uitgenodigd.", "Search %(spaceName)s": "Zoek %(spaceName)s", - "Leave specific rooms and spaces": "Verlaat specifieke kamers en spaces", + "Leave specific rooms and spaces": "Specifieke kamers en ruimtes verlaten", "Don't leave any": "Blijf in alle", - "Leave all rooms and spaces": "Verlaat alle kamers en spaces", - "Want to add an existing space instead?": "Een bestaande space toevoegen?", - "Private space (invite only)": "Privé space (alleen op uitnodiging)", - "Space visibility": "Space zichtbaarheid", - "Add a space to a space you manage.": "Voeg een space toe aan een space die u beheerd.", - "Only people invited will be able to find and join this space.": "Alleen uitgenodigde personen kunnen deze space vinden en aan deelnemen.", - "Anyone will be able to find and join this space, not just members of .": "Iedereen zal in staat zijn om deze space te vinden en aan deel te nemen, niet alleen leden van .", + "Leave all rooms and spaces": "Alle kamers en ruimtes verlaten", + "Want to add an existing space instead?": "Een bestaande ruimte toevoegen?", + "Private space (invite only)": "Privéruimte (alleen op uitnodiging)", + "Space visibility": "Ruimte zichtbaarheid", + "Add a space to a space you manage.": "Voeg een ruimte toe aan een ruimte die u beheerd.", + "Only people invited will be able to find and join this space.": "Alleen uitgenodigde personen kunnen deze ruimte vinden en aan deelnemen.", + "Anyone will be able to find and join this space, not just members of .": "Iedereen zal in staat zijn om deze ruimte te vinden en aan deel te nemen, niet alleen leden van .", "Anyone in will be able to find and join.": "Iedereen in zal in staat zijn om te zoeken en deel te nemen.", - "Adding spaces has moved.": "Spaces toevoegen is verplaatst.", + "Adding spaces has moved.": "Ruimtes toevoegen is verplaatst.", "Search for rooms": "Naar kamers zoeken", - "Search for spaces": "Naar spaces zoeken", - "Create a new space": "Maak een nieuwe space", - "Want to add a new space instead?": "Een nieuwe space toevoegen?", - "Add existing space": "Bestaande space toevoegen", + "Search for spaces": "Naar ruimtes zoeken", + "Create a new space": "Maak een nieuwe ruimte", + "Want to add a new space instead?": "Een nieuwe ruimte toevoegen?", + "Add existing space": "Bestaande ruimte toevoegen", "Decrypting": "Ontsleutelen", "Show all rooms": "Alle kamers tonen", "Give feedback.": "Feedback geven.", @@ -3551,17 +3551,17 @@ "Communities can now be made into Spaces": "Gemeenschappen kunnen nu omgezet worden in Spaces", "Ask the admins of this community to make it into a Space and keep a look out for the invite.": "Vraag een beheerder van deze gemeenschap om hem om te zetten in een Space en kijk uit naar de uitnodiging.", "You can create a Space from this community here.": "U kunt hier een Space maken van uw gemeenschap.", - "This description will be shown to people when they view your space": "Deze omschrijving zal getoond worden aan personen die uw space bekijken", - "Flair won't be available in Spaces for the foreseeable future.": "Badges zijn niet beschikbaar in Spaces in de nabije toekomst.", + "This description will be shown to people when they view your space": "Deze omschrijving zal getoond worden aan personen die uw ruimte bekijken", + "Flair won't be available in Spaces for the foreseeable future.": "Badges zijn niet beschikbaar in ruimtes in de nabije toekomst.", "All rooms will be added and all community members will be invited.": "Alle kamers zullen worden toegevoegd en alle gemeenschapsleden zullen worden uitgenodigd.", - "A link to the Space will be put in your community description.": "Een link naar deze Space zal geplaatst worden in de gemeenschapsomschrijving.", - "Create Space from community": "Space van gemeenschap maken", + "A link to the Space will be put in your community description.": "In de gemeenschapsomschrijving zal een link naar deze ruimte worden geplaatst.", + "Create Space from community": "Ruimte van gemeenschap maken", "Failed to migrate community": "Omzetten van de gemeenschap is mislukt", "To create a Space from another community, just pick the community in Preferences.": "Om een Space te maken van een gemeenschap kiest u de gemeenschap in Instellingen.", " has been made and everyone who was a part of the community has been invited to it.": " is gemaakt en iedereen die lid was van de gemeenschap is ervoor uitgenodigd.", - "Space created": "Space aangemaakt", - "To view Spaces, hide communities in Preferences": "Om Spaces te zien, verberg gemeenschappen in uw Instellingen", - "This community has been upgraded into a Space": "Deze gemeenschap is geupgrade naar een Space", + "Space created": "Ruimte aangemaakt", + "To view Spaces, hide communities in Preferences": "Om ruimtes te zien, verberg gemeenschappen in uw Instellingen", + "This community has been upgraded into a Space": "Deze gemeenschap is geupgrade naar een ruimte", "Unknown failure: %(reason)s": "Onbekende fout: %(reason)s", "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Debug logs bevatten applicatie gebruiksgegevens inclusief uw inlognaam, de ID's of aliassen van de kamers of groepen die u hebt bezocht, welke UI elementen u het laatst hebt gebruikt, en de inlognamen van andere personen. Ze bevatten geen berichten.", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Als u een bug hebt ingediend via GitHub, kunnen debug logs ons helpen het probleem op te sporen. Debug logs bevatten applicatie gebruiksgegevens inclusief uw inlognaam, de ID's of aliassen van de kamers of groepen die u hebt bezocht, welke UI elementen u het laatst hebt gebruikt, en de inlognamen van andere personen. Ze bevatten geen berichten.", From 1114d4a22c0f4076822a75d7effff6907490133b Mon Sep 17 00:00:00 2001 From: random Date: Wed, 15 Sep 2021 12:45:04 +0000 Subject: [PATCH 108/256] Translated using Weblate (Italian) Currently translated at 99.9% (3162 of 3163 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index ac09c3303e..7a4d7c4958 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -3716,5 +3716,6 @@ "Change description": "Cambia descrizione", "Change main address for the space": "Cambia indirizzo principale dello spazio", "Change space name": "Cambia nome dello spazio", - "Change space avatar": "Cambia avatar dello spazio" + "Change space avatar": "Cambia avatar dello spazio", + "Message didn't send. Click for info.": "Il messaggio non è stato inviato. Clicca per informazioni." } From f593a1aff4f80bb4c323889a20ab664052abc9fc Mon Sep 17 00:00:00 2001 From: jelv Date: Wed, 15 Sep 2021 15:10:54 +0000 Subject: [PATCH 109/256] Translated using Weblate (Dutch) Currently translated at 100.0% (3163 of 3163 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 | 120 +++++++++++++++++++-------------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 9d1287da0c..c8f3ae59ef 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -25,7 +25,7 @@ "Bans user with given id": "Verbant de persoon met de gegeven ID", "Call Timeout": "Oproeptime-out", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Kan geen verbinding maken met de homeserver via HTTP wanneer er een HTTPS-URL in uw browserbalk staat. Gebruik HTTPS of schakel onveilige scripts in.", - "Change Password": "Wachtwoord veranderen", + "Change Password": "Wachtwoord wijzigen", "%(senderName)s changed their profile picture.": "%(senderName)s heeft een nieuwe profielfoto ingesteld.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s heeft het machtsniveau van %(powerLevelDiffText)s gewijzigd.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s heeft de kamernaam gewijzigd naar %(roomName)s.", @@ -695,7 +695,7 @@ "Please set a password!": "Stel een wachtwoord in!", "You have successfully set a password!": "U heeft een wachtwoord ingesteld!", "An error occurred whilst saving your email notification preferences.": "Er is een fout opgetreden tijdens het opslaan van uw e-mailmeldingsvoorkeuren.", - "Explore Room State": "Gesprekstoestand verkennen", + "Explore Room State": "Kamertoestand ontdekken", "Source URL": "Bron-URL", "Messages sent by bot": "Berichten verzonden door een bot", "Filter results": "Resultaten filteren", @@ -715,7 +715,7 @@ "Remove %(name)s from the directory?": "%(name)s uit de catalogus verwijderen?", "%(brand)s uses many advanced browser features, some of which are not available or experimental in your current browser.": "%(brand)s gebruikt veel geavanceerde browserfuncties, waarvan enkele niet (of slechts experimenteel) in uw browser beschikbaar zijn.", "Developer Tools": "Ontwikkelgereedschap", - "Explore Account Data": "Accountgegevens verkennen", + "Explore Account Data": "Accountgegevens ontdekken", "Remove from Directory": "Verwijderen uit catalogus", "Saturday": "Zaterdag", "Remember, you can always set an email address in user settings if you change your mind.": "Onthoud dat u altijd nog een e-mailadres kunt instellen in de gebruikersinstellingen.", @@ -1052,8 +1052,8 @@ "Voice & Video": "Spraak & video", "Room information": "Gespreksinformatie", "Internal room ID:": "Interne gespreks-ID:", - "Room version": "Gespreksversie", - "Room version:": "Gespreksversie:", + "Room version": "Kamerversie", + "Room version:": "Kamerversie:", "Developer options": "Ontwikkelaarsopties", "Open Devtools": "Ontwikkelgereedschap openen", "Room Addresses": "Gespreksadressen", @@ -1134,7 +1134,7 @@ "Failed to upgrade room": "Kamerupgrade mislukt", "The room upgrade could not be completed": "Het upgraden van de kamer kon niet worden voltooid", "Upgrade this room to version %(version)s": "Upgrade de kamer naar versie %(version)s", - "Upgrade Room Version": "Gespreksversie upgraden", + "Upgrade Room Version": "Kamerversie upgraden", "Create a new room with the same name, description and avatar": "Een nieuw kamer aanmaken met dezelfde naam, beschrijving en afbeelding", "Update any local room aliases to point to the new room": "Alle lokale gespreksbijnamen naar het nieuwe gesprek laten verwijzen", "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "Personen verhinderen om aan de oude versie van de kamer bij te dragen en plaats een bericht te dat de personen verwijst naar de nieuwe kamer", @@ -1238,8 +1238,8 @@ "Please supply a https:// or http:// widget URL": "Voer een https://- of http://-widget-URL in", "You cannot modify widgets in this room.": "U kunt de widgets in deze kamer niet aanpassen.", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s heeft de uitnodiging aan %(targetDisplayName)s toe te treden tot deze kamer ingetrokken.", - "Upgrade this room to the recommended room version": "Upgrade dit gesprek naar de aanbevolen gespreksversie", - "This room is running room version , which this homeserver has marked as unstable.": "Dit gesprek draait op groepsgespreksversie , die door deze homeserver als onstabiel is gemarkeerd.", + "Upgrade this room to the recommended room version": "Upgrade deze kamer naar de aanbevolen kamerversie", + "This room is running room version , which this homeserver has marked as unstable.": "Deze kamer draait op kamerversie , die door deze server als onstabiel is gemarkeerd.", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Upgraden zal de huidige versie van dit gesprek sluiten, en onder dezelfde naam een geüpgraded versie starten.", "Failed to revoke invite": "Intrekken van uitnodiging is mislukt", "Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.": "Kon de uitnodiging niet intrekken. De server ondervindt mogelijk een tijdelijk probleem, of u heeft niet het recht de uitnodiging in te trekken.", @@ -1514,7 +1514,7 @@ "Find a room…": "Zoek een gesprek…", "Find a room… (e.g. %(exampleRoom)s)": "Zoek een gesprek… (bv. %(exampleRoom)s)", "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Als u de kamer niet kunt vinden is het mogelijk privé, vraag dan om een uitnodiging of maak een nieuwe kamer aan.", - "Explore rooms": "Kamersgids", + "Explore rooms": "Ontdek kamers", "Show previews/thumbnails for images": "Miniaturen voor afbeeldingen tonen", "Clear cache and reload": "Cache wissen en herladen", "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "U staat op het punt 1 bericht door %(user)s te verwijderen. Dit kan niet ongedaan gemaakt worden. Wilt u doorgaan?", @@ -1558,7 +1558,7 @@ "Trust": "Vertrouwen", "Custom (%(level)s)": "Aangepast (%(level)s)", "Error upgrading room": "Upgraden van gesprek mislukt", - "Double check that your server supports the room version chosen and try again.": "Ga nogmaals na dat de server de gekozen gespreksversie ondersteunt, en probeer het dan opnieuw.", + "Double check that your server supports the room version chosen and try again.": "Ga nogmaals na dat de server de gekozen kamerversie ondersteunt, en probeer het dan opnieuw.", "Verifies a user, session, and pubkey tuple": "Verifieert de combinatie van persoon, sessie en publieke sleutel", "Unknown (user, session) pair:": "Onbekende combinatie persoon en sessie:", "Session already verified!": "Sessie al geverifieerd!", @@ -2319,17 +2319,17 @@ "We couldn't log you in": "We konden u niet inloggen", "Room Info": "Gespreksinfo", "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org is de grootste publieke homeserver van de wereld, en dus een goede plek voor de meeste.", - "Explore Public Rooms": "Ontdek publieke kamers", + "Explore Public Rooms": "Publieke kamers ontdekken", "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Privékamers zijn alleen zichtbaar en toegankelijk met een uitnodiging. Publieke kamers zijn zichtbaar en toegankelijk voor iedereen in deze gemeenschap.", "This room is public": "Dit gesprek is openbaar", "Show previews of messages": "Voorvertoning van berichten inschakelen", "Show message previews for reactions in all rooms": "Berichtvoorbeelden voor reacties in alle kamers tonen", - "Explore public rooms": "Ontdek publieke kamers", + "Explore public rooms": "Publieke kamers ontdekken", "Leave Room": "Gesprek verlaten", "Room options": "Gesprekopties", "Start a conversation with someone using their name, email address or username (like ).": "Start een gesprek met iemand door hun naam, e-mailadres of inlognaam (zoals ) te typen.", - "Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "Berichten hier zijn eind-tot-eind versleuteld. Verifieer %(displayName)s op hun profiel - klik op hun afbeelding.", - "%(creator)s created this DM.": "%(creator)s maakte deze DM.", + "Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "Berichten hier zijn eind-tot-eind-versleuteld. Verifieer %(displayName)s op hun profiel - klik op hun afbeelding.", + "%(creator)s created this DM.": "%(creator)s maakte deze directe chat.", "Switch to dark mode": "Naar donkere modus wisselen", "Switch to light mode": "Naar lichte modus wisselen", "Appearance": "Weergave", @@ -2343,17 +2343,17 @@ "Favourited": "Favoriet", "Forget Room": "Gesprek vergeten", "Notification options": "Meldingsinstellingen", - "Use default": "Gebruik standaardinstelling", + "Use default": "Standaardinstelling gebruiken", "Show %(count)s more|one": "Toon %(count)s meer", "Show %(count)s more|other": "Toon %(count)s meer", "Show rooms with unread messages first": "Kamers met ongelezen berichten als eerste tonen", "%(count)s results|one": "%(count)s resultaten", "%(count)s results|other": "%(count)s resultaten", - "Explore all public rooms": "Verken alle publieke kamers", + "Explore all public rooms": "Alle publieke kamers ontdekken", "Start a new chat": "Nieuw gesprek beginnen", "Can't see what you’re looking for?": "Niet kunnen vinden waar u naar zocht?", "Custom Tag": "Aangepast label", - "Explore community rooms": "Gemeenschapskamers verkennen", + "Explore community rooms": "Gemeenschapskamers ontdekken", "Start a Conversation": "Begin een gesprek", "Show Widgets": "Widgets tonen", "Hide Widgets": "Widgets verbergen", @@ -2459,7 +2459,7 @@ "Add image (optional)": "Afbeelding toevoegen (niet vereist)", "Enter name": "Naam invoeren", "What's the name of your community or team?": "Welke naam heeft uw gemeenschap of team?", - "You can change this later if needed.": "Indien nodig kunt u dit later nog veranderen.", + "You can change this later if needed.": "Indien nodig kunt u dit later nog wijzigen.", "Community ID: +:%(domain)s": "Gemeenschaps-ID: +:%(domain)s", "Reason (optional)": "Reden (niet vereist)", "Send %(count)s invites|one": "Stuur %(count)s uitnodiging", @@ -2757,7 +2757,7 @@ "Got an account? Sign in": "Heeft u een account? Inloggen", "Failed to find the general chat for this community": "De algemene chat voor deze gemeenschap werd niet gevonden", "Filter rooms and people": "Gespreken en personen filteren", - "Explore rooms in %(communityName)s": "Ontdek de kamers van %(communityName)s", + "Explore rooms in %(communityName)s": "Kamers van %(communityName)s ontdekken", "delete the address.": "het adres verwijderen.", "Delete the room address %(alias)s and remove %(name)s from the directory?": "Het kameradres %(alias)s en %(name)s uit de gids verwijderen?", "You have no visible notifications.": "U hebt geen zichtbare meldingen.", @@ -2880,7 +2880,7 @@ "Preparing to download logs": "Klaarmaken om logs te downloaden", "Matrix rooms": "Matrix-kamers", "%(networkName)s rooms": "%(networkName)s kamers", - "Enter the name of a new server you want to explore.": "Voer de naam in van een nieuwe server die u wilt verkennen.", + "Enter the name of a new server you want to explore.": "Voer de naam in van een nieuwe server die u wilt ontdekken.", "Remove server": "Server verwijderen", "All rooms": "Alle kamers", "Windows": "Windows", @@ -2971,7 +2971,7 @@ "Value": "Waarde", "Setting ID": "Instellingen-ID", "Failed to save settings": "Kan geen instellingen opslaan", - "Settings Explorer": "Instellingen Ontdekken", + "Settings Explorer": "Instellingen ontdekken", "Show chat effects (animations when receiving e.g. confetti)": "Effecten tonen (animaties bij ontvangst bijv. confetti)", "Jump to the bottom of the timeline when you send a message": "Naar de onderkant van de tijdlijn springen wanneer u een bericht verstuurd", "Original event source": "Originele gebeurtenisbron", @@ -2983,8 +2983,8 @@ "Inviting...": "Uitnodigen...", "Invite by username": "Op inlognaam uitnodigen", "Invite your teammates": "Uw teamgenoten uitnodigen", - "Failed to invite the following users to your space: %(csvUsers)s": "Het uitnodigen van de volgende personen voor uw space is mislukt: %(csvUsers)s", - "A private space for you and your teammates": "Een privé space voor u en uw teamgenoten", + "Failed to invite the following users to your space: %(csvUsers)s": "Het uitnodigen van de volgende personen voor uw ruimte is mislukt: %(csvUsers)s", + "A private space for you and your teammates": "Een privéruimte voor u en uw teamgenoten", "Me and my teammates": "Ik en mijn teamgenoten", "A private space just for you": "Een privé space alleen voor u", "Just Me": "Alleen Ik", @@ -2994,7 +2994,7 @@ "At the moment only you can see it.": "Op dit moment kan u deze alleen zien.", "Creating rooms...": "Kamers aanmaken...", "Skip for now": "Voorlopig overslaan", - "Failed to create initial space rooms": "Het maken van de space kamers is mislukt", + "Failed to create initial space rooms": "Het maken van de ruimte kamers is mislukt", "Room name": "Gespreksnaam", "Support": "Ondersteuning", "Random": "Willekeurig", @@ -3005,7 +3005,7 @@ " invited you to ": " heeft u uitgenodigd voor ", "%(count)s members|other": "%(count)s personen", "%(count)s members|one": "%(count)s persoon", - "Your server does not support showing space hierarchies.": "Uw server heeft geen ondersteuning voor het weergeven van space indelingen.", + "Your server does not support showing space hierarchies.": "Uw server heeft geen ondersteuning voor het weergeven van ruimte-indelingen.", "Default Rooms": "Standaard Gesprekken", "Add existing rooms & spaces": "Bestaande gesprekken en spaces toevoegen", "Accept Invite": "Uitnodiging Accepteren", @@ -3019,8 +3019,8 @@ "Remove from Space": "Van space verwijderen", "Undo": "Ongedaan maken", "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.": "Uw bericht is niet verstuurd, omdat deze homeserver is geblokkeerd door zijn beheerder. Gelieve contact op te nemen met uw beheerder om de dienst te blijven gebruiken.", - "Are you sure you want to leave the space '%(spaceName)s'?": "Weet u zeker dat u de space '%(spaceName)s' wilt verlaten?", - "This space is not public. You will not be able to rejoin without an invite.": "Deze space is niet openbaar. Zonder uitnodiging zult u niet opnieuw kunnen toetreden.", + "Are you sure you want to leave the space '%(spaceName)s'?": "Weet u zeker dat u de ruimte '%(spaceName)s' wilt verlaten?", + "This space is not public. You will not be able to rejoin without an invite.": "Deze ruimte is niet openbaar. Zonder uitnodiging zult u niet opnieuw kunnen toetreden.", "Start audio stream": "Audiostream starten", "Failed to start livestream": "Starten van livestream is mislukt", "Unable to start audio streaming.": "Kan audiostream niet starten.", @@ -3030,7 +3030,7 @@ "Leave Space": "Ruimte verlaten", "Make this space private": "Maak deze space privé", "Failed to save space settings.": "Het opslaan van de ruimte-instellingen is mislukt.", - "Space settings": "Space-instellingen", + "Space settings": "Ruimte-instellingen", "Edit settings relating to your space.": "Bewerk instellingen gerelateerd aan uw ruimte.", "Invite someone using their name, username (like ) or share this space.": "Nodig iemand uit per naam, inlognaam (zoals ) of deel deze ruimte.", "Invite someone using their name, email address, username (like ) or share this space.": "Nodig iemand uit per naam, e-mail, inlognaam (zoals ) of deel deze ruimte.", @@ -3092,14 +3092,14 @@ "Verify with another session": "Verifieer met een andere sessie", "We'll create rooms for each of them. You can add more later too, including already existing ones.": "We zullen voor elk een kamer maken. U kunt er later meer toevoegen, inclusief al bestaande kamers.", "Let's create a room for each of them. You can add more later too, including already existing ones.": "Laten we voor elk een gesprek maken. U kunt er later meer toevoegen, inclusief al bestaande gesprekken.", - "Make sure the right people have access. You can invite more later.": "Controleer of de juiste mensen toegang hebben. U kunt later meer mensen uitnodigen.", - "A private space to organise your rooms": "Een privé space om uw kamers te organiseren", + "Make sure the right people have access. You can invite more later.": "Controleer of de juiste personen toegang hebben. U kunt later meer personen uitnodigen.", + "A private space to organise your rooms": "Een privéruimte om uw kamers te organiseren", "Just me": "Alleen ik", - "Make sure the right people have access to %(name)s": "Controleer of de juiste mensen toegang hebben tot %(name)s", + "Make sure the right people have access to %(name)s": "Controleer of de juiste personen toegang hebben tot %(name)s", "Go to my first room": "Ga naar mijn eerste gesprek", "It's just you at the moment, it will be even better with others.": "Het is alleen u op dit moment, het zal nog beter zijn met anderen.", "Share %(name)s": "Deel %(name)s", - "Private space": "Privé space", + "Private space": "Privéruimte", "Public space": "Publieke ruimte", " invites you": " nodigt u uit", "Search names and description": "Zoek in namen en beschrijvingen", @@ -3126,10 +3126,10 @@ "This usually only affects how the room is processed on the server. If you're having problems with your %(brand)s, please report a bug.": "Normaal gesproken heeft dit alleen invloed op het verwerken van het gesprek op de server. Als u problemen ervaart met %(brand)s, stuur dan een bugmelding.", "Invite to %(roomName)s": "Uitnodiging voor %(roomName)s", "Edit devices": "Apparaten bewerken", - "Invite People": "Mensen uitnodigen", + "Invite People": "Personen uitnodigen", "Invite with email or username": "Uitnodigen per e-mail of inlognaam", "You can change these anytime.": "U kan dit elk moment nog aanpassen.", - "Add some details to help people recognise it.": "Voeg details toe zodat mensen het herkennen.", + "Add some details to help people recognise it.": "Voeg details toe zodat personen het herkennen.", "Spaces are new ways to group rooms and people. To join an existing space you'll need an invite.": "Spaces zijn een nieuwe manier voor het groeperen van gesprekken. Voor deelname aan een bestaande space heeft u een uitnodiging nodig.", "From %(deviceName)s (%(deviceId)s) at %(ip)s": "Van %(deviceName)s (%(deviceId)s) op %(ip)s", "Check your devices": "Controleer uw apparaten", @@ -3193,12 +3193,12 @@ "%(count)s members including %(commaSeparatedMembers)s|other": "%(count)s leden inclusief %(commaSeparatedMembers)s", "Including %(commaSeparatedMembers)s": "Inclusief %(commaSeparatedMembers)s", "View all %(count)s members|one": "1 lid bekijken", - "View all %(count)s members|other": "Bekijk alle %(count)s leden", + "View all %(count)s members|other": "Bekijk alle %(count)s personen", "Failed to send": "Verzenden is mislukt", "Enter your Security Phrase a second time to confirm it.": "Voor uw veiligheidswachtwoord een tweede keer in om het te bevestigen.", - "Pick rooms or conversations to add. This is just a space for you, no one will be informed. You can add more later.": "Kies een gesprek om hem toe te voegen. Dit is een space voor u, niemand zal hiervan een melding krijgen. U kan er later meer toevoegen.", + "Pick rooms or conversations to add. This is just a space for you, no one will be informed. You can add more later.": "Kies een kamer of gesprek om hem toe te voegen. Dit is een ruimte voor u, niemand zal hiervan een melding krijgen. U kan er later meer toevoegen.", "What do you want to organise?": "Wat wilt u organiseren?", - "Filter all spaces": "Alle spaces filteren", + "Filter all spaces": "Alle ruimtes filteren", "Delete recording": "Opname verwijderen", "Stop the recording": "Opname stoppen", "%(count)s results in all spaces|one": "%(count)s resultaat in alle ruimtes", @@ -3207,15 +3207,15 @@ "Play": "Afspelen", "Pause": "Pauze", "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Dit is een experimentele functie. Voorlopig moeten nieuwe personen die een uitnodiging krijgen de gebruiken om daadwerkelijk deel te nemen.", - "To join %(spaceName)s, turn on the Spaces beta": "Om aan %(spaceName)s deel te nemen moet u de Spaces beta inschakelen", - "To view %(spaceName)s, turn on the Spaces beta": "Om %(spaceName)s te bekijken moet u de Spaces beta inschakelen", + "To join %(spaceName)s, turn on the Spaces beta": "Om aan %(spaceName)s deel te nemen moet u de ruimtes beta inschakelen", + "To view %(spaceName)s, turn on the Spaces beta": "Om %(spaceName)s te bekijken moet u de ruimtes beta inschakelen", "Select a room below first": "Start met selecteren van een gesprek hieronder", - "Communities are changing to Spaces": "Gemeenschappen worden vervangen door Spaces", + "Communities are changing to Spaces": "Gemeenschappen worden vervangen door ruimtes", "Join the beta": "Beta inschakelen", "Leave the beta": "Beta verlaten", "Beta": "Beta", "Tap for more info": "Klik voor meer info", - "Spaces is a beta feature": "Spaces zijn in beta", + "Spaces is a beta feature": "Ruimtes zijn in beta", "Want to add a new room instead?": "Wilt u anders een nieuw gesprek toevoegen?", "Adding rooms... (%(progress)s out of %(count)s)|one": "Gesprek toevoegen...", "Adding rooms... (%(progress)s out of %(count)s)|other": "Kamers toevoegen... (%(progress)s van %(count)s)", @@ -3254,8 +3254,8 @@ "Send and receive voice messages": "Stuur en ontvang spraakberichten", "Your feedback will help make spaces better. The more detail you can go into, the better.": "Uw feedback maakt ruimtes beter. Hoe meer details u kunt geven, hoe beter.", "If you leave, %(brand)s will reload with Spaces disabled. Communities and custom tags will be visible again.": "Als u de pagina nu verlaat zal %(brand)s herladen met Ruimtes uitgeschakeld. Gemeenschappen en labels zullen weer zichtbaar worden.", - "Space Autocomplete": "Space Autocomplete", - "Go to my space": "Ga naar mijn space", + "Space Autocomplete": "Ruimte autocomplete", + "Go to my space": "Ga naar mijn ruimte", "sends space invaders": "verstuur space invaders", "Sends the given message with a space themed effect": "Verstuur het bericht met een ruimte-thema-effect", "See when people join, leave, or are invited to your active room": "Zie wanneer personen deelnemen, vertrekken of worden uitgenodigd in uw actieve kamer", @@ -3369,7 +3369,7 @@ "%(targetName)s accepted an invitation": "%(targetName)s accepteerde de uitnodiging", "%(targetName)s accepted the invitation for %(displayName)s": "%(targetName)s accepteerde de uitnodiging voor %(displayName)s", "Some invites couldn't be sent": "Sommige uitnodigingen konden niet verstuurd worden", - "We sent the others, but the below people couldn't be invited to ": "De anderen zijn verstuurd, maar de volgende mensen konden niet worden uitgenodigd voor ", + "We sent the others, but the below people couldn't be invited to ": "De anderen zijn verstuurd, maar de volgende personen konden niet worden uitgenodigd voor ", "Unnamed audio": "Naamloze audio", "Error processing audio message": "Fout bij verwerking audiobericht", "Show %(count)s other previews|one": "%(count)s andere preview weergeven", @@ -3466,10 +3466,10 @@ "Please note upgrading will make a new version of the room. All current messages will stay in this archived room.": "Let op bijwerken maakt een nieuwe versie van dit gesprek. Alle huidige berichten blijven in dit gearchiveerde gesprek.", "Automatically invite members from this room to the new one": "Automatisch leden uitnodigen van dit gesprek in de nieuwe", "These are likely ones other room admins are a part of.": "Dit zijn waarschijnlijk kamers waar andere kamerbeheerders deel van uitmaken.", - "Other spaces or rooms you might not know": "Andere spaces of kamers die u misschien niet kent", - "Spaces you know that contain this room": "Spaces die u kent met dit gesprek", - "Search spaces": "Spaces zoeken", - "Decide which spaces can access this room. If a space is selected, its members can find and join .": "Kies welke spaces toegang hebben tot dit gesprek. Als een space is geselecteerd kunnen deze leden vinden en aan deelnemen.", + "Other spaces or rooms you might not know": "Andere ruimtes of kamers die u misschien niet kent", + "Spaces you know that contain this room": "Ruimtes die u kent met deze kamer", + "Search spaces": "Ruimtes zoeken", + "Decide which spaces can access this room. If a space is selected, its members can find and join .": "Kies welke ruimtes toegang hebben tot deze kamer. Als een ruimte is geselecteerd kunnen deze leden vinden en aan deelnemen.", "Select spaces": "Ruimte selecteren", "You're removing all spaces. Access will default to invite only": "U verwijderd alle ruimtes. De toegang zal teruggezet worden naar alleen op uitnodiging", "Room visibility": "Gesprekszichtbaarheid", @@ -3489,8 +3489,8 @@ "All rooms you're in will appear in Home.": "Alle kamers waar u in bent zullen in Home verschijnen.", "Send pseudonymous analytics data": "Pseudonieme analytische gegevens verzenden", "We're working on this, but just want to let you know.": "We zijn er nog mee bezig en wilde het u even laten weten.", - "Search for rooms or spaces": "Zoek naar kamers of spaces", - "Add space": "Space toevoegen", + "Search for rooms or spaces": "Kamers of ruimtes zoeken", + "Add space": "Ruimte toevoegen", "Are you sure you want to leave ?": "Weet u zeker dat u wilt verlaten?", "Leave %(spaceName)s": "%(spaceName)s verlaten", "You're the only admin of some of the rooms or spaces you wish to leave. Leaving them will leave them without any admins.": "U bent de enige beheerder van sommige kamers of spaces die u wilt verlaten. Door deze te verlaten hebben ze geen beheerder meer.", @@ -3547,10 +3547,10 @@ "Don't send read receipts": "Geen leesbevestigingen versturen", "Created from ": "Gemaakt van ", "Communities won't receive further updates.": "Gemeenschappen zullen geen updates meer krijgen.", - "Spaces are a new way to make a community, with new features coming.": "Spaces zijn de nieuwe gemeenschappen, met binnenkort meer nieuwe functies.", - "Communities can now be made into Spaces": "Gemeenschappen kunnen nu omgezet worden in Spaces", - "Ask the admins of this community to make it into a Space and keep a look out for the invite.": "Vraag een beheerder van deze gemeenschap om hem om te zetten in een Space en kijk uit naar de uitnodiging.", - "You can create a Space from this community here.": "U kunt hier een Space maken van uw gemeenschap.", + "Spaces are a new way to make a community, with new features coming.": "Ruimtes zijn de nieuwe gemeenschappen, met binnenkort meer nieuwe functies.", + "Communities can now be made into Spaces": "Gemeenschappen kunnen nu omgezet worden in ruimtes", + "Ask the admins of this community to make it into a Space and keep a look out for the invite.": "Vraag een beheerder van deze gemeenschap om hem om te zetten in een ruimte en kijk uit naar de uitnodiging.", + "You can create a Space from this community here.": "U kunt hier een ruimte maken van uw gemeenschap.", "This description will be shown to people when they view your space": "Deze omschrijving zal getoond worden aan personen die uw ruimte bekijken", "Flair won't be available in Spaces for the foreseeable future.": "Badges zijn niet beschikbaar in ruimtes in de nabije toekomst.", "All rooms will be added and all community members will be invited.": "Alle kamers zullen worden toegevoegd en alle gemeenschapsleden zullen worden uitgenodigd.", @@ -3565,7 +3565,7 @@ "Unknown failure: %(reason)s": "Onbekende fout: %(reason)s", "Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Debug logs bevatten applicatie gebruiksgegevens inclusief uw inlognaam, de ID's of aliassen van de kamers of groepen die u hebt bezocht, welke UI elementen u het laatst hebt gebruikt, en de inlognamen van andere personen. Ze bevatten geen berichten.", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Als u een bug hebt ingediend via GitHub, kunnen debug logs ons helpen het probleem op te sporen. Debug logs bevatten applicatie gebruiksgegevens inclusief uw inlognaam, de ID's of aliassen van de kamers of groepen die u hebt bezocht, welke UI elementen u het laatst hebt gebruikt, en de inlognamen van andere personen. Ze bevatten geen berichten.", - "Rooms and spaces": "Kamers en spaces", + "Rooms and spaces": "Kamers en ruimtes", "Results": "Resultaten", "Enable encryption in settings.": "Versleuteling inschakelen in instellingen.", "Your private messages are normally encrypted, but this room isn't. Usually this is due to an unsupported device or method being used, like email invites.": "Uw privéberichten zijn versleuteld, maar deze kamer niet. Dit komt vaak doordat u een niet ondersteund apparaat of methode, zoals e-mailuitnodigingen.", @@ -3593,7 +3593,7 @@ "& %(count)s more|one": "& %(count)s meer", "Some encryption parameters have been changed.": "Enkele versleutingsparameters zijn gewijzigd.", "Role in ": "Rol in ", - "Explore %(spaceName)s": "Verken %(spaceName)s", + "Explore %(spaceName)s": "%(spaceName)s ontdekken", "Send a sticker": "Verstuur een sticker", "Reply to thread…": "Reageer op draad…", "Reply to encrypted thread…": "Reageer op versleutelde draad…", @@ -3601,10 +3601,10 @@ "Unknown failure": "Onbekende fout", "Failed to update the join rules": "Het updaten van de deelname regels is mislukt", "Select the roles required to change various parts of the space": "Selecteer de rollen die vereist zijn om onderdelen van de ruimte te wijzigen", - "Change description": "Omschrijving veranderen", - "Change main address for the space": "Hoofdadres van ruimte veranderen", - "Change space name": "Ruimtenaam veranderen", - "Change space avatar": "Ruimte-avatar veranderen", + "Change description": "Omschrijving wijzigen", + "Change main address for the space": "Hoofdadres van ruimte wijzigen", + "Change space name": "Ruimtenaam wijzigen", + "Change space avatar": "Ruimte-afbeelding wijzigen", "Anyone in can find and join. You can select other spaces too.": "Iedereen in kan zoeken en deelnemen. U kunt ook andere ruimtes selecteren.", "Message didn't send. Click for info.": "Bericht is niet verstuur. Klik voor meer info." } From 68c64c63ff74aa4a53b840e489858c102fa07d83 Mon Sep 17 00:00:00 2001 From: Alexandre Franke Date: Wed, 15 Sep 2021 16:21:46 +0000 Subject: [PATCH 110/256] Translated using Weblate (French) Currently translated at 99.6% (3151 of 3163 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 21e5f04c3a..a9c9b5e2b5 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -3583,7 +3583,7 @@ "You're the only admin of this space. Leaving it will mean no one has control over it.": "Vous êtes le seul administrateur de cet espace. En le quittant, plus personne n’aura le contrôle dessus.", "You won't be able to rejoin unless you are re-invited.": "Il vous sera impossible de revenir à moins d’y être réinvité.", "Search %(spaceName)s": "Rechercher %(spaceName)s", - "Leave specific rooms and spaces": "Laisser certains salons et espaces", + "Leave specific rooms and spaces": "Quitter certains salons et espaces", "Don't leave any": "Ne rien quitter", "Leave all rooms and spaces": "Quitter tous les salons et les espaces", "Want to add an existing space instead?": "Vous voulez plutôt ajouter un espace existant ?", From 17ec6d56103c77ec6deda82ea8e412fdd8403f2a Mon Sep 17 00:00:00 2001 From: Timo Gurr Date: Thu, 16 Sep 2021 07:09:37 +0000 Subject: [PATCH 111/256] Translated using Weblate (German) Currently translated at 99.1% (3135 of 3163 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 c14c160cb2..2d6e777aa4 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -892,7 +892,7 @@ "Save it on a USB key or backup drive": "Speichere ihn auf einem USB-Schlüssel oder Sicherungslaufwerk", "Copy it to your personal cloud storage": "Kopiere ihn in deinen persönlichen Cloud-Speicher", "Unable to create key backup": "Konnte Schlüsselsicherung nicht erstellen", - "Retry": "Erneut probieren", + "Retry": "Wiederholen", "Unable to restore backup": "Konnte Schlüsselsicherung nicht wiederherstellen", "No backup found!": "Keine Schlüsselsicherung gefunden!", "This looks like a valid recovery key!": "Dies sieht wie ein gültiger Wiederherstellungsschlüssel aus!", From c226b4d1b7eebe3158fab41b964c87da58951f16 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Thu, 16 Sep 2021 06:19:21 +0000 Subject: [PATCH 112/256] Translated using Weblate (Ukrainian) Currently translated at 66.0% (2090 of 3163 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 420 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 389 insertions(+), 31 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 785e1fabdf..0df29a1ad7 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -41,7 +41,7 @@ "Camera": "Камера", "Advanced": "Додаткові", "Always show message timestamps": "Завжди показувати часові позначки повідомлень", - "Authentication": "Впізнавання", + "Authentication": "Автентифікація", "%(items)s and %(lastItem)s": "%(items)s та %(lastItem)s", "and %(count)s others...|one": "і інше...", "and %(count)s others...|other": "та %(count)s інші...", @@ -71,7 +71,7 @@ "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s змінює назву кімнати на %(roomName)s.", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s видалив ім'я кімнати.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s змінює тему на %(topic)s.", - "Email": "е-пошта", + "Email": "Е-пошта", "Email address": "Адреса е-пошти", "Failed to send email": "Помилка надсилання електронного листа", "Edit": "Змінити", @@ -122,7 +122,7 @@ "You have successfully set a password!": "Пароль успішно встановлено!", "An error occurred whilst saving your email notification preferences.": "Під час збереження налаштувань сповіщень е-поштою трапилася помилка.", "Explore Room State": "Перегляд статуса кімнати", - "Source URL": "Джерельне посилання", + "Source URL": "Початкова URL-адреса", "Messages sent by bot": "Повідомлення, надіслані ботом", "Filter results": "Відфільтрувати результати", "Members": "Учасники", @@ -393,10 +393,10 @@ "Submit": "Надіслати", "Phone": "Телефон", "Failed to upload profile picture!": "Не вдалося вивантажити зображення профілю!", - "Upload new:": "Вивантажити нову:", - "No display name": "Немає видимого імені", + "Upload new:": "Вивантажити нове:", + "No display name": "Немає показуваного імені", "New passwords don't match": "Нові паролі не збігаються", - "Passwords can't be empty": "Пароль не може бути пустим", + "Passwords can't be empty": "Пароль не може бути порожнім", "Export E2E room keys": "Експортувати ключі наскрізного шифрування кімнат", "Do you want to set an email address?": "Бажаєте вказати адресу е-пошти?", "Current password": "Поточний пароль", @@ -404,7 +404,7 @@ "New Password": "Новий пароль", "Confirm password": "Підтвердження пароля", "Last seen": "Востаннє в мережі", - "Failed to set display name": "Не вдалося зазначити видиме ім'я", + "Failed to set display name": "Не вдалося вказати показуване ім'я", "The maximum permitted number of widgets have already been added to this room.": "Максимально дозволену кількість віджетів уже додано до цієї кімнати.", "Drop File Here": "Киньте файл сюди", "Drop file here to upload": "Перетягніть сюди файл, щоб вивантажити", @@ -478,7 +478,7 @@ "Sends the given message coloured as a rainbow": "Надсилає вказане повідомлення, розфарбоване веселкою", "Your %(brand)s is misconfigured": "Ваш %(brand)s налаштовано неправильно", "Join the discussion": "Приєднатися до обговорення", - "Upload": "Обрати", + "Upload": "Вивантажити", "Upload file": "Вивантажити файл", "Send an encrypted message…": "Надіслати зашифроване повідомлення…", "The conversation continues here.": "Розмова триває тут.", @@ -505,7 +505,7 @@ "Upload %(count)s other files|other": "Вивантажити %(count)s інших файлів", "Upload Error": "Помилка відвантаження", "Failed to upload image": "Не вдалось вивантажити зображення", - "Upload avatar": "Завантажити аватар", + "Upload avatar": "Вивантажити аватар", "For security, this session has been signed out. Please sign in again.": "З метою безпеки ваш сеанс було завершено. Увійдіть знову.", "Upload an avatar:": "Завантажити аватар:", "Custom (%(level)s)": "Власний (%(level)s)", @@ -567,7 +567,7 @@ "Unable to restore session": "Не вдалося відновити сеанс", "We encountered an error trying to restore your previous session.": "Ми натрапили на помилку, намагаючись відновити ваш попередній сеанс.", "Please install Chrome, Firefox, or Safari for the best experience.": "Для найкращих вражень від користування встановіть, будь ласка, Chrome, Firefox, або Safari.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Ваш обліковий запис має перехресно-підписувану ідентичність у таємному сховищі, але воно ще не є довіреним у цьому сеансі.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Ваш обліковий запис має перехресне підписування особи у таємному сховищі, але цей сеанс йому ще не довіряє.", "in account data": "у даних облікового запису", "Clear notifications": "Очистити сповіщення", "Add an email address to configure email notifications": "Додати адресу е-пошти для налаштування поштових сповіщень", @@ -953,7 +953,7 @@ "Cactus": "Кактус", "Mushroom": "Гриб", "Globe": "Глобус", - "This bridge was provisioned by .": "Цей місток був підготовленим .", + "This bridge was provisioned by .": "Цей міст було забезпечено .", "This bridge is managed by .": "Цей міст керується .", "Workspace: %(networkName)s": "Робочий простір: %(networkName)s", "Channel: %(channelName)s": "Канал: %(channelName)s", @@ -964,21 +964,21 @@ "Gift": "Подарунок", "Lock": "Замок", "Cross-signing and secret storage are not yet set up.": "Перехресне підписування та таємне сховище ще не налагоджені.", - "Your homeserver does not support cross-signing.": "Ваш домашній сервер не підтримує кросс-підпис.", + "Your homeserver does not support cross-signing.": "Ваш домашній сервер не підтримує перехресного підписування.", "Cross-signing and secret storage are enabled.": "Кросс-підпис та секретне сховище дозволені.", "well formed": "добре сформований", "unexpected type": "несподіваний тип", - "Cross-signing public keys:": "Перехресно-підписувальні відкриті ключі:", + "Cross-signing public keys:": "Відкриті ключі перехресного підписування:", "in memory": "у пам'яті", "not found": "не знайдено", - "Cross-signing private keys:": "Приватні ключі для кросс-підпису:", + "Cross-signing private keys:": "Приватні ключі перехресного підписування:", "exists": "існує", "Delete sessions|other": "Видалити сеанси", "Delete sessions|one": "Видалити сеанс", "Delete %(count)s sessions|other": "Видалити %(count)s сеансів", "Delete %(count)s sessions|one": "Видалити %(count)s сеансів", "ID": "ID", - "Public Name": "Публічне ім'я", + "Public Name": "Загальнодоступне ім'я", " to store messages from ": " зберігання повідомлень від ", "rooms.": "кімнати.", "Manage": "Керування", @@ -994,8 +994,8 @@ "Backup key stored: ": "Резервна копія ключа збережена ", "Enable audible notifications for this session": "Увімкнути звукові сповіщення для цього сеансу", "Save": "Зберегти", - "Checking server": "Перевірка серверу", - "Disconnect": "Відключити", + "Checking server": "Перевірка сервера", + "Disconnect": "Від'єднатися", "You should:": "Вам варто:", "Disconnect anyway": "Відключити в будь-якому випадку", "Identity Server (%(server)s)": "Сервер ідентифікації (%(server)s)", @@ -1040,7 +1040,7 @@ "%(count)s unread messages.|other": "%(count)s непрочитаних повідомлень.", "%(count)s unread messages.|one": "1 непрочитане повідомлення.", "Unread messages.": "Непрочитані повідомлення.", - "This room is public": "Ця кімната є прилюдною", + "This room is public": "Ця кімната загальнодоступна", "Show Stickers": "Показати наліпки", "Failed to revoke invite": "Не вдалось відкликати запрошення", "Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.": "Не вдалось відкликати запрошення. Сервер може мати тимчасові збої або у вас немає достатніх дозволів щоб відкликати запрошення.", @@ -1088,7 +1088,7 @@ "Your recovery key is in your Downloads folder.": "Ваш відновлювальний ключ у вашій теці Завантаження.", "Make a copy of your recovery key": "Зробити копію вашого відновлювального ключа", "Don't ask again": "Не запитувати знову", - "New Recovery Method": "Новий відновлювальний засіб", + "New Recovery Method": "Новий метод відновлення", "A new recovery passphrase and key for Secure Messages have been detected.": "Було виявлено нові відновлювальні парольну фразу та ключ від захищених повідомлень.", "This session is encrypting history using the new recovery method.": "Цей сеанс зашифровує історію новим відновлювальним засобом.", "Set up Secure Messages": "Налаштувати захищені повідомлення", @@ -1121,7 +1121,7 @@ "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Ви впевнені? Ви загубите ваші зашифровані повідомлення якщо копія ключів не була зроблена коректно.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Зашифровані повідомлення захищені наскрізним шифруванням. Лише ви та отримувачі повідомлень мають ключі для їх читання.", "Display Name": "Показуване ім'я", - "wait and try again later": "зачекайте та спопробуйте ще раз пізніше", + "wait and try again later": "зачекати та повторити спробу пізніше", "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.": "Якщо ви увімкнете шифрування для кімнати, його неможливо буде вимкнути. Надіслані у зашифровану кімнату повідомлення будуть прочитними тільки для учасників кімнати, натомість для сервера вони будуть непрочитними. Увімкнення шифрування може унеможливити роботу ботів та мостів. Дізнатись більше про шифрування.", "Encrypted": "Зашифроване", "This room is end-to-end encrypted": "Ця кімната є наскрізно зашифрованою", @@ -1134,7 +1134,7 @@ "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 encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "У зашифрованих кімнатах ваші повідомлення є захищеними, тож тільки ви та отримувач маєте ключі для їх розблокування.", "In encrypted rooms, verify all users to ensure it’s secure.": "У зашифрованих кімнатах звіряйте усіх користувачів щоб переконатись у безпеці спілкування.", - "Failed to copy": "Не вдалось скопіювати", + "Failed to copy": "Не вдалося скопіювати", "Your display name": "Ваше видиме ім'я", "COPY": "СКОПІЮВАТИ", "Set a display name:": "Зазначити видиме ім'я:", @@ -1144,7 +1144,7 @@ "Page Down": "Page Down", "Esc": "Esc", "Enter": "Enter", - "Space": "Пропуск", + "Space": "Простір", "End": "End", "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "Видалення даних з цього сеансу є безповоротним. Зашифровані повідомлення будуть втрачені якщо їхні ключі не було продубльовано.", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Звірте цього користувача щоб позначити його довіреним. Довіряння користувачам додає спокою якщо ви користуєтесь наскрізно зашифрованими повідомленнями.", @@ -1191,7 +1191,7 @@ "Messages containing @room": "Повідомлення, що містять @room", "When rooms are upgraded": "Коли кімнати поліпшено", "Unknown caller": "Невідомий викликач", - "The integration manager is offline or it cannot reach your homeserver.": "Менеджер інтеграцій непід'єднаний або не може досягти вашого домашнього сервера.", + "The integration manager is offline or it cannot reach your homeserver.": "Менеджер інтеграцій не під'єднаний або не може зв'язатися з вашим домашнім сервером.", "Enable desktop notifications for this session": "Увімкнути стільничні сповіщення для цього сеансу", "Profile picture": "Зображення профілю", "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій %(serverName)s для керування ботами, знадобами та паками наліпок.", @@ -1527,7 +1527,7 @@ "Filter rooms and people": "Відфільтрувати кімнати та людей", "Find a room… (e.g. %(exampleRoom)s)": "Знайти кімнату… (напр. %(exampleRoom)s)", "Find a room…": "Знайти кімнату…", - "Can't find this server or its room list": "Не вдалось знайти цей сервер у переліку кімнат", + "Can't find this server or its room list": "Не вдалося знайти цей сервер або список його кімнат", "If you can't find the room you're looking for, ask for an invite or Create a new room.": "Якщо ви не можете знайти потрібну кімнату, попросіть запрошення або Створіть нову кімнату власноруч.", "Cannot reach homeserver": "Не вдалося зв'язатися з домашнім сервером", "Ensure you have a stable internet connection, or get in touch with the server admin": "Переконайтеся, що у ваше з'єднання з Інтернетом стабільне або зв’яжіться з системним адміністратором", @@ -1562,7 +1562,7 @@ "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)sзмінили свої імена", "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)sзмінили свої імена %(count)s разів", "Error whilst fetching joined communities": "Помилка під час отримання спільнот до яких ви приєдналися", - "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Закриті кімнати можна знайти та приєднатися до них лише за запрошенням. Загальнодоступні кімнати може знайти і приєднатись кожен з цієї спільноти.", + "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Приватні кімнати можна знайти та приєднатися до них лише за запрошенням. Загальнодоступні кімнати може знайти та приєднатися кожен з цієї спільноти.", "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Закриті кімнати можна знайти та приєднатися до них лише за запрошенням. Загальнодоступні кімнати може знайти і приєднатись кожен.", "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)sвиходить і повертається", "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)sвиходить і повертається %(count)s разів", @@ -1639,12 +1639,12 @@ "Use an integration manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "Використовувати менеджер інтеграцій %(serverName)s для керування ботами, розширеннями й пакунками наліпок.", "Identity server": "Сервер ідентифікації", "Identity server (%(server)s)": "Сервер ідентифікації (%(server)s)", - "Could not connect to identity server": "Не вдалося під'єднатись до сервера ідентифікації", + "Could not connect to identity server": "Не вдалося під'єднатися до сервера ідентифікації", "There was an error looking up the phone number": "Сталася помилка під час пошуку номеру телефону", "Unable to look up phone number": "Неможливо знайти номер телефону", "Not trusted": "Не довірений", "Trusted": "Довірений", - "This backup is trusted because it has been restored on this session": "Ця резервна копія є надійною, оскільки її було відновлено під час цього сеансу", + "This backup is trusted because it has been restored on this session": "Ця резервна копія довірена, оскільки її було відновлено у цьому сеансі", "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Індивідуально перевіряйте кожен сеанс, який використовується користувачем, щоб позначити його довіреним, не довіряючи пристроям перехресного підписування.", "To be secure, do this in person or use a trusted way to communicate.": "Для забезпечення безпеки зробіть це особисто або скористайтесь надійним способом зв'язку.", "You can change this at any time from room settings.": "Ви завжди можете змінити це у налаштуваннях кімнати.", @@ -1700,7 +1700,7 @@ "Failed to transfer call": "Не вдалося переадресувати виклик", "Transfer Failed": "Не вдалося переадресувати", "Unable to transfer call": "Не вдалося переадресувати дзвінок", - "Pick rooms or conversations to add. This is just a space for you, no one will be informed. You can add more later.": "Виберіть кімнати або бесіди, які потрібно додати. Це просто простір для вас, ніхто не буде поінформований. Пізніше ви можете додати більше.", + "Pick rooms or conversations to add. This is just a space for you, no one will be informed. You can add more later.": "Виберіть кімнати або бесіди, які потрібно додати. Це простір лише для вас, ніхто не буде поінформований. Пізніше ви можете додати більше.", "Join the conference from the room information card on the right": "Приєднуйтесь до конференції з інформаційної картки кімнати праворуч", "Room Info": "Відомості про кімнату", "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "Під час спроби перевірити ваше запрошення було повернуто помилку (%(errcode)s). Ви можете спробувати передати ці дані адміністратору кімнати.", @@ -1835,8 +1835,8 @@ "Forward": "Переслати", "Forward message": "Переслати повідомлення", "Beta available for web, desktop and Android. Some features may be unavailable on your homeserver.": "Бета-версія доступна для переглядачів інтернету, настільних ПК та Android. Деякі функції можуть бути недоступні на вашому домашньому сервері.", - "Join the beta": "Долучитися до beta", - "To join %(spaceName)s, turn on the Spaces beta": "Щоб приєднатися до %(spaceName)s, увімкніть Простори beta", + "Join the beta": "Долучитися до бета-тестування", + "To join %(spaceName)s, turn on the Spaces beta": "Щоб приєднатися до %(spaceName)s, увімкніть Простори бета", "Spaces are a new way to group rooms and people.": "Простори — це новий спосіб згуртувати кімнати та людей.", "Communities are changing to Spaces": "Спільноти змінюються на Простори", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Створіть спільноту, щоб об’єднати користувачів та кімнати! Створіть власну домашню сторінку, щоб позначити своє місце у всесвіті Matrix.", @@ -1956,5 +1956,363 @@ "Start sharing your screen": "Почати показ екрана", "Start the camera": "Запустити камеру", "Scan this unique code": "Скануйте цей унікальний код", - "Verify this session by completing one of the following:": "Підтвердьте цей сеанс одним із запропонованих способів:" + "Verify this session by completing one of the following:": "Підтвердьте цей сеанс одним із запропонованих способів:", + "Leave %(groupName)s?": "Вийти з %(groupName)s?", + "Leave Community": "Вийти зі спільноти", + "Add a User": "Додати користувача", + "Add a Room": "Додати кімнату", + "Couldn't load page": "Не вдалося завантажити сторінку", + "Phone (optional)": "Телефон (не обов'язково)", + "That phone number doesn't look quite right, please check and try again": "Цей номер телефону не правильний. Перевірте та повторіть спробу", + "Enter phone number": "Введіть телефонний номер", + "Enter email address": "Введіть адресу е-пошти", + "Enter username": "Введіть ім'я користувача", + "Keep going...": "Продовжуйте...", + "Password is allowed, but unsafe": "Пароль дозволений, але небезпечний", + "Nice, strong password!": "Хороший надійний пароль!", + "Enter password": "Введіть пароль", + "A confirmation email has been sent to %(emailAddress)s": "Електронний лист із підтвердженням надіслано на адресу %(emailAddress)s", + "Please review and accept the policies of this homeserver:": "Перегляньте та прийміть політику цього домашнього сервера:", + "Please review and accept all of the homeserver's policies": "Перегляньте та прийміть усі правила домашнього сервера", + "Confirm your identity by entering your account password below.": "Підтвердьте свою особу, ввівши внизу пароль до свого облікового запису.", + "Open the link in the email to continue registration.": "Відкрийте посилання в електронному листі, щоб продовжити реєстрацію.", + "A text message has been sent to %(msisdn)s": "Текстове повідомлення надіслано на %(msisdn)s", + "Code": "Код", + "Please enter the code it contains:": "Введіть отриманий код:", + "Token incorrect": "Хибний токен", + "Country Dropdown": "Спадний список країн", + "User Status": "Статус користувача", + "Avatar": "Аватар", + "Tap for more info": "Торкніться, щоб переглянути подробиці", + "Move right": "Посунути праворуч", + "Move left": "Посунути ліворуч", + "Revoke permissions": "Відкликати дозвіл", + "Remove for everyone": "Прибрати для всіх", + "Delete widget": "Видалити розширення", + "Delete Widget": "Видалити розширення", + "View Community": "Переглянути спільноту", + "Move down": "Опустити", + "Move up": "Підняти", + "Set a new status...": "Установлення нового статусу...", + "Set status": "Налаштувати статус", + "Update status": "Оновити статус", + "Clear status": "Очистити статус", + "Manage & explore rooms": "Керування і перегляд кімнат", + "Add space": "Додати простір", + "Collapse reply thread": "Згорнути відповіді", + "Adding...": "Додавання...", + "Public space": "Загальнодоступний простір", + "Private space (invite only)": "Приватний простір (лише за запрошенням)", + "Space visibility": "Видимість простору", + "Space created": "Простір створено", + "Create Room": "Створити кімнату", + "Visible to space members": "Видима для учасників простору", + "Public room": "Загальнодоступна кімната", + "Private room (invite only)": "Приватна кімната (лише за запрошенням)", + "Room visibility": "Видимість кімнати", + "Topic (optional)": "Тема (не обов'язково)", + "Create a private room": "Створити приватну кімнату", + "Create a public room": "Створити загальнодоступну кімнату", + "Create a room in %(communityName)s": "Створити кімнату в %(communityName)s", + "Create a room": "Створити кімнату", + "Everyone in will be able to find and join this room.": "Усі в зможуть знайти та приєднатися до цієї кімнати.", + "Please enter a name for the room": "Введіть назву кімнати", + "example": "приклад", + "Community ID": "ID спільноти", + "Example": "Приклад", + "Community Name": "Назва спільноти", + "Create Community": "Створити спільноту", + "Something went wrong whilst creating your community": "Під час створення вашої спільноти щось пішло не так", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "ID спільноти повинне містити лише символи a-z, 0-9, або «=_-./»", + "Community IDs cannot be empty.": "ID спільноти не може бути порожнім.", + "An image will help people identify your community.": "Зображення допоможе людям ідентифікувати вашу спільноту.", + "Reason (optional)": "Причина (не обов'язково)", + "Add image (optional)": "Додати зображення (не обов'язково)", + "Enter name": "Ввести назву", + "What's the name of your community or team?": "Як називається ваша спільнота чи команда?", + "You can change this later if needed.": "За потреби, це можна змінити пізніше.", + "Use this when referencing your community to others. The community ID cannot be changed.": "Використовуйте його, коли ділитесь своєю спільнотою з іншими. ID спільноти змінити неможливо.", + "Community ID: +:%(domain)s": "ID спільноти: +:%(domain)s", + "Clear all data": "Очистити всі дані", + "Clear all data in this session?": "Очистити всі дані сеансу?", + "Confirm Removal": "Підтвердити вилучення", + "Removing…": "Вилучення…", + "Invite people to join %(communityName)s": "Запросити людей приєднатися до %(communityName)s", + "Send %(count)s invites|one": "Надіслати %(count)s запрошення", + "Send %(count)s invites|other": "Надіслати %(count)s запрошень", + "Show": "Показати", + "Hide": "Сховати", + "People you know on %(brand)s": "Люди, котрих ви знаєте у %(brand)s", + "Add another email": "Додати іншу адресу е-пошти", + "Notes": "Примітки", + "GitHub issue": "Обговорення на GitHub", + "Close dialog": "Закрити діалогове вікно", + "Invite anyway": "Усе одно запросити", + "Invite anyway and never warn me again": "Усе одно запросити й більше не попереджати", + "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Неможливо знайти профілі для Matrix ID, перерахованих унизу — все одно бажаєте запросити їх?", + "The following users may not exist": "Таких користувачів може не існувати", + "Try using one of the following valid address types: %(validTypesList)s.": "Спробуйте скористатися одним із таких допустимих типів адрес: %(validTypesList)s.", + "You have entered an invalid address.": "Ви ввели хибну адресу.", + "That doesn't look like a valid email address": "Це не схоже на правильну адресу е-пошти", + "email address": "адреса е-пошти", + "Adding spaces has moved.": "Додавання просторів переміщено.", + "Search for rooms": "Пошук кімнат", + "Create a new room": "Створити нову кімнату", + "Want to add a new room instead?": "Хочете додати нову кімнату натомість?", + "Add existing rooms": "Додати наявні кімнати", + "Space selection": "Вибір простору", + "Adding rooms... (%(progress)s out of %(count)s)|one": "Додавання кімнат...", + "Adding rooms... (%(progress)s out of %(count)s)|other": "Додавання кімнат... (%(progress)s з %(count)s)", + "Not all selected were added": "Не всі вибрані додано", + "Search for spaces": "Пошук просторів", + "Create a new space": "Створити новий простір", + "Want to add a new space instead?": "Хочете натомість цього додати новий простір?", + "Add existing space": "Додати наявний простір", + "Matrix rooms": "Кімнати Matrix", + "%(networkName)s rooms": "Кімнати %(networkName)s", + "Add a new server...": "Додати новий сервер...", + "Server name": "Назва сервера", + "Enter the name of a new server you want to explore.": "Введіть назву нового сервера, який ви хочете переглянути.", + "Add a new server": "Додати новий сервер", + "Matrix": "Matrix", + "Remove server": "Вилучити сервер", + "Are you sure you want to remove %(serverName)s": "Ви справді бажаєте вилучити %(serverName)s", + "Show preview": "Попередній перегляд", + "Resend %(unsentCount)s reaction(s)": "Повторно надіслати %(unsentCount)s реакцій", + "Your server": "Ваш сервер", + "You are not allowed to view this server's rooms list": "Вам не дозволено переглядати список кімнат цього сервера", + "Looks good": "Все добре", + "Enter a server name": "Введіть назву сервера", + "And %(count)s more...|other": "І ще %(count)s...", + "Sign in with single sign-on": "Увійти за допомогою єдиного входу", + "Continue with %(provider)s": "Продовжити з %(provider)s", + "Join millions for free on the largest public server": "Приєднуйтесь безплатно до мільйонів інших на найбільшому загальнодоступному сервері", + "Unable to reject invite": "Не вдалося відхилити запрошення", + "This address is already in use": "Ця адреса вже використовується", + "This address is available to use": "Ця адреса доступна", + "Please provide an address": "Будь ласка, вкажіть адресу", + "Some characters not allowed": "Деякі символи не дозволені", + "e.g. my-room": "наприклад, моя-кімната", + "Room address": "Адреса кімнати", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Не вдалося завантажити подію, на яку було надано відповідь, її або не існує, або у вас немає дозволу на її перегляд.", + "QR Code": "QR-код", + "Beta available for web, desktop and Android. Thank you for trying the beta.": "Бета-версія доступна для переглядачів, настільних ПК та Android. Дякуємо, що спробували бета-версію.", + "Spaces": "Простори", + "You can leave the beta any time from settings or tapping on a beta badge, like the one above.": "Ви можете будь-коли вийти з бета-версії в налаштуваннях або натиснувши значок бета-версії, як описано вгорі.", + "Custom level": "Власний рівень", + "Matrix ID": "Matrix ID", + "%(featureName)s beta feedback": "%(featureName)s відгук про бета-версію", + "To leave the beta, visit your settings.": "Щоб вийти з бета-тестування, перейдіть до налаштувань.", + "Spaces is a beta feature": "Простори — це бета-функція", + "Beta": "Бета", + "Leave the beta": "Вийти з бета-тестування", + "[number]": "[цифра]", + "Upload a file": "Вивантажити файл", + "New line": "Новий рядок", + "Ctrl": "Ctrl", + "Super": "Super", + "Shift": "Shift", + "Alt Gr": "Правий Alt", + "Alt": "Alt", + "Autocomplete": "Автозаповнення", + "Room List": "Перелік кімнат", + "Calls": "Виклики", + "Navigation": "Навігація", + "Disable": "Вимкнути", + "Import": "Імпорт", + "File to import": "Файл для імпорту", + "Your Security Key": "Ваш ключ безпеки", + "User Autocomplete": "Автозаповнення користувача", + "Users": "Користувачі", + "Space Autocomplete": "Автозаповнення простору", + "Room Autocomplete": "Автозаповнення кімнати", + "Notification Autocomplete": "Автозаповнення сповіщення", + "Room Notification": "Сповіщення кімнати", + "Notify the whole room": "Сповістити всю кімнату", + "Community Autocomplete": "Автозаповнення спільноти", + "Command Autocomplete": "Команда автозаповнення", + "Commands": "Команди", + "Your new session is now verified. Other users will see it as trusted.": "Тепер ваша новий сеанс тепер підтверджено. Інші користувачі побачать її довіреною.", + "Registration Successful": "Реєстрацію успішно виконано", + "You can now close this window or log in to your new account.": "Тепер можете закрити це вікно або увійти до свого нового облікового запису.", + "Log in to your new account.": "Увійти до нового облікового запису.", + "Continue with previous account": "Продовжити з попереднім обліковим записом", + "Set a new password": "Установити новий пароль", + "Return to login screen": "Повернутися на сторінку входу", + "Send Reset Email": "Надіслати електронного листа скидання пароля", + "Session verified": "Сеанс підтверджено", + "User settings": "Користувацькі налаштування", + "Community settings": "Налаштування спільноти", + "Switch theme": "Змінити тему", + "Inviting...": "Запрошення...", + "Just me": "Лише я", + "Make sure the right people have access to %(name)s": "Переконайтеся, що потрібні люди мають доступ до %(name)s", + "Who are you working with?": "З ким ви працюєте?", + "Go to my space": "Перейти до мого простору", + "Go to my first room": "Перейти до моєї першої кімнати", + "It's just you at the moment, it will be even better with others.": "Зараз це лише для вас, якщо додати ще когось буде цікавіше.", + "Search for rooms or spaces": "Пошук кімнат або просторів", + "What do you want to organise?": "Що б ви хотіли організувати?", + "Creating rooms...": "Створення кімнат...", + "Skip for now": "Пропустити зараз", + "Failed to create initial space rooms": "Не вдалося створити початкові кімнати простору", + "Room name": "Назва кімнати", + "Support": "Підтримка", + "Random": "Випадковий", + "Welcome to ": "Вітаємо у ", + "Created from ": "Створено з ", + "To view %(spaceName)s, you need an invite": "Щоб приєднатися до %(spaceName)s, потрібне запрошення", + "To view %(spaceName)s, turn on the Spaces beta": "Щоб переглянути %(spaceName)s, увімкніть Простори бета", + " invites you": " запрошує вас", + "Private space": "Приватний простір", + "Search names and descriptions": "Шукати назви та описи", + "Rooms and spaces": "Кімнати й простори", + "Results": "Результати", + "You may want to try a different search or check for typos.": "Ви можете спробувати інший пошуковий запит або перевірити помилки.", + "No results found": "Нічого не знайдено", + "Your server does not support showing space hierarchies.": "Ваш сервер не підтримує показ ієрархій простору.", + "Mark as suggested": "Позначити рекомендованим", + "Mark as not suggested": "Позначити не рекомендованим", + "Removing...": "Вилучення...", + "Failed to remove some rooms. Try again later": "Не вдалося вилучити кілька кімнат. Повторіть спробу пізніше", + "Select a room below first": "Спочатку виберіть кімнату внизу", + "Suggested": "Пропоновано", + "This room is suggested as a good one to join": "Ця кімната пропонується як хороша для приєднання", + "You don't have permission": "Ви не маєте дозволу", + "Explore rooms in %(communityName)s": "Переглянути кімнати у %(communityName)s", + "No results for \"%(query)s\"": "За запитом «%(query)s» нічого не знайдено", + "View": "Перегляд", + "Preview": "Попередній перегляд", + "Filter all spaces": "Фільтрувати всі простори", + "You can select all or individual messages to retry or delete": "Ви можете вибрати всі або окремі повідомлення, щоб повторити спробу або видалити", + "Retry all": "Повторити надсилання всіх", + "Delete all": "Видалити всі", + "Some of your messages have not been sent": "Деякі з ваших повідомлень не надіслано", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Цей сеанс не створює резервну копію ваших ключів, але у вас є резервна копія, з якої ви можете їх відновити.", + "Your keys are not being backed up from this session.": "Резервна копія ваших ключів не створюється з цього сеансу.", + "Back up your keys before signing out to avoid losing them.": "Створіть резервну копію ключів перед виходом, щоб не втратити їх.", + "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 Security Key.": "Резервне копіювання ключів шифрування з даними вашого облікового запису на випадок втрати доступу до сеансів. Ваші ключі будуть захищені унікальним ключем безпеки.", + "Backup key stored:": "Резервну копію ключа розміщено:", + "Backup key cached:": "Резервну копію ключа кешовано:", + "This session is backing up your keys. ": "Цей сеанс створює резервну копію ваших ключів. ", + "Unable to load key backup status": "Не вдалося завантажити стан резервного копіювання ключа", + "The operation could not be completed": "Неможливо завершити операцію", + "Failed to save your profile": "Не вдалося зберегти ваш профіль", + "There was an error loading your notification settings.": "Сталася помилка під час завантаження налаштувань сповіщень.", + "Mentions & keywords": "Згадки та ключові слова", + "Global": "Глобально", + "New keyword": "Нове ключове слово", + "Keyword": "Ключове слово", + "Enable email notifications for %(email)s": "Увімкнути сповіщення е-поштою для %(email)s", + "Enable for this account": "Увімкнути для цього облікового запису", + "An error occurred whilst saving your notification preferences.": "Сталася помилка під час збереження налаштувань сповіщень.", + "Error saving notification preferences": "Помилка збереження налаштувань сповіщень", + "Messages containing keywords": "Повідомлення, що містять ключові слова", + "Message bubbles": "Бульбашки повідомлень", + "Modern": "Сучасний", + "IRC": "IRC", + "Message layout": "Макет повідомлення", + "This upgrade will allow members of selected spaces access to this room without an invite.": "Це оновлення дозволить учасникам обраних просторів доступитися до цієї кімнати без запрошення.", + "Space members": "Учасники простору", + "Anyone in a space can find and join. You can select multiple spaces.": "Будь-хто у просторі може знайти та приєднатися. Можна вибрати кілька просторів.", + "Anyone in can find and join. You can select other spaces too.": "Будь-хто у може знайти та приєднатися. Ви можете вибрати інші простори.", + "Spaces with access": "Простори з доступом", + "Anyone in a space can find and join. Edit which spaces can access here.": "Будь-хто у просторі може знайти та приєднатися. Укажіть, які простори можуть отримати доступ сюди.", + "Currently, %(count)s spaces have access|one": "На разі простір має доступ", + "contact the administrators of identity server ": "зв'язатися з адміністратором сервера ідентифікації ", + "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "перевірити плагіни переглядача на наявність будь-чого, що може заблокувати сервер ідентифікації (наприклад, Privacy Badger)", + "Disconnect from the identity server ?": "Від'єднатися від сервера ідентифікації ?", + "Disconnect identity server": "Від'єднатися від сервера ідентифікації", + "Disconnect from the identity server and connect to instead?": "Від'єднатися від сервера ідентифікації й натомість під'єднатися до ?", + "Change identity server": "Змінити сервер ідентифікації", + "Not a valid identity server (status code %(code)s)": "Хибний сервер ідентифікації (код статусу %(code)s)", + "Identity server URL must be HTTPS": "URL-адреса сервера ідентифікації повинна починатися з HTTPS", + "not ready": "не готове", + "ready": "готове", + "Secret storage:": "Таємне сховище:", + "Algorithm:": "Алгоритм:", + "Backup version:": "Версія резервної копії:", + "Currently, %(count)s spaces have access|other": "На разі доступ мають %(count)s просторів", + "& %(count)s more|one": "і ще %(count)s", + "& %(count)s more|other": "і ще %(count)s", + "Upgrade required": "Потрібне оновлення", + "Anyone can find and join.": "Будь-хто може знайти та приєднатися.", + "Only invited people can join.": "Приєднатися можуть лише запрошені люди.", + "Private (invite only)": "Приватно (лише за запрошенням)", + "Message search initialisation failed": "Не вдалося ініціалізувати пошук повідомлень", + "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Безпечно кешуйте зашифровані повідомлення локально, щоб вони з'являлися в результатах пошуку, використовуючи %(size)s для зберігання повідомлень з %(rooms)s кімнат.", + "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "Безпечно кешуйте зашифровані повідомлення локально, щоб вони з'являлися в результатах пошуку, використовуючи %(size)s для зберігання повідомлень з %(rooms)s кімнат.", + "Confirm deleting these sessions": "Підтвердити видалення цих сеансів", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Підтвердити видалення цього сеансу скориставшись єдиним входом, щоб підтвердити свою особу.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Підтвердити видалення цих сеансів скориставшись єдиним входом, щоб підтвердити свою особу.", + "Unable to load session list": "Неможливо завантажити список сеансів", + "Your homeserver does not support session management.": "Ваш домашній сервер не підтримує керування сеансами.", + "Homeserver feature support:": "Підтримка функції домашнім сервером:", + "User signing private key:": "Приватний ключ підпису користувача:", + "Self signing private key:": "Самопідписаний приватний ключ:", + "not found locally": "не знайдено локально", + "cached locally": "кешовано локально", + "Master private key:": "Головний приватний ключ:", + "not found in storage": "не знайдено у сховищі", + "in secret storage": "у таємному сховищі", + "Reset": "Скинути", + "Cross-signing is not set up.": "Перехресне підписування не налаштовано.", + "Cross-signing is ready but keys are not backed up.": "Перехресне підписування готове, але резервна копія ключів не створюється.", + "Cross-signing is ready for use.": "Перехресне підписування готове до користування.", + "Passwords don't match": "Паролі відрізняються", + "Channel: ": "Канал: ", + "Workspace: ": "Робочий простір: ", + "Space options": "Параметри простору", + "Collapse": "Згорнути", + "Expand": "Розгорнути", + "Recommended for public spaces.": "Рекомендовано для загальнодоступних просторів.", + "Allow people to preview your space before they join.": "Дозвольте людям переглядати ваш простір, перш ніж вони приєднаються.", + "Preview Space": "Попередній перегляд простору", + "Failed to update the visibility of this space": "Не вдалось оновити видимість цього простору", + "Decide who can view and join %(spaceName)s.": "Визначте хто може переглядати та приєднатися до %(spaceName)s.", + "Visibility": "Видимість", + "This may be useful for public spaces.": "Це може бути корисним для загальнодоступних просторів.", + "Guests can join a space without having an account.": "Гості можуть приєднатися до простору без облікового запису.", + "Enable guest access": "Увімкнути гостьовий доступ", + "Hide advanced": "Сховати розширені", + "Failed to update the history visibility of this space": "Не вдалося оновити видимість історії цього простору", + "Failed to update the guest access of this space": "Не вдалося оновити гостьовий доступ до цього простору", + "Leave Space": "Вийти з простору", + "Save Changes": "Зберегти зміни", + "Saving...": "Збереження...", + "Edit settings relating to your space.": "Змінити налаштування, що стосуються вашого простору.", + "Failed to save space settings.": "Не вдалося зберегти налаштування простору.", + "Invite with email or username": "Запросити за допомогою е-пошти або імені користувача", + "Copied!": "Скопійовано!", + "Click to copy": "Клацніть, щоб скопіювати", + "Collapse space panel": "Згорнути панель простору", + "Expand space panel": "Розгорнути панель простору", + "All rooms": "Усі кімнати", + "Show all rooms": "Показати всі кімнати", + "Create": "Створити", + "Creating...": "Створення...", + "You can change these anytime.": "Ви можете змінити це будь-коли.", + "Add some details to help people recognise it.": "Додайте якісь подробиці, щоб допомогти людям дізнатися про нього.", + "Your private space": "Ваш приватний простір", + "Your public space": "Ваш загальнодоступний простір", + "Go back": "Назад", + "To join an existing space you'll need an invite.": "Щоб приєднатися до наявного простору, вам знадобиться запрошення.", + "You can also create a Space from a community.": "Ви також можете створити простір зі спільноти.", + "Invite only, best for yourself or teams": "Лише за запрошенням, найкраще для себе чи для команди", + "Private": "Приватний", + "Open space for anyone, best for communities": "Відкритий простір для будь-кого, найкраще для спільнот", + "Public": "Загальнодоступний", + "You can change this later.": "Ви можете змінити це пізніше.", + "What kind of Space do you want to create?": "Який простір ви хочете створити?", + "Create a space": "Створити простір", + "Address": "Адреса", + "e.g. my-space": "наприклад, мій-простір", + "Spaces feedback": "Відгук про простори", + "Spaces are a new feature.": "Простори — це нова функція.", + "Please enter a name for the space": "Будь ласка, введіть назву простору", + "Description": "Опис", + "Name": "Назва", + "Delete": "Видалити", + "Delete avatar": "Видалити аватар", + "Your server isn't responding to some requests.": "Ваш сервер не відповідає на деякі запити." } From c0f87c0c050914edf724260dde42b76a7453d8f0 Mon Sep 17 00:00:00 2001 From: XoseM Date: Thu, 16 Sep 2021 05:18:58 +0000 Subject: [PATCH 113/256] Translated using Weblate (Galician) Currently translated at 100.0% (3163 of 3163 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index b351695462..c71e203416 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -3717,5 +3717,6 @@ "Change main address for the space": "Cambiar o enderezo principal do espazo", "Change space name": "Cambiar o nome do espazo", "Change space avatar": "Cambiar o avatar do espazo", - "Anyone in can find and join. You can select other spaces too.": "Calquera en pode atopar e unirse. Tamén podes elexir outros espazos." + "Anyone in can find and join. You can select other spaces too.": "Calquera en pode atopar e unirse. Tamén podes elexir outros espazos.", + "Message didn't send. Click for info.": "Non se enviou a mensaxe. Click para info." } From 3fda3ae9a0a7f208a581d0b67a1db1d5dd219da4 Mon Sep 17 00:00:00 2001 From: sr093906 Date: Thu, 16 Sep 2021 09:27:21 +0000 Subject: [PATCH 114/256] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3151 of 3151 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index f3d9ba5548..4e6f2da664 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -3610,5 +3610,6 @@ "Change main address for the space": "更改空间主地址", "Change space name": "更改空间名称", "Change space avatar": "更改空间头像", - "Message didn't send. Click for info.": "消息没有发送。点击查看信息。" + "Message didn't send. Click for info.": "消息没有发送。点击查看信息。", + "Message": "消息" } From 0319892cc60dc2280cb926c6426b396814687ac7 Mon Sep 17 00:00:00 2001 From: random Date: Thu, 16 Sep 2021 10:12:29 +0000 Subject: [PATCH 115/256] Translated using Weblate (Italian) Currently translated at 99.9% (3163 of 3164 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 | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 7a4d7c4958..9b4b324fd6 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -3717,5 +3717,19 @@ "Change main address for the space": "Cambia indirizzo principale dello spazio", "Change space name": "Cambia nome dello spazio", "Change space avatar": "Cambia avatar dello spazio", - "Message didn't send. Click for info.": "Il messaggio non è stato inviato. Clicca per informazioni." + "Message didn't send. Click for info.": "Il messaggio non è stato inviato. Clicca per informazioni.", + "To join this Space, hide communities in your preferences": "Per entrare in questo spazio, nascondi le comunità nelle preferenze", + "To join %(communityName)s, swap to communities in your preferences": "Per entrare in %(communityName)s, passa alle comunità nelle preferenze", + "To view %(communityName)s, swap to communities in your preferences": "Per vedere %(communityName)s, passa alle comunità nelle preferenze", + "To view this Space, hide communities in your preferences": "Per vedere questo spazio, nascondi le comunità nelle preferenze", + "Private community": "Comunità privata", + "Public community": "Comunità pubblica", + "Message": "Messaggio", + "Upgrade anyway": "Aggiorna comunque", + "This room is in some spaces you’re not an admin of. In those spaces, the old room will still be shown, but people will be prompted to join the new one.": "Questa stanza è in alcuni spazi di cui non sei amministratore. In quegli spazi, la vecchia stanza verrà ancora mostrata, ma alla gente verrà chiesto di entrare in quella nuova.", + "Before you upgrade": "Prima di aggiornare", + "To join a space you'll need an invite.": "Per entrare in uno spazio ti serve un invito.", + "You can also make Spaces from communities.": "Puoi anche creare spazi dalle comunità.", + "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "Mostra temporaneamente le comunità invece degli spazi per questa sessione. Il supporto per questa azione verrà rimosso nel breve termine. Element verrà ricaricato.", + "Display Communities instead of Spaces": "Mostra le comunità invece degli spazi" } From 76fae6459bfdcdaf881fc726cd5635b2c8f15f69 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Thu, 16 Sep 2021 10:12:37 +0000 Subject: [PATCH 116/256] Translated using Weblate (Czech) Currently translated at 100.0% (3164 of 3164 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 | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 85ab63159c..d314a9ec2d 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -3636,5 +3636,19 @@ "Change space name": "Změnit název prostoru", "Change space avatar": "Změnit avatar prostoru", "Anyone in can find and join. You can select other spaces too.": "Kdokoli v může prostor najít a připojit se. Můžete vybrat i další prostory.", - "Message didn't send. Click for info.": "Zpráva se neodeslala. Klikněte pro informace." + "Message didn't send. Click for info.": "Zpráva se neodeslala. Klikněte pro informace.", + "To join this Space, hide communities in your preferences": "Pro připojení k tomuto prostoru, skryjte zobrazení skupin v předvolbách", + "To view this Space, hide communities in your preferences": "Pro zobrazení tohoto prostoru, skryjte zobrazení skupin v předvolbách", + "To join %(communityName)s, swap to communities in your preferences": "Pro připojení k %(communityName)s, přepněte na skupiny v předvolbách", + "To view %(communityName)s, swap to communities in your preferences": "Pro zobrazní %(communityName)s, přepněte na zobrazení skupin v předvolbách", + "Private community": "Soukromá skupina", + "Public community": "Veřejná skupina", + "Message": "Zpráva", + "Upgrade anyway": "I přesto aktualizovat", + "This room is in some spaces you’re not an admin of. In those spaces, the old room will still be shown, but people will be prompted to join the new one.": "Tato místnost se nachází v některých prostorech, jejichž nejste správcem. V těchto prostorech bude stará místnost stále zobrazena, ale lidé budou vyzváni, aby se připojili k nové místnosti.", + "Before you upgrade": "Než provedete aktualizaci", + "To join a space you'll need an invite.": "Pro připojení k prostoru potřebujete pozvánku.", + "You can also make Spaces from communities.": "Můžete také vytvořit prostory ze skupin.", + "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "Dočasně zobrazit skupiny místo prostorů pro tuto relaci. Podpora bude v blízké budoucnosti odstraněna. Toto provede přenačtení Elementu.", + "Display Communities instead of Spaces": "Zobrazit skupiny místo prostorů" } From a06f93602bbbbc0fdad6a027aae8dc9a0df4fd87 Mon Sep 17 00:00:00 2001 From: sr093906 Date: Thu, 16 Sep 2021 11:15:32 +0000 Subject: [PATCH 117/256] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3164 of 3164 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 4e6f2da664..521f315c3e 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -3611,5 +3611,18 @@ "Change space name": "更改空间名称", "Change space avatar": "更改空间头像", "Message didn't send. Click for info.": "消息没有发送。点击查看信息。", - "Message": "消息" + "Message": "消息", + "To join this Space, hide communities in your preferences": "要加入此空间,在你的首选项中隐藏社区", + "To view this Space, hide communities in your preferences": "要查看此空间,在你的首选项中隐藏社区", + "To join %(communityName)s, swap to communities in your preferences": "要加入 %(communityName)s,在首选项中滑动至社区", + "To view %(communityName)s, swap to communities in your preferences": "要查看 %(communityName)s,在首选项中滑动至社区", + "Private community": "私密社区", + "Public community": "公开社区", + "Upgrade anyway": "仍要升级", + "This room is in some spaces you’re not an admin of. In those spaces, the old room will still be shown, but people will be prompted to join the new one.": "此聊天室位于某些不是由你管理的空间中。在这些空间中,旧聊天室仍将被展示,但人们将被提示加入新聊天室。", + "Before you upgrade": "在你升级前", + "To join a space you'll need an invite.": "要加入一个空间,你需要一个邀请。", + "You can also make Spaces from communities.": "你也可以从 社区创造空间。", + "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "在此会话中暂时展示社区而空间。此功能将在不久的将来被移除。这将重新加载 Element。", + "Display Communities instead of Spaces": "展示社区而非空间" } From 4cac549e79e75dafb231ac3ddb93ff6fd849317b Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Thu, 16 Sep 2021 11:51:22 +0000 Subject: [PATCH 118/256] Translated using Weblate (Albanian) Currently translated at 99.7% (3156 of 3164 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 | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index a340932457..5c2b1830d9 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -3707,5 +3707,20 @@ "Change description": "Ndryshoni përshkrimin", "Change main address for the space": "Ndryshoni adresë kryesore për hapësirën", "Change space name": "Ndryshoni emër hapësire", - "Change space avatar": "Ndryshoni avatar hapësire" + "Change space avatar": "Ndryshoni avatar hapësire", + "To join this Space, hide communities in your preferences": "Që të hyni te kjo Hapësirë, fshihni bashkësitë te parapëlqimet tuaja", + "To view this Space, hide communities in your preferences": "Që të shihni këtë Hapësirë, fshihni bashkësitë te parapëlqimet tuaja", + "To join %(communityName)s, swap to communities in your preferences": "Që të hyni te %(communityName)s, kaloni te bashkësitë, që nga parapëlqimet tuaja", + "To view %(communityName)s, swap to communities in your preferences": "Që të shihni %(communityName)s, kaloni te bashkësitë, që nga parapëlqimet tuaja", + "Private community": "Bashkësi private", + "Public community": "Bashkësi publike", + "Message": "Mesazh", + "Message didn't send. Click for info.": "Mesazhi s’u dërgua. Klikoni për hollësi.", + "Upgrade anyway": "Përmirësoje, sido qoftë", + "This room is in some spaces you’re not an admin of. In those spaces, the old room will still be shown, but people will be prompted to join the new one.": "Kjo dhomë gjendet në disa hapësira për të cilat nuk jeni një nga përgjegjësit. Në këto hapësira, dhoma e vjetër prapë do të shfaqet, por njerëzve do t’u kërkohet të marrin pjesë te e reja.", + "Before you upgrade": "Para se të përmirësoni", + "To join a space you'll need an invite.": "Që të hyni në një hapësirë, do t’ju duhet një ftesë.", + "You can also make Spaces from communities.": "Mundeni edhe të krijoni Hapësira që nga bashkësitë.", + "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "Për këtë sesion shfaq përkohësisht bashkësi, në vend se Hapësira. Mbulimi i kësaj do të hiqet në të ardhmen e afërt. Kjo do të sjellë ringarkim të Element-it.", + "Display Communities instead of Spaces": "Shfaq Bashkësi, në vend se Hapësira" } From f4f40ce55837fa961a78ac6afaaba067b996e5d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 16 Sep 2021 21:00:43 +0200 Subject: [PATCH 119/256] Fix code to move end of range more simply and safely MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/BasicMessageComposer.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/views/rooms/BasicMessageComposer.tsx b/src/components/views/rooms/BasicMessageComposer.tsx index d83e2e964a..7afd39a5b1 100644 --- a/src/components/views/rooms/BasicMessageComposer.tsx +++ b/src/components/views/rooms/BasicMessageComposer.tsx @@ -182,15 +182,16 @@ export default class BasicMessageEditor extends React.Component if (data) { const { partCreator } = model; const moveStart = emoticonMatch[0][0] === " " ? 1 : 0; - const moveEnd = emoticonMatch[0].length - emoticonMatch.length - moveStart; // we need the range to only comprise of the emoticon // because we'll replace the whole range with an emoji, // so move the start forward to the start of the emoticon. // Take + 1 because index is reported without the possible preceding space. range.moveStartForwards(emoticonMatch.index + moveStart); - // and move end backwards so that we don't replace the trailing space/newline - range.moveEndBackwards(moveEnd); + // If the end is a trailing space/newline move end backwards, so that we don't replace it + if (["\n", " "].includes(emoticonMatch[0][emoticonMatch[0].length - 1])) { + range.moveEndBackwards(1); + } // this returns the amount of added/removed characters during the replace // so the caret position can be adjusted. From a5ee20febff716234ed058e816a6499480ba1fe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 16 Sep 2021 21:04:55 +0200 Subject: [PATCH 120/256] Simplifie code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/rooms/BasicMessageComposer.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/BasicMessageComposer.tsx b/src/components/views/rooms/BasicMessageComposer.tsx index 7afd39a5b1..edf4f515d2 100644 --- a/src/components/views/rooms/BasicMessageComposer.tsx +++ b/src/components/views/rooms/BasicMessageComposer.tsx @@ -181,7 +181,8 @@ export default class BasicMessageEditor extends React.Component if (data) { const { partCreator } = model; - const moveStart = emoticonMatch[0][0] === " " ? 1 : 0; + const firstMatch = emoticonMatch[0]; + const moveStart = firstMatch[0] === " " ? 1 : 0; // we need the range to only comprise of the emoticon // because we'll replace the whole range with an emoji, @@ -189,7 +190,7 @@ export default class BasicMessageEditor extends React.Component // Take + 1 because index is reported without the possible preceding space. range.moveStartForwards(emoticonMatch.index + moveStart); // If the end is a trailing space/newline move end backwards, so that we don't replace it - if (["\n", " "].includes(emoticonMatch[0][emoticonMatch[0].length - 1])) { + if (["\n", " "].includes(firstMatch[firstMatch.length - 1])) { range.moveEndBackwards(1); } From 0eb4193ba63a1ade793407cc440110554618c6f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 16 Sep 2021 20:26:59 +0000 Subject: [PATCH 121/256] Translated using Weblate (Estonian) Currently translated at 99.9% (3163 of 3164 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 | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 26905b70fe..e18418d9bd 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -3691,5 +3691,13 @@ "Change space name": "Muuda kogukonna nime", "Change space avatar": "Muuda kogukonna tunnuspilti", "Displaying time": "Aegade kuvamine", - "Message didn't send. Click for info.": "Sõnum jäi saatmata. Lisateabe saamiseks klõpsi." + "Message didn't send. Click for info.": "Sõnum jäi saatmata. Lisateabe saamiseks klõpsi.", + "To join this Space, hide communities in your preferences": "Selle uut tüüpi kogukonnakeskusega liitumiseks peida seadistustest vanad kogukonnad", + "To view this Space, hide communities in your preferences": "Selle uut tüüpi kogukonnakeskuse nägemiseks peida seadistustest vanad kogukonnad", + "To join %(communityName)s, swap to communities in your preferences": "Liitumaks %(communityName)s kogukonnaga võta seadistustes kasutusele vana tüüpi kogukonnad", + "To view %(communityName)s, swap to communities in your preferences": "Senise %(communityName)s kogukonna nägemiseks võta seadistustes kasutusele vana tüüpi kogukonnad", + "This room is in some spaces you’re not an admin of. In those spaces, the old room will still be shown, but people will be prompted to join the new one.": "See jututuba on mõne sellise kogukonnakeskuse osa, kus sul pole haldaja õigusi. Selliselt juhul vana jututuba jätkuvalt kuvatakse, kuid selle asutajatele pakutakse võimalust uuega liituda.", + "You can also make Spaces from communities.": "Sa võid ka vana kogukonna muuta uueks kogukonnakeskuseks.", + "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "Ajutiselt näita selles sessioonis uute kogukonnakeskuste asemel vanu kogukondi. Lähitulevikus selline funktsionaalsus kaob. Eeldab rakenduse taaskäivitamist.", + "Display Communities instead of Spaces": "Kuva uute kogukonnakeskuste asemel vanu kogukondi" } From 2b904f2d445f18ed8749e39dfdc64d933b2c8f65 Mon Sep 17 00:00:00 2001 From: t6nisalt Date: Thu, 16 Sep 2021 15:35:37 +0000 Subject: [PATCH 122/256] Translated using Weblate (Estonian) Currently translated at 99.9% (3163 of 3164 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 | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index e18418d9bd..0aef6d0277 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -3690,7 +3690,7 @@ "Change main address for the space": "Muuda kogukonna põhiaadressi", "Change space name": "Muuda kogukonna nime", "Change space avatar": "Muuda kogukonna tunnuspilti", - "Displaying time": "Aegade kuvamine", + "Displaying time": "Kuvamise aeg", "Message didn't send. Click for info.": "Sõnum jäi saatmata. Lisateabe saamiseks klõpsi.", "To join this Space, hide communities in your preferences": "Selle uut tüüpi kogukonnakeskusega liitumiseks peida seadistustest vanad kogukonnad", "To view this Space, hide communities in your preferences": "Selle uut tüüpi kogukonnakeskuse nägemiseks peida seadistustest vanad kogukonnad", @@ -3699,5 +3699,12 @@ "This room is in some spaces you’re not an admin of. In those spaces, the old room will still be shown, but people will be prompted to join the new one.": "See jututuba on mõne sellise kogukonnakeskuse osa, kus sul pole haldaja õigusi. Selliselt juhul vana jututuba jätkuvalt kuvatakse, kuid selle asutajatele pakutakse võimalust uuega liituda.", "You can also make Spaces from communities.": "Sa võid ka vana kogukonna muuta uueks kogukonnakeskuseks.", "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "Ajutiselt näita selles sessioonis uute kogukonnakeskuste asemel vanu kogukondi. Lähitulevikus selline funktsionaalsus kaob. Eeldab rakenduse taaskäivitamist.", - "Display Communities instead of Spaces": "Kuva uute kogukonnakeskuste asemel vanu kogukondi" + "Display Communities instead of Spaces": "Kuva uute kogukonnakeskuste asemel vanu kogukondi", + "[number]": "[number]", + "Private community": "Privaatne kogukond", + "Public community": "Avalik kogukond", + "Message": "Sõnum", + "Upgrade anyway": "Uuenda ikkagi", + "Before you upgrade": "Enne uuendamist", + "To join a space you'll need an invite.": "Kogukonnakeskusega liitumiseks vajad kutset." } From ff5972360836e72bf357fccc70b2da7474b86b43 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Fri, 17 Sep 2021 06:27:17 +0000 Subject: [PATCH 123/256] Translated using Weblate (Hungarian) Currently translated at 100.0% (3164 of 3164 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 | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index c9c4e17b06..ac58d402ba 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -3712,5 +3712,19 @@ "Change space name": "Tér nevének megváltoztatása", "Change space avatar": "Tér profilkép megváltoztatása", "Anyone in can find and join. You can select other spaces too.": " téren bárki megtalálhatja és beléphet. Kiválaszthat más tereket is.", - "Message didn't send. Click for info.": "Az üzenet nincs elküldve. Kattintson az információkért." + "Message didn't send. Click for info.": "Az üzenet nincs elküldve. Kattintson az információkért.", + "To join %(communityName)s, swap to communities in your preferences": "%(communityName)s csatlakozáshoz álljon át közösségekre a beállításokban", + "To view %(communityName)s, swap to communities in your preferences": "%(communityName)s megjelenítéséhez álljon át közösségekre a beállításokban", + "This room is in some spaces you’re not an admin of. In those spaces, the old room will still be shown, but people will be prompted to join the new one.": "Ez a szoba olyan terekben is benne van amiben ön nem adminisztrátor. Ezekben a terekben a régi szoba jelenik meg és az emberek kapnak egy jelzést, hogy lépjenek be az újba.", + "To join this Space, hide communities in your preferences": "A Térbe való belépéshez rejtse el a közösségeket a Beállításokban", + "To view this Space, hide communities in your preferences": "A Tér megjelenítéséhez rejtse el a közösségeket a Beállításokban", + "Private community": "Zárt közösség", + "Public community": "Nyilvános közösség", + "Message": "Üzenet", + "Upgrade anyway": "Mindenképpen frissít", + "Before you upgrade": "Mielőtt frissítene", + "To join a space you'll need an invite.": "A térre való belépéshez meghívóra van szükség.", + "You can also make Spaces from communities.": "Közösségből is lehet Tereket készíteni.", + "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "Közösségek megjelenítése átmenetileg a terek helyett ebben a munkamenetben. Ez a lehetőség később kivezetésre kerül. Az Element újratöltődik.", + "Display Communities instead of Spaces": "Terek helyett inkább a közösségek megjelenítése" } From f448c536a007393e7727ed6e8e99d42326a3fd8a Mon Sep 17 00:00:00 2001 From: jelv Date: Fri, 17 Sep 2021 08:05:45 +0000 Subject: [PATCH 124/256] Translated using Weblate (Dutch) Currently translated at 99.9% (3162 of 3164 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 | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index c8f3ae59ef..328f127bbf 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -3606,5 +3606,17 @@ "Change space name": "Ruimtenaam wijzigen", "Change space avatar": "Ruimte-afbeelding wijzigen", "Anyone in can find and join. You can select other spaces too.": "Iedereen in kan zoeken en deelnemen. U kunt ook andere ruimtes selecteren.", - "Message didn't send. Click for info.": "Bericht is niet verstuur. Klik voor meer info." + "Message didn't send. Click for info.": "Bericht is niet verstuur. Klik voor meer info.", + "To join %(communityName)s, swap to communities in your preferences": "Om aan %(communityName)s deel te nemen, wissel naar gemeenschappen in uw instellingen", + "To view %(communityName)s, swap to communities in your preferences": "Om %(communityName)s te bekijken, wissel naar gemeenschappen in uw instellingen", + "Private community": "Privégemeenschap", + "Public community": "Publieke gemeenschap", + "Message": "Bericht", + "Upgrade anyway": "Upgrade alsnog uitvoeren", + "This room is in some spaces you’re not an admin of. In those spaces, the old room will still be shown, but people will be prompted to join the new one.": "Deze kamer is in ruimtes waar u geen beheerder van bent. In deze ruimtes zal de oude kamer nog worden getoond, maar leden zullen een melding krijgen om deel te nemen aan de nieuwe kamer.", + "Before you upgrade": "Voordat u upgrade", + "To join a space you'll need an invite.": "Om te kunnen deelnemen aan een ruimte heeft u een uitnodiging nodig.", + "You can also make Spaces from communities.": "U kunt ook ruimtes maken van uw gemeenschappen.", + "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "Tijdelijk gemeenschappen tonen in plaats van ruimtes voor deze sessie. Ondersteuning zal worden verwijderd in de nabije toekomst. Dit zal Element herladen.", + "Display Communities instead of Spaces": "Gemeenschappen tonen ipv ruimtes" } From 286e78e0c8649b3c8541c019f6b644c4a1b45869 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Fri, 17 Sep 2021 01:27:12 +0000 Subject: [PATCH 125/256] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (3164 of 3164 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 | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 890e6cdb5e..4556a2d377 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -3721,5 +3721,19 @@ "Change space name": "變更空間名稱", "Change space avatar": "變更空間大頭照", "Anyone in can find and join. You can select other spaces too.": "在 中的任何人都可以找到並加入。您也可以選取其他空間。", - "Message didn't send. Click for info.": "訊息未傳送。點擊以取得更多資訊。" + "Message didn't send. Click for info.": "訊息未傳送。點擊以取得更多資訊。", + "To join this Space, hide communities in your preferences": "要加入此空間,請在您的偏好設定中隱藏社群", + "To view this Space, hide communities in your preferences": "要檢視此空間,請在您的偏好設定中隱藏社群", + "To join %(communityName)s, swap to communities in your preferences": "要加入 %(communityName)s,請在您的偏好設定中切換至社群", + "To view %(communityName)s, swap to communities in your preferences": "要檢視 %(communityName)s,請在您的偏好設定中切換至社群", + "Private community": "私人社群", + "Public community": "公開社群", + "Message": "訊息", + "Upgrade anyway": "無論如何都要升級", + "This room is in some spaces you’re not an admin of. In those spaces, the old room will still be shown, but people will be prompted to join the new one.": "此聊天室位於您不是管理員的空間。在那些空間中,舊的聊天室仍會顯示,但系統會提示人們加入新聊天室。", + "Before you upgrade": "在您升級前", + "To join a space you'll need an invite.": "若要加入空間,您必須被邀請。", + "You can also make Spaces from communities.": "您也可以從社群建立空間。", + "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "為此工作階段暫時顯示社群而非空間。對此功能的支援將在不久的將來移除。這將會重新載入 Element。", + "Display Communities instead of Spaces": "顯示社群而非空間" } From 9eb906a7237e07d162f9322f206108da1642337f Mon Sep 17 00:00:00 2001 From: Tirifto Date: Thu, 16 Sep 2021 16:49:43 +0000 Subject: [PATCH 126/256] Translated using Weblate (Esperanto) Currently translated at 98.0% (3103 of 3164 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 823384e306..dc698235e0 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -1318,7 +1318,7 @@ "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Vakigo de la memoro de via foliumilo eble korektos la problemon, sed adiaŭigos vin, kaj malebligos legadon de historio de ĉifritaj babiloj.", "Missing session data": "Mankas datumoj de salutaĵo", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Iuj datumoj de salutaĵo, inkluzive viajn ĉifrajn ŝlosilojn, mankas. Por tion korekti, resalutu, kaj rehavu la ŝlosilojn el savkopio.", - "Your browser likely removed this data when running low on disk space.": "Via foliumilo probable forigos ĉi tiujn datumojn kiam al ĝi mankos spaco sur disko.", + "Your browser likely removed this data when running low on disk space.": "Via foliumilo verŝajne forigos ĉi tiujn datumojn kiam al ĝi mankos spaco sur disko.", "Unable to restore backup": "Ne povas rehavi savkopion", "Failed to decrypt %(failedCount)s sessions!": "Malsukcesis malĉifri%(failedCount)s salutaĵojn!", "Warning: you should only set up key backup from a trusted computer.": "Averto: vi agordu ŝlosilan savkopion nur per fidata komputilo.", @@ -2395,7 +2395,7 @@ "Show message previews for reactions in all rooms": "Montri antaŭrigardojn al mesaĝoj ĉe reagoj en ĉiuj ĉambroj", "Your server isn't responding to some requests.": "Via servilo ne respondas al iuj petoj.", "Server isn't responding": "Servilo ne respondas", - "Your server isn't responding to some of your requests. Below are some of the most likely reasons.": "Via servilo ne respondas al iuj el viaj petoj. Vidu sube kelkon de la plej probablaj kialoj.", + "Your server isn't responding to some of your requests. Below are some of the most likely reasons.": "Via servilo ne respondas al iuj el viaj petoj. Vidu sube kelkon de la plej verŝajnaj kialoj.", "The server (%(serverName)s) took too long to respond.": "La servilo (%(serverName)s) tro longe ne respondis.", "Your firewall or anti-virus is blocking the request.": "Via fajroŝirmilo aŭ kontraŭvirusilo blokas la peton.", "A browser extension is preventing the request.": "Kromprogramo de la foliumilo malhelpas la peton.", @@ -3319,7 +3319,7 @@ "Verify other login": "Kontroli alian saluton", "Reset event store": "Restarigi deponejon de okazoj", "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": "Se vi tamen tion faras, sciu ke neniu el viaj mesaĝoj foriĝos, sed via sperto pri serĉado povas malboniĝi momente, dum la indekso estas refarata", - "You most likely do not want to reset your event index store": "Plej probable, vi ne volas restarigi vian deponejon de indeksoj de okazoj", + "You most likely do not want to reset your event index store": "Plej verŝajne, vi ne volas restarigi vian deponejon de indeksoj de okazoj", "Reset event store?": "Ĉu restarigi deponejon de okazoj?", "Currently joining %(count)s rooms|one": "Nun aliĝante al %(count)s ĉambro", "Currently joining %(count)s rooms|other": "Nun aliĝante al %(count)s ĉambroj", @@ -3604,5 +3604,6 @@ "You can change this later.": "Vi povas ŝanĝi ĉi tion poste.", "What kind of Space do you want to create?": "Kian aron volas vi krei?", "All rooms you're in will appear in Home.": "Ĉiuj ĉambroj, kie vi estas, aperos en la ĉefpaĝo.", - "Show all rooms in Home": "Montri ĉiujn ĉambrojn en ĉefpaĝo" + "Show all rooms in Home": "Montri ĉiujn ĉambrojn en ĉefpaĝo", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s fiksis mesaĝon al ĉi tiu ĉambro. Vidu ĉiujn fiksitajn mesaĝojn." } From ce66575808c3031a30419800e69faec5fd461fde Mon Sep 17 00:00:00 2001 From: XoseM Date: Fri, 17 Sep 2021 05:04:13 +0000 Subject: [PATCH 127/256] Translated using Weblate (Galician) Currently translated at 100.0% (3164 of 3164 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 | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index c71e203416..ff17a44493 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -3718,5 +3718,19 @@ "Change space name": "Cambiar o nome do espazo", "Change space avatar": "Cambiar o avatar do espazo", "Anyone in can find and join. You can select other spaces too.": "Calquera en pode atopar e unirse. Tamén podes elexir outros espazos.", - "Message didn't send. Click for info.": "Non se enviou a mensaxe. Click para info." + "Message didn't send. Click for info.": "Non se enviou a mensaxe. Click para info.", + "To join this Space, hide communities in your preferences": "Para unirte a este Espazo, oculta as comunidades nas túas preferencias", + "To view this Space, hide communities in your preferences": "Para ver este Espazo, oculta as comunidades nas túas preferencias", + "To join %(communityName)s, swap to communities in your preferences": "Para unirte a %(communityName)s, cambia a comunidades nas túas preferencias", + "To view %(communityName)s, swap to communities in your preferences": "Para ver %(communityName)s, cambia a comunidades nas túas preferencias", + "Private community": "Comunidade privada", + "Public community": "Comunidade pública", + "Message": "Mensaxe", + "Upgrade anyway": "Actualizar igualmente", + "This room is in some spaces you’re not an admin of. In those spaces, the old room will still be shown, but people will be prompted to join the new one.": "Esta sala está nalgúns espazos dos que non es admin. Nesos espazos, a antiga sala seguirá mostrándose, pero as persoas serán convidadas a unirse á nova.", + "Before you upgrade": "Antes de actualizar", + "To join a space you'll need an invite.": "Para unirte a un espazo precisas un convite.", + "You can also make Spaces from communities.": "Tamén podes crear Espazos a partir de comunidades.", + "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "De xeito temporal, mostrar comunidades no lugar de Espazos durante esta sesión. Esta función vai ser eliminada en próximas versións. Reiniciará Element.", + "Display Communities instead of Spaces": "Mostrar Comunidades no lugar de Espazos" } From 08dcd5b526144a832106bbb4139fe13d927f98bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Thu, 16 Sep 2021 20:27:41 +0000 Subject: [PATCH 128/256] Translated using Weblate (Estonian) Currently translated at 99.9% (3163 of 3164 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 0aef6d0277..172fbaa013 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -3690,7 +3690,7 @@ "Change main address for the space": "Muuda kogukonna põhiaadressi", "Change space name": "Muuda kogukonna nime", "Change space avatar": "Muuda kogukonna tunnuspilti", - "Displaying time": "Kuvamise aeg", + "Displaying time": "Aegade kuvamine", "Message didn't send. Click for info.": "Sõnum jäi saatmata. Lisateabe saamiseks klõpsi.", "To join this Space, hide communities in your preferences": "Selle uut tüüpi kogukonnakeskusega liitumiseks peida seadistustest vanad kogukonnad", "To view this Space, hide communities in your preferences": "Selle uut tüüpi kogukonnakeskuse nägemiseks peida seadistustest vanad kogukonnad", From 8c08293654f9ac6dac181d079b231d631f4e3b38 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 17 Sep 2021 11:36:22 +0100 Subject: [PATCH 129/256] Fix reactions aria-label not being a string and thus being read as [Object object] --- .../views/elements/MemberEventListSummary.tsx | 2 +- .../views/messages/ReactionsRowButton.tsx | 29 ++++++------------- src/i18n/strings/en_EN.json | 2 +- src/utils/FormattingUtils.ts | 29 +++++++++++++++---- 4 files changed, 34 insertions(+), 28 deletions(-) diff --git a/src/components/views/elements/MemberEventListSummary.tsx b/src/components/views/elements/MemberEventListSummary.tsx index 0722cb872a..4eb0177fef 100644 --- a/src/components/views/elements/MemberEventListSummary.tsx +++ b/src/components/views/elements/MemberEventListSummary.tsx @@ -135,7 +135,7 @@ export default class MemberEventListSummary extends React.Component { const desc = formatCommaSeparatedList(descs); - return _t('%(nameList)s %(transitionList)s', { nameList: nameList, transitionList: desc }); + return _t('%(nameList)s %(transitionList)s', { nameList, transitionList: desc }); }); if (!summaries) { diff --git a/src/components/views/messages/ReactionsRowButton.tsx b/src/components/views/messages/ReactionsRowButton.tsx index 7498a49173..8934b2b98f 100644 --- a/src/components/views/messages/ReactionsRowButton.tsx +++ b/src/components/views/messages/ReactionsRowButton.tsx @@ -106,31 +106,20 @@ export default class ReactionsRowButton extends React.PureComponent reacted with %(content)s", - { - content, - }, - { - reactors: () => { - return formatCommaSeparatedList(senders, 6); - }, - reactedWith: (sub) => { - if (!content) { - return null; - } - return sub; - }, - }, - ); } const isPeeking = room.getMyMembership() !== "join"; return reacted with %(content)s": " reacted with %(content)s", + "%(reactors)s reacted with %(content)s": "%(reactors)s reacted with %(content)s", "reacted with %(shortName)s": "reacted with %(shortName)s", "Message deleted": "Message deleted", "Message deleted by %(name)s": "Message deleted by %(name)s", diff --git a/src/utils/FormattingUtils.ts b/src/utils/FormattingUtils.ts index b527ee7ea2..265deaed38 100644 --- a/src/utils/FormattingUtils.ts +++ b/src/utils/FormattingUtils.ts @@ -104,7 +104,10 @@ export function getUserNameColorClass(userId: string): string { * @returns {string} a string constructed by joining `items` with a comma * between each item, but with the last item appended as " and [lastItem]". */ -export function formatCommaSeparatedList(items: Array, itemLimit?: number): string | JSX.Element { +export function formatCommaSeparatedList(items: string[], itemLimit?: number): string; +export function formatCommaSeparatedList(items: JSX.Element[], itemLimit?: number): JSX.Element; +export function formatCommaSeparatedList(items: Array, itemLimit?: number): JSX.Element | string; +export function formatCommaSeparatedList(items: Array, itemLimit?: number): JSX.Element | string { const remaining = itemLimit === undefined ? 0 : Math.max( items.length - itemLimit, 0, ); @@ -112,11 +115,25 @@ export function formatCommaSeparatedList(items: Array, ite return ""; } else if (items.length === 1) { return items[0]; - } else if (remaining > 0) { - items = items.slice(0, itemLimit); - return _t("%(items)s and %(count)s others", { items: jsxJoin(items, ', '), count: remaining } ); } else { - const lastItem = items.pop(); - return _t("%(items)s and %(lastItem)s", { items: jsxJoin(items, ', '), lastItem: lastItem }); + let lastItem; + if (remaining > 0) { + items = items.slice(0, itemLimit); + } else { + lastItem = items.pop(); + } + + let joinedItems; + if (items.every(e => typeof e === "string")) { + joinedItems = items.join(", "); + } else { + joinedItems = jsxJoin(items, ", "); + } + + if (remaining > 0) { + return _t("%(items)s and %(count)s others", { items: joinedItems, count: remaining } ); + } else { + return _t("%(items)s and %(lastItem)s", { items: joinedItems, lastItem }); + } } } From 4b8cf94d4c8903c312c874e73b95bc70808cd7ea Mon Sep 17 00:00:00 2001 From: jelv Date: Fri, 17 Sep 2021 09:55:06 +0000 Subject: [PATCH 130/256] Translated using Weblate (Dutch) Currently translated at 100.0% (3165 of 3165 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 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 328f127bbf..cebd12a856 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -3618,5 +3618,8 @@ "To join a space you'll need an invite.": "Om te kunnen deelnemen aan een ruimte heeft u een uitnodiging nodig.", "You can also make Spaces from communities.": "U kunt ook ruimtes maken van uw gemeenschappen.", "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "Tijdelijk gemeenschappen tonen in plaats van ruimtes voor deze sessie. Ondersteuning zal worden verwijderd in de nabije toekomst. Dit zal Element herladen.", - "Display Communities instead of Spaces": "Gemeenschappen tonen ipv ruimtes" + "Display Communities instead of Spaces": "Gemeenschappen tonen ipv ruimtes", + "Joining space …": "Deelnemen aan ruimte…", + "To join this Space, hide communities in your preferences": "Om deel te nemen aan de ruimte, verberg gemeenschappen in uw instellingen", + "To view this Space, hide communities in your preferences": "Om deze ruimte te bekijken, verberg gemeenschappen in uw instellingen" } From e2ac753bc70958436e8cbff331b6cc5cf47ea282 Mon Sep 17 00:00:00 2001 From: sr093906 Date: Fri, 17 Sep 2021 09:46:48 +0000 Subject: [PATCH 131/256] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3165 of 3165 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 521f315c3e..92190156aa 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -3624,5 +3624,6 @@ "To join a space you'll need an invite.": "要加入一个空间,你需要一个邀请。", "You can also make Spaces from communities.": "你也可以从 社区创造空间。", "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "在此会话中暂时展示社区而空间。此功能将在不久的将来被移除。这将重新加载 Element。", - "Display Communities instead of Spaces": "展示社区而非空间" + "Display Communities instead of Spaces": "展示社区而非空间", + "Joining space …": "正在加入空间…" } From d35718ca5fdd45d64b2c85d19d98bc1ae613f1c3 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Fri, 17 Sep 2021 10:13:45 +0000 Subject: [PATCH 132/256] Translated using Weblate (Czech) Currently translated at 100.0% (3165 of 3165 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index d314a9ec2d..3d1fcebc89 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -3650,5 +3650,6 @@ "To join a space you'll need an invite.": "Pro připojení k prostoru potřebujete pozvánku.", "You can also make Spaces from communities.": "Můžete také vytvořit prostory ze skupin.", "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "Dočasně zobrazit skupiny místo prostorů pro tuto relaci. Podpora bude v blízké budoucnosti odstraněna. Toto provede přenačtení Elementu.", - "Display Communities instead of Spaces": "Zobrazit skupiny místo prostorů" + "Display Communities instead of Spaces": "Zobrazit skupiny místo prostorů", + "Joining space …": "Připojování k prostoru…" } From cd236e96103a5cf4e9fb618592cd137940b27fef Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Fri, 17 Sep 2021 10:24:35 +0000 Subject: [PATCH 133/256] Translated using Weblate (Albanian) Currently translated at 99.7% (3157 of 3165 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 5c2b1830d9..48f9d880a4 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -3722,5 +3722,6 @@ "To join a space you'll need an invite.": "Që të hyni në një hapësirë, do t’ju duhet një ftesë.", "You can also make Spaces from communities.": "Mundeni edhe të krijoni Hapësira që nga bashkësitë.", "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "Për këtë sesion shfaq përkohësisht bashkësi, në vend se Hapësira. Mbulimi i kësaj do të hiqet në të ardhmen e afërt. Kjo do të sjellë ringarkim të Element-it.", - "Display Communities instead of Spaces": "Shfaq Bashkësi, në vend se Hapësira" + "Display Communities instead of Spaces": "Shfaq Bashkësi, në vend se Hapësira", + "Joining space …": "Po hyhet në hapësirë…" } From 5f4d06eba2f82c4d755d50cdd390c250b95dc2d3 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Fri, 17 Sep 2021 14:27:04 +0000 Subject: [PATCH 134/256] Translated using Weblate (Hungarian) Currently translated at 100.0% (3165 of 3165 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index ac58d402ba..d5cd904767 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -3726,5 +3726,7 @@ "To join a space you'll need an invite.": "A térre való belépéshez meghívóra van szükség.", "You can also make Spaces from communities.": "Közösségből is lehet Tereket készíteni.", "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "Közösségek megjelenítése átmenetileg a terek helyett ebben a munkamenetben. Ez a lehetőség később kivezetésre kerül. Az Element újratöltődik.", - "Display Communities instead of Spaces": "Terek helyett inkább a közösségek megjelenítése" + "Display Communities instead of Spaces": "Terek helyett inkább a közösségek megjelenítése", + "%(reactors)s reacted with %(content)s": "%(reactors)s reagált: %(content)s", + "Joining space …": "Belépés a térbe…" } From 2750adf83cf147c5e6f027b55c026850a31fe095 Mon Sep 17 00:00:00 2001 From: jelv Date: Fri, 17 Sep 2021 11:47:53 +0000 Subject: [PATCH 135/256] Translated using Weblate (Dutch) Currently translated at 100.0% (3165 of 3165 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index cebd12a856..dd70fb0814 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -3621,5 +3621,6 @@ "Display Communities instead of Spaces": "Gemeenschappen tonen ipv ruimtes", "Joining space …": "Deelnemen aan ruimte…", "To join this Space, hide communities in your preferences": "Om deel te nemen aan de ruimte, verberg gemeenschappen in uw instellingen", - "To view this Space, hide communities in your preferences": "Om deze ruimte te bekijken, verberg gemeenschappen in uw instellingen" + "To view this Space, hide communities in your preferences": "Om deze ruimte te bekijken, verberg gemeenschappen in uw instellingen", + "%(reactors)s reacted with %(content)s": "%(reactors)s reageerde met %(content)s" } From db99381054c4c090eb2eb52ff5a026dbffa55fce Mon Sep 17 00:00:00 2001 From: Daimar Stein Date: Fri, 17 Sep 2021 16:39:31 +0000 Subject: [PATCH 136/256] Translated using Weblate (Portuguese (Brazil)) Currently translated at 90.2% (2856 of 3165 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 | 53 ++++++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index d5de4d2aac..1682a793ef 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -3244,5 +3244,56 @@ "%(senderName)s removed their display name (%(oldDisplayName)s)": "%(senderName)s removeu seu nome de exibição (%(oldDisplayName)s)", "%(senderName)s set their display name to %(displayName)s": "%(senderName)s definiu seu nome de exibição para %(displayName)s", "%(oldDisplayName)s changed their display name to %(displayName)s": "%(oldDisplayName)s mudou seu nome de exibição para %(displayName)s", - "You can leave the beta any time from settings or tapping on a beta badge, like the one above.": "Você pode sair do beta a qualquer momento nas configurações ou tocando em um emblema beta, como o mostrado acima." + "You can leave the beta any time from settings or tapping on a beta badge, like the one above.": "Você pode sair do beta a qualquer momento nas configurações ou tocando em um emblema beta, como o mostrado acima.", + "If a community isn't shown you may not have permission to convert it.": "Se uma comunidade não é exibida você pode não ter a permissão para convertê-la.", + "Show my Communities": "Mostre minhas Comunidades", + "Communities have been archived to make way for Spaces but you can convert your communities into Spaces below. Converting will ensure your conversations get the latest features.": "Comunidades foram arquivadas para abrir caminho para os Espaços, mas você pode converter suas comunidades em Espaços logo abaixo. Convertê-las garantirá que suas conversas tenhas as novidades mais recentes.", + "Create Space": "Criar um Espaço", + "Open Space": "Espaço Aberto", + "Your access token gives full access to your account. Do not share it with anyone.": "Seu token de acesso dá acesso total à sua conta. Não o compartilhe com ninguém.", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Se você informou um bug através do GitHub, os relatórios de erros podem nos ajudar a encontrar o problema. Os relatórios de erros contêm dados de uso do aplicativo, incluindo seu nome de usuário, os IDs ou apelidos das salas ou comunidades que você visitou e os nomes de usuários de seus contatos. Eles não contêm suas mensagens.", + "Olm version:": "Versão do Olm:", + "There was an error loading your notification settings.": "Um erro ocorreu ao carregar suas configurações de notificação.", + "Enable email notifications for %(email)s": "Habilita notificação por emails para %(email)s", + "An error occurred whilst saving your notification preferences.": "Um erro ocorreu enquanto suas preferências de notificação eram salvas.", + "Upgrade anyway": "Faça o upgrade mesmo assim", + "This room is in some spaces you’re not an admin of. In those spaces, the old room will still be shown, but people will be prompted to join the new one.": "Esta sala está em alguns espaços que você não é um administrador. Nestes espaços, a sala antiga ainda será exibida, mas as pessoas receberão um prompt para se juntarem a sala nova.", + "Anyone in a space can find and join. You can select multiple spaces.": "Qualquer um em um espaço pode encontrar e se juntar. Você pode selecionar múltiplos espaços.", + "Message search initialisation failed": "Falha na inicialização da pesquisa de mensagens", + "Allow people to preview your space before they join.": "Permite que pessoas vejam seu espaço antes de entrarem.", + "Failed to update the visibility of this space": "Falha ao atualizar a visibilidade deste espaço", + "Decide who can view and join %(spaceName)s.": "Decide quem pode ver e se juntar a %(spaceName)s.", + "Guests can join a space without having an account.": "Convidados podem se juntar a um espaço sem ter uma conta.", + "Failed to update the history visibility of this space": "Falha ao atualizar a visibilidade do histórico deste espaço", + "Failed to update the guest access of this space": "Falha ao atualizar o acesso de convidados a este espaço", + "Add some details to help people recognise it.": "Adicione alguns detalhes para ajudar as pessoas a reconhecê-lo.", + "To join a space you'll need an invite.": "Para se juntar a um espaço você precisará de um convite.", + "You can also make Spaces from communities.": "Você também pode criar Espaços a partir de comunidades.", + "Invite only, best for yourself or teams": "Somente convite, melhor para si mesmo(a) ou para equipes", + "You can change this later.": "Você pode mudar isso depois.", + "What kind of Space do you want to create?": "Que tipo de espaço você deseja criar?", + "Delete avatar": "Remover foto de perfil", + "Mute the microphone": "Silenciar o microfone", + "Unmute the microphone": "Desmutar o microfone", + "Dialpad": "Teclado de discagem", + "More": "Mais", + "Show sidebar": "Exibir a barra lateral", + "Hide sidebar": "Esconder a barra lateral", + "Start sharing your screen": "Começar a compartilhar sua tela", + "Stop sharing your screen": "Parar de compartilhar sua tela", + "Stop the camera": "Desligar a câmera", + "Start the camera": "Ativar a câmera", + "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "Temporariamente exibe comunidades ao invés de Espaços nesta sessão. Suporte para isto será removido no futuro próximo. Isto recarregará o Element.", + "Display Communities instead of Spaces": "Exibe Comunidades ao invés de Espaços", + "Low bandwidth mode (requires compatible homeserver)": "Modo de internet lenta (requer um servidor compatível)", + "Autoplay videos": "Reproduzir vídeos automaticamente", + "Autoplay GIFs": "Reproduzir GIFs automaticamente", + "Don't send read receipts": "Não enviar confirmações de leitura", + "New layout switcher (with message bubbles)": "Novo gerenciador de layouts (com mensagens em bolhas)", + "Multiple integration managers (requires manual setup)": "Múltiplos gerenciadores de integração (requer configuração manual)", + "Threaded messaging": "Mensagens em fios", + "Report to moderators prototype. In rooms that support moderation, the `report` button will let you report abuse to room moderators": "Protótipo de reportar para os moderadores. Em salas que tem suporte a moderação, o botão `reportar` lhe permitirá reportar abuso para os moderadores da sala", + "This makes it easy for rooms to stay private to a space, while letting people in the space find and join them. All new rooms in a space will have this option available.": "Isto facilita com que salas se mantenham privadas em um espaço, enquanto permitem que pessoas que se juntem ao espaço as encontrem e entrem. Todas as salas novas em um espaço terão esta opção disponível.", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s fixou uma mensagem nesta sala. Veja todas as mensagens fixadas.", + "%(senderName)s pinned a message to this room. See all pinned messages.": "%(senderName)s fixou uma mensagens nesta sala. Veja todas as mensagens fixadas." } From 06fb93ad4c3b2f328f5d8985a3cb3e659bb71112 Mon Sep 17 00:00:00 2001 From: sr093906 Date: Fri, 17 Sep 2021 11:52:14 +0000 Subject: [PATCH 137/256] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (3165 of 3165 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 92190156aa..a68e9092a5 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -3625,5 +3625,6 @@ "You can also make Spaces from communities.": "你也可以从 社区创造空间。", "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "在此会话中暂时展示社区而空间。此功能将在不久的将来被移除。这将重新加载 Element。", "Display Communities instead of Spaces": "展示社区而非空间", - "Joining space …": "正在加入空间…" + "Joining space …": "正在加入空间…", + "%(reactors)s reacted with %(content)s": "%(reactors)s 人回应了 %(content)s" } From 1d4b071df4c8a95e483e7847efd7abfa2041aa5a Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Fri, 17 Sep 2021 15:55:36 +0000 Subject: [PATCH 138/256] Translated using Weblate (Czech) Currently translated at 100.0% (3165 of 3165 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 3d1fcebc89..bffe3b1860 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -3651,5 +3651,6 @@ "You can also make Spaces from communities.": "Můžete také vytvořit prostory ze skupin.", "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "Dočasně zobrazit skupiny místo prostorů pro tuto relaci. Podpora bude v blízké budoucnosti odstraněna. Toto provede přenačtení Elementu.", "Display Communities instead of Spaces": "Zobrazit skupiny místo prostorů", - "Joining space …": "Připojování k prostoru…" + "Joining space …": "Připojování k prostoru…", + "%(reactors)s reacted with %(content)s": "%(reactors)s reagoval(a) na %(content)s" } From db2ead395d422e4930bab684ffe233ef11867bb8 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Fri, 17 Sep 2021 12:13:26 +0000 Subject: [PATCH 139/256] Translated using Weblate (Albanian) Currently translated at 99.7% (3157 of 3165 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 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 48f9d880a4..6e14066513 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -3723,5 +3723,6 @@ "You can also make Spaces from communities.": "Mundeni edhe të krijoni Hapësira që nga bashkësitë.", "Temporarily show communities instead of Spaces for this session. Support for this will be removed in the near future. This will reload Element.": "Për këtë sesion shfaq përkohësisht bashkësi, në vend se Hapësira. Mbulimi i kësaj do të hiqet në të ardhmen e afërt. Kjo do të sjellë ringarkim të Element-it.", "Display Communities instead of Spaces": "Shfaq Bashkësi, në vend se Hapësira", - "Joining space …": "Po hyhet në hapësirë…" + "Joining space …": "Po hyhet në hapësirë…", + "%(reactors)s reacted with %(content)s": "%(reactors)s reagoi me %(content)s" } From fc210fe29777fac55ca48ad075e8b1e6a25005e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Fri, 17 Sep 2021 12:05:06 +0000 Subject: [PATCH 140/256] Translated using Weblate (Estonian) Currently translated at 99.9% (3164 of 3165 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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 172fbaa013..d2ebbc84ab 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -3706,5 +3706,7 @@ "Message": "Sõnum", "Upgrade anyway": "Uuenda ikkagi", "Before you upgrade": "Enne uuendamist", - "To join a space you'll need an invite.": "Kogukonnakeskusega liitumiseks vajad kutset." + "To join a space you'll need an invite.": "Kogukonnakeskusega liitumiseks vajad kutset.", + "%(reactors)s reacted with %(content)s": "%(reactors)s kasutajat reageeris järgnevalt: %(content)s", + "Joining space …": "Liitun kohukonnakeskusega…" } From 88cadd52a8d178ead74abd1ec9f8b6af6f4377a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 15 Sep 2021 19:54:43 +0200 Subject: [PATCH 141/256] Convert VerificationQRCode to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...ificationQRCode.js => VerificationQRCode.tsx} | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) rename src/components/views/elements/crypto/{VerificationQRCode.js => VerificationQRCode.tsx} (79%) diff --git a/src/components/views/elements/crypto/VerificationQRCode.js b/src/components/views/elements/crypto/VerificationQRCode.tsx similarity index 79% rename from src/components/views/elements/crypto/VerificationQRCode.js rename to src/components/views/elements/crypto/VerificationQRCode.tsx index 76cfb82d35..be9ede59b1 100644 --- a/src/components/views/elements/crypto/VerificationQRCode.js +++ b/src/components/views/elements/crypto/VerificationQRCode.tsx @@ -15,20 +15,20 @@ limitations under the License. */ import React from "react"; -import PropTypes from "prop-types"; import { replaceableComponent } from "../../../../utils/replaceableComponent"; import QRCode from "../QRCode"; +import { QRCodeData } from "matrix-js-sdk/src/crypto/verification/QRCode"; + +interface IProps { + qrCodeData: QRCodeData; +} @replaceableComponent("views.elements.crypto.VerificationQRCode") -export default class VerificationQRCode extends React.PureComponent { - static propTypes = { - qrCodeData: PropTypes.object.isRequired, - }; - - render() { +export default class VerificationQRCode extends React.PureComponent { + public render(): JSX.Element { return ( ); From 971d375a5c9fb664159870ef1907a2206acf94bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 15 Sep 2021 19:57:22 +0200 Subject: [PATCH 142/256] Convert AppWarning to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../elements/{AppWarning.js => AppWarning.tsx} | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) rename src/components/views/elements/{AppWarning.js => AppWarning.tsx} (60%) diff --git a/src/components/views/elements/AppWarning.js b/src/components/views/elements/AppWarning.tsx similarity index 60% rename from src/components/views/elements/AppWarning.js rename to src/components/views/elements/AppWarning.tsx index 517242dab5..bac486d4b8 100644 --- a/src/components/views/elements/AppWarning.js +++ b/src/components/views/elements/AppWarning.tsx @@ -1,24 +1,20 @@ -import React from 'react'; // eslint-disable-line no-unused-vars -import PropTypes from 'prop-types'; +import React from 'react'; -const AppWarning = (props) => { +interface IProps { + errorMsg?: string; +} + +const AppWarning: React.FC = (props) => { return (
- { props.errorMsg } + { props.errorMsg || "Error" }
); }; -AppWarning.propTypes = { - errorMsg: PropTypes.string, -}; -AppWarning.defaultProps = { - errorMsg: 'Error', -}; - export default AppWarning; From ea623e79bb79e61ca2305e198299cbb3cdba9f49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 15 Sep 2021 20:11:58 +0200 Subject: [PATCH 143/256] Convert DirectorySearchBox to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...orySearchBox.js => DirectorySearchBox.tsx} | 81 +++++++++---------- 1 file changed, 37 insertions(+), 44 deletions(-) rename src/components/views/elements/{DirectorySearchBox.js => DirectorySearchBox.tsx} (63%) diff --git a/src/components/views/elements/DirectorySearchBox.js b/src/components/views/elements/DirectorySearchBox.tsx similarity index 63% rename from src/components/views/elements/DirectorySearchBox.js rename to src/components/views/elements/DirectorySearchBox.tsx index 11b1ed2cd2..07407af622 100644 --- a/src/components/views/elements/DirectorySearchBox.js +++ b/src/components/views/elements/DirectorySearchBox.tsx @@ -14,71 +14,73 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React from 'react'; -import PropTypes from 'prop-types'; -import * as sdk from '../../../index'; +import React, { ChangeEvent, createRef } from 'react'; import { _t } from '../../../languageHandler'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import AccessibleButton from "./AccessibleButton"; + +interface IProps { + className?: string; + onChange?: (value: string) => void; + onClear?: () => void; + onJoinClick?: (value: string) => void; + placeholder?: string; + showJoinButton?: boolean; + initialText?: string; +} + +interface IState { + value: string; +} @replaceableComponent("views.elements.DirectorySearchBox") -export default class DirectorySearchBox extends React.Component { - constructor(props) { - super(props); - this._collectInput = this._collectInput.bind(this); - this._onClearClick = this._onClearClick.bind(this); - this._onChange = this._onChange.bind(this); - this._onKeyUp = this._onKeyUp.bind(this); - this._onJoinButtonClick = this._onJoinButtonClick.bind(this); +export default class DirectorySearchBox extends React.Component { + private input = createRef(); - this.input = null; + constructor(props: IProps) { + super(props); this.state = { value: this.props.initialText || '', }; } - _collectInput(e) { - this.input = e; - } - - _onClearClick() { + private onClearClick = (): void => { this.setState({ value: '' }); - if (this.input) { - this.input.focus(); + if (this.input.current) { + this.input.current.focus(); if (this.props.onClear) { this.props.onClear(); } } - } + }; - _onChange(ev) { - if (!this.input) return; + private onChange = (ev: ChangeEvent): void => { + if (!this.input.current) return; this.setState({ value: ev.target.value }); if (this.props.onChange) { this.props.onChange(ev.target.value); } - } + }; - _onKeyUp(ev) { + private onKeyUp = (ev: React.KeyboardEvent): void => { if (ev.key == 'Enter' && this.props.showJoinButton) { if (this.props.onJoinClick) { this.props.onJoinClick(this.state.value); } } - } + }; - _onJoinButtonClick() { + private onJoinButtonClick = (): void => { if (this.props.onJoinClick) { this.props.onJoinClick(this.state.value); } - } - - render() { - const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); + }; + public render(): JSX.Element { const searchboxClasses = { mx_DirectorySearchBox: true, }; @@ -87,7 +89,7 @@ export default class DirectorySearchBox extends React.Component { let joinButton; if (this.props.showJoinButton) { joinButton = { _t("Join") }; } @@ -97,24 +99,15 @@ export default class DirectorySearchBox extends React.Component { name="dirsearch" value={this.state.value} className="mx_textinput_icon mx_textinput_search" - ref={this._collectInput} - onChange={this._onChange} - onKeyUp={this._onKeyUp} + ref={this.input} + onChange={this.onChange} + onKeyUp={this.onKeyUp} placeholder={this.props.placeholder} autoFocus /> { joinButton } - +
; } } -DirectorySearchBox.propTypes = { - className: PropTypes.string, - onChange: PropTypes.func, - onClear: PropTypes.func, - onJoinClick: PropTypes.func, - placeholder: PropTypes.string, - showJoinButton: PropTypes.bool, - initialText: PropTypes.string, -}; From 17d2998ec1855611d5eed661482d47709ad59c4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 15 Sep 2021 20:22:09 +0200 Subject: [PATCH 144/256] Convert EditableTextContainer to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...Container.js => EditableTextContainer.tsx} | 121 +++++++++--------- 1 file changed, 60 insertions(+), 61 deletions(-) rename src/components/views/elements/{EditableTextContainer.js => EditableTextContainer.tsx} (65%) diff --git a/src/components/views/elements/EditableTextContainer.js b/src/components/views/elements/EditableTextContainer.tsx similarity index 65% rename from src/components/views/elements/EditableTextContainer.js rename to src/components/views/elements/EditableTextContainer.tsx index 5778446355..9610b188fb 100644 --- a/src/components/views/elements/EditableTextContainer.js +++ b/src/components/views/elements/EditableTextContainer.tsx @@ -15,9 +15,34 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; -import * as sdk from '../../../index'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import Spinner from "./Spinner"; +import EditableText from "./EditableText"; + +interface IProps { + /* callback to retrieve the initial value. */ + getInitialValue?: () => Promise; + + /* initial value; used if getInitialValue is not given */ + initialValue?: string; + + /* placeholder text to use when the value is empty (and not being + * edited) */ + placeholder?: string; + + /* callback to update the value. Called with a single argument: the new + * value. */ + onSubmit?: (value: string) => Promise<{} | void>; + + /* should the input submit when focus is lost? */ + blurToSubmit?: boolean; +} + +interface IState { + busy: boolean; + errorString: string; + value: string; +} /** * A component which wraps an EditableText, with a spinner while updates take @@ -31,50 +56,51 @@ import { replaceableComponent } from "../../../utils/replaceableComponent"; * taken from the 'initialValue' property. */ @replaceableComponent("views.elements.EditableTextContainer") -export default class EditableTextContainer extends React.Component { - constructor(props) { +export default class EditableTextContainer extends React.Component { + private _unmounted = false; + public static defaultProps: Partial = { + initialValue: "", + placeholder: "", + blurToSubmit: false, + onSubmit: () => { return Promise.resolve(); }, + }; + + constructor(props: IProps) { super(props); - this._unmounted = false; this.state = { busy: false, errorString: null, value: props.initialValue, }; - this._onValueChanged = this._onValueChanged.bind(this); } - componentDidMount() { - if (this.props.getInitialValue === undefined) { - // use whatever was given in the initialValue property. - return; - } + public async componentDidMount(): Promise { + // use whatever was given in the initialValue property. + if (this.props.getInitialValue === undefined) return; this.setState({ busy: true }); - - this.props.getInitialValue().then( - (result) => { - if (this._unmounted) { return; } - this.setState({ - busy: false, - value: result, - }); - }, - (error) => { - if (this._unmounted) { return; } - this.setState({ - errorString: error.toString(), - busy: false, - }); - }, - ); + try { + const initialValue = await this.props.getInitialValue(); + if (this._unmounted) return; + this.setState({ + busy: false, + value: initialValue, + }); + } catch (error) { + if (this._unmounted) return; + this.setState({ + errorString: error.toString(), + busy: false, + }); + } } - componentWillUnmount() { + public componentWillUnmount(): void { this._unmounted = true; } - _onValueChanged(value, shouldSubmit) { + private onValueChanged = (value: string, shouldSubmit: boolean): void => { if (!shouldSubmit) { return; } @@ -100,24 +126,22 @@ export default class EditableTextContainer extends React.Component { }); }, ); - } + }; - render() { + public render(): JSX.Element { if (this.state.busy) { - const Loader = sdk.getComponent("elements.Spinner"); return ( - + ); } else if (this.state.errorString) { return (
{ this.state.errorString }
); } else { - const EditableText = sdk.getComponent('elements.EditableText'); return ( ); @@ -125,28 +149,3 @@ export default class EditableTextContainer extends React.Component { } } -EditableTextContainer.propTypes = { - /* callback to retrieve the initial value. */ - getInitialValue: PropTypes.func, - - /* initial value; used if getInitialValue is not given */ - initialValue: PropTypes.string, - - /* placeholder text to use when the value is empty (and not being - * edited) */ - placeholder: PropTypes.string, - - /* callback to update the value. Called with a single argument: the new - * value. */ - onSubmit: PropTypes.func, - - /* should the input submit when focus is lost? */ - blurToSubmit: PropTypes.bool, -}; - -EditableTextContainer.defaultProps = { - initialValue: "", - placeholder: "", - blurToSubmit: false, - onSubmit: function(v) {return Promise.resolve(); }, -}; From 1ee606c693fb3caa9ff8c00aba8f34f45c5cf491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 15 Sep 2021 20:35:30 +0200 Subject: [PATCH 145/256] Convert LanguageDropdown to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...nguageDropdown.js => LanguageDropdown.tsx} | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) rename src/components/views/elements/{LanguageDropdown.js => LanguageDropdown.tsx} (84%) diff --git a/src/components/views/elements/LanguageDropdown.js b/src/components/views/elements/LanguageDropdown.tsx similarity index 84% rename from src/components/views/elements/LanguageDropdown.js rename to src/components/views/elements/LanguageDropdown.tsx index 3f17a78629..c6c52ee4e8 100644 --- a/src/components/views/elements/LanguageDropdown.js +++ b/src/components/views/elements/LanguageDropdown.tsx @@ -16,13 +16,13 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; -import * as sdk from '../../../index'; import * as languageHandler from '../../../languageHandler'; import SettingsStore from "../../../settings/SettingsStore"; import { _t } from "../../../languageHandler"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import Spinner from "./Spinner"; +import Dropdown from "./Dropdown"; function languageMatchesSearchQuery(query, language) { if (language.label.toUpperCase().includes(query.toUpperCase())) return true; @@ -30,11 +30,22 @@ function languageMatchesSearchQuery(query, language) { return false; } +interface IProps { + className?: string; + onOptionChange: (language: string) => void; + value?: string; + disabled?: boolean; +} + +interface IState { + searchQuery: string; + langs: string[]; +} + @replaceableComponent("views.elements.LanguageDropdown") -export default class LanguageDropdown extends React.Component { - constructor(props) { +export default class LanguageDropdown extends React.Component { + constructor(props: IProps) { super(props); - this._onSearchChange = this._onSearchChange.bind(this); this.state = { searchQuery: '', @@ -42,7 +53,7 @@ export default class LanguageDropdown extends React.Component { }; } - componentDidMount() { + public componentDidMount(): void { languageHandler.getAllLanguagesFromJson().then((langs) => { langs.sort(function(a, b) { if (a.label < b.label) return -1; @@ -63,20 +74,17 @@ export default class LanguageDropdown extends React.Component { } } - _onSearchChange(search) { + private onSearchChange = (search: string): void => { this.setState({ searchQuery: search, }); - } + }; - render() { + public render(): JSX.Element { if (this.state.langs === null) { - const Spinner = sdk.getComponent('elements.Spinner'); return ; } - const Dropdown = sdk.getComponent('elements.Dropdown'); - let displayedLanguages; if (this.state.searchQuery) { displayedLanguages = this.state.langs.filter((lang) => { @@ -107,7 +115,7 @@ export default class LanguageDropdown extends React.Component { id="mx_LanguageDropdown" className={this.props.className} onOptionChange={this.props.onOptionChange} - onSearchChange={this._onSearchChange} + onSearchChange={this.onSearchChange} searchEnabled={true} value={value} label={_t("Language Dropdown")} @@ -118,8 +126,3 @@ export default class LanguageDropdown extends React.Component { } } -LanguageDropdown.propTypes = { - className: PropTypes.string, - onOptionChange: PropTypes.func.isRequired, - value: PropTypes.string, -}; From 9e2bc28c06f121429ebe2253dd5d4936bc1edce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 15 Sep 2021 20:44:26 +0200 Subject: [PATCH 146/256] Convert LazyRenderList TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../{LazyRenderList.js => LazyRenderList.tsx} | 89 ++++++++++--------- 1 file changed, 49 insertions(+), 40 deletions(-) rename src/components/views/elements/{LazyRenderList.js => LazyRenderList.tsx} (79%) diff --git a/src/components/views/elements/LazyRenderList.js b/src/components/views/elements/LazyRenderList.tsx similarity index 79% rename from src/components/views/elements/LazyRenderList.js rename to src/components/views/elements/LazyRenderList.tsx index 070d9bcc8d..65d578b56f 100644 --- a/src/components/views/elements/LazyRenderList.js +++ b/src/components/views/elements/LazyRenderList.tsx @@ -15,17 +15,16 @@ limitations under the License. */ import React from "react"; -import PropTypes from 'prop-types'; import { replaceableComponent } from "../../../utils/replaceableComponent"; class ItemRange { - constructor(topCount, renderCount, bottomCount) { - this.topCount = topCount; - this.renderCount = renderCount; - this.bottomCount = bottomCount; - } + constructor( + public topCount: number, + public renderCount: number, + public bottomCount: number, + ) { } - contains(range) { + public contains(range: ItemRange): boolean { // don't contain empty ranges // as it will prevent clearing the list // once it is scrolled far enough out of view @@ -36,7 +35,7 @@ class ItemRange { (range.topCount + range.renderCount) <= (this.topCount + this.renderCount); } - expand(amount) { + public expand(amount: number): ItemRange { // don't expand ranges that won't render anything if (this.renderCount === 0) { return this; @@ -51,20 +50,55 @@ class ItemRange { ); } - totalSize() { + public totalSize(): number { return this.topCount + this.renderCount + this.bottomCount; } } +interface IProps { + // height in pixels of the component returned by `renderItem` + itemHeight: number; + // function to turn an element of `items` into a react component + renderItem: (item: T) => JSX.Element; + // scrollTop of the viewport (minus the height of any content above this list like other `LazyRenderList`s) + scrollTop: number; + // the height of the viewport this content is scrolled in + height: number; + // all items for the list. These should not be react components, see `renderItem`. + items?: T[]; + // the amount of items to scroll before causing a rerender, + // should typically be less than `overflowItems` unless applying + // margins in the parent component when using multiple LazyRenderList in one viewport. + // use 0 to only rerender when items will come into view. + overflowMargin?: number; + // the amount of items to add at the top and bottom to render, + // so not every scroll of causes a rerender. + overflowItems?: number; + + element?: string; + className?: string; +} + +interface IState { + renderRange: ItemRange; +} + @replaceableComponent("views.elements.LazyRenderList") -export default class LazyRenderList extends React.Component { - constructor(props) { +export default class LazyRenderList extends React.Component, IState> { + public static defaultProps: Partial> = { + overflowItems: 20, + overflowMargin: 5, + }; + + constructor(props: IProps) { super(props); - this.state = {}; + this.state = { + renderRange: null, + }; } - static getDerivedStateFromProps(props, state) { + public static getDerivedStateFromProps(props: IProps, state: IState): Partial { const range = LazyRenderList.getVisibleRangeFromProps(props); const intersectRange = range.expand(props.overflowMargin); const renderRange = range.expand(props.overflowItems); @@ -77,7 +111,7 @@ export default class LazyRenderList extends React.Component { return null; } - static getVisibleRangeFromProps(props) { + private static getVisibleRangeFromProps(props: IProps): ItemRange { const { items, itemHeight, scrollTop, height } = props; const length = items ? items.length : 0; const topCount = Math.min(Math.max(0, Math.floor(scrollTop / itemHeight)), length); @@ -88,7 +122,7 @@ export default class LazyRenderList extends React.Component { return new ItemRange(topCount, renderCount, bottomCount); } - render() { + public render(): JSX.Element { const { itemHeight, items, renderItem } = this.props; const { renderRange } = this.state; const { topCount, renderCount, bottomCount } = renderRange; @@ -109,28 +143,3 @@ export default class LazyRenderList extends React.Component { } } -LazyRenderList.defaultProps = { - overflowItems: 20, - overflowMargin: 5, -}; - -LazyRenderList.propTypes = { - // height in pixels of the component returned by `renderItem` - itemHeight: PropTypes.number.isRequired, - // function to turn an element of `items` into a react component - renderItem: PropTypes.func.isRequired, - // scrollTop of the viewport (minus the height of any content above this list like other `LazyRenderList`s) - scrollTop: PropTypes.number.isRequired, - // the height of the viewport this content is scrolled in - height: PropTypes.number.isRequired, - // all items for the list. These should not be react components, see `renderItem`. - items: PropTypes.array, - // the amount of items to scroll before causing a rerender, - // should typically be less than `overflowItems` unless applying - // margins in the parent component when using multiple LazyRenderList in one viewport. - // use 0 to only rerender when items will come into view. - overflowMargin: PropTypes.number, - // the amount of items to add at the top and bottom to render, - // so not every scroll of causes a rerender. - overflowItems: PropTypes.number, -}; From 96d1519ac5b2c3b1ab92233a00b17c4a0f2d9c1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 15 Sep 2021 20:47:49 +0200 Subject: [PATCH 147/256] Convert Spoiler to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../elements/{Spoiler.js => Spoiler.tsx} | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) rename src/components/views/elements/{Spoiler.js => Spoiler.tsx} (82%) diff --git a/src/components/views/elements/Spoiler.js b/src/components/views/elements/Spoiler.tsx similarity index 82% rename from src/components/views/elements/Spoiler.js rename to src/components/views/elements/Spoiler.tsx index 802c6cf841..4779a7d90e 100644 --- a/src/components/views/elements/Spoiler.js +++ b/src/components/views/elements/Spoiler.tsx @@ -17,25 +17,34 @@ import React from 'react'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +interface IProps { + reason?: string; + contentHtml: string; +} + +interface IState { + visible: boolean; +} + @replaceableComponent("views.elements.Spoiler") -export default class Spoiler extends React.Component { - constructor(props) { +export default class Spoiler extends React.Component { + constructor(props: IProps) { super(props); this.state = { visible: false, }; } - toggleVisible(e) { + private toggleVisible = (e: React.MouseEvent): void => { if (!this.state.visible) { // we are un-blurring, we don't want this click to propagate to potential child pills e.preventDefault(); e.stopPropagation(); } this.setState({ visible: !this.state.visible }); - } + }; - render() { + public render(): JSX.Element { const reason = this.props.reason ? ( { "(" + this.props.reason + ")" } ) : null; @@ -43,7 +52,7 @@ export default class Spoiler extends React.Component { // as such, we pass the this.props.contentHtml instead and then set the raw // HTML content. This is secure as the contents have already been parsed previously return ( - + { reason }   From 8bf5d97b9e70812714331774271f1777b4a617e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Wed, 15 Sep 2021 21:06:06 +0200 Subject: [PATCH 148/256] Convert TextWithTooltip to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...TextWithTooltip.js => TextWithTooltip.tsx} | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) rename src/components/views/elements/{TextWithTooltip.js => TextWithTooltip.tsx} (71%) diff --git a/src/components/views/elements/TextWithTooltip.js b/src/components/views/elements/TextWithTooltip.tsx similarity index 71% rename from src/components/views/elements/TextWithTooltip.js rename to src/components/views/elements/TextWithTooltip.tsx index 288d33f71b..b7c2477158 100644 --- a/src/components/views/elements/TextWithTooltip.js +++ b/src/components/views/elements/TextWithTooltip.tsx @@ -15,42 +15,44 @@ */ import React from 'react'; -import PropTypes from 'prop-types'; -import * as sdk from '../../../index'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import Tooltip from "./Tooltip"; + +interface IProps { + class?: string; + tooltipClass?: string; + tooltip: React.ReactNode; + tooltipProps?: {}; + onClick?: (ev?: React.MouseEvent) => void; +} + +interface IState { + hover: boolean; +} @replaceableComponent("views.elements.TextWithTooltip") -export default class TextWithTooltip extends React.Component { - static propTypes = { - class: PropTypes.string, - tooltipClass: PropTypes.string, - tooltip: PropTypes.node.isRequired, - tooltipProps: PropTypes.object, - }; - - constructor() { - super(); +export default class TextWithTooltip extends React.Component { + constructor(props: IProps) { + super(props); this.state = { hover: false, }; } - onMouseOver = () => { + private onMouseOver = (): void => { this.setState({ hover: true }); }; - onMouseLeave = () => { + private onMouseLeave = (): void => { this.setState({ hover: false }); }; - render() { - const Tooltip = sdk.getComponent("elements.Tooltip"); - + public render(): JSX.Element { const { class: className, children, tooltip, tooltipClass, tooltipProps, ...props } = this.props; return ( - + { children } { this.state.hover && Date: Wed, 15 Sep 2021 21:09:23 +0200 Subject: [PATCH 149/256] Convert SyntaxHighlight to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...SyntaxHighlight.js => SyntaxHighlight.tsx} | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) rename src/components/views/elements/{SyntaxHighlight.js => SyntaxHighlight.tsx} (73%) diff --git a/src/components/views/elements/SyntaxHighlight.js b/src/components/views/elements/SyntaxHighlight.tsx similarity index 73% rename from src/components/views/elements/SyntaxHighlight.js rename to src/components/views/elements/SyntaxHighlight.tsx index 2c29f7c989..cd65cddfba 100644 --- a/src/components/views/elements/SyntaxHighlight.js +++ b/src/components/views/elements/SyntaxHighlight.tsx @@ -15,40 +15,40 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import { highlightBlock } from 'highlight.js'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +interface IProps { + className?: string; + children?: React.ReactNode; +} + @replaceableComponent("views.elements.SyntaxHighlight") -export default class SyntaxHighlight extends React.Component { - static propTypes = { - className: PropTypes.string, - children: PropTypes.node, - }; +export default class SyntaxHighlight extends React.Component { + private el: HTMLPreElement = null; - constructor(props) { + constructor(props: IProps) { super(props); - - this._ref = this._ref.bind(this); } // componentDidUpdate used here for reusability - componentDidUpdate() { - if (this._el) highlightBlock(this._el); + public componentDidUpdate(): void { + if (this.el) highlightBlock(this.el); } // call componentDidUpdate because _ref is fired on initial render // which does not fire componentDidUpdate - _ref(el) { - this._el = el; + private ref = (el: HTMLPreElement): void => { + this.el = el; this.componentDidUpdate(); - } + }; - render() { + public render(): JSX.Element { const { className, children } = this.props; - return
+        return 
             { children }
         
; } } + From 819a2b4416905d4cf28934d69a1de8ca6d695c93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 16 Sep 2021 17:55:51 +0200 Subject: [PATCH 150/256] Convert PowerSelector to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../{PowerSelector.js => PowerSelector.tsx} | 110 ++++++++++-------- 1 file changed, 61 insertions(+), 49 deletions(-) rename src/components/views/elements/{PowerSelector.js => PowerSelector.tsx} (61%) diff --git a/src/components/views/elements/PowerSelector.js b/src/components/views/elements/PowerSelector.tsx similarity index 61% rename from src/components/views/elements/PowerSelector.js rename to src/components/views/elements/PowerSelector.tsx index 42386ca5c1..f6e24f2bbb 100644 --- a/src/components/views/elements/PowerSelector.js +++ b/src/components/views/elements/PowerSelector.tsx @@ -15,40 +15,52 @@ limitations under the License. */ import React from 'react'; -import PropTypes from 'prop-types'; import * as Roles from '../../../Roles'; import { _t } from '../../../languageHandler'; import Field from "./Field"; import { Key } from "../../../Keyboard"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +const CUSTOM_VALUE = "SELECT_VALUE_CUSTOM"; + +interface IProps { + value: number; + // The maximum value that can be set with the power selector + maxValue: number; + + // Default user power level for the room + usersDefault: number; + + // should the user be able to change the value? false by default. + disabled?: boolean; + onChange?: (value: string, powerLevelKey: string) => void; + + // Optional key to pass as the second argument to `onChange` + powerLevelKey?: string; + + // The name to annotate the selector with + label?: string; +} + +interface IState { + levelRoleMap: {}; + // List of power levels to show in the drop-down + options: number[]; + + customValue: number; + selectValue: number | string; + custom?: boolean; + customLevel?: number; +} + @replaceableComponent("views.elements.PowerSelector") -export default class PowerSelector extends React.Component { - static propTypes = { - value: PropTypes.number.isRequired, - // The maximum value that can be set with the power selector - maxValue: PropTypes.number.isRequired, - - // Default user power level for the room - usersDefault: PropTypes.number.isRequired, - - // should the user be able to change the value? false by default. - disabled: PropTypes.bool, - onChange: PropTypes.func, - - // Optional key to pass as the second argument to `onChange` - powerLevelKey: PropTypes.string, - - // The name to annotate the selector with - label: PropTypes.string, - } - - static defaultProps = { +export default class PowerSelector extends React.Component { + public static defaultProps: Partial = { maxValue: Infinity, usersDefault: 0, }; - constructor(props) { + constructor(props: IProps) { super(props); this.state = { @@ -62,26 +74,26 @@ export default class PowerSelector extends React.Component { } // TODO: [REACT-WARNING] Replace with appropriate lifecycle event - // eslint-disable-next-line camelcase - UNSAFE_componentWillMount() { - this._initStateFromProps(this.props); + // eslint-disable-next-line camelcase, @typescript-eslint/naming-convention + public UNSAFE_componentWillMount(): void { + this.initStateFromProps(this.props); } - // eslint-disable-next-line camelcase - UNSAFE_componentWillReceiveProps(newProps) { - this._initStateFromProps(newProps); + // eslint-disable-next-line camelcase, @typescript-eslint/naming-convention + public UNSAFE_componentWillReceiveProps(newProps: IProps): void { + this.initStateFromProps(newProps); } - _initStateFromProps(newProps) { + private initStateFromProps(newProps: IProps): void { // This needs to be done now because levelRoleMap has translated strings const levelRoleMap = Roles.levelRoleMap(newProps.usersDefault); const options = Object.keys(levelRoleMap).filter(level => { return ( level === undefined || - level <= newProps.maxValue || - level == newProps.value + parseInt(level) <= newProps.maxValue || + parseInt(level) == newProps.value ); - }); + }).map(level => parseInt(level)); const isCustom = levelRoleMap[newProps.value] === undefined; @@ -90,32 +102,32 @@ export default class PowerSelector extends React.Component { options, custom: isCustom, customLevel: newProps.value, - selectValue: isCustom ? "SELECT_VALUE_CUSTOM" : newProps.value, + selectValue: isCustom ? CUSTOM_VALUE : newProps.value, }); } - onSelectChange = event => { - const isCustom = event.target.value === "SELECT_VALUE_CUSTOM"; + private onSelectChange = (event: React.ChangeEvent): void => { + const isCustom = event.target.value === CUSTOM_VALUE; if (isCustom) { this.setState({ custom: true }); } else { this.props.onChange(event.target.value, this.props.powerLevelKey); - this.setState({ selectValue: event.target.value }); + this.setState({ selectValue: parseInt(event.target.value) }); } }; - onCustomChange = event => { - this.setState({ customValue: event.target.value }); + private onCustomChange = (event: React.ChangeEvent): void => { + this.setState({ customValue: parseInt(event.target.value) }); }; - onCustomBlur = event => { + private onCustomBlur = (event: React.FocusEvent): void => { event.preventDefault(); event.stopPropagation(); - this.props.onChange(parseInt(this.state.customValue), this.props.powerLevelKey); + this.props.onChange(String(this.state.customValue), this.props.powerLevelKey); }; - onCustomKeyDown = event => { + private onCustomKeyDown = (event: React.KeyboardEvent): void => { if (event.key === Key.ENTER) { event.preventDefault(); event.stopPropagation(); @@ -125,11 +137,11 @@ export default class PowerSelector extends React.Component { // raising a dialog which causes a blur which causes a dialog which causes a blur and // so on. By not causing the onChange to be called here, we avoid the loop because we // handle the onBlur safely. - event.target.blur(); + (event.target as HTMLInputElement).blur(); } }; - render() { + public render(): JSX.Element { let picker; const label = typeof this.props.label === "undefined" ? _t("Power level") : this.props.label; if (this.state.custom) { @@ -147,14 +159,14 @@ export default class PowerSelector extends React.Component { ); } else { // Each level must have a definition in this.state.levelRoleMap - let options = this.state.options.map((level) => { + const options = this.state.options.map((level) => { return { - value: level, + value: String(level), text: Roles.textualPowerLevel(level, this.props.usersDefault), }; }); - options.push({ value: "SELECT_VALUE_CUSTOM", text: _t("Custom level") }); - options = options.map((op) => { + options.push({ value: CUSTOM_VALUE, text: _t("Custom level") }); + const optionsElements = options.map((op) => { return ; }); @@ -166,7 +178,7 @@ export default class PowerSelector extends React.Component { value={String(this.state.selectValue)} disabled={this.props.disabled} > - { options } + { optionsElements } ); } From a8d3bb76efb8f5437a6a79f7b3bae78a513b9381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 16 Sep 2021 18:46:18 +0200 Subject: [PATCH 151/256] Convert PersistentApp to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../{PersistentApp.js => PersistentApp.tsx} | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) rename src/components/views/elements/{PersistentApp.js => PersistentApp.tsx} (72%) diff --git a/src/components/views/elements/PersistentApp.js b/src/components/views/elements/PersistentApp.tsx similarity index 72% rename from src/components/views/elements/PersistentApp.js rename to src/components/views/elements/PersistentApp.tsx index 763ab63487..1f911659e2 100644 --- a/src/components/views/elements/PersistentApp.js +++ b/src/components/views/elements/PersistentApp.tsx @@ -19,57 +19,70 @@ import React from 'react'; import RoomViewStore from '../../../stores/RoomViewStore'; import ActiveWidgetStore from '../../../stores/ActiveWidgetStore'; import WidgetUtils from '../../../utils/WidgetUtils'; -import * as sdk from '../../../index'; import { MatrixClientPeg } from '../../../MatrixClientPeg'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import { EventSubscription } from 'fbemitter'; +import AppTile from "./AppTile"; +import { Room } from "matrix-js-sdk/src/models/room"; + +interface IState { + roomId: string; + persistentWidgetId: string; +} @replaceableComponent("views.elements.PersistentApp") -export default class PersistentApp extends React.Component { - state = { - roomId: RoomViewStore.getRoomId(), - persistentWidgetId: ActiveWidgetStore.getPersistentWidgetId(), - }; +export default class PersistentApp extends React.Component<{}, IState> { + private roomStoreToken: EventSubscription; - componentDidMount() { - this._roomStoreToken = RoomViewStore.addListener(this._onRoomViewStoreUpdate); - ActiveWidgetStore.on('update', this._onActiveWidgetStoreUpdate); - MatrixClientPeg.get().on("Room.myMembership", this._onMyMembership); + constructor() { + super({}); + + this.state = { + roomId: RoomViewStore.getRoomId(), + persistentWidgetId: ActiveWidgetStore.getPersistentWidgetId(), + }; } - componentWillUnmount() { - if (this._roomStoreToken) { - this._roomStoreToken.remove(); + public componentDidMount(): void { + this.roomStoreToken = RoomViewStore.addListener(this.onRoomViewStoreUpdate); + ActiveWidgetStore.on('update', this.onActiveWidgetStoreUpdate); + MatrixClientPeg.get().on("Room.myMembership", this.onMyMembership); + } + + public componentWillUnmount(): void { + if (this.roomStoreToken) { + this.roomStoreToken.remove(); } - ActiveWidgetStore.removeListener('update', this._onActiveWidgetStoreUpdate); + ActiveWidgetStore.removeListener('update', this.onActiveWidgetStoreUpdate); if (MatrixClientPeg.get()) { - MatrixClientPeg.get().removeListener("Room.myMembership", this._onMyMembership); + MatrixClientPeg.get().removeListener("Room.myMembership", this.onMyMembership); } } - _onRoomViewStoreUpdate = payload => { + private onRoomViewStoreUpdate = (): void => { if (RoomViewStore.getRoomId() === this.state.roomId) return; this.setState({ roomId: RoomViewStore.getRoomId(), }); }; - _onActiveWidgetStoreUpdate = () => { + private onActiveWidgetStoreUpdate = (): void => { this.setState({ persistentWidgetId: ActiveWidgetStore.getPersistentWidgetId(), }); }; - _onMyMembership = async (room, membership) => { + private onMyMembership = async (room: Room, membership: string): Promise => { const persistentWidgetInRoomId = ActiveWidgetStore.getRoomId(this.state.persistentWidgetId); if (membership !== "join") { // we're not in the room anymore - delete - if (room.roomId === persistentWidgetInRoomId) { + if (room .roomId === persistentWidgetInRoomId) { ActiveWidgetStore.destroyPersistentWidget(this.state.persistentWidgetId); } } }; - render() { + public render(): JSX.Element { if (this.state.persistentWidgetId) { const persistentWidgetInRoomId = ActiveWidgetStore.getRoomId(this.state.persistentWidgetId); @@ -89,7 +102,6 @@ export default class PersistentApp extends React.Component { appEvent.getStateKey(), appEvent.getContent(), appEvent.getSender(), persistentWidgetInRoomId, appEvent.getId(), ); - const AppTile = sdk.getComponent('elements.AppTile'); return Date: Thu, 16 Sep 2021 18:57:32 +0200 Subject: [PATCH 152/256] Convert PersistedElement to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- ...rsistedElement.js => PersistedElement.tsx} | 101 +++++++++--------- 1 file changed, 50 insertions(+), 51 deletions(-) rename src/components/views/elements/{PersistedElement.js => PersistedElement.tsx} (69%) diff --git a/src/components/views/elements/PersistedElement.js b/src/components/views/elements/PersistedElement.tsx similarity index 69% rename from src/components/views/elements/PersistedElement.js rename to src/components/views/elements/PersistedElement.tsx index 03aa9e0d6d..8dda530097 100644 --- a/src/components/views/elements/PersistedElement.js +++ b/src/components/views/elements/PersistedElement.tsx @@ -16,25 +16,26 @@ limitations under the License. import React from 'react'; import ReactDOM from 'react-dom'; -import PropTypes from 'prop-types'; import { throttle } from "lodash"; -import ResizeObserver from 'resize-observer-polyfill'; import dis from '../../../dispatcher/dispatcher'; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; import { isNullOrUndefined } from "matrix-js-sdk/src/utils"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +import { ActionPayload } from "../../../dispatcher/payloads"; + +export const getPersistKey = (appId: string) => 'widget_' + appId; // Shamelessly ripped off Modal.js. There's probably a better way // of doing reusable widgets like dialog boxes & menus where we go and // pass in a custom control as the actual body. -function getContainer(containerId) { - return document.getElementById(containerId); +function getContainer(containerId: string): HTMLDivElement { + return document.getElementById(containerId) as HTMLDivElement; } -function getOrCreateContainer(containerId) { +function getOrCreateContainer(containerId: string): HTMLDivElement { let container = getContainer(containerId); if (!container) { @@ -46,7 +47,19 @@ function getOrCreateContainer(containerId) { return container; } -/* +interface IProps { + // Unique identifier for this PersistedElement instance + // Any PersistedElements with the same persistKey will use + // the same DOM container. + persistKey: string; + + // z-index for the element. Defaults to 9. + zIndex?: number; + + style?: React.StyleHTMLAttributes; +} + +/** * Class of component that renders its children in a separate ReactDOM virtual tree * in a container element appended to document.body. * @@ -58,53 +71,40 @@ function getOrCreateContainer(containerId) { * bounding rect as the parent of PE. */ @replaceableComponent("views.elements.PersistedElement") -export default class PersistedElement extends React.Component { - static propTypes = { - // Unique identifier for this PersistedElement instance - // Any PersistedElements with the same persistKey will use - // the same DOM container. - persistKey: PropTypes.string.isRequired, +export default class PersistedElement extends React.Component { + private resizeObserver: ResizeObserver; + private dispatcherRef: string; + private childContainer: HTMLDivElement; + private child: HTMLDivElement; - // z-index for the element. Defaults to 9. - zIndex: PropTypes.number, - }; + constructor(props: IProps) { + super(props); - constructor() { - super(); - this.collectChildContainer = this.collectChildContainer.bind(this); - this.collectChild = this.collectChild.bind(this); - this._repositionChild = this._repositionChild.bind(this); - this._onAction = this._onAction.bind(this); - - this.resizeObserver = new ResizeObserver(this._repositionChild); + this.resizeObserver = new ResizeObserver(this.repositionChild); // Annoyingly, a resize observer is insufficient, since we also care // about when the element moves on the screen without changing its // dimensions. Doesn't look like there's a ResizeObserver equivalent // for this, so we bodge it by listening for document resize and // the timeline_resize action. - window.addEventListener('resize', this._repositionChild); - this._dispatcherRef = dis.register(this._onAction); + window.addEventListener('resize', this.repositionChild); + this.dispatcherRef = dis.register(this.onAction); } /** * Removes the DOM elements created when a PersistedElement with the given * persistKey was mounted. The DOM elements will be re-added if another - * PeristedElement is mounted in the future. + * PersistedElement is mounted in the future. * * @param {string} persistKey Key used to uniquely identify this PersistedElement */ - static destroyElement(persistKey) { + public static destroyElement(persistKey: string): void { const container = getContainer('mx_persistedElement_' + persistKey); if (container) { container.remove(); } } - static isMounted(persistKey) { - return Boolean(getContainer('mx_persistedElement_' + persistKey)); - } - - collectChildContainer(ref) { + private collectChildContainer = (ref: HTMLDivElement): void => { if (this.childContainer) { this.resizeObserver.unobserve(this.childContainer); } @@ -112,48 +112,48 @@ export default class PersistedElement extends React.Component { if (ref) { this.resizeObserver.observe(ref); } - } + }; - collectChild(ref) { + private collectChild = (ref: HTMLDivElement): void => { this.child = ref; this.updateChild(); - } + }; - componentDidMount() { + public componentDidMount(): void { this.updateChild(); this.renderApp(); } - componentDidUpdate() { + public componentDidUpdate(): void { this.updateChild(); this.renderApp(); } - componentWillUnmount() { + public componentWillUnmount(): void { this.updateChildVisibility(this.child, false); this.resizeObserver.disconnect(); - window.removeEventListener('resize', this._repositionChild); - dis.unregister(this._dispatcherRef); + window.removeEventListener('resize', this.repositionChild); + dis.unregister(this.dispatcherRef); } - _onAction(payload) { + private onAction = (payload: ActionPayload): void => { if (payload.action === 'timeline_resize') { - this._repositionChild(); + this.repositionChild(); } else if (payload.action === 'logout') { PersistedElement.destroyElement(this.props.persistKey); } - } + }; - _repositionChild() { + private repositionChild = (): void => { this.updateChildPosition(this.child, this.childContainer); - } + }; - updateChild() { + private updateChild(): void { this.updateChildPosition(this.child, this.childContainer); this.updateChildVisibility(this.child, true); } - renderApp() { + private renderApp(): void { const content =
{ this.props.children } @@ -163,12 +163,12 @@ export default class PersistedElement extends React.Component { ReactDOM.render(content, getOrCreateContainer('mx_persistedElement_'+this.props.persistKey)); } - updateChildVisibility(child, visible) { + private updateChildVisibility(child: HTMLDivElement, visible: boolean): void { if (!child) return; child.style.display = visible ? 'block' : 'none'; } - updateChildPosition = throttle((child, parent) => { + private updateChildPosition = throttle((child: HTMLDivElement, parent: HTMLDivElement): void => { if (!child || !parent) return; const parentRect = parent.getBoundingClientRect(); @@ -182,9 +182,8 @@ export default class PersistedElement extends React.Component { }); }, 100, { trailing: true, leading: true }); - render() { + public render(): JSX.Element { return
; } } -export const getPersistKey = (appId) => 'widget_' + appId; From af853e1d86aa71fe78ed24a2b2ca780453df4b7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 16 Sep 2021 19:16:36 +0200 Subject: [PATCH 153/256] Convert DialogButtons to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../eventindex/ManageEventIndexDialog.tsx | 5 +- .../views/dialogs/CryptoStoreTooNewDialog.tsx | 5 +- .../{DialogButtons.js => DialogButtons.tsx} | 85 ++++++++++--------- 3 files changed, 47 insertions(+), 48 deletions(-) rename src/components/views/elements/{DialogButtons.js => DialogButtons.tsx} (64%) diff --git a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.tsx b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.tsx index 2748fda35a..ac7875b920 100644 --- a/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.tsx +++ b/src/async-components/views/dialogs/eventindex/ManageEventIndexDialog.tsx @@ -26,10 +26,9 @@ import { SettingLevel } from "../../../../settings/SettingLevel"; import Field from '../../../../components/views/elements/Field'; import BaseDialog from "../../../../components/views/dialogs/BaseDialog"; import DialogButtons from "../../../../components/views/elements/DialogButtons"; +import { IDialogProps } from "../../../../components/views/dialogs/IDialogProps"; -interface IProps { - onFinished: (confirmed: boolean) => void; -} +interface IProps extends IDialogProps {} interface IState { eventIndexSize: number; diff --git a/src/components/views/dialogs/CryptoStoreTooNewDialog.tsx b/src/components/views/dialogs/CryptoStoreTooNewDialog.tsx index d03b668cd9..3bb78233ea 100644 --- a/src/components/views/dialogs/CryptoStoreTooNewDialog.tsx +++ b/src/components/views/dialogs/CryptoStoreTooNewDialog.tsx @@ -23,10 +23,9 @@ import Modal from '../../../Modal'; import BaseDialog from "./BaseDialog"; import DialogButtons from "../elements/DialogButtons"; import QuestionDialog from "./QuestionDialog"; +import { IDialogProps } from "./IDialogProps"; -interface IProps { - onFinished: (success: boolean) => void; -} +interface IProps extends IDialogProps {} const CryptoStoreTooNewDialog: React.FC = (props: IProps) => { const brand = SdkConfig.get().brand; diff --git a/src/components/views/elements/DialogButtons.js b/src/components/views/elements/DialogButtons.tsx similarity index 64% rename from src/components/views/elements/DialogButtons.js rename to src/components/views/elements/DialogButtons.tsx index 9dd4a84b9a..0dff64c0b4 100644 --- a/src/components/views/elements/DialogButtons.js +++ b/src/components/views/elements/DialogButtons.tsx @@ -17,60 +17,61 @@ limitations under the License. */ import React from "react"; -import PropTypes from "prop-types"; import { _t } from '../../../languageHandler'; import { replaceableComponent } from "../../../utils/replaceableComponent"; +interface IProps { + // The primary button which is styled differently and has default focus. + primaryButton: React.ReactNode; + + // A node to insert into the cancel button instead of default "Cancel" + cancelButton?: React.ReactNode; + + // If true, make the primary button a form submit button (input type="submit") + primaryIsSubmit?: boolean; + + // onClick handler for the primary button. + onPrimaryButtonClick?: (ev: React.MouseEvent) => void; + + // should there be a cancel button? default: true + hasCancel?: boolean; + + // The class of the cancel button, only used if a cancel button is + // enabled + cancelButtonClass?: string; + + // onClick handler for the cancel button. + onCancel?: (...args: any[]) => void; + + focus?: boolean; + + // disables the primary and cancel buttons + disabled?: boolean; + + // disables only the primary button + primaryDisabled?: boolean; + + // something to stick next to the buttons, optionally + additive?: React.ReactNode; + + primaryButtonClass?: string; +} + /** * Basic container for buttons in modal dialogs. */ @replaceableComponent("views.elements.DialogButtons") -export default class DialogButtons extends React.Component { - static propTypes = { - // The primary button which is styled differently and has default focus. - primaryButton: PropTypes.node.isRequired, - - // A node to insert into the cancel button instead of default "Cancel" - cancelButton: PropTypes.node, - - // If true, make the primary button a form submit button (input type="submit") - primaryIsSubmit: PropTypes.bool, - - // onClick handler for the primary button. - onPrimaryButtonClick: PropTypes.func, - - // should there be a cancel button? default: true - hasCancel: PropTypes.bool, - - // The class of the cancel button, only used if a cancel button is - // enabled - cancelButtonClass: PropTypes.node, - - // onClick handler for the cancel button. - onCancel: PropTypes.func, - - focus: PropTypes.bool, - - // disables the primary and cancel buttons - disabled: PropTypes.bool, - - // disables only the primary button - primaryDisabled: PropTypes.bool, - - // something to stick next to the buttons, optionally - additive: PropTypes.element, - }; - - static defaultProps = { +export default class DialogButtons extends React.Component { + public static defaultProps: Partial = { hasCancel: true, disabled: false, }; - _onCancelClick = () => { - this.props.onCancel(); + private onCancelClick = (event: React.MouseEvent): void => { + this.props.onCancel(event); }; - render() { + public render(): JSX.Element { let primaryButtonClassName = "mx_Dialog_primary"; if (this.props.primaryButtonClass) { primaryButtonClassName += " " + this.props.primaryButtonClass; @@ -82,7 +83,7 @@ export default class DialogButtons extends React.Component { // important: the default type is 'submit' and this button comes before the // primary in the DOM so will get form submissions unless we make it not a submit. type="button" - onClick={this._onCancelClick} + onClick={this.onCancelClick} className={this.props.cancelButtonClass} disabled={this.props.disabled} > From 03ce568a5de18b177232f228417fc82fb738846c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Thu, 16 Sep 2021 19:33:17 +0200 Subject: [PATCH 154/256] Convert EditableText to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../{EditableText.js => EditableText.tsx} | 143 +++++++++--------- 1 file changed, 68 insertions(+), 75 deletions(-) rename src/components/views/elements/{EditableText.js => EditableText.tsx} (62%) diff --git a/src/components/views/elements/EditableText.js b/src/components/views/elements/EditableText.tsx similarity index 62% rename from src/components/views/elements/EditableText.js rename to src/components/views/elements/EditableText.tsx index 6dbc8b8771..b3ff8ee245 100644 --- a/src/components/views/elements/EditableText.js +++ b/src/components/views/elements/EditableText.tsx @@ -16,33 +16,42 @@ limitations under the License. */ import React, { createRef } from 'react'; -import PropTypes from 'prop-types'; import { Key } from "../../../Keyboard"; import { replaceableComponent } from "../../../utils/replaceableComponent"; +enum Phases { + Display = "display", + Edit = "edit", +} + +interface IProps { + onValueChanged?: (value: string, shouldSubmit: boolean) => void; + initialValue?: string; + label?: string; + placeholder?: string; + className?: string; + labelClassName?: string; + placeholderClassName?: string; + // Overrides blurToSubmit if true + blurToCancel?: boolean; + // Will cause onValueChanged(value, true) to fire on blur + blurToSubmit?: boolean; + editable?: boolean; +} + +interface IState { + phase: Phases; +} + @replaceableComponent("views.elements.EditableText") -export default class EditableText extends React.Component { - static propTypes = { - onValueChanged: PropTypes.func, - initialValue: PropTypes.string, - label: PropTypes.string, - placeholder: PropTypes.string, - className: PropTypes.string, - labelClassName: PropTypes.string, - placeholderClassName: PropTypes.string, - // Overrides blurToSubmit if true - blurToCancel: PropTypes.bool, - // Will cause onValueChanged(value, true) to fire on blur - blurToSubmit: PropTypes.bool, - editable: PropTypes.bool, - }; +export default class EditableText extends React.Component { + // we track value as an JS object field rather than in React state + // as React doesn't play nice with contentEditable. + public value = ''; + private placeholder = false; + private editableDiv = createRef(); - static Phases = { - Display: "display", - Edit: "edit", - }; - - static defaultProps = { + public static defaultProps: Partial = { onValueChanged() {}, initialValue: '', label: '', @@ -53,81 +62,61 @@ export default class EditableText extends React.Component { blurToSubmit: false, }; - constructor(props) { + constructor(props: IProps) { super(props); - // we track value as an JS object field rather than in React state - // as React doesn't play nice with contentEditable. - this.value = ''; - this.placeholder = false; - - this._editable_div = createRef(); + this.state = { + phase: Phases.Display, + }; } - state = { - phase: EditableText.Phases.Display, - }; - // TODO: [REACT-WARNING] Replace with appropriate lifecycle event - // eslint-disable-next-line camelcase - UNSAFE_componentWillReceiveProps(nextProps) { + // eslint-disable-next-line @typescript-eslint/naming-convention, camelcase + public UNSAFE_componentWillReceiveProps(nextProps: IProps): void { if (nextProps.initialValue !== this.props.initialValue) { this.value = nextProps.initialValue; - if (this._editable_div.current) { + if (this.editableDiv.current) { this.showPlaceholder(!this.value); } } } - componentDidMount() { + public componentDidMount(): void { this.value = this.props.initialValue; - if (this._editable_div.current) { + if (this.editableDiv.current) { this.showPlaceholder(!this.value); } } - showPlaceholder = show => { + private showPlaceholder = (show: boolean): void => { if (show) { - this._editable_div.current.textContent = this.props.placeholder; - this._editable_div.current.setAttribute("class", this.props.className + this.editableDiv.current.textContent = this.props.placeholder; + this.editableDiv.current.setAttribute("class", this.props.className + " " + this.props.placeholderClassName); this.placeholder = true; this.value = ''; } else { - this._editable_div.current.textContent = this.value; - this._editable_div.current.setAttribute("class", this.props.className); + this.editableDiv.current.textContent = this.value; + this.editableDiv.current.setAttribute("class", this.props.className); this.placeholder = false; } }; - getValue = () => this.value; - - setValue = value => { - this.value = value; - this.showPlaceholder(!this.value); - }; - - edit = () => { + private cancelEdit = (): void => { this.setState({ - phase: EditableText.Phases.Edit, - }); - }; - - cancelEdit = () => { - this.setState({ - phase: EditableText.Phases.Display, + phase: Phases.Display, }); this.value = this.props.initialValue; this.showPlaceholder(!this.value); this.onValueChanged(false); - this._editable_div.current.blur(); + this.editableDiv.current.blur(); }; - onValueChanged = shouldSubmit => { + private onValueChanged = (shouldSubmit: boolean): void => { this.props.onValueChanged(this.value, shouldSubmit); }; - onKeyDown = ev => { + private onKeyDown = (ev: React.KeyboardEvent): void => { // console.log("keyDown: textContent=" + ev.target.textContent + ", value=" + this.value + ", placeholder=" + this.placeholder); if (this.placeholder) { @@ -142,13 +131,13 @@ export default class EditableText extends React.Component { // console.log("keyDown: textContent=" + ev.target.textContent + ", value=" + this.value + ", placeholder=" + this.placeholder); }; - onKeyUp = ev => { + private onKeyUp = (ev: React.KeyboardEvent): void => { // console.log("keyUp: textContent=" + ev.target.textContent + ", value=" + this.value + ", placeholder=" + this.placeholder); - if (!ev.target.textContent) { + if (!(ev.target as HTMLDivElement).textContent) { this.showPlaceholder(true); } else if (!this.placeholder) { - this.value = ev.target.textContent; + this.value = (ev.target as HTMLDivElement).textContent; } if (ev.key === Key.ENTER) { @@ -160,22 +149,22 @@ export default class EditableText extends React.Component { // console.log("keyUp: textContent=" + ev.target.textContent + ", value=" + this.value + ", placeholder=" + this.placeholder); }; - onClickDiv = ev => { + private onClickDiv = (): void => { if (!this.props.editable) return; this.setState({ - phase: EditableText.Phases.Edit, + phase: Phases.Edit, }); }; - onFocus = ev => { + private onFocus = (ev: React.FocusEvent): void => { //ev.target.setSelectionRange(0, ev.target.textContent.length); const node = ev.target.childNodes[0]; if (node) { const range = document.createRange(); range.setStart(node, 0); - range.setEnd(node, node.length); + range.setEnd(node, ev.target.childNodes.length); const sel = window.getSelection(); sel.removeAllRanges(); @@ -183,11 +172,15 @@ export default class EditableText extends React.Component { } }; - onFinish = (ev, shouldSubmit) => { + private onFinish = ( + ev: React.KeyboardEvent | React.FocusEvent, + shouldSubmit?: boolean, + ): void => { + // eslint-disable-next-line @typescript-eslint/no-this-alias const self = this; - const submit = (ev.key === Key.ENTER) || shouldSubmit; + const submit = ("key" in ev && ev.key === Key.ENTER) || shouldSubmit; this.setState({ - phase: EditableText.Phases.Display, + phase: Phases.Display, }, () => { if (this.value !== this.props.initialValue) { self.onValueChanged(submit); @@ -195,7 +188,7 @@ export default class EditableText extends React.Component { }); }; - onBlur = ev => { + private onBlur = (ev: React.FocusEvent): void => { const sel = window.getSelection(); sel.removeAllRanges(); @@ -208,11 +201,11 @@ export default class EditableText extends React.Component { this.showPlaceholder(!this.value); }; - render() { + public render(): JSX.Element { const { className, editable, initialValue, label, labelClassName } = this.props; let editableEl; - if (!editable || (this.state.phase === EditableText.Phases.Display && + if (!editable || (this.state.phase === Phases.Display && (label || labelClassName) && !this.value) ) { // show the label @@ -222,7 +215,7 @@ export default class EditableText extends React.Component { } else { // show the content editable div, but manually manage its contents as react and contentEditable don't play nice together editableEl =
Date: Thu, 16 Sep 2021 20:05:57 +0200 Subject: [PATCH 155/256] Convert AppTile to TS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/structures/LeftPanelWidget.tsx | 1 - .../elements/{AppTile.js => AppTile.tsx} | 273 +++++++++--------- .../views/right_panel/WidgetCard.tsx | 1 - src/components/views/rooms/Stickerpicker.tsx | 19 +- src/stores/widgets/StopGapWidget.ts | 2 +- 5 files changed, 149 insertions(+), 147 deletions(-) rename src/components/views/elements/{AppTile.js => AppTile.tsx} (73%) diff --git a/src/components/structures/LeftPanelWidget.tsx b/src/components/structures/LeftPanelWidget.tsx index 331e428355..6b91acb5f8 100644 --- a/src/components/structures/LeftPanelWidget.tsx +++ b/src/components/structures/LeftPanelWidget.tsx @@ -76,7 +76,6 @@ const LeftPanelWidget: React.FC = () => { void; + // Optional onDeleteClickHandler (overrides default behaviour) + onDeleteClick?: () => void; + // Optionally hide the tile title + showTitle?: boolean; + // Optionally handle minimise button pointer events (default false) + handleMinimisePointerEvents?: boolean; + // Optionally hide the popout widget icon + showPopout?: boolean; + // Is this an instance of a user widget + userWidget: boolean; + // sets the pointer-events property on the iframe + pointerEvents?: string; + widgetPageTitle?: string; +} + +interface IState { + initialising: boolean; // True while we are mangling the widget URL + // True while the iframe content is loading + loading: boolean; + // Assume that widget has permission to load if we are the user who + // added it to the room, or if explicitly granted by the user + hasPermissionToLoad: boolean; + error: Error; + menuDisplayed: boolean; + widgetPageTitle: string; +} @replaceableComponent("views.elements.AppTile") -export default class AppTile extends React.Component { - constructor(props) { +export default class AppTile extends React.Component { + displayName = 'AppTile'; + public static defaultProps: Partial = { + waitForIframeLoad: true, + showMenubar: true, + showTitle: true, + showPopout: true, + handleMinimisePointerEvents: false, + userWidget: false, + miniMode: false, + }; + + private contextMenuButton = createRef(); + private iframe: HTMLIFrameElement; // ref to the iframe (callback style) + private allowedWidgetsWatchRef: string; + private persistKey: string; + private sgWidget: StopGapWidget; + private dispatcherRef: string; + + constructor(props: IProps) { super(props); // The key used for PersistedElement - this._persistKey = getPersistKey(this.props.app.id); + this.persistKey = getPersistKey(this.props.app.id); try { - this._sgWidget = new StopGapWidget(this.props); - this._sgWidget.on("preparing", this._onWidgetPrepared); - this._sgWidget.on("ready", this._onWidgetReady); + this.sgWidget = new StopGapWidget(this.props); + this.sgWidget.on("preparing", this.onWidgetPrepared); + this.sgWidget.on("ready", this.onWidgetReady); } catch (e) { console.log("Failed to construct widget", e); - this._sgWidget = null; + this.sgWidget = null; } - this.iframe = null; // ref to the iframe (callback style) - this.state = this._getNewState(props); - this._contextMenuButton = createRef(); + this.state = this.getNewState(props); - this._allowedWidgetsWatchRef = SettingsStore.watchSetting("allowedWidgets", null, this.onAllowedWidgetsChange); + this.allowedWidgetsWatchRef = SettingsStore.watchSetting("allowedWidgets", null, this.onAllowedWidgetsChange); } // This is a function to make the impact of calling SettingsStore slightly less - hasPermissionToLoad = (props) => { - if (this._usingLocalWidget()) return true; + private hasPermissionToLoad = (props: IProps): boolean => { + if (this.usingLocalWidget()) return true; if (!props.room) return true; // user widgets always have permissions const currentlyAllowedWidgets = SettingsStore.getValue("allowedWidgets", props.room.roomId); @@ -81,34 +143,34 @@ export default class AppTile extends React.Component { * @param {Object} newProps The new properties of the component * @return {Object} Updated component state to be set with setState */ - _getNewState(newProps) { + private getNewState(newProps: IProps): IState { return { initialising: true, // True while we are mangling the widget URL // True while the iframe content is loading - loading: this.props.waitForIframeLoad && !PersistedElement.isMounted(this._persistKey), + loading: this.props.waitForIframeLoad, // Assume that widget has permission to load if we are the user who // added it to the room, or if explicitly granted by the user hasPermissionToLoad: this.hasPermissionToLoad(newProps), error: null, - widgetPageTitle: newProps.widgetPageTitle, menuDisplayed: false, + widgetPageTitle: this.props.widgetPageTitle, }; } - onAllowedWidgetsChange = () => { + private onAllowedWidgetsChange = (): void => { const hasPermissionToLoad = this.hasPermissionToLoad(this.props); if (this.state.hasPermissionToLoad && !hasPermissionToLoad) { // Force the widget to be non-persistent (able to be deleted/forgotten) ActiveWidgetStore.destroyPersistentWidget(this.props.app.id); - PersistedElement.destroyElement(this._persistKey); - if (this._sgWidget) this._sgWidget.stop(); + PersistedElement.destroyElement(this.persistKey); + if (this.sgWidget) this.sgWidget.stop(); } this.setState({ hasPermissionToLoad }); }; - isMixedContent() { + private isMixedContent(): boolean { const parentContentProtocol = window.location.protocol; const u = url.parse(this.props.app.url); const childContentProtocol = u.protocol; @@ -120,77 +182,72 @@ export default class AppTile extends React.Component { return false; } - componentDidMount() { + public componentDidMount(): void { // Only fetch IM token on mount if we're showing and have permission to load - if (this._sgWidget && this.state.hasPermissionToLoad) { - this._startWidget(); + if (this.sgWidget && this.state.hasPermissionToLoad) { + this.startWidget(); } // Widget action listeners - this.dispatcherRef = dis.register(this._onAction); + this.dispatcherRef = dis.register(this.onAction); } - componentWillUnmount() { + public componentWillUnmount(): void { // Widget action listeners if (this.dispatcherRef) dis.unregister(this.dispatcherRef); // if it's not remaining on screen, get rid of the PersistedElement container if (!ActiveWidgetStore.getWidgetPersistence(this.props.app.id)) { ActiveWidgetStore.destroyPersistentWidget(this.props.app.id); - PersistedElement.destroyElement(this._persistKey); + PersistedElement.destroyElement(this.persistKey); } - if (this._sgWidget) { - this._sgWidget.stop(); + if (this.sgWidget) { + this.sgWidget.stop(); } - SettingsStore.unwatchSetting(this._allowedWidgetsWatchRef); + SettingsStore.unwatchSetting(this.allowedWidgetsWatchRef); } - _resetWidget(newProps) { - if (this._sgWidget) { - this._sgWidget.stop(); + private resetWidget(newProps: IProps): void { + if (this.sgWidget) { + this.sgWidget.stop(); } try { - this._sgWidget = new StopGapWidget(newProps); - this._sgWidget.on("preparing", this._onWidgetPrepared); - this._sgWidget.on("ready", this._onWidgetReady); - this._startWidget(); + this.sgWidget = new StopGapWidget(newProps); + this.sgWidget.on("preparing", this.onWidgetPrepared); + this.sgWidget.on("ready", this.onWidgetReady); + this.startWidget(); } catch (e) { console.log("Failed to construct widget", e); - this._sgWidget = null; + this.sgWidget = null; } } - _startWidget() { - this._sgWidget.prepare().then(() => { + private startWidget(): void { + this.sgWidget.prepare().then(() => { this.setState({ initialising: false }); }); } - _iframeRefChange = (ref) => { + private iframeRefChange = (ref: HTMLIFrameElement): void => { this.iframe = ref; if (ref) { - if (this._sgWidget) this._sgWidget.start(ref); + if (this.sgWidget) this.sgWidget.start(ref); } else { - this._resetWidget(this.props); + this.resetWidget(this.props); } }; // TODO: [REACT-WARNING] Replace with appropriate lifecycle event - UNSAFE_componentWillReceiveProps(nextProps) { // eslint-disable-line camelcase + // eslint-disable-next-line @typescript-eslint/naming-convention + public UNSAFE_componentWillReceiveProps(nextProps: IProps): void { // eslint-disable-line camelcase if (nextProps.app.url !== this.props.app.url) { - this._getNewState(nextProps); + this.getNewState(nextProps); if (this.state.hasPermissionToLoad) { - this._resetWidget(nextProps); + this.resetWidget(nextProps); } } - - if (nextProps.widgetPageTitle !== this.props.widgetPageTitle) { - this.setState({ - widgetPageTitle: nextProps.widgetPageTitle, - }); - } } /** @@ -198,7 +255,7 @@ export default class AppTile extends React.Component { * @private * @returns {Promise<*>} Resolves when the widget is terminated, or timeout passed. */ - async _endWidgetActions() { // widget migration dev note: async to maintain signature + private async endWidgetActions(): Promise { // widget migration dev note: async to maintain signature // HACK: This is a really dirty way to ensure that Jitsi cleans up // its hold on the webcam. Without this, the widget holds a media // stream open, even after death. See https://github.com/vector-im/element-web/issues/7351 @@ -217,27 +274,27 @@ export default class AppTile extends React.Component { } // Delete the widget from the persisted store for good measure. - PersistedElement.destroyElement(this._persistKey); + PersistedElement.destroyElement(this.persistKey); ActiveWidgetStore.destroyPersistentWidget(this.props.app.id); - if (this._sgWidget) this._sgWidget.stop({ forceDestroy: true }); + if (this.sgWidget) this.sgWidget.stop({ forceDestroy: true }); } - _onWidgetPrepared = () => { + private onWidgetPrepared = (): void => { this.setState({ loading: false }); }; - _onWidgetReady = () => { + private onWidgetReady = (): void => { if (WidgetType.JITSI.matches(this.props.app.type)) { - this._sgWidget.widgetApi.transport.send(ElementWidgetActions.ClientReady, {}); + this.sgWidget.widgetApi.transport.send(ElementWidgetActions.ClientReady, {}); } }; - _onAction = payload => { + private onAction = (payload): void => { if (payload.widgetId === this.props.app.id) { switch (payload.action) { case 'm.sticker': - if (this._sgWidget.widgetApi.hasCapability(MatrixCapabilities.StickerSending)) { + if (this.sgWidget.widgetApi.hasCapability(MatrixCapabilities.StickerSending)) { dis.dispatch({ action: 'post_sticker_message', data: payload.data }); dis.dispatch({ action: 'stickerpicker_close' }); } else { @@ -248,7 +305,7 @@ export default class AppTile extends React.Component { } }; - _grantWidgetPermission = () => { + private grantWidgetPermission = (): void => { const roomId = this.props.room.roomId; console.info("Granting permission for widget to load: " + this.props.app.eventId); const current = SettingsStore.getValue("allowedWidgets", roomId); @@ -258,14 +315,14 @@ export default class AppTile extends React.Component { this.setState({ hasPermissionToLoad: true }); // Fetch a token for the integration manager, now that we're allowed to - this._startWidget(); + this.startWidget(); }).catch(err => { console.error(err); // We don't really need to do anything about this - the user will just hit the button again. }); }; - formatAppTileName() { + private formatAppTileName(): string { let appTileName = "No name"; if (this.props.app.name && this.props.app.name.trim()) { appTileName = this.props.app.name.trim(); @@ -278,11 +335,11 @@ export default class AppTile extends React.Component { * actual widget URL * @returns {bool} true If using a local version of the widget */ - _usingLocalWidget() { + private usingLocalWidget(): boolean { return WidgetType.JITSI.matches(this.props.app.type); } - _getTileTitle() { + private getTileTitle(): JSX.Element { const name = this.formatAppTileName(); const titleSpacer =  - ; let title = ''; @@ -300,32 +357,32 @@ export default class AppTile extends React.Component { } // TODO replace with full screen interactions - _onPopoutWidgetClick = () => { + private onPopoutWidgetClick = (): void => { // Ensure Jitsi conferences are closed on pop-out, to not confuse the user to join them // twice from the same computer, which Jitsi can have problems with (audio echo/gain-loop). if (WidgetType.JITSI.matches(this.props.app.type)) { - this._endWidgetActions().then(() => { + this.endWidgetActions().then(() => { if (this.iframe) { // Reload iframe - this.iframe.src = this._sgWidget.embedUrl; + this.iframe.src = this.sgWidget.embedUrl; } }); } // Using Object.assign workaround as the following opens in a new window instead of a new tab. // window.open(this._getPopoutUrl(), '_blank', 'noopener=yes'); Object.assign(document.createElement('a'), - { target: '_blank', href: this._sgWidget.popoutUrl, rel: 'noreferrer noopener' }).click(); + { target: '_blank', href: this.sgWidget.popoutUrl, rel: 'noreferrer noopener' }).click(); }; - _onContextMenuClick = () => { + private onContextMenuClick = (): void => { this.setState({ menuDisplayed: true }); }; - _closeContextMenu = () => { + private closeContextMenu = (): void => { this.setState({ menuDisplayed: false }); }; - render() { + public render(): JSX.Element { let appTileBody; // Note that there is advice saying allow-scripts shouldn't be used with allow-same-origin @@ -351,7 +408,7 @@ export default class AppTile extends React.Component {
); - if (this._sgWidget === null) { + if (this.sgWidget === null) { appTileBody = (
@@ -365,9 +422,9 @@ export default class AppTile extends React.Component {
); @@ -390,8 +447,8 @@ export default class AppTile extends React.Component { { this.state.loading && loadingElement }