From 43d9e30673255aa70167a24c8bca5c3121d09492 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Thu, 1 Jun 2023 15:17:28 +0000 Subject: [PATCH 01/54] Fix fadein spinner placement on AppTileBody (#10970) --- res/css/views/rooms/_AppsDrawer.pcss | 28 +++++++++---------- src/components/views/elements/AppTile.tsx | 2 +- .../__snapshots__/AppTile-test.tsx.snap | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/res/css/views/rooms/_AppsDrawer.pcss b/res/css/views/rooms/_AppsDrawer.pcss index 5ec32423f9e..1913ab799ca 100644 --- a/res/css/views/rooms/_AppsDrawer.pcss +++ b/res/css/views/rooms/_AppsDrawer.pcss @@ -266,6 +266,19 @@ limitations under the License. width: 100%; height: 100%; } + + /* const loadingElement */ + .mx_AppTileBody_fadeInSpinner { + /* place spinner and the message at the center of mx_AppTileBody */ + height: 100%; + width: 100%; + + font-weight: bold; /* message next to the spinner */ + animation-fill-mode: backwards; + animation-duration: 200ms; + animation-delay: 500ms; + animation-name: mx_AppTileBody_fadeInSpinnerAnimation; + } } .mx_AppTileBody { @@ -324,22 +337,9 @@ limitations under the License. iframe { display: none; } - - /* const loadingElement */ - .mx_AppTile_loading_fadeInSpinner { - animation-fill-mode: backwards; - animation-duration: 200ms; - animation-delay: 500ms; - animation-name: mx_AppTile_loading_fadeInSpinnerAnimation; - - .mx_Spinner { - position: absolute; - inset: 0; - } - } } -@keyframes mx_AppTile_loading_fadeInSpinnerAnimation { +@keyframes mx_AppTileBody_fadeInSpinnerAnimation { from { opacity: 0; } diff --git a/src/components/views/elements/AppTile.tsx b/src/components/views/elements/AppTile.tsx index 6f153a2b755..10cd8c40aa2 100644 --- a/src/components/views/elements/AppTile.tsx +++ b/src/components/views/elements/AppTile.tsx @@ -606,7 +606,7 @@ export default class AppTile extends React.Component { } const loadingElement = ( -
+
); diff --git a/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap b/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap index 4d8264b2275..95e1ce929aa 100644 --- a/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap +++ b/test/components/views/elements/__snapshots__/AppTile-test.tsx.snap @@ -46,7 +46,7 @@ exports[`AppTile destroys non-persisted right panel widget on room change 1`] = class="mx_AppTileBody mx_AppTile_loading" >
Date: Mon, 5 Jun 2023 15:32:11 +0200 Subject: [PATCH 02/54] Disabled sliding sync tests in failure (#11043) --- cypress/e2e/sliding-sync/sliding-sync.spec.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/cypress/e2e/sliding-sync/sliding-sync.spec.ts b/cypress/e2e/sliding-sync/sliding-sync.spec.ts index b7eccb77c62..ee9beafe143 100644 --- a/cypress/e2e/sliding-sync/sliding-sync.spec.ts +++ b/cypress/e2e/sliding-sync/sliding-sync.spec.ts @@ -100,7 +100,7 @@ describe("Sliding Sync", () => { }); }; - it("should render the Rooms list in reverse chronological order by default and allowing sorting A-Z", () => { + it.skip("should render the Rooms list in reverse chronological order by default and allowing sorting A-Z", () => { // create rooms and check room names are correct cy.createRoom({ name: "Apple" }).then(() => cy.findByRole("treeitem", { name: "Apple" })); cy.createRoom({ name: "Pineapple" }).then(() => cy.findByRole("treeitem", { name: "Pineapple" })); @@ -130,7 +130,7 @@ describe("Sliding Sync", () => { checkOrder(["Apple", "Orange", "Pineapple", "Test Room"]); }); - it("should move rooms around as new events arrive", () => { + it.skip("should move rooms around as new events arrive", () => { // create rooms and check room names are correct cy.createRoom({ name: "Apple" }) .as("roomA") @@ -156,7 +156,7 @@ describe("Sliding Sync", () => { checkOrder(["Pineapple", "Orange", "Apple", "Test Room"]); }); - it("should not move the selected room: it should be sticky", () => { + it.skip("should not move the selected room: it should be sticky", () => { // create rooms and check room names are correct cy.createRoom({ name: "Apple" }) .as("roomA") @@ -187,7 +187,7 @@ describe("Sliding Sync", () => { checkOrder(["Apple", "Orange", "Pineapple", "Test Room"]); }); - it("should show the right unread notifications", () => { + it.skip("should show the right unread notifications", () => { createAndJoinBob(); // send a message in the test room: unread notif count shoould increment @@ -214,7 +214,7 @@ describe("Sliding Sync", () => { cy.findByRole("treeitem", { name: "Test Room" }).should("not.have.class", "mx_NotificationBadge_count"); }); - it("should not show unread indicators", () => { + it.skip("should not show unread indicators", () => { // TODO: for now. Later we should. createAndJoinBob(); @@ -256,7 +256,7 @@ describe("Sliding Sync", () => { .should("exist"); }); - it("should show and be able to accept/reject/rescind invites", () => { + it.skip("should show and be able to accept/reject/rescind invites", () => { createAndJoinBob(); let clientUserId; @@ -372,7 +372,7 @@ describe("Sliding Sync", () => { // Regression test for a bug in SS mode, but would be useful to have in non-SS mode too. // This ensures we are setting RoomViewStore state correctly. - it("should clear the reply to field when swapping rooms", () => { + it.skip("should clear the reply to field when swapping rooms", () => { cy.createRoom({ name: "Other Room" }) .as("roomA") .then(() => cy.findByRole("treeitem", { name: "Other Room" })); @@ -406,7 +406,7 @@ describe("Sliding Sync", () => { }); // Regression test for https://github.com/vector-im/element-web/issues/21462 - it("should not cancel replies when permalinks are clicked", () => { + it.skip("should not cancel replies when permalinks are clicked", () => { cy.get("@roomId").then((roomId) => { // we require a first message as you cannot click the permalink text with the avatar in the way return cy @@ -449,7 +449,7 @@ describe("Sliding Sync", () => { cy.get(".mx_ReplyPreview").should("exist"); }); - it("should send unsubscribe_rooms for every room switch", () => { + it.skip("should send unsubscribe_rooms for every room switch", () => { let roomAId: string; let roomPId: string; // create rooms and check room names are correct From df4bc1ed2ae6ca0e0e0ab43f8cbffdd7ff2fb2f0 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 5 Jun 2023 14:53:11 +0100 Subject: [PATCH 03/54] Remove hardcoded servers from internationalisation (#11026) --- src/LegacyCallHandler.tsx | 12 +++++++----- .../settings/tabs/user/VoiceUserSettingsTab.tsx | 4 ++++ src/i18n/strings/en_EN.json | 6 +++--- src/settings/Settings.tsx | 3 +-- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/LegacyCallHandler.tsx b/src/LegacyCallHandler.tsx index 3dc7fcc4835..a8b464df43b 100644 --- a/src/LegacyCallHandler.tsx +++ b/src/LegacyCallHandler.tsx @@ -26,6 +26,7 @@ import { CallParty, CallState, CallType, + FALLBACK_ICE_SERVER, MatrixCall, } from "matrix-js-sdk/src/webrtc/call"; import { logger } from "matrix-js-sdk/src/logger"; @@ -825,7 +826,6 @@ export default class LegacyCallHandler extends EventEmitter { private showICEFallbackPrompt(): void { const cli = MatrixClientPeg.get(); - const code = (sub: string): JSX.Element => {sub}; Modal.createDialog( QuestionDialog, { @@ -838,22 +838,24 @@ export default class LegacyCallHandler extends EventEmitter { "(%(homeserverDomain)s) to configure a TURN server in " + "order for calls to work reliably.", { homeserverDomain: cli.getDomain() }, - { code }, + { code: (sub: string) => {sub} }, )}

{_t( "Alternatively, you can try to use the public server at " + - "turn.matrix.org, but this will not be as reliable, and " + + ", but this will not be as reliable, and " + "it will share your IP address with that server. You can also manage " + "this in Settings.", undefined, - { code }, + { server: () => {new URL(FALLBACK_ICE_SERVER).pathname} }, )}

), - button: _t("Try using turn.matrix.org"), + button: _t("Try using %(server)s", { + server: new URL(FALLBACK_ICE_SERVER).pathname, + }), cancelButton: _t("OK"), onFinished: (allow) => { SettingsStore.setValue("fallbackICEServerAllowed", null, SettingLevel.DEVICE, allow); diff --git a/src/components/views/settings/tabs/user/VoiceUserSettingsTab.tsx b/src/components/views/settings/tabs/user/VoiceUserSettingsTab.tsx index f70fdee33aa..b9ff171c4c8 100644 --- a/src/components/views/settings/tabs/user/VoiceUserSettingsTab.tsx +++ b/src/components/views/settings/tabs/user/VoiceUserSettingsTab.tsx @@ -17,6 +17,7 @@ limitations under the License. import React, { ReactNode } from "react"; import { logger } from "matrix-js-sdk/src/logger"; +import { FALLBACK_ICE_SERVER } from "matrix-js-sdk/src/webrtc/call"; import { _t } from "../../../../../languageHandler"; import MediaDeviceHandler, { IMediaDevices, MediaDeviceKindEnum } from "../../../../../MediaDeviceHandler"; @@ -225,6 +226,9 @@ export default class VoiceUserSettingsTab extends React.Component<{}, IState> { /> diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index f4e329696e0..ef4ca5c9cfb 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -75,8 +75,8 @@ "The call was answered on another device.": "The call was answered on another device.", "Call failed due to misconfigured server": "Call failed due to misconfigured server", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.", - "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.": "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.", - "Try using turn.matrix.org": "Try using turn.matrix.org", + "Alternatively, you can try to use the public server at , but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternatively, you can try to use the public server at , but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.", + "Try using %(server)s": "Try using %(server)s", "OK": "OK", "Unable to access microphone": "Unable to access microphone", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.", @@ -1046,7 +1046,6 @@ "Show hidden events in timeline": "Show hidden events in timeline", "Low bandwidth mode": "Low bandwidth mode", "Requires compatible homeserver.": "Requires compatible homeserver.", - "Allow fallback call assist server (turn.matrix.org)": "Allow fallback call assist server (turn.matrix.org)", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.", "Show previews/thumbnails for images": "Show previews/thumbnails for images", "Enable message search in encrypted rooms": "Enable message search in encrypted rooms", @@ -1668,6 +1667,7 @@ "Video settings": "Video settings", "Voice processing": "Voice processing", "Connection": "Connection", + "Allow fallback call assist server (%(server)s)": "Allow fallback call assist server (%(server)s)", "This room is not accessible by remote Matrix servers": "This room is not accessible by remote Matrix servers", "Warning: upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "Warning: upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.", "Upgrade this space to the recommended room version": "Upgrade this space to the recommended room version", diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx index 90cfe7e338d..74afc869264 100644 --- a/src/settings/Settings.tsx +++ b/src/settings/Settings.tsx @@ -880,9 +880,8 @@ export const SETTINGS: { [setting: string]: ISetting } = { }, "fallbackICEServerAllowed": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, - displayName: _td("Allow fallback call assist server (turn.matrix.org)"), description: _td( - "Only applies if your homeserver does not offer one. " + "Your IP address would be shared during a call.", + "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.", ), // This is a tri-state value, where `null` means "prompt the user". default: null, From 267188dbabcf36506af79d2bdba5a74d9403fed4 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 5 Jun 2023 14:53:30 +0100 Subject: [PATCH 04/54] Clear thread panel event permalink when changing rooms (#11024) To not get you stuck being constantly bounced to the middle of a thread --- src/stores/right-panel/RightPanelStore.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/stores/right-panel/RightPanelStore.ts b/src/stores/right-panel/RightPanelStore.ts index a4b37e226ca..942645b15f4 100644 --- a/src/stores/right-panel/RightPanelStore.ts +++ b/src/stores/right-panel/RightPanelStore.ts @@ -369,6 +369,13 @@ export default class RightPanelStore extends ReadyWatchingStore { ); } } + // when we're switching to a room, clear out thread permalinks to not get you stuck in the middle of the thread + // in order to fix https://github.com/matrix-org/matrix-react-sdk/pull/11011 + if (this.currentCard?.phase === RightPanelPhases.ThreadView) { + this.currentCard.state.initialEvent = undefined; + this.currentCard.state.isInitialEventHighlighted = undefined; + this.currentCard.state.initialEventScrollIntoView = undefined; + } // If the right panel stays open mode is used, and the panel was either // closed or never shown for that room, then force it open and display From 6b1c2e09f6a8527f7e9c5b3f8591ec17f6efb8aa Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Mon, 5 Jun 2023 13:58:25 +0000 Subject: [PATCH 05/54] Add general-room-settings-tab.spec.ts (#10997) --- .../general-room-settings-tab.spec.ts | 71 +++++++++++++++++++ .../tabs/room/GeneralRoomSettingsTab.tsx | 2 +- 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 cypress/e2e/settings/general-room-settings-tab.spec.ts diff --git a/cypress/e2e/settings/general-room-settings-tab.spec.ts b/cypress/e2e/settings/general-room-settings-tab.spec.ts new file mode 100644 index 00000000000..fce294e791f --- /dev/null +++ b/cypress/e2e/settings/general-room-settings-tab.spec.ts @@ -0,0 +1,71 @@ +/* +Copyright 2023 Suguru Hirahara + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/// + +import { HomeserverInstance } from "../../plugins/utils/homeserver"; + +describe("General room settings tab", () => { + let homeserver: HomeserverInstance; + const roomName = "Test Room"; + + beforeEach(() => { + cy.startHomeserver("default").then((data) => { + homeserver = data; + cy.initTestUser(homeserver, "Hanako"); + + cy.createRoom({ name: roomName }).viewRoomByName(roomName); + }); + }); + + afterEach(() => { + cy.stopHomeserver(homeserver); + }); + + it("should be rendered properly", () => { + cy.openRoomSettings("General"); + + // Assert that "Show less" details element is rendered + cy.findByText("Show less").should("exist"); + + cy.findByTestId("General").percySnapshotElement( + "Room settings tab - General (Local addresses details area expanded)", + { + // Emulate TabbedView's actual min and max widths + // 580: '.mx_UserSettingsDialog .mx_TabbedView' min-width + // 796: 1036 (mx_TabbedView_tabsOnLeft actual width) - 240 (mx_TabbedView_tabPanel margin-right) + widths: [580, 796], + }, + ); + + // Click the "Show less" details element + cy.findByText("Show less").click(); + + // Assert that "Show more" details element is rendered instead of "Show more" + cy.findByText("Show less").should("not.exist"); + cy.findByText("Show more").should("exist"); + + cy.findByTestId("General").percySnapshotElement( + "Room settings tab - General (Local addresses details area collapsed)", + { + // Emulate TabbedView's actual min and max widths + // 580: '.mx_UserSettingsDialog .mx_TabbedView' min-width + // 796: 1036 (mx_TabbedView_tabsOnLeft actual width) - 240 (mx_TabbedView_tabPanel margin-right) + widths: [580, 796], + }, + ); + }); +}); diff --git a/src/components/views/settings/tabs/room/GeneralRoomSettingsTab.tsx b/src/components/views/settings/tabs/room/GeneralRoomSettingsTab.tsx index fa5c65ab89c..a79a3fea56b 100644 --- a/src/components/views/settings/tabs/room/GeneralRoomSettingsTab.tsx +++ b/src/components/views/settings/tabs/room/GeneralRoomSettingsTab.tsx @@ -84,7 +84,7 @@ export default class GeneralRoomSettingsTab extends React.Component + From 1da43858f5b352623059b4c235f6630c86948cb5 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Mon, 5 Jun 2023 13:58:33 +0000 Subject: [PATCH 06/54] Update `timeline.spec.ts` - use Cypress Testing Library (#10721) * Update timeline.spec.ts - use Cypress Testing Library - findByText() for the room creation message Signed-off-by: Suguru Hirahara * Update timeline.spec.ts - use Cypress Testing Library Signed-off-by: Suguru Hirahara * Feedback Signed-off-by: Suguru Hirahara --------- Signed-off-by: Suguru Hirahara --- cypress/e2e/timeline/timeline.spec.ts | 141 ++++++++++++++------------ 1 file changed, 75 insertions(+), 66 deletions(-) diff --git a/cypress/e2e/timeline/timeline.spec.ts b/cypress/e2e/timeline/timeline.spec.ts index 8d9d8afbd29..da5be7d93aa 100644 --- a/cypress/e2e/timeline/timeline.spec.ts +++ b/cypress/e2e/timeline/timeline.spec.ts @@ -158,11 +158,11 @@ describe("Timeline", () => { it("should create and configure a room on IRC layout", () => { cy.visit("/#/room/" + roomId); cy.setSettingValue("layout", null, SettingLevel.DEVICE, Layout.IRC); - cy.contains( - ".mx_RoomView_body .mx_GenericEventListSummary[data-layout=irc] " + - ".mx_GenericEventListSummary_summary", - "created and configured the room.", - ).should("exist"); + cy.get(".mx_RoomView_body .mx_GenericEventListSummary[data-layout='irc']").within(() => { + cy.get(".mx_GenericEventListSummary_summary") + .findByText(OLD_NAME + " created and configured the room.") + .should("exist"); + }); cy.get(".mx_IRCLayout").within(() => { // Check room name line-height is reset @@ -190,10 +190,11 @@ describe("Timeline", () => { cy.setSettingValue("layout", null, SettingLevel.DEVICE, Layout.IRC); // Wait until configuration is finished - cy.contains( - ".mx_RoomView_body .mx_GenericEventListSummary .mx_GenericEventListSummary_summary", - "created and configured the room.", - ).should("exist"); + cy.get(".mx_RoomView_body .mx_GenericEventListSummary[data-layout='irc']").within(() => { + cy.get(".mx_GenericEventListSummary_summary") + .findByText(OLD_NAME + " created and configured the room.") + .should("exist"); + }); cy.get(".mx_GenericEventListSummary").within(() => { // Click "expand" link button @@ -225,10 +226,9 @@ describe("Timeline", () => { ); // Wait until configuration is finished - cy.contains( - ".mx_RoomView_body .mx_GenericEventListSummary .mx_GenericEventListSummary_summary", - "created and configured the room.", - ).should("exist"); + cy.get(".mx_RoomView_body .mx_GenericEventListSummary[data-layout='group']") + .findByText(OLD_NAME + " created and configured the room.") + .should("exist"); cy.get(".mx_GenericEventListSummary").within(() => { // Click "expand" link button @@ -254,11 +254,11 @@ describe("Timeline", () => { cy.visit("/#/room/" + roomId); cy.setSettingValue("layout", null, SettingLevel.DEVICE, Layout.Bubble); - cy.contains( - ".mx_RoomView_body .mx_GenericEventListSummary[data-layout=bubble] " + - ".mx_GenericEventListSummary_summary", - "created and configured the room.", - ).should("exist"); + cy.get(".mx_RoomView_body .mx_GenericEventListSummary[data-layout='bubble']").within(() => { + cy.get(".mx_GenericEventListSummary_summary") + .findByText(OLD_NAME + " created and configured the room.") + .should("exist"); + }); cy.get(".mx_GenericEventListSummary").within(() => { // Click "expand" link button @@ -300,10 +300,11 @@ describe("Timeline", () => { cy.setSettingValue("layout", null, SettingLevel.DEVICE, Layout.IRC); // Wait until configuration is finished - cy.contains( - ".mx_RoomView_body .mx_GenericEventListSummary " + ".mx_GenericEventListSummary_summary", - "created and configured the room.", - ).should("exist"); + cy.get(".mx_RoomView_body .mx_GenericEventListSummary[data-layout='irc']").within(() => { + cy.get(".mx_GenericEventListSummary_summary") + .findByText(OLD_NAME + " created and configured the room.") + .should("exist"); + }); // Click "expand" link button cy.get(".mx_GenericEventListSummary").findByRole("button", { name: "expand" }).click(); @@ -333,13 +334,18 @@ describe("Timeline", () => { }); const messageEdit = () => { - cy.contains(".mx_RoomView_body .mx_EventTile .mx_EventTile_line", "Message") + cy.contains(".mx_EventTile .mx_EventTile_line", "Message") .realHover() - .within(() => { - cy.findByRole("button", { name: "Edit" }).click(); - cy.get(".mx_BasicMessageComposer_input").type("Edit{enter}"); - }); - cy.contains(".mx_RoomView_body .mx_EventTile[data-scroll-tokens]", "MessageEdit").should("exist"); + .findByRole("toolbar", { name: "Message Actions" }) + .findByRole("button", { name: "Edit" }) + .click(); + cy.findByRole("textbox", { name: "Edit message" }).type("Edit{enter}"); + + // Assert that the edited message and the link button are found + cy.contains(".mx_EventTile .mx_EventTile_line", "MessageEdit").within(() => { + // Regex patterns due to the edited date + cy.findByRole("button", { name: /Edited at .*? Click to view edits./ }); + }); }; it("should align generic event list summary with messages and emote on IRC layout", () => { @@ -356,14 +362,16 @@ describe("Timeline", () => { cy.setSettingValue("layout", null, SettingLevel.DEVICE, Layout.IRC); // Wait until configuration is finished - cy.contains( - ".mx_RoomView_body .mx_GenericEventListSummary .mx_GenericEventListSummary_summary", - "created and configured the room.", - ).should("exist"); + cy.get(".mx_GenericEventListSummary_summary").within(() => { + cy.findByText(OLD_NAME + " created and configured the room.").should("exist"); + }); // Send messages - cy.get(".mx_RoomView_body .mx_BasicMessageComposer_input").type("Hello Mr. Bot{enter}"); - cy.get(".mx_RoomView_body .mx_BasicMessageComposer_input").type("Hello again, Mr. Bot{enter}"); + cy.get(".mx_RoomView_body").within(() => { + cy.findByRole("textbox", { name: "Send a message…" }).type("Hello Mr. Bot{enter}"); + cy.findByRole("textbox", { name: "Send a message…" }).type("Hello again, Mr. Bot{enter}"); + }); + // Make sure the second message was sent cy.get(".mx_RoomView_MessageList > .mx_EventTile_last .mx_EventTile_receiptSent").should("be.visible"); @@ -428,7 +436,9 @@ describe("Timeline", () => { // 4. Alignment of expanded GELS, placeholder of deleted message, and emote // Send a emote - cy.get(".mx_RoomView_body .mx_BasicMessageComposer_input").type("/me says hello to Mr. Bot{enter}"); + cy.get(".mx_RoomView_body").within(() => { + cy.findByRole("textbox", { name: "Send a message…" }).type("/me says hello to Mr. Bot{enter}"); + }); // Check inline start margin of its avatar // Here --right-padding is for the avatar on the message line // See: _IRCLayout.pcss @@ -467,10 +477,9 @@ describe("Timeline", () => { cy.setSettingValue("layout", null, SettingLevel.DEVICE, Layout.IRC); // Wait until configuration is finished - cy.contains( - ".mx_RoomView_body .mx_GenericEventListSummary[data-layout=irc] .mx_GenericEventListSummary_summary", - "created and configured the room.", - ).should("exist"); + cy.get(".mx_GenericEventListSummary_summary").within(() => { + cy.findByText(OLD_NAME + " created and configured the room.").should("exist"); + }); cy.get(".mx_RoomView_body[data-layout=irc]").within(() => { // Ensure CSS declarations which cannot be detected with a screenshot test are applied as expected @@ -571,10 +580,9 @@ describe("Timeline", () => { sendEvent(roomId); cy.visit("/#/room/" + roomId); cy.setSettingValue("showHiddenEventsInTimeline", null, SettingLevel.DEVICE, true); - cy.contains( - ".mx_RoomView_body .mx_GenericEventListSummary .mx_GenericEventListSummary_summary", - "created and configured the room.", - ).should("exist"); + cy.get(".mx_GenericEventListSummary_summary").within(() => { + cy.findByText(OLD_NAME + " created and configured the room.").should("exist"); + }); // Edit message messageEdit(); @@ -621,10 +629,9 @@ describe("Timeline", () => { sendEvent(roomId); cy.visit("/#/room/" + roomId); cy.setSettingValue("showHiddenEventsInTimeline", null, SettingLevel.DEVICE, true); - cy.contains( - ".mx_RoomView_body .mx_GenericEventListSummary " + ".mx_GenericEventListSummary_summary", - "created and configured the room.", - ).should("exist"); + cy.get(".mx_GenericEventListSummary_summary").within(() => { + cy.findByText(OLD_NAME + " created and configured the room.").should("exist"); + }); // Edit message messageEdit(); @@ -704,7 +711,10 @@ describe("Timeline", () => { // Assert that the file size is displayed in kibibytes (1024 bytes), not kilobytes (1000 bytes) // See: https://github.com/vector-im/element-web/issues/24866 cy.get(".mx_EventTile_last").within(() => { - cy.contains(".mx_MFileBody_info_filename", "1.12 KB").should("exist"); // actual file size in kibibytes + // actual file size in kibibytes + cy.get(".mx_MFileBody_info_filename") + .findByText(/1.12 KB/) + .should("exist"); }); }); @@ -720,7 +730,7 @@ describe("Timeline", () => { widths: [320, 640], }); - cy.get(".mx_SearchBar_input input").type("Message{enter}"); + cy.get(".mx_SearchBar_input").findByRole("textbox").type("Message{enter}"); cy.get(".mx_EventTile:not(.mx_EventTile_contextual) .mx_EventTile_searchHighlight").should("exist"); cy.get(".mx_RoomView_searchResultsPanel").percySnapshotElement("Highlighted search results"); @@ -756,7 +766,7 @@ describe("Timeline", () => { }); cy.visit("/#/room/" + roomId); - cy.get(".mx_LinkPreviewWidget").should("exist").should("contain.text", "Element Call"); + cy.get(".mx_LinkPreviewWidget").should("exist").findByText("Element Call"); cy.wait("@preview_url"); cy.wait("@mxc"); @@ -783,11 +793,13 @@ describe("Timeline", () => { cy.getComposer().type(`${MESSAGE}{enter}`); // Reply to the message - cy.contains(".mx_RoomView_body .mx_EventTile_line", "Hello world") - .realHover() + cy.get(".mx_EventTile_last") .within(() => { - cy.findByRole("button", { name: "Reply" }).click(); - }); + cy.findByText(MESSAGE); + }) + .realHover() + .findByRole("button", { name: "Reply" }) + .click(); }; // For clicking the reply button on the last line @@ -862,10 +874,9 @@ describe("Timeline", () => { cy.visit("/#/room/" + roomId); // Wait until configuration is finished - cy.contains( - ".mx_RoomView_body .mx_GenericEventListSummary .mx_GenericEventListSummary_summary", - "created and configured the room.", - ).should("exist"); + cy.get(".mx_GenericEventListSummary_summary").within(() => { + cy.findByText(OLD_NAME + " created and configured the room.").should("exist"); + }); // Create a bot "BotBob" and invite it cy.getBot(homeserver, { @@ -877,10 +888,9 @@ describe("Timeline", () => { bot.joinRoom(roomId); // Make sure the bot joined the room - cy.contains( - ".mx_GenericEventListSummary .mx_EventTile_info.mx_EventTile_last", - "BotBob joined the room", - ).should("exist"); + cy.get(".mx_GenericEventListSummary .mx_EventTile_info.mx_EventTile_last").within(() => { + cy.findByText("BotBob joined the room").should("exist"); + }); // Have bot send MESSAGE to roomId cy.botSendMessage(bot, roomId, MESSAGE); @@ -982,10 +992,9 @@ describe("Timeline", () => { }); // Wait until configuration is finished - cy.contains( - ".mx_RoomView_body .mx_GenericEventListSummary .mx_GenericEventListSummary_summary", - "created and configured the room.", - ).should("exist"); + cy.get(".mx_GenericEventListSummary_summary").within(() => { + cy.findByText(OLD_NAME + " created and configured the room.").should("exist"); + }); // Set the display name to "LONG_STRING 2" in order to avoid a warning in Percy tests from being triggered // due to the generated random mxid being displayed inside the GELS summary. From 6ed81dc1a5d0af52853b0de4c633bd89e2949b58 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Mon, 5 Jun 2023 14:37:28 +0000 Subject: [PATCH 07/54] Create left-panel.spec.ts (#11040) --- cypress/e2e/left-panel/left-panel.spec.ts | 42 +++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 cypress/e2e/left-panel/left-panel.spec.ts diff --git a/cypress/e2e/left-panel/left-panel.spec.ts b/cypress/e2e/left-panel/left-panel.spec.ts new file mode 100644 index 00000000000..232cffe9cc1 --- /dev/null +++ b/cypress/e2e/left-panel/left-panel.spec.ts @@ -0,0 +1,42 @@ +/* +Copyright 2023 Suguru Hirahara + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/// + +import { HomeserverInstance } from "../../plugins/utils/homeserver"; + +describe("LeftPanel", () => { + let homeserver: HomeserverInstance; + + beforeEach(() => { + cy.startHomeserver("default").then((data) => { + homeserver = data; + + cy.initTestUser(homeserver, "Hanako"); + }); + }); + + afterEach(() => { + cy.stopHomeserver(homeserver); + }); + + it("should render the Rooms list", () => { + // create rooms and check room names are correct + cy.createRoom({ name: "Apple" }).then(() => cy.findByRole("treeitem", { name: "Apple" })); + cy.createRoom({ name: "Pineapple" }).then(() => cy.findByRole("treeitem", { name: "Pineapple" })); + cy.createRoom({ name: "Orange" }).then(() => cy.findByRole("treeitem", { name: "Orange" })); + }); +}); From c47b5872259cc51c9a0969669e0f37f264f3b8e3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 5 Jun 2023 15:39:46 +0100 Subject: [PATCH 08/54] Switch from grapheme-splitter to graphemer (#11037) --- package.json | 2 +- src/HtmlUtils.tsx | 2 +- src/editor/parts.ts | 2 +- src/utils/strings.ts | 2 +- yarn.lock | 5 +++++ 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index b9a364044c6..6f1ca838604 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "focus-visible": "^5.2.0", "gfm.css": "^1.1.2", "glob-to-regexp": "^0.4.1", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "highlight.js": "^11.3.1", "html-entities": "^2.0.0", "is-ip": "^3.1.0", diff --git a/src/HtmlUtils.tsx b/src/HtmlUtils.tsx index 866c1d0a0c3..89e9d76629a 100644 --- a/src/HtmlUtils.tsx +++ b/src/HtmlUtils.tsx @@ -28,7 +28,7 @@ import { IContent } from "matrix-js-sdk/src/models/event"; import { Optional } from "matrix-events-sdk"; import _Linkify from "linkify-react"; import escapeHtml from "escape-html"; -import GraphemeSplitter from "grapheme-splitter"; +import GraphemeSplitter from "graphemer"; import { _linkifyElement, diff --git a/src/editor/parts.ts b/src/editor/parts.ts index 93d79fdf059..4483d04a623 100644 --- a/src/editor/parts.ts +++ b/src/editor/parts.ts @@ -19,7 +19,7 @@ import EMOJIBASE_REGEX from "emojibase-regex"; import { MatrixClient } from "matrix-js-sdk/src/client"; import { RoomMember } from "matrix-js-sdk/src/models/room-member"; import { Room } from "matrix-js-sdk/src/models/room"; -import GraphemeSplitter from "grapheme-splitter"; +import GraphemeSplitter from "graphemer"; import AutocompleteWrapperModel, { GetAutocompleterComponent, UpdateCallback, UpdateQuery } from "./autocomplete"; import { unicodeToShortcode } from "../HtmlUtils"; diff --git a/src/utils/strings.ts b/src/utils/strings.ts index 584b4204c98..53039cdc8f4 100644 --- a/src/utils/strings.ts +++ b/src/utils/strings.ts @@ -21,7 +21,7 @@ limitations under the License. * @param text the plaintext to put in the user's clipboard */ import { logger } from "matrix-js-sdk/src/logger"; -import GraphemeSplitter from "grapheme-splitter"; +import GraphemeSplitter from "graphemer"; export async function copyPlaintext(text: string): Promise { try { diff --git a/yarn.lock b/yarn.lock index 83ddd17778f..5037e0bb6ff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4937,6 +4937,11 @@ grapheme-splitter@^1.0.4: resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" From 6b46d6e4f80e7dd5c2564aa6fc0ffc36e29efeeb Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Mon, 5 Jun 2023 18:12:23 +0100 Subject: [PATCH 09/54] Add MatrixClientPeg::safeGet and use it in tests (#10985) --- src/MatrixClientPeg.ts | 36 +++++++-- src/Notifier.ts | 4 +- src/TextForEvent.tsx | 79 ++++++++++++------- src/components/structures/MessagePanel.tsx | 2 +- .../views/messages/MPollEndBody.tsx | 5 +- .../views/messages/TextualEvent.tsx | 8 +- src/events/EventTileFactory.tsx | 4 +- src/i18n/strings/en_EN.json | 1 + src/utils/exportUtils/HtmlExport.tsx | 2 +- src/utils/exportUtils/PlainTextExport.ts | 2 +- .../textForVoiceBroadcastStoppedEvent.tsx | 4 +- test/LegacyCallHandler-test.ts | 60 +++++++------- test/MatrixClientPeg-test.ts | 26 +++--- test/MediaDeviceHandler-test.ts | 2 +- test/TextForEvent-test.ts | 60 +++++++------- test/Unread-test.ts | 2 +- test/autocomplete/EmojiProvider-test.ts | 2 +- .../structures/LegacyCallEventGrouper-test.ts | 2 +- .../structures/PipContainer-test.tsx | 2 +- .../components/structures/RightPanel-test.tsx | 2 +- .../structures/RoomSearchView-test.tsx | 2 +- .../structures/RoomStatusBar-test.tsx | 2 +- test/components/structures/RoomView-test.tsx | 2 +- .../structures/SpaceHierarchy-test.tsx | 6 +- .../structures/ThreadPanel-test.tsx | 2 +- .../components/structures/ThreadView-test.tsx | 2 +- .../structures/TimelinePanel-test.tsx | 8 +- .../views/avatars/MemberAvatar-test.tsx | 2 +- .../views/beacon/RoomCallBanner-test.tsx | 2 +- .../context_menus/MessageContextMenu-test.tsx | 8 +- .../context_menus/RoomContextMenu-test.tsx | 2 +- .../RoomGeneralContextMenu-test.tsx | 2 +- .../ThreadListContextMenu-test.tsx | 2 +- .../views/dialogs/DevtoolsDialog-test.tsx | 2 +- .../views/dialogs/SpotlightDialog-test.tsx | 2 +- .../devtools/RoomNotifications-test.tsx | 2 +- .../views/elements/AppTile-test.tsx | 2 +- .../views/elements/PollCreateDialog-test.tsx | 2 +- .../views/messages/CallEvent-test.tsx | 2 +- .../messages/RoomPredecessorTile-test.tsx | 6 +- .../right_panel/PinnedMessagesCard-test.tsx | 2 +- .../right_panel/RoomHeaderButtons-test.tsx | 2 +- .../views/rooms/BasicMessageComposer-test.tsx | 2 +- .../components/views/rooms/EventTile-test.tsx | 2 +- .../views/rooms/MemberList-test.tsx | 2 +- .../views/rooms/MessageComposer-test.tsx | 4 +- .../views/rooms/RoomHeader-test.tsx | 4 +- test/components/views/rooms/RoomList-test.tsx | 2 +- .../views/rooms/RoomListHeader-test.tsx | 2 +- .../views/rooms/RoomPreviewBar-test.tsx | 28 +++---- .../views/rooms/RoomPreviewCard-test.tsx | 2 +- .../views/rooms/SearchResultTile-test.tsx | 2 +- .../rooms/VoiceRecordComposerTile-test.tsx | 1 + .../views/settings/CryptographyPanel-test.tsx | 2 +- .../room/AdvancedRoomSettingsTab-test.tsx | 2 +- .../room/NotificationSettingsTab-test.tsx | 2 +- .../tabs/room/RolesRoomSettingsTab-test.tsx | 2 +- .../tabs/room/VoipRoomSettingsTab-test.tsx | 2 +- .../user/PreferencesUserSettingsTab-test.tsx | 2 +- .../SpaceSettingsVisibilityTab-test.tsx | 1 + .../views/spaces/SpaceTreeLevel-test.tsx | 4 +- test/components/views/voip/CallView-test.tsx | 2 +- test/createRoom-test.ts | 2 +- test/hooks/useProfileInfo-test.tsx | 2 +- test/hooks/usePublicRoomDirectory-test.tsx | 2 +- test/hooks/useUserDirectory-test.tsx | 2 +- test/models/Call-test.ts | 2 +- .../handlers/DeviceSettingsHandler-test.ts | 1 + test/stores/SpaceStore-test.ts | 2 +- .../right-panel/RightPanelStore-test.ts | 2 +- test/stores/room-list/SpaceWatcher-test.ts | 2 +- .../room-list/algorithms/Algorithm-test.ts | 2 +- .../algorithms/RecentAlgorithm-test.ts | 2 +- .../previews/ReactionEventPreview-test.ts | 4 +- test/stores/widgets/StopGapWidget-test.ts | 2 +- .../widgets/StopGapWidgetDriver-test.ts | 2 +- test/test-utils/client.ts | 6 +- test/test-utils/test-utils.ts | 8 +- test/test-utils/wrappers.tsx | 2 +- test/toasts/IncomingCallToast-test.tsx | 2 +- test/useTopic-test.tsx | 2 +- test/utils/EventUtils-test.ts | 2 +- test/utils/MultiInviter-test.ts | 2 +- test/utils/export-test.tsx | 2 +- test/utils/leave-behaviour-test.ts | 2 +- test/utils/notifications-test.ts | 4 +- test/utils/pillify-test.tsx | 14 ++-- ...textForVoiceBroadcastStoppedEvent-test.tsx | 2 +- 88 files changed, 290 insertions(+), 226 deletions(-) diff --git a/src/MatrixClientPeg.ts b/src/MatrixClientPeg.ts index c318f5e4d00..2f965bb0b8e 100644 --- a/src/MatrixClientPeg.ts +++ b/src/MatrixClientPeg.ts @@ -38,7 +38,7 @@ import { crossSigningCallbacks, tryToUnlockSecretStorageWithDehydrationKey } fro import SecurityCustomisations from "./customisations/Security"; import { SlidingSyncManager } from "./SlidingSyncManager"; import CryptoStoreTooNewDialog from "./components/views/dialogs/CryptoStoreTooNewDialog"; -import { _t } from "./languageHandler"; +import { _t, UserFriendlyError } from "./languageHandler"; import { SettingLevel } from "./settings/SettingLevel"; import MatrixClientBackedController from "./settings/controllers/MatrixClientBackedController"; import ErrorDialog from "./components/views/dialogs/ErrorDialog"; @@ -49,7 +49,7 @@ export interface IMatrixClientCreds { identityServerUrl?: string; userId: string; deviceId?: string; - accessToken: string; + accessToken?: string; guest?: boolean; pickleKey?: string; freshLogin?: boolean; @@ -71,9 +71,10 @@ export interface IMatrixClientPeg { * * @returns {string} The homeserver name, if present. */ - getHomeserverName(): string; + getHomeserverName(): string | null; get(): MatrixClient; + safeGet(): MatrixClient; unset(): void; assign(): Promise; start(): Promise; @@ -134,7 +135,7 @@ class MatrixClientPegClass implements IMatrixClientPeg { initialSyncLimit: 20, }; - private matrixClient: MatrixClient = null; + private matrixClient: MatrixClient | null = null; private justRegisteredUserId: string | null = null; // the credentials used to init the current client object. @@ -145,6 +146,13 @@ class MatrixClientPegClass implements IMatrixClientPeg { return this.matrixClient; } + public safeGet(): MatrixClient { + if (!this.matrixClient) { + throw new UserFriendlyError("User is not logged in"); + } + return this.matrixClient; + } + public unset(): void { this.matrixClient = null; @@ -215,6 +223,10 @@ class MatrixClientPegClass implements IMatrixClientPeg { }; public async assign(): Promise { + if (!this.matrixClient) { + throw new Error("createClient must be called first"); + } + for (const dbType of ["indexeddb", "memory"]) { try { const promise = this.matrixClient.store.startup(); @@ -275,6 +287,10 @@ class MatrixClientPegClass implements IMatrixClientPeg { * Attempt to initialize the crypto layer on a newly-created MatrixClient */ private async initClientCrypto(): Promise { + if (!this.matrixClient) { + throw new Error("createClient must be called first"); + } + const useRustCrypto = SettingsStore.getValue("feature_rust_crypto"); // we want to make sure that the same crypto implementation is used throughout the lifetime of a device, @@ -317,11 +333,15 @@ class MatrixClientPegClass implements IMatrixClientPeg { const opts = await this.assign(); logger.log(`MatrixClientPeg: really starting MatrixClient`); - await this.get().startClient(opts); + await this.matrixClient!.startClient(opts); logger.log(`MatrixClientPeg: MatrixClient started`); } public getCredentials(): IMatrixClientCreds { + if (!this.matrixClient) { + throw new Error("createClient must be called first"); + } + let copiedCredentials: IMatrixClientCreds | null = this.currentClientCreds; if (this.currentClientCreds?.userId !== this.matrixClient?.credentials?.userId) { // cached credentials belong to a different user - don't use them @@ -335,12 +355,14 @@ class MatrixClientPegClass implements IMatrixClientPeg { identityServerUrl: this.matrixClient.idBaseUrl, userId: this.matrixClient.getSafeUserId(), deviceId: this.matrixClient.getDeviceId() ?? undefined, - accessToken: this.matrixClient.getAccessToken(), + accessToken: this.matrixClient.getAccessToken() ?? undefined, guest: this.matrixClient.isGuest(), }; } - public getHomeserverName(): string { + public getHomeserverName(): string | null { + if (!this.matrixClient) return null; + const matches = /^@[^:]+:(.+)$/.exec(this.matrixClient.getSafeUserId()); if (matches === null || matches.length < 1) { throw new Error("Failed to derive homeserver name from user ID!"); diff --git a/src/Notifier.ts b/src/Notifier.ts index 96abb960ad9..4a36338729e 100644 --- a/src/Notifier.ts +++ b/src/Notifier.ts @@ -91,7 +91,7 @@ const msgTypeHandlers: Record string | null> = { return null; } - return TextForEvent.textForEvent(event); + return TextForEvent.textForEvent(event, MatrixClientPeg.get()); }, }; @@ -111,7 +111,7 @@ class NotifierClass { if (msgType && msgTypeHandlers.hasOwnProperty(msgType)) { return msgTypeHandlers[msgType](ev); } - return TextForEvent.textForEvent(ev); + return TextForEvent.textForEvent(ev, MatrixClientPeg.get()); } // XXX: exported for tests diff --git a/src/TextForEvent.tsx b/src/TextForEvent.tsx index f73a525e01a..746436a9e32 100644 --- a/src/TextForEvent.tsx +++ b/src/TextForEvent.tsx @@ -22,6 +22,7 @@ import { GuestAccess, HistoryVisibility, JoinRule } from "matrix-js-sdk/src/@typ import { EventType, MsgType } from "matrix-js-sdk/src/@types/event"; import { M_POLL_START, M_POLL_END } from "matrix-js-sdk/src/@types/polls"; import { PollStartEvent } from "matrix-js-sdk/src/extensible_events_v1/PollStartEvent"; +import { MatrixClient } from "matrix-js-sdk/src/matrix"; import { _t } from "./languageHandler"; import * as Roles from "./Roles"; @@ -31,7 +32,6 @@ import { ALL_RULE_TYPES, ROOM_RULE_TYPES, SERVER_RULE_TYPES, USER_RULE_TYPES } f import { WIDGET_LAYOUT_EVENT_TYPE } from "./stores/widgets/WidgetLayoutStore"; import { RightPanelPhases } from "./stores/right-panel/RightPanelStorePhases"; import defaultDispatcher from "./dispatcher/dispatcher"; -import { MatrixClientPeg } from "./MatrixClientPeg"; import { RoomSettingsTab } from "./components/views/dialogs/RoomSettingsDialog"; import AccessibleButton, { ButtonEvent } from "./components/views/elements/AccessibleButton"; import RightPanelStore from "./stores/right-panel/RightPanelStore"; @@ -40,16 +40,15 @@ import { ElementCall } from "./models/Call"; import { textForVoiceBroadcastStoppedEvent, VoiceBroadcastInfoEventType } from "./voice-broadcast"; import { getSenderName } from "./utils/event/getSenderName"; -function getRoomMemberDisplayname(event: MatrixEvent, userId = event.getSender()): string { - const client = MatrixClientPeg.get(); +function getRoomMemberDisplayname(client: MatrixClient, event: MatrixEvent, userId = event.getSender()): string { const roomId = event.getRoomId(); const member = client.getRoom(roomId)?.getMember(userId!); return member?.name || member?.rawDisplayName || userId || _t("Someone"); } -function textForCallEvent(event: MatrixEvent): () => string { - const roomName = MatrixClientPeg.get().getRoom(event.getRoomId()!)?.name; - const isSupported = MatrixClientPeg.get().supportsVoip(); +function textForCallEvent(event: MatrixEvent, client: MatrixClient): () => string { + const roomName = client.getRoom(event.getRoomId()!)?.name; + const isSupported = client.supportsVoip(); return isSupported ? () => _t("Video call started in %(roomName)s.", { roomName }) @@ -60,11 +59,11 @@ function textForCallEvent(event: MatrixEvent): () => string { // any text to display at all. For this reason they return deferred values // to avoid the expense of looking up translations when they're not needed. -function textForCallInviteEvent(event: MatrixEvent): (() => string) | null { +function textForCallInviteEvent(event: MatrixEvent, client: MatrixClient): (() => string) | null { const senderName = getSenderName(event); // FIXME: Find a better way to determine this from the event? const isVoice = !event.getContent().offer?.sdp?.includes("m=video"); - const isSupported = MatrixClientPeg.get().supportsVoip(); + const isSupported = client.supportsVoip(); // This ladder could be reduced down to a couple string variables, however other languages // can have a hard time translating those strings. In an effort to make translations easier @@ -103,10 +102,15 @@ function getModification(prev?: string, value?: string): Modification { return Modification.None; } -function textForMemberEvent(ev: MatrixEvent, allowJSX: boolean, showHiddenEvents?: boolean): (() => string) | null { +function textForMemberEvent( + ev: MatrixEvent, + client: MatrixClient, + allowJSX: boolean, + showHiddenEvents?: boolean, +): (() => string) | null { // XXX: SYJS-16 "sender is sometimes null for join messages" - const senderName = ev.sender?.name || getRoomMemberDisplayname(ev); - const targetName = ev.target?.name || getRoomMemberDisplayname(ev, ev.getStateKey()); + const senderName = ev.sender?.name || getRoomMemberDisplayname(client, ev); + const targetName = ev.target?.name || getRoomMemberDisplayname(client, ev, ev.getStateKey()); const prevContent = ev.getPrevContent(); const content = ev.getContent(); const reason = content.reason; @@ -269,7 +273,7 @@ const onViewJoinRuleSettingsClick = (): void => { }); }; -function textForJoinRulesEvent(ev: MatrixEvent, allowJSX: boolean): () => Renderable { +function textForJoinRulesEvent(ev: MatrixEvent, client: MatrixClient, allowJSX: boolean): () => Renderable { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); switch (ev.getContent().join_rule) { case JoinRule.Public: @@ -361,7 +365,7 @@ function textForServerACLEvent(ev: MatrixEvent): (() => string) | null { return getText; } -function textForMessageEvent(ev: MatrixEvent): (() => string) | null { +function textForMessageEvent(ev: MatrixEvent, client: MatrixClient): (() => string) | null { if (isLocationEvent(ev)) { return textForLocationEvent(ev); } @@ -370,7 +374,7 @@ function textForMessageEvent(ev: MatrixEvent): (() => string) | null { const senderDisplayName = ev.sender && ev.sender.name ? ev.sender.name : ev.getSender(); let message = ev.getContent().body; if (ev.isRedacted()) { - message = textForRedactedPollAndMessageEvent(ev); + message = textForRedactedPollAndMessageEvent(ev, client); } if (ev.getContent().msgtype === MsgType.Emote) { @@ -496,7 +500,7 @@ function textForHistoryVisibilityEvent(event: MatrixEvent): (() => string) | nul } // Currently will only display a change if a user's power level is changed -function textForPowerEvent(event: MatrixEvent): (() => string) | null { +function textForPowerEvent(event: MatrixEvent, client: MatrixClient): (() => string) | null { const senderName = getSenderName(event); if (!event.getPrevContent()?.users || !event.getContent()?.users) { return null; @@ -533,7 +537,7 @@ function textForPowerEvent(event: MatrixEvent): (() => string) | null { return; } if (to !== from) { - const name = getRoomMemberDisplayname(event, userId); + const name = getRoomMemberDisplayname(client, event, userId); diffs.push({ userId, name, from, to }); } }); @@ -561,7 +565,7 @@ const onPinnedMessagesClick = (): void => { RightPanelStore.instance.setCard({ phase: RightPanelPhases.PinnedMessages }, false); }; -function textForPinnedEvent(event: MatrixEvent, allowJSX: boolean): (() => Renderable) | null { +function textForPinnedEvent(event: MatrixEvent, client: MatrixClient, allowJSX: boolean): (() => Renderable) | null { if (!SettingsStore.getValue("feature_pinning")) return null; const senderName = getSenderName(event); const roomId = event.getRoomId()!; @@ -835,12 +839,12 @@ export function textForLocationEvent(event: MatrixEvent): () => string { }); } -function textForRedactedPollAndMessageEvent(ev: MatrixEvent): string { +function textForRedactedPollAndMessageEvent(ev: MatrixEvent, client: MatrixClient): string { let message = _t("Message deleted"); const unsigned = ev.getUnsigned(); const redactedBecauseUserId = unsigned?.redacted_because?.sender; if (redactedBecauseUserId && redactedBecauseUserId !== ev.getSender()) { - const room = MatrixClientPeg.get().getRoom(ev.getRoomId()); + const room = client.getRoom(ev.getRoomId()); const sender = room?.getMember(redactedBecauseUserId); message = _t("Message deleted by %(name)s", { name: sender?.name || redactedBecauseUserId, @@ -850,12 +854,12 @@ function textForRedactedPollAndMessageEvent(ev: MatrixEvent): string { return message; } -function textForPollStartEvent(event: MatrixEvent): (() => string) | null { +function textForPollStartEvent(event: MatrixEvent, client: MatrixClient): (() => string) | null { return () => { let message = ""; if (event.isRedacted()) { - message = textForRedactedPollAndMessageEvent(event); + message = textForRedactedPollAndMessageEvent(event, client); const senderDisplayName = event.sender?.name ?? event.getSender(); message = senderDisplayName + ": " + message; } else { @@ -879,7 +883,12 @@ function textForPollEndEvent(event: MatrixEvent): (() => string) | null { type Renderable = string | React.ReactNode | null; interface IHandlers { - [type: string]: (ev: MatrixEvent, allowJSX: boolean, showHiddenEvents?: boolean) => (() => Renderable) | null; + [type: string]: ( + ev: MatrixEvent, + client: MatrixClient, + allowJSX: boolean, + showHiddenEvents?: boolean, + ) => (() => Renderable) | null; } const handlers: IHandlers = { @@ -925,25 +934,39 @@ for (const evType of ElementCall.CALL_EVENT_TYPE.names) { /** * Determines whether the given event has text to display. + * + * @param client The Matrix Client instance for the logged-in user * @param ev The event * @param showHiddenEvents An optional cached setting value for showHiddenEventsInTimeline * to avoid hitting the settings store */ -export function hasText(ev: MatrixEvent, showHiddenEvents?: boolean): boolean { +export function hasText(ev: MatrixEvent, client: MatrixClient, showHiddenEvents?: boolean): boolean { const handler = (ev.isState() ? stateHandlers : handlers)[ev.getType()]; - return Boolean(handler?.(ev, false, showHiddenEvents)); + return Boolean(handler?.(ev, client, false, showHiddenEvents)); } /** * Gets the textual content of the given event. + * * @param ev The event + * @param client The Matrix Client instance for the logged-in user * @param allowJSX Whether to output rich JSX content * @param showHiddenEvents An optional cached setting value for showHiddenEventsInTimeline * to avoid hitting the settings store */ -export function textForEvent(ev: MatrixEvent): string; -export function textForEvent(ev: MatrixEvent, allowJSX: true, showHiddenEvents?: boolean): string | React.ReactNode; -export function textForEvent(ev: MatrixEvent, allowJSX = false, showHiddenEvents?: boolean): string | React.ReactNode { +export function textForEvent(ev: MatrixEvent, client: MatrixClient): string; +export function textForEvent( + ev: MatrixEvent, + client: MatrixClient, + allowJSX: true, + showHiddenEvents?: boolean, +): string | React.ReactNode; +export function textForEvent( + ev: MatrixEvent, + client: MatrixClient, + allowJSX = false, + showHiddenEvents?: boolean, +): string | React.ReactNode { const handler = (ev.isState() ? stateHandlers : handlers)[ev.getType()]; - return handler?.(ev, allowJSX, showHiddenEvents)?.() || ""; + return handler?.(ev, client, allowJSX, showHiddenEvents)?.() || ""; } diff --git a/src/components/structures/MessagePanel.tsx b/src/components/structures/MessagePanel.tsx index 9ed934d6cab..f73bea5aa32 100644 --- a/src/components/structures/MessagePanel.tsx +++ b/src/components/structures/MessagePanel.tsx @@ -1301,7 +1301,7 @@ class MainGrouper extends BaseGrouper { public add({ event: ev, shouldShow }: EventAndShouldShow): void { if (ev.getType() === EventType.RoomMember) { // We can ignore any events that don't actually have a message to display - if (!hasText(ev, this.panel.showHiddenEvents)) return; + if (!hasText(ev, MatrixClientPeg.get(), this.panel.showHiddenEvents)) return; } this.readMarker = this.readMarker || this.panel.readMarkerForEvent(ev.getId()!, ev === this.lastShownEvent); if (!this.panel.showHiddenEvents && !shouldShow) { diff --git a/src/components/views/messages/MPollEndBody.tsx b/src/components/views/messages/MPollEndBody.tsx index bf8272a58f7..b133866d4a6 100644 --- a/src/components/views/messages/MPollEndBody.tsx +++ b/src/components/views/messages/MPollEndBody.tsx @@ -20,7 +20,7 @@ import { M_TEXT } from "matrix-js-sdk/src/@types/extensible_events"; import { logger } from "matrix-js-sdk/src/logger"; import { Icon as PollIcon } from "../../../../res/img/element-icons/room/composer/poll.svg"; -import MatrixClientContext from "../../../contexts/MatrixClientContext"; +import MatrixClientContext, { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; import { _t } from "../../../languageHandler"; import { textForEvent } from "../../../TextForEvent"; import { Caption } from "../typography/Caption"; @@ -95,10 +95,11 @@ const usePollStartEvent = (event: MatrixEvent): { pollStartEvent?: MatrixEvent; }; export const MPollEndBody = React.forwardRef(({ mxEvent, ...props }, ref) => { + const cli = useMatrixClientContext(); const { pollStartEvent, isLoadingPollStartEvent } = usePollStartEvent(mxEvent); if (!pollStartEvent) { - const pollEndFallbackMessage = M_TEXT.findIn(mxEvent.getContent()) || textForEvent(mxEvent); + const pollEndFallbackMessage = M_TEXT.findIn(mxEvent.getContent()) || textForEvent(mxEvent, cli); return ( <> diff --git a/src/components/views/messages/TextualEvent.tsx b/src/components/views/messages/TextualEvent.tsx index 3930ef53dc3..93501bac671 100644 --- a/src/components/views/messages/TextualEvent.tsx +++ b/src/components/views/messages/TextualEvent.tsx @@ -19,6 +19,7 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import RoomContext from "../../../contexts/RoomContext"; import * as TextForEvent from "../../../TextForEvent"; +import { MatrixClientPeg } from "../../../MatrixClientPeg"; interface IProps { mxEvent: MatrixEvent; @@ -28,7 +29,12 @@ export default class TextualEvent extends React.Component { public static contextType = RoomContext; public render(): React.ReactNode { - const text = TextForEvent.textForEvent(this.props.mxEvent, true, this.context?.showHiddenEvents); + const text = TextForEvent.textForEvent( + this.props.mxEvent, + MatrixClientPeg.get(), + true, + this.context?.showHiddenEvents, + ); if (!text) return null; return
{text}
; } diff --git a/src/events/EventTileFactory.tsx b/src/events/EventTileFactory.tsx index 1e87810d448..4b7fc1cbba9 100644 --- a/src/events/EventTileFactory.tsx +++ b/src/events/EventTileFactory.tsx @@ -255,7 +255,7 @@ export function pickFactory( return noEventFactoryFactory(); // improper event type to render } - if (STATE_EVENT_TILE_TYPES.get(evType) === TextualEventFactory && !hasText(mxEvent, showHiddenEvents)) { + if (STATE_EVENT_TILE_TYPES.get(evType) === TextualEventFactory && !hasText(mxEvent, cli, showHiddenEvents)) { return noEventFactoryFactory(); } @@ -435,7 +435,7 @@ export function haveRendererForEvent(mxEvent: MatrixEvent, showHiddenEvents: boo const handler = pickFactory(mxEvent, cli, showHiddenEvents); if (!handler) return false; if (handler === TextualEventFactory) { - return hasText(mxEvent, showHiddenEvents); + return hasText(mxEvent, cli, showHiddenEvents); } else if (handler === STATE_EVENT_TILE_TYPES.get(EventType.RoomCreate)) { const dynamicPredecessorsEnabled = SettingsStore.getValue("feature_dynamic_room_predecessors"); const predecessor = cli.getRoom(mxEvent.getRoomId())?.findPredecessor(dynamicPredecessorsEnabled); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ef4ca5c9cfb..751fbdebf45 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -104,6 +104,7 @@ "We couldn't log you in": "We couldn't log you in", "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.": "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.", "Try again": "Try again", + "User is not logged in": "User is not logged in", "Database unexpectedly closed": "Database unexpectedly closed", "This may be caused by having the app open in multiple tabs or due to clearing browser data.": "This may be caused by having the app open in multiple tabs or due to clearing browser data.", "Reload": "Reload", diff --git a/src/utils/exportUtils/HtmlExport.tsx b/src/utils/exportUtils/HtmlExport.tsx index 471d7b28e4e..0dd315819ae 100644 --- a/src/utils/exportUtils/HtmlExport.tsx +++ b/src/utils/exportUtils/HtmlExport.tsx @@ -402,7 +402,7 @@ export default class HTMLExporter extends Exporter { // TODO: Handle callEvent errors logger.error(e); eventTile = await this.getEventTileMarkup( - this.createModifiedEvent(textForEvent(mxEv), mxEv, false), + this.createModifiedEvent(textForEvent(mxEv, this.room.client), mxEv, false), joined, ); } diff --git a/src/utils/exportUtils/PlainTextExport.ts b/src/utils/exportUtils/PlainTextExport.ts index 6431e42460f..a6e509fc94d 100644 --- a/src/utils/exportUtils/PlainTextExport.ts +++ b/src/utils/exportUtils/PlainTextExport.ts @@ -104,7 +104,7 @@ export default class PlainTextExporter extends Exporter { } else mediaText = ` (${this.mediaOmitText})`; } if (this.isReply(mxEv)) return senderDisplayName + ": " + this.textForReplyEvent(mxEv.getContent()) + mediaText; - else return textForEvent(mxEv) + mediaText; + else return textForEvent(mxEv, this.room.client) + mediaText; }; protected async createOutput(events: MatrixEvent[]): Promise { diff --git a/src/voice-broadcast/utils/textForVoiceBroadcastStoppedEvent.tsx b/src/voice-broadcast/utils/textForVoiceBroadcastStoppedEvent.tsx index 62cabc7f0d2..a4cc84a9c02 100644 --- a/src/voice-broadcast/utils/textForVoiceBroadcastStoppedEvent.tsx +++ b/src/voice-broadcast/utils/textForVoiceBroadcastStoppedEvent.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React, { ReactNode } from "react"; -import { MatrixEvent } from "matrix-js-sdk/src/matrix"; +import { MatrixClient, MatrixEvent } from "matrix-js-sdk/src/matrix"; import { MatrixClientPeg } from "../../MatrixClientPeg"; import AccessibleButton from "../../components/views/elements/AccessibleButton"; @@ -23,7 +23,7 @@ import { highlightEvent } from "../../utils/EventUtils"; import { _t } from "../../languageHandler"; import { getSenderName } from "../../utils/event/getSenderName"; -export const textForVoiceBroadcastStoppedEvent = (event: MatrixEvent): (() => ReactNode) => { +export const textForVoiceBroadcastStoppedEvent = (event: MatrixEvent, client: MatrixClient): (() => ReactNode) => { return (): ReactNode => { const ownUserId = MatrixClientPeg.get()?.getUserId(); const startEventId = event.getRelation()?.event_id; diff --git a/test/LegacyCallHandler-test.ts b/test/LegacyCallHandler-test.ts index be902e54f83..9e31baad2a2 100644 --- a/test/LegacyCallHandler-test.ts +++ b/test/LegacyCallHandler-test.ts @@ -95,7 +95,7 @@ const VIRTUAL_ROOM_BOB = "$virtual_bob_room:example.org"; const BOB_PHONE_NUMBER = "01818118181"; function mkStubDM(roomId: string, userId: string) { - const room = mkStubRoom(roomId, "room", MatrixClientPeg.get()); + const room = mkStubRoom(roomId, "room", MatrixClientPeg.safeGet()); room.getJoinedMembers = jest.fn().mockReturnValue([ { userId: "@me:example.org", @@ -169,16 +169,16 @@ describe("LegacyCallHandler", () => { beforeEach(async () => { stubClient(); fakeCall = null; - MatrixClientPeg.get().createCall = (roomId: string): MatrixCall | null => { + MatrixClientPeg.safeGet().createCall = (roomId: string): MatrixCall | null => { if (fakeCall && fakeCall.roomId !== roomId) { throw new Error("Only one call is supported!"); } fakeCall = new FakeCall(roomId) as unknown as MatrixCall; return fakeCall as unknown as MatrixCall; }; - MatrixClientPeg.get().deviceId = deviceId; + MatrixClientPeg.safeGet().deviceId = deviceId; - MatrixClientPeg.get().getThirdpartyProtocols = () => { + MatrixClientPeg.safeGet().getThirdpartyProtocols = () => { return Promise.resolve({ "m.id.phone": {} as IProtocol, "im.vector.protocol.sip_native": {} as IProtocol, @@ -196,7 +196,7 @@ describe("LegacyCallHandler", () => { const nativeRoomCharie = mkStubDM(NATIVE_ROOM_CHARLIE, NATIVE_CHARLIE); const virtualBobRoom = mkStubDM(VIRTUAL_ROOM_BOB, VIRTUAL_BOB); - MatrixClientPeg.get().getRoom = (roomId: string): Room | null => { + MatrixClientPeg.safeGet().getRoom = (roomId: string): Room | null => { switch (roomId) { case NATIVE_ROOM_ALICE: return nativeRoomAlice; @@ -244,7 +244,7 @@ describe("LegacyCallHandler", () => { pstnLookup = null; nativeLookup = null; - MatrixClientPeg.get().getThirdpartyUser = (proto: string, params: any) => { + MatrixClientPeg.safeGet().getThirdpartyUser = (proto: string, params: any) => { if ([PROTOCOL_PSTN, PROTOCOL_PSTN_PREFIXED].includes(proto)) { pstnLookup = params["m.id.phone"]; return Promise.resolve([ @@ -402,10 +402,10 @@ describe("LegacyCallHandler", () => { mkVoiceBroadcastInfoStateEvent( "!room:example.com", VoiceBroadcastInfoState.Started, - MatrixClientPeg.get().getSafeUserId(), + MatrixClientPeg.safeGet().getSafeUserId(), "d42", ), - MatrixClientPeg.get(), + MatrixClientPeg.safeGet(), SdkContextClass.instance.voiceBroadcastRecordingsStore, ); SdkContextClass.instance.voiceBroadcastPlaybacksStore.setCurrent(voiceBroadcastPlayback); @@ -427,10 +427,10 @@ describe("LegacyCallHandler", () => { mkVoiceBroadcastInfoStateEvent( "!room:example.com", VoiceBroadcastInfoState.Started, - MatrixClientPeg.get().getSafeUserId(), + MatrixClientPeg.safeGet().getSafeUserId(), "d42", ), - MatrixClientPeg.get(), + MatrixClientPeg.safeGet(), ), ); }); @@ -451,7 +451,7 @@ describe("LegacyCallHandler without third party protocols", () => { beforeEach(() => { stubClient(); fakeCall = null; - MatrixClientPeg.get().createCall = (roomId) => { + MatrixClientPeg.safeGet().createCall = (roomId) => { if (fakeCall && fakeCall.roomId !== roomId) { throw new Error("Only one call is supported!"); } @@ -459,7 +459,7 @@ describe("LegacyCallHandler without third party protocols", () => { return fakeCall; }; - MatrixClientPeg.get().getThirdpartyProtocols = () => { + MatrixClientPeg.safeGet().getThirdpartyProtocols = () => { throw new Error("Endpoint unsupported."); }; @@ -468,7 +468,7 @@ describe("LegacyCallHandler without third party protocols", () => { const nativeRoomAlice = mkStubDM(NATIVE_ROOM_ALICE, NATIVE_ALICE); - MatrixClientPeg.get().getRoom = (roomId: string): Room | null => { + MatrixClientPeg.safeGet().getRoom = (roomId: string): Room | null => { switch (roomId) { case NATIVE_ROOM_ALICE: return nativeRoomAlice; @@ -495,7 +495,7 @@ describe("LegacyCallHandler without third party protocols", () => { } as DMRoomMap; DMRoomMap.setShared(dmRoomMap); - MatrixClientPeg.get().getThirdpartyUser = (_proto, _params) => { + MatrixClientPeg.safeGet().getThirdpartyUser = (_proto, _params) => { throw new Error("Endpoint unsupported."); }; @@ -547,12 +547,12 @@ describe("LegacyCallHandler without third party protocols", () => { jest.clearAllMocks(); jest.spyOn(SettingsStore, "getValue").mockImplementation((setting) => setting === UIFeature.Voip); - jest.spyOn(MatrixClientPeg.get(), "supportsVoip").mockReturnValue(true); + jest.spyOn(MatrixClientPeg.safeGet(), "supportsVoip").mockReturnValue(true); - MatrixClientPeg.get().isFallbackICEServerAllowed = jest.fn(); - MatrixClientPeg.get().prepareToEncrypt = jest.fn(); + MatrixClientPeg.safeGet().isFallbackICEServerAllowed = jest.fn(); + MatrixClientPeg.safeGet().prepareToEncrypt = jest.fn(); - MatrixClientPeg.get().pushRules = { + MatrixClientPeg.safeGet().pushRules = { global: { [PushRuleKind.Override]: [ { @@ -573,7 +573,7 @@ describe("LegacyCallHandler without third party protocols", () => { jest.spyOn(document, "getElementById").mockReturnValue(mockAudioElement); // silence local notifications by default - jest.spyOn(MatrixClientPeg.get(), "getAccountData").mockImplementation((eventType) => { + jest.spyOn(MatrixClientPeg.safeGet(), "getAccountData").mockImplementation((eventType) => { if (eventType.includes(LOCAL_NOTIFICATION_SETTINGS_PREFIX.name)) { return new MatrixEvent({ type: eventType, @@ -600,10 +600,10 @@ describe("LegacyCallHandler without third party protocols", () => { it("listens for incoming call events when voip is enabled", () => { const call = new MatrixCall({ - client: MatrixClientPeg.get(), + client: MatrixClientPeg.safeGet(), roomId, }); - const cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.safeGet(); cli.emit(CallEventHandlerEvent.Incoming, call); @@ -613,12 +613,12 @@ describe("LegacyCallHandler without third party protocols", () => { it("rings when incoming call state is ringing and notifications set to ring", () => { // remove local notification silencing mock for this test - jest.spyOn(MatrixClientPeg.get(), "getAccountData").mockReturnValue(undefined); + jest.spyOn(MatrixClientPeg.safeGet(), "getAccountData").mockReturnValue(undefined); const call = new MatrixCall({ - client: MatrixClientPeg.get(), + client: MatrixClientPeg.safeGet(), roomId, }); - const cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.safeGet(); cli.emit(CallEventHandlerEvent.Incoming, call); @@ -632,10 +632,10 @@ describe("LegacyCallHandler without third party protocols", () => { it("does not ring when incoming call state is ringing but local notifications are silenced", () => { const call = new MatrixCall({ - client: MatrixClientPeg.get(), + client: MatrixClientPeg.safeGet(), roomId, }); - const cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.safeGet(); cli.emit(CallEventHandlerEvent.Incoming, call); @@ -650,10 +650,10 @@ describe("LegacyCallHandler without third party protocols", () => { it("should force calls to silent when local notifications are silenced", async () => { const call = new MatrixCall({ - client: MatrixClientPeg.get(), + client: MatrixClientPeg.safeGet(), roomId, }); - const cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.safeGet(); cli.emit(CallEventHandlerEvent.Incoming, call); @@ -663,10 +663,10 @@ describe("LegacyCallHandler without third party protocols", () => { it("does not unsilence calls when local notifications are silenced", async () => { const call = new MatrixCall({ - client: MatrixClientPeg.get(), + client: MatrixClientPeg.safeGet(), roomId, }); - const cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.safeGet(); const callHandlerEmitSpy = jest.spyOn(callHandler, "emit"); cli.emit(CallEventHandlerEvent.Incoming, call); diff --git a/test/MatrixClientPeg-test.ts b/test/MatrixClientPeg-test.ts index 6dc9fe64b1d..b2309102445 100644 --- a/test/MatrixClientPeg-test.ts +++ b/test/MatrixClientPeg-test.ts @@ -44,7 +44,7 @@ describe("MatrixClientPeg", () => { stubClient(); (peg as any).matrixClient = peg.get(); peg.setJustRegisteredUserId("@userId:matrix.org"); - expect(peg.get().credentials.userId).toBe("@userId:matrix.org"); + expect(peg.safeGet().credentials.userId).toBe("@userId:matrix.org"); expect(peg.currentUserIsJustRegistered()).toBe(true); expect(peg.userRegisteredWithinLastHours(0)).toBe(false); expect(peg.userRegisteredWithinLastHours(1)).toBe(true); @@ -89,11 +89,11 @@ describe("MatrixClientPeg", () => { }); it("should initialise client crypto", async () => { - const mockInitCrypto = jest.spyOn(testPeg.get(), "initCrypto").mockResolvedValue(undefined); + const mockInitCrypto = jest.spyOn(testPeg.safeGet(), "initCrypto").mockResolvedValue(undefined); const mockSetTrustCrossSignedDevices = jest - .spyOn(testPeg.get(), "setCryptoTrustCrossSignedDevices") + .spyOn(testPeg.safeGet(), "setCryptoTrustCrossSignedDevices") .mockImplementation(() => {}); - const mockStartClient = jest.spyOn(testPeg.get(), "startClient").mockResolvedValue(undefined); + const mockStartClient = jest.spyOn(testPeg.safeGet(), "startClient").mockResolvedValue(undefined); await testPeg.start(); expect(mockInitCrypto).toHaveBeenCalledTimes(1); @@ -103,11 +103,11 @@ describe("MatrixClientPeg", () => { it("should carry on regardless if there is an error initialising crypto", async () => { const e2eError = new Error("nope nope nope"); - const mockInitCrypto = jest.spyOn(testPeg.get(), "initCrypto").mockRejectedValue(e2eError); + const mockInitCrypto = jest.spyOn(testPeg.safeGet(), "initCrypto").mockRejectedValue(e2eError); const mockSetTrustCrossSignedDevices = jest - .spyOn(testPeg.get(), "setCryptoTrustCrossSignedDevices") + .spyOn(testPeg.safeGet(), "setCryptoTrustCrossSignedDevices") .mockImplementation(() => {}); - const mockStartClient = jest.spyOn(testPeg.get(), "startClient").mockResolvedValue(undefined); + const mockStartClient = jest.spyOn(testPeg.safeGet(), "startClient").mockResolvedValue(undefined); const mockWarning = jest.spyOn(logger, "warn").mockReturnValue(undefined); await testPeg.start(); @@ -130,8 +130,8 @@ describe("MatrixClientPeg", () => { const mockSetValue = jest.spyOn(SettingsStore, "setValue").mockResolvedValue(undefined); - const mockInitCrypto = jest.spyOn(testPeg.get(), "initCrypto").mockResolvedValue(undefined); - const mockInitRustCrypto = jest.spyOn(testPeg.get(), "initRustCrypto").mockResolvedValue(undefined); + const mockInitCrypto = jest.spyOn(testPeg.safeGet(), "initCrypto").mockResolvedValue(undefined); + const mockInitRustCrypto = jest.spyOn(testPeg.safeGet(), "initRustCrypto").mockResolvedValue(undefined); await testPeg.start(); expect(mockInitCrypto).not.toHaveBeenCalled(); @@ -142,9 +142,9 @@ describe("MatrixClientPeg", () => { }); it("should reload when store database closes for a guest user", async () => { - testPeg.get().isGuest = () => true; + testPeg.safeGet().isGuest = () => true; const emitter = new EventEmitter(); - testPeg.get().store.on = emitter.on.bind(emitter); + testPeg.safeGet().store.on = emitter.on.bind(emitter); const platform: any = { reload: jest.fn() }; PlatformPeg.set(platform); await testPeg.assign(); @@ -153,9 +153,9 @@ describe("MatrixClientPeg", () => { }); it("should show error modal when store database closes", async () => { - testPeg.get().isGuest = () => false; + testPeg.safeGet().isGuest = () => false; const emitter = new EventEmitter(); - testPeg.get().store.on = emitter.on.bind(emitter); + testPeg.safeGet().store.on = emitter.on.bind(emitter); const spy = jest.spyOn(Modal, "createDialog"); await testPeg.assign(); emitter.emit("closed" as any); diff --git a/test/MediaDeviceHandler-test.ts b/test/MediaDeviceHandler-test.ts index 5e01fff97b9..76a38df80d3 100644 --- a/test/MediaDeviceHandler-test.ts +++ b/test/MediaDeviceHandler-test.ts @@ -54,7 +54,7 @@ describe("MediaDeviceHandler", () => { expect(SettingsStoreMock.setValue).toHaveBeenCalledWith(key, null, SettingLevel.DEVICE, value); }); - expect(MatrixClientPeg.get().getMediaHandler().setAudioSettings).toHaveBeenCalledWith({ + expect(MatrixClientPeg.safeGet().getMediaHandler().setAudioSettings).toHaveBeenCalledWith({ autoGainControl: false, echoCancellation: true, noiseSuppression: false, diff --git a/test/TextForEvent-test.ts b/test/TextForEvent-test.ts index 1aaacee2020..26a1f43de4a 100644 --- a/test/TextForEvent-test.ts +++ b/test/TextForEvent-test.ts @@ -47,6 +47,8 @@ function mockPinnedEvent(pinnedMessageIds?: string[], prevPinnedMessageIds?: str } describe("TextForEvent", () => { + const mockClient = createTestClient(); + describe("getSenderName()", () => { it("Prefers sender.name", () => { expect(getSenderName({ sender: { name: "Alice" } } as MatrixEvent)).toBe("Alice"); @@ -67,8 +69,8 @@ describe("TextForEvent", () => { it("mentions message when a single message was pinned, with no previously pinned messages", () => { const event = mockPinnedEvent(["message-1"]); - const plainText = textForEvent(event); - const component = render(textForEvent(event, true) as ReactElement); + const plainText = textForEvent(event, mockClient); + const component = render(textForEvent(event, mockClient, true) as ReactElement); const expectedText = "@foo:example.com pinned a message to this room. See all pinned messages."; expect(plainText).toBe(expectedText); @@ -77,8 +79,8 @@ describe("TextForEvent", () => { it("mentions message when a single message was pinned, with multiple previously pinned messages", () => { const event = mockPinnedEvent(["message-1", "message-2", "message-3"], ["message-1", "message-2"]); - const plainText = textForEvent(event); - const component = render(textForEvent(event, true) as ReactElement); + const plainText = textForEvent(event, mockClient); + const component = render(textForEvent(event, mockClient, true) as ReactElement); const expectedText = "@foo:example.com pinned a message to this room. See all pinned messages."; expect(plainText).toBe(expectedText); @@ -87,8 +89,8 @@ describe("TextForEvent", () => { it("mentions message when a single message was unpinned, with a single message previously pinned", () => { const event = mockPinnedEvent([], ["message-1"]); - const plainText = textForEvent(event); - const component = render(textForEvent(event, true) as ReactElement); + const plainText = textForEvent(event, mockClient); + const component = render(textForEvent(event, mockClient, true) as ReactElement); const expectedText = "@foo:example.com unpinned a message from this room. See all pinned messages."; expect(plainText).toBe(expectedText); @@ -97,8 +99,8 @@ describe("TextForEvent", () => { it("mentions message when a single message was unpinned, with multiple previously pinned messages", () => { const event = mockPinnedEvent(["message-2"], ["message-1", "message-2"]); - const plainText = textForEvent(event); - const component = render(textForEvent(event, true) as ReactElement); + const plainText = textForEvent(event, mockClient); + const component = render(textForEvent(event, mockClient, true) as ReactElement); const expectedText = "@foo:example.com unpinned a message from this room. See all pinned messages."; expect(plainText).toBe(expectedText); @@ -107,8 +109,8 @@ describe("TextForEvent", () => { it("shows generic text when multiple messages were pinned", () => { const event = mockPinnedEvent(["message-1", "message-2", "message-3"], ["message-1"]); - const plainText = textForEvent(event); - const component = render(textForEvent(event, true) as ReactElement); + const plainText = textForEvent(event, mockClient); + const component = render(textForEvent(event, mockClient, true) as ReactElement); const expectedText = "@foo:example.com changed the pinned messages for the room."; expect(plainText).toBe(expectedText); @@ -117,8 +119,8 @@ describe("TextForEvent", () => { it("shows generic text when multiple messages were unpinned", () => { const event = mockPinnedEvent(["message-3"], ["message-1", "message-2", "message-3"]); - const plainText = textForEvent(event); - const component = render(textForEvent(event, true) as ReactElement); + const plainText = textForEvent(event, mockClient); + const component = render(textForEvent(event, mockClient, true) as ReactElement); const expectedText = "@foo:example.com changed the pinned messages for the room."; expect(plainText).toBe(expectedText); @@ -127,8 +129,8 @@ describe("TextForEvent", () => { it("shows generic text when one message was pinned, and another unpinned", () => { const event = mockPinnedEvent(["message-2"], ["message-1"]); - const plainText = textForEvent(event); - const component = render(textForEvent(event, true) as ReactElement); + const plainText = textForEvent(event, mockClient); + const component = render(textForEvent(event, mockClient, true) as ReactElement); const expectedText = "@foo:example.com changed the pinned messages for the room."; expect(plainText).toBe(expectedText); @@ -184,6 +186,7 @@ describe("TextForEvent", () => { beforeAll(() => { mockClient = createTestClient() as Mocked; MatrixClientPeg.get = () => mockClient; + MatrixClientPeg.safeGet = () => mockClient; mockClient.getRoom.mockClear().mockReturnValue(mockRoom); mockRoom.getMember .mockClear() @@ -206,7 +209,7 @@ describe("TextForEvent", () => { [userA.userId]: 100, }, }); - expect(textForEvent(event)).toBeFalsy(); + expect(textForEvent(event, mockClient)).toBeFalsy(); }); it("returns false when users power levels have been changed by default settings", () => { @@ -220,7 +223,7 @@ describe("TextForEvent", () => { [userA.userId]: 50, }, }); - expect(textForEvent(event)).toBeFalsy(); + expect(textForEvent(event, mockClient)).toBeFalsy(); }); it("returns correct message for a single user with changed power level", () => { @@ -233,7 +236,7 @@ describe("TextForEvent", () => { }, }); const expectedText = "Alice changed the power level of Bob (@b) from Moderator to Admin."; - expect(textForEvent(event)).toEqual(expectedText); + expect(textForEvent(event, mockClient)).toEqual(expectedText); }); it("returns correct message for a single user with power level changed to the default", () => { @@ -248,7 +251,7 @@ describe("TextForEvent", () => { }, }); const expectedText = "Alice changed the power level of Bob (@b) from Moderator to Default."; - expect(textForEvent(event)).toEqual(expectedText); + expect(textForEvent(event, mockClient)).toEqual(expectedText); }); it("returns correct message for a single user with power level changed to a custom level", () => { @@ -261,7 +264,7 @@ describe("TextForEvent", () => { }, }); const expectedText = "Alice changed the power level of Bob (@b) from Moderator to Custom (-1)."; - expect(textForEvent(event)).toEqual(expectedText); + expect(textForEvent(event, mockClient)).toEqual(expectedText); }); it("returns correct message for a multiple power level changes", () => { @@ -278,7 +281,7 @@ describe("TextForEvent", () => { const expectedText = "Alice changed the power level of Bob (@b) from Moderator to Admin," + " Bob (@c) from Custom (101) to Moderator."; - expect(textForEvent(event)).toEqual(expectedText); + expect(textForEvent(event, mockClient)).toEqual(expectedText); }); }); @@ -382,7 +385,7 @@ describe("TextForEvent", () => { it.each(testCases)("returns correct message when %s", (_d, { result, ...eventProps }) => { const event = mockEvent(eventProps); - expect(textForEvent(event)).toEqual(result); + expect(textForEvent(event, mockClient)).toEqual(result); }); }); @@ -409,11 +412,11 @@ describe("TextForEvent", () => { it("returns correct message for redacted poll start", () => { pollEvent.makeRedacted(pollEvent); - expect(textForEvent(pollEvent)).toEqual("@a: Message deleted"); + expect(textForEvent(pollEvent, mockClient)).toEqual("@a: Message deleted"); }); it("returns correct message for normal poll start", () => { - expect(textForEvent(pollEvent)).toEqual("@a has started a poll - "); + expect(textForEvent(pollEvent, mockClient)).toEqual("@a has started a poll - "); }); }); @@ -435,11 +438,11 @@ describe("TextForEvent", () => { it("returns correct message for redacted message", () => { messageEvent.makeRedacted(messageEvent); - expect(textForEvent(messageEvent)).toEqual("@a: Message deleted"); + expect(textForEvent(messageEvent, mockClient)).toEqual("@a: Message deleted"); }); it("returns correct message for normal message", () => { - expect(textForEvent(messageEvent)).toEqual("@a: test message"); + expect(textForEvent(messageEvent, mockClient)).toEqual("@a: test message"); }); }); @@ -449,7 +452,7 @@ describe("TextForEvent", () => { beforeEach(() => { stubClient(); - mockClient = MatrixClientPeg.get(); + mockClient = MatrixClientPeg.safeGet(); mocked(mockClient.getRoom).mockReturnValue({ name: "Test room", @@ -468,13 +471,13 @@ describe("TextForEvent", () => { }); it("returns correct message for call event when supported", () => { - expect(textForEvent(callEvent)).toEqual("Video call started in Test room."); + expect(textForEvent(callEvent, mockClient)).toEqual("Video call started in Test room."); }); it("returns correct message for call event when not supported", () => { mocked(mockClient).supportsVoip.mockReturnValue(false); - expect(textForEvent(callEvent)).toEqual( + expect(textForEvent(callEvent, mockClient)).toEqual( "Video call started in Test room. (not supported by this browser)", ); }); @@ -504,6 +507,7 @@ describe("TextForEvent", () => { }, state_key: "@a:foo", }), + mockClient, ), ).toMatchInlineSnapshot(`"Andy changed their display name and profile picture"`); }); diff --git a/test/Unread-test.ts b/test/Unread-test.ts index 63f3e6e54be..dc9c0f7a6b1 100644 --- a/test/Unread-test.ts +++ b/test/Unread-test.ts @@ -33,7 +33,7 @@ describe("Unread", () => { // A different user. const aliceId = "@alice:server.org"; stubClient(); - const client = MatrixClientPeg.get(); + const client = MatrixClientPeg.safeGet(); describe("eventTriggersUnreadCount()", () => { // setup events diff --git a/test/autocomplete/EmojiProvider-test.ts b/test/autocomplete/EmojiProvider-test.ts index c3f3c7fc353..a18951ce7cc 100644 --- a/test/autocomplete/EmojiProvider-test.ts +++ b/test/autocomplete/EmojiProvider-test.ts @@ -44,7 +44,7 @@ const TOO_SHORT_EMOJI_SHORTCODE = [{ emojiShortcode: ":o", expectedEmoji: "⭕ describe("EmojiProvider", function () { const testRoom = mkStubRoom(undefined, undefined, undefined); stubClient(); - MatrixClientPeg.get(); + MatrixClientPeg.safeGet(); it.each(EMOJI_SHORTCODES)("Returns consistent results after final colon %s", async function (emojiShortcode) { const ep = new EmojiProvider(testRoom); diff --git a/test/components/structures/LegacyCallEventGrouper-test.ts b/test/components/structures/LegacyCallEventGrouper-test.ts index 1fb34555874..294bfd42f93 100644 --- a/test/components/structures/LegacyCallEventGrouper-test.ts +++ b/test/components/structures/LegacyCallEventGrouper-test.ts @@ -30,7 +30,7 @@ let client: MatrixClient; describe("LegacyCallEventGrouper", () => { beforeEach(() => { stubClient(); - client = MatrixClientPeg.get(); + client = MatrixClientPeg.safeGet(); client.getUserId = () => { return MY_USER_ID; }; diff --git a/test/components/structures/PipContainer-test.tsx b/test/components/structures/PipContainer-test.tsx index 90b34770277..a0a21d08ec8 100644 --- a/test/components/structures/PipContainer-test.tsx +++ b/test/components/structures/PipContainer-test.tsx @@ -90,7 +90,7 @@ describe("PipContainer", () => { user = userEvent.setup(); stubClient(); - client = mocked(MatrixClientPeg.get()); + client = mocked(MatrixClientPeg.safeGet()); DMRoomMap.makeShared(client); room = new Room("!1:example.org", client, "@alice:example.org", { diff --git a/test/components/structures/RightPanel-test.tsx b/test/components/structures/RightPanel-test.tsx index 6be6693ed4a..57401744f45 100644 --- a/test/components/structures/RightPanel-test.tsx +++ b/test/components/structures/RightPanel-test.tsx @@ -47,7 +47,7 @@ describe("RightPanel", () => { let RightPanel: React.ComponentType>; beforeEach(() => { stubClient(); - cli = mocked(MatrixClientPeg.get()); + cli = mocked(MatrixClientPeg.safeGet()); DMRoomMap.makeShared(cli); context = new SdkContextClass(); context.client = cli; diff --git a/test/components/structures/RoomSearchView-test.tsx b/test/components/structures/RoomSearchView-test.tsx index 199d1eecc50..2d329c52930 100644 --- a/test/components/structures/RoomSearchView-test.tsx +++ b/test/components/structures/RoomSearchView-test.tsx @@ -45,7 +45,7 @@ describe("", () => { beforeEach(async () => { stubClient(); - client = MatrixClientPeg.get(); + client = MatrixClientPeg.safeGet(); client.supportsThreads = jest.fn().mockReturnValue(true); room = new Room("!room:server", client, client.getSafeUserId()); mocked(client.getRoom).mockReturnValue(room); diff --git a/test/components/structures/RoomStatusBar-test.tsx b/test/components/structures/RoomStatusBar-test.tsx index de8260b26c3..09525d9136b 100644 --- a/test/components/structures/RoomStatusBar-test.tsx +++ b/test/components/structures/RoomStatusBar-test.tsx @@ -37,7 +37,7 @@ describe("RoomStatusBar", () => { jest.clearAllMocks(); stubClient(); - client = MatrixClientPeg.get(); + client = MatrixClientPeg.safeGet(); client.getSyncStateData = jest.fn().mockReturnValue({}); room = new Room(ROOM_ID, client, client.getUserId()!, { pendingEventOrdering: PendingEventOrdering.Detached, diff --git a/test/components/structures/RoomView-test.tsx b/test/components/structures/RoomView-test.tsx index 8670d068852..fadeb5c2c2e 100644 --- a/test/components/structures/RoomView-test.tsx +++ b/test/components/structures/RoomView-test.tsx @@ -76,7 +76,7 @@ describe("RoomView", () => { beforeEach(() => { mockPlatformPeg({ reload: () => {} }); stubClient(); - cli = mocked(MatrixClientPeg.get()); + cli = mocked(MatrixClientPeg.safeGet()); room = new Room(`!${roomCount++}:example.org`, cli, "@alice:example.org"); jest.spyOn(room, "findPredecessor"); diff --git a/test/components/structures/SpaceHierarchy-test.tsx b/test/components/structures/SpaceHierarchy-test.tsx index 95842df7d63..71584839890 100644 --- a/test/components/structures/SpaceHierarchy-test.tsx +++ b/test/components/structures/SpaceHierarchy-test.tsx @@ -43,7 +43,7 @@ describe("SpaceHierarchy", () => { let room: Room; beforeEach(() => { stubClient(); - client = MatrixClientPeg.get(); + client = MatrixClientPeg.safeGet(); room = new Room("room-id", client, "@alice:example.com"); hierarchy = new RoomHierarchy(room); @@ -82,7 +82,7 @@ describe("SpaceHierarchy", () => { describe("toLocalRoom", () => { stubClient(); - const client = MatrixClientPeg.get(); + const client = MatrixClientPeg.safeGet(); const roomV1 = mkStubRoom("room-id-1", "Room V1", client); const roomV2 = mkStubRoom("room-id-2", "Room V2", client); const roomV3 = mkStubRoom("room-id-3", "Room V3", client); @@ -171,7 +171,7 @@ describe("SpaceHierarchy", () => { }); stubClient(); - const client = MatrixClientPeg.get(); + const client = MatrixClientPeg.safeGet(); const dmRoomMap = { getUserIdForRoomId: jest.fn(), diff --git a/test/components/structures/ThreadPanel-test.tsx b/test/components/structures/ThreadPanel-test.tsx index b6cf8431479..3027ea3e02f 100644 --- a/test/components/structures/ThreadPanel-test.tsx +++ b/test/components/structures/ThreadPanel-test.tsx @@ -120,7 +120,7 @@ describe("ThreadPanel", () => { stubClient(); mockPlatformPeg(); - mockClient = mocked(MatrixClientPeg.get()); + mockClient = mocked(MatrixClientPeg.safeGet()); Thread.setServerSideSupport(FeatureSupport.Stable); Thread.setServerSideListSupport(FeatureSupport.Stable); Thread.setServerSideFwdPaginationSupport(FeatureSupport.Stable); diff --git a/test/components/structures/ThreadView-test.tsx b/test/components/structures/ThreadView-test.tsx index 7ca5ca9d757..fb5440d7687 100644 --- a/test/components/structures/ThreadView-test.tsx +++ b/test/components/structures/ThreadView-test.tsx @@ -115,7 +115,7 @@ describe("ThreadView", () => { stubClient(); mockPlatformPeg(); - mockClient = mocked(MatrixClientPeg.get()); + mockClient = mocked(MatrixClientPeg.safeGet()); jest.spyOn(mockClient, "supportsThreads").mockReturnValue(true); room = new Room(ROOM_ID, mockClient, mockClient.getUserId() ?? "", { diff --git a/test/components/structures/TimelinePanel-test.tsx b/test/components/structures/TimelinePanel-test.tsx index a77e30b313b..8f98230a5c6 100644 --- a/test/components/structures/TimelinePanel-test.tsx +++ b/test/components/structures/TimelinePanel-test.tsx @@ -106,7 +106,7 @@ const mockEvents = (room: Room, count = 2): MatrixEvent[] => { }; const setupTestData = (): [MatrixClient, Room, MatrixEvent[]] => { - const client = MatrixClientPeg.get(); + const client = MatrixClientPeg.safeGet(); const room = mkRoom(client, "roomId"); const events = mockEvents(room); return [client, room, events]; @@ -377,7 +377,7 @@ describe("TimelinePanel", () => { }); it("should scroll event into view when props.eventId changes", () => { - const client = MatrixClientPeg.get(); + const client = MatrixClientPeg.safeGet(); const room = mkRoom(client, "roomId"); const events = mockEvents(room); @@ -798,7 +798,7 @@ describe("TimelinePanel", () => { let reply2: MatrixEvent; beforeEach(() => { - client = MatrixClientPeg.get(); + client = MatrixClientPeg.safeGet(); Thread.hasServerSideSupport = FeatureSupport.Stable; room = new Room("roomId", client, "userId"); @@ -952,7 +952,7 @@ describe("TimelinePanel", () => { }); it("renders when the last message is an undecryptable thread root", async () => { - const client = MatrixClientPeg.get(); + const client = MatrixClientPeg.safeGet(); client.isRoomEncrypted = () => true; client.supportsThreads = () => true; client.decryptEventIfNeeded = () => Promise.resolve(); diff --git a/test/components/views/avatars/MemberAvatar-test.tsx b/test/components/views/avatars/MemberAvatar-test.tsx index 42e1c08834e..8f98c20f304 100644 --- a/test/components/views/avatars/MemberAvatar-test.tsx +++ b/test/components/views/avatars/MemberAvatar-test.tsx @@ -47,7 +47,7 @@ describe("MemberAvatar", () => { jest.clearAllMocks(); stubClient(); - mockClient = mocked(MatrixClientPeg.get()); + mockClient = mocked(MatrixClientPeg.safeGet()); room = new Room(ROOM_ID, mockClient, mockClient.getUserId() ?? "", { pendingEventOrdering: PendingEventOrdering.Detached, diff --git a/test/components/views/beacon/RoomCallBanner-test.tsx b/test/components/views/beacon/RoomCallBanner-test.tsx index 59d4ae615cb..337d0054407 100644 --- a/test/components/views/beacon/RoomCallBanner-test.tsx +++ b/test/components/views/beacon/RoomCallBanner-test.tsx @@ -41,7 +41,7 @@ describe("", () => { beforeEach(() => { stubClient(); - client = mocked(MatrixClientPeg.get()); + client = mocked(MatrixClientPeg.safeGet()); room = new Room("!1:example.org", client, "@alice:example.org", { pendingEventOrdering: PendingEventOrdering.Detached, diff --git a/test/components/views/context_menus/MessageContextMenu-test.tsx b/test/components/views/context_menus/MessageContextMenu-test.tsx index 84f8a5b361c..b44350c7812 100644 --- a/test/components/views/context_menus/MessageContextMenu-test.tsx +++ b/test/components/views/context_menus/MessageContextMenu-test.tsx @@ -159,7 +159,7 @@ describe("MessageContextMenu", () => { room_id: roomId, }); pinnableEvent.event.event_id = "!3"; - const client = MatrixClientPeg.get(); + const client = MatrixClientPeg.safeGet(); const room = makeDefaultRoom(); // mock permission to allow adding pinned messages to room @@ -204,7 +204,7 @@ describe("MessageContextMenu", () => { room_id: roomId, }); pinnableEvent.event.event_id = "!3"; - const client = MatrixClientPeg.get(); + const client = MatrixClientPeg.safeGet(); const room = makeDefaultRoom(); // make the event already pinned in the room @@ -543,7 +543,7 @@ function createMenuWithContent( } function makeDefaultRoom(): Room { - return new Room(roomId, MatrixClientPeg.get(), "@user:example.com", { + return new Room(roomId, MatrixClientPeg.safeGet(), "@user:example.com", { pendingEventOrdering: PendingEventOrdering.Detached, }); } @@ -555,7 +555,7 @@ function createMenu( beacons: Map = new Map(), room: Room = makeDefaultRoom(), ): RenderResult { - const client = MatrixClientPeg.get(); + const client = MatrixClientPeg.safeGet(); // @ts-ignore illegally set private prop room.currentState.beacons = beacons; diff --git a/test/components/views/context_menus/RoomContextMenu-test.tsx b/test/components/views/context_menus/RoomContextMenu-test.tsx index a1e9f58b702..4073d458a10 100644 --- a/test/components/views/context_menus/RoomContextMenu-test.tsx +++ b/test/components/views/context_menus/RoomContextMenu-test.tsx @@ -46,7 +46,7 @@ describe("RoomContextMenu", () => { jest.clearAllMocks(); stubClient(); - mockClient = mocked(MatrixClientPeg.get()); + mockClient = mocked(MatrixClientPeg.safeGet()); room = new Room(ROOM_ID, mockClient, mockClient.getUserId() ?? "", { pendingEventOrdering: PendingEventOrdering.Detached, diff --git a/test/components/views/context_menus/RoomGeneralContextMenu-test.tsx b/test/components/views/context_menus/RoomGeneralContextMenu-test.tsx index df04e1c054f..598f003289c 100644 --- a/test/components/views/context_menus/RoomGeneralContextMenu-test.tsx +++ b/test/components/views/context_menus/RoomGeneralContextMenu-test.tsx @@ -71,7 +71,7 @@ describe("RoomGeneralContextMenu", () => { jest.clearAllMocks(); stubClient(); - mockClient = mocked(MatrixClientPeg.get()); + mockClient = mocked(MatrixClientPeg.safeGet()); room = new Room(ROOM_ID, mockClient, mockClient.getUserId() ?? "", { pendingEventOrdering: PendingEventOrdering.Detached, diff --git a/test/components/views/context_menus/ThreadListContextMenu-test.tsx b/test/components/views/context_menus/ThreadListContextMenu-test.tsx index 2f1c5df7f58..db6d198808f 100644 --- a/test/components/views/context_menus/ThreadListContextMenu-test.tsx +++ b/test/components/views/context_menus/ThreadListContextMenu-test.tsx @@ -45,7 +45,7 @@ describe("ThreadListContextMenu", () => { jest.clearAllMocks(); stubClient(); - mockClient = mocked(MatrixClientPeg.get()); + mockClient = mocked(MatrixClientPeg.safeGet()); room = new Room(ROOM_ID, mockClient, mockClient.getUserId() ?? "", { pendingEventOrdering: PendingEventOrdering.Detached, diff --git a/test/components/views/dialogs/DevtoolsDialog-test.tsx b/test/components/views/dialogs/DevtoolsDialog-test.tsx index bc451255fa6..ae337695a41 100644 --- a/test/components/views/dialogs/DevtoolsDialog-test.tsx +++ b/test/components/views/dialogs/DevtoolsDialog-test.tsx @@ -39,7 +39,7 @@ describe("DevtoolsDialog", () => { beforeEach(() => { stubClient(); - cli = MatrixClientPeg.get(); + cli = MatrixClientPeg.safeGet(); room = new Room("!id", cli, "@alice:matrix.org"); jest.spyOn(cli, "getRoom").mockReturnValue(room); diff --git a/test/components/views/dialogs/SpotlightDialog-test.tsx b/test/components/views/dialogs/SpotlightDialog-test.tsx index fb1fc1e65ff..28572253092 100644 --- a/test/components/views/dialogs/SpotlightDialog-test.tsx +++ b/test/components/views/dialogs/SpotlightDialog-test.tsx @@ -70,7 +70,7 @@ function mockClient({ users = [], }: MockClientOptions = {}): MatrixClient { stubClient(); - const cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.safeGet(); MatrixClientPeg.getHomeserverName = jest.fn(() => homeserver); cli.getUserId = jest.fn(() => userId); cli.getHomeserverUrl = jest.fn(() => homeserver); diff --git a/test/components/views/dialogs/devtools/RoomNotifications-test.tsx b/test/components/views/dialogs/devtools/RoomNotifications-test.tsx index 5aac917bfb6..8990026990d 100644 --- a/test/components/views/dialogs/devtools/RoomNotifications-test.tsx +++ b/test/components/views/dialogs/devtools/RoomNotifications-test.tsx @@ -31,7 +31,7 @@ describe("", () => { }); it("should render", () => { - const cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.safeGet(); const { asFragment } = render( { beforeAll(async () => { stubClient(); - cli = MatrixClientPeg.get(); + cli = MatrixClientPeg.safeGet(); cli.hasLazyLoadMembersEnabled = () => false; // Init misc. startup deps diff --git a/test/components/views/elements/PollCreateDialog-test.tsx b/test/components/views/elements/PollCreateDialog-test.tsx index 551aae01aac..9f24c316740 100644 --- a/test/components/views/elements/PollCreateDialog-test.tsx +++ b/test/components/views/elements/PollCreateDialog-test.tsx @@ -274,7 +274,7 @@ describe("PollCreateDialog", () => { }); function createRoom(): Room { - return new Room("roomid", MatrixClientPeg.get(), "@name:example.com", {}); + return new Room("roomid", MatrixClientPeg.safeGet(), "@name:example.com", {}); } function changeValue(wrapper: RenderResult, labelText: string, value: string) { diff --git a/test/components/views/messages/CallEvent-test.tsx b/test/components/views/messages/CallEvent-test.tsx index 7d10a35b8dc..60b4a0bfc42 100644 --- a/test/components/views/messages/CallEvent-test.tsx +++ b/test/components/views/messages/CallEvent-test.tsx @@ -58,7 +58,7 @@ describe("CallEvent", () => { jest.setSystemTime(0); stubClient(); - client = mocked(MatrixClientPeg.get()); + client = mocked(MatrixClientPeg.safeGet()); client.getUserId.mockReturnValue("@alice:example.org"); room = new Room("!1:example.org", client, "@alice:example.org", { diff --git a/test/components/views/messages/RoomPredecessorTile-test.tsx b/test/components/views/messages/RoomPredecessorTile-test.tsx index 902eae1599f..1b45e23da40 100644 --- a/test/components/views/messages/RoomPredecessorTile-test.tsx +++ b/test/components/views/messages/RoomPredecessorTile-test.tsx @@ -38,7 +38,7 @@ describe("", () => { const userId = "@alice:server.org"; const roomId = "!room:server.org"; stubClient(); - const client = mocked(MatrixClientPeg.get()); + const client = mocked(MatrixClientPeg.safeGet()); function makeRoom({ createEventHasPredecessor = false, @@ -165,7 +165,7 @@ describe("", () => { filterConsole("Failed to find predecessor room with id old_room_id"); beforeEach(() => { - mocked(MatrixClientPeg.get().getRoom).mockReturnValue(null); + mocked(MatrixClientPeg.safeGet().getRoom).mockReturnValue(null); }); it("Shows an error if there are no via servers", () => { @@ -219,7 +219,7 @@ describe("", () => { filterConsole("Failed to find predecessor room with id old_room_id"); beforeEach(() => { - mocked(MatrixClientPeg.get().getRoom).mockReturnValue(null); + mocked(MatrixClientPeg.safeGet().getRoom).mockReturnValue(null); }); it("Shows an error if there are no via servers", () => { diff --git a/test/components/views/right_panel/PinnedMessagesCard-test.tsx b/test/components/views/right_panel/PinnedMessagesCard-test.tsx index 34d9eeb8b53..30c33496dd7 100644 --- a/test/components/views/right_panel/PinnedMessagesCard-test.tsx +++ b/test/components/views/right_panel/PinnedMessagesCard-test.tsx @@ -34,7 +34,7 @@ import { RoomPermalinkCreator } from "../../../../src/utils/permalinks/Permalink describe("", () => { stubClient(); - const cli = mocked(MatrixClientPeg.get()); + const cli = mocked(MatrixClientPeg.safeGet()); cli.getUserId.mockReturnValue("@alice:example.org"); cli.setRoomAccountData.mockResolvedValue({}); cli.relations.mockResolvedValue({ originalEvent: {} as unknown as MatrixEvent, events: [] }); diff --git a/test/components/views/right_panel/RoomHeaderButtons-test.tsx b/test/components/views/right_panel/RoomHeaderButtons-test.tsx index 0399a6ae75a..751e8d0d88b 100644 --- a/test/components/views/right_panel/RoomHeaderButtons-test.tsx +++ b/test/components/views/right_panel/RoomHeaderButtons-test.tsx @@ -35,7 +35,7 @@ describe("RoomHeaderButtons-test.tsx", function () { jest.clearAllMocks(); stubClient(); - client = MatrixClientPeg.get(); + client = MatrixClientPeg.safeGet(); client.supportsThreads = () => true; room = new Room(ROOM_ID, client, client.getUserId() ?? "", { pendingEventOrdering: PendingEventOrdering.Detached, diff --git a/test/components/views/rooms/BasicMessageComposer-test.tsx b/test/components/views/rooms/BasicMessageComposer-test.tsx index 34d32b627d6..0d5faa35504 100644 --- a/test/components/views/rooms/BasicMessageComposer-test.tsx +++ b/test/components/views/rooms/BasicMessageComposer-test.tsx @@ -32,7 +32,7 @@ describe("BasicMessageComposer", () => { TestUtils.stubClient(); - const client: MatrixClient = MatrixClientPeg.get(); + const client: MatrixClient = MatrixClientPeg.safeGet(); const roomId = "!1234567890:domain"; const userId = client.getSafeUserId(); diff --git a/test/components/views/rooms/EventTile-test.tsx b/test/components/views/rooms/EventTile-test.tsx index 506a11f70ab..bb057942659 100644 --- a/test/components/views/rooms/EventTile-test.tsx +++ b/test/components/views/rooms/EventTile-test.tsx @@ -73,7 +73,7 @@ describe("EventTile", () => { jest.clearAllMocks(); stubClient(); - client = MatrixClientPeg.get(); + client = MatrixClientPeg.safeGet(); room = new Room(ROOM_ID, client, client.getSafeUserId(), { pendingEventOrdering: PendingEventOrdering.Detached, diff --git a/test/components/views/rooms/MemberList-test.tsx b/test/components/views/rooms/MemberList-test.tsx index 6f364bff2a8..706818bd3be 100644 --- a/test/components/views/rooms/MemberList-test.tsx +++ b/test/components/views/rooms/MemberList-test.tsx @@ -143,7 +143,7 @@ describe("MemberList", () => { describe.each([false, true])("does order members correctly (presence %s)", (enablePresence) => { beforeEach(function () { TestUtils.stubClient(); - client = MatrixClientPeg.get(); + client = MatrixClientPeg.safeGet(); client.hasLazyLoadMembersEnabled = () => false; // Make room diff --git a/test/components/views/rooms/MessageComposer-test.tsx b/test/components/views/rooms/MessageComposer-test.tsx index b4f5b696dbc..d508c7b5e12 100644 --- a/test/components/views/rooms/MessageComposer-test.tsx +++ b/test/components/views/rooms/MessageComposer-test.tsx @@ -71,7 +71,7 @@ const startVoiceMessage = async (): Promise => { const setCurrentBroadcastRecording = (room: Room, state: VoiceBroadcastInfoState): void => { const recording = new VoiceBroadcastRecording( mkVoiceBroadcastInfoStateEvent(room.roomId, state, "@user:example.com", "ABC123"), - MatrixClientPeg.get(), + MatrixClientPeg.safeGet(), state, ); SdkContextClass.instance.voiceBroadcastRecordingsStore.setCurrent(recording); @@ -483,7 +483,7 @@ function wrapAndRender( narrow = false, tombstone?: MatrixEvent, ) { - const mockClient = MatrixClientPeg.get(); + const mockClient = MatrixClientPeg.safeGet(); const roomId = "myroomid"; const room: any = props.room || { currentState: undefined, diff --git a/test/components/views/rooms/RoomHeader-test.tsx b/test/components/views/rooms/RoomHeader-test.tsx index d5d3c68b3f0..3b8aa0d2d0e 100644 --- a/test/components/views/rooms/RoomHeader-test.tsx +++ b/test/components/views/rooms/RoomHeader-test.tsx @@ -69,7 +69,7 @@ describe("RoomHeader", () => { mockPlatformPeg({ supportsJitsiScreensharing: () => true }); stubClient(); - client = mocked(MatrixClientPeg.get()); + client = mocked(MatrixClientPeg.safeGet()); client.getUserId.mockReturnValue("@alice:example.org"); room = new Room("!1:example.org", client, "@alice:example.org", { @@ -750,7 +750,7 @@ interface IRoomCreationInfo { function createRoom(info: IRoomCreationInfo) { stubClient(); - const client: MatrixClient = MatrixClientPeg.get(); + const client: MatrixClient = MatrixClientPeg.safeGet(); const roomId = "!1234567890:domain"; const userId = client.getUserId()!; diff --git a/test/components/views/rooms/RoomList-test.tsx b/test/components/views/rooms/RoomList-test.tsx index e987f3311e9..875bac670fc 100644 --- a/test/components/views/rooms/RoomList-test.tsx +++ b/test/components/views/rooms/RoomList-test.tsx @@ -47,7 +47,7 @@ DMRoomMap.sharedInstance = { getUserIdForRoomId, getDMRoomsForUserId }; describe("RoomList", () => { stubClient(); - const client = MatrixClientPeg.get(); + const client = MatrixClientPeg.safeGet(); const store = SpaceStore.instance; function getComponent(props: Partial> = {}): JSX.Element { diff --git a/test/components/views/rooms/RoomListHeader-test.tsx b/test/components/views/rooms/RoomListHeader-test.tsx index 03a4b2fd20a..0ca2dafd7cd 100644 --- a/test/components/views/rooms/RoomListHeader-test.tsx +++ b/test/components/views/rooms/RoomListHeader-test.tsx @@ -112,7 +112,7 @@ describe("RoomListHeader", () => { } as unknown as DMRoomMap; DMRoomMap.setShared(dmRoomMap); stubClient(); - client = MatrixClientPeg.get(); + client = MatrixClientPeg.safeGet(); mocked(shouldShowComponent).mockReturnValue(true); // show all UIComponents }); diff --git a/test/components/views/rooms/RoomPreviewBar-test.tsx b/test/components/views/rooms/RoomPreviewBar-test.tsx index 9e58888f924..0638ed31b6e 100644 --- a/test/components/views/rooms/RoomPreviewBar-test.tsx +++ b/test/components/views/rooms/RoomPreviewBar-test.tsx @@ -33,7 +33,7 @@ jest.mock("../../../../src/IdentityAuthClient", () => { jest.useRealTimers(); const createRoom = (roomId: string, userId: string): Room => { - const cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.safeGet(); const newRoom = new Room(roomId, cli, userId, {}); DMRoomMap.makeShared(cli).start(); return newRoom; @@ -92,7 +92,7 @@ describe("", () => { beforeEach(() => { stubClient(); - MatrixClientPeg.get().getUserId = jest.fn().mockReturnValue(userId); + MatrixClientPeg.safeGet().getUserId = jest.fn().mockReturnValue(userId); }); afterEach(() => { @@ -118,7 +118,7 @@ describe("", () => { }); it("renders not logged in message", () => { - MatrixClientPeg.get().isGuest = jest.fn().mockReturnValue(true); + MatrixClientPeg.safeGet().isGuest = jest.fn().mockReturnValue(true); const component = getComponent({ loading: true }); expect(isSpinnerRendered(component)).toBeFalsy(); @@ -126,7 +126,7 @@ describe("", () => { }); it("should send room oob data to start login", async () => { - MatrixClientPeg.get().isGuest = jest.fn().mockReturnValue(true); + MatrixClientPeg.safeGet().isGuest = jest.fn().mockReturnValue(true); const component = getComponent({ oobData: { name: "Room Name", @@ -339,7 +339,7 @@ describe("", () => { describe("when client fails to get 3PIDs", () => { beforeEach(() => { - MatrixClientPeg.get().getThreePids = jest.fn().mockRejectedValue({ errCode: "TEST_ERROR" }); + MatrixClientPeg.safeGet().getThreePids = jest.fn().mockRejectedValue({ errCode: "TEST_ERROR" }); }); it("renders error message", async () => { @@ -354,7 +354,7 @@ describe("", () => { describe("when invitedEmail is not associated with current account", () => { beforeEach(() => { - MatrixClientPeg.get().getThreePids = jest + MatrixClientPeg.safeGet().getThreePids = jest .fn() .mockResolvedValue({ threepids: mockThreePids.slice(1) }); }); @@ -371,8 +371,8 @@ describe("", () => { describe("when client has no identity server connected", () => { beforeEach(() => { - MatrixClientPeg.get().getThreePids = jest.fn().mockResolvedValue({ threepids: mockThreePids }); - MatrixClientPeg.get().getIdentityServerUrl = jest.fn().mockReturnValue(false); + MatrixClientPeg.safeGet().getThreePids = jest.fn().mockResolvedValue({ threepids: mockThreePids }); + MatrixClientPeg.safeGet().getIdentityServerUrl = jest.fn().mockReturnValue(false); }); it("renders invite message with invited email", async () => { @@ -387,18 +387,18 @@ describe("", () => { describe("when client has an identity server connected", () => { beforeEach(() => { - MatrixClientPeg.get().getThreePids = jest.fn().mockResolvedValue({ threepids: mockThreePids }); - MatrixClientPeg.get().getIdentityServerUrl = jest.fn().mockReturnValue("identity.test"); - MatrixClientPeg.get().lookupThreePid = jest.fn().mockResolvedValue("identity.test"); + MatrixClientPeg.safeGet().getThreePids = jest.fn().mockResolvedValue({ threepids: mockThreePids }); + MatrixClientPeg.safeGet().getIdentityServerUrl = jest.fn().mockReturnValue("identity.test"); + MatrixClientPeg.safeGet().lookupThreePid = jest.fn().mockResolvedValue("identity.test"); }); it("renders email mismatch message when invite email mxid doesnt match", async () => { - MatrixClientPeg.get().lookupThreePid = jest.fn().mockReturnValue("not userid"); + MatrixClientPeg.safeGet().lookupThreePid = jest.fn().mockReturnValue("not userid"); const component = getComponent({ inviterName, invitedEmail }); await new Promise(setImmediate); expect(getMessage(component)).toMatchSnapshot(); - expect(MatrixClientPeg.get().lookupThreePid).toHaveBeenCalledWith( + expect(MatrixClientPeg.safeGet().lookupThreePid).toHaveBeenCalledWith( "email", invitedEmail, "mock-token", @@ -407,7 +407,7 @@ describe("", () => { }); it("renders invite message when invite email mxid match", async () => { - MatrixClientPeg.get().lookupThreePid = jest.fn().mockReturnValue(userId); + MatrixClientPeg.safeGet().lookupThreePid = jest.fn().mockReturnValue(userId); const component = getComponent({ inviterName, invitedEmail }); await new Promise(setImmediate); diff --git a/test/components/views/rooms/RoomPreviewCard-test.tsx b/test/components/views/rooms/RoomPreviewCard-test.tsx index 3064337697b..a2f28e8e877 100644 --- a/test/components/views/rooms/RoomPreviewCard-test.tsx +++ b/test/components/views/rooms/RoomPreviewCard-test.tsx @@ -40,7 +40,7 @@ describe("RoomPreviewCard", () => { beforeEach(() => { stubClient(); - client = mocked(MatrixClientPeg.get()); + client = mocked(MatrixClientPeg.safeGet()); client.getUserId.mockReturnValue("@alice:example.org"); DMRoomMap.makeShared(client); diff --git a/test/components/views/rooms/SearchResultTile-test.tsx b/test/components/views/rooms/SearchResultTile-test.tsx index 10983e32e41..c57aa7971e7 100644 --- a/test/components/views/rooms/SearchResultTile-test.tsx +++ b/test/components/views/rooms/SearchResultTile-test.tsx @@ -31,7 +31,7 @@ type Props = React.ComponentPropsWithoutRef; describe("SearchResultTile", () => { beforeAll(() => { stubClient(); - const cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.safeGet(); const room = new Room(ROOM_ID, cli, "@bob:example.org"); jest.spyOn(cli, "getRoom").mockReturnValue(room); diff --git a/test/components/views/rooms/VoiceRecordComposerTile-test.tsx b/test/components/views/rooms/VoiceRecordComposerTile-test.tsx index eedf874117c..fa0b61ef1df 100644 --- a/test/components/views/rooms/VoiceRecordComposerTile-test.tsx +++ b/test/components/views/rooms/VoiceRecordComposerTile-test.tsx @@ -56,6 +56,7 @@ describe("", () => { sendMessage: jest.fn(), } as unknown as MatrixClient; MatrixClientPeg.get = () => mockClient; + MatrixClientPeg.safeGet = () => mockClient; const room = { roomId, diff --git a/test/components/views/settings/CryptographyPanel-test.tsx b/test/components/views/settings/CryptographyPanel-test.tsx index 41be17b0760..0107bedcb88 100644 --- a/test/components/views/settings/CryptographyPanel-test.tsx +++ b/test/components/views/settings/CryptographyPanel-test.tsx @@ -29,7 +29,7 @@ describe("CryptographyPanel", () => { const sessionKeyFormatted = "AbCD eFgh IJK7 L/m4 nOPq RSTU VW4x yzaB CDef 6gHI Jkl"; TestUtils.stubClient(); - const client: MatrixClient = MatrixClientPeg.get(); + const client: MatrixClient = MatrixClientPeg.safeGet(); client.deviceId = sessionId; client.getDeviceEd25519Key = () => sessionKey; diff --git a/test/components/views/settings/tabs/room/AdvancedRoomSettingsTab-test.tsx b/test/components/views/settings/tabs/room/AdvancedRoomSettingsTab-test.tsx index bd026db3678..65d5265b737 100644 --- a/test/components/views/settings/tabs/room/AdvancedRoomSettingsTab-test.tsx +++ b/test/components/views/settings/tabs/room/AdvancedRoomSettingsTab-test.tsx @@ -41,7 +41,7 @@ describe("AdvancedRoomSettingsTab", () => { beforeEach(() => { stubClient(); - cli = MatrixClientPeg.get(); + cli = MatrixClientPeg.safeGet(); room = mkStubRoom(roomId, "test room", cli); mocked(cli.getRoom).mockReturnValue(room); mocked(dis.dispatch).mockReset(); diff --git a/test/components/views/settings/tabs/room/NotificationSettingsTab-test.tsx b/test/components/views/settings/tabs/room/NotificationSettingsTab-test.tsx index 6e5a3e69825..9f7c7ed484e 100644 --- a/test/components/views/settings/tabs/room/NotificationSettingsTab-test.tsx +++ b/test/components/views/settings/tabs/room/NotificationSettingsTab-test.tsx @@ -38,7 +38,7 @@ describe("NotificatinSettingsTab", () => { beforeEach(() => { stubClient(); - cli = MatrixClientPeg.get(); + cli = MatrixClientPeg.safeGet(); const room = mkStubRoom(roomId, "test room", cli); roomProps = EchoChamber.forRoom(room); diff --git a/test/components/views/settings/tabs/room/RolesRoomSettingsTab-test.tsx b/test/components/views/settings/tabs/room/RolesRoomSettingsTab-test.tsx index 3b8ea44e77b..9ee9df774c6 100644 --- a/test/components/views/settings/tabs/room/RolesRoomSettingsTab-test.tsx +++ b/test/components/views/settings/tabs/room/RolesRoomSettingsTab-test.tsx @@ -50,7 +50,7 @@ describe("RolesRoomSettingsTab", () => { beforeEach(() => { stubClient(); - cli = MatrixClientPeg.get(); + cli = MatrixClientPeg.safeGet(); room = mkStubRoom(roomId, "test room", cli); }); diff --git a/test/components/views/settings/tabs/room/VoipRoomSettingsTab-test.tsx b/test/components/views/settings/tabs/room/VoipRoomSettingsTab-test.tsx index 7e14a6f5dc4..ab7094f333a 100644 --- a/test/components/views/settings/tabs/room/VoipRoomSettingsTab-test.tsx +++ b/test/components/views/settings/tabs/room/VoipRoomSettingsTab-test.tsx @@ -38,7 +38,7 @@ describe("VoipRoomSettingsTab", () => { beforeEach(() => { stubClient(); - cli = MatrixClientPeg.get(); + cli = MatrixClientPeg.safeGet(); room = mkStubRoom(roomId, "test room", cli); jest.spyOn(cli, "sendStateEvent"); diff --git a/test/components/views/settings/tabs/user/PreferencesUserSettingsTab-test.tsx b/test/components/views/settings/tabs/user/PreferencesUserSettingsTab-test.tsx index 88eb1aa1cc6..6eafde504e7 100644 --- a/test/components/views/settings/tabs/user/PreferencesUserSettingsTab-test.tsx +++ b/test/components/views/settings/tabs/user/PreferencesUserSettingsTab-test.tsx @@ -53,7 +53,7 @@ describe("PreferencesUserSettingsTab", () => { const getToggle = () => renderTab().getByRole("switch", { name: "Send read receipts" }); const mockIsVersionSupported = (val: boolean) => { - const client = MatrixClientPeg.get(); + const client = MatrixClientPeg.safeGet(); jest.spyOn(client, "doesServerSupportUnstableFeature").mockResolvedValue(false); jest.spyOn(client, "isVersionSupported").mockImplementation(async (version: string) => { if (version === "v1.4") return val; diff --git a/test/components/views/spaces/SpaceSettingsVisibilityTab-test.tsx b/test/components/views/spaces/SpaceSettingsVisibilityTab-test.tsx index a7d507e0114..23eb668d728 100644 --- a/test/components/views/spaces/SpaceSettingsVisibilityTab-test.tsx +++ b/test/components/views/spaces/SpaceSettingsVisibilityTab-test.tsx @@ -107,6 +107,7 @@ describe("", () => { (mockMatrixClient.sendStateEvent as jest.Mock).mockClear().mockResolvedValue({}); MatrixClientPeg.get = jest.fn().mockReturnValue(mockMatrixClient); + MatrixClientPeg.safeGet = jest.fn().mockReturnValue(mockMatrixClient); }); afterEach(() => { diff --git a/test/components/views/spaces/SpaceTreeLevel-test.tsx b/test/components/views/spaces/SpaceTreeLevel-test.tsx index db10ef3fba6..a44a09dfd4c 100644 --- a/test/components/views/spaces/SpaceTreeLevel-test.tsx +++ b/test/components/views/spaces/SpaceTreeLevel-test.tsx @@ -39,8 +39,8 @@ jest.mock("../../../../src/stores/spaces/SpaceStore", () => { describe("SpaceButton", () => { stubClient(); - const space = mkRoom(MatrixClientPeg.get(), "!1:example.org"); - DMRoomMap.makeShared(MatrixClientPeg.get()); + const space = mkRoom(MatrixClientPeg.safeGet(), "!1:example.org"); + DMRoomMap.makeShared(MatrixClientPeg.safeGet()); const dispatchSpy = jest.spyOn(defaultDispatcher, "dispatch"); diff --git a/test/components/views/voip/CallView-test.tsx b/test/components/views/voip/CallView-test.tsx index 97937954ab1..9c276babed4 100644 --- a/test/components/views/voip/CallView-test.tsx +++ b/test/components/views/voip/CallView-test.tsx @@ -54,7 +54,7 @@ describe("CallLobby", () => { mocked(navigator.mediaDevices.enumerateDevices).mockResolvedValue([]); stubClient(); - client = mocked(MatrixClientPeg.get()); + client = mocked(MatrixClientPeg.safeGet()); room = new Room("!1:example.org", client, "@alice:example.org", { pendingEventOrdering: PendingEventOrdering.Detached, diff --git a/test/createRoom-test.ts b/test/createRoom-test.ts index 21ff75c5ca5..c0fc46d3f8f 100644 --- a/test/createRoom-test.ts +++ b/test/createRoom-test.ts @@ -32,7 +32,7 @@ describe("createRoom", () => { let client: Mocked; beforeEach(() => { stubClient(); - client = mocked(MatrixClientPeg.get()); + client = mocked(MatrixClientPeg.safeGet()); }); afterEach(() => jest.clearAllMocks()); diff --git a/test/hooks/useProfileInfo-test.tsx b/test/hooks/useProfileInfo-test.tsx index 8416d7c8935..63b78f78b17 100644 --- a/test/hooks/useProfileInfo-test.tsx +++ b/test/hooks/useProfileInfo-test.tsx @@ -31,7 +31,7 @@ describe("useProfileInfo", () => { beforeEach(() => { stubClient(); - cli = MatrixClientPeg.get(); + cli = MatrixClientPeg.safeGet(); cli.getProfileInfo = (query) => { return Promise.resolve({ avatar_url: undefined, diff --git a/test/hooks/usePublicRoomDirectory-test.tsx b/test/hooks/usePublicRoomDirectory-test.tsx index 9a5c95007db..c313e54d9b9 100644 --- a/test/hooks/usePublicRoomDirectory-test.tsx +++ b/test/hooks/usePublicRoomDirectory-test.tsx @@ -31,7 +31,7 @@ describe("usePublicRoomDirectory", () => { beforeEach(() => { stubClient(); - cli = MatrixClientPeg.get(); + cli = MatrixClientPeg.safeGet(); MatrixClientPeg.getHomeserverName = () => "matrix.org"; cli.getThirdpartyProtocols = () => Promise.resolve({}); diff --git a/test/hooks/useUserDirectory-test.tsx b/test/hooks/useUserDirectory-test.tsx index 2ae9ae0d3cd..8d2906f349b 100644 --- a/test/hooks/useUserDirectory-test.tsx +++ b/test/hooks/useUserDirectory-test.tsx @@ -31,7 +31,7 @@ describe("useUserDirectory", () => { beforeEach(() => { stubClient(); - cli = MatrixClientPeg.get(); + cli = MatrixClientPeg.safeGet(); MatrixClientPeg.getHomeserverName = () => "matrix.org"; cli.getThirdpartyProtocols = () => Promise.resolve({}); diff --git a/test/models/Call-test.ts b/test/models/Call-test.ts index 43d26f0dbce..73c62f71375 100644 --- a/test/models/Call-test.ts +++ b/test/models/Call-test.ts @@ -68,7 +68,7 @@ const setUpClientRoomAndStores = (): { carol: RoomMember; } => { stubClient(); - const client = mocked(MatrixClientPeg.get()); + const client = mocked(MatrixClientPeg.safeGet()); const room = new Room("!1:example.org", client, "@alice:example.org", { pendingEventOrdering: PendingEventOrdering.Detached, diff --git a/test/settings/handlers/DeviceSettingsHandler-test.ts b/test/settings/handlers/DeviceSettingsHandler-test.ts index 19d19d4c819..ad9eec99e7a 100644 --- a/test/settings/handlers/DeviceSettingsHandler-test.ts +++ b/test/settings/handlers/DeviceSettingsHandler-test.ts @@ -66,6 +66,7 @@ describe("DeviceSettingsHandler", () => { afterEach(() => { MatrixClientPeg.get = () => null; + MatrixClientPeg.safeGet = () => null; }); it("Returns the value for a disabled feature", () => { diff --git a/test/stores/SpaceStore-test.ts b/test/stores/SpaceStore-test.ts index d66c74b7a1a..2989ade34ea 100644 --- a/test/stores/SpaceStore-test.ts +++ b/test/stores/SpaceStore-test.ts @@ -93,7 +93,7 @@ DMRoomMap.sharedInstance = { getUserIdForRoomId, getDMRoomsForUserId }; describe("SpaceStore", () => { stubClient(); const store = SpaceStore.instance; - const client = MatrixClientPeg.get(); + const client = MatrixClientPeg.safeGet(); const spyDispatcher = jest.spyOn(defaultDispatcher, "dispatch"); diff --git a/test/stores/right-panel/RightPanelStore-test.ts b/test/stores/right-panel/RightPanelStore-test.ts index 5b937e52adc..08ec1f01c64 100644 --- a/test/stores/right-panel/RightPanelStore-test.ts +++ b/test/stores/right-panel/RightPanelStore-test.ts @@ -36,7 +36,7 @@ describe("RightPanelStore", () => { let cli: MockedObject; beforeEach(() => { stubClient(); - cli = mocked(MatrixClientPeg.get()); + cli = mocked(MatrixClientPeg.safeGet()); DMRoomMap.makeShared(cli); // Make sure we start with a clean store diff --git a/test/stores/room-list/SpaceWatcher-test.ts b/test/stores/room-list/SpaceWatcher-test.ts index c8a7c4f6604..1fa5dc8c08c 100644 --- a/test/stores/room-list/SpaceWatcher-test.ts +++ b/test/stores/room-list/SpaceWatcher-test.ts @@ -49,7 +49,7 @@ const space2 = "!space2:server"; describe("SpaceWatcher", () => { stubClient(); const store = SpaceStore.instance; - const client = mocked(MatrixClientPeg.get()); + const client = mocked(MatrixClientPeg.safeGet()); let rooms: Room[] = []; const mkSpaceForRooms = (spaceId: string, children: string[] = []) => mkSpace(client, spaceId, rooms, children); diff --git a/test/stores/room-list/algorithms/Algorithm-test.ts b/test/stores/room-list/algorithms/Algorithm-test.ts index 078b92690c9..762848a45cc 100644 --- a/test/stores/room-list/algorithms/Algorithm-test.ts +++ b/test/stores/room-list/algorithms/Algorithm-test.ts @@ -40,7 +40,7 @@ describe("Algorithm", () => { beforeEach(() => { stubClient(); - client = mocked(MatrixClientPeg.get()); + client = mocked(MatrixClientPeg.safeGet()); DMRoomMap.makeShared(client); algorithm = new Algorithm(); diff --git a/test/stores/room-list/algorithms/RecentAlgorithm-test.ts b/test/stores/room-list/algorithms/RecentAlgorithm-test.ts index d86fe9e7759..7eb71f5b815 100644 --- a/test/stores/room-list/algorithms/RecentAlgorithm-test.ts +++ b/test/stores/room-list/algorithms/RecentAlgorithm-test.ts @@ -31,7 +31,7 @@ describe("RecentAlgorithm", () => { beforeEach(() => { stubClient(); - cli = MatrixClientPeg.get(); + cli = MatrixClientPeg.safeGet(); algorithm = new RecentAlgorithm(); }); diff --git a/test/stores/room-list/previews/ReactionEventPreview-test.ts b/test/stores/room-list/previews/ReactionEventPreview-test.ts index e49dba342c3..9351cdb6255 100644 --- a/test/stores/room-list/previews/ReactionEventPreview-test.ts +++ b/test/stores/room-list/previews/ReactionEventPreview-test.ts @@ -60,7 +60,7 @@ describe("ReactionEventPreview", () => { }); it("should use 'You' for your own reactions", () => { - const cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.safeGet(); const room = new Room(roomId, cli, userId); mocked(cli.getRoom).mockReturnValue(room); @@ -97,7 +97,7 @@ describe("ReactionEventPreview", () => { }); it("should use display name for your others' reactions", () => { - const cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.safeGet(); const room = new Room(roomId, cli, userId); mocked(cli.getRoom).mockReturnValue(room); diff --git a/test/stores/widgets/StopGapWidget-test.ts b/test/stores/widgets/StopGapWidget-test.ts index 89e626a4f02..080be9f53a5 100644 --- a/test/stores/widgets/StopGapWidget-test.ts +++ b/test/stores/widgets/StopGapWidget-test.ts @@ -36,7 +36,7 @@ describe("StopGapWidget", () => { beforeEach(() => { stubClient(); - client = mocked(MatrixClientPeg.get()); + client = mocked(MatrixClientPeg.safeGet()); widget = new StopGapWidget({ app: { diff --git a/test/stores/widgets/StopGapWidgetDriver-test.ts b/test/stores/widgets/StopGapWidgetDriver-test.ts index 756da3f5c74..b5bea5b692e 100644 --- a/test/stores/widgets/StopGapWidgetDriver-test.ts +++ b/test/stores/widgets/StopGapWidgetDriver-test.ts @@ -61,7 +61,7 @@ describe("StopGapWidgetDriver", () => { beforeEach(() => { stubClient(); - client = mocked(MatrixClientPeg.get()); + client = mocked(MatrixClientPeg.safeGet()); client.getUserId.mockReturnValue("@alice:example.org"); }); diff --git a/test/test-utils/client.ts b/test/test-utils/client.ts index 52a636a2f63..88b064dbb88 100644 --- a/test/test-utils/client.ts +++ b/test/test-utils/client.ts @@ -71,6 +71,7 @@ export const getMockClientWithEventEmitter = ( const mock = mocked(new MockClientWithEventEmitter(mockProperties) as unknown as MatrixClient); jest.spyOn(MatrixClientPeg, "get").mockReturnValue(mock); + jest.spyOn(MatrixClientPeg, "safeGet").mockReturnValue(mock); // @ts-ignore simplified test stub mock.canSupport = new Map(); @@ -80,7 +81,10 @@ export const getMockClientWithEventEmitter = ( return mock; }; -export const unmockClientPeg = () => jest.spyOn(MatrixClientPeg, "get").mockRestore(); +export const unmockClientPeg = () => { + jest.spyOn(MatrixClientPeg, "get").mockRestore(); + jest.spyOn(MatrixClientPeg, "safeGet").mockRestore(); +}; /** * Returns basic mocked client methods related to the current user diff --git a/test/test-utils/test-utils.ts b/test/test-utils/test-utils.ts index 9a36c0d5185..6eea4114d23 100644 --- a/test/test-utils/test-utils.ts +++ b/test/test-utils/test-utils.ts @@ -69,13 +69,13 @@ export function stubClient(): MatrixClient { // 'sandbox.restore()' doesn't work correctly on inherited methods, // so we do this for each method jest.spyOn(peg, "get"); + jest.spyOn(peg, "safeGet"); jest.spyOn(peg, "unset"); jest.spyOn(peg, "replaceUsingCreds"); - // MatrixClientPeg.get() is called a /lot/, so implement it with our own + // MatrixClientPeg.safeGet() is called a /lot/, so implement it with our own // fast stub function rather than a sinon stub - peg.get = function () { - return client; - }; + peg.get = () => client; + peg.safeGet = () => client; MatrixClientBackedSettingsHandler.matrixClient = client; return client; } diff --git a/test/test-utils/wrappers.tsx b/test/test-utils/wrappers.tsx index 95775381559..cc9b6f35707 100644 --- a/test/test-utils/wrappers.tsx +++ b/test/test-utils/wrappers.tsx @@ -29,7 +29,7 @@ export function wrapInMatrixClientContext(WrappedComponent: ComponentType) constructor(props: WrapperProps) { super(props); - this._matrixClient = peg.get(); + this._matrixClient = peg.safeGet(); } render() { diff --git a/test/toasts/IncomingCallToast-test.tsx b/test/toasts/IncomingCallToast-test.tsx index 33b9c94609d..413ba4e7f94 100644 --- a/test/toasts/IncomingCallToast-test.tsx +++ b/test/toasts/IncomingCallToast-test.tsx @@ -60,7 +60,7 @@ describe("IncomingCallEvent", () => { beforeEach(async () => { stubClient(); - client = mocked(MatrixClientPeg.get()); + client = mocked(MatrixClientPeg.safeGet()); room = new Room("!1:example.org", client, "@alice:example.org"); diff --git a/test/useTopic-test.tsx b/test/useTopic-test.tsx index 2fffa3aff9c..d1053bc4044 100644 --- a/test/useTopic-test.tsx +++ b/test/useTopic-test.tsx @@ -25,7 +25,7 @@ import { MatrixClientPeg } from "../src/MatrixClientPeg"; describe("useTopic", () => { it("should display the room topic", () => { stubClient(); - const room = new Room("!TESTROOM", MatrixClientPeg.get(), "@alice:example.org"); + const room = new Room("!TESTROOM", MatrixClientPeg.safeGet(), "@alice:example.org"); const topic = mkEvent({ type: "m.room.topic", room: "!TESTROOM", diff --git a/test/utils/EventUtils-test.ts b/test/utils/EventUtils-test.ts index e6fdf7eb4b4..6ad8f170b6c 100644 --- a/test/utils/EventUtils-test.ts +++ b/test/utils/EventUtils-test.ts @@ -430,7 +430,7 @@ describe("EventUtils", () => { jest.clearAllMocks(); stubClient(); - client = MatrixClientPeg.get(); + client = MatrixClientPeg.safeGet(); room = new Room(ROOM_ID, client, client.getUserId()!, { pendingEventOrdering: PendingEventOrdering.Detached, diff --git a/test/utils/MultiInviter-test.ts b/test/utils/MultiInviter-test.ts index 8bdc772ab1e..2c25cd5e3a4 100644 --- a/test/utils/MultiInviter-test.ts +++ b/test/utils/MultiInviter-test.ts @@ -80,7 +80,7 @@ describe("MultiInviter", () => { jest.resetAllMocks(); TestUtilsMatrix.stubClient(); - client = MatrixClientPeg.get() as jest.Mocked; + client = MatrixClientPeg.safeGet() as jest.Mocked; client.invite = jest.fn(); client.invite.mockResolvedValue({}); diff --git a/test/utils/export-test.tsx b/test/utils/export-test.tsx index d018b83cff6..8565c42ef6d 100644 --- a/test/utils/export-test.tsx +++ b/test/utils/export-test.tsx @@ -53,7 +53,7 @@ describe("export", function () { let events: MatrixEvent[]; beforeEach(() => { stubClient(); - client = MatrixClientPeg.get(); + client = MatrixClientPeg.safeGet(); client.getUserId = () => { return MY_USER_ID; }; diff --git a/test/utils/leave-behaviour-test.ts b/test/utils/leave-behaviour-test.ts index 7bf6c2e47d1..778dbb50236 100644 --- a/test/utils/leave-behaviour-test.ts +++ b/test/utils/leave-behaviour-test.ts @@ -40,7 +40,7 @@ describe("leaveRoomBehaviour", () => { beforeEach(async () => { stubClient(); - client = mocked(MatrixClientPeg.get()); + client = mocked(MatrixClientPeg.safeGet()); DMRoomMap.makeShared(client); room = mkRoom(client, "!1:example.org"); diff --git a/test/utils/notifications-test.ts b/test/utils/notifications-test.ts index 005444a142c..58d0fd9b17a 100644 --- a/test/utils/notifications-test.ts +++ b/test/utils/notifications-test.ts @@ -119,7 +119,7 @@ describe("notifications", () => { beforeEach(() => { stubClient(); - client = mocked(MatrixClientPeg.get()); + client = mocked(MatrixClientPeg.safeGet()); room = new Room(ROOM_ID, client, USER_ID); message = mkMessage({ event: true, @@ -172,7 +172,7 @@ describe("notifications", () => { beforeEach(() => { stubClient(); - client = mocked(MatrixClientPeg.get()); + client = mocked(MatrixClientPeg.safeGet()); room = new Room(ROOM_ID, client, USER_ID); sendReadReceiptSpy = jest.spyOn(client, "sendReadReceipt").mockResolvedValue({}); jest.spyOn(client, "getRooms").mockReturnValue([room]); diff --git a/test/utils/pillify-test.tsx b/test/utils/pillify-test.tsx index f33e9f966f3..bdcc73ad1db 100644 --- a/test/utils/pillify-test.tsx +++ b/test/utils/pillify-test.tsx @@ -36,7 +36,7 @@ describe("pillify", () => { beforeEach(() => { stubClient(); - const cli = MatrixClientPeg.get(); + const cli = MatrixClientPeg.safeGet(); (cli.getRoom as jest.Mock).mockReturnValue(new Room(roomId, cli, cli.getUserId()!)); cli.pushRules!.global = { override: [ @@ -69,7 +69,7 @@ describe("pillify", () => { const { container } = render(
); const originalHtml = container.outerHTML; const containers: Element[] = []; - pillifyLinks(MatrixClientPeg.get(), [container], event, containers); + pillifyLinks(MatrixClientPeg.safeGet(), [container], event, containers); expect(containers).toHaveLength(0); expect(container.outerHTML).toEqual(originalHtml); }); @@ -77,7 +77,7 @@ describe("pillify", () => { it("should pillify @room", () => { const { container } = render(
@room
); const containers: Element[] = []; - pillifyLinks(MatrixClientPeg.get(), [container], event, containers); + pillifyLinks(MatrixClientPeg.safeGet(), [container], event, containers); expect(containers).toHaveLength(1); expect(container.querySelector(".mx_Pill.mx_AtRoomPill")?.textContent).toBe("!@room"); }); @@ -85,10 +85,10 @@ describe("pillify", () => { it("should not double up pillification on repeated calls", () => { const { container } = render(
@room
); const containers: Element[] = []; - pillifyLinks(MatrixClientPeg.get(), [container], event, containers); - pillifyLinks(MatrixClientPeg.get(), [container], event, containers); - pillifyLinks(MatrixClientPeg.get(), [container], event, containers); - pillifyLinks(MatrixClientPeg.get(), [container], event, containers); + pillifyLinks(MatrixClientPeg.safeGet(), [container], event, containers); + pillifyLinks(MatrixClientPeg.safeGet(), [container], event, containers); + pillifyLinks(MatrixClientPeg.safeGet(), [container], event, containers); + pillifyLinks(MatrixClientPeg.safeGet(), [container], event, containers); expect(containers).toHaveLength(1); expect(container.querySelector(".mx_Pill.mx_AtRoomPill")?.textContent).toBe("!@room"); }); diff --git a/test/voice-broadcast/utils/textForVoiceBroadcastStoppedEvent-test.tsx b/test/voice-broadcast/utils/textForVoiceBroadcastStoppedEvent-test.tsx index 03593962821..3629947fb56 100644 --- a/test/voice-broadcast/utils/textForVoiceBroadcastStoppedEvent-test.tsx +++ b/test/voice-broadcast/utils/textForVoiceBroadcastStoppedEvent-test.tsx @@ -48,7 +48,7 @@ describe("textForVoiceBroadcastStoppedEvent", () => { }; } - return render(
{textForVoiceBroadcastStoppedEvent(event)()}
); + return render(
{textForVoiceBroadcastStoppedEvent(event, client)()}
); }; beforeEach(() => { From 68ebcd295624e90fa838b8e7b76d74bf9b1f932a Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Mon, 5 Jun 2023 17:02:20 +0200 Subject: [PATCH 10/54] Removed `DecryptionFailureBar.tsx` (#11027) --- cypress/e2e/crypto/decryption-failure.spec.ts | 277 ------- src/components/structures/RoomView.tsx | 26 - .../views/rooms/DecryptionFailureBar.tsx | 270 ------- src/i18n/strings/en_EN.json | 12 - .../views/rooms/DecryptionFailureBar-test.tsx | 449 ----------- .../DecryptionFailureBar-test.tsx.snap | 705 ------------------ 6 files changed, 1739 deletions(-) delete mode 100644 cypress/e2e/crypto/decryption-failure.spec.ts delete mode 100644 src/components/views/rooms/DecryptionFailureBar.tsx delete mode 100644 test/components/views/rooms/DecryptionFailureBar-test.tsx delete mode 100644 test/components/views/rooms/__snapshots__/DecryptionFailureBar-test.tsx.snap diff --git a/cypress/e2e/crypto/decryption-failure.spec.ts b/cypress/e2e/crypto/decryption-failure.spec.ts deleted file mode 100644 index 4de2af0e818..00000000000 --- a/cypress/e2e/crypto/decryption-failure.spec.ts +++ /dev/null @@ -1,277 +0,0 @@ -/* -Copyright 2022 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import type { VerificationRequest } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; -import type { MatrixClient } from "matrix-js-sdk/src/matrix"; -import { HomeserverInstance } from "../../plugins/utils/homeserver"; -import { UserCredentials } from "../../support/login"; -import { handleVerificationRequest } from "./utils"; -import { skipIfRustCrypto } from "../../support/util"; - -const ROOM_NAME = "Test room"; -const TEST_USER = "Alia"; -const BOT_USER = "Benjamin"; - -type EmojiMapping = [emoji: string, name: string]; - -const waitForVerificationRequest = (cli: MatrixClient): Promise => { - return new Promise((resolve) => { - const onVerificationRequestEvent = (request: VerificationRequest) => { - // @ts-ignore CryptoEvent is not exported to window.matrixcs; using the string value here - cli.off("crypto.verification.request", onVerificationRequestEvent); - resolve(request); - }; - // @ts-ignore - cli.on("crypto.verification.request", onVerificationRequestEvent); - }); -}; - -const checkTimelineNarrow = (button = true) => { - cy.viewport(800, 600); // SVGA - cy.get(".mx_LeftPanel_minimized").should("exist"); // Wait until the left panel is minimized - cy.findByRole("button", { name: "Room info" }).click(); // Open the right panel to make the timeline narrow - cy.get(".mx_BaseCard").should("exist"); - - // Ensure the failure bar does not cover the timeline - cy.get(".mx_RoomView_body .mx_EventTile.mx_EventTile_last").should("be.visible"); - - // Ensure the indicator does not overflow the timeline - cy.findByTestId("decryption-failure-bar-indicator").should("be.visible"); - - if (button) { - // Ensure the button does not overflow the timeline - cy.get("[data-testid='decryption-failure-bar-button']:last-of-type").should("be.visible"); - } - - cy.findByRole("button", { name: "Room info" }).click(); // Close the right panel - cy.get(".mx_BaseCard").should("not.exist"); - cy.viewport(1000, 660); // Reset to the default size -}; - -describe("Decryption Failure Bar", () => { - let homeserver: HomeserverInstance | undefined; - let testUser: UserCredentials | undefined; - let bot: MatrixClient | undefined; - let roomId: string; - - beforeEach(function () { - skipIfRustCrypto(); - cy.startHomeserver("default").then((hs: HomeserverInstance) => { - homeserver = hs; - cy.initTestUser(homeserver, TEST_USER) - .then((creds: UserCredentials) => { - testUser = creds; - }) - .then(() => { - cy.getBot(homeserver, { displayName: BOT_USER }).then((cli) => { - bot = cli; - }); - }) - .then(() => { - cy.createRoom({ name: ROOM_NAME }).then((id) => { - roomId = id; - }); - }) - .then(() => { - cy.inviteUser(roomId, bot.getUserId()); - cy.visit("/#/room/" + roomId); - cy.findByText(BOT_USER + " joined the room").should("exist"); - }) - .then(() => { - cy.getClient() - .then(async (cli) => { - await cli.setRoomEncryption(roomId, { algorithm: "m.megolm.v1.aes-sha2" }); - await bot.setRoomEncryption(roomId, { algorithm: "m.megolm.v1.aes-sha2" }); - }) - .then(() => { - bot.getRoom(roomId).setBlacklistUnverifiedDevices(true); - }); - }); - }); - }); - - afterEach(() => { - cy.stopHomeserver(homeserver); - }); - - it( - "should prompt the user to verify, if this device isn't verified " + - "and there are other verified devices or backups", - () => { - let otherDevice: MatrixClient | undefined; - cy.loginBot(homeserver, testUser.username, testUser.password, { bootstrapCrossSigning: true }) - .then(async (cli) => { - otherDevice = cli; - }) - .then(() => { - cy.botSendMessage(bot, roomId, "test"); - cy.get(".mx_DecryptionFailureBar_start_headline").within(() => { - cy.findByText("Decrypting messages…").should("be.visible"); - cy.findByText("Verify this device to access all messages").should("be.visible"); - }); - - checkTimelineNarrow(); - - cy.get(".mx_DecryptionFailureBar").percySnapshotElement( - "DecryptionFailureBar prompts user to verify", - { - widths: [320, 640], - }, - ); - - cy.get(".mx_DecryptionFailureBar_end").within(() => { - cy.findByText("Resend key requests").should("not.exist"); - cy.findByRole("button", { name: "Verify" }).click(); - }); - - const verificationRequestPromise = waitForVerificationRequest(otherDevice); - cy.findByRole("button", { name: "Verify with another device" }).click(); - cy.findByText("To proceed, please accept the verification request on your other device.").should( - "be.visible", - ); - cy.wrap(verificationRequestPromise).then((verificationRequest: VerificationRequest) => { - cy.wrap(verificationRequest.accept()); - cy.wrap( - handleVerificationRequest(verificationRequest), - // extra timeout, as this sometimes takes a while - { timeout: 30_000 }, - ).then((emojis: EmojiMapping[]) => { - cy.get(".mx_VerificationShowSas_emojiSas_block").then((emojiBlocks) => { - emojis.forEach((emoji: EmojiMapping, index: number) => { - expect(emojiBlocks[index].textContent.toLowerCase()).to.eq(emoji[0] + emoji[1]); - }); - }); - }); - }); - }); - cy.findByRole("button", { name: "They match" }).click(); - cy.get(".mx_VerificationPanel_verified_section .mx_E2EIcon_verified").should("exist"); - cy.findByRole("button", { name: "Got it" }).click(); - - cy.get(".mx_DecryptionFailureBar_start_headline").within(() => { - cy.findByText("Open another device to load encrypted messages").should("be.visible"); - }); - - checkTimelineNarrow(); - - cy.get(".mx_DecryptionFailureBar").percySnapshotElement( - "DecryptionFailureBar prompts user to open another device, with Resend Key Requests button", - { - widths: [320, 640], - }, - ); - - cy.intercept("/_matrix/client/r0/sendToDevice/m.room_key_request/*").as("keyRequest"); - cy.findByRole("button", { name: "Resend key requests" }).click(); - cy.wait("@keyRequest"); - cy.get(".mx_DecryptionFailureBar_end").within(() => { - cy.findByText("Resend key requests").should("not.exist"); - cy.findByRole("button", { name: "View your device list" }).should("be.visible"); - }); - - checkTimelineNarrow(); - - cy.get(".mx_DecryptionFailureBar").percySnapshotElement( - "DecryptionFailureBar prompts user to open another device, without Resend Key Requests button", - { - widths: [320, 640], - }, - ); - }, - ); - - it( - "should prompt the user to reset keys, if this device isn't verified " + - "and there are no other verified devices or backups", - () => { - cy.loginBot(homeserver, testUser.username, testUser.password, { bootstrapCrossSigning: true }).then( - async (cli) => { - await cli.logout(true); - }, - ); - - cy.botSendMessage(bot, roomId, "test"); - cy.get(".mx_DecryptionFailureBar_start_headline").within(() => { - cy.findByText("Reset your keys to prevent future decryption errors").should("be.visible"); - }); - - checkTimelineNarrow(); - - cy.get(".mx_DecryptionFailureBar").percySnapshotElement("DecryptionFailureBar prompts user to reset keys", { - widths: [320, 640], - }); - - cy.findByRole("button", { name: "Reset" }).click(); - - // Set up key backup - cy.get(".mx_Dialog").within(() => { - cy.findByRole("button", { name: "Continue" }).click(); - cy.get(".mx_CreateSecretStorageDialog_recoveryKey code").invoke("text").as("securityKey"); - // Clicking download instead of Copy because of https://github.com/cypress-io/cypress/issues/2851 - cy.findByRole("button", { name: "Download" }).click(); - cy.get(".mx_Dialog_primary:not([disabled])").should("have.length", 3); - cy.findByRole("button", { name: "Continue" }).click(); - cy.findByRole("button", { name: "Done" }).click(); - }); - - cy.get(".mx_DecryptionFailureBar_start_headline").within(() => { - cy.findByText("Some messages could not be decrypted").should("be.visible"); - }); - - checkTimelineNarrow(false); // button should not be rendered here - - cy.get(".mx_DecryptionFailureBar").percySnapshotElement( - "DecryptionFailureBar displays general message with no call to action", - { - widths: [320, 640], - }, - ); - }, - ); - - it("should appear and disappear as undecryptable messages enter and leave view", () => { - cy.getClient().then((cli) => { - for (let i = 0; i < 25; i++) { - cy.botSendMessage(cli, roomId, `test ${i}`); - } - }); - cy.botSendMessage(bot, roomId, "test"); - cy.get(".mx_DecryptionFailureBar").should("exist"); - cy.get(".mx_DecryptionFailureBar .mx_Spinner").should("exist"); - - cy.get(".mx_DecryptionFailureBar").percySnapshotElement("DecryptionFailureBar displays loading spinner", { - allowSpinners: true, - widths: [320, 640], - }); - - checkTimelineNarrow(); - - cy.wait(5000); - cy.get(".mx_DecryptionFailureBar .mx_Spinner").should("not.exist"); - cy.findByTestId("decryption-failure-bar-icon").should("be.visible"); - - cy.get(".mx_RoomView_messagePanel").scrollTo("top"); - cy.get(".mx_DecryptionFailureBar").should("not.exist"); - - cy.botSendMessage(bot, roomId, "another test"); - cy.get(".mx_DecryptionFailureBar").should("not.exist"); - - cy.get(".mx_RoomView_messagePanel").scrollTo("bottom"); - cy.get(".mx_DecryptionFailureBar").should("exist"); - - checkTimelineNarrow(); - }); -}); diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 9c7cd645d6b..6e4dd7559f2 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -62,7 +62,6 @@ import RoomPreviewBar from "../views/rooms/RoomPreviewBar"; import RoomPreviewCard from "../views/rooms/RoomPreviewCard"; import SearchBar, { SearchScope } from "../views/rooms/SearchBar"; import RoomUpgradeWarningBar from "../views/rooms/RoomUpgradeWarningBar"; -import { DecryptionFailureBar } from "../views/rooms/DecryptionFailureBar"; import AuxPanel from "../views/rooms/AuxPanel"; import RoomHeader, { ISearchInfo } from "../views/rooms/RoomHeader"; import { IOOBData, IThreepidInvite } from "../../stores/ThreepidInviteStore"; @@ -227,8 +226,6 @@ export interface IRoomState { threadId?: string; liveTimeline?: EventTimeline; narrow: boolean; - // List of undecryptable events currently visible on-screen - visibleDecryptionFailures?: MatrixEvent[]; msc3946ProcessDynamicPredecessor: boolean; } @@ -428,7 +425,6 @@ export class RoomView extends React.Component { timelineRenderingType: TimelineRenderingType.Room, liveTimeline: undefined, narrow: false, - visibleDecryptionFailures: [], msc3946ProcessDynamicPredecessor: SettingsStore.getValue("feature_dynamic_room_predecessors"), }; @@ -1244,7 +1240,6 @@ export class RoomView extends React.Component { private onEventDecrypted = (ev: MatrixEvent): void => { if (!this.state.room || !this.state.matrixClientIsReady) return; // not ready at all if (ev.getRoomId() !== this.state.room.roomId) return; // not for us - this.updateVisibleDecryptionFailures(); if (ev.isDecryptionFailure()) return; this.handleEffects(ev); }; @@ -1552,20 +1547,6 @@ export class RoomView extends React.Component { } }; - private updateVisibleDecryptionFailures = throttle( - () => - this.setState((prevState) => ({ - visibleDecryptionFailures: - this.messagePanel?.getVisibleDecryptionFailures( - // If there were visible failures last time we checked, - // add a margin to provide hysteresis and prevent flickering - (prevState.visibleDecryptionFailures?.length ?? 0) > 0, - ) ?? [], - })), - 500, - { leading: false, trailing: true }, - ); - private onMessageListScroll = (): void => { if (this.messagePanel?.isAtEndOfLiveTimeline()) { this.setState({ @@ -1578,7 +1559,6 @@ export class RoomView extends React.Component { }); } this.updateTopUnreadMessagesBar(); - this.updateVisibleDecryptionFailures(); }; private resetJumpToEvent = (eventId?: string): void => { @@ -2203,11 +2183,6 @@ export class RoomView extends React.Component { ); } - let decryptionFailureBar: JSX.Element | undefined; - if (this.state.visibleDecryptionFailures && this.state.visibleDecryptionFailures.length > 0) { - decryptionFailureBar = ; - } - if (this.state.room?.isSpaceRoom() && !this.props.forceTimeline) { return ( { resizeNotifier={this.props.resizeNotifier} > {aux} - {decryptionFailureBar} ); diff --git a/src/components/views/rooms/DecryptionFailureBar.tsx b/src/components/views/rooms/DecryptionFailureBar.tsx deleted file mode 100644 index 74631688676..00000000000 --- a/src/components/views/rooms/DecryptionFailureBar.tsx +++ /dev/null @@ -1,270 +0,0 @@ -/* -Copyright 2022 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React, { useCallback, useContext, useEffect, useState } from "react"; -import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { CryptoEvent } from "matrix-js-sdk/src/crypto"; - -import Modal from "../../../Modal"; -import { _t } from "../../../languageHandler"; -import defaultDispatcher from "../../../dispatcher/dispatcher"; -import { Action } from "../../../dispatcher/actions"; -import AccessibleButton from "../elements/AccessibleButton"; -import { OpenToTabPayload } from "../../../dispatcher/payloads/OpenToTabPayload"; -import MatrixClientContext from "../../../contexts/MatrixClientContext"; -import SetupEncryptionDialog from "../dialogs/security/SetupEncryptionDialog"; -import { SetupEncryptionStore } from "../../../stores/SetupEncryptionStore"; -import Spinner from "../elements/Spinner"; - -interface IProps { - failures: MatrixEvent[]; -} - -// Number of milliseconds to display a loading spinner before prompting the user for action -const WAIT_PERIOD = 5000; - -export const DecryptionFailureBar: React.FC = ({ failures }) => { - const context = useContext(MatrixClientContext); - - // Display a spinner for a few seconds before presenting an error message, - // in case keys are about to arrive - const [waiting, setWaiting] = useState(true); - useEffect(() => { - const timeout = setTimeout(() => setWaiting(false), WAIT_PERIOD); - return () => clearTimeout(timeout); - }, []); - - // Is this device unverified? - const [needsVerification, setNeedsVerification] = useState(false); - // Does this user have verified devices other than this device? - const [hasOtherVerifiedDevices, setHasOtherVerifiedDevices] = useState(false); - // Does this user have key backups? - const [hasKeyBackup, setHasKeyBackup] = useState(false); - - // Keep track of session IDs that the user has sent key - // requests for using the Resend Key Requests button - const [requestedSessions, setRequestedSessions] = useState>(new Set()); - // Keep track of whether there are any sessions the user has not yet sent requests for - const [anyUnrequestedSessions, setAnyUnrequestedSessions] = useState(true); - - useEffect(() => { - setAnyUnrequestedSessions( - failures.some((event) => { - const sessionId = event.getWireContent().session_id; - return sessionId && !requestedSessions.has(sessionId); - }), - ); - }, [failures, requestedSessions, setAnyUnrequestedSessions]); - - // Send key requests for any sessions that we haven't previously - // sent requests for. This is important if, for instance, we - // failed to decrypt a message because a key was withheld (in - // which case, we wouldn't bother requesting the key), but have - // since verified our device. In that case, now that the device is - // verified, other devices might be willing to share the key with us - // now. - const sendKeyRequests = useCallback(() => { - const newRequestedSessions = new Set(requestedSessions); - - for (const event of failures) { - const sessionId = event.getWireContent().session_id; - if (!sessionId || newRequestedSessions.has(sessionId)) continue; - newRequestedSessions.add(sessionId); - context.cancelAndResendEventRoomKeyRequest(event); - } - setRequestedSessions(newRequestedSessions); - }, [context, requestedSessions, setRequestedSessions, failures]); - - // Recheck which devices are verified and whether we have key backups - const updateDeviceInfo = useCallback(async () => { - const deviceId = context.getDeviceId()!; - let verified = true; // if we can't get a clear answer, don't bug the user about verifying - try { - verified = context.checkIfOwnDeviceCrossSigned(deviceId); - } catch (e) { - console.error("Error getting device cross-signing info", e); - } - setNeedsVerification(!verified); - - let otherVerifiedDevices = false; - try { - const devices = context.getStoredDevicesForUser(context.getUserId()!); - otherVerifiedDevices = devices.some( - (device) => device.deviceId !== deviceId && context.checkIfOwnDeviceCrossSigned(device.deviceId), - ); - } catch (e) { - console.error("Error getting info about other devices", e); - } - setHasOtherVerifiedDevices(otherVerifiedDevices); - - let keyBackup = false; - try { - const keys = await context.isSecretStored("m.cross_signing.master"); - keyBackup = keys !== null && Object.keys(keys).length > 0; - } catch (e) { - console.error("Error getting info about key backups", e); - } - setHasKeyBackup(keyBackup); - }, [context]); - - // Update our device info on initial render, and continue updating - // it whenever the client has an update - useEffect(() => { - updateDeviceInfo().catch(console.error); - context.on(CryptoEvent.DevicesUpdated, updateDeviceInfo); - return () => { - context.off(CryptoEvent.DevicesUpdated, updateDeviceInfo); - }; - }, [context, updateDeviceInfo]); - - const onVerifyClick = (): void => { - Modal.createDialog(SetupEncryptionDialog); - }; - - const onDeviceListClick = (): void => { - const payload: OpenToTabPayload = { action: Action.ViewUserDeviceSettings }; - defaultDispatcher.dispatch(payload); - }; - - const onResetClick = (): void => { - const store = SetupEncryptionStore.sharedInstance(); - store.resetConfirm(); - }; - - const statusIndicator = waiting ? ( - - ) : ( -
- ); - - let className; - let headline: JSX.Element; - let message: JSX.Element; - let button = ; - if (waiting) { - className = "mx_DecryptionFailureBar"; - headline = {_t("Decrypting messages…")}; - message = ( - - {_t("Please wait as we try to decrypt your messages. This may take a few moments.")} - - ); - } else if (needsVerification) { - if (hasOtherVerifiedDevices || hasKeyBackup) { - className = "mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"; - headline = {_t("Verify this device to access all messages")}; - message = ( - - {_t("This device was unable to decrypt some messages because it has not been verified yet.")} - - ); - button = ( - - {_t("Verify")} - - ); - } else { - className = "mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"; - headline = {_t("Reset your keys to prevent future decryption errors")}; - message = ( - - {_t( - "You will not be able to access old undecryptable messages, " + - "but resetting your keys will allow you to receive new messages.", - )} - - ); - button = ( - - {_t("Reset")} - - ); - } - } else if (hasOtherVerifiedDevices) { - className = "mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"; - headline = {_t("Open another device to load encrypted messages")}; - message = ( - - {_t( - "This device is requesting decryption keys from your other devices. " + - "Opening one of your other devices may speed this up.", - )} - - ); - button = ( - - {_t("View your device list")} - - ); - } else { - className = "mx_DecryptionFailureBar"; - headline = {_t("Some messages could not be decrypted")}; - message = ( - - {_t( - "Unfortunately, there are no other verified devices to request decryption keys from. " + - "Signing in and verifying other devices may help avoid this situation in the future.", - )} - - ); - } - - let keyRequestButton = ; - if (!needsVerification && hasOtherVerifiedDevices && anyUnrequestedSessions) { - className = "mx_DecryptionFailureBar mx_DecryptionFailureBar--withEnd"; - keyRequestButton = ( - - {_t("Resend key requests")} - - ); - } - - return ( -
-
-
-
{statusIndicator}
-
-
{headline}
-
{message}
-
-
- {button} - {keyRequestButton} -
-
- ); -}; diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 751fbdebf45..d3180f3dfcc 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1884,18 +1884,6 @@ "Remove %(phone)s?": "Remove %(phone)s?", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.", "Phone Number": "Phone Number", - "Decrypting messages…": "Decrypting messages…", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Please wait as we try to decrypt your messages. This may take a few moments.", - "Verify this device to access all messages": "Verify this device to access all messages", - "This device was unable to decrypt some messages because it has not been verified yet.": "This device was unable to decrypt some messages because it has not been verified yet.", - "Reset your keys to prevent future decryption errors": "Reset your keys to prevent future decryption errors", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.", - "Open another device to load encrypted messages": "Open another device to load encrypted messages", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.", - "View your device list": "View your device list", - "Some messages could not be decrypted": "Some messages could not be decrypted", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.", - "Resend key requests": "Resend key requests", "This user has not verified all of their sessions.": "This user has not verified all of their sessions.", "You have not verified this user.": "You have not verified this user.", "You have verified this user. This user has verified all of their sessions.": "You have verified this user. This user has verified all of their sessions.", diff --git a/test/components/views/rooms/DecryptionFailureBar-test.tsx b/test/components/views/rooms/DecryptionFailureBar-test.tsx deleted file mode 100644 index 25b028d7da9..00000000000 --- a/test/components/views/rooms/DecryptionFailureBar-test.tsx +++ /dev/null @@ -1,449 +0,0 @@ -/* -Copyright 2022 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import React from "react"; -import { act, fireEvent, render, screen, waitFor, RenderResult } from "@testing-library/react"; -import "@testing-library/jest-dom"; - -import MatrixClientContext from "../../../../src/contexts/MatrixClientContext"; -import { DecryptionFailureBar } from "../../../../src/components/views/rooms/DecryptionFailureBar"; -import defaultDispatcher from "../../../../src/dispatcher/dispatcher"; -import { Action } from "../../../../src/dispatcher/actions"; - -type MockDevice = { deviceId: string }; - -const verifiedDevice1: MockDevice = { deviceId: "verified1" }; -const verifiedDevice2: MockDevice = { deviceId: "verified2" }; -const unverifiedDevice1: MockDevice = { deviceId: "unverified1" }; -const unverifiedDevice2: MockDevice = { deviceId: "unverified2" }; - -const mockEvent1 = { - event: { event_id: "mockEvent1" }, - getWireContent: () => ({ session_id: "sessionA" }), -}; - -const mockEvent2 = { - event: { event_id: "mockEvent2" }, - getWireContent: () => ({ session_id: "sessionB" }), -}; - -const mockEvent3 = { - event: { event_id: "mockEvent3" }, - getWireContent: () => ({ session_id: "sessionB" }), -}; - -const userId = "@user:example.com"; - -let ourDevice: MockDevice | undefined; -let allDevices: MockDevice[] | undefined; -let keyBackup = false; -let callback = async () => {}; - -const mockClient = { - getUserId: () => userId, - getDeviceId: () => ourDevice?.deviceId, - getStoredDevicesForUser: () => allDevices, - isSecretStored: jest.fn(() => Promise.resolve(keyBackup ? { key: "yes" } : null)), - checkIfOwnDeviceCrossSigned: (deviceId: string) => deviceId.startsWith("verified"), - downloadKeys: jest.fn(() => {}), - cancelAndResendEventRoomKeyRequest: jest.fn(() => {}), - on: (_: any, cb: () => Promise) => { - callback = cb; - }, - off: () => {}, -}; - -function getBar(wrapper: RenderResult) { - return wrapper.container.querySelector(".mx_DecryptionFailureBar"); -} - -describe("", () => { - beforeEach(() => { - jest.useFakeTimers(); - jest.spyOn(defaultDispatcher, "dispatch").mockRestore(); - }); - - afterEach(() => { - const container = document.body.firstChild; - container && document.body.removeChild(container); - - jest.runOnlyPendingTimers(); - jest.useRealTimers(); - - mockClient.cancelAndResendEventRoomKeyRequest.mockClear(); - }); - - it("Displays a loading spinner", async () => { - ourDevice = unverifiedDevice1; - allDevices = [unverifiedDevice1]; - - const bar = render( - // @ts-ignore - - - , - , - ); - - await waitFor(() => expect(mockClient.isSecretStored).toHaveBeenCalled()); - - expect(getBar(bar)).toMatchSnapshot(); - - bar.unmount(); - }); - - it("Prompts the user to verify if they have other devices", async () => { - ourDevice = unverifiedDevice1; - allDevices = [unverifiedDevice1, verifiedDevice1]; - keyBackup = false; - - const bar = render( - // @ts-ignore - - - , - , - ); - - await waitFor(() => expect(mockClient.isSecretStored).toHaveBeenCalled()); - - act(() => { - jest.advanceTimersByTime(5000); - }); - expect(getBar(bar)).toMatchSnapshot(); - - bar.unmount(); - }); - - it("Prompts the user to verify if they have backups", async () => { - ourDevice = unverifiedDevice1; - allDevices = [unverifiedDevice1]; - keyBackup = true; - - const bar = render( - // @ts-ignore - - - , - , - ); - - await waitFor(() => expect(mockClient.isSecretStored).toHaveBeenCalled()); - - act(() => { - jest.advanceTimersByTime(5000); - }); - expect(getBar(bar)).toMatchSnapshot(); - - bar.unmount(); - }); - - it("Prompts the user to reset if they have no other verified devices and no backups", async () => { - ourDevice = unverifiedDevice1; - allDevices = [unverifiedDevice1, unverifiedDevice2]; - keyBackup = false; - - const bar = render( - // @ts-ignore - - - , - , - ); - - await waitFor(() => expect(mockClient.isSecretStored).toHaveBeenCalled()); - - act(() => { - jest.advanceTimersByTime(5000); - }); - expect(getBar(bar)).toMatchSnapshot(); - - bar.unmount(); - }); - - it("Recommends opening other devices if there are other verified devices", async () => { - ourDevice = verifiedDevice1; - allDevices = [verifiedDevice1, verifiedDevice2]; - keyBackup = false; - - const bar = render( - // @ts-ignore - - - , - , - ); - - await waitFor(() => expect(mockClient.isSecretStored).toHaveBeenCalled()); - - act(() => { - jest.advanceTimersByTime(5000); - }); - expect(getBar(bar)).toMatchSnapshot(); - - bar.unmount(); - }); - - it("Displays a general error message if there are no other verified devices", async () => { - ourDevice = verifiedDevice1; - allDevices = [verifiedDevice1, unverifiedDevice1]; - keyBackup = true; - - const bar = render( - // @ts-ignore - - - , - , - ); - - await waitFor(() => expect(mockClient.isSecretStored).toHaveBeenCalled()); - - act(() => { - jest.advanceTimersByTime(5000); - }); - expect(getBar(bar)).toMatchSnapshot(); - - bar.unmount(); - }); - - it("Displays button to resend key requests if we are verified", async () => { - ourDevice = verifiedDevice1; - allDevices = [verifiedDevice1, verifiedDevice2]; - - const bar = render( - // @ts-ignore - - - , - , - ); - - await waitFor(() => expect(mockClient.isSecretStored).toHaveBeenCalled()); - - act(() => { - jest.advanceTimersByTime(5000); - }); - expect(getBar(bar)).toMatchSnapshot(); - - fireEvent.click(screen.getByText("Resend key requests")); - - expect(mockClient.cancelAndResendEventRoomKeyRequest).toHaveBeenCalledTimes(2); - expect(mockClient.cancelAndResendEventRoomKeyRequest).toHaveBeenCalledWith(mockEvent1); - expect(mockClient.cancelAndResendEventRoomKeyRequest).toHaveBeenCalledWith(mockEvent2); - - expect(getBar(bar)).toMatchSnapshot(); - - bar.unmount(); - }); - it("Displays button to review device list if we are verified", async () => { - // stub so we dont have to deal with launching modals - jest.spyOn(defaultDispatcher, "dispatch").mockImplementation(() => {}); - ourDevice = verifiedDevice1; - allDevices = [verifiedDevice1, verifiedDevice2]; - - const bar = render( - // @ts-ignore - - - , - , - ); - - await waitFor(() => expect(mockClient.isSecretStored).toHaveBeenCalled()); - - act(() => { - jest.advanceTimersByTime(5000); - }); - - fireEvent.click(screen.getByText("View your device list")); - - expect(defaultDispatcher.dispatch).toHaveBeenCalledWith({ action: Action.ViewUserDeviceSettings }); - - bar.unmount(); - }); - - it("Does not display a button to send key requests if we are unverified", async () => { - ourDevice = unverifiedDevice1; - allDevices = [unverifiedDevice1, verifiedDevice2]; - - const bar = render( - // @ts-ignore - - - , - , - ); - - await waitFor(() => expect(mockClient.isSecretStored).toHaveBeenCalled()); - - act(() => { - jest.advanceTimersByTime(5000); - }); - expect(getBar(bar)).toMatchSnapshot(); - - bar.unmount(); - }); - - it("Displays the button to resend key requests only if there are sessions we haven't already requested", async () => { - ourDevice = verifiedDevice1; - allDevices = [verifiedDevice1, verifiedDevice2]; - - const bar = render( - // @ts-ignore - - - , - , - ); - - await waitFor(() => expect(mockClient.isSecretStored).toHaveBeenCalled()); - - act(() => { - jest.advanceTimersByTime(5000); - }); - expect(getBar(bar)).toMatchSnapshot(); - - fireEvent.click(screen.getByText("Resend key requests")); - - expect(mockClient.cancelAndResendEventRoomKeyRequest).toHaveBeenCalledTimes(1); - expect(mockClient.cancelAndResendEventRoomKeyRequest).toHaveBeenCalledWith(mockEvent3); - - expect(getBar(bar)).toMatchSnapshot(); - - bar.rerender( - // @ts-ignore - - - , - , - ); - - expect(getBar(bar)).toMatchSnapshot(); - - mockClient.cancelAndResendEventRoomKeyRequest.mockClear(); - - fireEvent.click(screen.getByText("Resend key requests")); - - expect(mockClient.cancelAndResendEventRoomKeyRequest).toHaveBeenCalledTimes(1); - expect(mockClient.cancelAndResendEventRoomKeyRequest).toHaveBeenCalledWith(mockEvent1); - - expect(getBar(bar)).toMatchSnapshot(); - - bar.unmount(); - }); - - it("Handles device updates", async () => { - ourDevice = unverifiedDevice1; - allDevices = [unverifiedDevice1, verifiedDevice2]; - - const bar = render( - // @ts-ignore - - - , - , - ); - - await waitFor(() => expect(mockClient.isSecretStored).toHaveBeenCalled()); - act(() => { - jest.advanceTimersByTime(5000); - }); - expect(getBar(bar)).toMatchSnapshot(); - - ourDevice = verifiedDevice1; - await act(callback); - expect(getBar(bar)).toMatchSnapshot(); - - bar.unmount(); - }); -}); diff --git a/test/components/views/rooms/__snapshots__/DecryptionFailureBar-test.tsx.snap b/test/components/views/rooms/__snapshots__/DecryptionFailureBar-test.tsx.snap deleted file mode 100644 index 35b95a37f46..00000000000 --- a/test/components/views/rooms/__snapshots__/DecryptionFailureBar-test.tsx.snap +++ /dev/null @@ -1,705 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[` Displays a general error message if there are no other verified devices 1`] = ` -
-
-
-
-
-
-
-
- Some messages could not be decrypted -
-
- Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future. -
-
-
-
-`; - -exports[` Displays a loading spinner 1`] = ` -
-
-
-
-
-
-
-
-
-
- Decrypting messages… -
-
- Please wait as we try to decrypt your messages. This may take a few moments. -
-
-
-
-`; - -exports[` Displays button to resend key requests if we are verified 1`] = ` -
-
-
-
-
-
-
-
- Open another device to load encrypted messages -
-
- This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up. -
-
-
-
- View your device list -
-
- Resend key requests -
-
-
-`; - -exports[` Displays button to resend key requests if we are verified 2`] = ` -
-
-
-
-
-
-
-
- Open another device to load encrypted messages -
-
- This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up. -
-
-
-
- View your device list -
-
-
-`; - -exports[` Displays the button to resend key requests only if there are sessions we haven't already requested 1`] = ` -
-
-
-
-
-
-
-
- Open another device to load encrypted messages -
-
- This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up. -
-
-
-
- View your device list -
-
- Resend key requests -
-
-
-`; - -exports[` Displays the button to resend key requests only if there are sessions we haven't already requested 2`] = ` -
-
-
-
-
-
-
-
- Open another device to load encrypted messages -
-
- This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up. -
-
-
-
- View your device list -
-
-
-`; - -exports[` Displays the button to resend key requests only if there are sessions we haven't already requested 3`] = ` -
-
-
-
-
-
-
-
- Open another device to load encrypted messages -
-
- This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up. -
-
-
-
- View your device list -
-
- Resend key requests -
-
-
-`; - -exports[` Displays the button to resend key requests only if there are sessions we haven't already requested 4`] = ` -
-
-
-
-
-
-
-
- Open another device to load encrypted messages -
-
- This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up. -
-
-
-
- View your device list -
-
-
-`; - -exports[` Does not display a button to send key requests if we are unverified 1`] = ` -
-
-
-
-
-
-
-
- Verify this device to access all messages -
-
- This device was unable to decrypt some messages because it has not been verified yet. -
-
-
-
- Verify -
-
-
-`; - -exports[` Handles device updates 1`] = ` -
-
-
-
-
-
-
-
- Verify this device to access all messages -
-
- This device was unable to decrypt some messages because it has not been verified yet. -
-
-
-
- Verify -
-
-
-`; - -exports[` Handles device updates 2`] = ` -
-
-
-
-
-
-
-
- Open another device to load encrypted messages -
-
- This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up. -
-
-
-
- View your device list -
-
- Resend key requests -
-
-
-`; - -exports[` Prompts the user to reset if they have no other verified devices and no backups 1`] = ` -
-
-
-
-
-
-
-
- Reset your keys to prevent future decryption errors -
-
- You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages. -
-
-
-
- Reset -
-
-
-`; - -exports[` Prompts the user to verify if they have backups 1`] = ` -
-
-
-
-
-
-
-
- Verify this device to access all messages -
-
- This device was unable to decrypt some messages because it has not been verified yet. -
-
-
-
- Verify -
-
-
-`; - -exports[` Prompts the user to verify if they have other devices 1`] = ` -
-
-
-
-
-
-
-
- Verify this device to access all messages -
-
- This device was unable to decrypt some messages because it has not been verified yet. -
-
-
-
- Verify -
-
-
-`; - -exports[` Recommends opening other devices if there are other verified devices 1`] = ` -
-
-
-
-
-
-
-
- Open another device to load encrypted messages -
-
- This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up. -
-
-
-
- View your device list -
-
- Resend key requests -
-
-
-`; From c78c7af4076bb01497d557571a514980d735b417 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 5 Jun 2023 16:47:24 +0000 Subject: [PATCH 11/54] Update cypress-io/github-action digest to 61a130a (#10935) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/cypress.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cypress.yaml b/.github/workflows/cypress.yaml index df737c6ab44..5b5a240f462 100644 --- a/.github/workflows/cypress.yaml +++ b/.github/workflows/cypress.yaml @@ -159,7 +159,7 @@ jobs: echo "CYPRESS_RUST_CRYPTO=1" >> "$GITHUB_ENV" - name: Run Cypress tests - uses: cypress-io/github-action@40a1a26c08d0e549e8516612ecebbd1ab5eeec8f + uses: cypress-io/github-action@61a130a45335b30972903dace9a5d10578121e6e with: working-directory: matrix-react-sdk # The built-in Electron runner seems to grind to a halt trying From 21b9dafb45f50c8e4cdffc637f6d563fbc169a1d Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Mon, 5 Jun 2023 21:11:12 +0000 Subject: [PATCH 12/54] Take a Percy snapshot of SpaceSetupPrivateInvite (#11010) --- cypress/e2e/spaces/spaces.spec.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/cypress/e2e/spaces/spaces.spec.ts b/cypress/e2e/spaces/spaces.spec.ts index 47228e2bcd1..13fef2a5b5e 100644 --- a/cypress/e2e/spaces/spaces.spec.ts +++ b/cypress/e2e/spaces/spaces.spec.ts @@ -140,12 +140,9 @@ describe("Spaces", () => { cy.findByPlaceholderText("Support").type("Projects"); cy.findByRole("button", { name: "Continue" }).click(); + cy.get(".mx_SpaceRoomView h1").findByText("Invite your teammates"); cy.get(".mx_SpaceRoomView").percySnapshotElement("Space - 'Invite your teammates' dialog"); - - cy.get(".mx_SpaceRoomView").within(() => { - cy.get("h1").findByText("Invite your teammates"); - cy.findByRole("button", { name: "Skip for now" }).click(); - }); + cy.findByRole("button", { name: "Skip for now" }).click(); // Assert rooms exist in the room list cy.findByRole("treeitem", { name: "General" }).should("exist"); From 68a1721b8dba9ac4aedf52164aa33918e1120215 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Tue, 6 Jun 2023 07:29:22 +0000 Subject: [PATCH 13/54] Align list items on the tooltip to the start (#11041) --- res/css/views/elements/_Tooltip.pcss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/res/css/views/elements/_Tooltip.pcss b/res/css/views/elements/_Tooltip.pcss index 23c5089ab59..575fe703cec 100644 --- a/res/css/views/elements/_Tooltip.pcss +++ b/res/css/views/elements/_Tooltip.pcss @@ -87,6 +87,11 @@ limitations under the License. &.mx_Tooltip_invisible { animation: mx_fadeout 0.1s forwards; } + + ul, + ol { + text-align: start; /* for list items */ + } } /* These tooltips use an older style with a chevron */ From 7d36c8315bc26b4bf98c0d11194aad24466c2b6c Mon Sep 17 00:00:00 2001 From: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> Date: Tue, 6 Jun 2023 08:50:30 +0100 Subject: [PATCH 14/54] Disable verification test for Element-R (#11046) We haven't implemented this yet! --- cypress/e2e/crypto/crypto.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/cypress/e2e/crypto/crypto.spec.ts b/cypress/e2e/crypto/crypto.spec.ts index 17975e88dab..0a332a376de 100644 --- a/cypress/e2e/crypto/crypto.spec.ts +++ b/cypress/e2e/crypto/crypto.spec.ts @@ -330,6 +330,7 @@ describe("Verify own device", () => { let homeserver: HomeserverInstance; beforeEach(() => { + skipIfRustCrypto(); cy.startHomeserver("default").then((data: HomeserverInstance) => { homeserver = data; From 6fa005dcfc0033587a2a31025823794c34b32896 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 6 Jun 2023 09:20:21 +0100 Subject: [PATCH 15/54] Inhibit interactions on forward dialog message previews (#11025) * Inhibit interactions on forward dialog message previews and improve inhibiting of video message body * Consolidate prop types * Iterate * Update src/components/views/messages/IBodyProps.ts Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --------- Co-authored-by: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> --- .../views/dialogs/ForwardDialog.tsx | 8 +++- src/components/views/messages/IBodyProps.ts | 4 ++ src/components/views/messages/MVideoBody.tsx | 4 +- .../views/messages/MessageEvent.tsx | 1 + src/events/EventTileFactory.tsx | 37 +++++++++++-------- 5 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/components/views/dialogs/ForwardDialog.tsx b/src/components/views/dialogs/ForwardDialog.tsx index 75af82d86a0..d1be0219883 100644 --- a/src/components/views/dialogs/ForwardDialog.tsx +++ b/src/components/views/dialogs/ForwardDialog.tsx @@ -284,7 +284,13 @@ const ForwardDialog: React.FC = ({ matrixClient: cli, event, permalinkCr mx_IRCLayout: previewLayout == Layout.IRC, })} > - +

diff --git a/src/components/views/messages/IBodyProps.ts b/src/components/views/messages/IBodyProps.ts index e9b853621a8..17981be54c6 100644 --- a/src/components/views/messages/IBodyProps.ts +++ b/src/components/views/messages/IBodyProps.ts @@ -55,4 +55,8 @@ export interface IBodyProps { getRelationsForEvent?: GetRelationsForEvent; ref?: React.RefObject | LegacyRef; + + // Set to `true` to disable interactions (e.g. video controls) and to remove controls from the tab order. + // This may be useful when displaying a preview of the event. + inhibitInteraction?: boolean; } diff --git a/src/components/views/messages/MVideoBody.tsx b/src/components/views/messages/MVideoBody.tsx index 5ecf74a8b64..5fdbc42d36a 100644 --- a/src/components/views/messages/MVideoBody.tsx +++ b/src/components/views/messages/MVideoBody.tsx @@ -234,7 +234,7 @@ export default class MVideoBody extends React.PureComponent public render(): React.ReactNode { const content = this.props.mxEvent.getContent(); - const autoplay = SettingsStore.getValue("autoplayVideo"); + const autoplay = !this.props.inhibitInteraction && SettingsStore.getValue("autoplayVideo"); let aspectRatio; if (content.info?.w && content.info?.h) { @@ -287,7 +287,7 @@ export default class MVideoBody extends React.PureComponent ref={this.videoRef} src={contentUrl} title={content.body} - controls + controls={!this.props.inhibitInteraction} // Disable downloading as it doesn't work with e2ee video, // users should use the dedicated Download button in the Message Action Bar controlsList="nodownload" diff --git a/src/components/views/messages/MessageEvent.tsx b/src/components/views/messages/MessageEvent.tsx index 4fd84e31f1d..3eb1cfbb602 100644 --- a/src/components/views/messages/MessageEvent.tsx +++ b/src/components/views/messages/MessageEvent.tsx @@ -213,6 +213,7 @@ export default class MessageEvent extends React.Component implements IMe mediaEventHelper={this.mediaHelper} getRelationsForEvent={this.props.getRelationsForEvent} isSeeingThroughMessageHiddenForModeration={this.props.isSeeingThroughMessageHiddenForModeration} + inhibitInteraction={this.props.inhibitInteraction} /> ) : null; } diff --git a/src/events/EventTileFactory.tsx b/src/events/EventTileFactory.tsx index 4b7fc1cbba9..ae3f66ba741 100644 --- a/src/events/EventTileFactory.tsx +++ b/src/events/EventTileFactory.tsx @@ -23,10 +23,8 @@ import { MatrixClient } from "matrix-js-sdk/src/client"; import { GroupCallIntent } from "matrix-js-sdk/src/webrtc/groupCall"; import SettingsStore from "../settings/SettingsStore"; -import EditorStateTransfer from "../utils/EditorStateTransfer"; -import { RoomPermalinkCreator } from "../utils/permalinks/Permalinks"; import LegacyCallEventGrouper from "../components/structures/LegacyCallEventGrouper"; -import { GetRelationsForEvent } from "../components/views/rooms/EventTile"; +import { EventTileProps } from "../components/views/rooms/EventTile"; import { TimelineRenderingType } from "../contexts/RoomContext"; import MessageEvent from "../components/views/messages/MessageEvent"; import MKeyVerificationConclusion from "../components/views/messages/MKeyVerificationConclusion"; @@ -56,20 +54,24 @@ import { } from "../voice-broadcast"; // Subset of EventTile's IProps plus some mixins -export interface EventTileTypeProps { +export interface EventTileTypeProps + extends Pick< + EventTileProps, + | "mxEvent" + | "highlights" + | "highlightLink" + | "showUrlPreview" + | "onHeightChanged" + | "forExport" + | "getRelationsForEvent" + | "editState" + | "replacingEventId" + | "permalinkCreator" + | "callEventGrouper" + | "isSeeingThroughMessageHiddenForModeration" + | "inhibitInteraction" + > { ref?: React.RefObject; // `any` because it's effectively impossible to convince TS of a reasonable type - mxEvent: MatrixEvent; - highlights?: string[]; - highlightLink?: string; - showUrlPreview?: boolean; - onHeightChanged?: () => void; - forExport?: boolean; - getRelationsForEvent?: GetRelationsForEvent; - editState?: EditorStateTransfer; - replacingEventId?: string; - permalinkCreator?: RoomPermalinkCreator; - callEventGrouper?: LegacyCallEventGrouper; - isSeeingThroughMessageHiddenForModeration?: boolean; timestamp?: JSX.Element; maxImageHeight?: number; // pixels overrideBodyTypes?: Record; @@ -322,6 +324,7 @@ export function renderTile( getRelationsForEvent, isSeeingThroughMessageHiddenForModeration, timestamp, + inhibitInteraction, } = props; switch (renderType) { @@ -340,6 +343,7 @@ export function renderTile( getRelationsForEvent, isSeeingThroughMessageHiddenForModeration, permalinkCreator, + inhibitInteraction, }); default: // NEARLY ALL THE OPTIONS! @@ -357,6 +361,7 @@ export function renderTile( getRelationsForEvent, isSeeingThroughMessageHiddenForModeration, timestamp, + inhibitInteraction, }); } } From 2801afe570b13dce2cae736d1f1ebd4ae1824d1d Mon Sep 17 00:00:00 2001 From: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> Date: Tue, 6 Jun 2023 09:27:53 +0100 Subject: [PATCH 16/54] Inline `VerificationRequest.{invalid,ready,started,done,cancelled}` (#11013) * Inline `VerificationRequest.{invalid,ready,started,done,cancelled}` These methods are all just shortcuts for checks on `phase`, so let's get rid of them * update test * Add some more tests * even more coverage * fix tests --- .../messages/MKeyVerificationConclusion.tsx | 11 +-- .../messages/MKeyVerificationRequest.tsx | 14 ++- .../views/right_panel/EncryptionPanel.tsx | 3 +- src/stores/SetupEncryptionStore.ts | 3 +- .../MKeyVerificationConclusion-test.tsx | 51 +++++++---- .../messages/MKeyVerificationRequest-test.tsx | 87 +++++++++++++++++++ .../views/right_panel/UserInfo-test.tsx | 76 ++++++++++++++-- 7 files changed, 210 insertions(+), 35 deletions(-) create mode 100644 test/components/views/messages/MKeyVerificationRequest-test.tsx diff --git a/src/components/views/messages/MKeyVerificationConclusion.tsx b/src/components/views/messages/MKeyVerificationConclusion.tsx index 5fd8df699fb..5c51d5c2ce8 100644 --- a/src/components/views/messages/MKeyVerificationConclusion.tsx +++ b/src/components/views/messages/MKeyVerificationConclusion.tsx @@ -18,6 +18,7 @@ import React from "react"; import classNames from "classnames"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { + Phase as VerificationPhase, VerificationRequest, VerificationRequestEvent, } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; @@ -78,11 +79,11 @@ export default class MKeyVerificationConclusion extends React.Component return false; } // .cancel event that was sent after the verification finished, ignore - if (mxEvent.getType() === EventType.KeyVerificationCancel && !request.cancelled) { + if (mxEvent.getType() === EventType.KeyVerificationCancel && request.phase !== VerificationPhase.Cancelled) { return false; } // .done event that was sent after the verification cancelled, ignore - if (mxEvent.getType() === EventType.KeyVerificationDone && !request.done) { + if (mxEvent.getType() === EventType.KeyVerificationDone && request.phase !== VerificationPhase.Done) { return false; } @@ -112,11 +113,11 @@ export default class MKeyVerificationConclusion extends React.Component let title: string | undefined; - if (request.done) { + if (request.phase === VerificationPhase.Done) { title = _t("You verified %(name)s", { name: getNameForEventRoom(client, request.otherUserId, mxEvent.getRoomId()!), }); - } else if (request.cancelled) { + } else if (request.phase === VerificationPhase.Cancelled) { const userId = request.cancellingUserId; if (userId === myUserId) { title = _t("You cancelled verifying %(name)s", { @@ -131,7 +132,7 @@ export default class MKeyVerificationConclusion extends React.Component if (title) { const classes = classNames("mx_cryptoEvent mx_cryptoEvent_icon", { - mx_cryptoEvent_icon_verified: request.done, + mx_cryptoEvent_icon_verified: request.phase === VerificationPhase.Done, }); return ( { const { mxEvent } = this.props; const request = mxEvent.verificationRequest; - if (!request || request.invalid) { + if (!request || request.phase === VerificationPhase.Unsent) { return null; } @@ -138,14 +141,17 @@ export default class MKeyVerificationRequest extends React.Component { if (!request.canAccept) { let stateLabel; - const accepted = request.ready || request.started || request.done; + const accepted = + request.phase === VerificationPhase.Ready || + request.phase === VerificationPhase.Started || + request.phase === VerificationPhase.Done; if (accepted) { stateLabel = ( {this.acceptedLabel(request.receivingUserId)} ); - } else if (request.cancelled) { + } else if (request.phase === VerificationPhase.Cancelled) { stateLabel = this.cancelledLabel(request.cancellingUserId!); } else if (request.accepting) { stateLabel = _t("Accepting…"); diff --git a/src/components/views/right_panel/EncryptionPanel.tsx b/src/components/views/right_panel/EncryptionPanel.tsx index 12e37bba858..73c2ba02bd5 100644 --- a/src/components/views/right_panel/EncryptionPanel.tsx +++ b/src/components/views/right_panel/EncryptionPanel.tsx @@ -18,6 +18,7 @@ import React, { useCallback, useEffect, useState } from "react"; import { PHASE_REQUESTED, PHASE_UNSENT, + Phase as VerificationPhase, VerificationRequest, VerificationRequestEvent, } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; @@ -76,7 +77,7 @@ const EncryptionPanel: React.FC = (props: IProps) => { }, [verificationRequestPromise]); const changeHandler = useCallback(() => { // handle transitions -> cancelled for mismatches which fire a modal instead of showing a card - if (request && request.cancelled && MISMATCHES.includes(request.cancellationCode)) { + if (request && request.phase === VerificationPhase.Cancelled && MISMATCHES.includes(request.cancellationCode)) { Modal.createDialog(ErrorDialog, { headerImage: require("../../../../res/img/e2e/warning-deprecated.svg").default, title: _t("Your messages are not secure"), diff --git a/src/stores/SetupEncryptionStore.ts b/src/stores/SetupEncryptionStore.ts index d370d5d2ffa..d9300c6dc5d 100644 --- a/src/stores/SetupEncryptionStore.ts +++ b/src/stores/SetupEncryptionStore.ts @@ -17,6 +17,7 @@ limitations under the License. import EventEmitter from "events"; import { PHASE_DONE as VERIF_PHASE_DONE, + Phase as VerificationPhase, VerificationRequest, VerificationRequestEvent, } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; @@ -178,7 +179,7 @@ export class SetupEncryptionStore extends EventEmitter { }; public onVerificationRequestChange = async (): Promise => { - if (this.verificationRequest?.cancelled) { + if (this.verificationRequest?.phase === VerificationPhase.Cancelled) { this.verificationRequest.off(VerificationRequestEvent.Change, this.onVerificationRequestChange); this.verificationRequest = null; this.emit("update"); diff --git a/test/components/views/messages/MKeyVerificationConclusion-test.tsx b/test/components/views/messages/MKeyVerificationConclusion-test.tsx index c5d023c7753..b9cb024e73c 100644 --- a/test/components/views/messages/MKeyVerificationConclusion-test.tsx +++ b/test/components/views/messages/MKeyVerificationConclusion-test.tsx @@ -17,10 +17,13 @@ limitations under the License. import React from "react"; import { render } from "@testing-library/react"; import { EventEmitter } from "events"; -import { MatrixEvent, EventType } from "matrix-js-sdk/src/matrix"; +import { EventType, MatrixEvent } from "matrix-js-sdk/src/matrix"; import { CryptoEvent } from "matrix-js-sdk/src/crypto"; import { UserTrustLevel } from "matrix-js-sdk/src/crypto/CrossSigning"; -import { VerificationRequest } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; +import { + Phase as VerificationPhase, + VerificationRequest, +} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import { MatrixClientPeg } from "../../../../src/MatrixClientPeg"; import MKeyVerificationConclusion from "../../../../src/components/views/messages/MKeyVerificationConclusion"; @@ -38,27 +41,32 @@ describe("MKeyVerificationConclusion", () => { }); const getMockVerificationRequest = ({ - pending, - cancelled, - done, + pending = false, + phase = VerificationPhase.Unsent, otherUserId, + cancellingUserId, }: { pending?: boolean; - cancelled?: boolean; - done?: boolean; + phase?: VerificationPhase; otherUserId?: string; + cancellingUserId?: string; }) => { class MockVerificationRequest extends EventEmitter { constructor( - public readonly pending?: boolean, - public readonly cancelled?: boolean, - public readonly done?: boolean, + public readonly pending: boolean, + public readonly phase: VerificationPhase, public readonly otherUserId?: string, + public readonly cancellingUserId?: string, ) { super(); } } - return new MockVerificationRequest(pending, cancelled, done, otherUserId) as unknown as VerificationRequest; + return new MockVerificationRequest( + pending, + phase, + otherUserId, + cancellingUserId, + ) as unknown as VerificationRequest; }; beforeEach(() => { @@ -85,14 +93,14 @@ describe("MKeyVerificationConclusion", () => { it("shouldn't render if the event type is cancel but the request type isn't", () => { const event = new MatrixEvent({ type: EventType.KeyVerificationCancel }); - event.verificationRequest = getMockVerificationRequest({ cancelled: false }); + event.verificationRequest = getMockVerificationRequest({}); const { container } = render(); expect(container).toBeEmpty(); }); it("shouldn't render if the event type is done but the request type isn't", () => { const event = new MatrixEvent({ type: "m.key.verification.done" }); - event.verificationRequest = getMockVerificationRequest({ done: false }); + event.verificationRequest = getMockVerificationRequest({}); const { container } = render(); expect(container).toBeEmpty(); }); @@ -101,7 +109,7 @@ describe("MKeyVerificationConclusion", () => { mockClient.checkUserTrust.mockReturnValue(untrustworthy); const event = new MatrixEvent({ type: "m.key.verification.done" }); - event.verificationRequest = getMockVerificationRequest({ done: true }); + event.verificationRequest = getMockVerificationRequest({ phase: VerificationPhase.Done }); const { container } = render(); expect(container).toBeEmpty(); }); @@ -110,7 +118,10 @@ describe("MKeyVerificationConclusion", () => { mockClient.checkUserTrust.mockReturnValue(untrustworthy); const event = new MatrixEvent({ type: "m.key.verification.done" }); - event.verificationRequest = getMockVerificationRequest({ done: true, otherUserId: "@someuser:domain" }); + event.verificationRequest = getMockVerificationRequest({ + phase: VerificationPhase.Done, + otherUserId: "@someuser:domain", + }); const { container } = render(); expect(container).toBeEmpty(); @@ -132,4 +143,14 @@ describe("MKeyVerificationConclusion", () => { ); expect(container).not.toBeEmpty(); }); + + it("should render appropriately if we cancelled the verification", () => { + const event = new MatrixEvent({ type: "m.key.verification.cancel" }); + event.verificationRequest = getMockVerificationRequest({ + phase: VerificationPhase.Cancelled, + cancellingUserId: userId, + }); + const { container } = render(); + expect(container).toHaveTextContent("You cancelled verifying"); + }); }); diff --git a/test/components/views/messages/MKeyVerificationRequest-test.tsx b/test/components/views/messages/MKeyVerificationRequest-test.tsx new file mode 100644 index 00000000000..e3d0d196449 --- /dev/null +++ b/test/components/views/messages/MKeyVerificationRequest-test.tsx @@ -0,0 +1,87 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from "react"; +import { render } from "@testing-library/react"; +import { EventEmitter } from "events"; +import { MatrixEvent } from "matrix-js-sdk/src/matrix"; +import { + Phase as VerificationPhase, + VerificationRequest, +} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; + +import { MatrixClientPeg } from "../../../../src/MatrixClientPeg"; +import { getMockClientWithEventEmitter, mockClientMethodsUser } from "../../../test-utils"; +import MKeyVerificationRequest from "../../../../src/components/views/messages/MKeyVerificationRequest"; + +describe("MKeyVerificationRequest", () => { + const userId = "@user:server"; + const getMockVerificationRequest = (props: Partial) => { + const res = new EventEmitter(); + Object.assign(res, { + phase: VerificationPhase.Requested, + canAccept: false, + initiatedByMe: true, + ...props, + }); + return res as unknown as VerificationRequest; + }; + + beforeEach(() => { + jest.clearAllMocks(); + getMockClientWithEventEmitter({ + ...mockClientMethodsUser(userId), + getRoom: jest.fn(), + }); + }); + + afterAll(() => { + jest.spyOn(MatrixClientPeg, "get").mockRestore(); + }); + + it("should not render if the request is absent", () => { + const event = new MatrixEvent({ type: "m.key.verification.request" }); + const { container } = render(); + expect(container).toBeEmptyDOMElement(); + }); + + it("should not render if the request is unsent", () => { + const event = new MatrixEvent({ type: "m.key.verification.request" }); + event.verificationRequest = getMockVerificationRequest({ + phase: VerificationPhase.Unsent, + }); + const { container } = render(); + expect(container).toBeEmptyDOMElement(); + }); + + it("should render appropriately when the request was sent", () => { + const event = new MatrixEvent({ type: "m.key.verification.request" }); + event.verificationRequest = getMockVerificationRequest({}); + const { container } = render(); + expect(container).toHaveTextContent("You sent a verification request"); + }); + + it("should render appropriately when the request was cancelled", () => { + const event = new MatrixEvent({ type: "m.key.verification.request" }); + event.verificationRequest = getMockVerificationRequest({ + phase: VerificationPhase.Cancelled, + cancellingUserId: userId, + }); + const { container } = render(); + expect(container).toHaveTextContent("You sent a verification request"); + expect(container).toHaveTextContent("You cancelled"); + }); +}); diff --git a/test/components/views/right_panel/UserInfo-test.tsx b/test/components/views/right_panel/UserInfo-test.tsx index bf1771c5153..95c0fff74c4 100644 --- a/test/components/views/right_panel/UserInfo-test.tsx +++ b/test/components/views/right_panel/UserInfo-test.tsx @@ -28,10 +28,15 @@ import { CryptoApi, DeviceVerificationStatus, } from "matrix-js-sdk/src/matrix"; -import { Phase, VerificationRequest } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; +import { + Phase, + VerificationRequest, + VerificationRequestEvent, +} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import { UserTrustLevel } from "matrix-js-sdk/src/crypto/CrossSigning"; import { Device } from "matrix-js-sdk/src/models/device"; import { defer } from "matrix-js-sdk/src/utils"; +import { EventEmitter } from "events"; import UserInfo, { BanToggleButton, @@ -55,6 +60,7 @@ import Modal from "../../../../src/Modal"; import { E2EStatus } from "../../../../src/utils/ShieldUtils"; import { DirectoryMember, startDmOnFirstMessage } from "../../../../src/utils/direct-messages"; import { clearAllModals, flushPromises } from "../../../test-utils"; +import ErrorDialog from "../../../../src/components/views/dialogs/ErrorDialog"; jest.mock("../../../../src/utils/direct-messages", () => ({ ...jest.requireActual("../../../../src/utils/direct-messages"), @@ -163,14 +169,21 @@ beforeEach(() => { }); describe("", () => { - const verificationRequest = { - pending: true, - on: jest.fn(), - phase: Phase.Ready, - channel: { transactionId: 1 }, - otherPartySupportsMethod: jest.fn(), - off: jest.fn(), - } as unknown as VerificationRequest; + class MockVerificationRequest extends EventEmitter { + pending = true; + phase: Phase = Phase.Ready; + cancellationCode: string | null = null; + + constructor(opts: Partial) { + super(); + Object.assign(this, { + channel: { transactionId: 1 }, + otherPartySupportsMethod: jest.fn(), + ...opts, + }); + } + } + let verificationRequest: MockVerificationRequest; const defaultProps = { user: defaultUser, @@ -189,6 +202,15 @@ describe("", () => { }); }; + beforeEach(() => { + verificationRequest = new MockVerificationRequest({}); + }); + + afterEach(async () => { + await clearAllModals(); + jest.clearAllMocks(); + }); + it("closes on close button click", async () => { renderComponent(); @@ -222,6 +244,42 @@ describe("", () => { expect(screen.getByText(/try with a different client/i)).toBeInTheDocument(); }); + it("should show error modal when the verification request is cancelled with a mismatch", () => { + renderComponent({ phase: RightPanelPhases.EncryptionPanel, verificationRequest }); + + const spy = jest.spyOn(Modal, "createDialog"); + act(() => { + verificationRequest.phase = Phase.Cancelled; + verificationRequest.cancellationCode = "m.key_mismatch"; + verificationRequest.emit(VerificationRequestEvent.Change); + }); + expect(spy).toHaveBeenCalledWith( + ErrorDialog, + expect.objectContaining({ title: "Your messages are not secure" }), + ); + }); + + it("should not show error modal when the verification request is changed for some other reason", () => { + renderComponent({ phase: RightPanelPhases.EncryptionPanel, verificationRequest }); + + const spy = jest.spyOn(Modal, "createDialog"); + + // change to "started" + act(() => { + verificationRequest.phase = Phase.Started; + verificationRequest.emit(VerificationRequestEvent.Change); + }); + + // cancelled for some other reason + act(() => { + verificationRequest.phase = Phase.Cancelled; + verificationRequest.cancellationCode = "changed my mind"; + verificationRequest.emit(VerificationRequestEvent.Change); + }); + + expect(spy).not.toHaveBeenCalled(); + }); + it("renders close button correctly when encryption panel with a pending verification request", () => { renderComponent({ phase: RightPanelPhases.EncryptionPanel, verificationRequest }); expect(screen.getByTestId("base-card-close-button")).toHaveAttribute("title", "Cancel"); From 6a460617325794c278d960cb9b81caf2a43a2e78 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 10:58:03 +0000 Subject: [PATCH 17/54] Update dependency axe-core to v4.7.2 (#11030) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 6f1ca838604..9fbe3d8e6e7 100644 --- a/package.json +++ b/package.json @@ -174,7 +174,7 @@ "@typescript-eslint/eslint-plugin": "^5.35.1", "@typescript-eslint/parser": "^5.6.0", "allchange": "^1.1.0", - "axe-core": "4.7.1", + "axe-core": "4.7.2", "babel-jest": "^29.0.0", "blob-polyfill": "^7.0.0", "chokidar": "^3.5.1", diff --git a/yarn.lock b/yarn.lock index 5037e0bb6ff..de71d6226eb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2860,10 +2860,10 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== -axe-core@4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.1.tgz#04392c9ccb3d7d7c5d2f8684f148d56d3442f33d" - integrity sha512-sCXXUhA+cljomZ3ZAwb8i1p3oOlkABzPy08ZDAoGcYuvtBPlQ1Ytde129ArXyHWDhfeewq7rlx9F+cUx2SSlkg== +axe-core@4.7.2: + version "4.7.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.2.tgz#040a7342b20765cb18bb50b628394c21bccc17a0" + integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== axe-core@^4.6.2: version "4.6.3" From c418ed01edc52ff3af507467dab48afb40830485 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 10:58:58 +0000 Subject: [PATCH 18/54] Update tj-actions/changed-files action to v36 (#11036) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> --- .github/workflows/i18n_check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/i18n_check.yml b/.github/workflows/i18n_check.yml index 03dda98eca7..36da56cc8c7 100644 --- a/.github/workflows/i18n_check.yml +++ b/.github/workflows/i18n_check.yml @@ -12,7 +12,7 @@ jobs: - name: "Get modified files" id: changed_files if: github.event_name == 'pull_request' && github.event.pull_request.user.login != 'RiotTranslateBot' - uses: tj-actions/changed-files@b2d17f51244a144849c6b37a3a6791b98a51d86f # v35 + uses: tj-actions/changed-files@b13786805affca18e536ed489687d3d8d1f05d21 # v36 with: files: | src/i18n/strings/* From e22d9b53d82b3403dabbffee0a3352b6014cd6f4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 11:01:42 +0000 Subject: [PATCH 19/54] Update sentry-javascript monorepo to v7.53.1 (#11034) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> --- yarn.lock | 86 +++++++++++++++++++++++++++---------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/yarn.lock b/yarn.lock index de71d6226eb..99ee12949bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1905,64 +1905,64 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@sentry-internal/tracing@7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.52.1.tgz#c98823afd2f9814466fa26f24a1a54fe63b27c24" - integrity sha512-6N99rE+Ek0LgbqSzI/XpsKSLUyJjQ9nychViy+MP60p1x+hllukfTsDbNtUNrPlW0Bx+vqUrWKkAqmTFad94TQ== - dependencies: - "@sentry/core" "7.52.1" - "@sentry/types" "7.52.1" - "@sentry/utils" "7.52.1" +"@sentry-internal/tracing@7.54.0": + version "7.54.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.54.0.tgz#eeb10ee72426d08669a7706faa4264f1ec02c71d" + integrity sha512-JsyhZ0wWZ+VqbHJg+azqRGdYJDkcI5R9+pnkO6SzbzxrRewqMAIwzkpPee3oI7vG99uhMEkOkMjHu0nQGwkOQw== + dependencies: + "@sentry/core" "7.54.0" + "@sentry/types" "7.54.0" + "@sentry/utils" "7.54.0" tslib "^1.9.3" "@sentry/browser@^7.0.0": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.52.1.tgz#f112ca4170bb5023f050bdcbcce5621b475a46eb" - integrity sha512-HrCOfieX68t+Wj42VIkraLYwx8kN5311SdBkHccevWs2Y2dZU7R9iLbI87+nb5kpOPQ7jVWW7d6QI/yZmliYgQ== - dependencies: - "@sentry-internal/tracing" "7.52.1" - "@sentry/core" "7.52.1" - "@sentry/replay" "7.52.1" - "@sentry/types" "7.52.1" - "@sentry/utils" "7.52.1" + version "7.54.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.54.0.tgz#7fe331c776d02b5c902733aa41dcbfac7bef1ae6" + integrity sha512-EvLAw03N9WE2m1CMl2/1YMeIs1icw9IEOVJhWmf3uJEysNJOFWXu6ZzdtHEz1E6DiJYhc1HzDya0ExZeJxNARA== + dependencies: + "@sentry-internal/tracing" "7.54.0" + "@sentry/core" "7.54.0" + "@sentry/replay" "7.54.0" + "@sentry/types" "7.54.0" + "@sentry/utils" "7.54.0" tslib "^1.9.3" -"@sentry/core@7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.52.1.tgz#4de702937ba8944802bb06eb8dfdf089c39f6bab" - integrity sha512-36clugQu5z/9jrit1gzI7KfKbAUimjRab39JeR0mJ6pMuKLTTK7PhbpUAD4AQBs9qVeXN2c7h9SVZiSA0UDvkg== +"@sentry/core@7.54.0": + version "7.54.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.54.0.tgz#8c4cb8800f8df708b3f3f6483026bb9a02820014" + integrity sha512-MAn0E2EwgNn1pFQn4qxhU+1kz6edullWg6VE5wCmtpXWOVw6sILBUsQpeIG5djBKMcneJCdOlz5jeqcKPrLvZQ== dependencies: - "@sentry/types" "7.52.1" - "@sentry/utils" "7.52.1" + "@sentry/types" "7.54.0" + "@sentry/utils" "7.54.0" tslib "^1.9.3" -"@sentry/replay@7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.52.1.tgz#272a0bcb79bb9ffce99b5dcaf864f18d729ce0da" - integrity sha512-A+RaUmpU9/yBHnU3ATemc6wAvobGno0yf5R6fZYkAFoo2FCR2YG6AXxkTazymIf8v2DnLGaSDORYDPdhQClU9A== +"@sentry/replay@7.54.0": + version "7.54.0" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.54.0.tgz#f0f44f9413ceefd1809bf1665e82315927ae08db" + integrity sha512-C0F0568ybphzGmKGe23duB6n5wJcgM7WLYhoeqW3o2bHeqpj1dGPSka/K3s9KzGaAgzn1zeOUYXJsOs+T/XdsA== dependencies: - "@sentry/core" "7.52.1" - "@sentry/types" "7.52.1" - "@sentry/utils" "7.52.1" + "@sentry/core" "7.54.0" + "@sentry/types" "7.54.0" + "@sentry/utils" "7.54.0" "@sentry/tracing@^7.0.0": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.52.1.tgz#65db0404b3d83a268ece9773ddd6aa5fa609d801" - integrity sha512-1afFeb0X6YcMK8mcsGXpO9rNFEF4Kd3mAUF22hXyFNWVoPNQsvdh/WxG2t3U+hLhehQ1ps3iJ0jxFRGF5zSboA== + version "7.54.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.54.0.tgz#8364cec20aadc16d8ffcfd4ed9e437e1d317fa87" + integrity sha512-IyflAAqOiKuNvhWXrJsXN8yfl8DbHRpfgtCEPo5TBvdkpcyxUyfE8W2a2MQ8MXDzgfJT1IixXEwleO+qPIi3Gg== dependencies: - "@sentry-internal/tracing" "7.52.1" + "@sentry-internal/tracing" "7.54.0" -"@sentry/types@7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.52.1.tgz#bcff6d0462d9b9b7b9ec31c0068fe02d44f25da2" - integrity sha512-OMbGBPrJsw0iEXwZ2bJUYxewI1IEAU2e1aQGc0O6QW5+6hhCh+8HO8Xl4EymqwejjztuwStkl6G1qhK+Q0/Row== +"@sentry/types@7.54.0": + version "7.54.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.54.0.tgz#bfee18107a78e290e6c8ad41646e2b9d9dd95234" + integrity sha512-D+i9xogBeawvQi2r0NOrM7zYcUaPuijeME4O9eOTrDF20tj71hWtJLilK+KTGLYFtpGg1h+9bPaz7OHEIyVopg== -"@sentry/utils@7.52.1": - version "7.52.1" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.52.1.tgz#4a3e49b918f78dba4524c924286210259020cac5" - integrity sha512-MPt1Xu/jluulknW8CmZ2naJ53jEdtdwCBSo6fXJvOTI0SDqwIPbXDVrsnqLAhVJuIN7xbkj96nuY/VBR6S5sWg== +"@sentry/utils@7.54.0": + version "7.54.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.54.0.tgz#a3acb5e25a1409cbca7b46d6356d7417a253ea9a" + integrity sha512-3Yf5KlKjIcYLddOexSt2ovu2TWlR4Fi7M+aCK8yUTzwNzf/xwFSWOstHlD/WiDy9HvfhWAOB/ukNTuAeJmtasw== dependencies: - "@sentry/types" "7.52.1" + "@sentry/types" "7.54.0" tslib "^1.9.3" "@sinclair/typebox@^0.24.1": From 251350753818ac6ab004eab443f29560fe9abc79 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 11:04:01 +0000 Subject: [PATCH 20/54] Update dependency @percy/cli to v1.25.0 (#11029) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> --- yarn.lock | 198 +++++++++++++++++++++++++++++------------------------- 1 file changed, 105 insertions(+), 93 deletions(-) diff --git a/yarn.lock b/yarn.lock index 99ee12949bf..01364799f1e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1764,105 +1764,105 @@ tslib "^2.5.0" webcrypto-core "^1.7.7" -"@percy/cli-app@1.24.1": - version "1.24.1" - resolved "https://registry.yarnpkg.com/@percy/cli-app/-/cli-app-1.24.1.tgz#f4296597631f135ec77c3b0d5eab297018461cf2" - integrity sha512-LFgPfVFY487U43D/TkGyF4My6Urym/jQcYYmglzTUFLITan/a9ICiVyyK/CL1dS74CUjWbtFPAfs4glez3qewA== +"@percy/cli-app@1.25.0": + version "1.25.0" + resolved "https://registry.yarnpkg.com/@percy/cli-app/-/cli-app-1.25.0.tgz#ac4a6c671a7d65279b881a2fd659acd9fc8b7222" + integrity sha512-49fRI8Vmf6OhHxwxrbTznsmJv6WY481tedILJIpb1zJSaVtNA7JHCreqdRlBzG7UusTD2iNJZ1t99F1yxx5x+Q== dependencies: - "@percy/cli-command" "1.24.1" - "@percy/cli-exec" "1.24.1" + "@percy/cli-command" "1.25.0" + "@percy/cli-exec" "1.25.0" -"@percy/cli-build@1.24.1": - version "1.24.1" - resolved "https://registry.yarnpkg.com/@percy/cli-build/-/cli-build-1.24.1.tgz#e659ad2b86e1a7c6df2de803d466f1f2c5c9c645" - integrity sha512-iayHaZOdo5eOkjRHkSeplKqxrElZ/FDOtQSj/u5gU9UHqivgeE/kD0i66yWjuc0WR0B2F8PKbLXsJyv8z82xKg== +"@percy/cli-build@1.25.0": + version "1.25.0" + resolved "https://registry.yarnpkg.com/@percy/cli-build/-/cli-build-1.25.0.tgz#a67a2e734dd8df39917e2f40a976994a0f0aae87" + integrity sha512-6ewm7AxcH4Kvcb8k8wD5BHNJE//Rx0MupOZUFo7AtebIyWtEeZB7aGWEyIzcLcHsuRad5LtQBHI/ZeZyAOsnew== dependencies: - "@percy/cli-command" "1.24.1" + "@percy/cli-command" "1.25.0" -"@percy/cli-command@1.24.1": - version "1.24.1" - resolved "https://registry.yarnpkg.com/@percy/cli-command/-/cli-command-1.24.1.tgz#aef22506c3f23e62f2822c185295bb3adbeeb1da" - integrity sha512-R6DAwLYH7o2cSckm3Nn0hIKvyygk5hMMlHenegbGF4Lu7f7p5K1Gtk0feZXw3DitpxEW4UKincr4KDofjRc2cg== +"@percy/cli-command@1.25.0": + version "1.25.0" + resolved "https://registry.yarnpkg.com/@percy/cli-command/-/cli-command-1.25.0.tgz#afc5ff5936ce81964d65f21d9f00d69a07af4fe7" + integrity sha512-EKkQ3uzrTnq/kRBB1/K+Nvd+JXoAH3WXXQLKMFamfUOkeuT43srXlufXMKQw/+rOpO+QJnQOAfn1yj/4HFOBAA== dependencies: - "@percy/config" "1.24.1" - "@percy/core" "1.24.1" - "@percy/logger" "1.24.1" + "@percy/config" "1.25.0" + "@percy/core" "1.25.0" + "@percy/logger" "1.25.0" -"@percy/cli-config@1.24.1": - version "1.24.1" - resolved "https://registry.yarnpkg.com/@percy/cli-config/-/cli-config-1.24.1.tgz#5c9e16cdd6c30eb1527fce8821a6876fc9be9f11" - integrity sha512-8jNxTCRSxKqg1/1vrDw5Xp+5z2G43LNlSDJPM0Eymb5dH6g9yeqxyqkqgxiv1KH5AaQMVJ3Lfcqlzyy5NCI4RQ== +"@percy/cli-config@1.25.0": + version "1.25.0" + resolved "https://registry.yarnpkg.com/@percy/cli-config/-/cli-config-1.25.0.tgz#678ffcdcc59ee92d2fccadae991743e947a9e059" + integrity sha512-sXGliQdeKgPQL++zusfe6mobmLT69cVLccLfqD5VUHC4HqaaEXdiCJIzzKnxHBLaZFk5JRd4++CU+Vy9ACtRSw== dependencies: - "@percy/cli-command" "1.24.1" + "@percy/cli-command" "1.25.0" -"@percy/cli-exec@1.24.1": - version "1.24.1" - resolved "https://registry.yarnpkg.com/@percy/cli-exec/-/cli-exec-1.24.1.tgz#22432f7ccb1978fd03692266cd7688740484b634" - integrity sha512-3mF0YwVsxrbECBXt2zc54L7AU6W+MSF2zgJtyZaBvyvN57pznvH6ZJGr2ZR4Ck7PiYgF1zZ3N31GlbWmutKCzQ== +"@percy/cli-exec@1.25.0": + version "1.25.0" + resolved "https://registry.yarnpkg.com/@percy/cli-exec/-/cli-exec-1.25.0.tgz#46872e8de422b4415b420d76ab77ff9376bd3411" + integrity sha512-httlYtYJ3bD+9VihEZL8CQzJ9ykR1THPfN9Ww6WGqBG2IGCe8Ln/6hZ/ivSK7IgW8OoRb6V/3qApGYpVD8dS8Q== dependencies: - "@percy/cli-command" "1.24.1" + "@percy/cli-command" "1.25.0" cross-spawn "^7.0.3" which "^2.0.2" -"@percy/cli-snapshot@1.24.1": - version "1.24.1" - resolved "https://registry.yarnpkg.com/@percy/cli-snapshot/-/cli-snapshot-1.24.1.tgz#ec9bcc746fedef1ac383903dc7f8a7f2fa0b73a2" - integrity sha512-/CzwvPRzMvQj/MiLY8QSrQE27VJvEc0EaG4qaY9iMXgarXa7+jqWzZuqoFYEIks36K7MyBqt5PGyh/g27XN3Fg== +"@percy/cli-snapshot@1.25.0": + version "1.25.0" + resolved "https://registry.yarnpkg.com/@percy/cli-snapshot/-/cli-snapshot-1.25.0.tgz#cd6c6965cd1286c3c46716b4eac078eeb56d9e4e" + integrity sha512-JtaW7SVWOr13iuE9E5ZsTAmXDC0oSYV75EvhF3zh8sXUa2Q/bjbhLI52kewThmkqOETREWrKc2uVkYEqWSQYXA== dependencies: - "@percy/cli-command" "1.24.1" + "@percy/cli-command" "1.25.0" yaml "^2.0.0" -"@percy/cli-upload@1.24.1": - version "1.24.1" - resolved "https://registry.yarnpkg.com/@percy/cli-upload/-/cli-upload-1.24.1.tgz#13759b77ed48e0dc0573e580bb49652d946e529b" - integrity sha512-P1ypjUAge01HdsRqrkmIeYsEKqQLQZ5xskKMBGc7mjRSPSYMuGLyHSc0p0nGpclCFp59pDzKfvCGnNJ/ZbEiAQ== +"@percy/cli-upload@1.25.0": + version "1.25.0" + resolved "https://registry.yarnpkg.com/@percy/cli-upload/-/cli-upload-1.25.0.tgz#1c9a4c634401c558a7eee2c611a9fdf75b87fc6d" + integrity sha512-ZhSHkCKWvUMqkWIIL2WedVbkTs17alYlGnt2QPHHDbxdqcV4dAgv/O08JVHmI2pf5fTCGe8hD2XHT508R4novg== dependencies: - "@percy/cli-command" "1.24.1" + "@percy/cli-command" "1.25.0" fast-glob "^3.2.11" image-size "^1.0.0" "@percy/cli@^1.11.0": - version "1.24.1" - resolved "https://registry.yarnpkg.com/@percy/cli/-/cli-1.24.1.tgz#d4b50b91478f447f84f9e0eee87bdc7ee593ce07" - integrity sha512-sbQUcUW0uz/JDQDcH/UpTAPIt/wx8G855tVufdS6kazWaLMpcFfbXNxh/xuTr4wUgdB0ERLp4P91oCQqNYXR9g== - dependencies: - "@percy/cli-app" "1.24.1" - "@percy/cli-build" "1.24.1" - "@percy/cli-command" "1.24.1" - "@percy/cli-config" "1.24.1" - "@percy/cli-exec" "1.24.1" - "@percy/cli-snapshot" "1.24.1" - "@percy/cli-upload" "1.24.1" - "@percy/client" "1.24.1" - "@percy/logger" "1.24.1" - -"@percy/client@1.24.1": - version "1.24.1" - resolved "https://registry.yarnpkg.com/@percy/client/-/client-1.24.1.tgz#61037142ab44426ac3ec7c9f315294255cf5330c" - integrity sha512-KFxF6JMQKQHmx5cGsAUNDNpIXIwflkAJQb/L+mwbODvT09wkYBNUjw9O5Lde6xKY7tDqOUrbdO81XfvZl6JgRA== - dependencies: - "@percy/env" "1.24.1" - "@percy/logger" "1.24.1" - -"@percy/config@1.24.1": - version "1.24.1" - resolved "https://registry.yarnpkg.com/@percy/config/-/config-1.24.1.tgz#842412d9a38a6a2aeee43cb5b09b6c228010af2e" - integrity sha512-SDM59al8dDE05Ivs87khxsPB0S/rIfoLdTWMlM81GKHf5hklmKKB/I2afzUmjIaG564cguIXNtevKOhmbZ7iPQ== - dependencies: - "@percy/logger" "1.24.1" + version "1.25.0" + resolved "https://registry.yarnpkg.com/@percy/cli/-/cli-1.25.0.tgz#c665d312e025916a7c67b445fe0ca85b6d5f7930" + integrity sha512-j8+NgscX4723zJupPLkKcFu36srdv10xPrqYxU2W2IbaAKhTLUO9o4vMVr+4Z0bfjzYKnZuH4H+36xV+bdoSCA== + dependencies: + "@percy/cli-app" "1.25.0" + "@percy/cli-build" "1.25.0" + "@percy/cli-command" "1.25.0" + "@percy/cli-config" "1.25.0" + "@percy/cli-exec" "1.25.0" + "@percy/cli-snapshot" "1.25.0" + "@percy/cli-upload" "1.25.0" + "@percy/client" "1.25.0" + "@percy/logger" "1.25.0" + +"@percy/client@1.25.0": + version "1.25.0" + resolved "https://registry.yarnpkg.com/@percy/client/-/client-1.25.0.tgz#5c50bfdb8086e7d42a06359854b484a10ed257eb" + integrity sha512-5xWnUkUyosaNhZnpatYidzbugsCY3V9RK8o+ISw5+LZ71Tl9bS/YtbUmwqR2n03dTJmvuDOxtcDbrFubW+mqfQ== + dependencies: + "@percy/env" "1.25.0" + "@percy/logger" "1.25.0" + +"@percy/config@1.25.0": + version "1.25.0" + resolved "https://registry.yarnpkg.com/@percy/config/-/config-1.25.0.tgz#bfaf968a342f906e6e4db794f98a16c612cd9107" + integrity sha512-Ryfz29Q5j3QlibxlTXOfJPmykk5Fli7fIle09GeM57cWu03Q8IjMCXi2fP5++8XCBZoKXh/cHNKMK8B7AyD/Hw== + dependencies: + "@percy/logger" "1.25.0" ajv "^8.6.2" cosmiconfig "^8.0.0" yaml "^2.0.0" -"@percy/core@1.24.1": - version "1.24.1" - resolved "https://registry.yarnpkg.com/@percy/core/-/core-1.24.1.tgz#7b276f8de7d39c4ae59bb4c3236b4a115d1b2f47" - integrity sha512-lByp0765X4wnJFeNqjp8+nZBdVIG7/+cz5gBCwfktuZmsYZje8/HCa0agQTjEx5ETvoXyjPKCpI144nqHqvTFg== +"@percy/core@1.25.0": + version "1.25.0" + resolved "https://registry.yarnpkg.com/@percy/core/-/core-1.25.0.tgz#bf01129d3c461f7d6f705aa5e4b6de5cf6d5e4c9" + integrity sha512-FxM44alygp19wI7/Fby2Eo4LN0BiZz6CXPPyrPfAxPZnScGBLfJm6fU7pQ4gps79/klXLaaDSuLs4MhRk4n9ng== dependencies: - "@percy/client" "1.24.1" - "@percy/config" "1.24.1" - "@percy/dom" "1.24.1" - "@percy/logger" "1.24.1" + "@percy/client" "1.25.0" + "@percy/config" "1.25.0" + "@percy/dom" "1.25.0" + "@percy/logger" "1.25.0" content-disposition "^0.5.4" cross-spawn "^7.0.3" extract-zip "^2.0.1" @@ -1880,20 +1880,22 @@ dependencies: "@percy/sdk-utils" "^1.3.1" -"@percy/dom@1.24.1": - version "1.24.1" - resolved "https://registry.yarnpkg.com/@percy/dom/-/dom-1.24.1.tgz#c5cb46795931ef39e707f301d94a365aa32230d5" - integrity sha512-wdf0hrQerIhla9vpl0CeOhRBXCAkTWXzIqyrcXxje/rwYXw6PfanYnB48yKCbLyaPY8MRIV5JMP8fxzhJF6Rdg== +"@percy/dom@1.25.0": + version "1.25.0" + resolved "https://registry.yarnpkg.com/@percy/dom/-/dom-1.25.0.tgz#cbc9730a034acb0939eae6500b3b38e00ddcbcfb" + integrity sha512-zBTFC75SM5LfRKZ9n0izvzcfTszCPwKRlulOEu4HQDATpzZuIIwyfM+5EuHthbt+E2PDkgiycbji4T66HnoRGA== -"@percy/env@1.24.1": - version "1.24.1" - resolved "https://registry.yarnpkg.com/@percy/env/-/env-1.24.1.tgz#eefd53a8d31f8f8409512d47eccb7a7cdaec69fb" - integrity sha512-h/KLpK2z2Cw2dR5vHfuItsAlpUBjNJBmwVmlvb/nbdxAh4slz1a2QGzdFiskpU4YMDy6GebpN+cOkPXQcI8SaQ== +"@percy/env@1.25.0": + version "1.25.0" + resolved "https://registry.yarnpkg.com/@percy/env/-/env-1.25.0.tgz#679babbe32f1aaff913fa0aaed2650b27996e0c8" + integrity sha512-Ds08lRk/TfrpTyIExLkzBI9PmIxVb2mm+UcAN/te7nhWcYB33rw3mO+U4+4WxhMQOh5QTLweaZEwEFx8uTx11A== + dependencies: + "@percy/logger" "1.25.0" -"@percy/logger@1.24.1": - version "1.24.1" - resolved "https://registry.yarnpkg.com/@percy/logger/-/logger-1.24.1.tgz#ccb011a5230155766375ffe8ec10b11080c3c2e7" - integrity sha512-dJWGl+tZdPrg4uZglkGaom/1l4Cagruki9ZqsModNvvEN4LoXCbrIBd45GxlNkNhLbUDbvvvpTz1Lqu8wRwB8A== +"@percy/logger@1.25.0": + version "1.25.0" + resolved "https://registry.yarnpkg.com/@percy/logger/-/logger-1.25.0.tgz#e6838d3b5ba65431e8f14b831345c1fbb96a600f" + integrity sha512-S5xaDIG16vUChKdHSeOjmAsLpIZ+JzzAdTdmXLy+MDcqU//iZcaY5aOH7h2zR7U/h4WUGe71YDWx2C5dOskMhQ== "@percy/sdk-utils@^1.3.1": version "1.23.0" @@ -2273,9 +2275,9 @@ form-data "^3.0.0" "@types/node@*": - version "20.1.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.1.7.tgz#ce10c802f7731909d0a44ac9888e8b3a9125eb62" - integrity sha512-WCuw/o4GSwDGMoonES8rcvwsig77dGCMbZDrZr2x4ZZiNW4P/gcoZXe/0twgtobcTkmg9TuKflxYL/DuwDyJzg== + version "20.2.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb" + integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== "@types/node@^14.14.31": version "14.18.47" @@ -3432,7 +3434,17 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@^8.0.0, cosmiconfig@^8.1.3: +cosmiconfig@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" + integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== + dependencies: + import-fresh "^3.2.1" + js-yaml "^4.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + +cosmiconfig@^8.1.3: version "8.1.3" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== @@ -8840,9 +8852,9 @@ yallist@^4.0.0: integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.2.tgz#ec551ef37326e6d42872dad1970300f8eb83a073" - integrity sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== yargs-parser@^18.1.2: version "18.1.3" From 9889907ad0760bc07941eb7bf714267b190d7c81 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 11:07:15 +0000 Subject: [PATCH 21/54] Update typescript-eslint monorepo to v5.59.7 (#11031) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> --- yarn.lock | 99 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 52 insertions(+), 47 deletions(-) diff --git a/yarn.lock b/yarn.lock index 01364799f1e..27d791e635e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2215,11 +2215,16 @@ "@types/tough-cookie" "*" parse5 "^7.0.0" -"@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.8": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== +"@types/json-schema@^7.0.9": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -2445,14 +2450,14 @@ integrity sha512-3NoqvZC2W5gAC5DZbTpCeJ251vGQmgcWIHQJGq2J240HY6ErQ9aWKkwfoKJlHLx+A83WPNTZ9+3cd2ILxbvr1w== "@typescript-eslint/eslint-plugin@^5.35.1": - version "5.59.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz#a350faef1baa1e961698240f922d8de1761a9e2b" - integrity sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw== + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz#1e7a3e5318ece22251dfbc5c9c6feeb4793cc509" + integrity sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.59.6" - "@typescript-eslint/type-utils" "5.59.6" - "@typescript-eslint/utils" "5.59.6" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/type-utils" "5.59.8" + "@typescript-eslint/utils" "5.59.8" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" @@ -2461,13 +2466,13 @@ tsutils "^3.21.0" "@typescript-eslint/parser@^5.6.0": - version "5.59.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.6.tgz#bd36f71f5a529f828e20b627078d3ed6738dbb40" - integrity sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA== + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.8.tgz#60cbb00671d86cf746044ab797900b1448188567" + integrity sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw== dependencies: - "@typescript-eslint/scope-manager" "5.59.6" - "@typescript-eslint/types" "5.59.6" - "@typescript-eslint/typescript-estree" "5.59.6" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/typescript-estree" "5.59.8" debug "^4.3.4" "@typescript-eslint/scope-manager@5.58.0": @@ -2478,21 +2483,21 @@ "@typescript-eslint/types" "5.58.0" "@typescript-eslint/visitor-keys" "5.58.0" -"@typescript-eslint/scope-manager@5.59.6": - version "5.59.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz#d43a3687aa4433868527cfe797eb267c6be35f19" - integrity sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ== +"@typescript-eslint/scope-manager@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz#ff4ad4fec6433647b817c4a7d4b4165d18ea2fa8" + integrity sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig== dependencies: - "@typescript-eslint/types" "5.59.6" - "@typescript-eslint/visitor-keys" "5.59.6" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/visitor-keys" "5.59.8" -"@typescript-eslint/type-utils@5.59.6": - version "5.59.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz#37c51d2ae36127d8b81f32a0a4d2efae19277c48" - integrity sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ== +"@typescript-eslint/type-utils@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz#aa6c029a9d7706d26bbd25eb4666398781df6ea2" + integrity sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA== dependencies: - "@typescript-eslint/typescript-estree" "5.59.6" - "@typescript-eslint/utils" "5.59.6" + "@typescript-eslint/typescript-estree" "5.59.8" + "@typescript-eslint/utils" "5.59.8" debug "^4.3.4" tsutils "^3.21.0" @@ -2501,10 +2506,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.58.0.tgz#54c490b8522c18986004df7674c644ffe2ed77d8" integrity sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g== -"@typescript-eslint/types@5.59.6": - version "5.59.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.6.tgz#5a6557a772af044afe890d77c6a07e8c23c2460b" - integrity sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA== +"@typescript-eslint/types@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.8.tgz#212e54414733618f5d0fd50b2da2717f630aebf8" + integrity sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w== "@typescript-eslint/typescript-estree@5.58.0": version "5.58.0" @@ -2519,30 +2524,30 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.59.6": - version "5.59.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz#2fb80522687bd3825504925ea7e1b8de7bb6251b" - integrity sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA== +"@typescript-eslint/typescript-estree@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz#801a7b1766481629481b3b0878148bd7a1f345d7" + integrity sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg== dependencies: - "@typescript-eslint/types" "5.59.6" - "@typescript-eslint/visitor-keys" "5.59.6" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/visitor-keys" "5.59.8" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.59.6": - version "5.59.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.6.tgz#82960fe23788113fc3b1f9d4663d6773b7907839" - integrity sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg== +"@typescript-eslint/utils@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.8.tgz#34d129f35a2134c67fdaf024941e8f96050dca2b" + integrity sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.59.6" - "@typescript-eslint/types" "5.59.6" - "@typescript-eslint/typescript-estree" "5.59.6" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/typescript-estree" "5.59.8" eslint-scope "^5.1.1" semver "^7.3.7" @@ -2568,12 +2573,12 @@ "@typescript-eslint/types" "5.58.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@5.59.6": - version "5.59.6" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz#673fccabf28943847d0c8e9e8d008e3ada7be6bb" - integrity sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q== +"@typescript-eslint/visitor-keys@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz#aa6a7ef862add919401470c09e1609392ef3cc40" + integrity sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ== dependencies: - "@typescript-eslint/types" "5.59.6" + "@typescript-eslint/types" "5.59.8" eslint-visitor-keys "^3.3.0" abab@^2.0.6: From c00a8775149ed87a4a427b46ff7dfb947e87ccef Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 6 Jun 2023 14:26:21 +0100 Subject: [PATCH 22/54] Resetting package fields for development --- package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index aaba052a506..11e6b864519 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "package.json", ".stylelintrc.js" ], - "main": "./lib/index.ts", + "main": "./src/index.ts", "matrix_src_main": "./src/index.ts", "matrix_lib_main": "./lib/index.ts", "matrix_lib_typings": "./lib/index.d.ts", @@ -219,6 +219,5 @@ "outputDirectory": "coverage", "outputName": "jest-sonar-report.xml", "relativePaths": true - }, - "typings": "./lib/index.d.ts" + } } From d0c1a8e69ca7697074d0045c30cf58e4f6ed0a3a Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 6 Jun 2023 14:26:37 +0100 Subject: [PATCH 23/54] Reset matrix-js-sdk back to develop branch --- package.json | 2 +- yarn.lock | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 11e6b864519..51228a04a19 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "maplibre-gl": "^2.0.0", "matrix-encrypt-attachment": "^1.0.3", "matrix-events-sdk": "0.0.1", - "matrix-js-sdk": "26.0.0", + "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", "matrix-widget-api": "^1.4.0", "memoize-one": "^6.0.0", "minimist": "^1.2.5", diff --git a/yarn.lock b/yarn.lock index f075c8edb47..d2bf1fb2be3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6460,10 +6460,9 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@26.0.0: +"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "26.0.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-26.0.0.tgz#44134f4af8f401537edfee79a93a520b7effc6b3" - integrity sha512-HLosQgRjEb2/j4CpxncIqRklKKaWKZcfut6DDLswVf6d0pCXHbLp39iCy4obpJiWH2H/4k/HMvDzj3+8J8qWWw== + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/c52e4b632933b54dca20c2a8f966e47013c28104" dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-js" "^0.1.0-alpha.9" From b3545736dcf22512ad18dab65b4261b0eb01da23 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Tue, 6 Jun 2023 11:09:04 +0000 Subject: [PATCH 24/54] Replace Sass variables specific to each CSS file with CSS custom properties (#11039) * Use CSS custom properties on _LeftPanel.pcss * Use CSS custom properties on _SpacePanel.pcss * Use CSS custom properties on _SpaceRoomView.pcss * Use CSS custom properties on _ImageView.pcss * Use CSS custom properties on _EventTile.pcss * Remove a CSS custom properties on _SpaceCreateMenu.pcss Used only on one instance * Revert "Use CSS custom properties on _ImageView.pcss" This reverts commit 0210659f94fcf1107adabecf1bce443fc970a31b. * Revert "Use CSS custom properties on _EventTile.pcss" This reverts commit 83cf824a57b174e62935bb9a4433aadcd8f8164f. * Run prettier --- res/css/structures/_LeftPanel.pcss | 11 +++--- res/css/structures/_SpacePanel.pcss | 41 +++++++++++----------- res/css/structures/_SpaceRoomView.pcss | 12 +++---- res/css/views/spaces/_SpaceCreateMenu.pcss | 4 +-- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/res/css/structures/_LeftPanel.pcss b/res/css/structures/_LeftPanel.pcss index 95ca5c350db..9cbffc77d4a 100644 --- a/res/css/structures/_LeftPanel.pcss +++ b/res/css/structures/_LeftPanel.pcss @@ -14,8 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -$roomListCollapsedWidth: 68px; - .mx_MatrixChat--with-avatar { .mx_LeftPanel, .mx_LeftPanel .mx_LeftPanel_roomListContainer { @@ -33,6 +31,11 @@ $roomListCollapsedWidth: 68px; contain: layout paint; } +.mx_LeftPanel_wrapper, +.mx_LeftPanel { + --collapsedWidth: 68px; +} + .mx_LeftPanel_wrapper { display: flex; flex-direction: row; @@ -46,7 +49,7 @@ $roomListCollapsedWidth: 68px; position: relative; &[data-collapsed] { - max-width: $roomListCollapsedWidth; + max-width: var(--collapsedWidth); } } } @@ -218,7 +221,7 @@ $roomListCollapsedWidth: 68px; width: unset !important; .mx_LeftPanel_roomListContainer { - width: $roomListCollapsedWidth; + width: var(--collapsedWidth); .mx_LeftPanel_userHeader { flex-direction: row; diff --git a/res/css/structures/_SpacePanel.pcss b/res/css/structures/_SpacePanel.pcss index 73f6fde570a..a149eae6395 100644 --- a/res/css/structures/_SpacePanel.pcss +++ b/res/css/structures/_SpacePanel.pcss @@ -14,15 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -$topLevelHeight: 32px; -$nestedHeight: 24px; -$gutterSize: 16px; -$activeBorderTransparentGap: 1px; - -$activeBackgroundColor: $panel-actions; -$activeBorderColor: $primary-content; - .mx_SpacePanel { + --activeBackground-color: $panel-actions; + --activeBorder-color: $primary-content; + --activeBorder-transparent-gap: 1px; + --gutterSize: 16px; + --height-nested: 24px; + --height-topLevel: 32px; + background-color: $spacePanel-bg-color; flex: 0 0 auto; padding: 0; @@ -116,7 +115,7 @@ $activeBorderColor: $primary-content; } .mx_SpaceItem:not(.hasSubSpaces) > .mx_SpaceButton { - margin-left: $gutterSize; + margin-left: var(--gutterSize); min-width: 40px; } @@ -130,12 +129,12 @@ $activeBorderColor: $primary-content; &.mx_SpaceButton_active { &:not(.mx_SpaceButton_narrow) .mx_SpaceButton_selectionWrapper { - background-color: $activeBackgroundColor; + background-color: var(--activeBackground-color); } &.mx_SpaceButton_narrow .mx_SpaceButton_selectionWrapper { - padding: $activeBorderTransparentGap; - border: 3px $activeBorderColor solid; + padding: var(--activeBorder-transparent-gap); + border: 3px var(--activeBorder-color) solid; } } @@ -162,9 +161,9 @@ $activeBorderColor: $primary-content; } .mx_SpaceButton_toggleCollapse { - width: $gutterSize; + width: var(--gutterSize); padding: 10px 0; - min-width: $gutterSize; + min-width: var(--gutterSize); height: 20px; mask-position: center; mask-size: 20px; @@ -174,17 +173,17 @@ $activeBorderColor: $primary-content; } .mx_SpaceButton_icon { - width: $topLevelHeight; - min-width: $topLevelHeight; - height: $topLevelHeight; + width: var(--height-topLevel); + min-width: var(--height-topLevel); + height: var(--height-topLevel); border-radius: 8px; position: relative; &::before { position: absolute; content: ""; - width: $topLevelHeight; - height: $topLevelHeight; + width: var(--height-topLevel); + height: var(--height-topLevel); top: 0; left: 0; mask-position: center; @@ -344,10 +343,10 @@ $activeBorderColor: $primary-content; padding: 0 8px 16px 0; & > .mx_SpaceButton { - height: $topLevelHeight; + height: var(--height-topLevel); &.mx_SpaceButton_active::before { - height: $topLevelHeight; + height: var(--height-topLevel); } } diff --git a/res/css/structures/_SpaceRoomView.pcss b/res/css/structures/_SpaceRoomView.pcss index 5f434a28022..a83fe420a71 100644 --- a/res/css/structures/_SpaceRoomView.pcss +++ b/res/css/structures/_SpaceRoomView.pcss @@ -14,8 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -$SpaceRoomViewInnerWidth: 428px; - @define-mixin SpacePillButton { position: relative; padding: 16px 32px 16px 72px; @@ -61,6 +59,8 @@ $SpaceRoomViewInnerWidth: 428px; } .mx_SpaceRoomView { + --innerWidth: 428px; + overflow-y: auto; flex: 1; @@ -83,11 +83,11 @@ $SpaceRoomViewInnerWidth: 428px; color: $secondary-content; margin-top: 12px; margin-bottom: 24px; - max-width: $SpaceRoomViewInnerWidth; + max-width: var(--innerWidth); } .mx_AddExistingToSpace { - max-width: $SpaceRoomViewInnerWidth; + max-width: var(--innerWidth); .mx_AddExistingToSpace_content { height: calc(100vh - 360px); @@ -98,7 +98,7 @@ $SpaceRoomViewInnerWidth: 428px; .mx_SpaceRoomView_buttons { display: block; margin-top: 44px; - width: $SpaceRoomViewInnerWidth; + width: var(--innerWidth); text-align: right; /* button alignment right */ .mx_AccessibleButton_hasKind { @@ -112,7 +112,7 @@ $SpaceRoomViewInnerWidth: 428px; } .mx_Field { - max-width: $SpaceRoomViewInnerWidth; + max-width: var(--innerWidth); & + .mx_Field { margin-top: 28px; diff --git a/res/css/views/spaces/_SpaceCreateMenu.pcss b/res/css/views/spaces/_SpaceCreateMenu.pcss index 3b04be9ff4d..35c5278c6ca 100644 --- a/res/css/views/spaces/_SpaceCreateMenu.pcss +++ b/res/css/views/spaces/_SpaceCreateMenu.pcss @@ -14,14 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -$spacePanelWidth: 68px; - .mx_SpaceCreateMenu_wrapper { /* background blur everything except SpacePanel */ .mx_ContextualMenu_background { background-color: $dialog-backdrop-color; opacity: 0.6; - left: $spacePanelWidth; + left: 68px; } .mx_ContextualMenu { From c42a7769e932c337686755d006945286554e5e1e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 Jun 2023 11:09:24 +0000 Subject: [PATCH 25/54] Update definitelyTyped (#11028) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> --- yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index d2bf1fb2be3..44a69a1927e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2242,9 +2242,9 @@ integrity sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw== "@types/lodash@^4.14.168": - version "4.14.194" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" - integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== + version "4.14.195" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" + integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== "@types/mapbox__point-geometry@*", "@types/mapbox__point-geometry@^0.1.2": version "0.1.2" @@ -2289,9 +2289,9 @@ integrity sha512-OuJi8bIng4wYHHA3YpKauL58dZrPxro3d0tabPHyiNF8rKfGKuVfr83oFlPLmKri1cX+Z3cJP39GXmnqkP11Gw== "@types/node@^16": - version "16.18.31" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.31.tgz#7de39c2b9363f0d95b129cc969fcbf98e870251c" - integrity sha512-KPXltf4z4g517OlVJO9XQ2357CYw7fvuJ3ZuBynjXC5Jos9i+K7LvFb7bUIwtJXSZj0vTp9Q6NJBSQpkwwO8Zw== + version "16.18.34" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.34.tgz#62d2099b30339dec4b1b04a14c96266459d7c8b2" + integrity sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2309,9 +2309,9 @@ integrity sha512-EDrLIPaPXOZqDjrkzxxbX7UlJSeQVgah3i0aA4pOSzmK9zq3BIh7/MZIQxED7slJByvKM4Gc6Hypyu2lJzh3SQ== "@types/prettier@^2.1.5": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@*": version "15.7.5" From d340fa8d2a43f4bdaf1b95a8575f4514484a446e Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Tue, 6 Jun 2023 14:03:52 +0000 Subject: [PATCH 26/54] Remove TODO comments about spacing variables (#10695) The variables on _spacing.pcss have been deprecated by https://github.com/matrix-org/matrix-react-sdk/pull/10686 --- res/css/structures/_RoomView.pcss | 4 ++-- res/css/views/beta/_BetaCard.pcss | 4 ++-- res/css/views/dialogs/_InviteDialog.pcss | 18 +++++++++--------- res/css/views/dialogs/_SpotlightDialog.pcss | 14 +++++++------- .../security/_AccessSecretStorageDialog.pcss | 6 +++--- .../elements/_GenericEventListSummary.pcss | 2 +- res/css/views/elements/_ReplyChain.pcss | 6 +++--- res/css/views/messages/_EventTileBubble.pcss | 4 ++-- res/css/views/messages/_ViewSourceEvent.pcss | 4 ++-- res/css/views/right_panel/_BaseCard.pcss | 14 +++++++------- res/css/views/right_panel/_ThreadPanel.pcss | 2 +- res/css/views/right_panel/_UserInfo.pcss | 10 +++++----- res/css/views/rooms/_EventTile.pcss | 6 +++--- res/css/views/rooms/_IRCLayout.pcss | 2 +- res/css/views/settings/_FontScalingPanel.pcss | 6 +++--- res/css/views/settings/_ProfileSettings.pcss | 2 +- .../views/settings/tabs/_SettingsSection.pcss | 2 +- res/css/views/settings/tabs/_SettingsTab.pcss | 6 +++--- 18 files changed, 56 insertions(+), 56 deletions(-) diff --git a/res/css/structures/_RoomView.pcss b/res/css/structures/_RoomView.pcss index b340c8d9945..b70649029f0 100644 --- a/res/css/structures/_RoomView.pcss +++ b/res/css/structures/_RoomView.pcss @@ -15,7 +15,7 @@ limitations under the License. */ :root { - --RoomView_MessageList-padding: 18px; /* TODO: use a variable */ + --RoomView_MessageList-padding: 18px; } .mx_RoomView_wrapper { @@ -212,7 +212,7 @@ limitations under the License. margin-bottom: 4px; h2 { - margin-top: 6px; /* TODO: Use a spacing variable */ + margin-top: 6px; } } diff --git a/res/css/views/beta/_BetaCard.pcss b/res/css/views/beta/_BetaCard.pcss index 62f7d7b93a7..47ab7b005be 100644 --- a/res/css/views/beta/_BetaCard.pcss +++ b/res/css/views/beta/_BetaCard.pcss @@ -35,7 +35,7 @@ limitations under the License. font-size: $font-18px; line-height: $font-22px; color: $primary-content; - margin: $spacing-4 0 14px; // TODO: use a spacing variable + margin: $spacing-4 0 14px; display: flex; align-items: center; @@ -117,7 +117,7 @@ limitations under the License. .mx_BetaCard_betaPill { background-color: $accent-alt; - padding: $spacing-4 10px; // TODO: use a spacing variable + padding: $spacing-4 10px; border-radius: 8px; text-transform: uppercase; font-size: $font-12px; diff --git a/res/css/views/dialogs/_InviteDialog.pcss b/res/css/views/dialogs/_InviteDialog.pcss index a7c1346951a..4ffdb5d6cfa 100644 --- a/res/css/views/dialogs/_InviteDialog.pcss +++ b/res/css/views/dialogs/_InviteDialog.pcss @@ -28,7 +28,7 @@ limitations under the License. flex-direction: row; /* Right margin for the design. We could apply this to the whole dialog, but then the scrollbar */ /* for the user section gets weird. */ - margin: $spacing-8 45px 0 0; /* TODO: Use a spacing variable */ + margin: $spacing-8 45px 0 0; .mx_InviteDialog_editor { flex: 1; @@ -43,14 +43,14 @@ limitations under the License. flex-wrap: wrap; .mx_InviteDialog_userTile { - margin: 6px 6px 0 0; /* TODO: Use a spacing variable */ + margin: 6px 6px 0 0; display: inline-block; min-width: max-content; /* prevent manipulation by flexbox */ } /* overrides bunch of our default text input styles */ > input[type="text"] { - margin: 6px 0 !important; /* TODO: Use a spacing variable */ + margin: 6px 0 !important; height: 24px; line-height: $font-24px; font-size: $font-14px; @@ -67,7 +67,7 @@ limitations under the License. .mx_InviteDialog_goButton { min-width: 48px; - margin-inline-start: 10px; /* TODO: Use a spacing variable */ + margin-inline-start: 10px; height: 25px; line-height: $font-25px; } @@ -77,7 +77,7 @@ limitations under the License. /* Width and height are required to trick the layout engine. */ width: 20px; height: 20px; - margin-inline-start: 5px; /* TODO: Use a spacing variable */ + margin-inline-start: 5px; display: inline-block; vertical-align: middle; } @@ -103,7 +103,7 @@ limitations under the License. } .mx_InviteDialog_section_showMore { - margin: 7px 18px; /* TODO: Use a spacing variable */ + margin: 7px 18px; display: block; } } @@ -252,7 +252,7 @@ limitations under the License. .mx_InviteDialog_userSections { margin-top: $spacing-4; overflow-y: auto; - padding: 0 45px $spacing-4 0; /* TODO: Use a spacing variable */ + padding: 0 45px $spacing-4 0; } .mx_InviteDialog_helpText { @@ -289,7 +289,7 @@ limitations under the License. .mx_DialPad { row-gap: $spacing-16; - column-gap: 48px; /* TODO: Use a spacing variable */ + column-gap: 48px; margin-inline: auto; } } @@ -450,7 +450,7 @@ limitations under the License. } .mx_InviteDialog_identityServer { - margin-top: 1em; /* TODO: Use a spacing variable */ + margin-top: 1em; } .mx_InviteDialog_oneThreepid { diff --git a/res/css/views/dialogs/_SpotlightDialog.pcss b/res/css/views/dialogs/_SpotlightDialog.pcss index 9303e61a330..75b4f48ff5a 100644 --- a/res/css/views/dialogs/_SpotlightDialog.pcss +++ b/res/css/views/dialogs/_SpotlightDialog.pcss @@ -36,7 +36,7 @@ limitations under the License. kbd { display: inline-block; - padding: 2px $spacing-4; /* TODO: Use a spacing variable */ + padding: 2px $spacing-4; margin: 0 $spacing-4; border-radius: 6px; background-color: $quinary-content; @@ -76,7 +76,7 @@ limitations under the License. vertical-align: middle; color: $primary-content; position: relative; - padding: $spacing-4 $spacing-8 $spacing-4 37px; /* TODO: Use a spacing variable */ + padding: $spacing-4 $spacing-8 $spacing-4 37px; &::before { background-color: $secondary-content; @@ -234,7 +234,7 @@ limitations under the License. .mx_SpotlightDialog_otherSearches, .mx_SpotlightDialog_hiddenResults { .mx_SpotlightDialog_option { - padding: 6px $spacing-4; /* TODO: Use a spacing variable */ + padding: 6px $spacing-4; border-radius: 8px; font-size: $font-15px; line-height: $font-24px; @@ -258,11 +258,11 @@ limitations under the License. .mx_AccessibleButton { padding: $spacing-4 $spacing-20; - margin: 2px $spacing-4; /* TODO: Use a spacing variable */ + margin: 2px $spacing-4; } .mx_SpotlightDialog_enterPrompt { - margin-top: 9px; /* TODO: Use a spacing variable */ + margin-top: 9px; margin-right: $spacing-8; } } @@ -379,7 +379,7 @@ limitations under the License. .mx_AccessibleButton { position: relative; margin: 0; - padding: 3px $spacing-8 3px $spacing-28; /* TODO: Use a spacing variable */ + padding: 3px $spacing-8 3px $spacing-28; &::before { content: ""; @@ -480,7 +480,7 @@ limitations under the License. } .mx_SpotlightDialog_enterPrompt { - padding: 2px $spacing-4; /* TODO: Use a spacing variable */ + padding: 2px $spacing-4; /* To avoid any styling inherent with elements */ font-family: inherit; font-weight: inherit; diff --git a/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss b/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss index 6b802197dc7..85e5c082585 100644 --- a/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss +++ b/res/css/views/dialogs/security/_AccessSecretStorageDialog.pcss @@ -23,7 +23,7 @@ limitations under the License. height: 24px; margin-inline-end: $spacing-8; position: relative; - top: 5px; /* TODO: spacing variable */ + top: 5px; background-color: $primary-content; } @@ -81,7 +81,7 @@ limitations under the License. mask-repeat: no-repeat; mask-position: center; mask-size: 20px; - margin-inline-end: 5px; /* TODO: spacing variable */ + margin-inline-end: 5px; } &.mx_AccessSecretStorageDialog_recoveryKeyFeedback--valid { @@ -109,7 +109,7 @@ limitations under the License. text-align: initial; display: flex; flex-flow: column; - gap: 14px; /* TODO: spacing variable */ + gap: 14px; .mx_Dialog_buttons_additive { float: none; diff --git a/res/css/views/elements/_GenericEventListSummary.pcss b/res/css/views/elements/_GenericEventListSummary.pcss index b7d1adb73e3..a0f5a97c255 100644 --- a/res/css/views/elements/_GenericEventListSummary.pcss +++ b/res/css/views/elements/_GenericEventListSummary.pcss @@ -23,7 +23,7 @@ limitations under the License. .mx_GenericEventListSummary_spacer { border-bottom: 1px solid $primary-hairline-color; - margin-left: 63px; /* TODO: Use a variable */ + margin-left: 63px; line-height: $font-30px; /* TODO: Use a variable */ .mx_IRCLayout & { diff --git a/res/css/views/elements/_ReplyChain.pcss b/res/css/views/elements/_ReplyChain.pcss index 6de9d367a24..4f216322b4d 100644 --- a/res/css/views/elements/_ReplyChain.pcss +++ b/res/css/views/elements/_ReplyChain.pcss @@ -16,9 +16,9 @@ limitations under the License. .mx_ReplyChain { margin: 0; // Reset default blockquote margin - padding-left: 10px; // TODO: Use a spacing variable - border-left: 2px solid var(--username-color); // TODO: Use a spacing variable - border-radius: 2px; // TODO: Use a spacing variable + padding-left: 10px; + border-left: 2px solid var(--username-color); + border-radius: 2px; .mx_ReplyChain_show { &.mx_AccessibleButton_kind_link_inline { diff --git a/res/css/views/messages/_EventTileBubble.pcss b/res/css/views/messages/_EventTileBubble.pcss index 7facf259a11..8fd33714018 100644 --- a/res/css/views/messages/_EventTileBubble.pcss +++ b/res/css/views/messages/_EventTileBubble.pcss @@ -15,10 +15,10 @@ limitations under the License. */ .mx_EventTileBubble { - --EventTileBubble_margin-block: 10px; /* TODO: Use a spacing variable */ + --EventTileBubble_margin-block: 10px; background-color: $dark-panel-bg-color; - padding: 10px; /* TODO: Use a spacing variable */ + padding: 10px; border-radius: 8px; /* Reserve space for external timestamps, but also cap the width */ max-width: min(calc(100% - 2 * var(--MessageTimestamp-width)), 600px); diff --git a/res/css/views/messages/_ViewSourceEvent.pcss b/res/css/views/messages/_ViewSourceEvent.pcss index 725c8341887..0b76ed59539 100644 --- a/res/css/views/messages/_ViewSourceEvent.pcss +++ b/res/css/views/messages/_ViewSourceEvent.pcss @@ -29,7 +29,7 @@ limitations under the License. pre { line-height: 1.2; - margin: 3.5px 0; /* TODO: use a variable */ + margin: 3.5px 0; } .mx_ViewSourceEvent_toggle { @@ -56,7 +56,7 @@ limitations under the License. align-self: flex-end; height: var(--ViewSourceEvent_toggle-size); mask-position: 0 bottom; - margin-bottom: 5px; /* TODO: use a variable */ + margin-bottom: 5px; mask-image: url("$(res)/img/element-icons/minimise-collapse.svg"); } } diff --git a/res/css/views/right_panel/_BaseCard.pcss b/res/css/views/right_panel/_BaseCard.pcss index 39f55b052db..73454e6c17a 100644 --- a/res/css/views/right_panel/_BaseCard.pcss +++ b/res/css/views/right_panel/_BaseCard.pcss @@ -17,7 +17,7 @@ limitations under the License. .mx_BaseCard { --BaseCard_padding-inline: $spacing-8; --BaseCard_EventTile_line-padding-block: 2px; - --BaseCard_EventTile-spacing-inline: 36px; /* TODO: Use a spacing variable */ + --BaseCard_EventTile-spacing-inline: 36px; --BaseCard_header-button-size: 24px; padding: 0 var(--BaseCard_padding-inline); @@ -32,7 +32,7 @@ limitations under the License. margin: $spacing-4 0 $spacing-12; > h2 { - margin: 0 44px; /* TODO: Use a spacing variable */ + margin: 0 44px; font-size: $font-18px; font-weight: var(--font-semi-bold); overflow: hidden; @@ -79,7 +79,7 @@ limitations under the License. margin-inline-start: var(--BaseCard_header-button-size); .mx_BaseCard_header_title_heading { - margin-inline-start: 6px; /* TODO: Use a spacing variable */ + margin-inline-start: 6px; } } } @@ -159,7 +159,7 @@ limitations under the License. } .mx_BaseCard_Button { - padding: 10px; /* TODO: Use a spacing variable */ + padding: 10px; padding-inline-start: $spacing-12; margin: 0; position: relative; @@ -234,8 +234,8 @@ limitations under the License. font-size: $font-12px; color: $secondary-content; - padding-top: 10px; /* TODO: Use a spacing variable */ - padding-bottom: 10px; /* TODO: Use a spacing variable */ + padding-top: 10px; + padding-bottom: 10px; border: 1px solid $quinary-content; box-shadow: 0px 1px 3px rgba(23, 25, 28, 0.05); @@ -243,7 +243,7 @@ limitations under the License. .mx_ContextualMenu_chevron_top { left: auto; - right: 22px; /* TODO: Use a spacing variable */ + right: 22px; border-bottom-color: $quinary-content; &::after { diff --git a/res/css/views/right_panel/_ThreadPanel.pcss b/res/css/views/right_panel/_ThreadPanel.pcss index 470494df524..8435ee5b9f9 100644 --- a/res/css/views/right_panel/_ThreadPanel.pcss +++ b/res/css/views/right_panel/_ThreadPanel.pcss @@ -26,7 +26,7 @@ limitations under the License. } .mx_ThreadPanel_dropdown { - padding: 3px $spacing-4 3px $spacing-8; /* TODO: Use a spacing variable */ + padding: 3px $spacing-4 3px $spacing-8; border-radius: 4px; line-height: 1.5; user-select: none; diff --git a/res/css/views/right_panel/_UserInfo.pcss b/res/css/views/right_panel/_UserInfo.pcss index 1287e74f067..d8ea74586c4 100644 --- a/res/css/views/right_panel/_UserInfo.pcss +++ b/res/css/views/right_panel/_UserInfo.pcss @@ -27,7 +27,7 @@ limitations under the License. top: 0; border-radius: 4px; background-color: $dark-panel-bg-color; - margin: 9px; /* TODO: Use a variable */ + margin: 9px; z-index: 1; /* render on top of the right panel */ div { @@ -44,7 +44,7 @@ limitations under the License. h2 { font-size: $font-18px; font-weight: var(--font-semi-bold); - margin: 18px 0 0 0; /* TODO: Use a variable */ + margin: 18px 0 0 0; } .mx_UserInfo_container { @@ -151,7 +151,7 @@ limitations under the License. } p { - margin: 5px 0; /* TODO: Use a variable */ + margin: 5px 0; } .mx_UserInfo_profile { @@ -179,7 +179,7 @@ limitations under the License. } .mx_E2EIcon { - margin-top: 3px; /* visual vertical centering to the top line of text. TODO: Use a variable */ + margin-top: 3px; /* visual vertical centering to the top line of text. */ margin-inline-end: $spacing-4; /* margin from displayName */ min-width: 18px; /* convince flexbox to not collapse it */ } @@ -196,7 +196,7 @@ limitations under the License. justify-content: center; align-items: center; - margin: 6px 0; /* TODO: Use a variable */ + margin: 6px 0; .mx_UserInfo_roleDescription { display: flex; diff --git a/res/css/views/rooms/_EventTile.pcss b/res/css/views/rooms/_EventTile.pcss index fc871bbc35b..849609acf93 100644 --- a/res/css/views/rooms/_EventTile.pcss +++ b/res/css/views/rooms/_EventTile.pcss @@ -18,7 +18,7 @@ limitations under the License. $left-gutter: 64px; .mx_EventTile { - --EventTile_content-margin-inline-end: 34px; /* TODO: Use a spacing variable */ + --EventTile_content-margin-inline-end: 34px; --EventTile_group_line-spacing-block-start: 1px; --EventTile_group_line-spacing-block-end: 3px; --EventTile_group_line-spacing-inline-start: $left-gutter; @@ -347,7 +347,7 @@ $left-gutter: 64px; > .mx_DisambiguatedProfile_mxid { visibility: collapse; margin-left: 0; /* Override the inherited margin. */ - padding: 0 5px; /* TODO: Use a spacing variable */ + padding: 0 5px; } &:hover { @@ -537,7 +537,7 @@ $left-gutter: 64px; } .mx_RoomView_timeline_rr_enabled & { - $inline-end-margin: 80px; /* TODO: Use a spacing variable */ + $inline-end-margin: 80px; .mx_ThreadSummary, .mx_ThreadSummary_icon, diff --git a/res/css/views/rooms/_IRCLayout.pcss b/res/css/views/rooms/_IRCLayout.pcss index 07400f2f497..6f4b7c280c6 100644 --- a/res/css/views/rooms/_IRCLayout.pcss +++ b/res/css/views/rooms/_IRCLayout.pcss @@ -22,7 +22,7 @@ limitations under the License. --name-width: 80px; /* cf. ircDisplayNameWidth on Settings.tsx */ --icon-width: 14px; --line-height: var(--irc-line-height); - --right-padding: 5px; /* TODO: Use a spacing variable */ + --right-padding: 5px; line-height: var(--line-height) !important; diff --git a/res/css/views/settings/_FontScalingPanel.pcss b/res/css/views/settings/_FontScalingPanel.pcss index 06b248d7295..87d92e4b0a7 100644 --- a/res/css/views/settings/_FontScalingPanel.pcss +++ b/res/css/views/settings/_FontScalingPanel.pcss @@ -24,11 +24,11 @@ limitations under the License. display: flow-root; &.mx_IRCLayout { - padding-top: 9px; /* TODO: Use a spacing variable */ + padding-top: 9px; } .mx_EventTile[data-layout="bubble"] { - margin-top: 30px; /* TODO: Use a spacing variable */ + margin-top: 30px; } .mx_EventTile_msgOption { @@ -39,7 +39,7 @@ limitations under the License. .mx_FontScalingPanel_fontSlider { display: flex; align-items: center; - padding: 15px $spacing-20 35px; /* TODO: Use spacing variables */ + padding: 15px $spacing-20 35px; background: rgba($quinary-content, 0.2); border-radius: 10px; font-size: $font-10px; diff --git a/res/css/views/settings/_ProfileSettings.pcss b/res/css/views/settings/_ProfileSettings.pcss index 0b4c68120c1..94b03eeabf9 100644 --- a/res/css/views/settings/_ProfileSettings.pcss +++ b/res/css/views/settings/_ProfileSettings.pcss @@ -57,7 +57,7 @@ limitations under the License. > .mx_AccessibleButton_kind_link { font-size: $font-14px; - margin-inline-end: 10px; /* TODO: Use a spacing variable */ + margin-inline-end: 10px; } } } diff --git a/res/css/views/settings/tabs/_SettingsSection.pcss b/res/css/views/settings/tabs/_SettingsSection.pcss index 5f4fd6f0241..d3a35b7f47a 100644 --- a/res/css/views/settings/tabs/_SettingsSection.pcss +++ b/res/css/views/settings/tabs/_SettingsSection.pcss @@ -16,7 +16,7 @@ limitations under the License. .mx_SettingsSection { --SettingsTab_section-margin-bottom-preferences-labs: 30px; - --SettingsTab_heading_nth_child-margin-top: 30px; /* TODO: Use a spacing variable */ + --SettingsTab_heading_nth_child-margin-top: 30px; --SettingsTab_tooltip-max-width: 120px; /* So it fits in the space provided by the page */ color: $primary-content; diff --git a/res/css/views/settings/tabs/_SettingsTab.pcss b/res/css/views/settings/tabs/_SettingsTab.pcss index 064bd457d98..17779783d4b 100644 --- a/res/css/views/settings/tabs/_SettingsTab.pcss +++ b/res/css/views/settings/tabs/_SettingsTab.pcss @@ -50,9 +50,9 @@ limitations under the License. color: $secondary-content; font-size: $font-14px; display: block; - margin-top: 10px; /* TODO: Use a spacing variable */ + margin-top: 10px; margin-inline-end: 80px; /* Align with the rest of the view */ - margin-bottom: 10px; /* TODO: Use a spacing variable */ + margin-bottom: 10px; margin-inline-start: 0; } @@ -63,7 +63,7 @@ limitations under the License. .mx_SettingsFlag { margin-inline-end: $end-gutter; - margin-bottom: 10px; /* TODO: Use a spacing variable */ + margin-bottom: 10px; .mx_SettingsFlag_label { vertical-align: middle; From 2e68479577a3215d618dbc8f147c93b29372731a Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Tue, 6 Jun 2023 15:07:51 +0100 Subject: [PATCH 27/54] Add config to skip widget_build_url for DM rooms (#11044) * Add config to skip widget_build_url for DM rooms * Add tests --- src/IConfigOptions.ts | 1 + src/LegacyCallHandler.tsx | 2 +- src/utils/WellKnownUtils.ts | 1 + src/widgets/ManagedHybrid.ts | 20 +++++++++--- test/widgets/ManagedHybrid-test.ts | 51 ++++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 test/widgets/ManagedHybrid-test.ts diff --git a/src/IConfigOptions.ts b/src/IConfigOptions.ts index c6913d2eb25..1fa873ec87a 100644 --- a/src/IConfigOptions.ts +++ b/src/IConfigOptions.ts @@ -106,6 +106,7 @@ export interface IConfigOptions { }; widget_build_url?: string; // url called to replace jitsi/call widget creation + widget_build_url_ignore_dm?: boolean; audio_stream_url?: string; jitsi?: { preferred_domain: string; diff --git a/src/LegacyCallHandler.tsx b/src/LegacyCallHandler.tsx index a8b464df43b..08636e5011d 100644 --- a/src/LegacyCallHandler.tsx +++ b/src/LegacyCallHandler.tsx @@ -963,7 +963,7 @@ export default class LegacyCallHandler extends EventEmitter { } // We might be using managed hybrid widgets - if (isManagedHybridWidgetEnabled()) { + if (isManagedHybridWidgetEnabled(roomId)) { await addManagedHybridWidget(roomId); return; } diff --git a/src/utils/WellKnownUtils.ts b/src/utils/WellKnownUtils.ts index 369de6c6b01..a17f721c469 100644 --- a/src/utils/WellKnownUtils.ts +++ b/src/utils/WellKnownUtils.ts @@ -26,6 +26,7 @@ const EMBEDDED_PAGES_WK_PROPERTY = "io.element.embedded_pages"; /* eslint-disable camelcase */ export interface ICallBehaviourWellKnown { widget_build_url?: string; + ignore_dm?: boolean; } export interface IE2EEWellKnown { diff --git a/src/widgets/ManagedHybrid.ts b/src/widgets/ManagedHybrid.ts index c820fee668b..21c432aa3b6 100644 --- a/src/widgets/ManagedHybrid.ts +++ b/src/widgets/ManagedHybrid.ts @@ -24,6 +24,7 @@ import { IStoredLayout, WidgetLayoutStore } from "../stores/widgets/WidgetLayout import WidgetEchoStore from "../stores/WidgetEchoStore"; import WidgetStore from "../stores/WidgetStore"; import SdkConfig from "../SdkConfig"; +import DMRoomMap from "../utils/DMRoomMap"; /* eslint-disable camelcase */ interface IManagedHybridWidgetData { @@ -33,16 +34,25 @@ interface IManagedHybridWidgetData { } /* eslint-enable camelcase */ -function getWidgetBuildUrl(): string | undefined { +function getWidgetBuildUrl(roomId: string): string | undefined { + const isDm = !!DMRoomMap.shared().getUserIdForRoomId(roomId); if (SdkConfig.get().widget_build_url) { + if (isDm && SdkConfig.get().widget_build_url_ignore_dm) { + return undefined; + } return SdkConfig.get().widget_build_url; } + + const wellKnown = getCallBehaviourWellKnown(MatrixClientPeg.get()); + if (isDm && wellKnown?.ignore_dm) { + return undefined; + } /* eslint-disable-next-line camelcase */ - return getCallBehaviourWellKnown(MatrixClientPeg.get())?.widget_build_url; + return wellKnown?.widget_build_url; } -export function isManagedHybridWidgetEnabled(): boolean { - return !!getWidgetBuildUrl(); +export function isManagedHybridWidgetEnabled(roomId: string): boolean { + return !!getWidgetBuildUrl(roomId); } export async function addManagedHybridWidget(roomId: string): Promise { @@ -60,7 +70,7 @@ export async function addManagedHybridWidget(roomId: string): Promise { // Get widget data /* eslint-disable-next-line camelcase */ - const widgetBuildUrl = getWidgetBuildUrl(); + const widgetBuildUrl = getWidgetBuildUrl(roomId); if (!widgetBuildUrl) { return; } diff --git a/test/widgets/ManagedHybrid-test.ts b/test/widgets/ManagedHybrid-test.ts new file mode 100644 index 00000000000..b91db09dc19 --- /dev/null +++ b/test/widgets/ManagedHybrid-test.ts @@ -0,0 +1,51 @@ +/* +Copyright 2023 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { isManagedHybridWidgetEnabled } from "../../src/widgets/ManagedHybrid"; +import DMRoomMap from "../../src/utils/DMRoomMap"; +import { stubClient } from "../test-utils"; +import SdkConfig from "../../src/SdkConfig"; + +describe("isManagedHybridWidgetEnabled", () => { + let dmRoomMap: DMRoomMap; + + beforeEach(() => { + stubClient(); + dmRoomMap = { + getUserIdForRoomId: jest.fn().mockReturnValue("@user:server"), + } as unknown as DMRoomMap; + DMRoomMap.setShared(dmRoomMap); + }); + + it("should return false if widget_build_url is unset", () => { + expect(isManagedHybridWidgetEnabled("!room:server")).toBeFalsy(); + }); + + it("should return true for DMs when widget_build_url_ignore_dm is unset", () => { + SdkConfig.put({ + widget_build_url: "https://url", + }); + expect(isManagedHybridWidgetEnabled("!room:server")).toBeTruthy(); + }); + + it("should return false for DMs when widget_build_url_ignore_dm is true", () => { + SdkConfig.put({ + widget_build_url: "https://url", + widget_build_url_ignore_dm: true, + }); + expect(isManagedHybridWidgetEnabled("!room:server")).toBeFalsy(); + }); +}); From b2452a45fff734b5cd2eaa9ff7de75fcb5abdd19 Mon Sep 17 00:00:00 2001 From: Kerry Date: Thu, 8 Jun 2023 00:25:34 +1200 Subject: [PATCH 28/54] remove intentionalmentions client opt (#11048) --- src/MatrixClientPeg.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/MatrixClientPeg.ts b/src/MatrixClientPeg.ts index 2f965bb0b8e..979f679f467 100644 --- a/src/MatrixClientPeg.ts +++ b/src/MatrixClientPeg.ts @@ -273,8 +273,6 @@ class MatrixClientPegClass implements IMatrixClientPeg { SlidingSyncManager.instance.startSpidering(100, 50); // 100 rooms at a time, 50ms apart } - opts.intentionalMentions = SettingsStore.getValue("feature_intentional_mentions"); - // Connect the matrix client to the dispatcher and setting handlers MatrixActionCreators.start(this.matrixClient); MatrixClientBackedSettingsHandler.matrixClient = this.matrixClient; From 4c739032748d908046854ce44aafd21df506248c Mon Sep 17 00:00:00 2001 From: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> Date: Wed, 7 Jun 2023 14:05:23 +0100 Subject: [PATCH 29/54] Use `getShowSasCallbacks()` and `getReciprocateQrCodeCallbacks()` (#11015) * Use `getShowSasCallbacks()` and `getShowQrCodeCallbacks()` ... instead of type-casting * Update method names These methods got renamed in the js-sdk PR * Fix strict typing errors --- .../views/right_panel/VerificationPanel.tsx | 24 +++++++++---------- .../right_panel/VerificationPanel-test.tsx | 5 ++-- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/components/views/right_panel/VerificationPanel.tsx b/src/components/views/right_panel/VerificationPanel.tsx index 019d0affb96..582b95c2f4a 100644 --- a/src/components/views/right_panel/VerificationPanel.tsx +++ b/src/components/views/right_panel/VerificationPanel.tsx @@ -16,7 +16,7 @@ limitations under the License. import React from "react"; import { verificationMethods } from "matrix-js-sdk/src/crypto"; -import { ReciprocateQRCode, SCAN_QR_CODE_METHOD } from "matrix-js-sdk/src/crypto/verification/QRCode"; +import { SCAN_QR_CODE_METHOD } from "matrix-js-sdk/src/crypto/verification/QRCode"; import { Phase, VerificationRequest, @@ -24,7 +24,6 @@ import { } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; import { RoomMember } from "matrix-js-sdk/src/models/room-member"; import { User } from "matrix-js-sdk/src/models/user"; -import { SAS } from "matrix-js-sdk/src/crypto/verification/SAS"; import { logger } from "matrix-js-sdk/src/logger"; import { DeviceInfo } from "matrix-js-sdk/src/crypto/deviceinfo"; import { ShowQrCodeCallbacks, ShowSasCallbacks, VerifierEvent } from "matrix-js-sdk/src/crypto-api/verification"; @@ -49,10 +48,10 @@ interface IProps { } interface IState { - sasEvent?: ShowSasCallbacks; + sasEvent: ShowSasCallbacks | null; emojiButtonClicked?: boolean; reciprocateButtonClicked?: boolean; - reciprocateQREvent?: ShowQrCodeCallbacks; + reciprocateQREvent: ShowQrCodeCallbacks | null; } export default class VerificationPanel extends React.PureComponent { @@ -60,7 +59,7 @@ export default class VerificationPanel extends React.PureComponent { - const { request } = this.props; - const sasEvent = (request.verifier as SAS).sasEvent; - const reciprocateQREvent = (request.verifier as ReciprocateQRCode).reciprocateQREvent; - request.verifier?.off(VerifierEvent.ShowSas, this.updateVerifierState); - request.verifier?.off(VerifierEvent.ShowReciprocateQr, this.updateVerifierState); + // this method is only called once we know there is a verifier. + const verifier = this.props.request.verifier!; + const sasEvent = verifier.getShowSasCallbacks(); + const reciprocateQREvent = verifier.getReciprocateQrCodeCallbacks(); + verifier.off(VerifierEvent.ShowSas, this.updateVerifierState); + verifier.off(VerifierEvent.ShowReciprocateQr, this.updateVerifierState); this.setState({ sasEvent, reciprocateQREvent }); }; @@ -428,8 +428,8 @@ export default class VerificationPanel extends React.PureComponent", () => { // fire the ShowSas event const sasEvent = makeMockSasCallbacks(); - (mockVerifier as unknown as SAS).sasEvent = sasEvent; + mockVerifier.getShowSasCallbacks.mockReturnValue(sasEvent); act(() => { mockVerifier.emit(VerifierEvent.ShowSas, sasEvent); }); @@ -119,6 +118,8 @@ function makeMockVerifier(): Mocked { Object.assign(verifier, { cancel: jest.fn(), verify: jest.fn(), + getShowSasCallbacks: jest.fn(), + getReciprocateQrCodeCallbacks: jest.fn(), }); return verifier as unknown as Mocked; } From 1091e14a3ddfcee0a98c7594715aaadb77f7406d Mon Sep 17 00:00:00 2001 From: Michael Weimann Date: Wed, 7 Jun 2023 15:24:01 +0200 Subject: [PATCH 30/54] Migrate broadcast MSC3912 redaction (#11014) --- src/components/views/dialogs/ConfirmRedactDialog.tsx | 8 ++++---- .../components/views/dialogs/ConfirmRedactDialog-test.tsx | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/views/dialogs/ConfirmRedactDialog.tsx b/src/components/views/dialogs/ConfirmRedactDialog.tsx index cd6ca8119e6..f51b89131c8 100644 --- a/src/components/views/dialogs/ConfirmRedactDialog.tsx +++ b/src/components/views/dialogs/ConfirmRedactDialog.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import { Feature, ServerSupport } from "matrix-js-sdk/src/feature"; -import { MatrixEvent, RelationType } from "matrix-js-sdk/src/matrix"; +import { IRedactOpts, MatrixEvent, RelationType } from "matrix-js-sdk/src/matrix"; import React from "react"; import { _t } from "../../../languageHandler"; @@ -72,7 +72,7 @@ export function createRedactEventDialog({ if (!proceed) return; const cli = MatrixClientPeg.get(); - const withRelations: { with_relations?: RelationType[] } = {}; + const withRelTypes: Pick = {}; // redact related events if this is a voice broadcast started event and // server has support for relation based redactions @@ -82,7 +82,7 @@ export function createRedactEventDialog({ relationBasedRedactionsSupport && relationBasedRedactionsSupport !== ServerSupport.Unsupported ) { - withRelations.with_relations = [RelationType.Reference]; + withRelTypes.with_rel_types = [RelationType.Reference]; } } @@ -90,7 +90,7 @@ export function createRedactEventDialog({ onCloseDialog?.(); await cli.redactEvent(roomId, eventId, undefined, { ...(reason ? { reason } : {}), - ...withRelations, + ...withRelTypes, }); } catch (e: any) { const code = e.errcode || e.statusCode; diff --git a/test/components/views/dialogs/ConfirmRedactDialog-test.tsx b/test/components/views/dialogs/ConfirmRedactDialog-test.tsx index 33fc989966b..57e386cb17c 100644 --- a/test/components/views/dialogs/ConfirmRedactDialog-test.tsx +++ b/test/components/views/dialogs/ConfirmRedactDialog-test.tsx @@ -94,7 +94,7 @@ describe("ConfirmRedactDialog", () => { await confirmDeleteVoiceBroadcastStartedEvent(); }); - it("should call redact without `with_relations`", () => { + it("should call redact without `with_rel_types`", () => { expect(client.redactEvent).toHaveBeenCalledWith(roomId, mxEvent.getId(), undefined, {}); }); }); @@ -110,9 +110,9 @@ describe("ConfirmRedactDialog", () => { await confirmDeleteVoiceBroadcastStartedEvent(); }); - it("should call redact with `with_relations`", () => { + it("should call redact with `with_rel_types`", () => { expect(client.redactEvent).toHaveBeenCalledWith(roomId, mxEvent.getId(), undefined, { - with_relations: [RelationType.Reference], + with_rel_types: [RelationType.Reference], }); }); }); From ac2c9cef8db8bb30a2d0861151923a5caaa485c7 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 7 Jun 2023 09:29:39 -0400 Subject: [PATCH 31/54] Make group calls respect the ICE fallback setting (#11047) --- src/models/Call.ts | 2 ++ test/models/Call-test.ts | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/models/Call.ts b/src/models/Call.ts index e77612d6649..f4123f826a1 100644 --- a/src/models/Call.ts +++ b/src/models/Call.ts @@ -659,6 +659,8 @@ export class ElementCall extends Call { analyticsID, }); + if (SettingsStore.getValue("fallbackICEServerAllowed")) params.append("allowIceFallback", ""); + // Set custom fonts if (SettingsStore.getValue("useSystemFont")) { SettingsStore.getValue("systemFont") diff --git a/test/models/Call-test.ts b/test/models/Call-test.ts index 73c62f71375..007b2792a45 100644 --- a/test/models/Call-test.ts +++ b/test/models/Call-test.ts @@ -625,6 +625,36 @@ describe("ElementCall", () => { SettingsStore.getValue = originalGetValue; }); + it("passes ICE fallback preference through widget URL", async () => { + // Test with the preference set to false + await ElementCall.create(room); + const call1 = Call.get(room); + if (!(call1 instanceof ElementCall)) throw new Error("Failed to create call"); + + const urlParams1 = new URLSearchParams(new URL(call1.widget.url).hash.slice(1)); + expect(urlParams1.has("allowIceFallback")).toBe(false); + + // Now test with the preference set to true + const originalGetValue = SettingsStore.getValue; + SettingsStore.getValue = (name: string, roomId?: string, excludeDefault?: boolean) => { + switch (name) { + case "fallbackICEServerAllowed": + return true as T; + default: + return originalGetValue(name, roomId, excludeDefault); + } + }; + + await ElementCall.create(room); + const call2 = Call.get(room); + if (!(call2 instanceof ElementCall)) throw new Error("Failed to create call"); + + const urlParams2 = new URLSearchParams(new URL(call2.widget.url).hash.slice(1)); + expect(urlParams2.has("allowIceFallback")).toBe(true); + + SettingsStore.getValue = originalGetValue; + }); + it("passes analyticsID through widget URL", async () => { client.getAccountData.mockImplementation((eventType: string) => { if (eventType === PosthogAnalytics.ANALYTICS_EVENT_TYPE) { From 34439ee652e6d01ecf0ab93fe859671b0542123c Mon Sep 17 00:00:00 2001 From: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> Date: Wed, 7 Jun 2023 15:43:44 +0100 Subject: [PATCH 32/54] Simplify references to `VerificationRequest` (#11045) * Use new `VerificationRequest.getQRCodeBytes()` * Use new `VerificationRequest.otherDeviceId` * Remove references to `VerificationRequest.channel` * Replace references to `VerificationRequest.{requesting,receiving}UserId` Normally these are guarded by `request.initiatedByMe` so we can trivially replace it with `request.otherUserId` or `client.getUserId()`. In one place we actually need to apply some logic. * increase test coverage * Even more test coverage * Even more test coverage --- src/components/structures/MatrixChat.tsx | 2 +- .../elements/crypto/VerificationQRCode.tsx | 5 +- .../messages/MKeyVerificationRequest.tsx | 8 +- .../views/right_panel/EncryptionPanel.tsx | 2 +- .../views/right_panel/VerificationPanel.tsx | 15 +-- .../views/toasts/VerificationRequestToast.tsx | 12 +-- .../crypto/VerificationQRCode-test.tsx | 33 +++++++ .../VerificationQRCode-test.tsx.snap | 15 +++ .../messages/MKeyVerificationRequest-test.tsx | 25 ++++- .../right_panel/VerificationPanel-test.tsx | 65 +++++++++++-- .../toasts/VerificationRequestToast-test.tsx | 93 +++++++++++++++++++ .../VerificationRequestToast-test.tsx.snap | 68 ++++++++++++++ 12 files changed, 310 insertions(+), 33 deletions(-) create mode 100644 test/components/views/elements/crypto/VerificationQRCode-test.tsx create mode 100644 test/components/views/elements/crypto/__snapshots__/VerificationQRCode-test.tsx.snap create mode 100644 test/components/views/toasts/VerificationRequestToast-test.tsx create mode 100644 test/components/views/toasts/__snapshots__/VerificationRequestToast-test.tsx.snap diff --git a/src/components/structures/MatrixChat.tsx b/src/components/structures/MatrixChat.tsx index fef5d26dafc..6a03bc7aed3 100644 --- a/src/components/structures/MatrixChat.tsx +++ b/src/components/structures/MatrixChat.tsx @@ -1667,7 +1667,7 @@ export default class MatrixChat extends React.PureComponent { ); } else if (request.pending) { ToastStore.sharedInstance().addOrReplaceToast({ - key: "verifreq_" + request.channel.transactionId, + key: "verifreq_" + request.transactionId, title: _t("Verification requested"), icon: "verification", props: { request }, diff --git a/src/components/views/elements/crypto/VerificationQRCode.tsx b/src/components/views/elements/crypto/VerificationQRCode.tsx index f19b9613a2f..193134cd93d 100644 --- a/src/components/views/elements/crypto/VerificationQRCode.tsx +++ b/src/components/views/elements/crypto/VerificationQRCode.tsx @@ -15,19 +15,18 @@ limitations under the License. */ import React from "react"; -import { QRCodeData } from "matrix-js-sdk/src/crypto/verification/QRCode"; import QRCode from "../QRCode"; interface IProps { - qrCodeData: QRCodeData; + qrCodeBytes: Buffer; } export default class VerificationQRCode extends React.PureComponent { public render(): React.ReactNode { return ( diff --git a/src/components/views/messages/MKeyVerificationRequest.tsx b/src/components/views/messages/MKeyVerificationRequest.tsx index 73afa2869b7..60fc2963c96 100644 --- a/src/components/views/messages/MKeyVerificationRequest.tsx +++ b/src/components/views/messages/MKeyVerificationRequest.tsx @@ -148,7 +148,7 @@ export default class MKeyVerificationRequest extends React.Component { if (accepted) { stateLabel = ( - {this.acceptedLabel(request.receivingUserId)} + {this.acceptedLabel(request.initiatedByMe ? request.otherUserId : client.getSafeUserId())} ); } else if (request.phase === VerificationPhase.Cancelled) { @@ -162,9 +162,9 @@ export default class MKeyVerificationRequest extends React.Component { } if (!request.initiatedByMe) { - const name = getNameForEventRoom(client, request.requestingUserId, mxEvent.getRoomId()!); + const name = getNameForEventRoom(client, request.otherUserId, mxEvent.getRoomId()!); title = _t("%(name)s wants to verify", { name }); - subtitle = userLabelForEventRoom(client, request.requestingUserId, mxEvent.getRoomId()!); + subtitle = userLabelForEventRoom(client, request.otherUserId, mxEvent.getRoomId()!); if (request.canAccept) { stateNode = (
@@ -180,7 +180,7 @@ export default class MKeyVerificationRequest extends React.Component { } else { // request sent by us title = _t("You sent a verification request"); - subtitle = userLabelForEventRoom(client, request.receivingUserId, mxEvent.getRoomId()!); + subtitle = userLabelForEventRoom(client, request.otherUserId, mxEvent.getRoomId()!); } if (title) { diff --git a/src/components/views/right_panel/EncryptionPanel.tsx b/src/components/views/right_panel/EncryptionPanel.tsx index 73c2ba02bd5..6ba9eb9e2c7 100644 --- a/src/components/views/right_panel/EncryptionPanel.tsx +++ b/src/components/views/right_panel/EncryptionPanel.tsx @@ -165,7 +165,7 @@ const EncryptionPanel: React.FC = (props: IProps) => { onClose={onClose} member={member} request={request} - key={request.channel.transactionId} + key={request.transactionId} inDialog={layout === "dialog"} phase={phase} /> diff --git a/src/components/views/right_panel/VerificationPanel.tsx b/src/components/views/right_panel/VerificationPanel.tsx index 582b95c2f4a..d594f7c75cd 100644 --- a/src/components/views/right_panel/VerificationPanel.tsx +++ b/src/components/views/right_panel/VerificationPanel.tsx @@ -67,6 +67,7 @@ export default class VerificationPanel extends React.PureComponent

{_t("Scan this unique code")}

- +
); } @@ -133,7 +134,7 @@ export default class VerificationPanel extends React.PureComponent

{_t("Verify by scanning")}

@@ -144,7 +145,7 @@ export default class VerificationPanel extends React.PureComponent
- +
); @@ -201,7 +202,7 @@ export default class VerificationPanel extends React.PureComponent({ action: Action.ViewRoom, - room_id: request.channel.roomId, + room_id: request.roomId, should_peek: false, metricsTrigger: "VerificationRequest", }); @@ -128,7 +128,7 @@ export default class VerificationRequestToast extends React.PureComponent", () => { + afterEach(() => { + cleanup(); + }); + + it("renders a QR code", async () => { + const { container, getAllByAltText } = render(); + // wait for the spinner to go away + await waitFor(() => getAllByAltText("QR Code").length === 1); + expect(container).toMatchSnapshot(); + }); +}); diff --git a/test/components/views/elements/crypto/__snapshots__/VerificationQRCode-test.tsx.snap b/test/components/views/elements/crypto/__snapshots__/VerificationQRCode-test.tsx.snap new file mode 100644 index 00000000000..73f8203f1de --- /dev/null +++ b/test/components/views/elements/crypto/__snapshots__/VerificationQRCode-test.tsx.snap @@ -0,0 +1,15 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` renders a QR code 1`] = ` +
+
+ QR Code +
+
+`; diff --git a/test/components/views/messages/MKeyVerificationRequest-test.tsx b/test/components/views/messages/MKeyVerificationRequest-test.tsx index e3d0d196449..2fcfc1b5952 100644 --- a/test/components/views/messages/MKeyVerificationRequest-test.tsx +++ b/test/components/views/messages/MKeyVerificationRequest-test.tsx @@ -15,7 +15,7 @@ limitations under the License. */ import React from "react"; -import { render } from "@testing-library/react"; +import { render, within } from "@testing-library/react"; import { EventEmitter } from "events"; import { MatrixEvent } from "matrix-js-sdk/src/matrix"; import { @@ -74,6 +74,29 @@ describe("MKeyVerificationRequest", () => { expect(container).toHaveTextContent("You sent a verification request"); }); + it("should render appropriately when the request was initiated by me and has been accepted", () => { + const event = new MatrixEvent({ type: "m.key.verification.request" }); + event.verificationRequest = getMockVerificationRequest({ + phase: VerificationPhase.Ready, + otherUserId: "@other:user", + }); + const { container } = render(); + expect(container).toHaveTextContent("You sent a verification request"); + expect(within(container).getByRole("button")).toHaveTextContent("@other:user accepted"); + }); + + it("should render appropriately when the request was initiated by the other user and has been accepted", () => { + const event = new MatrixEvent({ type: "m.key.verification.request" }); + event.verificationRequest = getMockVerificationRequest({ + phase: VerificationPhase.Ready, + initiatedByMe: false, + otherUserId: "@other:user", + }); + const { container } = render(); + expect(container).toHaveTextContent("@other:user wants to verify"); + expect(within(container).getByRole("button")).toHaveTextContent("You accepted"); + }); + it("should render appropriately when the request was cancelled", () => { const event = new MatrixEvent({ type: "m.key.verification.request" }); event.verificationRequest = getMockVerificationRequest({ diff --git a/test/components/views/right_panel/VerificationPanel-test.tsx b/test/components/views/right_panel/VerificationPanel-test.tsx index 9c8282b0de7..7fdab5248fe 100644 --- a/test/components/views/right_panel/VerificationPanel-test.tsx +++ b/test/components/views/right_panel/VerificationPanel-test.tsx @@ -14,8 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { act, render } from "@testing-library/react"; -import React from "react"; +import { act, render, waitFor } from "@testing-library/react"; +import React, { ComponentProps } from "react"; import { Phase, VerificationRequest, @@ -31,7 +31,6 @@ import { VerifierEvent, VerifierEventHandlerMap, } from "matrix-js-sdk/src/crypto-api/verification"; -import { IVerificationChannel } from "matrix-js-sdk/src/crypto/verification/request/Channel"; import VerificationPanel from "../../../../src/components/views/right_panel/VerificationPanel"; import { stubClient } from "../../../test-utils"; @@ -41,12 +40,57 @@ describe("", () => { stubClient(); }); - it("should show a 'Verify by emoji' button", () => { - const container = renderComponent({ - request: makeMockVerificationRequest(), - phase: Phase.Ready, + describe("'Ready' phase (dialog mode)", () => { + it("should show a 'Start' button", () => { + const container = renderComponent({ + request: makeMockVerificationRequest({ + phase: Phase.Ready, + }), + layout: "dialog", + }); + container.getByRole("button", { name: "Start" }); + }); + + it("should show a QR code if the other side can scan and QR bytes are calculated", async () => { + const request = makeMockVerificationRequest({ + phase: Phase.Ready, + }); + request.getQRCodeBytes.mockReturnValue(Buffer.from("test", "utf-8")); + const container = renderComponent({ + request: request, + layout: "dialog", + }); + container.getByText("Scan this unique code"); + // it shows a spinner at first; wait for the update which makes it show the QR code + await waitFor(() => { + container.getByAltText("QR Code"); + }); + }); + }); + + describe("'Ready' phase (regular mode)", () => { + it("should show a 'Verify by emoji' button", () => { + const container = renderComponent({ + request: makeMockVerificationRequest({ phase: Phase.Ready }), + }); + container.getByRole("button", { name: "Verify by emoji" }); + }); + + it("should show a QR code if the other side can scan and QR bytes are calculated", async () => { + const request = makeMockVerificationRequest({ + phase: Phase.Ready, + }); + request.getQRCodeBytes.mockReturnValue(Buffer.from("test", "utf-8")); + const container = renderComponent({ + request: request, + member: new User("@other:user"), + }); + container.getByText("Ask @other:user to scan your code:"); + // it shows a spinner at first; wait for the update which makes it show the QR code + await waitFor(() => { + container.getByAltText("QR Code"); + }); }); - container.getByRole("button", { name: "Verify by emoji" }); }); describe("'Verify by emoji' flow", () => { @@ -91,13 +135,14 @@ describe("", () => { }); }); -function renderComponent(props: { request: VerificationRequest; phase: Phase }) { +function renderComponent(props: Partial> & { request: VerificationRequest }) { const defaultProps = { layout: "", member: {} as User, onClose: () => undefined, isRoomEncrypted: false, inDialog: false, + phase: props.request.phase, }; return render(); } @@ -105,9 +150,9 @@ function renderComponent(props: { request: VerificationRequest; phase: Phase }) function makeMockVerificationRequest(props: Partial = {}): Mocked { const request = new TypedEventEmitter(); Object.assign(request, { - channel: {} as IVerificationChannel, cancel: jest.fn(), otherPartySupportsMethod: jest.fn().mockReturnValue(true), + getQRCodeBytes: jest.fn(), ...props, }); return request as unknown as Mocked; diff --git a/test/components/views/toasts/VerificationRequestToast-test.tsx b/test/components/views/toasts/VerificationRequestToast-test.tsx new file mode 100644 index 00000000000..6a73f445e92 --- /dev/null +++ b/test/components/views/toasts/VerificationRequestToast-test.tsx @@ -0,0 +1,93 @@ +/* +Copyright 2023 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React, { ComponentProps } from "react"; +import { Mocked } from "jest-mock"; +import { act, render, RenderResult } from "@testing-library/react"; +import { + VerificationRequest, + VerificationRequestEvent, +} from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; +import { DeviceInfo } from "matrix-js-sdk/src/crypto/deviceinfo"; +import { IMyDevice, MatrixClient } from "matrix-js-sdk/src/client"; +import { TypedEventEmitter } from "matrix-js-sdk/src/models/typed-event-emitter"; + +import VerificationRequestToast from "../../../../src/components/views/toasts/VerificationRequestToast"; +import { flushPromises, getMockClientWithEventEmitter, mockClientMethodsUser } from "../../../test-utils"; + +function renderComponent( + props: Partial> & { request: VerificationRequest }, +): RenderResult { + const propsWithDefaults = { + toastKey: "test", + ...props, + }; + + return render(); +} + +describe("VerificationRequestToast", () => { + let client: Mocked; + + beforeEach(() => { + client = getMockClientWithEventEmitter({ + ...mockClientMethodsUser(), + getStoredDevice: jest.fn(), + getDevice: jest.fn(), + }); + }); + + it("should render a self-verification", async () => { + const otherDeviceId = "other_device"; + const otherIDevice: IMyDevice = { device_id: otherDeviceId, last_seen_ip: "1.1.1.1" }; + client.getDevice.mockResolvedValue(otherIDevice); + + const otherDeviceInfo = new DeviceInfo(otherDeviceId); + otherDeviceInfo.unsigned = { device_display_name: "my other device" }; + client.getStoredDevice.mockReturnValue(otherDeviceInfo); + + const request = makeMockVerificationRequest({ + isSelfVerification: true, + otherDeviceId, + }); + const result = renderComponent({ request }); + await act(async () => { + await flushPromises(); + }); + expect(result.container).toMatchSnapshot(); + }); + + it("should render a cross-user verification", async () => { + const otherUserId = "@other:user"; + const request = makeMockVerificationRequest({ + isSelfVerification: false, + otherUserId, + }); + const result = renderComponent({ request }); + await act(async () => { + await flushPromises(); + }); + expect(result.container).toMatchSnapshot(); + }); +}); + +function makeMockVerificationRequest(props: Partial = {}): Mocked { + const request = new TypedEventEmitter(); + Object.assign(request, { + ...props, + }); + return request as unknown as Mocked; +} diff --git a/test/components/views/toasts/__snapshots__/VerificationRequestToast-test.tsx.snap b/test/components/views/toasts/__snapshots__/VerificationRequestToast-test.tsx.snap new file mode 100644 index 00000000000..e34f816de17 --- /dev/null +++ b/test/components/views/toasts/__snapshots__/VerificationRequestToast-test.tsx.snap @@ -0,0 +1,68 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`VerificationRequestToast should render a cross-user verification 1`] = ` +
+
+
+ @alice:domain (@other:user) +
+
+
+ Ignore (NaN) +
+
+ Verify Session +
+
+
+
+`; + +exports[`VerificationRequestToast should render a self-verification 1`] = ` +
+
+
+ my other device +
+ other_device from 1.1.1.1 +
+
+
+
+ Ignore (NaN) +
+
+ Verify Session +
+
+
+
+`; From 700786ad861217e02529223a49d84aca02465e42 Mon Sep 17 00:00:00 2001 From: Kerry Date: Thu, 8 Jun 2023 09:32:09 +1200 Subject: [PATCH 33/54] OIDC: add config flag (#11007) * add settings flag for native oidc flow * i18n --- src/i18n/strings/en_EN.json | 1 + src/settings/Settings.tsx | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index d3180f3dfcc..84ca822e85d 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -988,6 +988,7 @@ "Favourite Messages": "Favourite Messages", "Under active development.": "Under active development.", "Force 15s voice broadcast chunk length": "Force 15s voice broadcast chunk length", + "Enable new native OIDC flows (Under active development)": "Enable new native OIDC flows (Under active development)", "Rust cryptography implementation": "Rust cryptography implementation", "Font size": "Font size", "Use custom size": "Use custom size", diff --git a/src/settings/Settings.tsx b/src/settings/Settings.tsx index 74afc869264..6f24491c57c 100644 --- a/src/settings/Settings.tsx +++ b/src/settings/Settings.tsx @@ -93,6 +93,7 @@ export enum LabGroup { export enum Features { VoiceBroadcast = "feature_voice_broadcast", VoiceBroadcastForceSmallChunks = "feature_voice_broadcast_force_small_chunks", + OidcNativeFlow = "feature_oidc_native_flow", } export const labGroupNames: Record = { @@ -445,6 +446,11 @@ export const SETTINGS: { [setting: string]: ISetting } = { displayName: _td("Force 15s voice broadcast chunk length"), default: false, }, + [Features.OidcNativeFlow]: { + supportedLevels: LEVELS_FEATURE, + displayName: _td("Enable new native OIDC flows (Under active development)"), + default: false, + }, "feature_rust_crypto": { // use the rust matrix-sdk-crypto-js for crypto. isFeature: true, From b15b74c6895e8a619f4689cac911a8abaf7e2112 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 8 Jun 2023 08:41:15 +0100 Subject: [PATCH 34/54] Update all non-major dependencies (#11032) * Update all non-major dependencies * Hold back typescript --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> --- package.json | 4 +- yarn.lock | 680 +++++++++++++++++++++++++++------------------------ 2 files changed, 356 insertions(+), 328 deletions(-) diff --git a/package.json b/package.json index 51228a04a19..30dba62b743 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "opus-recorder": "^8.0.3", "pako": "^2.0.3", "png-chunks-extract": "^1.0.0", - "posthog-js": "1.57.2", + "posthog-js": "1.63.3", "proposal-temporal": "^0.9.0", "qrcode": "1.5.3", "re-resizable": "^6.9.0", @@ -182,7 +182,7 @@ "cypress-axe": "^1.0.0", "cypress-multi-reporters": "^1.6.1", "cypress-real-events": "^1.7.1", - "eslint": "8.40.0", + "eslint": "8.42.0", "eslint-config-google": "^0.14.0", "eslint-config-prettier": "^8.5.0", "eslint-plugin-deprecate": "^0.7.0", diff --git a/yarn.lock b/yarn.lock index 44a69a1927e..80345b92458 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1144,20 +1144,20 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@csstools/css-parser-algorithms@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.1.1.tgz#7b62e6412a468a2d1096ed267edd1e4a7fd4a119" - integrity sha512-viRnRh02AgO4mwIQb2xQNJju0i+Fh9roNgmbR5xEuG7J3TGgxjnE95HnBLgsFJOJOksvcfxOUCgODcft6Y07cA== +"@csstools/css-parser-algorithms@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.2.0.tgz#1268b07196d1118296443aeff41bca27d94b0981" + integrity sha512-9BoQ/jSrPq4vv3b9jjLW+PNNv56KlDH5JMx5yASSNrCtvq70FCNZUjXRvbCeR9hYj9ZyhURtqpU/RFIgg6kiOw== "@csstools/css-tokenizer@^2.1.1": version "2.1.1" resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.1.1.tgz#07ae11a0a06365d7ec686549db7b729bc036528e" integrity sha512-GbrTj2Z8MCTUv+52GE0RbFGM527xuXZ0Xa5g0Z+YN573uveS4G0qi6WNOMyz3yrFM/jaILTTwJ0+umx81EzqfA== -"@csstools/media-query-list-parser@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.0.4.tgz#466bd254041530dfd1e88bcb1921e8ca4af75b6a" - integrity sha512-GyYot6jHgcSDZZ+tLSnrzkR7aJhF2ZW6d+CXH66mjy5WpAQhZD4HDke2OQ36SivGRWlZJpAz7TzbW6OKlEpxAA== +"@csstools/media-query-list-parser@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.0.tgz#6e1a5e12e0d103cd13b94bddb88b878bd6866103" + integrity sha512-MXkR+TeaS2q9IkpyO6jVCdtA/bfpABJxIrfkLswThFN8EZZgI2RfAHhm6sDNDuYV25d5+b8Lj1fpTccIcSLPsQ== "@csstools/selector-specificity@^2.2.0": version "2.2.0" @@ -1223,15 +1223,15 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.40.0.tgz#3ba73359e11f5a7bd3e407f70b3528abfae69cec" - integrity sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA== +"@eslint/js@8.42.0": + version "8.42.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.42.0.tgz#484a1d638de2911e6f5a30c12f49c7e4a3270fb6" + integrity sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw== -"@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -1247,6 +1247,18 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -1581,15 +1593,15 @@ resolved "https://registry.yarnpkg.com/@matrix-org/analytics-events/-/analytics-events-0.5.0.tgz#38b69c4e29d243944c5712cca7b674a3432056e6" integrity sha512-uL5kf7MqC+GxsGJtimPVbFliyaFinohTHSzohz31JTysktHsjRR2SC+vV7sy2/dstTWVdG9EGOnohyPsB+oi3A== -"@matrix-org/matrix-sdk-crypto-js@^0.1.0-alpha.9": - version "0.1.0-alpha.9" - resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-js/-/matrix-sdk-crypto-js-0.1.0-alpha.9.tgz#00bc266781502641a661858a5a521dd4d95275fc" - integrity sha512-g5cjpFwA9h0CbEGoAqNVI2QcyDsbI8FHoLo9+OXWHIezEKITsSv78mc5ilIwN+2YpmVlH0KNeQWTHw4vi0BMnw== +"@matrix-org/matrix-sdk-crypto-js@^0.1.0-alpha.8": + version "0.1.0-alpha.8" + resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-js/-/matrix-sdk-crypto-js-0.1.0-alpha.8.tgz#18dd8e7fb56602d2999d8a502b49e902a2bb3782" + integrity sha512-hdmbbGXKrN6JNo3wdBaR5Zs3lXlzllT3U43ViNTlabB3nKkOZQnEAN/Isv+4EQSgz1+8897veI9Q8sqlQX22oA== "@matrix-org/matrix-wysiwyg@^2.0.0": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@matrix-org/matrix-wysiwyg/-/matrix-wysiwyg-2.1.0.tgz#5f6ead1fae8a4a02c2f5679657cf2c4f9a419654" - integrity sha512-h70Afa5xcpkVtDoFfbG8/dwThRBTA0Kw3QVB19jQoGJRAAoJCcDyVeM+p/D0npbjKfB8kMeWk7uGEITSfbZnhQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/@matrix-org/matrix-wysiwyg/-/matrix-wysiwyg-2.2.1.tgz#076b409c0ffe655938d663863b1ee546a7101da6" + integrity sha512-QF4dJsyqBMxZx+GhSdSiRSDIuwE5dxd7vffQ5i6hf67bd0EbVvtf4PzWmNopGHA+ckjMJIc5X1EPT+6DG/wM6Q== "@matrix-org/olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz": version "3.2.14" @@ -1763,105 +1775,105 @@ tslib "^2.5.0" webcrypto-core "^1.7.7" -"@percy/cli-app@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@percy/cli-app/-/cli-app-1.25.0.tgz#ac4a6c671a7d65279b881a2fd659acd9fc8b7222" - integrity sha512-49fRI8Vmf6OhHxwxrbTznsmJv6WY481tedILJIpb1zJSaVtNA7JHCreqdRlBzG7UusTD2iNJZ1t99F1yxx5x+Q== +"@percy/cli-app@1.24.1": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@percy/cli-app/-/cli-app-1.24.1.tgz#f4296597631f135ec77c3b0d5eab297018461cf2" + integrity sha512-LFgPfVFY487U43D/TkGyF4My6Urym/jQcYYmglzTUFLITan/a9ICiVyyK/CL1dS74CUjWbtFPAfs4glez3qewA== dependencies: - "@percy/cli-command" "1.25.0" - "@percy/cli-exec" "1.25.0" + "@percy/cli-command" "1.24.1" + "@percy/cli-exec" "1.24.1" -"@percy/cli-build@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@percy/cli-build/-/cli-build-1.25.0.tgz#a67a2e734dd8df39917e2f40a976994a0f0aae87" - integrity sha512-6ewm7AxcH4Kvcb8k8wD5BHNJE//Rx0MupOZUFo7AtebIyWtEeZB7aGWEyIzcLcHsuRad5LtQBHI/ZeZyAOsnew== +"@percy/cli-build@1.24.1": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@percy/cli-build/-/cli-build-1.24.1.tgz#e659ad2b86e1a7c6df2de803d466f1f2c5c9c645" + integrity sha512-iayHaZOdo5eOkjRHkSeplKqxrElZ/FDOtQSj/u5gU9UHqivgeE/kD0i66yWjuc0WR0B2F8PKbLXsJyv8z82xKg== dependencies: - "@percy/cli-command" "1.25.0" + "@percy/cli-command" "1.24.1" -"@percy/cli-command@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@percy/cli-command/-/cli-command-1.25.0.tgz#afc5ff5936ce81964d65f21d9f00d69a07af4fe7" - integrity sha512-EKkQ3uzrTnq/kRBB1/K+Nvd+JXoAH3WXXQLKMFamfUOkeuT43srXlufXMKQw/+rOpO+QJnQOAfn1yj/4HFOBAA== +"@percy/cli-command@1.24.1": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@percy/cli-command/-/cli-command-1.24.1.tgz#aef22506c3f23e62f2822c185295bb3adbeeb1da" + integrity sha512-R6DAwLYH7o2cSckm3Nn0hIKvyygk5hMMlHenegbGF4Lu7f7p5K1Gtk0feZXw3DitpxEW4UKincr4KDofjRc2cg== dependencies: - "@percy/config" "1.25.0" - "@percy/core" "1.25.0" - "@percy/logger" "1.25.0" + "@percy/config" "1.24.1" + "@percy/core" "1.24.1" + "@percy/logger" "1.24.1" -"@percy/cli-config@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@percy/cli-config/-/cli-config-1.25.0.tgz#678ffcdcc59ee92d2fccadae991743e947a9e059" - integrity sha512-sXGliQdeKgPQL++zusfe6mobmLT69cVLccLfqD5VUHC4HqaaEXdiCJIzzKnxHBLaZFk5JRd4++CU+Vy9ACtRSw== +"@percy/cli-config@1.24.1": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@percy/cli-config/-/cli-config-1.24.1.tgz#5c9e16cdd6c30eb1527fce8821a6876fc9be9f11" + integrity sha512-8jNxTCRSxKqg1/1vrDw5Xp+5z2G43LNlSDJPM0Eymb5dH6g9yeqxyqkqgxiv1KH5AaQMVJ3Lfcqlzyy5NCI4RQ== dependencies: - "@percy/cli-command" "1.25.0" + "@percy/cli-command" "1.24.1" -"@percy/cli-exec@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@percy/cli-exec/-/cli-exec-1.25.0.tgz#46872e8de422b4415b420d76ab77ff9376bd3411" - integrity sha512-httlYtYJ3bD+9VihEZL8CQzJ9ykR1THPfN9Ww6WGqBG2IGCe8Ln/6hZ/ivSK7IgW8OoRb6V/3qApGYpVD8dS8Q== +"@percy/cli-exec@1.24.1": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@percy/cli-exec/-/cli-exec-1.24.1.tgz#22432f7ccb1978fd03692266cd7688740484b634" + integrity sha512-3mF0YwVsxrbECBXt2zc54L7AU6W+MSF2zgJtyZaBvyvN57pznvH6ZJGr2ZR4Ck7PiYgF1zZ3N31GlbWmutKCzQ== dependencies: - "@percy/cli-command" "1.25.0" + "@percy/cli-command" "1.24.1" cross-spawn "^7.0.3" which "^2.0.2" -"@percy/cli-snapshot@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@percy/cli-snapshot/-/cli-snapshot-1.25.0.tgz#cd6c6965cd1286c3c46716b4eac078eeb56d9e4e" - integrity sha512-JtaW7SVWOr13iuE9E5ZsTAmXDC0oSYV75EvhF3zh8sXUa2Q/bjbhLI52kewThmkqOETREWrKc2uVkYEqWSQYXA== +"@percy/cli-snapshot@1.24.1": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@percy/cli-snapshot/-/cli-snapshot-1.24.1.tgz#ec9bcc746fedef1ac383903dc7f8a7f2fa0b73a2" + integrity sha512-/CzwvPRzMvQj/MiLY8QSrQE27VJvEc0EaG4qaY9iMXgarXa7+jqWzZuqoFYEIks36K7MyBqt5PGyh/g27XN3Fg== dependencies: - "@percy/cli-command" "1.25.0" + "@percy/cli-command" "1.24.1" yaml "^2.0.0" -"@percy/cli-upload@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@percy/cli-upload/-/cli-upload-1.25.0.tgz#1c9a4c634401c558a7eee2c611a9fdf75b87fc6d" - integrity sha512-ZhSHkCKWvUMqkWIIL2WedVbkTs17alYlGnt2QPHHDbxdqcV4dAgv/O08JVHmI2pf5fTCGe8hD2XHT508R4novg== +"@percy/cli-upload@1.24.1": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@percy/cli-upload/-/cli-upload-1.24.1.tgz#13759b77ed48e0dc0573e580bb49652d946e529b" + integrity sha512-P1ypjUAge01HdsRqrkmIeYsEKqQLQZ5xskKMBGc7mjRSPSYMuGLyHSc0p0nGpclCFp59pDzKfvCGnNJ/ZbEiAQ== dependencies: - "@percy/cli-command" "1.25.0" + "@percy/cli-command" "1.24.1" fast-glob "^3.2.11" image-size "^1.0.0" "@percy/cli@^1.11.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@percy/cli/-/cli-1.25.0.tgz#c665d312e025916a7c67b445fe0ca85b6d5f7930" - integrity sha512-j8+NgscX4723zJupPLkKcFu36srdv10xPrqYxU2W2IbaAKhTLUO9o4vMVr+4Z0bfjzYKnZuH4H+36xV+bdoSCA== - dependencies: - "@percy/cli-app" "1.25.0" - "@percy/cli-build" "1.25.0" - "@percy/cli-command" "1.25.0" - "@percy/cli-config" "1.25.0" - "@percy/cli-exec" "1.25.0" - "@percy/cli-snapshot" "1.25.0" - "@percy/cli-upload" "1.25.0" - "@percy/client" "1.25.0" - "@percy/logger" "1.25.0" - -"@percy/client@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@percy/client/-/client-1.25.0.tgz#5c50bfdb8086e7d42a06359854b484a10ed257eb" - integrity sha512-5xWnUkUyosaNhZnpatYidzbugsCY3V9RK8o+ISw5+LZ71Tl9bS/YtbUmwqR2n03dTJmvuDOxtcDbrFubW+mqfQ== - dependencies: - "@percy/env" "1.25.0" - "@percy/logger" "1.25.0" - -"@percy/config@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@percy/config/-/config-1.25.0.tgz#bfaf968a342f906e6e4db794f98a16c612cd9107" - integrity sha512-Ryfz29Q5j3QlibxlTXOfJPmykk5Fli7fIle09GeM57cWu03Q8IjMCXi2fP5++8XCBZoKXh/cHNKMK8B7AyD/Hw== - dependencies: - "@percy/logger" "1.25.0" + version "1.24.1" + resolved "https://registry.yarnpkg.com/@percy/cli/-/cli-1.24.1.tgz#d4b50b91478f447f84f9e0eee87bdc7ee593ce07" + integrity sha512-sbQUcUW0uz/JDQDcH/UpTAPIt/wx8G855tVufdS6kazWaLMpcFfbXNxh/xuTr4wUgdB0ERLp4P91oCQqNYXR9g== + dependencies: + "@percy/cli-app" "1.24.1" + "@percy/cli-build" "1.24.1" + "@percy/cli-command" "1.24.1" + "@percy/cli-config" "1.24.1" + "@percy/cli-exec" "1.24.1" + "@percy/cli-snapshot" "1.24.1" + "@percy/cli-upload" "1.24.1" + "@percy/client" "1.24.1" + "@percy/logger" "1.24.1" + +"@percy/client@1.24.1": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@percy/client/-/client-1.24.1.tgz#61037142ab44426ac3ec7c9f315294255cf5330c" + integrity sha512-KFxF6JMQKQHmx5cGsAUNDNpIXIwflkAJQb/L+mwbODvT09wkYBNUjw9O5Lde6xKY7tDqOUrbdO81XfvZl6JgRA== + dependencies: + "@percy/env" "1.24.1" + "@percy/logger" "1.24.1" + +"@percy/config@1.24.1": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@percy/config/-/config-1.24.1.tgz#842412d9a38a6a2aeee43cb5b09b6c228010af2e" + integrity sha512-SDM59al8dDE05Ivs87khxsPB0S/rIfoLdTWMlM81GKHf5hklmKKB/I2afzUmjIaG564cguIXNtevKOhmbZ7iPQ== + dependencies: + "@percy/logger" "1.24.1" ajv "^8.6.2" cosmiconfig "^8.0.0" yaml "^2.0.0" -"@percy/core@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@percy/core/-/core-1.25.0.tgz#bf01129d3c461f7d6f705aa5e4b6de5cf6d5e4c9" - integrity sha512-FxM44alygp19wI7/Fby2Eo4LN0BiZz6CXPPyrPfAxPZnScGBLfJm6fU7pQ4gps79/klXLaaDSuLs4MhRk4n9ng== +"@percy/core@1.24.1": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@percy/core/-/core-1.24.1.tgz#7b276f8de7d39c4ae59bb4c3236b4a115d1b2f47" + integrity sha512-lByp0765X4wnJFeNqjp8+nZBdVIG7/+cz5gBCwfktuZmsYZje8/HCa0agQTjEx5ETvoXyjPKCpI144nqHqvTFg== dependencies: - "@percy/client" "1.25.0" - "@percy/config" "1.25.0" - "@percy/dom" "1.25.0" - "@percy/logger" "1.25.0" + "@percy/client" "1.24.1" + "@percy/config" "1.24.1" + "@percy/dom" "1.24.1" + "@percy/logger" "1.24.1" content-disposition "^0.5.4" cross-spawn "^7.0.3" extract-zip "^2.0.1" @@ -1879,22 +1891,20 @@ dependencies: "@percy/sdk-utils" "^1.3.1" -"@percy/dom@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@percy/dom/-/dom-1.25.0.tgz#cbc9730a034acb0939eae6500b3b38e00ddcbcfb" - integrity sha512-zBTFC75SM5LfRKZ9n0izvzcfTszCPwKRlulOEu4HQDATpzZuIIwyfM+5EuHthbt+E2PDkgiycbji4T66HnoRGA== +"@percy/dom@1.24.1": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@percy/dom/-/dom-1.24.1.tgz#c5cb46795931ef39e707f301d94a365aa32230d5" + integrity sha512-wdf0hrQerIhla9vpl0CeOhRBXCAkTWXzIqyrcXxje/rwYXw6PfanYnB48yKCbLyaPY8MRIV5JMP8fxzhJF6Rdg== -"@percy/env@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@percy/env/-/env-1.25.0.tgz#679babbe32f1aaff913fa0aaed2650b27996e0c8" - integrity sha512-Ds08lRk/TfrpTyIExLkzBI9PmIxVb2mm+UcAN/te7nhWcYB33rw3mO+U4+4WxhMQOh5QTLweaZEwEFx8uTx11A== - dependencies: - "@percy/logger" "1.25.0" +"@percy/env@1.24.1": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@percy/env/-/env-1.24.1.tgz#eefd53a8d31f8f8409512d47eccb7a7cdaec69fb" + integrity sha512-h/KLpK2z2Cw2dR5vHfuItsAlpUBjNJBmwVmlvb/nbdxAh4slz1a2QGzdFiskpU4YMDy6GebpN+cOkPXQcI8SaQ== -"@percy/logger@1.25.0": - version "1.25.0" - resolved "https://registry.yarnpkg.com/@percy/logger/-/logger-1.25.0.tgz#e6838d3b5ba65431e8f14b831345c1fbb96a600f" - integrity sha512-S5xaDIG16vUChKdHSeOjmAsLpIZ+JzzAdTdmXLy+MDcqU//iZcaY5aOH7h2zR7U/h4WUGe71YDWx2C5dOskMhQ== +"@percy/logger@1.24.1": + version "1.24.1" + resolved "https://registry.yarnpkg.com/@percy/logger/-/logger-1.24.1.tgz#ccb011a5230155766375ffe8ec10b11080c3c2e7" + integrity sha512-dJWGl+tZdPrg4uZglkGaom/1l4Cagruki9ZqsModNvvEN4LoXCbrIBd45GxlNkNhLbUDbvvvpTz1Lqu8wRwB8A== "@percy/sdk-utils@^1.3.1": version "1.23.0" @@ -1906,64 +1916,64 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@sentry-internal/tracing@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.54.0.tgz#eeb10ee72426d08669a7706faa4264f1ec02c71d" - integrity sha512-JsyhZ0wWZ+VqbHJg+azqRGdYJDkcI5R9+pnkO6SzbzxrRewqMAIwzkpPee3oI7vG99uhMEkOkMjHu0nQGwkOQw== +"@sentry-internal/tracing@7.52.1": + version "7.52.1" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.52.1.tgz#c98823afd2f9814466fa26f24a1a54fe63b27c24" + integrity sha512-6N99rE+Ek0LgbqSzI/XpsKSLUyJjQ9nychViy+MP60p1x+hllukfTsDbNtUNrPlW0Bx+vqUrWKkAqmTFad94TQ== dependencies: - "@sentry/core" "7.54.0" - "@sentry/types" "7.54.0" - "@sentry/utils" "7.54.0" + "@sentry/core" "7.52.1" + "@sentry/types" "7.52.1" + "@sentry/utils" "7.52.1" tslib "^1.9.3" "@sentry/browser@^7.0.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.54.0.tgz#7fe331c776d02b5c902733aa41dcbfac7bef1ae6" - integrity sha512-EvLAw03N9WE2m1CMl2/1YMeIs1icw9IEOVJhWmf3uJEysNJOFWXu6ZzdtHEz1E6DiJYhc1HzDya0ExZeJxNARA== - dependencies: - "@sentry-internal/tracing" "7.54.0" - "@sentry/core" "7.54.0" - "@sentry/replay" "7.54.0" - "@sentry/types" "7.54.0" - "@sentry/utils" "7.54.0" + version "7.52.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.52.1.tgz#f112ca4170bb5023f050bdcbcce5621b475a46eb" + integrity sha512-HrCOfieX68t+Wj42VIkraLYwx8kN5311SdBkHccevWs2Y2dZU7R9iLbI87+nb5kpOPQ7jVWW7d6QI/yZmliYgQ== + dependencies: + "@sentry-internal/tracing" "7.52.1" + "@sentry/core" "7.52.1" + "@sentry/replay" "7.52.1" + "@sentry/types" "7.52.1" + "@sentry/utils" "7.52.1" tslib "^1.9.3" -"@sentry/core@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.54.0.tgz#8c4cb8800f8df708b3f3f6483026bb9a02820014" - integrity sha512-MAn0E2EwgNn1pFQn4qxhU+1kz6edullWg6VE5wCmtpXWOVw6sILBUsQpeIG5djBKMcneJCdOlz5jeqcKPrLvZQ== +"@sentry/core@7.52.1": + version "7.52.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.52.1.tgz#4de702937ba8944802bb06eb8dfdf089c39f6bab" + integrity sha512-36clugQu5z/9jrit1gzI7KfKbAUimjRab39JeR0mJ6pMuKLTTK7PhbpUAD4AQBs9qVeXN2c7h9SVZiSA0UDvkg== dependencies: - "@sentry/types" "7.54.0" - "@sentry/utils" "7.54.0" + "@sentry/types" "7.52.1" + "@sentry/utils" "7.52.1" tslib "^1.9.3" -"@sentry/replay@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.54.0.tgz#f0f44f9413ceefd1809bf1665e82315927ae08db" - integrity sha512-C0F0568ybphzGmKGe23duB6n5wJcgM7WLYhoeqW3o2bHeqpj1dGPSka/K3s9KzGaAgzn1zeOUYXJsOs+T/XdsA== +"@sentry/replay@7.52.1": + version "7.52.1" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.52.1.tgz#272a0bcb79bb9ffce99b5dcaf864f18d729ce0da" + integrity sha512-A+RaUmpU9/yBHnU3ATemc6wAvobGno0yf5R6fZYkAFoo2FCR2YG6AXxkTazymIf8v2DnLGaSDORYDPdhQClU9A== dependencies: - "@sentry/core" "7.54.0" - "@sentry/types" "7.54.0" - "@sentry/utils" "7.54.0" + "@sentry/core" "7.52.1" + "@sentry/types" "7.52.1" + "@sentry/utils" "7.52.1" "@sentry/tracing@^7.0.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.54.0.tgz#8364cec20aadc16d8ffcfd4ed9e437e1d317fa87" - integrity sha512-IyflAAqOiKuNvhWXrJsXN8yfl8DbHRpfgtCEPo5TBvdkpcyxUyfE8W2a2MQ8MXDzgfJT1IixXEwleO+qPIi3Gg== + version "7.52.1" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.52.1.tgz#65db0404b3d83a268ece9773ddd6aa5fa609d801" + integrity sha512-1afFeb0X6YcMK8mcsGXpO9rNFEF4Kd3mAUF22hXyFNWVoPNQsvdh/WxG2t3U+hLhehQ1ps3iJ0jxFRGF5zSboA== dependencies: - "@sentry-internal/tracing" "7.54.0" + "@sentry-internal/tracing" "7.52.1" -"@sentry/types@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.54.0.tgz#bfee18107a78e290e6c8ad41646e2b9d9dd95234" - integrity sha512-D+i9xogBeawvQi2r0NOrM7zYcUaPuijeME4O9eOTrDF20tj71hWtJLilK+KTGLYFtpGg1h+9bPaz7OHEIyVopg== +"@sentry/types@7.52.1": + version "7.52.1" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.52.1.tgz#bcff6d0462d9b9b7b9ec31c0068fe02d44f25da2" + integrity sha512-OMbGBPrJsw0iEXwZ2bJUYxewI1IEAU2e1aQGc0O6QW5+6hhCh+8HO8Xl4EymqwejjztuwStkl6G1qhK+Q0/Row== -"@sentry/utils@7.54.0": - version "7.54.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.54.0.tgz#a3acb5e25a1409cbca7b46d6356d7417a253ea9a" - integrity sha512-3Yf5KlKjIcYLddOexSt2ovu2TWlR4Fi7M+aCK8yUTzwNzf/xwFSWOstHlD/WiDy9HvfhWAOB/ukNTuAeJmtasw== +"@sentry/utils@7.52.1": + version "7.52.1" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.52.1.tgz#4a3e49b918f78dba4524c924286210259020cac5" + integrity sha512-MPt1Xu/jluulknW8CmZ2naJ53jEdtdwCBSo6fXJvOTI0SDqwIPbXDVrsnqLAhVJuIN7xbkj96nuY/VBR6S5sWg== dependencies: - "@sentry/types" "7.54.0" + "@sentry/types" "7.52.1" tslib "^1.9.3" "@sinclair/typebox@^0.24.1": @@ -2214,16 +2224,11 @@ "@types/tough-cookie" "*" parse5 "^7.0.0" -"@types/json-schema@^7.0.8": +"@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== -"@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== - "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" @@ -2242,9 +2247,9 @@ integrity sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw== "@types/lodash@^4.14.168": - version "4.14.195" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" - integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== + version "4.14.194" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" + integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== "@types/mapbox__point-geometry@*", "@types/mapbox__point-geometry@^0.1.2": version "0.1.2" @@ -2284,14 +2289,14 @@ integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== "@types/node@^14.14.31": - version "14.18.47" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.47.tgz#89a56b05804d136cb99bf2f823bb00814a889aae" - integrity sha512-OuJi8bIng4wYHHA3YpKauL58dZrPxro3d0tabPHyiNF8rKfGKuVfr83oFlPLmKri1cX+Z3cJP39GXmnqkP11Gw== + version "14.18.48" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.48.tgz#ee5c7ac6e38fd2a9e6885f15c003464cf2da343c" + integrity sha512-iL0PIMwejpmuVHgfibHpfDwOdsbmB50wr21X71VnF5d7SsBF7WK+ZvP/SCcFm7Iwb9iiYSap9rlrdhToNAWdxg== "@types/node@^16": - version "16.18.34" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.34.tgz#62d2099b30339dec4b1b04a14c96266459d7c8b2" - integrity sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg== + version "16.18.31" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.31.tgz#7de39c2b9363f0d95b129cc969fcbf98e870251c" + integrity sha512-KPXltf4z4g517OlVJO9XQ2357CYw7fvuJ3ZuBynjXC5Jos9i+K7LvFb7bUIwtJXSZj0vTp9Q6NJBSQpkwwO8Zw== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2309,9 +2314,9 @@ integrity sha512-EDrLIPaPXOZqDjrkzxxbX7UlJSeQVgah3i0aA4pOSzmK9zq3BIh7/MZIQxED7slJByvKM4Gc6Hypyu2lJzh3SQ== "@types/prettier@^2.1.5": - version "2.7.3" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" - integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + version "2.7.2" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" + integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== "@types/prop-types@*": version "15.7.5" @@ -2449,14 +2454,14 @@ integrity sha512-3NoqvZC2W5gAC5DZbTpCeJ251vGQmgcWIHQJGq2J240HY6ErQ9aWKkwfoKJlHLx+A83WPNTZ9+3cd2ILxbvr1w== "@typescript-eslint/eslint-plugin@^5.35.1": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz#1e7a3e5318ece22251dfbc5c9c6feeb4793cc509" - integrity sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ== + version "5.59.6" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz#a350faef1baa1e961698240f922d8de1761a9e2b" + integrity sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.59.8" - "@typescript-eslint/type-utils" "5.59.8" - "@typescript-eslint/utils" "5.59.8" + "@typescript-eslint/scope-manager" "5.59.6" + "@typescript-eslint/type-utils" "5.59.6" + "@typescript-eslint/utils" "5.59.6" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" @@ -2465,13 +2470,13 @@ tsutils "^3.21.0" "@typescript-eslint/parser@^5.6.0": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.8.tgz#60cbb00671d86cf746044ab797900b1448188567" - integrity sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw== + version "5.59.6" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.6.tgz#bd36f71f5a529f828e20b627078d3ed6738dbb40" + integrity sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA== dependencies: - "@typescript-eslint/scope-manager" "5.59.8" - "@typescript-eslint/types" "5.59.8" - "@typescript-eslint/typescript-estree" "5.59.8" + "@typescript-eslint/scope-manager" "5.59.6" + "@typescript-eslint/types" "5.59.6" + "@typescript-eslint/typescript-estree" "5.59.6" debug "^4.3.4" "@typescript-eslint/scope-manager@5.58.0": @@ -2482,21 +2487,21 @@ "@typescript-eslint/types" "5.58.0" "@typescript-eslint/visitor-keys" "5.58.0" -"@typescript-eslint/scope-manager@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz#ff4ad4fec6433647b817c4a7d4b4165d18ea2fa8" - integrity sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig== +"@typescript-eslint/scope-manager@5.59.6": + version "5.59.6" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz#d43a3687aa4433868527cfe797eb267c6be35f19" + integrity sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ== dependencies: - "@typescript-eslint/types" "5.59.8" - "@typescript-eslint/visitor-keys" "5.59.8" + "@typescript-eslint/types" "5.59.6" + "@typescript-eslint/visitor-keys" "5.59.6" -"@typescript-eslint/type-utils@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz#aa6c029a9d7706d26bbd25eb4666398781df6ea2" - integrity sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA== +"@typescript-eslint/type-utils@5.59.6": + version "5.59.6" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz#37c51d2ae36127d8b81f32a0a4d2efae19277c48" + integrity sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ== dependencies: - "@typescript-eslint/typescript-estree" "5.59.8" - "@typescript-eslint/utils" "5.59.8" + "@typescript-eslint/typescript-estree" "5.59.6" + "@typescript-eslint/utils" "5.59.6" debug "^4.3.4" tsutils "^3.21.0" @@ -2505,10 +2510,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.58.0.tgz#54c490b8522c18986004df7674c644ffe2ed77d8" integrity sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g== -"@typescript-eslint/types@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.8.tgz#212e54414733618f5d0fd50b2da2717f630aebf8" - integrity sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w== +"@typescript-eslint/types@5.59.6": + version "5.59.6" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.6.tgz#5a6557a772af044afe890d77c6a07e8c23c2460b" + integrity sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA== "@typescript-eslint/typescript-estree@5.58.0": version "5.58.0" @@ -2523,30 +2528,30 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz#801a7b1766481629481b3b0878148bd7a1f345d7" - integrity sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg== +"@typescript-eslint/typescript-estree@5.59.6": + version "5.59.6" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz#2fb80522687bd3825504925ea7e1b8de7bb6251b" + integrity sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA== dependencies: - "@typescript-eslint/types" "5.59.8" - "@typescript-eslint/visitor-keys" "5.59.8" + "@typescript-eslint/types" "5.59.6" + "@typescript-eslint/visitor-keys" "5.59.6" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.8.tgz#34d129f35a2134c67fdaf024941e8f96050dca2b" - integrity sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg== +"@typescript-eslint/utils@5.59.6": + version "5.59.6" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.6.tgz#82960fe23788113fc3b1f9d4663d6773b7907839" + integrity sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.59.8" - "@typescript-eslint/types" "5.59.8" - "@typescript-eslint/typescript-estree" "5.59.8" + "@typescript-eslint/scope-manager" "5.59.6" + "@typescript-eslint/types" "5.59.6" + "@typescript-eslint/typescript-estree" "5.59.6" eslint-scope "^5.1.1" semver "^7.3.7" @@ -2572,12 +2577,12 @@ "@typescript-eslint/types" "5.58.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@5.59.8": - version "5.59.8" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz#aa6a7ef862add919401470c09e1609392ef3cc40" - integrity sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ== +"@typescript-eslint/visitor-keys@5.59.6": + version "5.59.6" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz#673fccabf28943847d0c8e9e8d008e3ada7be6bb" + integrity sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q== dependencies: - "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/types" "5.59.6" eslint-visitor-keys "^3.3.0" abab@^2.0.6: @@ -2684,6 +2689,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -2703,6 +2713,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -3276,15 +3291,6 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" -cliui@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" @@ -3439,19 +3445,19 @@ core-util-is@~1.0.0: integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" - integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== + version "8.1.3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" + integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== dependencies: import-fresh "^3.2.1" js-yaml "^4.1.0" parse-json "^5.0.0" path-type "^4.0.0" -cosmiconfig@^8.1.3: - version "8.1.3" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" - integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== +cosmiconfig@^8.2.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.2.0.tgz#f7d17c56a590856cd1e7cee98734dca272b0d8fd" + integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== dependencies: import-fresh "^3.2.1" js-yaml "^4.1.0" @@ -3569,14 +3575,14 @@ cypress-multi-reporters@^1.6.1: lodash "^4.17.21" cypress-real-events@^1.7.1: - version "1.7.6" - resolved "https://registry.yarnpkg.com/cypress-real-events/-/cypress-real-events-1.7.6.tgz#6f17e0b2ceea1d6dc60f6737d8f84cc517bbbb4c" - integrity sha512-yP6GnRrbm6HK5q4DH6Nnupz37nOfZu/xn1xFYqsE2o4G73giPWQOdu6375QYpwfU1cvHNCgyD2bQ2hPH9D7NMw== + version "1.8.1" + resolved "https://registry.yarnpkg.com/cypress-real-events/-/cypress-real-events-1.8.1.tgz#d00c7fe93124bbe7c0f27296684838614d24a840" + integrity sha512-8fFnA8EzS3EVbAmpSEUf3A8yZCmfU3IPOSGUDVFCdE1ke1gYL1A+gvXXV6HKUbTPRuvKKt2vpaMbUwYLpDRswQ== cypress@^12.0.0: - version "12.12.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.12.0.tgz#0da622a34c970d8699ca6562d8e905ed7ce33c77" - integrity sha512-UU5wFQ7SMVCR/hyKok/KmzG6fpZgBHHfrXcHzDmPHWrT+UUetxFzQgt7cxCszlwfozckzwkd22dxMwl/vNkWRw== + version "12.13.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.13.0.tgz#725b6617ea19e41e5c59cc509fc3e08097142b01" + integrity sha512-QJlSmdPk+53Zhy69woJMySZQJoWfEWun3X5OOenGsXjRPVfByVTHorxNehbzhZrEzH9RDUDqVcck0ahtlS+N/Q== dependencies: "@cypress/request" "^2.88.10" "@cypress/xvfb" "^1.2.4" @@ -3656,9 +3662,9 @@ date-names@^0.1.11: integrity sha512-IxxoeD9tdx8pXVcmqaRlPvrXIsSrSrIZzfzlOkm9u+hyzKp5Wk/odt9O/gd7Ockzy8n/WHeEpTVJ2bF3mMV4LA== dayjs@^1.10.4: - version "1.11.7" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" - integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + version "1.11.8" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.8.tgz#4282f139c8c19dd6d0c7bd571e30c2d0ba7698ea" + integrity sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ== debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" @@ -3864,6 +3870,11 @@ earcut@^2.2.4: resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a" integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -4266,16 +4277,16 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -eslint@8.40.0: - version "8.40.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.40.0.tgz#a564cd0099f38542c4e9a2f630fa45bf33bc42a4" - integrity sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ== +eslint@8.42.0: + version "8.42.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.42.0.tgz#7bebdc3a55f9ed7167251fe7259f75219cade291" + integrity sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.4.0" "@eslint/eslintrc" "^2.0.3" - "@eslint/js" "8.40.0" - "@humanwhocodes/config-array" "^0.11.8" + "@eslint/js" "8.42.0" + "@humanwhocodes/config-array" "^0.11.10" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" ajv "^6.10.0" @@ -4294,13 +4305,12 @@ eslint@8.40.0: find-up "^5.0.0" glob-parent "^6.0.2" globals "^13.19.0" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" @@ -4853,16 +4863,15 @@ glob-to-regexp@^0.4.0, glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^10.0.0: - version "10.2.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-10.2.1.tgz#44288e9186b5cd5baa848728533ba21a94aa8f33" - integrity sha512-ngom3wq2UhjdbmRE/krgkD8BQyi1KZ5l+D2dVm4+Yj+jJIBp74/ZGunL6gNGc/CYuQmvUBiavWEXIotRiv5R6A== +glob@^10.2.5: + version "10.2.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.2.6.tgz#1e27edbb3bbac055cb97113e27a066c100a4e5e1" + integrity sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA== dependencies: foreground-child "^3.1.0" - fs.realpath "^1.0.0" jackspeak "^2.0.3" - minimatch "^9.0.0" - minipass "^5.0.0" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2" path-scurry "^1.7.0" glob@^7.1.3, glob@^7.1.4, glob@^7.2.0: @@ -5536,11 +5545,11 @@ istanbul-reports@^3.1.3: istanbul-lib-report "^3.0.0" jackspeak@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.0.3.tgz#672eb397b97744a265b5862d7762b96e8dad6e61" - integrity sha512-0Jud3OMUdMbrlr3PyUMKESq51LXVAB+a239Ywdvd+Kgxj3MaBRml/nVRxf8tQFyfthMjuRkxkv7Vg58pmIMfuQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.2.1.tgz#655e8cf025d872c9c03d3eb63e8f0c024fef16a6" + integrity sha512-MXbxovZ/Pm42f6cDIDkl3xpwv1AGwObKwfmjs2nQePiy85tP3fatofl3FC1aBsOtP/6fq5SbtgHwWcMsLP+bDw== dependencies: - cliui "^7.0.4" + "@isaacs/cliui" "^8.0.2" optionalDependencies: "@pkgjs/parseargs" "^0.11.0" @@ -5984,11 +5993,6 @@ jest@29.3.1: import-local "^3.0.2" jest-cli "^29.3.1" -js-sdsl@^4.1.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" - integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -6361,10 +6365,10 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.0.1.tgz#ac061ed291f8b9adaca2b085534bb1d3b61bef83" - integrity sha512-C8QsKIN1UIXeOs3iWmiZ1lQY+EnKDojWd37fXy1aSbJvH4iSma1uy2OWuoB3m4SYRli5+CUjDv3Dij5DVoetmg== +lru-cache@^9.1.1: + version "9.1.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.2.tgz#255fdbc14b75589d6d0e73644ca167a8db506835" + integrity sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ== lru-queue@^0.1.0: version "0.1.0" @@ -6461,11 +6465,11 @@ matrix-events-sdk@0.0.1: integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== "matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": - version "26.0.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/c52e4b632933b54dca20c2a8f966e47013c28104" + version "25.1.0" + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/73ca9c9ed28847454e13da358c581769e695ff42" dependencies: "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-js" "^0.1.0-alpha.9" + "@matrix-org/matrix-sdk-crypto-js" "^0.1.0-alpha.8" another-json "^0.2.0" bs58 "^5.0.0" content-type "^1.0.4" @@ -6609,10 +6613,10 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.0.tgz#bfc8e88a1c40ffd40c172ddac3decb8451503b56" - integrity sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w== +minimatch@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253" + integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w== dependencies: brace-expansion "^2.0.1" @@ -6630,10 +6634,10 @@ minimist@>=1.2.2, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1 resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== +"minipass@^5.0.0 || ^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-6.0.2.tgz#542844b6c4ce95b202c0995b0a471f1229de4c81" + integrity sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w== mkdirp@1.0.4, mkdirp@~1.0.4: version "1.0.4" @@ -6983,12 +6987,12 @@ path-parse@^1.0.7: integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.7.0.tgz#99c741a2cfbce782294a39994d63748b5a24f6db" - integrity sha512-UkZUeDjczjYRE495+9thsgcVgsaCPkaw80slmfVFgllxY+IO8ubTsOpFVjDPROBqJdHfVPUFRHPBV/WciOVfWg== + version "1.9.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.9.2.tgz#90f9d296ac5e37e608028e28a447b11d385b3f63" + integrity sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg== dependencies: - lru-cache "^9.0.0" - minipass "^5.0.0" + lru-cache "^9.1.1" + minipass "^5.0.0 || ^6.0.2" path-to-regexp@^2.2.1: version "2.4.0" @@ -7112,7 +7116,7 @@ postcss-selector-parser@^6.0.11: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-selector-parser@^6.0.12: +postcss-selector-parser@^6.0.13: version "6.0.13" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== @@ -7134,22 +7138,21 @@ postcss@^8.3.11: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.23: - version "8.4.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" - integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== +postcss@^8.4.24: + version "8.4.24" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.24.tgz#f714dba9b2284be3cc07dbd2fc57ee4dc972d2df" + integrity sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" -posthog-js@1.57.2: - version "1.57.2" - resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.57.2.tgz#131fb93e2ad099baff4317f3d91a4d6c96a08e7f" - integrity sha512-ER4gkYZasrd2Zwmt/yLeZ5G/nZJ6tpaYBCpx3CvocDx+3F16WdawJlYMT0IyLKHXDniC5+AsjzFd6fi8uyYlJA== +posthog-js@1.63.3: + version "1.63.3" + resolved "https://registry.yarnpkg.com/posthog-js/-/posthog-js-1.63.3.tgz#b4bf0c73762282ce089094f6d519a034531e6662" + integrity sha512-Ob2x1ENxx/mWAdhLhc6ouKAph9LwmitBy7M+hiaFoS0T9g7OVL4lYdrJbODbYV+HX/HeO3bsnQwYO1QLPWm/YA== dependencies: fflate "^0.4.1" - rrweb-snapshot "^1.1.14" potpack@^1.0.2: version "1.0.2" @@ -7667,16 +7670,11 @@ rimraf@^3.0.0, rimraf@^3.0.2: glob "^7.1.3" rimraf@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.0.tgz#5bda14e410d7e4dd522154891395802ce032c2cb" - integrity sha512-Jf9llaP+RvaEVS5nPShYFhtXIrb3LRKP281ib3So0KkeZKo2wIKyq0Re7TOSwanasA423PSr6CCIL4bP6T040g== + version "5.0.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.1.tgz#0881323ab94ad45fec7c0221f27ea1a142f3f0d0" + integrity sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg== dependencies: - glob "^10.0.0" - -rrweb-snapshot@^1.1.14: - version "1.1.14" - resolved "https://registry.yarnpkg.com/rrweb-snapshot/-/rrweb-snapshot-1.1.14.tgz#9d4d9be54a28a893373428ee4393ec7e5bd83fcc" - integrity sha512-eP5pirNjP5+GewQfcOQY4uBiDnpqxNRc65yKPW0eSoU1XamDfc4M8oqpXGMyUyvLyxFDB0q0+DChuxxiU2FXBQ== + glob "^10.2.5" run-parallel@^1.1.9: version "1.2.0" @@ -7975,7 +7973,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -7984,6 +7982,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" @@ -8037,13 +8044,20 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -8099,17 +8113,17 @@ stylelint-scss@^5.0.0: postcss-value-parser "^4.2.0" stylelint@^15.0.0: - version "15.6.2" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-15.6.2.tgz#06d9005b62a83b72887eed623520e9b472af8c15" - integrity sha512-fjQWwcdUye4DU+0oIxNGwawIPC5DvG5kdObY5Sg4rc87untze3gC/5g/ikePqVjrAsBUZjwMN+pZsAYbDO6ArQ== + version "15.7.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-15.7.0.tgz#945939a2ce9516998a198580e69b1ceef8a7c5f3" + integrity sha512-fQRwHwWuZsDn4ENyE9AsKkOkV9WlD2CmYiVDbdZPdS3iZh0ceypOn1EuwTNuZ8xTrHF+jVeIEzLtFFSlD/nJHg== dependencies: - "@csstools/css-parser-algorithms" "^2.1.1" + "@csstools/css-parser-algorithms" "^2.2.0" "@csstools/css-tokenizer" "^2.1.1" - "@csstools/media-query-list-parser" "^2.0.4" + "@csstools/media-query-list-parser" "^2.1.0" "@csstools/selector-specificity" "^2.2.0" balanced-match "^2.0.0" colord "^2.9.3" - cosmiconfig "^8.1.3" + cosmiconfig "^8.2.0" css-functions-list "^3.1.0" css-tree "^2.3.1" debug "^4.3.4" @@ -8130,11 +8144,11 @@ stylelint@^15.0.0: micromatch "^4.0.5" normalize-path "^3.0.0" picocolors "^1.0.0" - postcss "^8.4.23" + postcss "^8.4.24" postcss-media-query-parser "^0.2.3" postcss-resolve-nested-selector "^0.1.1" postcss-safe-parser "^6.0.0" - postcss-selector-parser "^6.0.12" + postcss-selector-parser "^6.0.13" postcss-value-parser "^4.2.0" resolve-from "^5.0.0" string-width "^4.2.3" @@ -8362,11 +8376,16 @@ tslib@^1.8.1, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.4.0, tslib@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +tslib@^2.1.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.3.tgz#24944ba2d990940e6e982c4bea147aba80209913" + integrity sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -8776,6 +8795,15 @@ word-wrap@^1.2.3, word-wrap@~1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -8785,14 +8813,14 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" wrappy@1: version "1.0.2" @@ -8856,9 +8884,9 @@ yallist@^4.0.0: integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^2.0.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" - integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== + version "2.2.2" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.2.2.tgz#ec551ef37326e6d42872dad1970300f8eb83a073" + integrity sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA== yargs-parser@^18.1.2: version "18.1.3" From 0e682b6eaeffe6bf072704cb3c74b59447611100 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 8 Jun 2023 08:35:31 +0000 Subject: [PATCH 35/54] Update cypress-io/github-action digest to fbfad28 (#11063) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/cypress.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cypress.yaml b/.github/workflows/cypress.yaml index 5b5a240f462..9c2f047c2e1 100644 --- a/.github/workflows/cypress.yaml +++ b/.github/workflows/cypress.yaml @@ -159,7 +159,7 @@ jobs: echo "CYPRESS_RUST_CRYPTO=1" >> "$GITHUB_ENV" - name: Run Cypress tests - uses: cypress-io/github-action@61a130a45335b30972903dace9a5d10578121e6e + uses: cypress-io/github-action@fbfad281d97a63e3e8a605ebfccba8dbea8aea93 with: working-directory: matrix-react-sdk # The built-in Electron runner seems to grind to a halt trying From 87f329789b0a48a975ac1eff287a4edfc0ab3466 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Thu, 8 Jun 2023 11:11:18 +0000 Subject: [PATCH 36/54] Fix translucent `TextualEvent` on search results panel (#10810) * Unset the opacity value of textual events on the search results panel * Add a test for checking opacity --- cypress/e2e/timeline/timeline.spec.ts | 80 ++++++++++++++++++----- res/css/views/messages/_TextualEvent.pcss | 4 ++ 2 files changed, 66 insertions(+), 18 deletions(-) diff --git a/cypress/e2e/timeline/timeline.spec.ts b/cypress/e2e/timeline/timeline.spec.ts index da5be7d93aa..10650d14f4e 100644 --- a/cypress/e2e/timeline/timeline.spec.ts +++ b/cypress/e2e/timeline/timeline.spec.ts @@ -718,24 +718,6 @@ describe("Timeline", () => { }); }); - it("should highlight search result words regardless of formatting", () => { - sendEvent(roomId); - sendEvent(roomId, true); - cy.visit("/#/room/" + roomId); - - cy.get(".mx_RoomHeader").findByRole("button", { name: "Search" }).click(); - - cy.get(".mx_SearchBar").percySnapshotElement("Search bar on the timeline", { - // Emulate narrow timeline - widths: [320, 640], - }); - - cy.get(".mx_SearchBar_input").findByRole("textbox").type("Message{enter}"); - - cy.get(".mx_EventTile:not(.mx_EventTile_contextual) .mx_EventTile_searchHighlight").should("exist"); - cy.get(".mx_RoomView_searchResultsPanel").percySnapshotElement("Highlighted search results"); - }); - it("should render url previews", () => { cy.intercept("**/_matrix/media/r0/thumbnail/matrix.org/2022-08-16_yaiSVSRIsNFfxDnV?*", { statusCode: 200, @@ -780,6 +762,68 @@ describe("Timeline", () => { widths: [800, 400], }); }); + + describe("on search results panel", () => { + it("should highlight search result words regardless of formatting", () => { + sendEvent(roomId); + sendEvent(roomId, true); + cy.visit("/#/room/" + roomId); + + cy.get(".mx_RoomHeader").findByRole("button", { name: "Search" }).click(); + + cy.get(".mx_SearchBar").percySnapshotElement("Search bar on the timeline", { + // Emulate narrow timeline + widths: [320, 640], + }); + + cy.get(".mx_SearchBar_input").findByRole("textbox").type("Message{enter}"); + + cy.get(".mx_EventTile:not(.mx_EventTile_contextual) .mx_EventTile_searchHighlight").should("exist"); + cy.get(".mx_RoomView_searchResultsPanel").percySnapshotElement("Highlighted search results"); + }); + + it("should render a fully opaque textual event", () => { + const stringToSearch = "Message"; // Same with string sent with sendEvent() + + sendEvent(roomId); + + cy.visit("/#/room/" + roomId); + + // Open a room setting dialog + cy.findByRole("button", { name: "Room options" }).click(); + cy.findByRole("menuitem", { name: "Settings" }).click(); + + // Set a room topic to render a TextualEvent + cy.findByRole("textbox", { name: "Room Topic" }).type(`This is a room for ${stringToSearch}.`); + cy.findByRole("button", { name: "Save" }).click(); + + cy.closeDialog(); + + // Assert that the TextualEvent is rendered + cy.findByText(`${OLD_NAME} changed the topic to "This is a room for ${stringToSearch}.".`) + .should("exist") + .should("have.class", "mx_TextualEvent"); + + // Display the room search bar + cy.get(".mx_RoomHeader").findByRole("button", { name: "Search" }).click(); + + // Search the string to display both the message and TextualEvent on search results panel + cy.get(".mx_SearchBar").within(() => { + cy.findByRole("textbox").type(`${stringToSearch}{enter}`); + }); + + // On search results panel + cy.get(".mx_RoomView_searchResultsPanel").within(() => { + // Assert that contextual event tiles are translucent + cy.get(".mx_EventTile.mx_EventTile_contextual").should("have.css", "opacity", "0.4"); + + // Assert that the TextualEvent is fully opaque (visually solid). + cy.get(".mx_EventTile .mx_TextualEvent").should("have.css", "opacity", "1"); + }); + + cy.get(".mx_RoomView_searchResultsPanel").percySnapshotElement("Search results - with TextualEvent"); + }); + }); }); describe("message sending", () => { diff --git a/res/css/views/messages/_TextualEvent.pcss b/res/css/views/messages/_TextualEvent.pcss index 530ad50587b..08f0f07b19a 100644 --- a/res/css/views/messages/_TextualEvent.pcss +++ b/res/css/views/messages/_TextualEvent.pcss @@ -23,4 +23,8 @@ limitations under the License. color: $accent; cursor: pointer; } + + .mx_RoomView_searchResultsPanel & { + opacity: unset; /* Unset the opacity value specified above on the search results panel */ + } } From 5264aa613834df765bb78509ba80d0f46cbde6d9 Mon Sep 17 00:00:00 2001 From: Kerry Date: Fri, 9 Jun 2023 10:03:01 +1200 Subject: [PATCH 37/54] use matrixclientpeg in manual verification dialog (#11059) --- .../views/dialogs/ManualDeviceKeyVerificationDialog.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx b/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx index 2e71ff199e8..d81d6e76ca4 100644 --- a/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx +++ b/src/components/views/dialogs/ManualDeviceKeyVerificationDialog.tsx @@ -24,7 +24,7 @@ import { Device } from "matrix-js-sdk/src/models/device"; import * as FormattingUtils from "../../../utils/FormattingUtils"; import { _t } from "../../../languageHandler"; import QuestionDialog from "./QuestionDialog"; -import { useMatrixClientContext } from "../../../contexts/MatrixClientContext"; +import { MatrixClientPeg } from "../../../MatrixClientPeg"; interface IManualDeviceKeyVerificationDialogProps { userId: string; @@ -37,11 +37,11 @@ export function ManualDeviceKeyVerificationDialog({ device, onFinished, }: IManualDeviceKeyVerificationDialogProps): JSX.Element { - const mxClient = useMatrixClientContext(); + const mxClient = MatrixClientPeg.get(); const onLegacyFinished = useCallback( (confirm: boolean) => { - if (confirm && mxClient) { + if (confirm) { mxClient.setDeviceVerified(userId, device.deviceId, true); } onFinished(confirm); From a861a54fcd5ef8dcac6314069304a1afd6e244ed Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Fri, 9 Jun 2023 08:20:05 +0100 Subject: [PATCH 38/54] Matrix matrix scheme permalink constructor not stripping query params (#11060) --- .../MatrixSchemePermalinkConstructor.ts | 3 +- .../MatrixSchemePermalinkConstructor-test.ts | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 test/utils/permalinks/MatrixSchemePermalinkConstructor-test.ts diff --git a/src/utils/permalinks/MatrixSchemePermalinkConstructor.ts b/src/utils/permalinks/MatrixSchemePermalinkConstructor.ts index f29c53c9dbf..827dfc1d0aa 100644 --- a/src/utils/permalinks/MatrixSchemePermalinkConstructor.ts +++ b/src/utils/permalinks/MatrixSchemePermalinkConstructor.ts @@ -72,7 +72,8 @@ export default class MatrixSchemePermalinkConstructor extends PermalinkConstruct throw new Error("Does not appear to be a permalink"); } - const parts = fullUrl.substring("matrix:".length).split("/"); + const url = new URL(fullUrl); + const parts = url.pathname.split("/"); const identifier = parts[0]; const entityNoSigil = parts[1]; diff --git a/test/utils/permalinks/MatrixSchemePermalinkConstructor-test.ts b/test/utils/permalinks/MatrixSchemePermalinkConstructor-test.ts new file mode 100644 index 00000000000..8605775c5df --- /dev/null +++ b/test/utils/permalinks/MatrixSchemePermalinkConstructor-test.ts @@ -0,0 +1,30 @@ +/* +Copyright 2023 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { PermalinkParts } from "../../../src/utils/permalinks/PermalinkConstructor"; +import MatrixSchemePermalinkConstructor from "../../../src/utils/permalinks/MatrixSchemePermalinkConstructor"; + +describe("MatrixSchemePermalinkConstructor", () => { + const peramlinkConstructor = new MatrixSchemePermalinkConstructor(); + + describe("parsePermalink", () => { + it("should strip ?action=chat from user links", () => { + expect(peramlinkConstructor.parsePermalink("matrix:u/user:example.com?action=chat")).toEqual( + new PermalinkParts(null, null, "@user:example.com", null), + ); + }); + }); +}); From 72e6c10f0d274d4c924801a0be28a9928b83ae38 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Fri, 9 Jun 2023 09:45:28 +0100 Subject: [PATCH 39/54] Reset matrix-js-sdk back to develop branch --- yarn.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index 80345b92458..781a71fd467 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1593,10 +1593,10 @@ resolved "https://registry.yarnpkg.com/@matrix-org/analytics-events/-/analytics-events-0.5.0.tgz#38b69c4e29d243944c5712cca7b674a3432056e6" integrity sha512-uL5kf7MqC+GxsGJtimPVbFliyaFinohTHSzohz31JTysktHsjRR2SC+vV7sy2/dstTWVdG9EGOnohyPsB+oi3A== -"@matrix-org/matrix-sdk-crypto-js@^0.1.0-alpha.8": - version "0.1.0-alpha.8" - resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-js/-/matrix-sdk-crypto-js-0.1.0-alpha.8.tgz#18dd8e7fb56602d2999d8a502b49e902a2bb3782" - integrity sha512-hdmbbGXKrN6JNo3wdBaR5Zs3lXlzllT3U43ViNTlabB3nKkOZQnEAN/Isv+4EQSgz1+8897veI9Q8sqlQX22oA== +"@matrix-org/matrix-sdk-crypto-js@^0.1.0-alpha.10": + version "0.1.0-alpha.10" + resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-js/-/matrix-sdk-crypto-js-0.1.0-alpha.10.tgz#b6a6395cffd3197ae2e0a88f4eeae8b315571fd2" + integrity sha512-8V2NKuzGOFzEZeZVgF2is7gmuopdRbMZ064tzPDE0vN34iX6s3O8A4oxIT7SA3qtymwm3t1yEvTnT+0gfbmh4g== "@matrix-org/matrix-wysiwyg@^2.0.0": version "2.2.1" @@ -6465,11 +6465,11 @@ matrix-events-sdk@0.0.1: integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== "matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": - version "25.1.0" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/73ca9c9ed28847454e13da358c581769e695ff42" + version "26.0.1" + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/51218ddc1d9e54e99aee97f31d11c193d727b977" dependencies: "@babel/runtime" "^7.12.5" - "@matrix-org/matrix-sdk-crypto-js" "^0.1.0-alpha.8" + "@matrix-org/matrix-sdk-crypto-js" "^0.1.0-alpha.10" another-json "^0.2.0" bs58 "^5.0.0" content-type "^1.0.4" From 53415bfdfeb9f25e6755dde2bc41e9dbca4fa791 Mon Sep 17 00:00:00 2001 From: alunturner <56027671+alunturner@users.noreply.github.com> Date: Fri, 9 Jun 2023 10:11:38 +0100 Subject: [PATCH 40/54] Allow image pasting in rich text mode in RTE (#11049) * add comments to rough first solution * allow eventRelation prop to pass to both composers * use eventRelation in image paste * add image pasting to rich text mode of rich text editor * extract error handling to function * type the error handler * add tests * make behaviour mimic SendMessage * add sad path tests * refactor to use catch throughout * update comments * tidy up tests * add special case and change function signature * add comment * bump rte to 2.2.2 --- package.json | 2 +- .../wysiwyg_composer/SendWysiwygComposer.tsx | 3 +- .../components/PlainTextComposer.tsx | 2 + .../components/WysiwygComposer.tsx | 5 +- .../hooks/useInputEventProcessor.ts | 121 +++++++- .../hooks/useInputEventProcessor-test.tsx | 287 ++++++++++++++++++ yarn.lock | 8 +- 7 files changed, 414 insertions(+), 14 deletions(-) create mode 100644 test/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor-test.tsx diff --git a/package.json b/package.json index 03d305d52ae..ffdc149531d 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "dependencies": { "@babel/runtime": "^7.12.5", "@matrix-org/analytics-events": "^0.5.0", - "@matrix-org/matrix-wysiwyg": "^2.0.0", + "@matrix-org/matrix-wysiwyg": "^2.2.2", "@matrix-org/react-sdk-module-api": "^0.0.5", "@sentry/browser": "^7.0.0", "@sentry/tracing": "^7.0.0", diff --git a/src/components/views/rooms/wysiwyg_composer/SendWysiwygComposer.tsx b/src/components/views/rooms/wysiwyg_composer/SendWysiwygComposer.tsx index d12432481db..34307ce4abd 100644 --- a/src/components/views/rooms/wysiwyg_composer/SendWysiwygComposer.tsx +++ b/src/components/views/rooms/wysiwyg_composer/SendWysiwygComposer.tsx @@ -57,11 +57,10 @@ export default function SendWysiwygComposer({ isRichTextEnabled, e2eStatus, menuPosition, - eventRelation, ...props }: SendWysiwygComposerProps): JSX.Element { const Composer = isRichTextEnabled ? WysiwygComposer : PlainTextComposer; - const defaultContextValue = useRef(getDefaultContextValue({ eventRelation })); + const defaultContextValue = useRef(getDefaultContextValue({ eventRelation: props.eventRelation })); return ( diff --git a/src/components/views/rooms/wysiwyg_composer/components/PlainTextComposer.tsx b/src/components/views/rooms/wysiwyg_composer/components/PlainTextComposer.tsx index c6abc1230b4..efc4971657d 100644 --- a/src/components/views/rooms/wysiwyg_composer/components/PlainTextComposer.tsx +++ b/src/components/views/rooms/wysiwyg_composer/components/PlainTextComposer.tsx @@ -15,6 +15,7 @@ limitations under the License. */ import classNames from "classnames"; +import { IEventRelation } from "matrix-js-sdk/src/matrix"; import React, { MutableRefObject, ReactNode } from "react"; import { useComposerFunctions } from "../hooks/useComposerFunctions"; @@ -36,6 +37,7 @@ interface PlainTextComposerProps { leftComponent?: ReactNode; rightComponent?: ReactNode; children?: (ref: MutableRefObject, composerFunctions: ComposerFunctions) => ReactNode; + eventRelation?: IEventRelation; } export function PlainTextComposer({ diff --git a/src/components/views/rooms/wysiwyg_composer/components/WysiwygComposer.tsx b/src/components/views/rooms/wysiwyg_composer/components/WysiwygComposer.tsx index 56f79c94a87..c4c50b8392c 100644 --- a/src/components/views/rooms/wysiwyg_composer/components/WysiwygComposer.tsx +++ b/src/components/views/rooms/wysiwyg_composer/components/WysiwygComposer.tsx @@ -15,6 +15,7 @@ limitations under the License. */ import React, { memo, MutableRefObject, ReactNode, useEffect, useRef } from "react"; +import { IEventRelation } from "matrix-js-sdk/src/matrix"; import { useWysiwyg, FormattingFunctions } from "@matrix-org/matrix-wysiwyg"; import classNames from "classnames"; @@ -40,6 +41,7 @@ interface WysiwygComposerProps { leftComponent?: ReactNode; rightComponent?: ReactNode; children?: (ref: MutableRefObject, wysiwyg: FormattingFunctions) => ReactNode; + eventRelation?: IEventRelation; } export const WysiwygComposer = memo(function WysiwygComposer({ @@ -52,11 +54,12 @@ export const WysiwygComposer = memo(function WysiwygComposer({ leftComponent, rightComponent, children, + eventRelation, }: WysiwygComposerProps) { const { room } = useRoomContext(); const autocompleteRef = useRef(null); - const inputEventProcessor = useInputEventProcessor(onSend, autocompleteRef, initialContent); + const inputEventProcessor = useInputEventProcessor(onSend, autocompleteRef, initialContent, eventRelation); const { ref, isWysiwygReady, content, actionStates, wysiwyg, suggestion } = useWysiwyg({ initialContent, inputEventProcessor, diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor.ts b/src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor.ts index 9b41227ba3b..27f40880140 100644 --- a/src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor.ts +++ b/src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor.ts @@ -16,7 +16,7 @@ limitations under the License. import { Wysiwyg, WysiwygEvent } from "@matrix-org/matrix-wysiwyg"; import { useCallback } from "react"; -import { MatrixClient } from "matrix-js-sdk/src/matrix"; +import { IEventRelation, MatrixClient } from "matrix-js-sdk/src/matrix"; import { useSettingValue } from "../../../../../hooks/useSettings"; import { getKeyBindingsManager } from "../../../../../KeyBindingsManager"; @@ -34,11 +34,15 @@ import { getEventsFromEditorStateTransfer, getEventsFromRoom } from "../utils/ev import { endEditing } from "../utils/editing"; import Autocomplete from "../../Autocomplete"; import { handleEventWithAutocomplete } from "./utils"; +import ContentMessages from "../../../../../ContentMessages"; +import { getBlobSafeMimeType } from "../../../../../utils/blobs"; +import { isNotNull } from "../../../../../Typeguards"; export function useInputEventProcessor( onSend: () => void, autocompleteRef: React.RefObject, initialContent?: string, + eventRelation?: IEventRelation, ): (event: WysiwygEvent, composer: Wysiwyg, editor: HTMLElement) => WysiwygEvent | null { const roomContext = useRoomContext(); const composerContext = useComposerContext(); @@ -47,10 +51,6 @@ export function useInputEventProcessor( return useCallback( (event: WysiwygEvent, composer: Wysiwyg, editor: HTMLElement) => { - if (event instanceof ClipboardEvent) { - return event; - } - const send = (): void => { event.stopPropagation?.(); event.preventDefault?.(); @@ -61,6 +61,21 @@ export function useInputEventProcessor( onSend(); }; + // this is required to handle edge case image pasting in Safari, see + // https://github.com/vector-im/element-web/issues/25327 and it is caught by the + // `beforeinput` listener attached to the composer + const isInputEventForClipboard = + event instanceof InputEvent && event.inputType === "insertFromPaste" && isNotNull(event.dataTransfer); + const isClipboardEvent = event instanceof ClipboardEvent; + + const shouldHandleAsClipboardEvent = isClipboardEvent || isInputEventForClipboard; + + if (shouldHandleAsClipboardEvent) { + const data = isClipboardEvent ? event.clipboardData : event.dataTransfer; + const handled = handleClipboardEvent(event, data, roomContext, mxClient, eventRelation); + return handled ? null : event; + } + const isKeyboardEvent = event instanceof KeyboardEvent; if (isKeyboardEvent) { return handleKeyboardEvent( @@ -78,7 +93,16 @@ export function useInputEventProcessor( return handleInputEvent(event, send, isCtrlEnterToSend); } }, - [isCtrlEnterToSend, onSend, initialContent, roomContext, composerContext, mxClient, autocompleteRef], + [ + isCtrlEnterToSend, + onSend, + initialContent, + roomContext, + composerContext, + mxClient, + autocompleteRef, + eventRelation, + ], ); } @@ -220,3 +244,88 @@ function handleInputEvent(event: InputEvent, send: Send, isCtrlEnterToSend: bool return event; } + +/** + * Takes an event and handles image pasting. Returns a boolean to indicate if it has handled + * the event or not. Must accept either clipboard or input events in order to prevent issue: + * https://github.com/vector-im/element-web/issues/25327 + * + * @param event - event to process + * @param roomContext - room in which the event occurs + * @param mxClient - current matrix client + * @param eventRelation - used to send the event to the correct place eg timeline vs thread + * @returns - boolean to show if the event was handled or not + */ +export function handleClipboardEvent( + event: ClipboardEvent | InputEvent, + data: DataTransfer | null, + roomContext: IRoomState, + mxClient: MatrixClient, + eventRelation?: IEventRelation, +): boolean { + // Logic in this function follows that of `SendMessageComposer.onPaste` + const { room, timelineRenderingType, replyToEvent } = roomContext; + + function handleError(error: unknown): void { + if (error instanceof Error) { + console.log(error.message); + } else if (typeof error === "string") { + console.log(error); + } + } + + if (event.type !== "paste" || data === null || room === undefined) { + return false; + } + + // Prioritize text on the clipboard over files if RTF is present as Office on macOS puts a bitmap + // in the clipboard as well as the content being copied. Modern versions of Office seem to not do this anymore. + // We check text/rtf instead of text/plain as when copy+pasting a file from Finder or Gnome Image Viewer + // it puts the filename in as text/plain which we want to ignore. + if (data.files.length && !data.types.includes("text/rtf")) { + ContentMessages.sharedInstance() + .sendContentListToRoom(Array.from(data.files), room.roomId, eventRelation, mxClient, timelineRenderingType) + .catch(handleError); + return true; + } + + // Safari `Insert from iPhone or iPad` + // data.getData("text/html") returns a string like: + if (data.types.includes("text/html")) { + const imgElementStr = data.getData("text/html"); + const parser = new DOMParser(); + const imgDoc = parser.parseFromString(imgElementStr, "text/html"); + + if ( + imgDoc.getElementsByTagName("img").length !== 1 || + !imgDoc.querySelector("img")?.src.startsWith("blob:") || + imgDoc.childNodes.length !== 1 + ) { + handleError("Failed to handle pasted content as Safari inserted content"); + return false; + } + const imgSrc = imgDoc.querySelector("img")!.src; + + fetch(imgSrc) + .then((response) => { + response + .blob() + .then((imgBlob) => { + const type = imgBlob.type; + const safetype = getBlobSafeMimeType(type); + const ext = type.split("/")[1]; + const parts = response.url.split("/"); + const filename = parts[parts.length - 1]; + const file = new File([imgBlob], filename + "." + ext, { type: safetype }); + ContentMessages.sharedInstance() + .sendContentToRoom(file, room.roomId, eventRelation, mxClient, replyToEvent) + .catch(handleError); + }) + .catch(handleError); + }) + .catch(handleError); + return true; + } + + return false; +} diff --git a/test/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor-test.tsx b/test/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor-test.tsx new file mode 100644 index 00000000000..8d6f9d19cc4 --- /dev/null +++ b/test/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor-test.tsx @@ -0,0 +1,287 @@ +/* +Copyright 2023 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +import { IEventRelation, MatrixEvent } from "matrix-js-sdk/src/matrix"; +import { waitFor } from "@testing-library/react"; + +import { handleClipboardEvent } from "../../../../../../src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor"; +import { TimelineRenderingType } from "../../../../../../src/contexts/RoomContext"; +import { mkStubRoom, stubClient } from "../../../../../test-utils"; +import ContentMessages from "../../../../../../src/ContentMessages"; +import { IRoomState } from "../../../../../../src/components/structures/RoomView"; + +const mockClient = stubClient(); +const mockRoom = mkStubRoom("mock room", "mock room", mockClient); +const mockRoomState = { + room: mockRoom, + timelineRenderingType: TimelineRenderingType.Room, + replyToEvent: {} as unknown as MatrixEvent, +} as unknown as IRoomState; + +const sendContentListToRoomSpy = jest.spyOn(ContentMessages.sharedInstance(), "sendContentListToRoom"); +const sendContentToRoomSpy = jest.spyOn(ContentMessages.sharedInstance(), "sendContentToRoom"); +const fetchSpy = jest.spyOn(window, "fetch"); +const logSpy = jest.spyOn(console, "log").mockImplementation(() => {}); + +describe("handleClipboardEvent", () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + afterAll(() => { + jest.restoreAllMocks(); + }); + + function createMockClipboardEvent(props: any): ClipboardEvent { + return { clipboardData: { files: [], types: [] }, ...props } as ClipboardEvent; + } + + it("returns false if it is not a paste event", () => { + const originalEvent = createMockClipboardEvent({ type: "copy" }); + const output = handleClipboardEvent(originalEvent, originalEvent.clipboardData, mockRoomState, mockClient); + + expect(output).toBe(false); + }); + + it("returns false if clipboard data is null", () => { + const originalEvent = createMockClipboardEvent({ type: "paste", clipboardData: null }); + const output = handleClipboardEvent(originalEvent, originalEvent.clipboardData, mockRoomState, mockClient); + + expect(output).toBe(false); + }); + + it("returns false if room is undefined", () => { + const originalEvent = createMockClipboardEvent({ type: "paste" }); + const { room, ...roomStateWithoutRoom } = mockRoomState; + const output = handleClipboardEvent( + originalEvent, + originalEvent.clipboardData, + roomStateWithoutRoom, + mockClient, + ); + + expect(output).toBe(false); + }); + + it("returns false if room clipboardData files and types are empty", () => { + const originalEvent = createMockClipboardEvent({ + type: "paste", + clipboardData: { files: [], types: [] }, + }); + const output = handleClipboardEvent(originalEvent, originalEvent.clipboardData, mockRoomState, mockClient); + expect(output).toBe(false); + }); + + it("handles event and calls sendContentListToRoom when data files are present", () => { + const originalEvent = createMockClipboardEvent({ + type: "paste", + clipboardData: { files: ["something here"], types: [] }, + }); + const output = handleClipboardEvent(originalEvent, originalEvent.clipboardData, mockRoomState, mockClient); + + expect(sendContentListToRoomSpy).toHaveBeenCalledTimes(1); + expect(sendContentListToRoomSpy).toHaveBeenCalledWith( + originalEvent.clipboardData?.files, + mockRoom.roomId, + undefined, // this is the event relation, an optional arg + mockClient, + mockRoomState.timelineRenderingType, + ); + expect(output).toBe(true); + }); + + it("calls sendContentListToRoom with eventRelation when present", () => { + const originalEvent = createMockClipboardEvent({ + type: "paste", + clipboardData: { files: ["something here"], types: [] }, + }); + const mockEventRelation = {} as unknown as IEventRelation; + const output = handleClipboardEvent( + originalEvent, + originalEvent.clipboardData, + mockRoomState, + mockClient, + mockEventRelation, + ); + + expect(sendContentListToRoomSpy).toHaveBeenCalledTimes(1); + expect(sendContentListToRoomSpy).toHaveBeenCalledWith( + originalEvent.clipboardData?.files, + mockRoom.roomId, + mockEventRelation, // this is the event relation, an optional arg + mockClient, + mockRoomState.timelineRenderingType, + ); + expect(output).toBe(true); + }); + + it("calls the error handler when sentContentListToRoom errors", async () => { + const mockErrorMessage = "something went wrong"; + sendContentListToRoomSpy.mockRejectedValueOnce(new Error(mockErrorMessage)); + + const originalEvent = createMockClipboardEvent({ + type: "paste", + clipboardData: { files: ["something here"], types: [] }, + }); + const mockEventRelation = {} as unknown as IEventRelation; + const output = handleClipboardEvent( + originalEvent, + originalEvent.clipboardData, + mockRoomState, + mockClient, + mockEventRelation, + ); + + expect(sendContentListToRoomSpy).toHaveBeenCalledTimes(1); + await waitFor(() => { + expect(logSpy).toHaveBeenCalledWith(mockErrorMessage); + }); + expect(output).toBe(true); + }); + + it("calls the error handler when data types has text/html but data can not be parsed", () => { + const originalEvent = createMockClipboardEvent({ + type: "paste", + clipboardData: { + files: [], + types: ["text/html"], + getData: jest.fn().mockReturnValue("
invalid html"), + }, + }); + const mockEventRelation = {} as unknown as IEventRelation; + const output = handleClipboardEvent( + originalEvent, + originalEvent.clipboardData, + mockRoomState, + mockClient, + mockEventRelation, + ); + + expect(logSpy).toHaveBeenCalledWith("Failed to handle pasted content as Safari inserted content"); + expect(output).toBe(false); + }); + + it("calls fetch when data types has text/html and data can parsed", () => { + const originalEvent = createMockClipboardEvent({ + type: "paste", + clipboardData: { + files: [], + types: ["text/html"], + getData: jest.fn().mockReturnValue(``), + }, + }); + const mockEventRelation = {} as unknown as IEventRelation; + handleClipboardEvent(originalEvent, originalEvent.clipboardData, mockRoomState, mockClient, mockEventRelation); + + expect(fetchSpy).toHaveBeenCalledTimes(1); + expect(fetchSpy).toHaveBeenCalledWith("blob:"); + }); + + it("calls error handler when fetch fails", async () => { + const mockErrorMessage = "fetch failed"; + fetchSpy.mockRejectedValueOnce(mockErrorMessage); + const originalEvent = createMockClipboardEvent({ + type: "paste", + clipboardData: { + files: [], + types: ["text/html"], + getData: jest.fn().mockReturnValue(``), + }, + }); + const mockEventRelation = {} as unknown as IEventRelation; + const output = handleClipboardEvent( + originalEvent, + originalEvent.clipboardData, + mockRoomState, + mockClient, + mockEventRelation, + ); + + await waitFor(() => { + expect(logSpy).toHaveBeenCalledWith(mockErrorMessage); + }); + expect(output).toBe(true); + }); + + it("calls sendContentToRoom when parsing is successful", async () => { + fetchSpy.mockResolvedValueOnce({ + url: "test/file", + blob: () => { + return Promise.resolve({ type: "image/jpeg" } as Blob); + }, + } as Response); + + const originalEvent = createMockClipboardEvent({ + type: "paste", + clipboardData: { + files: [], + types: ["text/html"], + getData: jest.fn().mockReturnValue(``), + }, + }); + const mockEventRelation = {} as unknown as IEventRelation; + const output = handleClipboardEvent( + originalEvent, + originalEvent.clipboardData, + mockRoomState, + mockClient, + mockEventRelation, + ); + + await waitFor(() => { + expect(sendContentToRoomSpy).toHaveBeenCalledWith( + expect.any(File), + mockRoom.roomId, + mockEventRelation, + mockClient, + mockRoomState.replyToEvent, + ); + }); + expect(output).toBe(true); + }); + + it("calls error handler when parsing is not successful", async () => { + fetchSpy.mockResolvedValueOnce({ + url: "test/file", + blob: () => { + return Promise.resolve({ type: "image/jpeg" } as Blob); + }, + } as Response); + const mockErrorMessage = "sendContentToRoom failed"; + sendContentToRoomSpy.mockRejectedValueOnce(mockErrorMessage); + + const originalEvent = createMockClipboardEvent({ + type: "paste", + clipboardData: { + files: [], + types: ["text/html"], + getData: jest.fn().mockReturnValue(``), + }, + }); + const mockEventRelation = {} as unknown as IEventRelation; + const output = handleClipboardEvent( + originalEvent, + originalEvent.clipboardData, + mockRoomState, + mockClient, + mockEventRelation, + ); + + await waitFor(() => { + expect(logSpy).toHaveBeenCalledWith(mockErrorMessage); + }); + expect(output).toBe(true); + }); +}); diff --git a/yarn.lock b/yarn.lock index 781a71fd467..30f65ad079c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1598,10 +1598,10 @@ resolved "https://registry.yarnpkg.com/@matrix-org/matrix-sdk-crypto-js/-/matrix-sdk-crypto-js-0.1.0-alpha.10.tgz#b6a6395cffd3197ae2e0a88f4eeae8b315571fd2" integrity sha512-8V2NKuzGOFzEZeZVgF2is7gmuopdRbMZ064tzPDE0vN34iX6s3O8A4oxIT7SA3qtymwm3t1yEvTnT+0gfbmh4g== -"@matrix-org/matrix-wysiwyg@^2.0.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@matrix-org/matrix-wysiwyg/-/matrix-wysiwyg-2.2.1.tgz#076b409c0ffe655938d663863b1ee546a7101da6" - integrity sha512-QF4dJsyqBMxZx+GhSdSiRSDIuwE5dxd7vffQ5i6hf67bd0EbVvtf4PzWmNopGHA+ckjMJIc5X1EPT+6DG/wM6Q== +"@matrix-org/matrix-wysiwyg@^2.2.2": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@matrix-org/matrix-wysiwyg/-/matrix-wysiwyg-2.2.2.tgz#911d0a9858a5a4b620f93777085daac8eff6a220" + integrity sha512-FprkgKiqEHoFUfaamKwTGBENqDxbORFgoPjiE1b9yPS3hgRswobVKRl4qrXgVgFj4qQ7gWeTqogiyrHXkm1myw== "@matrix-org/olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.14.tgz": version "3.2.14" From 53b42e321777a598aaf2bb3eab22d710569f83a8 Mon Sep 17 00:00:00 2001 From: maheichyk Date: Fri, 9 Jun 2023 15:33:54 +0300 Subject: [PATCH 41/54] Show room options menu if "UIComponent.roomOptionsMenu" is enabled (#10365) * Show room options menu if "UIComponent.roomOptionsMenu" is enabled Signed-off-by: Mikhail Aheichyk * Explicit type is removed. Signed-off-by: Mikhail Aheichyk --------- Signed-off-by: Mikhail Aheichyk Co-authored-by: Mikhail Aheichyk --- .../spotlight/RoomResultContextMenus.tsx | 26 ++++---- src/components/views/rooms/RoomHeader.tsx | 4 +- src/components/views/rooms/RoomTile.tsx | 4 +- src/settings/UIFeature.ts | 5 ++ .../spotlight/RoomResultContextMenus-test.tsx | 66 +++++++++++++++++++ .../views/rooms/RoomHeader-test.tsx | 27 ++++++-- test/components/views/rooms/RoomTile-test.tsx | 40 ++++++++--- 7 files changed, 143 insertions(+), 29 deletions(-) create mode 100644 test/components/views/dialogs/spotlight/RoomResultContextMenus-test.tsx diff --git a/src/components/views/dialogs/spotlight/RoomResultContextMenus.tsx b/src/components/views/dialogs/spotlight/RoomResultContextMenus.tsx index 096138e056f..f761c350997 100644 --- a/src/components/views/dialogs/spotlight/RoomResultContextMenus.tsx +++ b/src/components/views/dialogs/spotlight/RoomResultContextMenus.tsx @@ -27,6 +27,8 @@ import { RoomNotificationContextMenu } from "../../context_menus/RoomNotificatio import SpaceContextMenu from "../../context_menus/SpaceContextMenu"; import { ButtonEvent } from "../../elements/AccessibleButton"; import { contextMenuBelow } from "../../rooms/RoomTile"; +import { shouldShowComponent } from "../../../../customisations/helpers/UIComponents"; +import { UIComponent } from "../../../../settings/UIFeature"; interface Props { room: Room; @@ -80,18 +82,20 @@ export function RoomResultContextMenus({ room }: Props): JSX.Element { return ( - { - ev.preventDefault(); - ev.stopPropagation(); + {shouldShowComponent(UIComponent.RoomOptionsMenu) && ( + { + ev.preventDefault(); + ev.stopPropagation(); - const target = ev.target as HTMLElement; - setGeneralMenuPosition(target.getBoundingClientRect()); - }} - title={room.isSpaceRoom() ? _t("Space options") : _t("Room options")} - isExpanded={generalMenuPosition !== null} - /> + const target = ev.target as HTMLElement; + setGeneralMenuPosition(target.getBoundingClientRect()); + }} + title={room.isSpaceRoom() ? _t("Space options") : _t("Room options")} + isExpanded={generalMenuPosition !== null} + /> + )} {!room.isSpaceRoom() && ( { ); - if (this.props.enableRoomOptionsMenu) { + if (this.props.enableRoomOptionsMenu && shouldShowComponent(UIComponent.RoomOptionsMenu)) { return ( { }; private get showContextMenu(): boolean { - return this.props.tag !== DefaultTagID.Invite; + return this.props.tag !== DefaultTagID.Invite && shouldShowComponent(UIComponent.RoomOptionsMenu); } private get showMessagePreview(): boolean { diff --git a/src/settings/UIFeature.ts b/src/settings/UIFeature.ts index b9e290ffeca..a8d3f788ef5 100644 --- a/src/settings/UIFeature.ts +++ b/src/settings/UIFeature.ts @@ -70,4 +70,9 @@ export enum UIComponent { * Component that lead to the user being able to search, dial, explore rooms */ FilterContainer = "UIComponent.filterContainer", + + /** + * Components that lead the user to room options menu. + */ + RoomOptionsMenu = "UIComponent.roomOptionsMenu", } diff --git a/test/components/views/dialogs/spotlight/RoomResultContextMenus-test.tsx b/test/components/views/dialogs/spotlight/RoomResultContextMenus-test.tsx new file mode 100644 index 00000000000..0ead500a072 --- /dev/null +++ b/test/components/views/dialogs/spotlight/RoomResultContextMenus-test.tsx @@ -0,0 +1,66 @@ +/* +Copyright 2023 Mikhail Aheichyk +Copyright 2023 Nordeck IT + Consulting GmbH. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from "react"; +import { render, screen, RenderResult } from "@testing-library/react"; +import { mocked } from "jest-mock"; +import { Room } from "matrix-js-sdk/src/models/room"; +import { MatrixClient, PendingEventOrdering } from "matrix-js-sdk/src/client"; + +import { RoomResultContextMenus } from "../../../../../src/components/views/dialogs/spotlight/RoomResultContextMenus"; +import { filterConsole, stubClient } from "../../../../test-utils"; +import { shouldShowComponent } from "../../../../../src/customisations/helpers/UIComponents"; +import { UIComponent } from "../../../../../src/settings/UIFeature"; + +jest.mock("../../../../../src/customisations/helpers/UIComponents", () => ({ + shouldShowComponent: jest.fn(), +})); + +describe("RoomResultContextMenus", () => { + let client: MatrixClient; + let room: Room; + + const renderRoomResultContextMenus = (): RenderResult => { + return render(); + }; + + filterConsole( + // irrelevant for this test + "Room !1:example.org does not have an m.room.create event", + ); + + beforeEach(() => { + client = stubClient(); + room = new Room("!1:example.org", client, "@alice:example.org", { + pendingEventOrdering: PendingEventOrdering.Detached, + }); + }); + + it("does not render the room options context menu when UIComponent customisations disable room options", () => { + mocked(shouldShowComponent).mockReturnValue(false); + renderRoomResultContextMenus(); + expect(shouldShowComponent).toHaveBeenCalledWith(UIComponent.RoomOptionsMenu); + expect(screen.queryByRole("button", { name: "Room options" })).not.toBeInTheDocument(); + }); + + it("renders the room options context menu when UIComponent customisations enable room options", () => { + mocked(shouldShowComponent).mockReturnValue(true); + renderRoomResultContextMenus(); + expect(shouldShowComponent).toHaveBeenCalledWith(UIComponent.RoomOptionsMenu); + expect(screen.queryByRole("button", { name: "Room options" })).toBeInTheDocument(); + }); +}); diff --git a/test/components/views/rooms/RoomHeader-test.tsx b/test/components/views/rooms/RoomHeader-test.tsx index 3b8aa0d2d0e..ea920cf4d59 100644 --- a/test/components/views/rooms/RoomHeader-test.tsx +++ b/test/components/views/rooms/RoomHeader-test.tsx @@ -57,6 +57,12 @@ import { WidgetMessagingStore } from "../../../../src/stores/widgets/WidgetMessa import WidgetUtils from "../../../../src/utils/WidgetUtils"; import { ElementWidgetActions } from "../../../../src/stores/widgets/ElementWidgetActions"; import MediaDeviceHandler, { MediaDeviceKindEnum } from "../../../../src/MediaDeviceHandler"; +import { shouldShowComponent } from "../../../../src/customisations/helpers/UIComponents"; +import { UIComponent } from "../../../../src/settings/UIFeature"; + +jest.mock("../../../../src/customisations/helpers/UIComponents", () => ({ + shouldShowComponent: jest.fn(), +})); describe("RoomHeader", () => { let client: Mocked; @@ -729,17 +735,26 @@ describe("RoomHeader", () => { expect(wrapper.container.querySelector(".mx_RoomHeader_button")).toBeFalsy(); }); - it("should render the room options context menu if not passing enableRoomOptionsMenu (default true)", () => { + it("should render the room options context menu if not passing enableRoomOptionsMenu (default true) and UIComponent customisations room options enabled", () => { + mocked(shouldShowComponent).mockReturnValue(true); const room = createRoom({ name: "Room", isDm: false, userIds: [] }); const wrapper = mountHeader(room); + expect(shouldShowComponent).toHaveBeenCalledWith(UIComponent.RoomOptionsMenu); expect(wrapper.container.querySelector(".mx_RoomHeader_name.mx_AccessibleButton")).toBeDefined(); }); - it("should not render the room options context menu if passing enableRoomOptionsMenu = false", () => { - const room = createRoom({ name: "Room", isDm: false, userIds: [] }); - const wrapper = mountHeader(room, { enableRoomOptionsMenu: false }); - expect(wrapper.container.querySelector(".mx_RoomHeader_name.mx_AccessibleButton")).toBeFalsy(); - }); + it.each([ + [false, true], + [true, false], + ])( + "should not render the room options context menu if passing enableRoomOptionsMenu = %s and UIComponent customisations room options enable = %s", + (enableRoomOptionsMenu, showRoomOptionsMenu) => { + mocked(shouldShowComponent).mockReturnValue(showRoomOptionsMenu); + const room = createRoom({ name: "Room", isDm: false, userIds: [] }); + const wrapper = mountHeader(room, { enableRoomOptionsMenu }); + expect(wrapper.container.querySelector(".mx_RoomHeader_name.mx_AccessibleButton")).toBeFalsy(); + }, + ); }); interface IRoomCreationInfo { diff --git a/test/components/views/rooms/RoomTile-test.tsx b/test/components/views/rooms/RoomTile-test.tsx index 11df23f97fb..51f06f00058 100644 --- a/test/components/views/rooms/RoomTile-test.tsx +++ b/test/components/views/rooms/RoomTile-test.tsx @@ -47,8 +47,14 @@ import { VoiceBroadcastInfoState } from "../../../../src/voice-broadcast"; import { mkVoiceBroadcastInfoStateEvent } from "../../../voice-broadcast/utils/test-utils"; import { TestSdkContext } from "../../../TestSdkContext"; import { SDKContext } from "../../../../src/contexts/SDKContext"; +import { shouldShowComponent } from "../../../../src/customisations/helpers/UIComponents"; +import { UIComponent } from "../../../../src/settings/UIFeature"; import { MessagePreviewStore } from "../../../../src/stores/room-list/MessagePreviewStore"; +jest.mock("../../../../src/customisations/helpers/UIComponents", () => ({ + shouldShowComponent: jest.fn(), +})); + describe("RoomTile", () => { jest.spyOn(PlatformPeg, "get").mockReturnValue({ overrideBrowserShortcuts: () => false, @@ -69,8 +75,8 @@ describe("RoomTile", () => { }); }; - const renderRoomTile = (): void => { - renderResult = render( + const renderRoomTile = (): RenderResult => { + return render( { let client: Mocked; let voiceBroadcastInfoEvent: MatrixEvent; let room: Room; - let renderResult: RenderResult; let sdkContext: TestSdkContext; let showMessagePreview = false; @@ -148,12 +153,24 @@ describe("RoomTile", () => { }); describe("when message previews are not enabled", () => { - beforeEach(() => { + it("should render the room", () => { + mocked(shouldShowComponent).mockReturnValue(true); + const renderResult = renderRoomTile(); + expect(renderResult.container).toMatchSnapshot(); + }); + + it("does not render the room options context menu when UIComponent customisations disable room options", () => { + mocked(shouldShowComponent).mockReturnValue(false); renderRoomTile(); + expect(shouldShowComponent).toHaveBeenCalledWith(UIComponent.RoomOptionsMenu); + expect(screen.queryByRole("button", { name: "Room options" })).not.toBeInTheDocument(); }); - it("should render the room", () => { - expect(renderResult.container).toMatchSnapshot(); + it("renders the room options context menu when UIComponent customisations enable room options", () => { + mocked(shouldShowComponent).mockReturnValue(true); + renderRoomTile(); + expect(shouldShowComponent).toHaveBeenCalledWith(UIComponent.RoomOptionsMenu); + expect(screen.queryByRole("button", { name: "Room options" })).toBeInTheDocument(); }); describe("when a call starts", () => { @@ -176,13 +193,13 @@ describe("RoomTile", () => { }); afterEach(() => { - renderResult.unmount(); call.destroy(); client.reEmitter.stopReEmitting(room, [RoomStateEvent.Events]); WidgetMessagingStore.instance.stopMessaging(widget, room.roomId); }); it("tracks connection state", async () => { + renderRoomTile(); screen.getByText("Video"); // Insert an await point in the connection method so we can inspect @@ -205,6 +222,7 @@ describe("RoomTile", () => { }); it("tracks participants", () => { + renderRoomTile(); const alice: [RoomMember, Set] = [ mkRoomMember(room.roomId, "@alice:example.org"), new Set(["a"]), @@ -238,6 +256,7 @@ describe("RoomTile", () => { describe("and a live broadcast starts", () => { beforeEach(async () => { + renderRoomTile(); await setUpVoiceBroadcast(VoiceBroadcastInfoState.Started); }); @@ -250,6 +269,7 @@ describe("RoomTile", () => { describe("when a live voice broadcast starts", () => { beforeEach(async () => { + renderRoomTile(); await setUpVoiceBroadcast(VoiceBroadcastInfoState.Started); }); @@ -285,7 +305,7 @@ describe("RoomTile", () => { }); it("should render a room without a message as expected", async () => { - renderRoomTile(); + const renderResult = renderRoomTile(); // flush promises here because the preview is created asynchronously await flushPromises(); expect(renderResult.asFragment()).toMatchSnapshot(); @@ -297,7 +317,7 @@ describe("RoomTile", () => { }); it("should render as expected", async () => { - renderRoomTile(); + const renderResult = renderRoomTile(); expect(await screen.findByText("test message")).toBeInTheDocument(); expect(renderResult.asFragment()).toMatchSnapshot(); }); @@ -309,7 +329,7 @@ describe("RoomTile", () => { }); it("should render as expected", async () => { - renderRoomTile(); + const renderResult = renderRoomTile(); expect(await screen.findByText("test thread reply")).toBeInTheDocument(); expect(renderResult.asFragment()).toMatchSnapshot(); }); From 47ab99f9081acd634b43d41fb8d29bc4f42f0614 Mon Sep 17 00:00:00 2001 From: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> Date: Fri, 9 Jun 2023 16:49:44 +0100 Subject: [PATCH 42/54] remove references to `VerificationBase` (#10996) --- src/components/views/dialogs/IncomingSasDialog.tsx | 5 ++--- .../views/dialogs/IncomingSasDialog-test.tsx | 8 ++++---- .../views/right_panel/VerificationPanel-test.tsx | 10 +++++----- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/components/views/dialogs/IncomingSasDialog.tsx b/src/components/views/dialogs/IncomingSasDialog.tsx index 3772b689fa2..3c99f327b63 100644 --- a/src/components/views/dialogs/IncomingSasDialog.tsx +++ b/src/components/views/dialogs/IncomingSasDialog.tsx @@ -15,8 +15,7 @@ limitations under the License. */ import React, { ReactNode } from "react"; -import { VerificationBase } from "matrix-js-sdk/src/crypto/verification/Base"; -import { GeneratedSas, ShowSasCallbacks, VerifierEvent } from "matrix-js-sdk/src/crypto-api/verification"; +import { GeneratedSas, ShowSasCallbacks, Verifier, VerifierEvent } from "matrix-js-sdk/src/crypto-api/verification"; import { logger } from "matrix-js-sdk/src/logger"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; @@ -37,7 +36,7 @@ const PHASE_VERIFIED = 3; const PHASE_CANCELLED = 4; interface IProps { - verifier: VerificationBase; + verifier: Verifier; onFinished(verified?: boolean): void; } diff --git a/test/components/views/dialogs/IncomingSasDialog-test.tsx b/test/components/views/dialogs/IncomingSasDialog-test.tsx index 61b9f21e03b..7c4962273c9 100644 --- a/test/components/views/dialogs/IncomingSasDialog-test.tsx +++ b/test/components/views/dialogs/IncomingSasDialog-test.tsx @@ -17,10 +17,10 @@ limitations under the License. import { act, render } from "@testing-library/react"; import React from "react"; import { Mocked } from "jest-mock"; -import { VerificationBase } from "matrix-js-sdk/src/crypto/verification/Base"; import { EmojiMapping, ShowSasCallbacks, + Verifier, VerifierEvent, VerifierEventHandlerMap, } from "matrix-js-sdk/src/crypto-api/verification"; @@ -58,16 +58,16 @@ describe("IncomingSasDialog", () => { }); }); -function renderComponent(verifier: VerificationBase, onFinished = () => true) { +function renderComponent(verifier: Verifier, onFinished = () => true) { return render(); } -function makeMockVerifier(): Mocked { +function makeMockVerifier(): Mocked { const verifier = new TypedEventEmitter(); Object.assign(verifier, { cancel: jest.fn(), }); - return verifier as unknown as Mocked; + return verifier as unknown as Mocked; } function makeMockSasCallbacks(): ShowSasCallbacks { diff --git a/test/components/views/right_panel/VerificationPanel-test.tsx b/test/components/views/right_panel/VerificationPanel-test.tsx index 7fdab5248fe..9b43e418b5c 100644 --- a/test/components/views/right_panel/VerificationPanel-test.tsx +++ b/test/components/views/right_panel/VerificationPanel-test.tsx @@ -24,10 +24,10 @@ import { import { TypedEventEmitter } from "matrix-js-sdk/src/models/typed-event-emitter"; import { User } from "matrix-js-sdk/src/models/user"; import { Mocked } from "jest-mock"; -import { VerificationBase } from "matrix-js-sdk/src/crypto/verification/Base"; import { EmojiMapping, ShowSasCallbacks, + Verifier, VerifierEvent, VerifierEventHandlerMap, } from "matrix-js-sdk/src/crypto-api/verification"; @@ -94,13 +94,13 @@ describe("", () => { }); describe("'Verify by emoji' flow", () => { - let mockVerifier: Mocked; + let mockVerifier: Mocked; let mockRequest: Mocked; beforeEach(() => { mockVerifier = makeMockVerifier(); mockRequest = makeMockVerificationRequest({ - verifier: mockVerifier, + verifier: mockVerifier as unknown as VerificationRequest["verifier"], chosenMethod: "m.sas.v1", }); }); @@ -158,7 +158,7 @@ function makeMockVerificationRequest(props: Partial = {}): return request as unknown as Mocked; } -function makeMockVerifier(): Mocked { +function makeMockVerifier(): Mocked { const verifier = new TypedEventEmitter(); Object.assign(verifier, { cancel: jest.fn(), @@ -166,7 +166,7 @@ function makeMockVerifier(): Mocked { getShowSasCallbacks: jest.fn(), getReciprocateQrCodeCallbacks: jest.fn(), }); - return verifier as unknown as Mocked; + return verifier as unknown as Mocked; } function makeMockSasCallbacks(): ShowSasCallbacks { From e32823e5fec61b069e9ddc57b731d6b346bad731 Mon Sep 17 00:00:00 2001 From: alunturner <56027671+alunturner@users.noreply.github.com> Date: Mon, 12 Jun 2023 12:28:00 +0100 Subject: [PATCH 43/54] Allow image pasting in plain mode in RTE (#11056) * get rough funcitonality working * try to tidy up types * fix merge error * fix signature change error * type wrangling * use onBeforeInput listener * add onBeforeInput handler, add logic to onPaste * fix type error * bring plain text listeners in line with useInputEventProcessor * extract common function to util file, move tests * tidy comment * tidy comments * fix typo * add util tests * add text paste test --- .../components/PlainTextComposer.tsx | 5 +- .../hooks/useInputEventProcessor.ts | 103 +--------------- .../hooks/usePlainTextListeners.ts | 34 +++++- .../rooms/wysiwyg_composer/hooks/utils.ts | 110 ++++++++++++++++++ .../components/PlainTextComposer-test.tsx | 12 ++ ...EventProcessor-test.tsx => utils-test.tsx} | 28 ++++- 6 files changed, 188 insertions(+), 104 deletions(-) rename test/components/views/rooms/wysiwyg_composer/hooks/{useInputEventProcessor-test.tsx => utils-test.tsx} (91%) diff --git a/src/components/views/rooms/wysiwyg_composer/components/PlainTextComposer.tsx b/src/components/views/rooms/wysiwyg_composer/components/PlainTextComposer.tsx index efc4971657d..cf54fa7bef2 100644 --- a/src/components/views/rooms/wysiwyg_composer/components/PlainTextComposer.tsx +++ b/src/components/views/rooms/wysiwyg_composer/components/PlainTextComposer.tsx @@ -50,10 +50,12 @@ export function PlainTextComposer({ initialContent, leftComponent, rightComponent, + eventRelation, }: PlainTextComposerProps): JSX.Element { const { ref: editorRef, autocompleteRef, + onBeforeInput, onInput, onPaste, onKeyDown, @@ -63,7 +65,7 @@ export function PlainTextComposer({ onSelect, handleCommand, handleMention, - } = usePlainTextListeners(initialContent, onChange, onSend); + } = usePlainTextListeners(initialContent, onChange, onSend, eventRelation); const composerFunctions = useComposerFunctions(editorRef, setContent); usePlainTextInitialization(initialContent, editorRef); @@ -77,6 +79,7 @@ export function PlainTextComposer({ className={classNames(className, { [`${className}-focused`]: isFocused })} onFocus={onFocus} onBlur={onFocus} + onBeforeInput={onBeforeInput} onInput={onInput} onPaste={onPaste} onKeyDown={onKeyDown} diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor.ts b/src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor.ts index 27f40880140..a9cfa2966e1 100644 --- a/src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor.ts +++ b/src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor.ts @@ -33,10 +33,7 @@ import { isCaretAtEnd, isCaretAtStart } from "../utils/selection"; import { getEventsFromEditorStateTransfer, getEventsFromRoom } from "../utils/event"; import { endEditing } from "../utils/editing"; import Autocomplete from "../../Autocomplete"; -import { handleEventWithAutocomplete } from "./utils"; -import ContentMessages from "../../../../../ContentMessages"; -import { getBlobSafeMimeType } from "../../../../../utils/blobs"; -import { isNotNull } from "../../../../../Typeguards"; +import { handleClipboardEvent, handleEventWithAutocomplete, isEventToHandleAsClipboardEvent } from "./utils"; export function useInputEventProcessor( onSend: () => void, @@ -61,17 +58,8 @@ export function useInputEventProcessor( onSend(); }; - // this is required to handle edge case image pasting in Safari, see - // https://github.com/vector-im/element-web/issues/25327 and it is caught by the - // `beforeinput` listener attached to the composer - const isInputEventForClipboard = - event instanceof InputEvent && event.inputType === "insertFromPaste" && isNotNull(event.dataTransfer); - const isClipboardEvent = event instanceof ClipboardEvent; - - const shouldHandleAsClipboardEvent = isClipboardEvent || isInputEventForClipboard; - - if (shouldHandleAsClipboardEvent) { - const data = isClipboardEvent ? event.clipboardData : event.dataTransfer; + if (isEventToHandleAsClipboardEvent(event)) { + const data = event instanceof ClipboardEvent ? event.clipboardData : event.dataTransfer; const handled = handleClipboardEvent(event, data, roomContext, mxClient, eventRelation); return handled ? null : event; } @@ -244,88 +232,3 @@ function handleInputEvent(event: InputEvent, send: Send, isCtrlEnterToSend: bool return event; } - -/** - * Takes an event and handles image pasting. Returns a boolean to indicate if it has handled - * the event or not. Must accept either clipboard or input events in order to prevent issue: - * https://github.com/vector-im/element-web/issues/25327 - * - * @param event - event to process - * @param roomContext - room in which the event occurs - * @param mxClient - current matrix client - * @param eventRelation - used to send the event to the correct place eg timeline vs thread - * @returns - boolean to show if the event was handled or not - */ -export function handleClipboardEvent( - event: ClipboardEvent | InputEvent, - data: DataTransfer | null, - roomContext: IRoomState, - mxClient: MatrixClient, - eventRelation?: IEventRelation, -): boolean { - // Logic in this function follows that of `SendMessageComposer.onPaste` - const { room, timelineRenderingType, replyToEvent } = roomContext; - - function handleError(error: unknown): void { - if (error instanceof Error) { - console.log(error.message); - } else if (typeof error === "string") { - console.log(error); - } - } - - if (event.type !== "paste" || data === null || room === undefined) { - return false; - } - - // Prioritize text on the clipboard over files if RTF is present as Office on macOS puts a bitmap - // in the clipboard as well as the content being copied. Modern versions of Office seem to not do this anymore. - // We check text/rtf instead of text/plain as when copy+pasting a file from Finder or Gnome Image Viewer - // it puts the filename in as text/plain which we want to ignore. - if (data.files.length && !data.types.includes("text/rtf")) { - ContentMessages.sharedInstance() - .sendContentListToRoom(Array.from(data.files), room.roomId, eventRelation, mxClient, timelineRenderingType) - .catch(handleError); - return true; - } - - // Safari `Insert from iPhone or iPad` - // data.getData("text/html") returns a string like: - if (data.types.includes("text/html")) { - const imgElementStr = data.getData("text/html"); - const parser = new DOMParser(); - const imgDoc = parser.parseFromString(imgElementStr, "text/html"); - - if ( - imgDoc.getElementsByTagName("img").length !== 1 || - !imgDoc.querySelector("img")?.src.startsWith("blob:") || - imgDoc.childNodes.length !== 1 - ) { - handleError("Failed to handle pasted content as Safari inserted content"); - return false; - } - const imgSrc = imgDoc.querySelector("img")!.src; - - fetch(imgSrc) - .then((response) => { - response - .blob() - .then((imgBlob) => { - const type = imgBlob.type; - const safetype = getBlobSafeMimeType(type); - const ext = type.split("/")[1]; - const parts = response.url.split("/"); - const filename = parts[parts.length - 1]; - const file = new File([imgBlob], filename + "." + ext, { type: safetype }); - ContentMessages.sharedInstance() - .sendContentToRoom(file, room.roomId, eventRelation, mxClient, replyToEvent) - .catch(handleError); - }) - .catch(handleError); - }) - .catch(handleError); - return true; - } - - return false; -} diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/usePlainTextListeners.ts b/src/components/views/rooms/wysiwyg_composer/hooks/usePlainTextListeners.ts index 2bccfc444ae..21b43126bb3 100644 --- a/src/components/views/rooms/wysiwyg_composer/hooks/usePlainTextListeners.ts +++ b/src/components/views/rooms/wysiwyg_composer/hooks/usePlainTextListeners.ts @@ -16,13 +16,16 @@ limitations under the License. import { KeyboardEvent, RefObject, SyntheticEvent, useCallback, useRef, useState } from "react"; import { Attributes, MappedSuggestion } from "@matrix-org/matrix-wysiwyg"; +import { IEventRelation } from "matrix-js-sdk/src/matrix"; import { useSettingValue } from "../../../../../hooks/useSettings"; import { IS_MAC, Key } from "../../../../../Keyboard"; import Autocomplete from "../../Autocomplete"; -import { handleEventWithAutocomplete } from "./utils"; +import { handleClipboardEvent, handleEventWithAutocomplete, isEventToHandleAsClipboardEvent } from "./utils"; import { useSuggestion } from "./useSuggestion"; import { isNotNull, isNotUndefined } from "../../../../../Typeguards"; +import { useRoomContext } from "../../../../../contexts/RoomContext"; +import { useMatrixClientContext } from "../../../../../contexts/MatrixClientContext"; function isDivElement(target: EventTarget): target is HTMLDivElement { return target instanceof HTMLDivElement; @@ -59,10 +62,12 @@ export function usePlainTextListeners( initialContent?: string, onChange?: (content: string) => void, onSend?: () => void, + eventRelation?: IEventRelation, ): { ref: RefObject; autocompleteRef: React.RefObject; content?: string; + onBeforeInput(event: SyntheticEvent): void; onInput(event: SyntheticEvent): void; onPaste(event: SyntheticEvent): void; onKeyDown(event: KeyboardEvent): void; @@ -72,6 +77,9 @@ export function usePlainTextListeners( onSelect: (event: SyntheticEvent) => void; suggestion: MappedSuggestion | null; } { + const roomContext = useRoomContext(); + const mxClient = useMatrixClientContext(); + const ref = useRef(null); const autocompleteRef = useRef(null); const [content, setContent] = useState(initialContent); @@ -115,6 +123,27 @@ export function usePlainTextListeners( [setText, enterShouldSend], ); + const onPaste = useCallback( + (event: SyntheticEvent) => { + const { nativeEvent } = event; + let imagePasteWasHandled = false; + + if (isEventToHandleAsClipboardEvent(nativeEvent)) { + const data = + nativeEvent instanceof ClipboardEvent ? nativeEvent.clipboardData : nativeEvent.dataTransfer; + imagePasteWasHandled = handleClipboardEvent(nativeEvent, data, roomContext, mxClient, eventRelation); + } + + // prevent default behaviour and skip call to onInput if the image paste event was handled + if (imagePasteWasHandled) { + event.preventDefault(); + } else { + onInput(event); + } + }, + [eventRelation, mxClient, onInput, roomContext], + ); + const onKeyDown = useCallback( (event: KeyboardEvent) => { // we need autocomplete to take priority when it is open for using enter to select @@ -149,8 +178,9 @@ export function usePlainTextListeners( return { ref, autocompleteRef, + onBeforeInput: onPaste, onInput, - onPaste: onInput, + onPaste, onKeyDown, content, setContent: setText, diff --git a/src/components/views/rooms/wysiwyg_composer/hooks/utils.ts b/src/components/views/rooms/wysiwyg_composer/hooks/utils.ts index 636b5d2bf2a..f95405c3bfd 100644 --- a/src/components/views/rooms/wysiwyg_composer/hooks/utils.ts +++ b/src/components/views/rooms/wysiwyg_composer/hooks/utils.ts @@ -15,12 +15,17 @@ limitations under the License. */ import { MutableRefObject, RefObject } from "react"; +import { IEventRelation, MatrixClient } from "matrix-js-sdk/src/matrix"; +import { WysiwygEvent } from "@matrix-org/matrix-wysiwyg"; import { TimelineRenderingType } from "../../../../../contexts/RoomContext"; import { IRoomState } from "../../../../structures/RoomView"; import Autocomplete from "../../Autocomplete"; import { getKeyBindingsManager } from "../../../../../KeyBindingsManager"; import { KeyBindingAction } from "../../../../../accessibility/KeyboardShortcuts"; +import { getBlobSafeMimeType } from "../../../../../utils/blobs"; +import ContentMessages from "../../../../../ContentMessages"; +import { isNotNull } from "../../../../../Typeguards"; export function focusComposer( composerElement: MutableRefObject, @@ -110,3 +115,108 @@ export function handleEventWithAutocomplete( return handled; } + +/** + * Takes an event and handles image pasting. Returns a boolean to indicate if it has handled + * the event or not. Must accept either clipboard or input events in order to prevent issue: + * https://github.com/vector-im/element-web/issues/25327 + * + * @param event - event to process + * @param data - data from the event to process + * @param roomContext - room in which the event occurs + * @param mxClient - current matrix client + * @param eventRelation - used to send the event to the correct place eg timeline vs thread + * @returns - boolean to show if the event was handled or not + */ +export function handleClipboardEvent( + event: ClipboardEvent | InputEvent, + data: DataTransfer | null, + roomContext: IRoomState, + mxClient: MatrixClient, + eventRelation?: IEventRelation, +): boolean { + // Logic in this function follows that of `SendMessageComposer.onPaste` + const { room, timelineRenderingType, replyToEvent } = roomContext; + + function handleError(error: unknown): void { + if (error instanceof Error) { + console.log(error.message); + } else if (typeof error === "string") { + console.log(error); + } + } + + if (event.type !== "paste" || data === null || room === undefined) { + return false; + } + + // Prioritize text on the clipboard over files if RTF is present as Office on macOS puts a bitmap + // in the clipboard as well as the content being copied. Modern versions of Office seem to not do this anymore. + // We check text/rtf instead of text/plain as when copy+pasting a file from Finder or Gnome Image Viewer + // it puts the filename in as text/plain which we want to ignore. + if (data.files.length && !data.types.includes("text/rtf")) { + ContentMessages.sharedInstance() + .sendContentListToRoom(Array.from(data.files), room.roomId, eventRelation, mxClient, timelineRenderingType) + .catch(handleError); + return true; + } + + // Safari `Insert from iPhone or iPad` + // data.getData("text/html") returns a string like: + if (data.types.includes("text/html")) { + const imgElementStr = data.getData("text/html"); + const parser = new DOMParser(); + const imgDoc = parser.parseFromString(imgElementStr, "text/html"); + + if ( + imgDoc.getElementsByTagName("img").length !== 1 || + !imgDoc.querySelector("img")?.src.startsWith("blob:") || + imgDoc.childNodes.length !== 1 + ) { + handleError("Failed to handle pasted content as Safari inserted content"); + return false; + } + const imgSrc = imgDoc.querySelector("img")!.src; + + fetch(imgSrc) + .then((response) => { + response + .blob() + .then((imgBlob) => { + const type = imgBlob.type; + const safetype = getBlobSafeMimeType(type); + const ext = type.split("/")[1]; + const parts = response.url.split("/"); + const filename = parts[parts.length - 1]; + const file = new File([imgBlob], filename + "." + ext, { type: safetype }); + ContentMessages.sharedInstance() + .sendContentToRoom(file, room.roomId, eventRelation, mxClient, replyToEvent) + .catch(handleError); + }) + .catch(handleError); + }) + .catch(handleError); + return true; + } + + return false; +} + +/** + * Util to determine if an input event or clipboard event must be handled as a clipboard event. + * Due to https://github.com/vector-im/element-web/issues/25327, certain paste events + * must be listenened for with an onBeforeInput handler and so will be caught as input events. + * + * @param event - the event to test, can be a WysiwygEvent if it comes from the rich text editor, or + * input or clipboard events if from the plain text editor + * @returns - true if event should be handled as a clipboard event + */ +export function isEventToHandleAsClipboardEvent( + event: WysiwygEvent | InputEvent | ClipboardEvent, +): event is InputEvent | ClipboardEvent { + const isInputEventForClipboard = + event instanceof InputEvent && event.inputType === "insertFromPaste" && isNotNull(event.dataTransfer); + const isClipboardEvent = event instanceof ClipboardEvent; + + return isClipboardEvent || isInputEventForClipboard; +} diff --git a/test/components/views/rooms/wysiwyg_composer/components/PlainTextComposer-test.tsx b/test/components/views/rooms/wysiwyg_composer/components/PlainTextComposer-test.tsx index 9277ecb16c7..cb7104f8e4c 100644 --- a/test/components/views/rooms/wysiwyg_composer/components/PlainTextComposer-test.tsx +++ b/test/components/views/rooms/wysiwyg_composer/components/PlainTextComposer-test.tsx @@ -290,4 +290,16 @@ describe("PlainTextComposer", () => { expect(screen.getByTestId("autocomplete-wrapper")).toBeInTheDocument(); }); + + it("Should allow pasting of text values", async () => { + customRender(); + + const textBox = screen.getByRole("textbox"); + + await userEvent.click(textBox); + await userEvent.type(textBox, "hello"); + await userEvent.paste(" world"); + + expect(textBox).toHaveTextContent("hello world"); + }); }); diff --git a/test/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor-test.tsx b/test/components/views/rooms/wysiwyg_composer/hooks/utils-test.tsx similarity index 91% rename from test/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor-test.tsx rename to test/components/views/rooms/wysiwyg_composer/hooks/utils-test.tsx index 8d6f9d19cc4..81489e3beb4 100644 --- a/test/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor-test.tsx +++ b/test/components/views/rooms/wysiwyg_composer/hooks/utils-test.tsx @@ -16,11 +16,14 @@ limitations under the License. import { IEventRelation, MatrixEvent } from "matrix-js-sdk/src/matrix"; import { waitFor } from "@testing-library/react"; -import { handleClipboardEvent } from "../../../../../../src/components/views/rooms/wysiwyg_composer/hooks/useInputEventProcessor"; import { TimelineRenderingType } from "../../../../../../src/contexts/RoomContext"; import { mkStubRoom, stubClient } from "../../../../../test-utils"; import ContentMessages from "../../../../../../src/ContentMessages"; import { IRoomState } from "../../../../../../src/components/structures/RoomView"; +import { + handleClipboardEvent, + isEventToHandleAsClipboardEvent, +} from "../../../../../../src/components/views/rooms/wysiwyg_composer/hooks/utils"; const mockClient = stubClient(); const mockRoom = mkStubRoom("mock room", "mock room", mockClient); @@ -285,3 +288,26 @@ describe("handleClipboardEvent", () => { expect(output).toBe(true); }); }); + +describe("isEventToHandleAsClipboardEvent", () => { + it("returns true for ClipboardEvent", () => { + const input = new ClipboardEvent("clipboard"); + expect(isEventToHandleAsClipboardEvent(input)).toBe(true); + }); + + it("returns true for special case input", () => { + const input = new InputEvent("insertFromPaste", { inputType: "insertFromPaste" }); + Object.assign(input, { dataTransfer: "not null" }); + expect(isEventToHandleAsClipboardEvent(input)).toBe(true); + }); + + it("returns false for regular InputEvent", () => { + const input = new InputEvent("input"); + expect(isEventToHandleAsClipboardEvent(input)).toBe(false); + }); + + it("returns false for other input", () => { + const input = new KeyboardEvent("keyboard"); + expect(isEventToHandleAsClipboardEvent(input)).toBe(false); + }); +}); From a40d1ec670de3f73355d43475bb0fdca3b7decee Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 12 Jun 2023 14:47:59 +0200 Subject: [PATCH 44/54] Update definitelyTyped (#11065) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Michael Telatynski <7t3chguy@gmail.com> --- yarn.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index 30f65ad079c..f1c7b44dcca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2247,9 +2247,9 @@ integrity sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw== "@types/lodash@^4.14.168": - version "4.14.194" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.194.tgz#b71eb6f7a0ff11bff59fc987134a093029258a76" - integrity sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g== + version "4.14.195" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" + integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== "@types/mapbox__point-geometry@*", "@types/mapbox__point-geometry@^0.1.2": version "0.1.2" @@ -2294,9 +2294,9 @@ integrity sha512-iL0PIMwejpmuVHgfibHpfDwOdsbmB50wr21X71VnF5d7SsBF7WK+ZvP/SCcFm7Iwb9iiYSap9rlrdhToNAWdxg== "@types/node@^16": - version "16.18.31" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.31.tgz#7de39c2b9363f0d95b129cc969fcbf98e870251c" - integrity sha512-KPXltf4z4g517OlVJO9XQ2357CYw7fvuJ3ZuBynjXC5Jos9i+K7LvFb7bUIwtJXSZj0vTp9Q6NJBSQpkwwO8Zw== + version "16.18.34" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.34.tgz#62d2099b30339dec4b1b04a14c96266459d7c8b2" + integrity sha512-VmVm7gXwhkUimRfBwVI1CHhwp86jDWR04B5FGebMMyxV90SlCmFujwUHrxTD4oO+SOYU86SoxvhgeRQJY7iXFg== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2314,9 +2314,9 @@ integrity sha512-EDrLIPaPXOZqDjrkzxxbX7UlJSeQVgah3i0aA4pOSzmK9zq3BIh7/MZIQxED7slJByvKM4Gc6Hypyu2lJzh3SQ== "@types/prettier@^2.1.5": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@*": version "15.7.5" From d5d1ec775caf2d3c9132122c1243898e99fdb2da Mon Sep 17 00:00:00 2001 From: Florian Duros Date: Mon, 12 Jun 2023 20:33:39 +0200 Subject: [PATCH 45/54] Use new api `CryptoApi.getCrossSigningStatus` in `CrossSigningPanel` (#11052) * Use new api `CryptoApi.getCrossSigningStatus` in `CrossSigningPanel` * Update `CrossSigningPanel-test.tsx` * Update `publicKeysOnDevice` * Fix `CryptoApi` import * Fix strict type * Fix tests * Remove `crossSigningInfo` in `mockClientMethodsCrypto` * Move matrix client initialization in `beforeEach` --- .../views/settings/CrossSigningPanel.tsx | 16 ++++--- .../views/settings/CrossSigningPanel-test.tsx | 42 ++++++++++++------- test/test-utils/client.ts | 15 +++++-- 3 files changed, 45 insertions(+), 28 deletions(-) diff --git a/src/components/views/settings/CrossSigningPanel.tsx b/src/components/views/settings/CrossSigningPanel.tsx index fdc54dee6ed..c9208ca9034 100644 --- a/src/components/views/settings/CrossSigningPanel.tsx +++ b/src/components/views/settings/CrossSigningPanel.tsx @@ -90,17 +90,15 @@ export default class CrossSigningPanel extends React.PureComponent<{}, IState> { private async getUpdatedStatus(): Promise { const cli = MatrixClientPeg.get(); - const crypto = cli.crypto; + const crypto = cli.getCrypto(); if (!crypto) return; - const pkCache = cli.getCrossSigningCacheCallbacks(); - const crossSigning = crypto.crossSigningInfo; - const secretStorage = cli.secretStorage; - const crossSigningPublicKeysOnDevice = Boolean(crossSigning.getId()); - const crossSigningPrivateKeysInStorage = Boolean(await crossSigning.isStoredInSecretStorage(secretStorage)); - const masterPrivateKeyCached = !!(await pkCache?.getCrossSigningKeyCache?.("master")); - const selfSigningPrivateKeyCached = !!(await pkCache?.getCrossSigningKeyCache?.("self_signing")); - const userSigningPrivateKeyCached = !!(await pkCache?.getCrossSigningKeyCache?.("user_signing")); + const crossSigningStatus = await crypto.getCrossSigningStatus(); + const crossSigningPublicKeysOnDevice = crossSigningStatus.publicKeysOnDevice; + const crossSigningPrivateKeysInStorage = crossSigningStatus.privateKeysInSecretStorage; + const masterPrivateKeyCached = crossSigningStatus.privateKeysCachedLocally.masterKey; + const selfSigningPrivateKeyCached = crossSigningStatus.privateKeysCachedLocally.selfSigningKey; + const userSigningPrivateKeyCached = crossSigningStatus.privateKeysCachedLocally.userSigningKey; const homeserverSupportsCrossSigning = await cli.doesServerSupportUnstableFeature( "org.matrix.e2e_cross_signing", ); diff --git a/test/components/views/settings/CrossSigningPanel-test.tsx b/test/components/views/settings/CrossSigningPanel-test.tsx index a41c55c48a3..b9fd22dc44c 100644 --- a/test/components/views/settings/CrossSigningPanel-test.tsx +++ b/test/components/views/settings/CrossSigningPanel-test.tsx @@ -16,7 +16,8 @@ limitations under the License. import React from "react"; import { render, screen } from "@testing-library/react"; -import { mocked } from "jest-mock"; +import { Mocked, mocked } from "jest-mock"; +import { MatrixClient } from "matrix-js-sdk/src/matrix"; import CrossSigningPanel from "../../../../src/components/views/settings/CrossSigningPanel"; import { @@ -28,17 +29,18 @@ import { describe("", () => { const userId = "@alice:server.org"; - const mockClient = getMockClientWithEventEmitter({ - ...mockClientMethodsUser(userId), - ...mockClientMethodsCrypto(), - doesServerSupportUnstableFeature: jest.fn(), - }); + let mockClient: Mocked; const getComponent = () => render(); beforeEach(() => { + mockClient = getMockClientWithEventEmitter({ + ...mockClientMethodsUser(userId), + ...mockClientMethodsCrypto(), + doesServerSupportUnstableFeature: jest.fn(), + }); + mockClient.doesServerSupportUnstableFeature.mockResolvedValue(true); mockClient.isCrossSigningReady.mockResolvedValue(false); - mocked(mockClient.crypto!.crossSigningInfo).isStoredInSecretStorage.mockClear().mockResolvedValue(null); }); it("should render a spinner while loading", () => { @@ -72,15 +74,20 @@ describe("", () => { }); it("should render when keys are backed up", async () => { - mocked(mockClient.crypto!.crossSigningInfo).isStoredInSecretStorage.mockResolvedValue({ test: {} }); + mocked(mockClient.getCrypto()!.getCrossSigningStatus).mockResolvedValue({ + publicKeysOnDevice: true, + privateKeysInSecretStorage: true, + privateKeysCachedLocally: { + masterKey: true, + selfSigningKey: true, + userSigningKey: true, + }, + }); getComponent(); await flushPromises(); expect(screen.getByTestId("summarised-status").innerHTML).toEqual("✅ Cross-signing is ready for use."); expect(screen.getByText("Cross-signing private keys:").parentElement!).toMatchSnapshot(); - expect(mockClient.crypto!.crossSigningInfo.isStoredInSecretStorage).toHaveBeenCalledWith( - mockClient.secretStorage, - ); }); }); @@ -97,7 +104,15 @@ describe("", () => { }); it("should render when keys are backed up", async () => { - mocked(mockClient.crypto!.crossSigningInfo).isStoredInSecretStorage.mockResolvedValue({ test: {} }); + mocked(mockClient.getCrypto()!.getCrossSigningStatus).mockResolvedValue({ + publicKeysOnDevice: true, + privateKeysInSecretStorage: true, + privateKeysCachedLocally: { + masterKey: true, + selfSigningKey: true, + userSigningKey: true, + }, + }); getComponent(); await flushPromises(); @@ -105,9 +120,6 @@ describe("", () => { "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.", ); expect(screen.getByText("Cross-signing private keys:").parentElement!).toMatchSnapshot(); - expect(mockClient.crypto!.crossSigningInfo.isStoredInSecretStorage).toHaveBeenCalledWith( - mockClient.secretStorage, - ); }); }); }); diff --git a/test/test-utils/client.ts b/test/test-utils/client.ts index 88b064dbb88..177e06abc1b 100644 --- a/test/test-utils/client.ts +++ b/test/test-utils/client.ts @@ -156,9 +156,16 @@ export const mockClientMethodsCrypto = (): Partial< crypto: { isSecretStorageReady: jest.fn(), getSessionBackupPrivateKey: jest.fn(), - crossSigningInfo: { - getId: jest.fn(), - isStoredInSecretStorage: jest.fn(), - }, }, + getCrypto: jest.fn().mockReturnValue({ + getCrossSigningStatus: jest.fn().mockResolvedValue({ + publicKeysOnDevice: true, + privateKeysInSecretStorage: false, + privateKeysCachedLocally: { + masterKey: true, + selfSigningKey: true, + userSigningKey: true, + }, + }), + }), }); From 41dfec20bfe9b62cddbbbf621bef2e9aa9685157 Mon Sep 17 00:00:00 2001 From: Kerry Date: Tue, 13 Jun 2023 13:43:25 +1200 Subject: [PATCH 46/54] add delegatedauthentication to validated server config (#11053) --- src/utils/AutoDiscoveryUtils.tsx | 17 ++++++++++ src/utils/ValidatedServerConfig.ts | 5 +++ test/utils/AutoDiscoveryUtils-test.tsx | 46 ++++++++++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/src/utils/AutoDiscoveryUtils.tsx b/src/utils/AutoDiscoveryUtils.tsx index aaa602abb40..5f1a0448477 100644 --- a/src/utils/AutoDiscoveryUtils.tsx +++ b/src/utils/AutoDiscoveryUtils.tsx @@ -16,8 +16,10 @@ limitations under the License. import React, { ReactNode } from "react"; import { AutoDiscovery, ClientConfig } from "matrix-js-sdk/src/autodiscovery"; +import { IDelegatedAuthConfig, M_AUTHENTICATION } from "matrix-js-sdk/src/client"; import { logger } from "matrix-js-sdk/src/logger"; import { IClientWellKnown } from "matrix-js-sdk/src/matrix"; +import { ValidatedIssuerConfig } from "matrix-js-sdk/src/oidc/validate"; import { _t, UserFriendlyError } from "../languageHandler"; import SdkConfig from "../SdkConfig"; @@ -260,6 +262,20 @@ export default class AutoDiscoveryUtils { throw new UserFriendlyError("Unexpected error resolving homeserver configuration"); } + let delegatedAuthentication = undefined; + if (discoveryResult[M_AUTHENTICATION.stable!]?.state === AutoDiscovery.SUCCESS) { + const { authorizationEndpoint, registrationEndpoint, tokenEndpoint, account, issuer } = discoveryResult[ + M_AUTHENTICATION.stable! + ] as IDelegatedAuthConfig & ValidatedIssuerConfig; + delegatedAuthentication = { + authorizationEndpoint, + registrationEndpoint, + tokenEndpoint, + account, + issuer, + }; + } + return { hsUrl: preferredHomeserverUrl, hsName: preferredHomeserverName, @@ -268,6 +284,7 @@ export default class AutoDiscoveryUtils { isDefault: false, warning: hsResult.error, isNameResolvable: !isSynthetic, + delegatedAuthentication, } as ValidatedServerConfig; } } diff --git a/src/utils/ValidatedServerConfig.ts b/src/utils/ValidatedServerConfig.ts index bac271eef6a..4b58b1ef909 100644 --- a/src/utils/ValidatedServerConfig.ts +++ b/src/utils/ValidatedServerConfig.ts @@ -14,6 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. */ +import { IDelegatedAuthConfig } from "matrix-js-sdk/src/client"; +import { ValidatedIssuerConfig } from "matrix-js-sdk/src/oidc/validate"; + export interface ValidatedServerConfig { hsUrl: string; hsName: string; @@ -26,4 +29,6 @@ export interface ValidatedServerConfig { isNameResolvable: boolean; warning: string | Error; + + delegatedAuthentication?: IDelegatedAuthConfig & ValidatedIssuerConfig; } diff --git a/test/utils/AutoDiscoveryUtils-test.tsx b/test/utils/AutoDiscoveryUtils-test.tsx index 7282f9a8241..a47532179c3 100644 --- a/test/utils/AutoDiscoveryUtils-test.tsx +++ b/test/utils/AutoDiscoveryUtils-test.tsx @@ -16,6 +16,7 @@ limitations under the License. import { AutoDiscovery, AutoDiscoveryAction, ClientConfig } from "matrix-js-sdk/src/autodiscovery"; import { logger } from "matrix-js-sdk/src/logger"; +import { M_AUTHENTICATION } from "matrix-js-sdk/src/client"; import AutoDiscoveryUtils from "../../src/utils/AutoDiscoveryUtils"; @@ -186,5 +187,50 @@ describe("AutoDiscoveryUtils", () => { warning: "Homeserver URL does not appear to be a valid Matrix homeserver", }); }); + + it("ignores delegated auth config when discovery was not successful", () => { + const discoveryResult = { + ...validIsConfig, + ...validHsConfig, + [M_AUTHENTICATION.stable!]: { + state: AutoDiscoveryAction.FAIL_ERROR, + error: "", + }, + }; + const syntaxOnly = true; + expect( + AutoDiscoveryUtils.buildValidatedConfigFromDiscovery(serverName, discoveryResult, syntaxOnly), + ).toEqual({ + ...expectedValidatedConfig, + delegatedAuthentication: undefined, + warning: undefined, + }); + }); + + it("sets delegated auth config when discovery was successful", () => { + const authConfig = { + issuer: "https://test.com/", + authorizationEndpoint: "https://test.com/auth", + registrationEndpoint: "https://test.com/registration", + tokenEndpoint: "https://test.com/token", + }; + const discoveryResult = { + ...validIsConfig, + ...validHsConfig, + [M_AUTHENTICATION.stable!]: { + state: AutoDiscoveryAction.SUCCESS, + error: null, + ...authConfig, + }, + }; + const syntaxOnly = true; + expect( + AutoDiscoveryUtils.buildValidatedConfigFromDiscovery(serverName, discoveryResult, syntaxOnly), + ).toEqual({ + ...expectedValidatedConfig, + delegatedAuthentication: authConfig, + warning: undefined, + }); + }); }); }); From f7137b4cb464fa7c184ea97203b05cf4873e3a15 Mon Sep 17 00:00:00 2001 From: Kerry Date: Tue, 13 Jun 2023 15:25:21 +1200 Subject: [PATCH 47/54] cover more error cases in Login (#11073) --- .../components/structures/auth/Login-test.tsx | 68 ++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/test/components/structures/auth/Login-test.tsx b/test/components/structures/auth/Login-test.tsx index a84e88b17c1..8eb25d49097 100644 --- a/test/components/structures/auth/Login-test.tsx +++ b/test/components/structures/auth/Login-test.tsx @@ -1,5 +1,5 @@ /* -Copyright 2019 New Vector Ltd +Copyright 2019, 2023 New Vector Ltd Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -50,6 +50,7 @@ describe("Login", function () { mockClient.baseUrl = opts.baseUrl; return mockClient; }); + fetchMock.resetBehavior(); fetchMock.get("https://matrix.org/_matrix/client/versions", { unstable_features: {}, versions: [], @@ -253,4 +254,69 @@ describe("Login", function () { const ssoButtons = container.querySelectorAll(".mx_SSOButton"); expect(ssoButtons.length).toBe(idpsWithIcons.length + 1); }); + + it("should display an error when homeserver doesn't offer any supported login flows", async () => { + mockClient.loginFlows.mockResolvedValue({ + flows: [ + { + type: "just something weird", + }, + ], + }); + + getComponent(); + await waitForElementToBeRemoved(() => screen.queryAllByLabelText("Loading…")); + + expect( + screen.getByText("This homeserver doesn't offer any login flows which are supported by this client."), + ).toBeInTheDocument(); + }); + + it("should display a connection error when getting login flows fails", async () => { + mockClient.loginFlows.mockRejectedValue("oups"); + + getComponent(); + await waitForElementToBeRemoved(() => screen.queryAllByLabelText("Loading…")); + + expect( + screen.getByText("There was a problem communicating with the homeserver, please try again later."), + ).toBeInTheDocument(); + }); + + it("should display an error when homeserver fails liveliness check", async () => { + fetchMock.resetBehavior(); + fetchMock.get("https://matrix.org/_matrix/client/versions", { + status: 400, + }); + getComponent(); + await waitForElementToBeRemoved(() => screen.queryAllByLabelText("Loading…")); + + // error displayed + expect(screen.getByText("Your test-brand is misconfigured")).toBeInTheDocument(); + }); + + it("should reset liveliness error when server config changes", async () => { + fetchMock.resetBehavior(); + // matrix.org is not alive + fetchMock.get("https://matrix.org/_matrix/client/versions", { + status: 400, + }); + // but server2 is + fetchMock.get("https://server2/_matrix/client/versions", { + unstable_features: {}, + versions: [], + }); + const { rerender } = render(getRawComponent()); + await waitForElementToBeRemoved(() => screen.queryAllByLabelText("Loading…")); + + // error displayed + expect(screen.getByText("Your test-brand is misconfigured")).toBeInTheDocument(); + + rerender(getRawComponent("https://server2")); + + await waitForElementToBeRemoved(() => screen.queryAllByLabelText("Loading…")); + + // error cleared + expect(screen.queryByText("Your test-brand is misconfigured")).not.toBeInTheDocument(); + }); }); From 4973a89a6e0267a6f5489cf218c762572e4634ef Mon Sep 17 00:00:00 2001 From: Element Translate Bot Date: Tue, 13 Jun 2023 11:27:37 +0200 Subject: [PATCH 48/54] Translations update from Weblate (#11081) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Translated using Weblate (Polish) Currently translated at 100.0% (3779 of 3779 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pl/ * Translated using Weblate (Italian) Currently translated at 100.0% (3779 of 3779 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/it/ * Translated using Weblate (Vietnamese) Currently translated at 81.7% (3091 of 3779 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/vi/ * Translated using Weblate (Polish) Currently translated at 100.0% (3779 of 3779 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pl/ * Translated using Weblate (Polish) Currently translated at 100.0% (3779 of 3779 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pl/ * Translated using Weblate (Chinese (Simplified)) Currently translated at 91.4% (3457 of 3781 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hans/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 99.9% (3779 of 3781 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hant/ * Translated using Weblate (Indonesian) Currently translated at 100.0% (3781 of 3781 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/id/ * Translated using Weblate (German) Currently translated at 100.0% (3781 of 3781 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ * Translated using Weblate (Ukrainian) Currently translated at 100.0% (3781 of 3781 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/uk/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (3781 of 3781 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hant/ * Translated using Weblate (Czech) Currently translated at 100.0% (3781 of 3781 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ * Translated using Weblate (Vietnamese) Currently translated at 81.8% (3093 of 3781 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/vi/ * Translated using Weblate (Estonian) Currently translated at 100.0% (3781 of 3781 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/et/ * Translated using Weblate (French) Currently translated at 100.0% (3781 of 3781 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fr/ * Translated using Weblate (Finnish) Currently translated at 91.1% (3447 of 3781 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fi/ * Translated using Weblate (Slovak) Currently translated at 100.0% (3781 of 3781 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sk/ * Translated using Weblate (Hungarian) Currently translated at 99.7% (3773 of 3781 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hu/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ * Translated using Weblate (Polish) Currently translated at 100.0% (3780 of 3780 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pl/ * Translated using Weblate (Italian) Currently translated at 100.0% (3780 of 3780 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/it/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ * Translated using Weblate (Hungarian) Currently translated at 99.8% (3757 of 3764 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hu/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ * Translated using Weblate (Czech) Currently translated at 100.0% (3763 of 3763 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ * Translated using Weblate (Hungarian) Currently translated at 99.8% (3757 of 3763 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hu/ * Translated using Weblate (Swedish) Currently translated at 99.0% (3729 of 3763 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sv/ * Translated using Weblate (Vietnamese) Currently translated at 83.1% (3128 of 3763 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/vi/ * Translated using Weblate (Estonian) Currently translated at 100.0% (3763 of 3763 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/et/ * Translated using Weblate (Swedish) Currently translated at 99.1% (3731 of 3763 strings) Translation: Element Web/matrix-react-sdk Translate-URL: http://translate.element.io/projects/element-web/matrix-react-sdk/sv/ * Translated using Weblate (Chinese (Simplified)) Currently translated at 91.4% (3442 of 3763 strings) Translation: Element Web/matrix-react-sdk Translate-URL: http://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hans/ * Translated using Weblate (Vietnamese) Currently translated at 84.4% (3177 of 3763 strings) Translation: Element Web/matrix-react-sdk Translate-URL: http://translate.element.io/projects/element-web/matrix-react-sdk/vi/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Element Web/matrix-react-sdk Translate-URL: http://translate.element.io/projects/element-web/matrix-react-sdk/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Element Web/matrix-react-sdk Translate-URL: http://translate.element.io/projects/element-web/matrix-react-sdk/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Element Web/matrix-react-sdk Translate-URL: http://translate.element.io/projects/element-web/matrix-react-sdk/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Element Web/matrix-react-sdk Translate-URL: http://translate.element.io/projects/element-web/matrix-react-sdk/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Element Web/matrix-react-sdk Translate-URL: http://translate.element.io/projects/element-web/matrix-react-sdk/ * Update translation files Updated by "Cleanup translation files" hook in Weblate. Translation: Element Web/matrix-react-sdk Translate-URL: http://translate.element.io/projects/element-web/matrix-react-sdk/ * Translated using Weblate (Polish) Currently translated at 100.0% (3752 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pl/ * Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (3752 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hant/ * Translated using Weblate (Italian) Currently translated at 100.0% (3752 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/it/ * Translated using Weblate (Czech) Currently translated at 100.0% (3752 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ * Translated using Weblate (Slovak) Currently translated at 100.0% (3752 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sk/ * Translated using Weblate (Estonian) Currently translated at 100.0% (3752 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/et/ * Translated using Weblate (Vietnamese) Currently translated at 84.9% (3189 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/vi/ * Translated using Weblate (German) Currently translated at 100.0% (3752 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ * Translated using Weblate (Chinese (Simplified)) Currently translated at 91.6% (3439 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hans/ * Translated using Weblate (Vietnamese) Currently translated at 85.1% (3196 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/vi/ * Translated using Weblate (Portuguese) Currently translated at 9.7% (366 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 9.8% (369 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 9.8% (371 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 9.8% (371 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 9.9% (372 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 9.9% (372 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 9.9% (373 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 9.9% (373 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 9.9% (374 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 9.9% (374 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 9.9% (375 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.0% (376 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.0% (377 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.0% (377 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.0% (378 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.1% (379 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.1% (380 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.1% (380 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.5% (394 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.5% (394 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.5% (395 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.5% (395 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.5% (396 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.5% (396 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.7% (402 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 10.7% (402 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 11.0% (413 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 11.0% (413 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 11.3% (426 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 12.6% (473 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 14.2% (533 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 14.6% (549 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Portuguese) Currently translated at 20.2% (761 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt/ * Translated using Weblate (Ukrainian) Currently translated at 99.9% (3751 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/uk/ * Translated using Weblate (Swedish) Currently translated at 100.0% (3752 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sv/ * Translated using Weblate (Hungarian) Currently translated at 99.7% (3742 of 3752 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hu/ --------- Co-authored-by: raspin0 Co-authored-by: Claudio Satriano Co-authored-by: Weblate Co-authored-by: someone1611 Co-authored-by: phardyle Co-authored-by: Linerly Co-authored-by: Vri Co-authored-by: Ihor Hordiichuk Co-authored-by: Jeff Huang Co-authored-by: waclaw66 Co-authored-by: Priit Jõerüüt Co-authored-by: Glandos Co-authored-by: Tuomas Hietala Co-authored-by: Jozef Gaal Co-authored-by: Balázs Meskó Co-authored-by: random Co-authored-by: LinAGKar Co-authored-by: Someone Co-authored-by: Rauno Ots Co-authored-by: Peter Chen Co-authored-by: Pedro costa Co-authored-by: luy dinilta Co-authored-by: artem --- src/i18n/strings/ar.json | 2 - src/i18n/strings/az.json | 2 - src/i18n/strings/bg.json | 2 - src/i18n/strings/ca.json | 2 - src/i18n/strings/cs.json | 45 +-- src/i18n/strings/da.json | 2 - src/i18n/strings/de_DE.json | 41 +-- src/i18n/strings/el.json | 16 - src/i18n/strings/en_US.json | 2 - src/i18n/strings/eo.json | 5 - src/i18n/strings/es.json | 30 -- src/i18n/strings/et.json | 43 +-- src/i18n/strings/eu.json | 2 - src/i18n/strings/fa.json | 4 - src/i18n/strings/fi.json | 105 ++++-- src/i18n/strings/fr.json | 37 +- src/i18n/strings/ga.json | 2 - src/i18n/strings/gl.json | 16 - src/i18n/strings/he.json | 12 - src/i18n/strings/hi.json | 2 - src/i18n/strings/hr.json | 2 - src/i18n/strings/hu.json | 655 ++++++++++++++++------------------ src/i18n/strings/id.json | 37 +- src/i18n/strings/is.json | 20 -- src/i18n/strings/it.json | 45 +-- src/i18n/strings/ja.json | 33 -- src/i18n/strings/jbo.json | 1 - src/i18n/strings/kab.json | 2 - src/i18n/strings/ko.json | 2 - src/i18n/strings/lo.json | 16 - src/i18n/strings/lt.json | 15 - src/i18n/strings/lv.json | 2 - src/i18n/strings/nb_NO.json | 2 - src/i18n/strings/nl.json | 20 -- src/i18n/strings/nn.json | 3 - src/i18n/strings/pl.json | 389 ++++++++++++++------ src/i18n/strings/pt.json | 439 +++++++++++++++++++++-- src/i18n/strings/pt_BR.json | 15 - src/i18n/strings/ro.json | 2 - src/i18n/strings/ru.json | 27 -- src/i18n/strings/sk.json | 41 +-- src/i18n/strings/sq.json | 32 -- src/i18n/strings/sr.json | 2 - src/i18n/strings/sv.json | 109 ++++-- src/i18n/strings/ta.json | 2 - src/i18n/strings/th.json | 2 - src/i18n/strings/tr.json | 2 - src/i18n/strings/uk.json | 40 +-- src/i18n/strings/vi.json | 330 +++++++++++------ src/i18n/strings/vls.json | 2 - src/i18n/strings/zh_Hans.json | 182 +++++----- src/i18n/strings/zh_Hant.json | 43 +-- 52 files changed, 1526 insertions(+), 1360 deletions(-) diff --git a/src/i18n/strings/ar.json b/src/i18n/strings/ar.json index 347307c4f8e..9d0c5a116e1 100644 --- a/src/i18n/strings/ar.json +++ b/src/i18n/strings/ar.json @@ -48,8 +48,6 @@ "Unable to load! Check your network connectivity and try again.": "تعذر التحميل! افحص اتصالك بالشبكة وأعِد المحاولة.", "Call failed due to misconfigured server": "فشل الاتصال بسبب سوء ضبط الخادوم", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "من فضلك اطلب من مسؤول الخادوم المنزل الذي تستعمله (%(homeserverDomain)s) أن يضبط خادوم TURN كي تعمل الاتصالات بنحوٍ يكون محط ثقة.", - "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", "OK": "حسنًا", "Call Failed": "فشل الاتصال", "Permission Required": "التصريح مطلوب", diff --git a/src/i18n/strings/az.json b/src/i18n/strings/az.json index 11da46f9c43..e9dd14a3d57 100644 --- a/src/i18n/strings/az.json +++ b/src/i18n/strings/az.json @@ -218,8 +218,6 @@ "Add Phone Number": "Telefon nömrəsi əlavə etmək", "Call failed due to misconfigured server": "Düzgün qurulmamış server səbəbindən zəng alınmadı", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Xahiş edirik, baş serverin administratoruna müraciət edin (%(homeserverDomain)s) ki zənglərin etibarlı işləməsi üçün dönüş serverini konfiqurasiya etsin.", - "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativ olaraq, ümumi serveri turn.matrix.org istifadə etməyə cəhd edə bilərsiniz, lakin bu qədər etibarlı olmayacaq və IP ünvanınızı bu serverlə bölüşəcəkdir. Bunu Ayarlarda da idarə edə bilərsiniz.", - "Try using turn.matrix.org": "Turn.matrix.org istifadə edin", "The file '%(fileName)s' failed to upload.": "'%(fileName)s' faylı yüklənə bilmədi.", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "'%(fileName)s' faylı yükləmə üçün bu server ölçü həddini aşmışdır", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index 48370ba8dad..8b95e944bee 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -936,8 +936,6 @@ "This account has been deactivated.": "Този акаунт е деактивиран.", "Call failed due to misconfigured server": "Неуспешен разговор поради неправилно конфигуриран сървър", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Попитайте администратора на сървъра ви (%(homeserverDomain)s) да конфигурира TURN сървър, за да може разговорите да работят надеждно.", - "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", "Messages": "Съобщения", "Actions": "Действия", "Displays list of commands with usages and descriptions": "Показва списък с команди, начин на използване и описания", diff --git a/src/i18n/strings/ca.json b/src/i18n/strings/ca.json index 1c26955125e..49747bd38b6 100644 --- a/src/i18n/strings/ca.json +++ b/src/i18n/strings/ca.json @@ -581,8 +581,6 @@ "Share this email in Settings to receive invites directly in %(brand)s.": "Per rebre invitacions directament a %(brand)s, comparteix aquest correu electrònic a Configuració.", "Go to Settings": "Ves a Configuració", "All settings": "Totes les configuracions", - "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.": "Com a alternativa, pots provar d'utilitzar el servidor públic a turn.matrix.org, però no serà tant fiable i compartirà la teva IP amb el servidor. També pots gestionar-ho a Configuració.", - "Try using turn.matrix.org": "Prova d'utilitzar turn.matrix.org", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Demana a l'administrador del servidor local (%(homeserverDomain)s) que configuri un servidor TURN perquè les trucades funcionin de manera fiable.", "Call failed due to misconfigured server": "La trucada ha fallat a causa d'una configuració errònia al servidor", "The call was answered on another device.": "La trucada s'ha respost des d'un altre dispositiu.", diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 0d4d5b84e3d..2b0ad5526c2 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -877,7 +877,7 @@ "Add room": "Přidat místnost", "You have %(count)s unread notifications in a prior version of this room.|other": "Máte %(count)s nepřečtených oznámení v předchozí verzi této místnosti.", "You have %(count)s unread notifications in a prior version of this room.|one": "Máte %(count)s nepřečtených oznámení v předchozí verzi této místnosti.", - "Failed to get autodiscovery configuration from server": "Nepovedlo se automaticky načíst konfiguraci ze serveru", + "Failed to get autodiscovery configuration from server": "Nepovedlo se načíst nastavení automatického objevování ze serveru", "Invalid base_url for m.homeserver": "Neplatná base_url pro m.homeserver", "Homeserver URL does not appear to be a valid Matrix homeserver": "Na URL domovského serveru asi není funkční Matrix server", "Invalid base_url for m.identity_server": "Neplatná base_url pro m.identity_server", @@ -900,8 +900,6 @@ "You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Můžete se přihlásit, ale některé funkce nebudou dostupné dokud nezačne server identity fungovat. Pokud se vám toto varování zobrazuje i nadále, zkontrolujte svojí konfiguraci nebo kontaktujte správce serveru.", "Call failed due to misconfigured server": "Volání selhalo, protože je rozbitá konfigurace serveru", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Požádejte správce svého domovského serveru (%(homeserverDomain)s) jestli by nemohl nakonfigurovat TURN server, aby volání fungovala spolehlivě.", - "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.": "Můžete také zkusit použít veřejný server na adrese turn.matrix.org, ale ten nebude tak spolehlivý a bude sdílet vaši IP adresu s tímto serverem. To můžete spravovat také v Nastavení.", - "Try using turn.matrix.org": "Zkuste použít turn.matrix.org", "Messages": "Zprávy", "Actions": "Akce", "Sends a message as plain text, without interpreting it as markdown": "Pošle zprávu jako prostý text, neinterpretuje jí jako Markdown", @@ -969,7 +967,7 @@ "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "zkontrolujte, jestli nemáte v prohlížeči nějaký doplněk blokující server identit (např. Privacy Badger)", "contact the administrators of identity server ": "kontaktujte správce serveru identit ", "wait and try again later": "počkejte a zkuste to znovu později", - "Discovery": "Veřejné", + "Discovery": "Objevování", "Clear cache and reload": "Smazat mezipaměť a načíst znovu", "Read Marker lifetime (ms)": "Platnost značky přečteno (ms)", "Read Marker off-screen lifetime (ms)": "Platnost značky přečteno mimo obrazovku (ms)", @@ -2301,7 +2299,6 @@ "Enter your Security Phrase a second time to confirm it.": "Zadejte bezpečnostní frázi podruhé a potvrďte ji.", "Pick rooms or conversations to add. This is just a space for you, no one will be informed. You can add more later.": "Vyberte místnosti nebo konverzace, které chcete přidat. Toto je prostor pouze pro vás, nikdo nebude informován. Později můžete přidat další.", "You have no ignored users.": "Nemáte žádné ignorované uživatele.", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Jedná se o experimentální funkci. Noví uživatelé, kteří obdrží pozvánku, ji budou muset otevřít na , aby se mohli připojit.", "Select a room below first": "Nejprve si vyberte místnost níže", "Join the beta": "Připojit se k beta verzi", "Leave the beta": "Opustit beta verzi", @@ -2681,19 +2678,9 @@ "Yours, or the other users' internet connection": "Vaše internetové připojení nebo připojení ostatních uživatelů", "The homeserver the user you're verifying is connected to": "Domovský server, ke kterému je ověřovaný uživatel připojen", "This room isn't bridging messages to any platforms. Learn more.": "Tato místnost nepropojuje zprávy s žádnou platformou. Zjistit více.", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Níže můžete spravovat přihlášená zařízení. Název zařízení je viditelný pro osoby, se kterými komunikujete.", - "Where you're signed in": "Kde jste přihlášeni", "Use high contrast": "Použít vysoký kontrast", "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.", "Rename": "Přejmenovat", - "Sign Out": "Odhlásit se", - "This device": "Toto zařízení", - "You aren't signed into any other devices.": "Nejste přihlášeni na žádném jiném zařízení.", - "Sign out %(count)s selected devices|one": "Odhlásit %(count)s vybrané zařízení", - "Sign out %(count)s selected devices|other": "Odhlásit %(count)s vybraných zařízení", - "Devices without encryption support": "Zařízení bez podpory šifrování", - "Unverified devices": "Neověřená zařízení", - "Verified devices": "Ověřená zařízení", "Select all": "Vybrat všechny", "Deselect all": "Zrušit výběr všech", "Sign out devices|one": "Odhlášení zařízení", @@ -2702,8 +2689,6 @@ "Click the button below to confirm signing out these devices.|one": "Kliknutím na tlačítko níže potvrdíte odhlášení tohoto zařízení.", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Potvrďte odhlášení tohoto zařízení pomocí Jednotného přihlášení, abyste prokázali svou totožnost.", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "Potvrďte odhlášení těchto zařízení pomocí Jednotného přihlášení, abyste prokázali svou totožnost.", - "Unable to load device list": "Nelze načíst seznam zařízení", - "Your homeserver does not support device management.": "Váš domovský server nepodporuje správu zařízení.", "Automatically send debug logs on any error": "Automaticky odesílat ladící protokoly při jakékoli chybě", "Use a more compact 'Modern' layout": "Použít kompaktnější \"moderní\" rozložení", "Light high contrast": "Světlý vysoký kontrast", @@ -2787,7 +2772,6 @@ "We don't record or profile any account data": "Nezaznamenáváme ani neprofilujeme žádné údaje o účtu", "You can read all our terms here": "Všechny naše podmínky si můžete přečíst zde", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Sdílejte anonymní údaje, které nám pomohou identifikovat problémy. Nic osobního. Žádné třetí strany.", - "Okay": "Dobře", "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "Sdílejte anonymní údaje, které nám pomohou identifikovat problémy. Nic osobního. Žádné třetí strany. Zjistěte více", "You previously consented to share anonymous usage data with us. We're updating how that works.": "Dříve jste nám dali souhlas se sdílením anonymních údajů o používání. Aktualizujeme způsob, jakým to funguje.", "Help improve %(analyticsOwner)s": "Pomozte zlepšit %(analyticsOwner)s", @@ -3422,10 +3406,6 @@ "Join %(brand)s calls": "Připojit se k %(brand)s volání", "Start %(brand)s calls": "Zahájit %(brand)s volání", "Sorry — this call is currently full": "Omlouváme se — tento hovor je v současné době plný", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Náš nový správce relací poskytuje lepší přehled o všech relacích a lepší kontrolu nad nimi, včetně možnosti vzdáleně přepínat push oznámení.", - "Have greater visibility and control over all your sessions.": "Získejte větší přehled a kontrolu nad všemi relacemi.", - "New session manager": "Nový správce relací", - "Use new session manager": "Použít nový správce relací", "resume voice broadcast": "obnovit hlasové vysílání", "pause voice broadcast": "pozastavit hlasové vysílání", "Underline": "Podtržení", @@ -3481,7 +3461,6 @@ "Video settings": "Nastavení videa", "Automatically adjust the microphone volume": "Automaticky upravit hlasitost mikrofonu", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "Platí pouze v případě, že váš domovský server tuto možnost nenabízí. Vaše IP adresa bude během hovoru sdílena.", - "Allow fallback call assist server (turn.matrix.org)": "Povolit záložní server volání (turn.matrix.org)", "Noise suppression": "Potlačení hluku", "Echo cancellation": "Potlačení ozvěny", "Automatic gain control": "Automatická úprava zesílení", @@ -3555,17 +3534,6 @@ "You ended a voice broadcast": "Ukončili jste hlasové vysílání", "Unable to decrypt message": "Nepodařilo se dešifrovat zprávu", "This message could not be decrypted": "Tuto zprávu se nepodařilo dešifrovat", - "Resend key requests": "Opětovně odeslat žádosti o klíč", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "Bohužel neexistují žádná další ověřená zařízení, ze kterých by si bylo možné vyžádat dešifrovací klíče. Přihlášení a ověření dalších zařízení může pomoci této situaci v budoucnu předejít.", - "Some messages could not be decrypted": "Některé zprávy nebylo možné dešifrovat", - "View your device list": "Zobrazit seznam vašich zařízení", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "Toto zařízení požaduje dešifrovací klíče z vašich ostatních zařízení. Otevření některého z vašich dalších zařízení to může urychlit.", - "Open another device to load encrypted messages": "Otevřete jiné zařízení pro načtení zašifrovaných zpráv", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "Ke starým nedešifrovatelným zprávám nebudete mít přístup, ale resetování klíčů vám umožní přijímat nové zprávy.", - "Reset your keys to prevent future decryption errors": "Resetujte své klíče, abyste předešli budoucím chybám při dešifrování", - "This device was unable to decrypt some messages because it has not been verified yet.": "Toto zařízení nebylo schopno dešifrovat některé zprávy, protože dosud nebylo ověřeno.", - "Verify this device to access all messages": "Ověřte toto zařízení pro přístup ke všem zprávám", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Počkejte prosím, zatímco se snažíme dešifrovat vaše zprávy. Může to chvíli trvat.", "%(senderName)s ended a voice broadcast": "%(senderName)s ukončil(a) hlasové vysílání", "You ended a voice broadcast": "Ukončili jste hlasové vysílání", "Rust cryptography implementation": "Implementace kryptografie v jazyce Rust", @@ -3668,7 +3636,6 @@ "Loading…": "Načítání…", "Encrypting your message…": "Šifrování zprávy…", "Sending your message…": "Odeslání zprávy…", - "Decrypting messages…": "Dešifrování zpráv…", "Set a new account password…": "Nastavení nového hesla k účtu…", "Downloading update…": "Stahování aktualizace…", "Checking for an update…": "Kontrola aktualizace…", @@ -3777,5 +3744,11 @@ "Once invited users have joined %(brand)s, you will be able to chat and the room will be end-to-end encrypted": "Jakmile se pozvaní uživatelé připojí k %(brand)s, budete moci chatovat a místnost bude koncově šifrovaná", "Waiting for users to join %(brand)s": "Čekání na připojení uživatelů k %(brand)s", "You do not have permission to invite users": "Nemáte oprávnění zvát uživatele", - "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s změnil(a) své zobrazované jméno a profilový obrázek" + "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s změnil(a) své zobrazované jméno a profilový obrázek", + "Your language": "Váš jazyk", + "Your device ID": "ID vašeho zařízení", + "User is not logged in": "Uživatel není přihlášen", + "Alternatively, you can try to use the public server at , but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Případně můžete zkusit použít veřejný server na adrese , ale ten nebude tak spolehlivý a bude sdílet vaši IP adresu s tímto serverem. Můžete to spravovat také v Nastavení.", + "Allow fallback call assist server (%(server)s)": "Povolit záložní asistenční server hovorů (%(server)s)", + "Try using %(server)s": "Zkuste použít %(server)s" } diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index 7624c6adbd0..8f8d0293286 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -177,8 +177,6 @@ "Call Failed": "Opkald mislykkedes", "Call failed due to misconfigured server": "Opkaldet mislykkedes pga. fejlkonfigureret server", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Bed administratoren af din homeserver (%(homeserverDomain)s) om at konfigurere en TURN server for at opkald virker pålideligt.", - "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.": "Alternativt kan du prøve at bruge den offentlige server turn.matrix.org, men det er ikke lige så pålideligt, og din IP-adresse deles med den server. Du kan også administrere dette under Indstillinger.", - "Try using turn.matrix.org": "Prøv at bruge turn.matrix.org", "Permission Required": "Tilladelse påkrævet", "You do not have permission to start a conference call in this room": "Du har ikke rettighed til at starte et gruppekald i dette rum", "The file '%(fileName)s' failed to upload.": "Filen '%(fileName)s' kunne ikke uploades.", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 516692309c7..8f4784f2e9c 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -853,7 +853,6 @@ "Actions": "Aktionen", "Displays list of commands with usages and descriptions": "Zeigt die Liste verfügbarer Befehle mit Verwendungen und Beschreibungen an", "Call failed due to misconfigured server": "Anruf aufgrund eines falsch konfigurierten Servers fehlgeschlagen", - "Try using turn.matrix.org": "Versuche es mit turn.matrix.org", "You do not have the required permissions to use this command.": "Du hast nicht die erforderlichen Berechtigungen, diesen Befehl zu verwenden.", "Checking server": "Überprüfe Server", "Identity server has no terms of service": "Der Identitäts-Server hat keine Nutzungsbedingungen", @@ -874,7 +873,6 @@ "Deactivate account": "Benutzerkonto deaktivieren", "Show previews/thumbnails for images": "Vorschauen für Bilder", "View": "Öffnen", - "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativ kannst du versuchen, den öffentlichen Server unter turn.matrix.org zu verwenden. Allerdings wird dieser nicht so zuverlässig sein und du teilst deine IP-Adresse mit dem Server. Du kannst dies auch in den Einstellungen konfigurieren.", "This action requires accessing the default identity server to validate an email address or phone number, but the server does not have any terms of service.": "Diese Handlung erfordert es, auf den Standard-Identitäts-Server zuzugreifen, um eine E-Mail-Adresse oder Telefonnummer zu validieren, aber der Server hat keine Nutzungsbedingungen.", "Only continue if you trust the owner of the server.": "Fahre nur fort, wenn du den Server-Betreibenden vertraust.", "Trust": "Vertrauen", @@ -2322,7 +2320,6 @@ "Search names and descriptions": "Nach Name und Beschreibung filtern", "Not all selected were added": "Nicht alle Ausgewählten konnten hinzugefügt werden", "Add reaction": "Reaktion hinzufügen", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Diese Funktion ist experimentell. Falls du eine Einladung erhältst, musst du sie momentan noch auf öffnen, um den Raum zu betreten.", "You may contact me if you have any follow up questions": "Kontaktiert mich, falls ihr weitere Fragen zu meiner Rückmeldung habt", "To leave the beta, visit your settings.": "Du kannst die Beta in den Einstellungen deaktivieren.", "Your platform and username will be noted to help us use your feedback as much as we can.": "Deine Systeminformationen und dein Benutzername werden mitgeschickt, damit wir deine Rückmeldung bestmöglich nachvollziehen können.", @@ -2678,19 +2675,9 @@ "The homeserver the user you're verifying is connected to": "Der Heim-Server der Person, die du verifizierst", "You do not have permission to start polls in this room.": "Du bist nicht berechtigt, Umfragen in diesem Raum zu beginnen.", "This room isn't bridging messages to any platforms. Learn more.": "Dieser Raum verbindet Nachrichten nicht mit anderen Plattformen. Mehr erfahren.", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Verwalte deine angemeldeten Geräte. Der Name von einem Gerät ist sichtbar für Personen mit denen du kommunizierst.", - "Where you're signed in": "Da bist du angemeldet", "Use high contrast": "Hohen Kontrast verwenden", "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.": "Dieser Raum ist Teil von Spaces von denen du kein Administrator bist. In diesen Räumen wird der alte Raum weiter angezeigt werden, aber Personen werden aufgefordert werden, dem neuen Raum beizutreten.", "Rename": "Umbenennen", - "Sign Out": "Abmelden", - "This device": "Dieses Gerät", - "You aren't signed into any other devices.": "Du bist an keinem anderen Gerät angemeldet.", - "Sign out %(count)s selected devices|one": "%(count)s ausgewähltes Gerät abmelden", - "Sign out %(count)s selected devices|other": "%(count)s ausgewählte Geräte abmelden", - "Devices without encryption support": "Geräte ohne Verschlüsselungsunterstützung", - "Unverified devices": "Unverifizierte Geräte", - "Verified devices": "Verifizierte Geräte", "Deselect all": "Alle abwählen", "Select all": "Alle auswählen", "Sign out devices|one": "Gerät abmelden", @@ -2699,8 +2686,6 @@ "Click the button below to confirm signing out these devices.|other": "Klicke unten auf den Knopf, um diese Geräte abzumelden.", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Abmelden dieses Geräts durch Beweisen deiner Identität mit Single Sign-On bestätigen.", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "Bestätige das Abmelden dieser Geräte, indem du dich erneut anmeldest.", - "Unable to load device list": "Geräteliste nicht geladen werden", - "Your homeserver does not support device management.": "Dein Heim-Server unterstützt keine Geräteverwaltung.", "Automatically send debug logs on any error": "Sende bei Fehlern automatisch Protokolle zur Fehlerkorrektur", "Use a more compact 'Modern' layout": "Modernes kompaktes Layout verwenden", "%(senderDisplayName)s changed who can join this room.": "%(senderDisplayName)s hat geändert, wer diesen Raum betreten darf.", @@ -2760,7 +2745,6 @@ "%(spaceName)s and %(count)s others|one": "%(spaceName)s und %(count)s anderer", "%(spaceName)s and %(count)s others|zero": "%(spaceName)s", "%(spaceName)s and %(count)s others|other": "%(spaceName)s und %(count)s andere", - "Okay": "Okay", "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "Teile Daten anonymisiert um uns zu helfen Probleme zu identifizieren. Nichts persönliches. Keine Dritten. Mehr dazu hier", "You previously consented to share anonymous usage data with us. We're updating how that works.": "Sie haben zuvor zugestimmt, anonymisierte Nutzungsdaten mit uns zu teilen. Wir aktualisieren, wie das funktioniert.", "Help improve %(analyticsOwner)s": "Hilf mit, %(analyticsOwner)s zu verbessern", @@ -3422,10 +3406,6 @@ "Enable %(brand)s as an additional calling option in this room": "Verwende %(brand)s als alternative Anrufoption in diesem Raum", "Join %(brand)s calls": "Trete %(brand)s-Anrufen bei", "Sorry — this call is currently full": "Entschuldigung — dieser Anruf ist aktuell besetzt", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Unsere neue Sitzungsverwaltung bietet bessere Übersicht und Kontrolle über all deine Sitzungen, inklusive der Möglichkeit, aus der Ferne Push-Benachrichtigungen umzuschalten.", - "Have greater visibility and control over all your sessions.": "Bessere Übersicht und Kontrolle über all deine Sitzungen.", - "New session manager": "Neue Sitzungsverwaltung", - "Use new session manager": "Neue Sitzungsverwaltung nutzen", "pause voice broadcast": "Sprachübertragung pausieren", "resume voice broadcast": "Sprachübertragung fortsetzen", "Italic": "Kursiv", @@ -3481,7 +3461,6 @@ "Automatically adjust the microphone volume": "Gleiche die Mikrofonlautstärke automatisch an", "Voice settings": "Spracheinstellungen", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "Dieser wird nur verwendet, sollte dein Heim-Server keinen bieten. Deine IP-Adresse würde während eines Anrufs geteilt werden.", - "Allow fallback call assist server (turn.matrix.org)": "Erlaube Rückfall-Anrufassistenz-Server (turn.matrix.org)", "Noise suppression": "Rauschreduzierung", "Echo cancellation": "Echounterdrückung", "When enabled, the other party might be able to see your IP address": "Wenn aktiviert, könnte die andere Person deine IP-Adresse sehen", @@ -3555,17 +3534,6 @@ "You ended a voice broadcast": "Du hast eine Sprachübertragung beendet", "Unable to decrypt message": "Nachrichten-Entschlüsselung nicht möglich", "This message could not be decrypted": "Diese Nachricht konnte nicht enschlüsselt werden", - "Resend key requests": "Schlüsselanfrage erneut senden", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "Bedauerlicherweise gibt es keine anderen Geräte, von denen Entschlüsselungs-Schlüssel angefordert werden können. Andere Geräte anzumelden und zu verifizieren könnte derartige Situationen in Zukunft verhindern.", - "Some messages could not be decrypted": "Einige Nachrichten konnten nicht entschlüsselt werden", - "View your device list": "Deine Geräteliste ansehen", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "Dieses Gerät fordert Entschlüsselungs-Schlüssel von deinen anderen Geräten an. Die Nutzung deiner anderen Geräte könnte dies beschleunigen.", - "Open another device to load encrypted messages": "Nutze ein anderes verbundenes Gerät, um verschlüsselte Nachrichten zu laden", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "Du wirst nicht in der Lage sein, auf alte nicht entschlüsselbare Nachrichten zuzugreifen, aber durch das Zurücksetzen kannst du neue Nachrichten erhalten.", - "Reset your keys to prevent future decryption errors": "Setze deine Schlüssel zurück, um zukünftige Entschlüsselungsfehler zu vermeiden", - "This device was unable to decrypt some messages because it has not been verified yet.": "Dieses Gerät konnte einige Nachrichten nicht entschlüsseln, da es noch nicht verifiziert wurde.", - "Verify this device to access all messages": "Verifiziere dieses Gerät, um auf alle Nachrichten zugreifen zu können", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Bitte warte, während wir versuchen, deine Nachrichten zu entschlüsseln. Das könnte ein wenig dauern.", "Rust cryptography implementation": "Rust-Verschlüsselungsumsetzung", "%(senderName)s ended a voice broadcast": "%(senderName)s beendete eine Sprachübertragung", "You ended a voice broadcast": "Du hast eine Sprachübertragung beendet", @@ -3667,7 +3635,6 @@ "Joining space…": "Betrete Space …", "Encrypting your message…": "Verschlüssele deine Nachricht …", "Sending your message…": "Sende deine Nachricht …", - "Decrypting messages…": "Entschlüssele Nachrichten …", "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 '%(myBanList)s' - stay in this room to keep the ban list in effect.": "Deine persönliche Sperrliste enthält alle Benutzer/Server, von denen du keine Nachrichten erhalten möchtest. Nachdem du den ersten Benutzer/Server ignoriert hast, wird ein neuer Raum namens „%(myBanList)s“ erstellt – bleibe in diesem Raum, um die Sperrliste zu erhalten.", "Set a new account password…": "Setze neues Kontopasswort …", "Downloading update…": "Lade Aktualisierung herunter …", @@ -3777,5 +3744,11 @@ "Once invited users have joined %(brand)s, you will be able to chat and the room will be end-to-end encrypted": "Sobald eingeladene Benutzer %(brand)s beigetreten sind, werdet ihr euch unterhalten können und der Raum wird Ende-zu-Ende-verschlüsselt sein", "Waiting for users to join %(brand)s": "Warte darauf, dass Benutzer %(brand)s beitreten", "You do not have permission to invite users": "Du bist nicht berechtigt, Benutzer einzuladen", - "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s hat den Anzeigenamen und das Profilbild geändert" + "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s hat den Anzeigenamen und das Profilbild geändert", + "Your language": "Deine Sprache", + "Your device ID": "Deine Geräte-ID", + "Allow fallback call assist server (%(server)s)": "Ersatz-Anrufassistenz-Server erlauben (%(server)s)", + "User is not logged in": "Benutzer ist nicht angemeldet", + "Alternatively, you can try to use the public server at , but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativ kannst du versuchen, den öffentlichen Server unter zu verwenden. Dieser wird nicht so zuverlässig sein und deine IP-Adresse wird mit ihm geteilt. Du kannst dies auch in den Einstellungen konfigurieren.", + "Try using %(server)s": "Versuche %(server)s zu verwenden" } diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index 505d343ceda..c921cf3a958 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -356,8 +356,6 @@ "Add Phone Number": "Προσθήκη Τηλεφωνικού Αριθμού", "Call failed due to misconfigured server": "Η κλήση απέτυχε λόγω της λανθασμένης διάρθρωσης του διακομιστή", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Παρακαλείστε να ρωτήσετε τον διαχειριστή του κεντρικού διακομιστή σας (%(homeserverDomain)s) να ρυθμίσουν έναν διακομιστή πρωτοκόλλου TURN ώστε οι κλήσεις να λειτουργούν απρόσκοπτα.", - "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", "Permission Required": "Απαιτείται Άδεια", "You do not have permission to start a conference call in this room": "Δεν έχετε άδεια για να ξεκινήσετε μια κλήση συνδιάσκεψης σε αυτό το δωμάτιο", "The file '%(fileName)s' failed to upload.": "Απέτυχε το ανέβασμα του αρχείου '%(fileName)s'.", @@ -955,10 +953,7 @@ "You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "Μπορείτε να επαναφέρετε τον κωδικό πρόσβασης σας, αλλά ορισμένες λειτουργίες δε θα είναι διαθέσιμες μέχρι να συνδεθεί ξανά ο διακομιστής ταυτότητας. Εάν εξακολουθείτε να βλέπετε αυτήν την προειδοποίηση, ελέγξτε τις ρυθμίσεις σας ή επικοινωνήστε με έναν διαχειριστή του διακομιστή σας.", "Group all your people in one place.": "Ομαδοποιήστε όλα τα άτομα σας σε ένα μέρος.", "Group all your favourite rooms and people in one place.": "Ομαδοποιήστε όλα τα αγαπημένα σας δωμάτια και άτομα σε ένα μέρος.", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Διαχειριστείτε τις συνδεδεμένες συσκευές σας παρακάτω. Το όνομα μιας συσκευής είναι ορατό στα άτομα με τα οποία επικοινωνείτε.", - "Where you're signed in": "Που έχετε συνδεθεί", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Μοιραστείτε ανώνυμα δεδομένα για να μας βοηθήσετε να εντοπίσουμε προβλήματα. Δε συλλέγουμε προσωπικά δεδομένα. Δεν τα παρέχουμε σε τρίτους.", - "Okay": "Εντάξει", "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Ο διαχειριστής του διακομιστή σας έχει απενεργοποιήσει την κρυπτογράφηση από άκρο σε άκρο από προεπιλογή σε ιδιωτικά δωμάτια & άμεσα μηνύματα.", "Message search": "Αναζήτηση μηνυμάτων", "Security & Privacy": "Ασφάλεια & Απόρρητο", @@ -1450,8 +1445,6 @@ "Click the button below to confirm signing out these devices.|other": "Κάντε κλικ στο κουμπί παρακάτω για να επιβεβαιώσετε αποσύνδεση αυτών των συσκευών.", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Επιβεβαιώστε ότι αποσυνδέεστε από αυτήν τη συσκευή χρησιμοποιώντας Single Sign On για να αποδείξετε την ταυτότητά σας.", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "Επιβεβαιώστε την αποσύνδεση από αυτές τις συσκευές χρησιμοποιώντας Single Sign On για να αποδείξετε την ταυτότητά σας.", - "Unable to load device list": "Δεν είναι δυνατή η φόρτωση της λίστας συσκευών", - "Your homeserver does not support device management.": "Ο κεντρικός σας διακομιστής δεν υποστηρίζει τη διαχείριση συσκευών.", "Session key:": "Κλειδί συνεδρίας:", "Session ID:": "Αναγνωριστικό συνεδρίας:", "exists": "υπάρχει", @@ -1469,14 +1462,6 @@ "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Επαληθεύστε μεμονωμένα κάθε συνεδρία που χρησιμοποιείται από έναν χρήστη για να την επισημάνετε ως αξιόπιστη, χωρίς να εμπιστεύεστε συσκευές με διασταυρούμενη υπογραφή.", "Rename": "Μετονομασία", "Display Name": "Εμφανιζόμενο όνομα", - "Sign Out": "Αποσύνδεση", - "This device": "Αυτή η συσκευή", - "You aren't signed into any other devices.": "Δεν είστε συνδεδεμένοι σε άλλες συσκευές.", - "Sign out %(count)s selected devices|one": "Αποσύνδεση%(count)s επιλεγμένων συσκευών", - "Sign out %(count)s selected devices|other": "Αποσύνδεση%(count)s επιλεγμένων συσκευών", - "Devices without encryption support": "Συσκευές χωρίς υποστήριξη κρυπτογράφησης", - "Unverified devices": "Μη επαληθευμένες συσκευές", - "Verified devices": "Επαληθευμένες συσκευές", "Select all": "Επιλογή όλων", "Deselect all": "Αποεπιλογή όλων", "Sign out devices|one": "Αποσύνδεση συσκευής", @@ -3066,7 +3051,6 @@ "Invalid identity server discovery response": "Μη έγκυρη απόκριση εντοπισμού διακομιστή ταυτότητας", "Failed to get autodiscovery configuration from server": "Απέτυχε η λήψη της διαμόρφωσης αυτόματης ανακάλυψης από τον διακομιστή", "Reply to an ongoing thread or use “%(replyInThread)s” when hovering over a message to start a new one.": "Απαντήστε σε ένα νήμα εκτέλεσης που βρίσκεται σε εξέλιξη ή χρησιμοποιήστε το \"%(replyInThread)s\" όταν τοποθετείτε το δείκτη του ποντικιού πάνω από ένα μήνυμα για να ξεκινήσετε ένα νέο.", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Αυτή είναι μια πειραματική λειτουργία. Προς το παρόν, οι νέοι χρήστες που λαμβάνουν πρόσκληση θα πρέπει να ανοίξουν την πρόσκληση στο για να συμμετάσχουν πραγματικά.", "Hold": "Αναμονή", "These are likely ones other room admins are a part of.": "Πιθανότατα αυτά είναι μέρος στα οποία συμμετέχουν και άλλοι διαχειριστές δωματίου.", "Toggle hidden event visibility": "Εναλλαγή ορατότητας κρυφού συμβάντος", diff --git a/src/i18n/strings/en_US.json b/src/i18n/strings/en_US.json index 383d052e177..37f8982de55 100644 --- a/src/i18n/strings/en_US.json +++ b/src/i18n/strings/en_US.json @@ -392,7 +392,6 @@ "Your %(brand)s is misconfigured": "Your %(brand)s is misconfigured", "Call failed due to misconfigured server": "Call failed due to misconfigured server", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.", - "Try using turn.matrix.org": "Try using turn.matrix.org", "Messages": "Messages", "Actions": "Actions", "Other": "Other", @@ -402,7 +401,6 @@ "Confirm adding phone number": "Confirm adding phone number", "Click the button below to confirm adding this phone number.": "Click the button below to confirm adding this phone number.", "Add Phone Number": "Add Phone Number", - "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.": "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.", "Cancel entering passphrase?": "Cancel entering passphrase?", "Are you sure you want to cancel entering passphrase?": "Are you sure you want to cancel entering passphrase?", "Go Back": "Go Back", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 2703a499da0..ce420a3b34e 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -936,8 +936,6 @@ "This account has been deactivated.": "Tiu ĉi konto malaktiviĝis.", "Call failed due to misconfigured server": "Voko malsukcesis pro misagordita servilo", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Bonvolu peti la administranton de via hejmservilo (%(homeserverDomain)s) agordi TURN-servilon, por ke vokoj funkciu dependeble.", - "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.": "Alternative, vi povas prove uzi la publikan servilon je turn.matrix.org, sed tio ne estas same dependebla, kaj ĝi havigos vian IP-adreson al tiu servilo. Vi povas administri tion ankaŭ en Agordoj.", - "Try using turn.matrix.org": "Provu uzi servilon turn.matrix.org", "Sends a message as plain text, without interpreting it as markdown": "Sendas mesaĝon kiel platan tekston, sen interpreto al Markdown", "You do not have the required permissions to use this command.": "Vi ne havas sufiĉajn permesojn por uzi ĉi tiun komandon.", "Changes the avatar of the current room": "Ŝanĝas la profilbildon de la nuna ĉambro", @@ -2307,7 +2305,6 @@ "You can add more later too, including already existing ones.": "Vi povas aldoni pliajn poste, inkluzive tiujn, kiuj jam ekzistas.", "Let's create a room for each of them.": "Kreu ni ĉambron por ĉiu el ili.", "What are some things you want to discuss in %(spaceName)s?": "Pri kio volus vi diskuti en %(spaceName)s?", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Ĉi tio estas prova funkcio. Uzantoj, kiuj nun ricevos inviton, devos ĝin malfermi per por efektive aliĝi.", "Go to my space": "Iri al mia aro", "Pick rooms or conversations to add. This is just a space for you, no one will be informed. You can add more later.": "Elektu aldonotajn ĉambrojn aŭ interparolojn. Ĉi tiu aro estas nur por vi, neniu estos informita. Vi povas aldoni pliajn pli poste.", "What do you want to organise?": "Kion vi volas organizi?", @@ -2830,8 +2827,6 @@ "Send read receipts": "Sendi legitajn kvitanojn", "New group call experience": "La nova grupvoka sperto", "Favourite Messages": "Ŝatataj Mesaĝoj", - "Use new session manager": "Uzi nova administrado de salutaĵoj", - "New session manager": "Nova administrado de salutaĵoj", "You previously consented to share anonymous usage data with us. We're updating how that works.": "Vi antaŭe konsentis kunhavigi anonimajn uzdatumojn kun ni. Ni ĝisdatigas kiel tio funkcias.", "Stop": "Fini", "That's fine": "Tio estas bone", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 6378e201222..f9efba163e4 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -742,8 +742,6 @@ "Scissors": "Tijeras", "Call failed due to misconfigured server": "La llamada ha fallado debido a una mala configuración del servidor", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Por favor, pídele al administrador de tu servidor base (%(homeserverDomain)s) que configure un servidor TURN para que las llamadas funcionen correctamente.", - "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.": "Como alternativa, puedes intentar usar el servidor público turn.matrix.org, pero éste no será igual de confiable, y compartirá tu dirección IP con ese servidor. También puedes configurar esto en ajustes.", - "Try using turn.matrix.org": "Probar usando turn.matrix.org", "Messages": "Mensajes", "Actions": "Acciones", "Other": "Otros", @@ -2301,7 +2299,6 @@ "You have no ignored users.": "No has ignorado a nadie.", "Pause": "Pausar", "Play": "Reproducir", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Esto es una funcionalidad experimental. Por ahora, los usuarios nuevos que reciban una invitación tendrán que abrirla en para unirse.", "Select a room below first": "Selecciona una sala de abajo primero", "Join the beta": "Unirme a la beta", "Leave the beta": "Salir de la beta", @@ -2670,23 +2667,12 @@ "Yours, or the other users' session": "Tu sesión o la de la otra persona", "Yours, or the other users' internet connection": "Tu conexión a internet o la de la otra persona", "The homeserver the user you're verifying is connected to": "El servidor base del usuario al que estás invitando", - "Where you're signed in": "Sitios donde has iniciado sesión", "Rename": "Cambiar nombre", - "Sign Out": "Cerrar sesión", - "This device": "Este dispositivo", - "You aren't signed into any other devices.": "No tienes ninguna otra sesión abierta en otros dispositivos.", - "Sign out %(count)s selected devices|one": "Cerrar sesión en %(count)s dispositivo seleccionado", - "Sign out %(count)s selected devices|other": "Cerrar sesión en los %(count)s dispositivos seleccionados", - "Devices without encryption support": "Dispositivos no compatibles con el cifrado de mensajes", - "Unverified devices": "Dispositivos sin verificar", - "Verified devices": "Dispositivos verificados", "Select all": "Seleccionar todo", "Deselect all": "Deseleccionar todo", "Sign out devices|one": "Cerrar sesión en el dispositivo", "Sign out devices|other": "Cerrar sesión en los dispositivos", "Click the button below to confirm signing out these devices.|other": "Haz clic en el botón de abajo para confirmar y cerrar sesión en estos dispositivos.", - "Unable to load device list": "No se ha podido cargar la lista de dispositivos", - "Your homeserver does not support device management.": "Tu servidor base no es compatible con la gestión de dispositivos.", "Use a more compact 'Modern' layout": "Usar una disposición más compacta y «moderna»", "Light high contrast": "Claro con contraste alto", "Own your conversations.": "Toma el control de tus conversaciones.", @@ -2695,7 +2681,6 @@ "If you can't see who you're looking for, send them your invite link below.": "Si no encuentras a quien buscas, envíale tu enlace de invitación que encontrarás abajo.", "%(senderDisplayName)s changed who can join this room. View settings.": "%(senderDisplayName)s cambió quién puede unirse a esta sala. Ver ajustes.", "%(senderDisplayName)s changed who can join this room.": "%(senderDisplayName)s cambió quién puede unirse a esta sala.", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Gestiona los dispositivos en los que has iniciado sesión debajo. Las personas con las que te comuniques pueden ver los nombres de tus dispositivos.", "Use high contrast": "Usar un modo con contraste alto", "Click the button below to confirm signing out these devices.|one": "Haz clic en el botón de abajo para confirmar que quieres cerrar la sesión de este dispositivo.", "Automatically send debug logs on any error": "Mandar automáticamente los registros de depuración cuando ocurra cualquier error", @@ -2794,7 +2779,6 @@ "Share location": "Compartir ubicación", "This room isn't bridging messages to any platforms. Learn more.": "Esta sala no está conectada con ninguna otra plataforma de mensajería. Más información.", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Comparte datos anónimos para ayudarnos a descubrir fallos. No incluye nada personal, y no se comparten con terceros.", - "Okay": "Vale", "To view all keyboard shortcuts, click here.": "Para ver todos los atajos de teclado, haz clic aquí.", "Use new room breadcrumbs": "Usar la nueva navegación de salas", "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "Comparte datos anónimos con nosotros para ayudarnos a descubrir fallos. No incluye nada personal, y no se comparten con terceros. Más información", @@ -3417,8 +3401,6 @@ "Enable notifications for this account": "Activar notificaciones para esta cuenta", "Fill screen": "Llenar la pantalla", "Sorry — this call is currently full": "Lo sentimos — la llamada está llena", - "Use new session manager": "Usar el nuevo gestor de sesiones", - "New session manager": "Nuevo gestor de sesiones", "New group call experience": "Nueva experiencia de llamadas grupales", "Element Call video rooms": "Salas de vídeo Element Call", "Notifications silenced": "Notificaciones silenciadas", @@ -3431,8 +3413,6 @@ "This provides them with confidence that they are really speaking to you, but it also means they can see the session name you enter here.": "Esto ayuda a otorgar la confianza de que realmente están hablando contigo, pero significa que podrán ver el nombre de la sesión que pongas aquí.", "Other users in direct messages and rooms that you join are able to view a full list of your sessions.": "La lista completa de tus sesiones podrá ser vista por otros usuarios en tus mensajes directos y salas en las que estés.", "Record the client name, version, and url to recognise sessions more easily in session manager": "Registrar el nombre del cliente, la versión y URL para reconocer de forma más fácil las sesiones en el gestor", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Nuestro nuevo gestor de sesiones permite tener una mayor visibilidad sobre todas tus sesiones, así como más control sobre ellas. Incluye la habilidad de configurar las notificaciones push de forma remota.", - "Have greater visibility and control over all your sessions.": "Ten una mejor visibilidad y control sobre todas tus sesiones.", "Consider signing out from old sessions (%(inactiveAgeDays)s days or older) you don't use anymore.": "Considera cerrar sesión en los dispositivos que ya no uses (hace %(inactiveAgeDays)s días o más).", "You can use this device to sign in a new device with a QR code. You will need to scan the QR code shown on this device with your device that's signed out.": "Puedes usar este dispositivo para iniciar sesión en uno nuevo escaneando un código QR. Tendrás que escanearlo con el nuevo dispositivo que quieras usar para iniciar sesión.", "%(hours)sh %(minutes)sm %(seconds)ss left": "queda(n) %(hours)sh %(minutes)sm %(seconds)ss", @@ -3457,7 +3437,6 @@ "Are you sure you want to sign out of %(count)s sessions?|one": "¿Seguro que quieres cerrar %(count)s sesión?", "Are you sure you want to sign out of %(count)s sessions?|other": "¿Seguro que quieres cerrar %(count)s sesiones?", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "Solo se activará si tu servidor base no ofrece uno. Tu dirección IP se compartirá durante la llamada.", - "Allow fallback call assist server (turn.matrix.org)": "Permitir servidor de respaldo en llamadas (turn.matrix.org)", "Automatic gain control": "Control automático de volumen", "Allow Peer-to-Peer for 1:1 calls": "Permitir llamadas directas 1-a-1 (peer-to-peer)", "Yes, stop broadcast": "Sí, detener retransmisión", @@ -3507,15 +3486,6 @@ "Change layout": "Cambiar disposición", "This message could not be decrypted": "No se ha podido descifrar este mensaje", " in %(room)s": " en %(room)s", - "Resend key requests": "Volver a solicitar las claves", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "Desgraciadamente, no hay ningún otro dispositivo verificado al que solicitarle las claves para descifrar. En el futuro, inicia sesión y verifica otros dispositivos para evitar esta situación.", - "Some messages could not be decrypted": "No se han podido descifrar algunos mensajes", - "View your device list": "Ver la lista de tus dispositivos", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "Este dispositivo está solicitando a tus otros dispositivos las claves para descifrar los mensajes. Usa otro dispositivo para acelerar el proceso.", - "Open another device to load encrypted messages": "Usa otro dispositivo para cargar los mensajes cifrados", - "This device was unable to decrypt some messages because it has not been verified yet.": "Este dispositivo no pudo descifrar algunos mensajes, porque todavía no ha sido verificado.", - "Verify this device to access all messages": "Verifica este dispositivo para acceder a todos tus mensajes", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Por favor, espera mientras intentamos descifrar tus mensajes. Esto puede tardar unos instantes.", "Improve your account security by following these recommendations.": "Mejora la seguridad de tu cuenta siguiendo estas recomendaciones.", "Sign out of %(count)s sessions|one": "Cerrar %(count)s sesión", "Sign out of %(count)s sessions|other": "Cerrar %(count)s sesiones", diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 726da1a802d..06555e8dfc1 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -902,8 +902,6 @@ "%(oneUser)schanged their avatar %(count)s times|other": "Kasutaja %(oneUser)s muutis oma tunnuspilti %(count)s korda", "%(oneUser)schanged their avatar %(count)s times|one": "Kasutaja %(oneUser)s muutis oma tunnuspilti", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Palu oma koduserveri haldajat (%(homeserverDomain)s), et ta seadistaks kõnede kindlamaks toimimiseks TURN serveri.", - "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.": "Alternatiivina võid sa kasutada avalikku serverit turn.matrix.org, kuid see ei pruugi olla piisavalt töökindel ning sa jagad ka oma IP-aadressi selle serveriga. Täpsemalt saad seda määrata seadistustes.", - "Try using turn.matrix.org": "Proovi kasutada turn.matrix.org serverit", "OK": "Sobib", "Permission Required": "Vaja on täiendavaid õigusi", "Continue": "Jätka", @@ -1968,7 +1966,7 @@ "Topic: %(topic)s ": "Teema: %(topic)s ", "Topic: %(topic)s (edit)": "Teema: %(topic)s (muudetud)", "This is the beginning of your direct message history with .": "See on sinu ja kasutaja otsesuhtluse ajaloo algus.", - "Only the two of you are in this conversation, unless either of you invites anyone to join.": "Seni kuni emb-kumb teist kolmandaid osapooli liituma ei kutsu, olete siin vestluses vaid teie kahekesi.", + "Only the two of you are in this conversation, unless either of you invites anyone to join.": "Kuni kumbki teist kolmandaid osapooli liituma ei kutsu, olete siin vestluses vaid teie kahekesi.", "Takes the call in the current room off hold": "Võtab selles jututoas ootel oleva kõne", "Places the call in the current room on hold": "Jätab kõne selles jututoas ootele", "Go to Home View": "Avalehele", @@ -2303,7 +2301,6 @@ "You have no ignored users.": "Sa ei ole veel kedagi eiranud.", "Play": "Esita", "Pause": "Peata", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "See on katseline funktsionaalsus. Seetõttu uued kutse saanud kasutajad peavad tegelikuks liitumiseks avama kutse siin .", "Select a room below first": "Esmalt vali alljärgnevast üks jututuba", "Join the beta": "Hakka kasutama beetaversiooni", "Leave the beta": "Lõpeta beetaversiooni kasutamine", @@ -2684,17 +2681,7 @@ "Yours, or the other users' internet connection": "Sinu või teise kasutaja internetiühendus", "The homeserver the user you're verifying is connected to": "Sinu poolt verifitseeritava kasutaja koduserver", "This room isn't bridging messages to any platforms. Learn more.": "See jututuba ei kasuta sõnumisildasid liidestamiseks muude süsteemidega. Lisateave.", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Järgnevas saad hallata seadmeid, kus sa oled võrku loginud. Seadme nimi on nähtav ka neile, kellega sa suhtled.", - "Where you're signed in": "Kus sa oled võrku loginud", "Rename": "Muuda nime", - "Sign Out": "Logi välja", - "This device": "See seade", - "You aren't signed into any other devices.": "Sa pole mitte üheski muus seadmes sisse loginud.", - "Sign out %(count)s selected devices|one": "Logi %(count)s valitud seade võrgust välja", - "Sign out %(count)s selected devices|other": "Logi %(count)s valitud seadet võrgust välja", - "Devices without encryption support": "Seadmed, mille puudub krüptimise tugi", - "Unverified devices": "Verifitseerimata seadmed", - "Verified devices": "Verifitseeritud seadmed", "Select all": "Vali kõik", "Deselect all": "Eemalda kõik valikud", "Sign out devices|other": "Logi seadmed võrgust välja", @@ -2703,8 +2690,6 @@ "Click the button below to confirm signing out these devices.|other": "Kinnitamaks nende seadmete väljalogimine klõpsi järgnevat nuppu.", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Kasutades ühekordse sisselogimisega oma isiku tõestamist kinnita selle seadme väljalogimine.", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "Kasutades ühekordse sisselogimisega oma isiku tõestamist kinnita nende seadmete väljalogimine.", - "Unable to load device list": "Seadmete loendi laadimine ei ole võimalik", - "Your homeserver does not support device management.": "Sinu koduserver ei toeta seadmete haldust.", "Automatically send debug logs on any error": "Iga vea puhul saada silumislogid automaatselt arendajatele", "Use a more compact 'Modern' layout": "Kasuta kompaktsemat moodsat kasutajaliidest", "Add option": "Lisa valik", @@ -2796,7 +2781,6 @@ "Share location": "Jaga asukohta", "Manage pinned events": "Halda klammerdatud sündmusi", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Võimalike vigade leidmiseks jaga meiega anonüümseid andmeid. Isiklikku teavet meie ei kogu ega jaga mitte midagi kolmandate osapooltega.", - "Okay": "Sobib", "Use new room breadcrumbs": "Jututoa juures näita jäljerida", "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "Võimalike vigade leidmiseks jaga meiega anonüümseid andmeid. Isiklikku teavet meie ei kogu ega jaga mitte midagi kolmandate osapooltega. Lisateave", "Are you sure you want to end this poll? This will show the final results of the poll and stop people from being able to vote.": "Kas sa oled kindel, et soovid lõpetada küsitlust? Sellega on tulemused lõplikud ja rohkem osaleda ei saa.", @@ -3426,10 +3410,6 @@ "pause voice broadcast": "peata ringhäälingukõne", "Underline": "Allajoonitud tekst", "Italic": "Kaldkiri", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Uues sessioonihalduris saad parema ülevaate kõikidest oma sessioonidest ning rohkem võimalusi neid hallata, sealhulgas tõuketeavituste sisse- ja väljalülitamine.", - "Have greater visibility and control over all your sessions.": "Sellega saad parema ülevaate oma sessioonidest ja võimaluse neid mugavasti hallata.", - "New session manager": "Uus sessioonihaldur", - "Use new session manager": "Kasuta uut sessioonihaldurit", "Notifications silenced": "Teavitused on summutatud", "Completing set up of your new device": "Lõpetame uue seadme seadistamise", "Waiting for device to sign in": "Ootame, et teine seade logiks võrku", @@ -3480,7 +3460,6 @@ "Automatically adjust the microphone volume": "Kohanda mikrofoni valjust automaatelt", "Voice settings": "Heli seadistused", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "On kasutusel vaid siis, kui sinu koduserver sellist teenust ei võimalda. Seeläbi jagatakse kõne ajal sinu seadme IP-aadressi.", - "Allow fallback call assist server (turn.matrix.org)": "Luba tagavara-kõnehõlbustusserveri kasutamine (turn.matrix.org)", "Noise suppression": "Müra vähendamine", "Echo cancellation": "Kaja eemaldamine", "When enabled, the other party might be able to see your IP address": "Kui see seadistus on kasutusel, siis teisel osapoolel võib olla võimalik näha sinu seadme IP-aadressi", @@ -3555,17 +3534,6 @@ "You ended a voice broadcast": "Sa lõpetasid ringhäälingukõne", "Unable to decrypt message": "Sõnumi dekrüptimine ei õnnestunud", "This message could not be decrypted": "Seda sõnumit ei õnnestunud dekrüptida", - "Resend key requests": "Saada võtmete päring uuesti", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "Kahjuks pole sul teisi verifitseeritud seadmeid, mida saaks kasutada puuduvate krüptovõtmete laadimiseks. Kui sa logid veel mõnda seadmesse ja verifitseerid need, siis saad sa tulevikus sellist olukorda vältida.", - "Some messages could not be decrypted": "Mõnda sõnumit ei õnnestunud dekrüptida", - "View your device list": "Vaata oma seadmete loendit", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "See seade pärib krüptovõtmeid mõnest muust sinu seadmest. Kui see rakendus on teises seadmes kasutusel, siis võib päring toimuda kiiremini.", - "Open another device to load encrypted messages": "Krüptitud sõnumite laadimiseks kasuta mõnda muud oma seadet", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "Seeläbi sa ei saa lugeda vanu dekrüptimata sõnumeid, kuid krüptovõtmete lähtestamine võimaldab lugeda uusi sõnumeid.", - "Reset your keys to prevent future decryption errors": "Tulevaste dekrüptimisvigade vältimiseks palun lähtesta oma krüptovõtmed", - "This device was unable to decrypt some messages because it has not been verified yet.": "Kuna osa või kõik verifitseerimistest on tegemata, siis see seade ei suutnud kõiki sõnumeid dekrüptida.", - "Verify this device to access all messages": "Kõikide sõnumite lugemiseks palun verifitseeri see seade", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Palun oota hetke kuni me dekrüptime sõnumeid. Natuke võib kuluda aega.", "Rust cryptography implementation": "Rust'is teostatud krüptolahendus", "%(senderName)s ended a voice broadcast": "%(senderName)s lõpetas ringhäälingukõne", "You ended a voice broadcast": "Sa lõpetasid ringhäälingukõne", @@ -3670,7 +3638,6 @@ "Joining space…": "Liitun kogukonnaga…", "Encrypting your message…": "Krüptin sinu sõnumit…", "Sending your message…": "Saadan sinu sõnumit…", - "Decrypting messages…": "Sõnumid on dekrüptimisel…", "Set a new account password…": "Määra kontole uus salasõna…", "Downloading update…": "Laadin alla uuendust…", "Checking for an update…": "Kontrollin uuenduste olemasolu…", @@ -3777,5 +3744,11 @@ "Once invited users have joined %(brand)s, you will be able to chat and the room will be end-to-end encrypted": "Kui kutse saanud kasutajad on liitunud %(brand)s'ga, siis saad sa nendega suhelda ja jututuba on läbivalt krüptitud", "Waiting for users to join %(brand)s": "Kasutajate liitumise ootel %(brand)s'ga", "You do not have permission to invite users": "Sul pole õigusi kutse saatmiseks teistele kasutajatele", - "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s muutis oma kuvatavat nime ja tunnuspilti" + "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s muutis oma kuvatavat nime ja tunnuspilti", + "Your language": "Sinu keel", + "Your device ID": "Sinu seadme tunnus", + "Alternatively, you can try to use the public server at , but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternatiivina võid sa kasutada avalikku serverit , kuid see ei pruugi olla piisavalt töökindel ning sa jagad ka oma IP-aadressi selle serveriga. Täpsemalt saad seda määrata seadistustes.", + "User is not logged in": "Kasutaja pole võrku loginud", + "Allow fallback call assist server (%(server)s)": "Varuvariandina luba kasutada ka teist kõnehõlbustusserverit (%(server)s)", + "Try using %(server)s": "Proovi kasutada %(server)s serverit" } diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 839910c4fd3..a1123763f5b 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -933,8 +933,6 @@ "Summary": "Laburpena", "Call failed due to misconfigured server": "Deiak huts egin du zerbitzaria gaizki konfiguratuta dagoelako", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Eskatu zure hasiera-zerbitzariaren administratzaileari (%(homeserverDomain)s) TURN zerbitzari bat konfiguratu dezala deiek ondo funtzionatzeko.", - "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.": "Bestela, turn.matrix.org zerbitzari publikoa erabili dezakezu, baina hau ez da hain fidagarria izango, eta zure IP-a partekatuko du zerbitzari horrekin. Hau ezarpenetan ere kudeatu dezakezu.", - "Try using turn.matrix.org": "Saiatu turn.matrix.org erabiltzen", "Messages": "Mezuak", "Actions": "Ekintzak", "Displays list of commands with usages and descriptions": "Aginduen zerrenda bistaratzen du, erabilera eta deskripzioekin", diff --git a/src/i18n/strings/fa.json b/src/i18n/strings/fa.json index e9b069d8a5c..61888837ea8 100644 --- a/src/i18n/strings/fa.json +++ b/src/i18n/strings/fa.json @@ -185,8 +185,6 @@ "Unable to access webcam / microphone": "امکان دسترسی به دوربین/میکروفون وجود ندارد", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "تماس به دلیل عدم دسترسی به میکروفون موفقیت‌آمیز نبود. لطفا اتصال و تنظیمات صحیح میکروفون را بررسی نمائید.", "Unable to access microphone": "دسترسی به میکروفون امکان‌پذیر نیست", - "Try using turn.matrix.org": "turn.hivaa.im را امتحان کنید", - "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 عمومی turn.hivaa.im استفاده نمائید؛ توجه کنید در این حالت، میزان کیفیت تماس‌ها چندان قابل اتکاء نبوده و همچنین آدرس IP کاربران برای سرور مشخص می‌شود. در صورت نیاز می‌توانید پیکربندی این بخش را در تنظیمات برنامه تغییر دهید.", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "لطفا برای برقراری تماس، از مدیر %(homeserverDomain)s بخواهید سرور TURN را پیکربندی نماید.", "Call failed due to misconfigured server": "تماس به دلیل پیکربندی نادرست سرور موفقیت‌آمیز نبود", "The call was answered on another device.": "تماس بر روی دستگاه دیگری پاسخ داده شد.", @@ -845,7 +843,6 @@ "Failed to invite the following users to your space: %(csvUsers)s": "امکان دعوت کاربرانی که در ادامه آمده‌اند به فضای کاری شما میسر نیست: %(csvUsers)s", "Invite your teammates": "هم‌تیمی‌های خود را دعوت کنید", "Make sure the right people have access. You can invite more later.": "اطمینان حاصل کنید که افراد مناسب دسترسی دارند. بعداً می توانید افراد بیشتری دعوت کنید.", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "این یک قابلیت آزمایشی است. برای الان، کاربران جدیدی که دعوتنامه دریافت می‌کنند باید آن را بر روی باز کنند تا بتوانند عضو شوند.", "Invite by username": "دعوت به نام کاربری", "What are some things you want to discuss in %(spaceName)s?": "برخی از مواردی که می خواهید درباره‌ی آن‌ها در %(spaceName)s بحث کنید، چیست؟", "Let's create a room for each of them.": "بیایید برای هر یک از آنها یک اتاق درست کنیم.", @@ -2422,7 +2419,6 @@ "Jump to end of the composer": "پرش به انتهای نوشته", "Toggle Code Block": "تغییر بلاک کد", "Toggle Link": "تغییر لینک", - "Unverified devices": "دستگاه های تایید نشده", "Enable Markdown": "Markdown را فعال کن", "Displaying time": "نمایش زمان", "Use Ctrl + F to search timeline": "جهت جستجوی تایم لاین ترکیب کلیدهای Ctrl و F را بکار ببر", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index c659c8830e4..2f66c15efed 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -945,8 +945,6 @@ "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Yhteyden katkaiseminen identiteettipalvelimeesi tarkoittaa, että muut käyttäjät eivät löydä sinua etkä voi kutsua muita sähköpostin tai puhelinnumeron perusteella.", "Call failed due to misconfigured server": "Puhelu epäonnistui palvelimen väärien asetusten takia", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Pyydä kotipalvelimesi (%(homeserverDomain)s) ylläpitäjää asentamaan TURN-palvelin, jotta puhelut toimisivat luotettavasti.", - "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.": "Vaihtoehtoisesti voit kokeilla käyttää julkista palvelinta osoitteessa turn.matrix.org, mutta tämä vaihtoehto ei ole yhtä luotettava ja jakaa IP-osoitteesi palvelimen kanssa. Voit myös hallita tätä asiaa asetuksissa.", - "Try using turn.matrix.org": "Kokeile käyttää palvelinta turn.matrix.org", "Only continue if you trust the owner of the server.": "Jatka vain, jos luotat palvelimen omistajaan.", "reacted with %(shortName)s": "reagoi(vat) emojilla %(shortName)s", "Accept to continue:": "Hyväksy jatkaaksesi:", @@ -2425,23 +2423,15 @@ "%(senderName)s banned %(targetName)s": "%(senderName)s antoi porttikiellon käyttäjälle %(targetName)s", "%(senderName)s banned %(targetName)s: %(reason)s": "%(senderName)s antoi porttikiellon käyttäjälle %(targetName)s: %(reason)s", "Sidebar": "Sivupalkki", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Hallitse sisäänkirjattuja laitteitasi alapuolella. Laitteen nimi näkyy kaikille, joiden kanssa olet yhteydessä.", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Jaa anonyymia tietoa auttaaksesi ongelmien tunnistamisessa. Ei mitään henkilökohtaista. Ei kolmansia osapuolia.", - "Okay": "OK", "Updating spaces... (%(progress)s out of %(count)s)|one": "Päivitetään avaruutta...", "Updating spaces... (%(progress)s out of %(count)s)|other": "Päivitetään avaruuksia... (%(progress)s/%(count)s)", "Use high contrast": "Käytä suurta kontrastia", "To view all keyboard shortcuts, click here.": "Katso kaikki pikanäppäimet napsauttamalla tästä.", - "You aren't signed into any other devices.": "Et ole kirjautunut yhdellekään muulle laitteelle.", - "Sign out %(count)s selected devices|one": "Kirjaa ulos %(count)s valittu laite", - "Sign out %(count)s selected devices|other": "Kirjaa ulos %(count)s valittua laitetta", - "Devices without encryption support": "Laitteet ilman salaustukea", "Select all": "Valitse kaikki", "Deselect all": "Älä valitse mitään", "Click the button below to confirm signing out these devices.|one": "Napsauta alla olevaa painiketta vahvistaaksesi tämän laitteen uloskirjauksen.", "Click the button below to confirm signing out these devices.|other": "Napsauta alla olevaa painiketta vahvistaaksesi näiden laitteiden uloskirjauksen.", - "Unable to load device list": "Laitelistan lataaminen ei onnistu", - "Your homeserver does not support device management.": "Kotipalvelimesi ei tue laitehallintaa.", "Add some details to help people recognise it.": "Lisää joitain tietoja, jotta ihmiset tunnistavat sen.", "Pin to sidebar": "Kiinnitä sivupalkkiin", "Quick settings": "Pika-asetukset", @@ -2457,11 +2447,6 @@ "You cannot place calls in this browser.": "Et voi soittaa puheluja tässä selaimessa.", "Calls are unsupported": "Puhelut eivät ole tuettuja", "Rename": "Nimeä uudelleen", - "Sign Out": "Kirjaudu ulos", - "Where you're signed in": "Missä olet sisäänkirjautuneena", - "Unverified devices": "Vahvistamattomat laitteet", - "Verified devices": "Vahvistetut laitteet", - "This device": "Tämä laite", "Files": "Tiedostot", "Toggle space panel": "Avaruuspaneeli päälle/pois", "Space Autocomplete": "Avaruuksien automaattinen täydennys", @@ -3116,7 +3101,6 @@ "It’s what you’re here for, so lets get to it": "Sen vuoksi olet täällä, joten aloitetaan", "Find and invite your friends": "Etsi ja kutsu ystäviä", "Sorry — this call is currently full": "Pahoittelut — tämä puhelu on täynnä", - "New session manager": "Uusi istunnonhallinta", "Send read receipts": "Lähetä lukukuittaukset", "Can I use text chat alongside the video call?": "Voinko käyttää tekstikeskustelua videopuhelussa?", "Notifications silenced": "Ilmoitukset hiljennetty", @@ -3158,8 +3142,6 @@ "Spaces are a new way to group rooms and people. What kind of Space do you want to create? You can change this later.": "Avaruudet ovat uusi tapa ryhmitellä huoneita ja ihmisiä. Minkälaisen avaruuden sinä haluat luoda? Voit muuttaa tätä asetusta myöhemmin.", "Automatically send debug logs on decryption errors": "Lähetä vianjäljityslokit automaattisesti salauksen purkuun liittyvien virheiden tapahtuessa", "Automatically send debug logs on any error": "Lähetä vianjäljityslokit automaattisesti minkä tahansa virheen tapahtuessa", - "Have greater visibility and control over all your sessions.": "Aiempaa parempi näkyvyys ja hallittavuus kaikkiin istuntoihisi.", - "Use new session manager": "Käytä uutta istuntohallintaa", "New group call experience": "Uusi ryhmäpuhelukokemus", "Yes, the chat timeline is displayed alongside the video.": "Kyllä, keskustelun aikajana esitetään videon yhteydessä.", "Use the “+” button in the room section of the left panel.": "Käytä ”+”-painiketta vasemman paneelin huoneosiossa.", @@ -3269,10 +3251,6 @@ "Unable to decrypt message": "Viestin salauksen purkaminen ei onnistu", "Change layout": "Vaihda asettelua", "This message could not be decrypted": "Tämän viestin salausta ei voitu purkaa", - "Some messages could not be decrypted": "Joidenkin viestien salausta ei voitu purkaa", - "View your device list": "Näytä laiteluettelo", - "Verify this device to access all messages": "Vahvista tämä laite saadaksesi pääsyn kaikkiin viesteihisi", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Odota, kun yritämme purkaa viestiesi salausta. Tämä saattaa kestää hetken.", "Improve your account security by following these recommendations.": "Paranna tilisi tietoturvaa seuraamalla näitä suosituksia.", "%(count)s sessions selected|one": "%(count)s istunto valittu", "%(count)s sessions selected|other": "%(count)s istuntoa valittu", @@ -3314,7 +3292,6 @@ "Early previews": "Ennakot", "If you want to retain access to your chat history in encrypted rooms you should first export your room keys and re-import them afterwards.": "Jos haluat säilyttää pääsyn keskusteluhistoriaasi salausta käyttävissä huoneissa, vie ensin huoneen avaimesi ja tuo ne sen jälkeen takaisin.", "You made it!": "Onnistui!", - "Allow fallback call assist server (turn.matrix.org)": "Salli varalla puhelun apupalvelin (turn.matrix.org)", "Noise suppression": "Kohinanvaimennus", "Allow Peer-to-Peer for 1:1 calls": "Salli vertaisyhteydet kahdenvälisissä puheluissa", "Rust cryptography implementation": "Rust-kryptografiatoteutus", @@ -3371,5 +3348,85 @@ "Could not find room": "Huonetta ei löytynyt", "WARNING: session already verified, but keys do NOT MATCH!": "VAROITUS: istunto on jo vahvistettu, mutta avaimet EIVÄT TÄSMÄÄ!", "iframe has no src attribute": "iframella ei ole src-attribuuttia", - "Use your account to continue.": "Käytä tiliäsi jatkaaksesi." + "Use your account to continue.": "Käytä tiliäsi jatkaaksesi.", + "Safeguard against losing access to encrypted messages & data by backing up encryption keys on your server.": "Suojaudu salattuihin viesteihin ja tietoihin pääsyn menettämiseltä varmuuskopioimalla salausavaimesi palvelimellesi.", + "Signing In…": "Kirjaudutaan…", + "Syncing…": "Synkronoidaan…", + "Inviting…": "Kutsutaan…", + "Creating rooms…": "Luodaan huoneita…", + "Keep going…": "Jatka…", + "Connecting…": "Yhdistetään…", + "Mute room": "Mykistä huone", + "Sender: ": "Lähettäjä: ", + "No receipt found": "Kuittausta ei löytynyt", + "Main timeline": "Pääaikajana", + "Fetching keys from server…": "Noudetaan avaimia palvelimelta…", + "Checking…": "Tarkistetaan…", + "Invites by email can only be sent one at a time": "Sähköpostikutsuja voi lähettää vain yhden kerrallaan", + "Processing…": "Käsitellään…", + "Adding…": "Lisätään…", + "Write something…": "Kirjoita joitain…", + "Message from %(user)s": "Viesti käyttäjältä %(user)s", + "Message in %(room)s": "Viesti huoneessa %(room)s", + "Answered elsewhere": "Vastattu muualla", + "The sender has blocked you from receiving this message": "Lähettäjä on estänyt sinua saamasta tätä viestiä", + "unavailable": "ei saatavilla", + "unknown status code": "tuntematon tilakoodi", + "Server returned %(statusCode)s with error code %(errorCode)s": "Palvelin palautti tilakoodin %(statusCode)s ja virhekoodin %(errorCode)s", + "View poll": "Näytä kysely", + "There are no past polls for the past %(count)s days. Load more polls to view polls for previous months|one": "Menneitä kyselyitä ei ole viimeisen vuorokauden ajalta. Lataa lisää kyselyitä nähdäksesi aiempien kuukausien kyselyt.", + "There are no past polls for the past %(count)s days. Load more polls to view polls for previous months|other": "Menneitä kyselyitä ei ole viimeisen %(count)s päivän ajalta. Lataa lisää kyselyitä nähdäksesi aiempien kuukausien kyselyt.", + "There are no active polls for the past %(count)s days. Load more polls to view polls for previous months|one": "Aktiivisia kyselyitä ei ole viimeisen vuorokauden ajalta. Lataa lisää kyselyitä nähdäksesi aiempien kuukausien kyselyt.", + "There are no active polls for the past %(count)s days. Load more polls to view polls for previous months|other": "Aktiivisia kyselyitä ei ole viimeisen %(count)s päivän ajalta. Lataa lisää kyselyitä nähdäksesi aiempien kuukausien kyselyt.", + "There are no past polls. Load more polls to view polls for previous months": "Menneitä kyselyitä ei ole. Lataa lisää kyselyitä nähdäksesi aiempien kuukausien kyselyt.", + "There are no active polls. Load more polls to view polls for previous months": "Aktiivisia kyselyitä ei ole. Lataa lisää kyselyitä nähdäksesi aiempien kuukausien kyselyt.", + "There are no past polls in this room": "Tässä huoneessa ei ole menneitä kyselyitä", + "There are no active polls in this room": "Tässä huoneessa ei ole aktiivisia kyselyitä", + "Load more polls": "Lataa lisää kyselyitä", + "Loading polls": "Ladataan kyselyitä", + "Past polls": "Menneet kyselyt", + "Active polls": "Aktiiviset kyselyt", + "View poll in timeline": "Näytä kysely aikajanalla", + "All messages and invites from this user will be hidden. Are you sure you want to ignore them?": "Kaikki tämän käyttäjän lähettämät viestit ja kutsut sivuutetaan. Haluatko varmasti sivuuttaa hänet?", + "Ignore %(user)s": "Sivuuta %(user)s", + "Poll history": "Kyselyhistoria", + "Edit link": "Muokkaa linkkiä", + "Indent decrease": "Sisennyksen vähennys", + "Indent increase": "Sisennyksen lisäys", + "Rejecting invite…": "Hylätään kutsua…", + "Loading…": "Ladataan…", + "Joining room…": "Liitytään huoneeseen…", + "Once everyone has joined, you’ll be able to chat": "Voitte keskustella, kun kaikki ovat liittyneet", + "Send your first message to invite to chat": "Kutsu keskusteluun kirjoittamalla ensimmäinen viesti", + "Formatting": "Muotoilu", + "You do not have permission to invite users": "Sinulla ei ole lupaa kutsua käyttäjiä", + "This provides them with confidence that they are really speaking to you, but it also means they can see the session name you enter here.": "Tämä antaa heille varmuuden, että he keskustelevat oikeasti sinun kanssasi, mutta se myös tarkoittaa, että he näkevät tähän syöttämäsi istunnon nimen.", + "Other users in direct messages and rooms that you join are able to view a full list of your sessions.": "Muut käyttäjät yksityisviesteissä ja huoneissa, joihin liityt, näkevät luettelon kaikista istunnoistasi.", + "Identity server is %(identityServerUrl)s": "Identiteettipalvelin on %(identityServerUrl)s", + "Homeserver is %(homeserverUrl)s": "Kotipalvelin on %(homeserverUrl)s", + "The twemoji-colr font is © Mozilla Foundation used under the terms of Apache 2.0.": "twemoji-colr-fontti © Mozilla Foundation, käytössä Apache 2.0:n ehtojen mukaisesti.", + "The default cover photo is © Jesús Roncero used under the terms of CC-BY-SA 4.0.": "Oletuskansikuva © Jesús Roncero, käytössä CC-BY-SA 4.0:n ehtojen mukaisesti.", + "Manage account": "Hallitse tiliä", + "Error changing password": "Virhe salasanan vaihtamisessa", + "Unknown password change error (%(stringifiedError)s)": "Tuntematon salasananvaihtovirhe (%(stringifiedError)s)", + "Downloading update…": "Ladataan päivitystä…", + "Checking for an update…": "Tarkistetaan päivityksiä…", + "Error while changing password: %(error)s": "Virhe salasanan vaihtamisessa: %(error)s", + "Ignore (%(counter)s)": "Sivuuta (%(counter)s)", + "Keep ownership and control of community discussion.\nScale to support millions, with powerful moderation and interoperability.": "Pidä yhteisön keskustelu hallussa. Skaalautuu miljooniin käyttäjiin ja\ntarjoaa tehokkaan moderoinnin ja yhteentoimivuuden.", + "Log out and back in to disable": "Poista käytöstä kirjautumalla ulos ja takaisin sisään", + "Automatic gain control": "Automaattinen vahvistuksen säätö", + "Enable MSC3946 (to support late-arriving room archives)": "Ota käyttöön MSC3946 (viiveellä saapuvien huonearkistojen tukemiseksi)", + "Under active development, cannot be disabled.": "Työn alla, käytöstä poistaminen ei ole mahdollista.", + "Requires your server to support the stable version of MSC3827": "Edellyttää palvelimesi tukevan MSC3827:n vakaata versiota", + "If you know a room address, try joining through that instead.": "Jos tiedät huoneen osoitteen, yritä liittyä sen kautta.", + "Safeguard against losing access to encrypted messages & data": "Suojaudu salattuihin viesteihin ja tietoihin pääsyn menettämiseltä", + "WebGL is required to display maps, please enable it in your browser settings.": "Karttojen näyttäminen vaatii WebGL:n. Ota se käyttöön selaimen asetuksista.", + "Send %(msgtype)s messages as you in your active room": "Lähetä %(msgtype)s-viestejä itsenäsi aktiiviseen huoneeseesi", + "Send %(msgtype)s messages as you in this room": "Lähetä %(msgtype)s-viestejä itsenäsi tähän huoneeseen", + "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s vaihtoi näyttönimensä ja profiilikuvansa", + "Reload": "Lataa uudelleen", + "This may be caused by having the app open in multiple tabs or due to clearing browser data.": "Tämä voi johtua siitä, että sovellus on auki useissa välilehdissä tai selaimen tietojen tyhjentämisestä.", + "Database unexpectedly closed": "Tietokanta sulkeutui odottamattomasti", + "Identity server not set": "Identiteettipalvelinta ei ole asetettu" } diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 613626fa097..94cd1985a37 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -959,8 +959,6 @@ "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "La déconnexion de votre serveur d’identité signifie que vous ne serez plus découvrable par d’autres utilisateurs et que vous ne pourrez plus faire d’invitation par e-mail ou téléphone.", "Call failed due to misconfigured server": "L’appel a échoué à cause d’un serveur mal configuré", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Demandez à l’administrateur de votre serveur d’accueil (%(homeserverDomain)s) de configurer un serveur TURN afin que les appels fonctionnent de manière fiable.", - "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.": "Vous pouvez sinon essayer d’utiliser le serveur public turn.matrix.org, mais ça ne sera pas aussi fiable et votre adresse IP sera partagée avec ce serveur. Vous pouvez aussi gérer ce réglage dans les paramètres.", - "Try using turn.matrix.org": "Essayer d’utiliser turn.matrix.org", "Only continue if you trust the owner of the server.": "Continuez seulement si vous faites confiance au propriétaire du serveur.", "Identity server has no terms of service": "Le serveur d’identité n’a pas de conditions de service", "The identity server you have chosen does not have any terms of service.": "Le serveur d’identité que vous avez choisi n’a pas de conditions de service.", @@ -2304,7 +2302,6 @@ "What do you want to organise?": "Que voulez-vous organiser ?", "You have no ignored users.": "Vous n’avez ignoré personne.", "Your access token gives full access to your account. Do not share it with anyone.": "Votre jeton d’accès donne un accès intégral à votre compte. Ne le partagez avec personne.", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Ceci est une fonctionnalité expérimentale. Pour l’instant, les nouveaux utilisateurs recevant une invitation devront l’ouvrir sur pour poursuivre.", "Select a room below first": "Sélectionnez un salon ci-dessous d’abord", "Join the beta": "Rejoindre la bêta", "Leave the beta": "Quitter la bêta", @@ -2679,19 +2676,9 @@ "The homeserver the user you're verifying is connected to": "Le serveur d’accueil auquel l’utilisateur que vous vérifiez est connecté", "Insert link": "Insérer un lien", "This room isn't bridging messages to any platforms. Learn more.": "Ce salon ne transmet les messages à aucune plateforme. En savoir plus.", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Gérer vos appareils connectés ci-dessous. Le nom d’un appareil est visible aux gens avec lesquels vous communiquez.", - "Where you're signed in": "Où vous vous êtes connecté", "Use high contrast": "Utiliser un contraste élevé", "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.": "Ce salon se trouve dans certains espaces pour lesquels vous n’êtes pas administrateur. Dans ces espaces, l’ancien salon sera toujours disponible, mais un message sera affiché pour inciter les personnes à rejoindre le nouveau salon.", "Rename": "Renommer", - "Sign Out": "Se déconnecter", - "This device": "Cet appareil", - "You aren't signed into any other devices.": "Vous n’êtes connecté depuis aucun autre appareil.", - "Sign out %(count)s selected devices|one": "Déconnecter %(count)s appareil sélectionné", - "Sign out %(count)s selected devices|other": "Déconnecter %(count)s appareils sélectionnés", - "Devices without encryption support": "Appareils sans support pour le chiffrement", - "Unverified devices": "Appareils non vérifiés", - "Verified devices": "Appareils vérifiés", "Select all": "Tout sélectionner", "Deselect all": "Tout désélectionner", "Sign out devices|one": "Déconnecter l’appareil", @@ -2700,8 +2687,6 @@ "Click the button below to confirm signing out these devices.|other": "Cliquer sur le bouton ci-dessous pour confirmer la déconnexion de ces appareils.", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Confirmez la déconnexion de cet appareil en utilisant l’authentification unique pour prouver votre identité.", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "Confirmez la déconnexion de ces appareils en utilisant l’authentification unique pour prouver votre identité.", - "Unable to load device list": "Impossible de charger la liste des appareils", - "Your homeserver does not support device management.": "Votre serveur d’accueil ne supporte pas la gestion des appareils.", "Automatically send debug logs on any error": "Envoyer automatiquement les journaux de débogage en cas d’erreur", "Use a more compact 'Modern' layout": "Utiliser une mise en page « moderne » plus compacte", "Light high contrast": "Contraste élevé clair", @@ -2799,7 +2784,6 @@ "Final result based on %(count)s votes|other": "Résultat final sur la base de %(count)s votes", "Manage pinned events": "Gérer les évènements épinglés", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Partager des données anonymisées pour nous aider à identifier les problèmes. Rien de personnel. Aucune tierce partie.", - "Okay": "D’accord", "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "Partager des données anonymisées pour nous aider à identifier les problèmes. Aucune tierce partie. En savoir plus", "You previously consented to share anonymous usage data with us. We're updating how that works.": "Vous aviez précédemment consenti au partage de données d’utilisation anonymisées avec nous. Nous sommes en train de changer ce fonctionnement.", "Help improve %(analyticsOwner)s": "Aidez à améliorer %(analyticsOwner)s", @@ -3422,10 +3406,6 @@ "Join %(brand)s calls": "Rejoindre des appels %(brand)s", "Start %(brand)s calls": "Démarrer des appels %(brand)s", "Sorry — this call is currently full": "Désolé — Cet appel est actuellement complet", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Notre nouveau gestionnaire de sessions fournit une meilleure visibilité sur toutes vos sessions, et un plus grand contrôle sur ces dernières avec la possibilité de désactiver à distance les notifications push.", - "Have greater visibility and control over all your sessions.": "Ayez une meilleur visibilité et plus de contrôle sur toutes vos sessions.", - "New session manager": "Nouveau gestionnaire de sessions", - "Use new session manager": "Utiliser le nouveau gestionnaire de session", "resume voice broadcast": "continuer la diffusion audio", "pause voice broadcast": "mettre en pause la diffusion audio", "Underline": "Souligné", @@ -3481,7 +3461,6 @@ "Voice settings": "Paramètres audio", "Automatically adjust the microphone volume": "Ajuster le volume du microphone automatiquement", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "Concerne seulement les serveurs d’accueil qui n’en proposent pas. Votre adresse IP pourrait être diffusée pendant un appel.", - "Allow fallback call assist server (turn.matrix.org)": "Autoriser le serveur d’appel de repli (turn.matrix.org)", "Noise suppression": "Suppression du bruit", "Echo cancellation": "Annulation d’écho", "Automatic gain control": "Contrôle automatique du gain", @@ -3555,17 +3534,6 @@ "You ended a voice broadcast": "Vous avez terminé une diffusion audio", "Unable to decrypt message": "Impossible de déchiffrer le message", "This message could not be decrypted": "Ce message n’a pas pu être déchiffré", - "Resend key requests": "Ré-envoyer les demandes de clés", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "Malheureusement, il n’y a aucun autre appareil vérifié auquel demander les clés de déchiffrement. La connexion et la vérification depuis d’autres appareils pourraient éviter ce genre de souci à l’avenir.", - "Some messages could not be decrypted": "Certains messages n’ont pas pu être déchiffrés", - "View your device list": "Voir la liste de vos appareils", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "Cet appareil a demandé les clés de déchiffrement à vos autres appareils. L’utilisation d’un de vos autres appareils peut accélérer cette demande.", - "Open another device to load encrypted messages": "Utiliser un autre appareil pour charger les messages chiffrés", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "Vous ne pourrez pas accéder à vos anciens messages indéchiffrables, mais la réinitialisation de vos clés vous permettra de recevoir de nouveaux messages.", - "Reset your keys to prevent future decryption errors": "Réinitialiser vos clés pour éviter d’autres erreurs de déchiffrement", - "This device was unable to decrypt some messages because it has not been verified yet.": "Cet appareil n’a pas pu déchiffrer certains messages parce qu’il n’a pas encore été vérifié.", - "Verify this device to access all messages": "Vérifier cet appareil pour accéder à tous les messages", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Veuillez patienter pendant que nous essayons de déchiffrer vos messages. Cela peut prendre un peu de temps.", "Rust cryptography implementation": "Implémentation cryptographique en Rust", "%(senderName)s ended a voice broadcast": "%(senderName)s a terminé une diffusion audio", "You ended a voice broadcast": "Vous avez terminé une diffusion audio", @@ -3670,7 +3638,6 @@ "Joining space…": "Entrée dans l’espace…", "Encrypting your message…": "Chiffrement de votre message…", "Sending your message…": "Envoi de votre message…", - "Decrypting messages…": "Déchiffrement des messages…", "Set a new account password…": "Définir un nouveau mot de passe de compte…", "Downloading update…": "Téléchargement de la mise-à-jour…", "Checking for an update…": "Recherche de mise à jour…", @@ -3777,5 +3744,7 @@ "Once invited users have joined %(brand)s, you will be able to chat and the room will be end-to-end encrypted": "Une fois que les utilisateurs invités seront connectés sur %(brand)s, vous pourrez discuter et le salon sera chiffré de bout en bout", "Waiting for users to join %(brand)s": "En attente de connexion des utilisateurs à %(brand)s", "You do not have permission to invite users": "Vous n’avez pas la permission d’inviter des utilisateurs", - "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s a changé son nom d’affichage et son image de profil" + "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s a changé son nom d’affichage et son image de profil", + "Your language": "Votre langue", + "Your device ID": "Votre ID d’appareil" } diff --git a/src/i18n/strings/ga.json b/src/i18n/strings/ga.json index af05830ce13..179ad6ee8ec 100644 --- a/src/i18n/strings/ga.json +++ b/src/i18n/strings/ga.json @@ -36,8 +36,6 @@ "You ended the call": "Chríochnaigh tú an glao", "Call in progress": "Glaoch ar siúl", "Unable to access microphone": "Ní féidir rochtain a fháil ar mhicreafón", - "Try using turn.matrix.org": "Déan iarracht turn.matrix.org a úsáid", - "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.": "De rogha air sin, is féidir leat iarracht a dhéanamh an freastalaí poiblí ag turn.matrix.org a úsáid, ach ní bheidh sé seo chomh iontaofa, agus roinnfidh sé do sheoladh ip leis an freastalaí sin. Is féidir leat é seo a bhainistiú sa socruithe freisin.", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Iarr ar an riarthóir do fhreastalaí baile (%(homeserverDomain)s) freastalaí TURN a chumrú go bhfeidhmeoidh glaonna go hiontaofa.", "Call failed due to misconfigured server": "Theip an glaoch de bharr freastalaí mícumraithe", "Answered Elsewhere": "Tógtha in áit eile", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index efe1a117300..b978e646456 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -529,8 +529,6 @@ "Unable to load! Check your network connectivity and try again.": "Non cargou! Comproba a conexión á rede e volta a intentalo.", "Call failed due to misconfigured server": "Fallou a chamada porque o servidor está mal configurado", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Contacta coa administración do teu servidor (%(homeserverDomain)s) para configurar un servidor TURN para que as chamadas funcionen de xeito fiable.", - "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.": "De xeito alternativo, podes intentar usar o servidor público turn.matrix.org, pero non é tan fiable, e compartirá o teu enderezo IP con ese servidor. Podes xestionar esto en Axustes.", - "Try using turn.matrix.org": "Inténtao usando turn.matrix.org", "The file '%(fileName)s' failed to upload.": "Fallou a subida do ficheiro '%(fileName)s'.", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "O ficheiro '%(fileName)s' supera o tamaño máximo permitido polo servidor", "The server does not support the room version specified.": "O servidor non soporta a versión da sala indicada.", @@ -2303,7 +2301,6 @@ "You have no ignored users.": "Non tes usuarias ignoradas.", "Play": "Reproducir", "Pause": "Deter", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Esta é unha característica experimental. Por agora as novas usuarias convidadas deberán abrir o convite en para poder unirse.", "Select a room below first": "Primeiro elixe embaixo unha sala", "Join the beta": "Unirse á beta", "Leave the beta": "Saír da beta", @@ -2697,21 +2694,11 @@ "Home is useful for getting an overview of everything.": "O Inicio é útil para ter unha visión xeral do que acontece.", "Spaces to show": "Espazos a mostrar", "Sidebar": "Barra lateral", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Xestiona os dispositivos desde os que te conectaches. O nome do dispositivo é visible para as persoas coas que te comunicas.", - "Where you're signed in": "Desde onde estás conectada", "Show tray icon and minimise window to it on close": "Mostra icona na bandexa do sistema e minimiza ventá ao pechar", "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 nos que non es admin. Nesos espazos, seguirase mostrando a sala antiga, pero as usuarias serán convidadas a unirse á nova.", "Large": "Grande", "Image size in the timeline": "Tamaño de imaxe na cronoloxía", "Rename": "Cambiar nome", - "Sign Out": "Desconectar", - "This device": "Este dispositivo", - "You aren't signed into any other devices.": "Non estás conectada a través de outros dispositivos.", - "Sign out %(count)s selected devices|one": "Desconectar %(count)s dispositivo seleccionado", - "Sign out %(count)s selected devices|other": "Desconectar %(count)s dispositivos seleccionados", - "Devices without encryption support": "Dispositivos sen soporte para cifrado", - "Unverified devices": "Dispositivos non verificados", - "Verified devices": "Dispositivos verificados", "Select all": "Seleccionar todos", "Deselect all": "Retirar selección a todos", "Sign out devices|one": "Desconectar dispositivo", @@ -2720,8 +2707,6 @@ "Click the button below to confirm signing out these devices.|other": "Preme no botón inferior para confirmar a desconexión destos dispositivos.", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Confirma a desconexión deste dispositivo usando Single Sign On para probar a túa identidade.", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "Confirma a desconexión destos dispositivos usando Single Sign On para probar a túa identidade.", - "Unable to load device list": "Non se pode cargar a lista de dispositivos", - "Your homeserver does not support device management.": "O teu servidor non ten soporte para xestión de dispositivos.", "Other rooms": "Outras salas", "sends rainfall": "envía chuvia", "Sends the given message with rainfall": "Envía a mensaxe dada incluíndo chuvia", @@ -2787,7 +2772,6 @@ "Share location": "Compartir localización", "Manage pinned events": "Xestiona os eventos fixados", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Comparte datos anónimos para axudarnos a identificar os problemas. Nada persoal. Nen con terceiras partes.", - "Okay": "OK", "To view all keyboard shortcuts, click here.": "Para ver tódolos atallos de teclado, preme aquí.", "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "Comparte datos anónimos para axudarnos a identificar os problemas. Nada persoal. Nin con terceiras partes. Coñece máis", "You previously consented to share anonymous usage data with us. We're updating how that works.": "Consentiches con anterioridade compartir datos anónimos de uso con nós. Estamos actualizando o seu funcionamento.", diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index 82c611b3681..59334e65468 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -220,8 +220,6 @@ "Unable to access webcam / microphone": "לא ניתן היה להפעיל מצלמה / מיקרופון", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "השיחה נכשלה בגלל שלא ניתן היה להפעיל את המיקרופון. אנא בדקו שהמיקרופון מחובר ומוגדר נכון.", "Unable to access microphone": "לא ניתן לגשת אל המיקרופון", - "Try using turn.matrix.org": "נסו להשתמש ב- turn.matrix.org", - "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, אך דעו שהוא לא יהיה עקבי וכתובת הרשת שלכם תהיה חשופה לשרת הזה. אתם יכולים לנהל תכונה זו בהגדרות השרת.", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "אנא בקשו ממנהל השרת (%(homeserverDomain)s) לסדר את הגדרות שרת TURN על מנת שהשיחות יפעלו בעקביות.", "Call failed due to misconfigured server": "השיחה נכשלה בגלל הגדרות שרת שגויות", "The call was answered on another device.": "השיחה נענתה במכשיר אחר.", @@ -2169,8 +2167,6 @@ "Calls are unsupported": "שיחות לא נתמכות", "%(date)s at %(time)s": "%(date)s בשעה %(time)s", "%(oldDisplayName)s changed their display name to %(displayName)s": "%(oldDisplayName)s בחר/ה שם תצוגה חדש - %(displayName)s", - "Verified devices": "מכשירים מאומתים", - "Unverified devices": "מכשירים לא מאומתים", "Your new device is now verified. Other users will see it as trusted.": "המכשיר שלך מוגדר כעת כמאומת. משתמשים אחרים יראו אותו כמכשיר מהימן.", "Your new device is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "המכשיר שלך מוגדר כעת כמאומת. יש לו גישה להודעות המוצפנות שלך ומשתמשים אחרים יראו אותו כמכשיר מהימן.", "Device verified": "המכשיר אומת", @@ -2218,8 +2214,6 @@ "Unknown failure": "כשל לא ידוע", "Remove users": "הסר משתמשים", "Send reactions": "שלח תגובות", - "Where you're signed in": "איפה אתה מחובר", - "Okay": "בסדר", "You have no ignored users.": "אין לך משתמשים שהתעלמו מהם.", "Displaying time": "מציג זמן", "Keyboard": "מקלדת", @@ -2230,9 +2224,6 @@ "Anyone can find and join.": "כל אחד יכול למצוא ולהצטרף.", "Large": "גדול", "Rename": "שנה שם", - "Sign Out": "התנתק", - "This device": "המכשיר הזה", - "Devices without encryption support": "מכשירים ללא תמיכה בהצפנה", "Select all": "בחר הכל", "Deselect all": "הסר סימון מהכל", "Sign out devices|one": "צא מהמכשיר", @@ -2429,7 +2420,6 @@ "Let's create a room for each of them.": "בואו ניצור חדר לכל אחד מהם.", "What are some things you want to discuss in %(spaceName)s?": "באילו דברים אתם רוצים לדון ב-%(spaceName)s?", "Invite by username": "הזמנה באמצעות שם משתמש", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "זוהי תכונה ניסיונית. לעת עתה, משתמשים חדשים שמקבלים הזמנה יצטרכו לפתוח את ההזמנה ב- כדי להצטרף בפועל.", "Make sure the right people have access. You can invite more later.": "ודאו שלאנשים הנכונים תהיה גישה. תוכלו להזמין עוד מאוחר יותר.", "Invite your teammates": "הזמינו את חברי הצוות שלכם", "Failed to invite the following users to your space: %(csvUsers)s": "נכשל בהזמנת המשתמשים הבאים לחלל העבודה שלכם %(csvUsers)s", @@ -2507,7 +2497,6 @@ "Show Labs settings": "הצג את אופציית מעבדת הפיתוח", "To join, please enable video rooms in Labs first": "כדי להצטרף, נא אפשר תחילה וידאו במעבדת הפיתוח", "To view, please enable video rooms in Labs first": "כדי לצפות, אנא הפעל תחילה חדרי וידאו במעבדת הפיתוח", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "נהל את המכשירים המחוברים שלך . שם מכשיר גלוי לאנשים שאיתם אתה מתקשר.", "Group all your rooms that aren't part of a space in one place.": "קבצו את כל החדרים שלכם שאינם משויכים למרחב עבודה במקום אחד.", "Rooms outside of a space": "חדרים שמחוץ למרחב העבודה", "Group all your people in one place.": "קבצו את כל אנשי הקשר שלכם במקום אחד.", @@ -2696,7 +2685,6 @@ "When enabled, the other party might be able to see your IP address": "כאשר מופעל, הצד השני יוכל לראות את כתובת ה-IP שלך", "Allow Peer-to-Peer for 1:1 calls": "אפשר חיבור ישיר (Peer-to-Peer) בשיחות 1:1", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "רלוונטי רק אם שרת הבית לא מציע שרת שיחות. כתובת ה-IP שלך תשותף במהלך שיחה.", - "Allow fallback call assist server (turn.matrix.org)": "אפשר שימוש בשרת שיחות חלופי (turn.matrix.org)", "Set a new account password…": "הגדרת סיסמה חדשה לחשבונך…", "Sign in instead": "התחבר במקום זאת", "Send email": "שלח אימייל", diff --git a/src/i18n/strings/hi.json b/src/i18n/strings/hi.json index 502215fe193..34ce986cbce 100644 --- a/src/i18n/strings/hi.json +++ b/src/i18n/strings/hi.json @@ -609,8 +609,6 @@ "Unable to access webcam / microphone": "वेबकैम / माइक्रोफ़ोन तक पहुँचने में असमर्थ", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "कॉल विफल हुआ क्योंकि माइक्रोफ़ोन तक नहीं पहुँचा जा सका। जांचें कि एक माइक्रोफ़ोन प्लग इन है और सही तरीके से सेट है।", "Unable to access microphone": "माइक्रोफ़ोन एक्सेस करने में असमर्थ", - "Try using turn.matrix.org": "Turn.matrix.org का उपयोग करके देखें", - "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 पर सार्वजनिक सर्वर का उपयोग करने का प्रयास कर सकते हैं, लेकिन यह उतना विश्वसनीय नहीं होगा, और यह आपके आईपी पते को उस सर्वर के साथ साझा करेगा। आप इसे सेटिंग में जाकर भी मैनेज कर सकते हैं।", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "कृपया अपने होमसर्वर (%(homeserverDomain)s) के व्यवस्थापक से एक TURN सर्वर कॉन्फ़िगर करने के लिए कहें ताकि कॉल विश्वसनीय रूप से काम करें।", "Call failed due to misconfigured server": "गलत कॉन्फ़िगर किए गए सर्वर के कारण कॉल विफल रहा", "The call was answered on another device.": "किसी अन्य डिवाइस पर कॉल का उत्तर दिया गया था।", diff --git a/src/i18n/strings/hr.json b/src/i18n/strings/hr.json index f5e0b4e44ee..4d7bf753435 100644 --- a/src/i18n/strings/hr.json +++ b/src/i18n/strings/hr.json @@ -142,8 +142,6 @@ "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Poziv nije uspio jer nije bilo moguće pristupiti mikrofonu. Provjerite je li mikrofon priključen i ispravno postavljen.", "Unable to access microphone": "Nije moguće pristupiti mikrofonu", "OK": "OK", - "Try using turn.matrix.org": "Pokušajte koristiti turn.matrix.org", - "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.": "Alternativno, možete pokušati koristiti javni poslužitelj na turn.matrix.org, no to bi moglo biti manje pouzdano i Vaša IP adresa će biti podijeljena s tim poslužiteljem. Time također možete upravljati u Postavkama.", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Zamolite administratora Vašeg kućnog poslužitelja (%(homeserverDomain)s) da konfigurira TURN poslužitelj kako bi pozivi mogli pouzdano funkcionirati.", "Call failed due to misconfigured server": "Poziv neuspješan radi pogrešno konfiguriranog poslužitelja", "The call was answered on another device.": "Na poziv je odgovoreno sa drugog uređaja.", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 3187335453e..cc5f0c5c368 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -21,7 +21,7 @@ "No Microphones detected": "Nem található mikrofon", "No Webcams detected": "Nem található webkamera", "No media permissions": "Nincs média jogosultság", - "You may need to manually permit %(brand)s to access your microphone/webcam": "Lehet hogy kézileg kell engedélyeznie a %(brand)snak, hogy hozzáférjen a mikrofonjához és webkamerájához", + "You may need to manually permit %(brand)s to access your microphone/webcam": "Lehet, hogy kézileg kell engedélyeznie a(z) %(brand)s számára, hogy hozzáférjen a mikrofonjához és webkamerájához", "Default Device": "Alapértelmezett eszköz", "Microphone": "Mikrofon", "Camera": "Kamera", @@ -47,13 +47,13 @@ "Bans user with given id": "Kitiltja a megadott azonosítójú felhasználót", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Nem lehet kapcsolódni a Matrix-kiszolgálóhoz – ellenőrizze a kapcsolatot, győződjön meg arról, hogy a Matrix-kiszolgáló tanúsítványa hiteles, és hogy a böngészőkiegészítők nem blokkolják a kéréseket.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Nem lehet HTTP-vel csatlakozni a Matrix-kiszolgálóhoz, ha HTTPS van a böngésző címsorában. Vagy használjon HTTPS-t vagy engedélyezze a nem biztonságos parancsfájlokat.", - "Change Password": "Jelszó megváltoztatása", + "Change Password": "Jelszó módosítása", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s megváltoztatta a hozzáférési szintet: %(powerLevelDiffText)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s a következőre változtatta a szoba nevét: %(roomName)s.", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s törölte a szoba nevét.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s a következőre változtatta a témát: „%(topic)s”.", "Changes your display nickname": "Megváltoztatja a megjelenítendő becenevét", - "Command error": "Parancs hiba", + "Command error": "Parancshiba", "Commands": "Parancsok", "Confirm password": "Jelszó megerősítése", "Cryptography": "Titkosítás", @@ -71,9 +71,9 @@ "Enter passphrase": "Jelmondat megadása", "Error decrypting attachment": "Csatolmány visszafejtése sikertelen", "Export": "Mentés", - "Export E2E room keys": "E2E szoba kulcsok mentése", + "Export E2E room keys": "E2E szobakulcsok exportálása", "Failed to ban user": "A felhasználót nem sikerült kizárni", - "Failed to change power level": "A hozzáférési szintet nem sikerült megváltoztatni", + "Failed to change power level": "A hozzáférési szint megváltoztatása sikertelen", "Failed to load timeline position": "Az idővonal pozíciót nem sikerült betölteni", "Failed to mute user": "A felhasználót némítása sikertelen", "Failed to reject invite": "A meghívót nem sikerült elutasítani", @@ -88,12 +88,12 @@ "Forget room": "Szoba elfelejtése", "For security, this session has been signed out. Please sign in again.": "A biztonság érdekében ez a kapcsolat le lesz bontva. Légy szíves jelentkezz be újra.", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s: %(fromPowerLevel)s -> %(toPowerLevel)s", - "Hangup": "Megszakít", + "Hangup": "Bontás", "Historical": "Archív", "Home": "Kezdőlap", "Import": "Betöltés", - "Import E2E room keys": "E2E szoba kulcsok betöltése", - "Incorrect username and/or password.": "Helytelen felhasználó és/vagy jelszó.", + "Import E2E room keys": "E2E szobakulcsok importálása", + "Incorrect username and/or password.": "Helytelen felhasználónév vagy jelszó.", "Incorrect verification code": "Hibás azonosítási kód", "Invalid Email Address": "Érvénytelen e-mail-cím", "Invalid file%(extra)s": "Hibás fájl%(extra)s", @@ -120,7 +120,7 @@ "New passwords must match each other.": "Az új jelszavaknak meg kell egyezniük egymással.", "not specified": "nincs meghatározva", "": "", - "No display name": "Nincs megjelenítési név", + "No display name": "Nincs megjelenítendő név", "No more results": "Nincs több találat", "No results": "Nincs találat", "No users have specific privileges in this room": "Egy felhasználónak sincsenek specifikus jogosultságai ebben a szobában", @@ -189,7 +189,7 @@ "Verified key": "Ellenőrzött kulcs", "Video call": "Videóhívás", "Voice call": "Hanghívás", - "Warning!": "Figyelem!", + "Warning!": "Figyelmeztetés!", "Who can read history?": "Ki olvashatja a régi üzeneteket?", "You cannot place a call with yourself.": "Nem hívhatja fel saját magát.", "You do not have permission to post to this room": "Nincs jogod üzenetet küldeni ebbe a szobába", @@ -223,16 +223,16 @@ "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(monthName)s %(day)s, %(weekDayName)s %(time)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(fullYear)s. %(monthName)s %(day)s., %(weekDayName)s %(time)s", "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", - "This server does not support authentication with a phone number.": "Ez a szerver nem támogatja a telefonszámmal való azonosítást.", + "This server does not support authentication with a phone number.": "Ez a kiszolgáló nem támogatja a telefonszámmal történő hitelesítést.", "Room": "Szoba", - "Connectivity to the server has been lost.": "A szerverrel a kapcsolat megszakadt.", + "Connectivity to the server has been lost.": "A kapcsolat megszakadt a kiszolgálóval.", "Sent messages will be stored until your connection has returned.": "Az elküldött üzenetek addig lesznek tárolva amíg a kapcsolatod újra elérhető lesz.", "(~%(count)s results)|one": "(~%(count)s db eredmény)", "(~%(count)s results)|other": "(~%(count)s db eredmény)", "New Password": "Új jelszó", - "Start automatically after system login": "Rendszerindításkor automatikus elindítás", + "Start automatically after system login": "Automatikus indítás rendszerindítás után", "Analytics": "Analitika", - "Options": "Opciók", + "Options": "Lehetőségek", "Passphrases must match": "A jelmondatoknak meg kell egyezniük", "Passphrase must not be empty": "A jelmondat nem lehet üres", "Export room keys": "Szoba kulcsok mentése", @@ -264,7 +264,7 @@ "Your browser does not support the required cryptography extensions": "A böngészője nem támogatja a szükséges titkosítási kiterjesztéseket", "Not a valid %(brand)s keyfile": "Nem érvényes %(brand)s kulcsfájl", "Authentication check failed: incorrect password?": "Hitelesítési ellenőrzés sikertelen: hibás jelszó?", - "Do you want to set an email address?": "Meg szeretnéd adni az e-mail címet?", + "Do you want to set an email address?": "Szeretne beállítani e-mail-címet?", "This will allow you to reset your password and receive notifications.": "Ez lehetővé teszi, hogy vissza tudja állítani a jelszavát, és értesítéseket fogadjon.", "Deops user with given id": "A megadott azonosítójú felhasználó lefokozása", "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Ezzel a folyamattal kimentheted a titkosított szobák üzeneteihez tartozó kulcsokat egy helyi fájlba. Ez után be tudod tölteni ezt a fájlt egy másik Matrix kliensbe, így az a kliens is vissza tudja fejteni az üzeneteket.", @@ -278,21 +278,21 @@ "Delete widget": "Kisalkalmazás törlése", "Define the power level of a user": "A felhasználó szintjének meghatározása", "Edit": "Szerkeszt", - "Enable automatic language detection for syntax highlighting": "Nyelv automatikus felismerése szintaxis kiemeléshez", + "Enable automatic language detection for syntax highlighting": "Nyelv automatikus felismerése a szintaxiskiemeléshez", "AM": "de.", "PM": "du.", "Unable to create widget.": "Nem lehet kisalkalmazást létrehozni.", "You are not in this room.": "Nem tagja ennek a szobának.", "You do not have permission to do that in this room.": "Nincs jogosultsága ezt tenni ebben a szobában.", - "Create": "Létrehoz", + "Create": "Létrehozás", "Automatically replace plain text Emoji": "Egyszerű szöveg automatikus cseréje emodzsira", "Publish this room to the public in %(domain)s's room directory?": "Publikálod a szobát a(z) %(domain)s szoba listájába?", "%(widgetName)s widget added by %(senderName)s": "%(senderName)s hozzáadta a %(widgetName)s kisalkalmazást", "%(widgetName)s widget removed by %(senderName)s": "%(senderName)s eltávolította a %(widgetName)s kisalkalmazást", "%(widgetName)s widget modified by %(senderName)s": "%(senderName)s módosította a(z) %(widgetName)s kisalkalmazást", - "Copied!": "Lemásolva!", + "Copied!": "Másolva!", "Failed to copy": "Sikertelen másolás", - "Ignore": "Figyelmen kívül hagy", + "Ignore": "Mellőzés", "Unignore": "Figyelembe vesz", "You are now ignoring %(userId)s": "Most már figyelmen kívül hagyja: %(userId)s", "You are no longer ignoring %(userId)s": "Ismét figyelembe veszi: %(userId)s", @@ -313,7 +313,7 @@ "Invite": "Meghívás", "Delete Widget": "Kisalkalmazás törlése", "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "A kisalkalmazás törlése minden felhasználót érint a szobában. Biztos, hogy törli a kisalkalmazást?", - "Mirror local video feed": "Helyi videó folyam tükrözése", + "Mirror local video feed": "Helyi videófolyam tükrözése", "Members only (since the point in time of selecting this option)": "Csak tagok számára (a beállítás kiválasztásától)", "Members only (since they were invited)": "Csak tagoknak (a meghívásuk idejétől)", "Members only (since they joined)": "Csak tagoknak (amióta csatlakoztak)", @@ -369,9 +369,9 @@ "Room Notification": "Szoba értesítések", "Please note you are logging into the %(hs)s server, not matrix.org.": "Vegye figyelembe, hogy a(z) %(hs)s kiszolgálóra jelentkezik be, és nem a matrix.org-ra.", "Restricted": "Korlátozott", - "Enable inline URL previews by default": "Beágyazott URL előnézetek alapértelmezett engedélyezése", - "Enable URL previews for this room (only affects you)": "URL előnézet engedélyezése ebben a szobában (csak Önt érinti)", - "Enable URL previews by default for participants in this room": "URL előnézet alapértelmezett engedélyezése a szobatagok számára", + "Enable inline URL previews by default": "Beágyazott webcím-előnézetek alapértelmezett engedélyezése", + "Enable URL previews for this room (only affects you)": "Webcím-előnézetek engedélyezése ebben a szobában (csak Önt érinti)", + "Enable URL previews by default for participants in this room": "Webcím-előnézetek alapértelmezett engedélyezése a szobatagok számára", "URL previews are enabled by default for participants in this room.": "Az URL előnézetek alapértelmezetten engedélyezve vannak a szobában jelenlévőknek.", "URL previews are disabled by default for participants in this room.": "Az URL előnézet alapértelmezetten tiltva van a szobában jelenlévőknek.", "%(duration)ss": "%(duration)s mp", @@ -382,7 +382,7 @@ "Idle for %(duration)s": "%(duration)s óta tétlen", "Offline for %(duration)s": "%(duration)s óta elérhetetlen", "Unknown for %(duration)s": "%(duration)s óta az állapota ismeretlen", - "This homeserver doesn't offer any login flows which are supported by this client.": "Ez a Matrix szerver egyetlen bejelentkezési metódust sem támogat amit ez a kliens ismer.", + "This homeserver doesn't offer any login flows which are supported by this client.": "Ez a Matrix-kiszolgáló egyetlen olyan bejelentkezési módot sem támogat, amelyet a kliens ismerne.", "collapse": "becsukás", "expand": "kinyitás", "Call Failed": "Sikertelen hívás", @@ -416,8 +416,8 @@ "Failed to send logs: ": "Hiba a napló küldésénél: ", "This Room": "Ebben a szobában", "Resend": "Küldés újra", - "Messages containing my display name": "A profilnevemet tartalmazó üzenetek", - "Messages in one-to-one chats": "Közvetlen beszélgetések üzenetei", + "Messages containing my display name": "A saját megjelenítendő nevét tartalmazó üzenetek", + "Messages in one-to-one chats": "A közvetlen csevegések üzenetei", "Unavailable": "Elérhetetlen", "Source URL": "Forrás URL", "Messages sent by bot": "Botok üzenetei", @@ -437,10 +437,10 @@ "Quote": "Idézés", "Send logs": "Naplófájlok elküldése", "All messages": "Minden üzenet", - "Call invitation": "Hívás meghívó", + "Call invitation": "Hívásmeghívások", "State Key": "Állapotkulcs", "What's new?": "Mik az újdonságok?", - "When I'm invited to a room": "Amikor meghívnak egy szobába", + "When I'm invited to a room": "Amikor meghívják egy szobába", "All Rooms": "Minden szobában", "You cannot delete this message. (%(code)s)": "Nem törölheted ezt az üzenetet. (%(code)s)", "Thursday": "Csütörtök", @@ -449,7 +449,7 @@ "Back": "Vissza", "Reply": "Válasz", "Show message in desktop notification": "Üzenetek megjelenítése az asztali értesítéseknél", - "Messages in group chats": "Csoportszobák üzenetei", + "Messages in group chats": "A csoportos csevegések üzenetei", "Yesterday": "Tegnap", "Error encountered (%(errorDetail)s).": "Hiba történt (%(errorDetail)s).", "Low Priority": "Alacsony prioritás", @@ -468,11 +468,11 @@ "We encountered an error trying to restore your previous session.": "Hiba történt az előző munkamenet helyreállítási kísérlete során.", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "A böngésződ tárhelyének a törlése megoldhatja a problémát, de ezzel kijelentkezel és a titkosított beszélgetések előzményei olvashatatlanná válnak.", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Nem lehet betölteni azt az eseményt amire válaszoltál, mert vagy nem létezik, vagy nincs jogod megnézni.", - "Enable widget screenshots on supported widgets": "Ahol az a kisalkalmazásban támogatott, ott engedélyezze a képernyőképeket", + "Enable widget screenshots on supported widgets": "Kisalkalmazások képernyőképének engedélyezése a támogatott kisalkalmazásoknál", "Send analytics data": "Analitikai adatok küldése", "Muted Users": "Elnémított felhasználók", "Terms and Conditions": "Általános Szerződési Feltételek", - "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "A %(homeserverDomain)s szerver használatának folytatásához el kell olvasnod és el kell fogadnod az általános szerződési feltételeket.", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "A(z) %(homeserverDomain)s Matrix-kiszolgáló használatának folytatásához el kell olvasnia és el kell fogadnia a felhasználási feltételeket.", "Review terms and conditions": "Általános Szerződési Feltételek elolvasása", "Can't leave Server Notices room": "Nem lehet elhagyni a Kiszolgálóüzenetek szobát", "This room is used for important messages from the Homeserver, so you cannot leave it.": "Ez a szoba a Matrix-kiszolgáló fontos kiszolgálóüzenetei közlésére jött létre, nem tud belőle kilépni.", @@ -502,9 +502,9 @@ "Update any local room aliases to point to the new room": "Állíts át minden helyi alternatív nevet erre a szobára", "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "A felhasználóknak tiltsd meg, hogy a régi szobában beszélgessenek. Küldj egy üzenetet amiben megkéred a felhasználókat, hogy menjenek át az új szobába", "Put a link back to the old room at the start of the new room so people can see old messages": "Tegyél egy linket az új szoba elejére ami visszamutat a régi szobára, hogy az emberek lássák a régi üzeneteket", - "Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please contact your service administrator to continue using the service.": "Az üzeneted nincs elküldve, mert ez a Matrix szerver elérte a havi aktív felhasználói korlátot. A szolgáltatás további igénybevétele végett kérlek vedd fel a kapcsolatot a szolgáltatás adminisztrátorával.", - "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Az üzeneted nem került elküldésre mert ez a Matrix szerver túllépte valamelyik erőforrás korlátját. A szolgáltatás további igénybevétele végett kérlek vedd fel a kapcsolatot a szolgáltatás adminisztrátorával.", - "Please contact your service administrator to continue using this service.": "A szolgáltatás további használatához kérlek vedd fel a kapcsolatot a szolgáltatás adminisztrátorával.", + "Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please contact your service administrator to continue using the service.": "Az üzenete nem lett elküldve, mert ez a Matrix-kiszolgáló elérte a havi aktív felhasználói korlátot. A szolgáltatás használatának folytatásához vegye fel a kapcsolatot a szolgáltatás rendszergazdájával.", + "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Az üzenete nem lett elküldve, mert a Matrix-kiszolgáló túllépett egy erőforráskorlátot. A szolgáltatás használatának folytatásához vegye fel a kapcsolatot a szolgáltatás rendszergazdájával.", + "Please contact your service administrator to continue using this service.": "A szolgáltatás további használatához vegye fel a kapcsolatot a szolgáltatás rendszergazdájával.", "Please contact your homeserver administrator.": "Vegye fel a kapcsolatot a Matrix-kiszolgáló rendszergazdájával.", "Legal": "Jogi", "This room has been replaced and is no longer active.": "Ezt a szobát lecseréltük és nem aktív többé.", @@ -524,9 +524,9 @@ "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Ha a másik %(brand)s verzió még fut egy másik fülön, akkor zárja be, mert ha egy gépen használja a %(brand)sot úgy, hogy az egyiken be van kapcsolva a késleltetett betöltés, a másikon pedig ki, akkor problémák adódhatnak.", "Incompatible local cache": "A helyi gyorsítótár nem kompatibilis ezzel a verzióval", "Clear cache and resync": "Gyorsítótár törlése és újraszinkronizálás", - "Please review and accept the policies of this homeserver:": "Kérlek nézd át és fogadd el a Matrix szerver felhasználói feltételeit:", + "Please review and accept the policies of this homeserver:": "Nézze át és fogadja el a Matrix-kiszolgáló felhasználási feltételeit:", "Add some now": "Adj hozzá párat", - "Please review and accept all of the homeserver's policies": "Kérlek nézd át és fogadd el a Matrix szerver felhasználási feltételeit", + "Please review and accept all of the homeserver's policies": "Nézze át és fogadja el a Matrix-kiszolgáló felhasználási feltételeit", "To avoid losing your chat history, you must export your room keys before logging out. You will need to go back to the newer version of %(brand)s to do this": "Hogy a régi üzenetekhez továbbra is hozzáférhess kijelentkezés előtt ki kell mentened a szobák titkosító kulcsait. Ehhez a %(brand)s egy frissebb verzióját kell használnod", "Incompatible Database": "Nem kompatibilis adatbázis", "Continue With Encryption Disabled": "Folytatás a titkosítás kikapcsolásával", @@ -549,11 +549,11 @@ "Unable to restore backup": "A mentést nem lehet helyreállítani", "No backup found!": "Mentés nem található!", "Failed to decrypt %(failedCount)s sessions!": "%(failedCount)s kapcsolatot nem lehet visszafejteni!", - "Failed to perform homeserver discovery": "A Matrix szerver felderítése sikertelen", - "Invalid homeserver discovery response": "A Matrix szerver felderítésére kapott válasz érvénytelen", + "Failed to perform homeserver discovery": "A Matrix-kiszolgáló felderítése sikertelen", + "Invalid homeserver discovery response": "A Matrix-kiszolgáló felderítésére kapott válasz érvénytelen", "Use a few words, avoid common phrases": "Néhány szót használjon, és kerülje a szokásos kifejezéseket", "No need for symbols, digits, or uppercase letters": "Nincs szükség szimbólumokra, számokra vagy nagybetűkre", - "Use a longer keyboard pattern with more turns": "Használj hosszabb billentyűzet mintát több kanyarral", + "Use a longer keyboard pattern with more turns": "Használj hosszabb billentyűzetmintát, több kanyarral", "Avoid repeated words and characters": "Kerülje a szó-, vagy betűismétlést", "Avoid sequences": "Kerülje a sorozatokat", "Avoid recent years": "Kerülje a közeli éveket", @@ -579,10 +579,10 @@ "You do not have permission to invite people to this room.": "Nincs jogosultsága embereket meghívni ebbe a szobába.", "Unknown server error": "Ismeretlen kiszolgálóhiba", "Set up": "Beállítás", - "Messages containing @room": "„@room” megemlítést tartalmazó üzenetek", - "Encrypted messages in one-to-one chats": "Titkosított üzenetek közvetlen csevegésekben", - "Encrypted messages in group chats": "Titkosított üzenetek a csoportos beszélgetésekben", - "Invalid identity server discovery response": "Azonosító szerver felderítésére érkezett válasz érvénytelen", + "Messages containing @room": "A @room megemlítést tartalmazó üzenetek", + "Encrypted messages in one-to-one chats": "A közvetlen csevegések titkosított üzenetei", + "Encrypted messages in group chats": "A csoportos csevegések titkosított üzenetei", + "Invalid identity server discovery response": "Az azonosítási kiszolgáló felderítésére érkezett válasz érvénytelen", "General failure": "Általános hiba", "New Recovery Method": "Új helyreállítási mód", "If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Ha nem Ön állította be az új helyreállítási módot, akkor lehet, hogy egy támadó próbálja elérni a fiókját. Változtassa meg a fiókja jelszavát, és amint csak lehet, állítsa be az új helyreállítási eljárást a Beállításokban.", @@ -593,7 +593,7 @@ "Unable to load commit detail: %(msg)s": "A véglegesítés részleteinek betöltése sikertelen: %(msg)s", "Unrecognised address": "Ismeretlen cím", "The following users may not exist": "Az alábbi felhasználók lehet, hogy nem léteznek", - "Prompt before sending invites to potentially invalid matrix IDs": "Figyelmeztessen a vélhetően hibás Matrix-azonosítóknak küldött meghívók elküldése előtt", + "Prompt before sending invites to potentially invalid matrix IDs": "Kérdés a vélhetően hibás Matrix-azonosítóknak küldött meghívók elküldése előtt", "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Az alábbi Matrix ID-koz nem sikerül megtalálni a profilokat - így is meghívod őket?", "Invite anyway and never warn me again": "Mindenképpen meghív és ne figyelmeztess többet", "Invite anyway": "Meghívás mindenképp", @@ -605,19 +605,19 @@ "%(names)s and %(count)s others are typing …|one": "%(names)s és még valaki gépel…", "%(names)s and %(lastPerson)s are typing …": "%(names)s és %(lastPerson)s gépelnek…", "Render simple counters in room header": "Egyszerű számlálók a szoba fejlécében", - "Enable Emoji suggestions while typing": "Emodzsik felajánlása gépelés közben", + "Enable Emoji suggestions while typing": "Emodzsik gépelés közbeni felajánlásának bekapcsolása", "Show a placeholder for removed messages": "Helykitöltő megjelenítése a törölt szövegek helyett", - "Show avatar changes": "Profilképváltozás megjelenítése", + "Show avatar changes": "Profilképváltozások megjelenítése", "Show display name changes": "Megjelenítendő nevek változásának megjelenítése", "Enable big emoji in chat": "Nagy emodzsik engedélyezése a csevegésekben", "Send typing notifications": "Gépelési visszajelzés küldése", - "Messages containing my username": "Üzenetek amik a nevemet tartalmazzák", + "Messages containing my username": "A saját felhasználónevét tartalmazó üzenetek", "The other party cancelled the verification.": "A másik fél megszakította az ellenőrzést.", "Verified!": "Ellenőrizve!", - "You've successfully verified this user.": "Sikeresen ellenőrizted ezt a felhasználót.", - "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Az üzenetek a felhasználóval végponttól végpontig titkosítva vannak és azt más nem tudja elolvasni.", - "Got It": "Értem", - "Verify this user by confirming the following number appears on their screen.": "Ellenőrizd a felhasználót azáltal, hogy megbizonyosodtok arról, hogy az alábbi számok jelentek meg az ő képernyőjén is.", + "You've successfully verified this user.": "Sikeresen ellenőrizte ezt a felhasználót.", + "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Az ezzel felhasználóval váltott biztonságos üzenetek végpontok közti titkosítással védettek, és azt harmadik fél nem tudja elolvasni.", + "Got It": "Megértettem", + "Verify this user by confirming the following number appears on their screen.": "Ellenőrizze ezt a felhasználót azzal, hogy megerősíti, hogy a következő szám jelenik meg a képernyőjén.", "Yes": "Igen", "No": "Nem", "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "E-mail üzenetet küldtünk Önnek, hogy ellenőrizzük a címét. Kövesse az ott leírt utasításokat, és kattintson az alábbi gombra.", @@ -628,7 +628,7 @@ "Phone Number": "Telefonszám", "Profile picture": "Profilkép", "Display Name": "Megjelenítési név", - "Room information": "Szoba információk", + "Room information": "Szobainformációk", "Room version": "Szoba verziószáma", "Room version:": "Szoba verzió:", "General": "Általános", @@ -664,7 +664,7 @@ "Room avatar": "Szoba profilképe", "Room Name": "Szoba neve", "Room Topic": "Szoba témája", - "Join": "Belép", + "Join": "Csatlakozás", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Ellenőrizd ezt a felhasználót, hogy megbízhatónak lehessen tekinteni. Megbízható felhasználók további nyugalmat jelenthetnek ha végpontól végpontig titkosítást használsz.", "Incoming Verification Request": "Bejövő Hitelesítési Kérés", "Go back": "Vissza", @@ -688,8 +688,8 @@ "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s megengedte a vendégeknek, hogy beléphessenek a szobába.", "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s megtiltotta a vendégeknek, hogy belépjenek a szobába.", "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s a vendégek hozzáférését erre állította be: %(rule)s", - "Verify this user by confirming the following emoji appear on their screen.": "Hitelesítheti a felhasználót, ha megerősíti, hogy az alábbi emodzsi jelenik meg a képernyőjén.", - "Unable to find a supported verification method.": "Nem található támogatott hitelesítési eljárás.", + "Verify this user by confirming the following emoji appear on their screen.": "Ellenőrizze ezt a felhasználót azzal, hogy megerősíti, hogy a következő emodzsi jelenik meg a képernyőjén.", + "Unable to find a supported verification method.": "Nem található támogatott ellenőrzési eljárás.", "Dog": "Kutya", "Cat": "Macska", "Lion": "Oroszlán", @@ -726,12 +726,12 @@ "Glasses": "Szemüveg", "Spanner": "Csavarhúzó", "Santa": "Télapó", - "Thumbs up": "Hüvelykujj fel", + "Thumbs up": "Hüvelykujj felfelé", "Umbrella": "Esernyő", "Hourglass": "Homokóra", "Clock": "Óra", "Gift": "Ajándék", - "Light bulb": "Égő", + "Light bulb": "Villanykörte", "Book": "Könyv", "Pencil": "Toll", "Paperclip": "Gémkapocs", @@ -752,12 +752,12 @@ "Headphones": "Fejhallgató", "Folder": "Dosszié", "Pin": "Kitűzés", - "This homeserver would like to make sure you are not a robot.": "A Matrix szerver meg kíván győződni arról, hogy nem vagy robot.", + "This homeserver would like to make sure you are not a robot.": "A Matrix-kiszolgáló ellenőrizné, hogy Ön nem egy robot.", "Change": "Változtat", "Couldn't load page": "Az oldal nem tölthető be", "Your password has been reset.": "A jelszavad újra beállításra került.", - "This homeserver does not support login using email address.": "Ezen a Matrix szerveren nem tudsz e-mail címmel bejelentkezni.", - "Registration has been disabled on this homeserver.": "A fiókkészítés le van tiltva ezen a Matrix szerveren.", + "This homeserver does not support login using email address.": "Ez a Matrix-kiszolgáló nem támogatja az e-mail-címmel történő bejelentkezést.", + "Registration has been disabled on this homeserver.": "A regisztráció ki van kapcsolva ezen a Matrix-kiszolgálón.", "Unable to query for supported registration methods.": "A támogatott regisztrációs módokat nem lehet lekérdezni.", "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Biztos vagy benne? Ha a kulcsaid nincsenek megfelelően elmentve elveszted a titkosított üzeneteidet.", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "A titkosított üzenetek végponttól végpontig titkosítással védettek. Csak neked és a címzetteknek lehet meg a kulcs az üzenet visszafejtéséhez.", @@ -775,7 +775,7 @@ "Credits": "Közreműködők", "Changes your display nickname in the current room only": "Csak ebben a szobában változtatja meg a megjelenítendő becenevét", "Show read receipts sent by other users": "Mások által küldött olvasási visszajelzések megjelenítése", - "Scissors": "Ollók", + "Scissors": "Olló", "Error updating main address": "Az elsődleges cím frissítése sikertelen", "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "A szoba elsődleges címének frissítésénél hiba történt. Vagy nincs engedélyezve a szerveren vagy átmeneti hiba történt.", "Room Settings - %(roomName)s": "Szoba beállítások: %(roomName)s", @@ -839,7 +839,7 @@ "Sends the given message coloured as a rainbow": "A megadott üzenetet szivárványszínben küldi el", "Sends the given emote coloured as a rainbow": "A megadott hangulatjelet szivárványszínben küldi el", "The user's homeserver does not support the version of the room.": "A felhasználó Matrix-kiszolgálója nem támogatja a megadott szobaverziót.", - "When rooms are upgraded": "Ha a szobák fejlesztésre kerülnek", + "When rooms are upgraded": "Amikor a szobák fejlesztésre kerülnek", "View older messages in %(roomName)s.": "Régebbi üzenetek megjelenítése itt: %(roomName)s.", "Join the conversation with an account": "Beszélgetéshez való csatlakozás felhasználói fiókkal lehetséges", "Sign Up": "Fiók készítés", @@ -861,21 +861,21 @@ "Rotate Left": "Forgatás balra", "Rotate Right": "Forgatás jobbra", "Use an email address to recover your account": "A felhasználói fiók visszaszerzése e-mail címmel", - "Enter email address (required on this homeserver)": "E-mail cím megadása (ezen a matrix szerveren kötelező)", + "Enter email address (required on this homeserver)": "E-mail-cím megadása (ezen a Matrix-kiszolgálón kötelező)", "Doesn't look like a valid email address": "Az e-mail cím nem tűnik érvényesnek", "Enter password": "Adja meg a jelszót", "Password is allowed, but unsafe": "A jelszó engedélyezett, de nem biztonságos", "Nice, strong password!": "Szép, erős jelszó!", "Passwords don't match": "A jelszavak nem egyeznek meg", "Other users can invite you to rooms using your contact details": "Mások meghívhatnak a szobákba a kapcsolatoknál megadott adataiddal", - "Enter phone number (required on this homeserver)": "Telefonszám megadása (ennél a matrix szervernél kötelező)", + "Enter phone number (required on this homeserver)": "Telefonszám megadása (ennél a Matrix-kiszolgálónál kötelező)", "Enter username": "Felhasználói név megadása", "Some characters not allowed": "Néhány karakter nem engedélyezett", - "Failed to get autodiscovery configuration from server": "A szerverről nem sikerült beszerezni az automatikus felderítés beállításait", + "Failed to get autodiscovery configuration from server": "Nem sikerült lekérni az automatikus felderítés beállításait a kiszolgálóról", "Invalid base_url for m.homeserver": "Hibás base_url az m.homeserver -hez", "Homeserver URL does not appear to be a valid Matrix homeserver": "A matrix URL nem tűnik érvényesnek", "Invalid base_url for m.identity_server": "Érvénytelen base_url az m.identity_server -hez", - "Identity server URL does not appear to be a valid identity server": "Az Azonosító szerver URL nem tűnik érvényesnek", + "Identity server URL does not appear to be a valid identity server": "Az azonosítási kiszolgáló webcíme nem tűnik érvényesnek", "Unbans user with given ID": "Visszaengedi a megadott azonosítójú felhasználót", "reacted with %(shortName)s": "ezzel reagált: %(shortName)s", "edited": "szerkesztve", @@ -885,7 +885,7 @@ "Unexpected error resolving homeserver configuration": "A Matrix-kiszolgáló konfiguráció betöltésekor váratlan hiba történt", "Edit message": "Üzenet szerkesztése", "Cannot reach homeserver": "A Matrix-kiszolgáló nem érhető el", - "Ensure you have a stable internet connection, or get in touch with the server admin": "Legyen stabil az internetkapcsolata, vagy vegye fel a kapcsolatot a kiszolgáló rendszergazdájával", + "Ensure you have a stable internet connection, or get in touch with the server admin": "Győződjön meg arról, hogy stabil az internetkapcsolata, vagy vegye fel a kapcsolatot a kiszolgáló rendszergazdájával", "Your %(brand)s is misconfigured": "A(z) %(brand)s alkalmazás hibásan van beállítva", "Ask your %(brand)s admin to check your config for incorrect or duplicate entries.": "Kérje meg a(z) %(brand)s rendszergazdáját, hogy ellenőrizze a beállításait, hibás vagy duplikált bejegyzéseket keresve.", "Unexpected error resolving identity server configuration": "Az azonosítási kiszolgáló beállításainak feldolgozásánál váratlan hiba történt", @@ -916,14 +916,14 @@ "Changes your avatar in all rooms": "Megváltoztatja a profilképét az összes szobában", "Removing…": "Eltávolítás…", "Clear all data": "Minden adat törlése", - "Your homeserver doesn't seem to support this feature.": "A Matrix szervered úgy tűnik nem támogatja ezt a szolgáltatást.", + "Your homeserver doesn't seem to support this feature.": "Úgy tűnik, hogy a Matrix-kiszolgálója nem támogatja ezt a szolgáltatást.", "Resend %(unsentCount)s reaction(s)": "%(unsentCount)s reakció újraküldése", - "Failed to re-authenticate due to a homeserver problem": "Az újra bejelentkezés a matrix szerver hibájából meghiusúlt", + "Failed to re-authenticate due to a homeserver problem": "Az újbóli hitelesítés a Matrix-kiszolgáló hibájából sikertelen", "Failed to re-authenticate": "Újra bejelentkezés sikertelen", "Enter your password to sign in and regain access to your account.": "Add meg a jelszavadat a belépéshez, hogy visszaszerezd a hozzáférésed a fiókodhoz.", "Forgotten your password?": "Elfelejtetted a jelszavad?", "Sign in and regain access to your account.": "Jelentkezz be és szerezd vissza a hozzáférésed a fiókodhoz.", - "You cannot sign in to your account. Please contact your homeserver admin for more information.": "A fiókodba nem tudsz bejelentkezni. További információkért kérlek vedd fel a kapcsolatot a matrix szerver adminisztrátorával.", + "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Nem tud bejelentkezni a fiókjába. További információkért vegye fel a kapcsolatot a Matrix-kiszolgáló rendszergazdájával.", "You're signed out": "Kijelentkeztél", "Clear personal data": "Személyes adatok törlése", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "Kérlek mond el nekünk mi az ami nem működött, vagy még jobb, ha egy GitHub jegyben leírod a problémát.", @@ -935,8 +935,6 @@ "Summary": "Összefoglaló", "Call failed due to misconfigured server": "A hívás a helytelenül beállított kiszolgáló miatt sikertelen", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Kérje meg a Matrix-kiszolgáló (%(homeserverDomain)s) rendszergazdáját, hogy a hívások megfelelő működéséhez állítson be egy TURN-kiszolgálót.", - "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.": "Másik lehetőségként használhatja a turn.matrix.org nyilvános kiszolgálót, de ez nem lesz annyira megbízható, és megosztja az IP-címét a kiszolgálóval. Ezt a Beállításokban állíthatja be.", - "Try using turn.matrix.org": "A turn.matrix.org használatának kipróbálása", "Messages": "Üzenetek", "Actions": "Műveletek", "Displays list of commands with usages and descriptions": "Parancsok megjelenítése példával és leírással", @@ -955,7 +953,7 @@ "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Azonosítási szerver (%(serverName)s) felhasználási feltételeinek elfogadása, ezáltal megtalálhatóvá válsz e-mail cím vagy telefonszám megadásával.", "Discovery": "Felkutatás", "Deactivate account": "Fiók zárolása", - "Always show the window menu bar": "Az ablak menüsávjának folyamatos mutatása", + "Always show the window menu bar": "Ablak menüsávjának megjelenítése mindig", "Unable to revoke sharing for email address": "Az e-mail cím megosztását nem sikerült visszavonni", "Unable to share email address": "Az e-mail címet nem sikerült megosztani", "Revoke": "Visszavon", @@ -1030,7 +1028,7 @@ "Hide advanced": "Speciális beállítások elrejtése", "Show advanced": "Speciális beállítások megjelenítése", "Close dialog": "Ablak bezárása", - "Show previews/thumbnails for images": "Előnézet/bélyegkép megjelenítésea képekhez", + "Show previews/thumbnails for images": "Előnézet/bélyegkép megjelenítése a képekhez", "Clear cache and reload": "Gyorsítótár ürítése és újratöltés", "%(count)s unread messages including mentions.|other": "%(count)s olvasatlan üzenet megemlítéssel.", "%(count)s unread messages.|other": "%(count)s olvasatlan üzenet.", @@ -1070,8 +1068,8 @@ "Flags": "Zászlók", "React": "Reakció", "Cancel search": "Keresés megszakítása", - "Jump to first unread room.": "Az első olvasatlan szobába ugrás.", - "Jump to first invite.": "Az első meghívóra ugrás.", + "Jump to first unread room.": "Ugrás az első olvasatlan szobához.", + "Jump to first invite.": "Újrás az első meghívóhoz.", "Room %(name)s": "Szoba: %(name)s", "%(count)s unread messages including mentions.|one": "1 olvasatlan megemlítés.", "%(count)s unread messages.|one": "1 olvasatlan üzenet.", @@ -1089,8 +1087,8 @@ "%(name)s cancelled": "%(name)s megszakította", "%(name)s wants to verify": "%(name)s ellenőrizni szeretné", "You sent a verification request": "Ellenőrzési kérést küldtél", - "My Ban List": "Tiltólistám", - "This is your list of users/servers you have blocked - don't leave the room!": "Ez a saját tiltott felhasználók/kiszolgálók listája – ne hagyja el ezt a szobát!", + "My Ban List": "Saját tiltólista", + "This is your list of users/servers you have blocked - don't leave the room!": "Ez a saját, tiltott felhasználókat és kiszolgálókat tartalmazó listája – ne hagyja el ezt a szobát!", "Ignored/Blocked": "Figyelmen kívül hagyott/Tiltott", "Error adding ignored user/server": "Hiba a felhasználó/szerver hozzáadásánál a figyelmen kívül hagyandók listájához", "Something went wrong. Please try again or view your console for hints.": "Valami nem sikerült. Próbálja újra vagy nézze meg a konzolt a hiba okának felderítéséhez.", @@ -1162,10 +1160,10 @@ "Reactions": "Reakciók", " wants to chat": " csevegni szeretne", "Start chatting": "Beszélgetés elkezdése", - "Cross-signing public keys:": "Eszközök közti hitelesítés nyilvános kulcsai:", - "not found": "nem található", - "Cross-signing private keys:": "Eszközök közti hitelesítés privát kulcsai:", - "in secret storage": "biztonsági tárolóban", + "Cross-signing public keys:": "Az eszközök közti hitelesítés nyilvános kulcsai:", + "not found": "nem találhatók", + "Cross-signing private keys:": "Az eszközök közti hitelesítés titkos kulcsai:", + "in secret storage": "a biztonsági tárolóban", "Secret storage public key:": "Biztonsági tároló nyilvános kulcs:", "in account data": "fiók adatokban", "Cross-signing": "Eszközök közti hitelesítés", @@ -1202,11 +1200,11 @@ "Direct Messages": "Közvetlen Beszélgetések", "Go": "Meghívás", "Show info about bridges in room settings": "Híd információk megjelenítése a szobabeállításokban", - "This bridge is managed by .": "Ezt a hidat ez a felhasználó kezeli: .", + "This bridge is managed by .": "Ezt a hidat a következő kezeli: .", "Suggestions": "Javaslatok", "Failed to find the following users": "Az alábbi felhasználók nem találhatók", "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "Az alábbi felhasználók nem léteznek vagy hibásan vannak megadva, és nem lehet őket meghívni: %(csvNames)s", - "Lock": "Zárolás", + "Lock": "Lakat", "a few seconds ago": "néhány másodperce", "about a minute ago": "egy perce", "%(num)s minutes ago": "%(num)s perccel ezelőtt", @@ -1215,7 +1213,7 @@ "about a day ago": "egy napja", "%(num)s days ago": "%(num)s nappal ezelőtt", "a few seconds from now": "másodpercek múlva", - "about a minute from now": "percek múlva", + "about a minute from now": "egy perc múlva", "%(num)s minutes from now": "%(num)s perc múlva", "about an hour from now": "egy óra múlva", "%(num)s hours from now": "%(num)s óra múlva", @@ -1233,24 +1231,24 @@ "Verify User": "Felhasználó ellenőrzése", "For extra security, verify this user by checking a one-time code on both of your devices.": "A biztonság fokozásáért ellenőrizd ezt a felhasználót egy egyszeri kód egyeztetésével mindkettőtök készülékén.", "Start Verification": "Ellenőrzés elindítása", - "Unknown Command": "Ismeretlen Parancs", + "Unknown Command": "Ismeretlen parancs", "Unrecognised command: %(commandText)s": "Ismeretlen parancs: %(commandText)s", - "You can use /help to list available commands. Did you mean to send this as a message?": "Használhatod a /help-et az elérhető parancsok kilistázásához. Ezt üzenetként akartad küldeni?", - "Hint: Begin your message with // to start it with a slash.": "Tipp: Ez üzenetedet kezd ezzel: //, ha perjellel szeretnéd kezdeni.", - "Send as message": "Üzenet küldése", + "You can use /help to list available commands. Did you mean to send this as a message?": "Használhatja a /help parancsot az elérhető parancsok listázásához. Ezt üzenetként akarta elküldeni?", + "Hint: Begin your message with // to start it with a slash.": "Tipp: Kezdje az üzenetet ezzel: //, ha perjellel szeretné kezdeni.", + "Send as message": "Küldés üzenetként", "This room is end-to-end encrypted": "Ez a szoba végpontok közötti titkosítást használ", "Everyone in this room is verified": "A szobában mindenki ellenőrizve van", "Send a reply…": "Válasz küldése…", "Send a message…": "Üzenet küldése…", "Reject & Ignore user": "Felhasználó elutasítása és figyelmen kívül hagyása", "Enter your account password to confirm the upgrade:": "A fejlesztés megerősítéséhez add meg a fiók jelszavadat:", - "You'll need to authenticate with the server to confirm the upgrade.": "Azonosítanod kell magad a szerveren a fejlesztés megerősítéséhez.", + "You'll need to authenticate with the server to confirm the upgrade.": "A fejlesztés megerősítéséhez újból hitelesítenie kell a kiszolgálóval.", "Upgrade your encryption": "Titkosításod fejlesztése", "Verify this session": "Munkamenet ellenőrzése", "Encryption upgrade available": "A titkosítási fejlesztés elérhető", "Enable message search in encrypted rooms": "Üzenetek keresésének bekapcsolása a titkosított szobákban", "Review": "Átnézés", - "This bridge was provisioned by .": "Ezt a hidat az alábbi felhasználó készítette: .", + "This bridge was provisioned by .": "Ezt a hidat a következő készítette: .", "Show less": "Kevesebb megjelenítése", "Manage": "Kezelés", "Securely cache encrypted messages locally for them to appear in search results.": "A titkosított üzenetek kereséséhez azokat biztonságos módon, helyileg kell tárolnia.", @@ -1271,12 +1269,12 @@ "Never send encrypted messages to unverified sessions from this session": "Sose küldjön titkosított üzenetet ellenőrizetlen munkamenetekbe ebből a munkamenetből", "Never send encrypted messages to unverified sessions in this room from this session": "Ebben a szobában sose küldjön titkosított üzenetet ellenőrizetlen munkamenetekbe ebből a munkamenetből", "How fast should messages be downloaded.": "Milyen gyorsan legyenek az üzenetek letöltve.", - "Waiting for %(displayName)s to verify…": "%(displayName)s felhasználóra várakozás az ellenőrzéshez…", + "Waiting for %(displayName)s to verify…": "Várakozás %(displayName)s felhasználóra az ellenőrzéshez…", "They match": "Egyeznek", "They don't match": "Nem egyeznek", - "To be secure, do this in person or use a trusted way to communicate.": "A biztonság érdekében ezt végezd el személyesen vagy egy megbízható kommunikációs csatornán.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "A fiókodhoz tartozik egy eszköz-közti hitelesítési identitás, de ez a munkamenet még nem jelölte megbízhatónak.", - "in memory": "memóriában", + "To be secure, do this in person or use a trusted way to communicate.": "A biztonság érdekében ezt végezze el személyesen, vagy használjon megbízható kommunikációs csatornát.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "A fiókjához tartozik egy eszközök közti hitelesítési identitás, de ez a munkamenet még nem jelölte megbízhatónak.", + "in memory": "a memóriában", "WARNING: KEY VERIFICATION FAILED! The signing key for %(userId)s and session %(deviceId)s is \"%(fprint)s\" which does not match the provided key \"%(fingerprint)s\". This could mean your communications are being intercepted!": "FIGYELEM: KULCSELLENŐRZÉS SIKERTELEN! %(userId)s aláírási kulcsa és a %(deviceId)s munkamenet ujjlenyomata „%(fprint)s”, amely nem egyezik meg a megadott ujjlenyomattal: „%(fingerprint)s”. Ez azt is jelentheti, hogy a kommunikációt lehallgatják.", "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "A megadott aláírási kulcs megegyezik %(userId)s felhasználótól kapott aláírási kulccsal ebben a munkamenetben: %(deviceId)s. A munkamenet ellenőrzöttnek lett jelölve.", "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Ez az munkamenet nem menti el a kulcsait, de van létező mentése, amelyből vissza tud állni és amihez hozzá tud adni a továbbiakban.", @@ -1294,8 +1292,8 @@ "Your keys are not being backed up from this session.": "A kulcsai nem kerülnek mentésre ebből a munkamenetből.", "Enable desktop notifications for this session": "Asztali értesítések engedélyezése ebben a munkamenetben", "Enable audible notifications for this session": "Hallható értesítések engedélyezése ebben a munkamenetben", - "Session ID:": "Munkamenet azonosító:", - "Session key:": "Munkamenet kulcs:", + "Session ID:": "Munkamenetazonosító:", + "Session key:": "Munkamenetkulcs:", "This user has not verified all of their sessions.": "Ez a felhasználó még nem ellenőrizte az összes munkamenetét.", "You have not verified this user.": "Még nem ellenőrizted ezt a felhasználót.", "You have verified this user. This user has verified all of their sessions.": "Ezt a felhasználót ellenőrizted. Ez a felhasználó hitelesítette az összes munkamenetét.", @@ -1354,10 +1352,10 @@ "%(name)s declined": "%(name)s elutasította", "Cancelling…": "Megszakítás…", "Your homeserver does not support cross-signing.": "A Matrix-kiszolgálója nem támogatja az eszközök közti hitelesítést.", - "Homeserver feature support:": "A Matrix-kiszolgáló támogatja-e a szolgáltatást:", + "Homeserver feature support:": "A Matrix-kiszolgáló funkciótámogatása:", "exists": "létezik", "Accepting…": "Elfogadás…", - "Show shortcuts to recently viewed rooms above the room list": "Gyorselérési gombok megjelenítése a nemrég meglátogatott szobákhoz a szobalista felett", + "Show shortcuts to recently viewed rooms above the room list": "Gyors elérési gombok megjelenítése a nemrég meglátogatott szobákhoz a szobalista felett", "Sign In or Create Account": "Bejelentkezés vagy fiók létrehozása", "Use your account or create a new one to continue.": "A folytatáshoz használja a fiókját, vagy hozzon létre egy újat.", "Create Account": "Fiók létrehozása", @@ -1381,10 +1379,10 @@ "Theme added!": "Téma hozzáadva!", "Custom theme URL": "Egyéni téma webcíme", "Add theme": "Téma hozzáadása", - "Self signing private key:": "Titkos önaláíró kulcs:", + "Self signing private key:": "Önaláíró titkos kulcs:", "cached locally": "helyben gyorsítótárazott", - "not found locally": "helyben nem található", - "User signing private key:": "Titkos felhasználó aláíró kulcs:", + "not found locally": "nem található helyben", + "User signing private key:": "Felhasználó aláírási titkos kulcs:", "Keyboard Shortcuts": "Billentyűzet kombinációk", "Scroll to most recent messages": "A legfrissebb üzenethez görget", "Local address": "Helyi cím", @@ -1396,12 +1394,12 @@ "Enter a server name": "Add meg a szerver nevét", "Looks good": "Jól néz ki", "Can't find this server or its room list": "A szerver vagy a szoba listája nem található", - "All rooms": "Kezdő tér", + "All rooms": "Összes szoba", "Your server": "Matrix szervered", "Matrix": "Matrix", "Add a new server": "Új szerver hozzáadása", "Manually verify all remote sessions": "Az összes távoli munkamenet kézi ellenőrzése", - "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "A felhasználó által használt munkamenetek ellenőrzése egyenként, a eszközök közti aláírással hitelesített eszközökben nem bízol meg.", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "A felhasználó által használt munkamenetek ellenőrzése egyenként, nem bízva az eszközök közti aláírással rendelkező eszközökben.", "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Állíts be címet ehhez a szobához, hogy a felhasználók a matrix szervereden megtalálhassák (%(localDomain)s)", "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "A titkosított szobákban az üzenete biztonságban van, és csak Ön és a címzettek rendelkeznek a visszafejtéshez szükséges egyedi kulcsokkal.", "Verify all users in a room to ensure it's secure.": "Ellenőrizze a szoba összes tagját, hogy meggyőződjön a biztonságáról.", @@ -1512,7 +1510,7 @@ "Upload a file": "Fájl feltöltése", "Joins room with given address": "A megadott címmel csatlakozik a szobához", "Font size": "Betűméret", - "IRC display name width": "IRC megjelenítési név szélessége", + "IRC display name width": "IRC-n megjelenítendő név szélessége", "Size must be a number": "A méretnek számnak kell lennie", "Custom font size can only be between %(min)s pt and %(max)s pt": "Az egyedi betűméret csak %(min)s pont és %(max)s pont között lehet", "Use between %(min)s pt and %(max)s pt": "Csak %(min)s pont és %(max)s pont közötti értéket használj", @@ -1538,7 +1536,7 @@ "Use a different passphrase?": "Másik jelmondat használata?", "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "A kiszolgáló adminisztrátora alapértelmezetten kikapcsolta a végpontok közötti titkosítást a privát szobákban és a közvetlen beszélgetésekben.", "No recently visited rooms": "Nincsenek nemrégiben meglátogatott szobák", - "People": "Felhasználók", + "People": "Emberek", "Sort by": "Rendezés", "Message preview": "Üzenet előnézet", "List options": "Lista beállításai", @@ -1557,18 +1555,18 @@ "A-Z": "A-Z", "Looks good!": "Jól néz ki!", "Use custom size": "Egyéni méret használata", - "Use a system font": "Rendszer betűtípusának használata", - "System font name": "Rendszer betűtípusának neve", + "Use a system font": "Rendszer betűkészletének használata", + "System font name": "Rendszer betűkészletének neve", "Hey you. You're the best!": "Hé te! Te vagy a legjobb!", "Message layout": "Üzenet kinézete", "Modern": "Modern", "The authenticity of this encrypted message can't be guaranteed on this device.": "A titkosított üzenetek valódiságát ezen az eszközön nem lehet garantálni.", "You joined the call": "Csatlakozott a hívásba", - "%(senderName)s joined the call": "%(senderName)s csatlakozott a híváshoz", - "Call in progress": "Hívás folyamatban van", + "%(senderName)s joined the call": "%(senderName)s csatlakozott a hívásba", + "Call in progress": "Folyamatban lévő hívás", "Call ended": "A hívás befejeződött", - "You started a call": "Hívást kezdeményezett", - "%(senderName)s started a call": "%(senderName)s hívást kezdeményezett", + "You started a call": "Hívást indított", + "%(senderName)s started a call": "%(senderName)s hívást indított", "Waiting for answer": "Válaszra várakozás", "%(senderName)s is calling": "%(senderName)s hívja", "%(senderName)s: %(message)s": "%(senderName)s: %(message)s", @@ -1579,7 +1577,7 @@ "Security Phrase": "Biztonsági jelmondat", "Security Key": "Biztonsági kulcs", "Use your Security Key to continue.": "Használja a biztonsági kulcsot a folytatáshoz.", - "Safeguard against losing access to encrypted messages & data by backing up encryption keys on your server.": "A titkosított üzenetekhez és adatokhoz való hozzáférés elvesztése esetén használható biztonsági tartalék a titkosított kulcsok a szerveredre való elmentésével.", + "Safeguard against losing access to encrypted messages & data by backing up encryption keys on your server.": "Védekezzen a titkosított üzenetekhez és adatokhoz való hozzáférés elvesztése ellen a titkosítási kulcsok kiszolgálóra történő mentésével.", "Generate a Security Key": "Biztonsági kulcs előállítása", "Enter a Security Phrase": "Biztonsági jelmondat megadása", "Use a secret phrase only you know, and optionally save a Security Key to use for backup.": "Olyan biztonsági jelmondatot használjon, amelyet csak Ön ismer, és esetleg mentsen el egy biztonsági kulcsot vésztartaléknak.", @@ -1619,7 +1617,7 @@ "A connection error occurred while trying to contact the server.": "Kapcsolati hiba lépett fel miközben a szervert próbáltad elérni.", "The server is not configured to indicate what the problem is (CORS).": "A szerver nincs beállítva, hogy megmutassa mi okozhatta a hibát (CORS).", "Recent changes that have not yet been received": "Legutóbbi változások amik még nem érkeztek meg", - "Master private key:": "Privát elsődleges kulcs:", + "Master private key:": "Elsődleges titkos kulcs:", "No files visible in this room": "Ebben a szobában nincsenek fájlok", "Attach files from chat or just drag and drop them anywhere in a room.": "Csatolj fájlt a csevegésből vagy húzd és ejtsd bárhova a szobában.", "Explore public rooms": "Nyilvános szobák felfedezése", @@ -1642,8 +1640,8 @@ "Room settings": "Szoba beállítások", "Take a picture": "Fénykép készítése", "Unpin": "Leszedés", - "Cross-signing is ready for use.": "Eszközök közötti hitelesítés kész a használatra.", - "Cross-signing is not set up.": "Az eszközök közötti hitelesítés nincs beállítva.", + "Cross-signing is ready for use.": "Az eszközök közti hitelesítés használatra kész.", + "Cross-signing is not set up.": "Az eszközök közti hitelesítés nincs beállítva.", "Backup version:": "Mentés verzió:", "Algorithm:": "Algoritmus:", "Backup key stored:": "Mentési kulcs tár:", @@ -1658,7 +1656,7 @@ "Your server requires encryption to be enabled in private rooms.": "A szervered megköveteli, hogy a titkosítás be legyen kapcsolva a privát szobákban.", "Unable to set up keys": "Nem sikerült a kulcsok beállítása", "Safeguard against losing access to encrypted messages & data": "Biztosíték a titkosított üzenetekhez és adatokhoz való hozzáférés elvesztése ellen", - "not found in storage": "a tárban nem található", + "not found in storage": "nem találhatók a tárolóban", "Widgets": "Kisalkalmazások", "Edit widgets, bridges & bots": "Kisalkalmazások, hidak és botok szerkesztése", "Use the Desktop app to see all encrypted files": "Ahhoz, hogy elérd az összes titkosított fájlt, használd az Asztali alkalmazást", @@ -1692,8 +1690,8 @@ "Feedback sent": "Visszajelzés elküldve", "%(senderName)s ended the call": "%(senderName)s befejezte a hívást", "You ended the call": "Befejezte a hívást", - "New version of %(brand)s is available": "Új verzió érhető el ebből: %(brand)s", - "Update %(brand)s": "%(brand)s frissítése", + "New version of %(brand)s is available": "Új %(brand)s verzió érhető el", + "Update %(brand)s": "A(z) %(brand)s frissítése", "Enable desktop notifications": "Asztali értesítések engedélyezése", "Don't miss a reply": "Ne szalasszon el egy választ se", "Now, let's help you get started": "És most segítünk az indulásban", @@ -1996,7 +1994,7 @@ "Approve": "Engedélyez", "This widget would like to:": "A kisalkalmazás ezeket szeretné:", "Approve widget permissions": "Kisalkalmazás-engedélyek elfogadása", - "Sign into your homeserver": "Bejelentkezés a matrix szerveredbe", + "Sign into your homeserver": "Bejelentkezés a Matrix-kiszolgálójába", "Specify a homeserver": "Matrix szerver megadása", "Invalid URL": "Érvénytelen URL", "Unable to validate homeserver": "A matrix szervert nem lehet ellenőrizni", @@ -2007,10 +2005,10 @@ "Return to call": "Visszatérés a híváshoz", "%(peerName)s held the call": "%(peerName)s várakoztatja a hívást", "You held the call Resume": "A hívás várakozik, folytatás", - "sends fireworks": "tűzijáték küldése", - "Sends the given message with fireworks": "Az üzenet elküldése tűzijátékkal", - "sends confetti": "konfetti küldése", - "Sends the given message with confetti": "Az üzenet elküldése konfettivel", + "sends fireworks": "tűzijátékot küld", + "Sends the given message with fireworks": "Tűzijátékkal küldi el az üzenetet", + "sends confetti": "konfettit küld", + "Sends the given message with confetti": "Konfettivel küldi el az üzenetet", "Use Ctrl + Enter to send a message": "Ctrl + Enter használata az üzenet elküldéséhez", "Use Command + Enter to send a message": "Command + Enter használata az üzenet küldéséhez", "Render LaTeX maths in messages": "LaTeX matematikai kifejezések megjelenítése az üzenetekben", @@ -2062,10 +2060,10 @@ "Add an email to be able to reset your password.": "Adj meg egy e-mail címet, hogy vissza tudd állítani a jelszavad.", "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Csak egy figyelmeztetés, ha nem adsz meg e-mail címet, és elfelejted a jelszavad, véglegesen elveszítheted a fiókodhoz való hozzáférést.", "Server Options": "Szerver lehetőségek", - "Learn more": "Tudj meg többet", - "About homeservers": "A Matrix szerverekről", - "Use your preferred Matrix homeserver if you have one, or host your own.": "Add meg az általad választott Matrix szerver címét, ha van ilyen, vagy üzemeltess egy sajátot.", - "Other homeserver": "Másik Matrix szerver", + "Learn more": "További információk", + "About homeservers": "A Matrix-kiszolgálókról", + "Use your preferred Matrix homeserver if you have one, or host your own.": "Használja a választott Matrix-kiszolgálóját, ha van ilyenje, vagy üzemeltessen egy sajátot.", + "Other homeserver": "Másik Matrix-kiszolgáló", "Host account on": "Fiók létrehozása itt:", "Call failed because webcam or microphone could not be accessed. Check that:": "A hívás sikertelen, mert a webkamera, vagy a mikrofon nem érhető el. Ellenőrizze a következőket:", "Decide where your account is hosted": "Döntse el, hol szeretne fiókot létrehozni", @@ -2086,10 +2084,10 @@ "Send stickers to your active room as you": "Matricák küldése az aktív szobájába saját néven", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "A szövegek megjelenítéséhez a keresésekben biztonságosan kell helyileg tárolni a titkosított üzeneteket, ehhez %(size)s méretben tárolódnak az üzenetek %(rooms)s szobából.", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "A szövegek megjelenítéséhez a keresésekben biztonságosan kell helyileg tárolni a titkosított üzeneteket, ehhez %(size)s méretben tárolódnak az üzenetek %(rooms)s szobából.", - "%(name)s on hold": "%(name)s hívás tartva", + "%(name)s on hold": "%(name)s várakoztatva", "You held the call Switch": "A hívás várakozik, átkapcsolás", "sends snowfall": "hóesést küld", - "Sends the given message with snowfall": "Az üzenet elküldése hóeséssel", + "Sends the given message with snowfall": "Hóeséssel küldi el az üzenetet", "See emotes posted to your active room": "Az aktív szobájába küldött emodzsik megjelenítése", "See emotes posted to this room": "Ebbe a szobába küldött emodzsik megjelenítése", "You have no visible notifications.": "Nincsenek látható értesítések.", @@ -2116,7 +2114,7 @@ "Your Security Key is a safety net - you can use it to restore access to your encrypted messages if you forget your Security Phrase.": "A biztonsági kulcs egy biztonsági háló - arra az esetre, ha elfelejti a biztonsági jelmondatot - a titkosított üzenetekhez való hozzáférés helyreállításához.", "Set up with a Security Key": "Beállítás biztonsági kulccsal", "Great! This Security Phrase looks strong enough.": "Nagyszerű! Ez a biztonsági jelmondat elég erősnek tűnik.", - "We'll store an encrypted copy of your keys on our server. Secure your backup with a Security Phrase.": "A kulcsait titkosított formában tároljuk a szerverünkön. Helyezze biztonságba a mentését a Biztonsági Jelmondattal.", + "We'll store an encrypted copy of your keys on our server. Secure your backup with a Security Phrase.": "A kulcsait titkosított formában tároljuk a kiszolgálónkon. Helyezze biztonságba a mentését egy biztonsági jelmondattal.", "If you've forgotten your Security Key you can ": "Ha elfelejtette a biztonsági kulcsot, ", "Access your secure message history and set up secure messaging by entering your Security Key.": "A biztonsági kulcs megadásával hozzáférhet a régi biztonságos üzeneteihez és beállíthatja a biztonságos üzenetküldést.", "Not a valid Security Key": "Érvénytelen biztonsági kulcs", @@ -2146,9 +2144,9 @@ "Remember this": "Emlékezzen erre", "The widget will verify your user ID, but won't be able to perform actions for you:": "A kisalkalmazás ellenőrizni fogja a felhasználói azonosítóját, de az alábbi tevékenységeket nem tudja végrehajtani:", "Allow this widget to verify your identity": "A kisalkalmazás ellenőrizheti a személyazonosságát", - "Show stickers button": "Matrica gomb megjelenítése", + "Show stickers button": "Matricák gomb megjelenítése", "Show line numbers in code blocks": "Sorszámok megjelenítése a kódblokkokban", - "Expand code blocks by default": "Kódblokk kibontása alapértelmezetten", + "Expand code blocks by default": "Kódblokkok kibontása alapértelmezetten", "Recently visited rooms": "Nemrég meglátogatott szobák", "Values at explicit levels in this room:": "Egyedi szinthez tartozó értékek ebben a szobában:", "Values at explicit levels:": "Egyedi szinthez tartozó értékek:", @@ -2167,7 +2165,7 @@ "Value in this room": "Érték ebben a szobában", "Value": "Érték", "Setting ID": "Beállításazonosító", - "Show chat effects (animations when receiving e.g. confetti)": "Csevegés effektek (például a konfetti animáció) megjelenítése", + "Show chat effects (animations when receiving e.g. confetti)": "Csevegési effektek (például a konfetti animáció) megjelenítése", "Original event source": "Eredeti esemény forráskód", "Decrypted event source": "Visszafejtett esemény forráskód", "Invite by username": "Meghívás felhasználónévvel", @@ -2184,16 +2182,16 @@ "Welcome to ": "Üdvözöl a(z) ", "%(count)s members|one": "%(count)s tag", "%(count)s members|other": "%(count)s tag", - "Your server does not support showing space hierarchies.": "A szervere nem támogatja a terek hierarchiáinak a megjelenítését.", + "Your server does not support showing space hierarchies.": "A kiszolgálója nem támogatja a terek hierarchiájának megjelenítését.", "Are you sure you want to leave the space '%(spaceName)s'?": "Biztos, hogy elhagyja ezt a teret: %(spaceName)s?", "This space is not public. You will not be able to rejoin without an invite.": "Ez a tér nem nyilvános. Kilépés után csak újabb meghívóval lehet újra belépni.", "Start audio stream": "Hang folyam indítása", "Failed to start livestream": "Az élő adás indítása sikertelen", "Unable to start audio streaming.": "A hang folyam indítása sikertelen.", - "Save Changes": "Változások mentése", + "Save Changes": "Változtatások mentése", "Leave Space": "Tér elhagyása", - "Edit settings relating to your space.": "Tér beállításainak szerkesztése.", - "Failed to save space settings.": "A tér beállításának mentése nem sikerült.", + "Edit settings relating to your space.": "A tér beállításainak szerkesztése.", + "Failed to save space settings.": "A tér beállításának mentése sikertelen.", "Invite someone using their name, username (like ) or share this space.": "Hívjon meg valakit a nevével, felhasználói nevével (pl. ) vagy oszd meg ezt a teret.", "Invite someone using their name, email address, username (like ) or share this space.": "Hívjon meg valakit a nevét, e-mail címét, vagy felhasználónevét (például ) megadva, vagy oszd meg ezt a teret.", "Unnamed Space": "Névtelen tér", @@ -2212,18 +2210,18 @@ "Your message was sent": "Üzenet elküldve", "Space options": "Tér beállításai", "Leave space": "Tér elhagyása", - "Invite people": "Személyek meghívása", + "Invite people": "Emberek meghívása", "Share your public space": "Nyilvános tér megosztása", - "Share invite link": "Meghívási link megosztása", + "Share invite link": "Meghívási hivatkozás megosztása", "Click to copy": "Másolás kattintással", - "Your private space": "Privát tér", - "Your public space": "Nyilvános tér", - "Invite only, best for yourself or teams": "Csak meghívóval, saját célra és csoportoknak ideális", + "Your private space": "Saját privát tér", + "Your public space": "Saját nyilvános tér", + "Invite only, best for yourself or teams": "Csak meghívóval, saját célra és csoportok számára ideális", "Private": "Privát", - "Open space for anyone, best for communities": "Nyílt tér mindenkinek, a legjobb a közösségeknek", + "Open space for anyone, best for communities": "Mindenki számára nyílt tér, a közösségek számára ideális", "Public": "Nyilvános", - "Create a space": "Tér készítése", - "Delete": "Töröl", + "Create a space": "Tér létrehozása", + "Delete": "Törlés", "Jump to the bottom of the timeline when you send a message": "Üzenetküldés után az idővonal aljára ugrás", "This homeserver has been blocked by its administrator.": "A Matrix-kiszolgálót a rendszergazda zárolta.", "You're already in a call with this person.": "Már hívásban van ezzel a személlyel.", @@ -2252,15 +2250,15 @@ "Invite to %(roomName)s": "Meghívás ide: %(roomName)s", "Edit devices": "Eszközök szerkesztése", "Invite with email or username": "Meghívás e-mail-címmel vagy felhasználónévvel", - "You can change these anytime.": "Bármikor megváltoztatható.", - "Add some details to help people recognise it.": "Információ hozzáadása, hogy könnyebben felismerhető legyen.", + "You can change these anytime.": "Ezeket bármikor megváltoztathatja.", + "Add some details to help people recognise it.": "Adjon hozzá néhány részletet, hogy könnyebben felismerhető legyen.", "Verify your identity to access encrypted messages and prove your identity to others.": "Ellenőrizze a személyazonosságát, hogy hozzáférjen a titkosított üzeneteihez és másoknak is bizonyítani tudja személyazonosságát.", "You can add more later too, including already existing ones.": "Később is hozzáadhat többet, beleértve meglévőket is.", "Let's create a room for each of them.": "Készítsünk szobát mindhez.", "What are some things you want to discuss in %(spaceName)s?": "Mik azok amikről beszélni szeretne itt: %(spaceName)s?", "Verification requested": "Hitelesítés kérés elküldve", "Avatar": "Profilkép", - "Reset event store": "Az esemény tárolót alaphelyzetbe állítása", + "Reset event store": "Az eseménytároló alaphelyzetbe állítása", "You most likely do not want to reset your event index store": "Az esemény index tárolót nagy valószínűséggel nem szeretné alaphelyzetbe állítani", "Reset event store?": "Az esemény tárolót alaphelyzetbe állítja?", "Consult first": "Kérjen először véleményt", @@ -2270,7 +2268,7 @@ "%(count)s people you know have already joined|one": "%(count)s ismerős már csatlakozott", "%(count)s people you know have already joined|other": "%(count)s ismerős már csatlakozott", "Invite to just this room": "Meghívás csak ebbe a szobába", - "Warn before quitting": "Kilépés előtt figyelmeztet", + "Warn before quitting": "Figyelmeztetés kilépés előtt", "Manage & explore rooms": "Szobák kezelése és felderítése", "Consulting with %(transferTarget)s. Transfer to %(transferee)s": "Egyeztetés vele: %(transferTarget)s. Átadás ide: %(transferee)s", "unknown person": "ismeretlen személy", @@ -2285,8 +2283,8 @@ "Forgotten or lost all recovery methods? Reset all": "Elfelejtette vagy elveszett minden helyreállítási lehetőség? Minden alaphelyzetbe állítása", "If you do, please note that none of your messages will be deleted, but the search experience might be degraded for a few moments whilst the index is recreated": "Ha ezt teszi, tudnia kell, hogy az üzenetek nem kerülnek törlésre de keresés nem lesz tökéletes amíg az indexek nem készülnek el újra", "View message": "Üzenet megjelenítése", - "Zoom in": "Nagyít", - "Zoom out": "Kicsinyít", + "Zoom in": "Nagyítás", + "Zoom out": "Kicsinyítés", "%(seconds)ss left": "%(seconds)s mp van hátra", "You can select all or individual messages to retry or delete": "Újraküldéshez vagy törléshez kiválaszthatja az üzeneteket egyenként vagy az összeset együtt", "Retry all": "Mind újraküldése", @@ -2303,7 +2301,6 @@ "You have no ignored users.": "Nincs figyelmen kívül hagyott felhasználó.", "Play": "Lejátszás", "Pause": "Szünet", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Ez egy kísérleti funkció Egyenlőre az a felhasználó aki meghívót kap a meghívóban lévő linkre kattintva tud csatlakozni.", "Select a room below first": "Először válasszon ki szobát alulról", "Join the beta": "Csatlakozás béta lehetőségekhez", "Leave the beta": "Béta kikapcsolása", @@ -2320,8 +2317,8 @@ "Unable to access your microphone": "A mikrofont nem lehet használni", "Your access token gives full access to your account. Do not share it with anyone.": "A hozzáférési kulcs teljes elérést biztosít a fiókhoz. Soha ne ossza meg mással.", "Access Token": "Hozzáférési kulcs", - "Please enter a name for the space": "Kérem adjon meg egy nevet a térhez", - "Connecting": "Kapcsolás", + "Please enter a name for the space": "Adjon meg egy nevet a térhez", + "Connecting": "Kapcsolódás", "To leave the beta, visit your settings.": "A beállításokban tudja elhagyni a bétát.", "Your platform and username will be noted to help us use your feedback as much as we can.": "A platformja és a felhasználóneve fel lesz jegyezve, hogy segítsen nekünk a lehető legjobban felhasználni a visszajelzését.", "Add reaction": "Reakció hozzáadása", @@ -2331,7 +2328,7 @@ "Search names and descriptions": "Nevek és leírások keresése", "You may contact me if you have any follow up questions": "Ha további kérdés merülne fel, kapcsolatba léphetnek velem", "sends space invaders": "space invaders küldése", - "Sends the given message with a space themed effect": "Üzenet küldése világűrös effekttel", + "Sends the given message with a space themed effect": "Világűrös effekttel küldi el az üzenetet", "See when people join, leave, or are invited to your active room": "Emberek belépésének, távozásának vagy meghívásának a megjelenítése az aktív szobájában", "See when people join, leave, or are invited to this room": "Emberek belépésének, távozásának vagy meghívásának a megjelenítése ebben a szobában", "Currently joining %(count)s rooms|one": "%(count)s szobába lép be", @@ -2365,14 +2362,14 @@ "%(senderName)s removed their profile picture": "%(senderName)s törölte a profilképét", "%(senderName)s removed their display name (%(oldDisplayName)s)": "%(senderName)s törölte a megjelenítendő nevét (%(oldDisplayName)s)", "%(senderName)s set their display name to %(displayName)s": "%(senderName)s a következőre változtatta a megjelenítendő nevét: %(displayName)s", - "%(oldDisplayName)s changed their display name to %(displayName)s": "%(oldDisplayName)s a következőre változtatta a nevét: %(displayName)s", + "%(oldDisplayName)s changed their display name to %(displayName)s": "s%(oldDisplayName)s a következőre változtatta a nevét: %(displayName)s", "%(senderName)s banned %(targetName)s": "%(senderName)s kitiltotta a következőt: %(targetName)s", "%(senderName)s banned %(targetName)s: %(reason)s": "%(senderName)s kitiltotta a következőt: %(targetName)s, ok: %(reason)s", "%(targetName)s accepted an invitation": "%(targetName)s elfogadta a meghívást", "%(targetName)s accepted the invitation for %(displayName)s": "%(targetName)s elfogadta a meghívást ide: %(displayName)s", "Some invites couldn't be sent": "Néhány meghívót nem sikerült elküldeni", "Please pick a nature and describe what makes this message abusive.": "Az üzenet természetének kiválasztása vagy annak megadása, hogy miért elítélendő.", - "This room is dedicated to illegal or toxic content or the moderators fail to moderate illegal or toxic content.\nThis will be reported to the administrators of %(homeserver)s. The administrators will NOT be able to read the encrypted content of this room.": "Ez a szoba illegális vagy mérgező tartalmat közvetít vagy a moderátorok képtelenek ezeket megfelelően kezelni.\nEzek a szerver (%(homeserver)s) üzemeltetője felé jelzésre kerülnek. Az adminisztrátorok nem tudják olvasni a titkosított szobák tartalmát.", + "This room is dedicated to illegal or toxic content or the moderators fail to moderate illegal or toxic content.\nThis will be reported to the administrators of %(homeserver)s. The administrators will NOT be able to read the encrypted content of this room.": "Ez a szoba illegális vagy mérgező tartalmat közvetít, vagy a moderátorok képtelenek ezeket megfelelően moderálni.\nEz jelezve lesz a(z) %(homeserver)s üzemeltetője felé. Az adminisztrátorok NEM tudják olvasni a szoba titkosított tartalmát.", "This user is spamming the room with ads, links to ads or to propaganda.\nThis will be reported to the room moderators.": "A felhasználó kéretlen reklámokkal, reklám hivatkozásokkal vagy propagandával bombázza a szobát.\nEz moderátorok felé jelzésre kerül.", "This user is displaying illegal behaviour, for instance by doxing people or threatening violence.\nThis will be reported to the room moderators who may escalate this to legal authorities.": "A felhasználó illegális viselkedést valósít meg, például kipécézett valakit vagy tettlegességgel fenyeget.\nEz moderátorok felé jelzésre kerül akik akár hivatalos személyek felé továbbíthatják ezt.", "%(oneUser)schanged the server ACLs %(count)s times|one": "%(oneUser)smegváltoztatta a szerver ACL-eket", @@ -2383,8 +2380,8 @@ "To publish an address, it needs to be set as a local address first.": "A cím publikálásához először helyi címet kell beállítani.", "Published addresses can be used by anyone on any server to join your space.": "A nyilvánosságra hozott címet bárki bármelyik szerverről használhatja a térbe való belépéshez.", "Published addresses can be used by anyone on any server to join your room.": "A nyilvánosságra hozott címet bárki bármelyik szerverről használhatja a szobához való belépéshez.", - "Failed to update the history visibility of this space": "A tér régi üzeneteinek láthatóság állítása nem sikerült", - "Failed to update the guest access of this space": "A tér vendég hozzáférésének állítása sikertelen", + "Failed to update the history visibility of this space": "A tér régi üzeneteinek láthatóságának frissítése sikertelen", + "Failed to update the guest access of this space": "A tér vendéghozzáférésének frissítése sikertelen", "We sent the others, but the below people couldn't be invited to ": "Az alábbi embereket nem sikerül meghívni ide: , de a többi meghívó elküldve", "[number]": "[szám]", "Report": "Jelentés", @@ -2404,22 +2401,22 @@ "%(severalUsers)schanged the server ACLs %(count)s times|one": "%(severalUsers)smegváltoztatta a szerver ACL-eket", "This space has no local addresses": "Ennek a térnek nincs helyi címe", "Space information": "Tér információk", - "Collapse": "Bezár", - "Expand": "Kinyit", - "Recommended for public spaces.": "Nyilvános terekhez ajánlott.", - "Allow people to preview your space before they join.": "Tér előnézetének engedélyezése mielőtt belépnének.", + "Collapse": "Összecsukás", + "Expand": "Kibontás", + "Recommended for public spaces.": "A nyilvános terekhez ajánlott.", + "Allow people to preview your space before they join.": "A tér előnézetének engedélyezése a belépés előtt.", "Preview Space": "Tér előnézete", - "Decide who can view and join %(spaceName)s.": "Döntse el ki láthatja és léphet be ide: %(spaceName)s.", + "Decide who can view and join %(spaceName)s.": "Döntse el, hogy ki láthatja, és léphet be ide: %(spaceName)s.", "Visibility": "Láthatóság", - "This may be useful for public spaces.": "Nyilvános tereknél ez hasznos lehet.", - "Guests can join a space without having an account.": "Vendégek fiók nélkül is beléphetnek a térbe.", - "Enable guest access": "Vendég hozzáférés engedélyezése", - "Failed to update the visibility of this space": "A tér láthatóságának állítása sikertelen", + "This may be useful for public spaces.": "A nyilvános tereknél ez hasznos lehet.", + "Guests can join a space without having an account.": "A vendégek fiók nélkül is beléphetnek a térbe.", + "Enable guest access": "Vendéghozzáférés engedélyezése", + "Failed to update the visibility of this space": "A tér láthatóságának frissítése sikertelen", "Address": "Cím", - "e.g. my-space": "pl. én-terem", - "Silence call": "Némítás", + "e.g. my-space": "például sajat-ter", + "Silence call": "Hívás némítása", "Sound on": "Hang be", - "Use Command + F to search timeline": "Command + F az idővonalon való kereséshez", + "Use Command + F to search timeline": "Command + F használata az idővonalon való kereséshez", "Unnamed audio": "Névtelen hang", "Error processing audio message": "Hiba a hangüzenet feldolgozásánál", "Show %(count)s other previews|one": "%(count)s további előnézet megjelenítése", @@ -2428,7 +2425,7 @@ "Code blocks": "Kód blokkok", "Displaying time": "Idő megjelenítése", "Keyboard shortcuts": "Billentyűzet kombinációk", - "Use Ctrl + F to search timeline": "Ctrl + F az idővonalon való kereséshez", + "Use Ctrl + F to search timeline": "Ctrl + F használata az idővonalon való kereséshez", "Integration manager": "Integrációs Menedzser", "Your %(brand)s doesn't allow you to use an integration manager to do this. Please contact an admin.": "A %(brand)s nem használhat Integrációs Menedzsert. Kérem vegye fel a kapcsolatot az adminisztrátorral.", "Using this widget may share data with %(widgetDomain)s & your integration manager.": "Ennek a kisalkalmazásnak a használata adatot oszthat meg a(z) %(widgetDomain)s oldallal és az integrációkezelőjével.", @@ -2496,8 +2493,8 @@ "An error occurred whilst saving your notification preferences.": "Hiba történt az értesítési beállításai mentése közben.", "Error saving notification preferences": "Hiba az értesítési beállítások mentésekor", "Messages containing keywords": "Az üzenetek kulcsszavakat tartalmaznak", - "Your camera is still enabled": "Az ön kamerája még be van kapcsolva", - "Your camera is turned off": "Az ön kamerája ki van kapcsolva", + "Your camera is still enabled": "A kamerája még mindig be van kapcsolva", + "Your camera is turned off": "A kamerája ki van kapcsolva", "%(sharerName)s is presenting": "%(sharerName)s tartja a bemutatót", "You are presenting": "Ön tartja a bemutatót", "Transfer Failed": "Átadás sikertelen", @@ -2519,7 +2516,7 @@ "Add space": "Tér hozzáadása", "These are likely ones other room admins are a part of.": "Ezek valószínűleg olyanok, amelyeknek más szoba adminok is tagjai.", "Show all rooms": "Minden szoba megjelenítése", - "All rooms you're in will appear in Home.": "Minden szoba, amelybe belépett megjelenik a Kezdőlapon.", + "All rooms you're in will appear in Home.": "Minden szoba, amelybe belépett, megjelenik a Kezdőlapon.", "Leave %(spaceName)s": "Kilép innen: %(spaceName)s", "You're the only admin of some of the rooms or spaces you wish to leave. Leaving them will leave them without any admins.": "Ön az adminisztrátora néhány szobának vagy térnek amiből ki szeretne lépni. Ha kilép belőlük akkor azok adminisztrátor nélkül maradnak.", "You're the only admin of this space. Leaving it will mean no one has control over it.": "Ön az egyetlen adminisztrátora a térnek. Ha kilép, senki nem tudja irányítani.", @@ -2532,12 +2529,12 @@ "Stop recording": "Felvétel megállítása", "Send voice message": "Hang üzenet küldése", "Mute the microphone": "Mikrofon némítása", - "Unmute the microphone": "Mikrofon némításának megszüntetése", + "Unmute the microphone": "Mikrofon némításának feloldása", "Dialpad": "Tárcsázó", "More": "Több", "Show sidebar": "Oldalsáv megjelenítése", "Hide sidebar": "Oldalsáv elrejtése", - "Start sharing your screen": "Képernyőmegosztás indítása", + "Start sharing your screen": "Képernyőmegosztás bekapcsolása", "Stop sharing your screen": "Képernyőmegosztás kikapcsolása", "Stop the camera": "Kamera kikapcsolása", "Start the camera": "Kamera bekapcsolása", @@ -2546,7 +2543,7 @@ "No answer": "Nincs válasz", "Delete avatar": "Profilkép törlése", "Are you sure you want to add encryption to this public room?": "Biztos, hogy titkosítást állít be ehhez a nyilvános szobához?", - "Cross-signing is ready but keys are not backed up.": "Az eszközök közötti hitelesítés készen áll, de a kulcsokról nincs biztonsági mentés.", + "Cross-signing is ready but keys are not backed up.": "Az eszközök közti hitelesítés készen áll, de a kulcsokról nincs biztonsági mentés.", "Rooms and spaces": "Szobák és terek", "Results": "Eredmények", "Enable encryption in settings.": "Titkosítás bekapcsolása a beállításokban.", @@ -2593,7 +2590,7 @@ "Format": "Formátum", "Export Chat": "Beszélgetés exportálása", "Exporting your data": "Adatai exportálása", - "Stop": "Állj", + "Stop": "Leállítás", "The export was cancelled successfully": "Az exportálás sikeresen félbeszakítva", "Export Successful": "Exportálás sikeres", "MB": "MB", @@ -2639,9 +2636,9 @@ "Loading new room": "Új szoba betöltése", "Upgrading room": "Szoba fejlesztése", "Show:": "Megjelenítés:", - "Shows all threads from current room": "A szobában lévő összes szál mutatása", + "Shows all threads from current room": "A szobában lévő összes üzenetszál megjelenítése", "All threads": "Minden üzenetszál", - "My threads": "Saját szálak", + "My threads": "Saját üzenetszálak", "Downloading": "Letöltés", "They won't be able to access whatever you're not an admin of.": "Később nem férhetnek hozzá olyan helyekhez ahol ön nem adminisztrátor.", "Ban them from specific things I'm able to": "Kitiltani őket bizonyos helyekről ahonnan joga van hozzá", @@ -2668,25 +2665,13 @@ "Joining": "Belépés", "Use high contrast": "Nagy kontraszt használata", "Light high contrast": "Világos, nagy kontrasztú", - "Automatically send debug logs on any error": "Hibakeresési napló automatikus küldése bármilyen hiba esetén", + "Automatically send debug logs on any error": "Hibakeresési naplók automatikus küldése bármilyen hiba esetén", "Click the button below to confirm signing out these devices.|other": "Ezeknek a eszközöknek törlésének a megerősítéséhez kattintson a gombra lent.", - "Unable to load device list": "Az eszköz listát nem lehet betölteni", - "Your homeserver does not support device management.": "A Matrix-kiszolgálója nem támogatja az eszközök kezelését.", - "Use a more compact 'Modern' layout": "Egyszerűbb „Modern” kinézet használata", + "Use a more compact 'Modern' layout": "Kompaktabb „Modern” elrendezés használata", "You do not have permission to start polls in this room.": "Nincs joga szavazást kezdeményezni ebben a szobában.", "This room isn't bridging messages to any platforms. Learn more.": "Ez a szoba egy platformmal sem köt össze üzeneteket. Tudjon meg többet.", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Bejelentkezett eszközök kezelése alább. Az eszköz neve a kommunikációban részt vevő személyek számára látható.", - "Where you're signed in": "Ahol be van jelentkezve", "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.", "Rename": "Átnevezés", - "Sign Out": "Kijelentkezés", - "This device": "Ez az eszköz", - "You aren't signed into any other devices.": "Egyetlen másik eszközön sincs bejelentkezve.", - "Sign out %(count)s selected devices|one": "Kijelentkezés %(count)s db eszközből", - "Sign out %(count)s selected devices|other": "Kijelentkezés %(count)s db eszközből", - "Devices without encryption support": "Eszközök titkosítás támogatása nélkül", - "Unverified devices": "Ellenőrizetlen eszközök", - "Verified devices": "Ellenőrzött eszközök", "Select all": "Mindet kijelöli", "Deselect all": "Semmit nem jelöl ki", "Sign out devices|one": "Eszközből való kijelentkezés", @@ -2698,12 +2683,12 @@ "We'll generate a Security Key for you to store somewhere safe, like a password manager or a safe.": "A biztonsági kulcsodat elkészül, ezt tárolja valamilyen biztonságos helyen, például egy jelszókezelőben vagy egy széfben.", "Regain access to your account and recover encryption keys stored in this session. Without them, you won't be able to read all of your secure messages in any session.": "Szerezze vissza a hozzáférést a fiókjához és állítsa vissza az elmentett titkosítási kulcsokat ebben a munkamenetben. Ezek nélkül egyetlen munkamenetben sem tudja elolvasni a titkosított üzeneteit.", "Without verifying, you won't have access to all your messages and may appear as untrusted to others.": "Az ellenőrzés nélkül nem fér hozzá az összes üzenetéhez és mások számára megbízhatatlannak fog látszani.", - "Copy link to thread": "Üzenetszálra mutató hivatkozás másolása", - "Thread options": "Üzenetszál opciók", - "Shows all threads you've participated in": "Minden üzenetszál megjelenítése amiben részt veszel", + "Copy link to thread": "Hivatkozás másolása az üzenetszálba", + "Thread options": "Üzenetszál-beállítások", + "Shows all threads you've participated in": "Minden üzenetszál megjelenítése, amelyben részt vesz", "You're all caught up": "Minden elolvasva", - "We call the places where you can host your account 'homeservers'.": "Matrix szervereknek nevezzük azokat a helyeket, ahol fiókot lehet létrehozni.", - "Matrix.org is the biggest public homeserver in the world, so it's a good place for many.": "A matrix.org a legnagyobb nyilvános Matrix szerver a világon, és sok felhasználónak megfelelő választás.", + "We call the places where you can host your account 'homeservers'.": "Matrix-kiszolgálónak nevezzük azokat a helyeket, ahol fiókot lehet létrehozni.", + "Matrix.org is the biggest public homeserver in the world, so it's a good place for many.": "A matrix.org a legnagyobb nyilvános Matrix-kiszolgáló a világon, és sok felhasználónak megfelelő választás.", "If you can't see who you're looking for, send them your invite link below.": "Ha nem található a keresett személy, küldje el az alábbi hivatkozást neki.", "You can't disable this later. Bridges & most bots won't work yet.": "Ezt később nem lehet kikapcsolni. A hidak és a legtöbb bot nem fog működni egyenlőre.", "Add option": "Lehetőség hozzáadása", @@ -2720,16 +2705,16 @@ "Someone already has that username, please try another.": "Ez a felhasználónév már foglalt, próbáljon ki másikat.", "Someone already has that username. Try another or if it is you, sign in below.": "Valaki már használja ezt a felhasználói nevet. Próbáljon ki másikat, illetve ha ön az, jelentkezzen be alább.", "Own your conversations.": "Az ön beszélgetései csak az öné.", - "Show tray icon and minimise window to it on close": "Tálcaikon mutatása és az ablak összecsukása bezáráskor", + "Show tray icon and minimise window to it on close": "Tálcaikon megjelenítése és az ablak minimalizálása bezáráskor", "Reply in thread": "Válasz üzenetszálban", "Spaces to show": "Megjelenítendő terek", "Sidebar": "Oldalsáv", "Other rooms": "További szobák", "sends rainfall": "esőt küld", - "Sends the given message with rainfall": "Az üzenet elküldése esővel", + "Sends the given message with rainfall": "Esővel küldi el az üzenetet", "Show all your rooms in Home, even if they're in a space.": "Minden szoba megjelenítése a Kezdőlapon, akkor is ha egy Tér része.", "Home is useful for getting an overview of everything.": "A Kezdőlap áttekintést adhat mindenről.", - "Show all threads": "Minden szál megjelenítése", + "Show all threads": "Minden üzenetszál megjelenítése", "Keep discussions organised with threads": "Beszélgetések üzenetszálakba rendezése", "Copy link": "Hivatkozás másolása", "Mentions only": "Csak megemlítések", @@ -2762,7 +2747,7 @@ "Quick settings": "Gyors beállítások", "Developer": "Fejlesztői", "Experimental": "Kísérleti", - "Themes": "Téma", + "Themes": "Témák", "Moderation": "Moderálás", "Messaging": "Üzenetküldés", "Clear": "Törlés", @@ -2786,9 +2771,8 @@ "No votes cast": "Nem adtak le szavazatot", "Share location": "Tartózkodási hely megosztása", "Manage pinned events": "Kitűzött események kezelése", - "Okay": "Rendben", "Use new room breadcrumbs": "Új szoba morzsák használata", - "Help improve %(analyticsOwner)s": "Segíts jobbá tenni: %(analyticsOwner)s", + "Help improve %(analyticsOwner)s": "Segítsen jobbá tenni: %(analyticsOwner)s", "That's fine": "Rendben van", "You cannot place calls without a connection to the server.": "Nem kezdeményezhet hívást a kiszolgálóval való kapcsolat nélkül.", "Connectivity to the server has been lost": "Megszakadt a kapcsolat a kiszolgálóval", @@ -2802,17 +2786,17 @@ "Failed to end poll": "Nem sikerült a szavazás lezárása", "The poll has ended. Top answer: %(topAnswer)s": "A szavazás le lett zárva. Nyertes válasz: %(topAnswer)s", "The poll has ended. No votes were cast.": "A szavazás le lett zárva. Nem lettek leadva szavazatok.", - "Exported %(count)s events in %(seconds)s seconds|one": "Exportálva %(count)s esemény %(seconds)s másodperc alatt", - "Exported %(count)s events in %(seconds)s seconds|other": "Exportálva %(count)s esemény %(seconds)s másodperc alatt", + "Exported %(count)s events in %(seconds)s seconds|one": "%(count)s esemény exportálva %(seconds)s másodperc alatt", + "Exported %(count)s events in %(seconds)s seconds|other": "%(count)s esemény exportálva %(seconds)s másodperc alatt", "Export successful!": "Sikeres exportálás!", - "Fetched %(count)s events in %(seconds)ss|one": "Lekérve %(count)s esemény %(seconds)s másodperc alatt", - "Fetched %(count)s events in %(seconds)ss|other": "Lekérve %(count)s esemény %(seconds)s másodperc alatt", - "Processing event %(number)s out of %(total)s": "Esemény feldolgozása: %(number)s (ennyiből: %(total)s)", + "Fetched %(count)s events in %(seconds)ss|one": "%(count)s esemény lekérve %(seconds)s másodperc alatt", + "Fetched %(count)s events in %(seconds)ss|other": "%(count)s esemény lekérve %(seconds)s másodperc alatt", + "Processing event %(number)s out of %(total)s": "Esemény feldolgozása: %(number)s. / %(total)s", "Fetched %(count)s events so far|one": "Eddig %(count)s esemény lett lekérve", "Fetched %(count)s events so far|other": "Eddig %(count)s esemény lett lekérve", - "Fetched %(count)s events out of %(total)s|one": "Lekérve %(count)s esemény ennyiből: %(total)s", - "Fetched %(count)s events out of %(total)s|other": "Lekérve %(count)s esemény ennyiből: %(total)s", - "Generating a ZIP": "ZIP generálása", + "Fetched %(count)s events out of %(total)s|one": "%(count)s / %(total)s esemény lekérve", + "Fetched %(count)s events out of %(total)s|other": "%(count)s / %(total)s esemény lekérve", + "Generating a ZIP": "ZIP előállítása", "We were unable to understand the given date (%(inputDate)s). Try using the format YYYY-MM-DD.": "A megadott dátum (%(inputDate)s) nem értelmezhető. Próbálja meg az ÉÉÉÉ-HH-NN formátum használatát.", "Failed to load list of rooms.": "A szobák listájának betöltése nem sikerült.", "Open in OpenStreetMap": "Megnyitás az OpenStreetMapen", @@ -2829,8 +2813,8 @@ "Including you, %(commaSeparatedMembers)s": "Önt is beleértve, %(commaSeparatedMembers)s", "Copy room link": "Szoba hivatkozásának másolása", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Anonimizált adatok megosztása a problémák feltárásához. Semmi személyes. Nincs harmadik fél.", - "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "Anonimizált adatok megosztása a problémák feltárásához. Semmi személyes. Nincs harmadik fél. Tudjon meg többet", - "You previously consented to share anonymous usage data with us. We're updating how that works.": "Előzőleg beleegyezett, hogy anonimizált formában adatokat oszt meg velünk. Most frissítjük azt ahogy ezt megtörténik.", + "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "Anonimizált adatok megosztása a problémák feltárásához. Semmi személyes. Nincs harmadik fél. További információk", + "You previously consented to share anonymous usage data with us. We're updating how that works.": "Előzőleg beleegyezett, hogy anonimizált használati adatokat oszt meg velünk. Most frissítjük ennek a működését.", "You may contact me if you want to follow up or to let me test out upcoming ideas": "Keressenek ha további információkra lenne szükségük vagy szeretnék, ha készülő ötleteket tesztelnék", "This groups your chats with members of this space. Turning this off will hide those chats from your view of %(spaceName)s.": "Közvetlen beszélgetések megjelenítése a tagokkal ebben a térben: %(spaceName)s. Kikapcsolt állapotban ezek a beszélgetések nem jelennek meg a térben.", "Your new device is now verified. Other users will see it as trusted.": "Az új eszköze ellenőrizve van. Mások megbízhatónak fogják látni.", @@ -2853,14 +2837,14 @@ "The device you are trying to verify doesn't support scanning a QR code or emoji verification, which is what %(brand)s supports. Try with a different client.": "Az ellenőrizni kívánt eszköz nem támogatja se a QR kód beolvasást se az emodzsi ellenőrzést, amit a %(brand)s támogat. Próbálja meg egy másik klienssel.", "To proceed, please accept the verification request on your other device.": "A folytatáshoz fogadja el az ellenőrzés kérést a másik eszközről.", "Send reactions": "Reakció küldése", - "Waiting for you to verify on your other device…": "A megerősítést várjuk a másik eszközről…", - "Waiting for you to verify on your other device, %(deviceName)s (%(deviceId)s)…": "Várakozás a másik eszközről való ellenőrzésre, %(deviceName)s (%(deviceId)s)…", - "Verify this device by confirming the following number appears on its screen.": "Ellenőrizd ezt az eszközt azzal, hogy megerősíted, hogy az alábbi szám jelent meg a kijelzőjén.", - "Confirm the emoji below are displayed on both devices, in the same order:": "Erősítse meg, hogy az alábbi emodzsik mindkét eszközön azonos sorrendben jelentek meg:", - "Dial": "Tárcsáz", + "Waiting for you to verify on your other device…": "Várakozás a másik eszköztől való ellenőrzésre…", + "Waiting for you to verify on your other device, %(deviceName)s (%(deviceId)s)…": "Várakozás a másik eszközről való ellenőrzésre: %(deviceName)s (%(deviceId)s)…", + "Verify this device by confirming the following number appears on its screen.": "Ellenőrizze ezt az eszközt azzal, hogy megerősíti, hogy a következő szám jelenik meg a képernyőjén.", + "Confirm the emoji below are displayed on both devices, in the same order:": "Erősítse meg, hogy az alábbi emodzsik mindkét eszközön azonos sorrendben jelentek-e meg:", + "Dial": "Tárcsázás", "Back to thread": "Vissza az üzenetszálhoz", - "Room members": "Szoba tagok", - "Back to chat": "Vissza a beszélgetésbe", + "Room members": "Szobatagok", + "Back to chat": "Vissza a csevegéshez", "No active call in this room": "Nincs aktív hívás a szobában", "Unable to find Matrix ID for phone number": "Nem található Matrix-azonosító a telefonszámhoz", "Unknown (user, session) pair: (%(userId)s, %(deviceId)s)": "Ismeretlen (felhasználó, munkamenet) páros: (%(userId)s, %(deviceId)s)", @@ -2875,9 +2859,9 @@ "was removed %(count)s times|other": "%(count)s alkalommal lett eltávolítva", "were removed %(count)s times|one": "eltávolítva", "were removed %(count)s times|other": "%(count)s alkalommal lett eltávolítva", - "Unknown error fetching location. Please try again later.": "A földrajzi helyzetének lekérdezésekor ismeretlen hiba történt. Próbálja újra később.", - "Timed out trying to fetch your location. Please try again later.": "A földrajzi helyzetének lekérdezésekor időtúllépés történt. Kérjük próbálja meg később.", - "Failed to fetch your location. Please try again later.": "A földrajzi helyzetének lekérdezésekor hiba történt. Kérjük próbálja meg később.", + "Unknown error fetching location. Please try again later.": "Ismeretlen hiba a földrajzi helyzetének lekérésekor. Próbálja újra később.", + "Timed out trying to fetch your location. Please try again later.": "Időtúllépés történt a földrajzi helyzetének lekérésekor. Próbálja újra később.", + "Failed to fetch your location. Please try again later.": "Nem sikerült a földrajzi helyzetének lekérése. Próbálja újra később.", "Could not fetch location": "Nem lehet elérni a földrajzi helyzetét", "Message pending moderation": "Üzenet moderálásra vár", "Message pending moderation: %(reason)s": "Az üzenet moderálásra vár, ok: %(reason)s", @@ -2890,9 +2874,9 @@ "From a thread": "Az üzenetszálból", "Remove users": "Felhasználók eltávolítása", "Keyboard": "Billentyűzet", - "Automatically send debug logs on decryption errors": "Hibakeresési napló automatikus küldése titkosítás visszafejtési hiba esetén", - "Show join/leave messages (invites/removes/bans unaffected)": "Be-, kilépések megjelenítése (meghívók/kirúgások/kitiltások üzeneteit nem érinti)", - "Let moderators hide messages pending moderation.": "Moderátorok kitakarhatják a még nem moderált üzeneteket.", + "Automatically send debug logs on decryption errors": "Hibakeresési naplók automatikus küldése titkosítás-visszafejtési hiba esetén", + "Show join/leave messages (invites/removes/bans unaffected)": "Be- és kilépési üzenetek megjelenítése (a meghívók/kirúgások/kitiltások üzeneteit nem érinti)", + "Let moderators hide messages pending moderation.": "A moderátorok kitakarhatják a még nem moderált üzeneteket.", "Remove, ban, or invite people to your active room, and make you leave": "Eltávolítani, kitiltani vagy meghívni embereket az aktív szobába és, hogy ön elhagyja a szobát", "Remove, ban, or invite people to this room, and make you leave": "Eltávolítani, kitiltani vagy meghívni embereket ebbe a szobába és, hogy ön elhagyja a szobát", "%(senderName)s removed %(targetName)s": "%(senderName)s eltávolította a következőt: %(targetName)s", @@ -2941,7 +2925,7 @@ "Last week": "Előző hét", "Group all your rooms that aren't part of a space in one place.": "Téren kívüli szobák csoportosítása egy helyre.", "Spaces are ways to group rooms and people. Alongside the spaces you're in, you can use some pre-built ones too.": "Tér használható szobák és emberek csoportosítására. Azokon kívül amikben benne van használhat előre definiáltakat is.", - "Jump to date (adds /jumptodate and jump to date headers)": "Időpontra ugrás („/jumptodate”-et és ugrás időpontra fejlécet ad hozzá)", + "Jump to date (adds /jumptodate and jump to date headers)": "Dátumra ugrás (hozzáadja a /jumptodate parancsot és a dátumra ugrási fejléceket)", "If you know what you're doing, Element is open-source, be sure to check out our GitHub (https://github.com/vector-im/element-web/) and contribute!": "Ha tudja mit csinál, Element egy nyílt forráskódú szoftver, nézze meg a GitHubon (https://github.com/vector-im/element-web/) és segítsen!", "If someone told you to copy/paste something here, there is a high likelihood you're being scammed!": "Ha valaki azt kéri hogy másoljon/illesszen be itt valamit, nagy esély van rá hogy valaki becsapja!", "Wait!": "Várjon!", @@ -2965,7 +2949,7 @@ "%(severalUsers)sremoved a message %(count)s times|one": "%(severalUsers)s üzenetet törölt", "%(severalUsers)sremoved a message %(count)s times|other": "%(severalUsers)s %(count)s üzenetet törölt", "Maximise": "Teljes méret", - "Automatically send debug logs when key backup is not functioning": "Hibakereső naplóbejegyzés automatikus küldése, ha a kulcs mentés nem működik", + "Automatically send debug logs when key backup is not functioning": "Hibakeresési naplók automatikus küldése, ha a kulcsmentés nem működik", "Thank you for trying the beta, please go into as much detail as you can so we can improve it.": "Köszönjük, hogy kipróbálja a béta programunkat, hogy fejleszthessünk, adjon olyan részletes visszajelzést, amennyire csak lehet.", "<%(count)s spaces>|zero": "<üres karakterek>", "<%(count)s spaces>|other": "<%(count)s szóköz>", @@ -2998,8 +2982,8 @@ "My current location": "Jelenlegi saját földrajzi helyzet", "%(brand)s could not send your location. Please try again later.": "Az %(brand)s nem tudja elküldeni a földrajzi helyzetét. Próbálja újra később.", "We couldn't send your location": "A földrajzi helyzetet nem sikerült elküldeni", - "Insert a trailing colon after user mentions at the start of a message": "Elválasztó vessző elhelyezése egy felhasználó üzenet elején való megemlítésekor", - "Reply to an ongoing thread or use “%(replyInThread)s” when hovering over a message to start a new one.": "Válaszoljon egy meglévő szálban, vagy új szál indításához használja a „%(replyInThread)s” lehetőséget az üzenet sarkában megjelenő menüben.", + "Insert a trailing colon after user mentions at the start of a message": "Záró kettőspont beszúrása egy felhasználó üzenet elején való megemlítésekor", + "Reply to an ongoing thread or use “%(replyInThread)s” when hovering over a message to start a new one.": "Válaszoljon egy meglévő üzenetszálban, vagy új üzenetszál indításához használja a „%(replyInThread)s” lehetőséget az üzenet sarkában megjelenő menüben.", "%(oneUser)schanged the pinned messages for the room %(count)s times|one": "%(oneUser)s módosította a szoba kitűzött üzeneteit", "%(oneUser)schanged the pinned messages for the room %(count)s times|other": "%(oneUser)s %(count)s alkalommal módosította a szoba kitűzött üzeneteit", "%(severalUsers)schanged the pinned messages for the room %(count)s times|one": "%(severalUsers)s módosította a szoba kitűzött üzeneteit", @@ -3016,7 +3000,7 @@ "Click": "Kattintson", "Expand quotes": "Idézetek megjelenítése", "Collapse quotes": "Idézetek összecsukása", - "Spaces are a new way to group rooms and people. What kind of Space do you want to create? You can change this later.": "A Terek egy új lehetőség a szobák és emberek csoportosítására. Milyen teret szeretne létrehozni? Később megváltoztathatja.", + "Spaces are a new way to group rooms and people. What kind of Space do you want to create? You can change this later.": "A terek a szobák és emberek csoportosításának új módja. Milyen teret szeretne létrehozni? Később megváltoztathatja.", "Can't create a thread from an event with an existing relation": "Nem lehet üzenetszálat indítani olyan eseményről ami már rendelkezik kapcsolattal", "Busy": "Foglalt", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. ": "Ha a GitHubon keresztül küldött be hibajegyet, a hibakereső napló segít nekünk felderíteni a problémát. ", @@ -3070,18 +3054,18 @@ "You are about to remove %(count)s messages by %(user)s. This will remove them permanently for everyone in the conversation. Do you wish to continue?|other": "%(count)s üzenetet készül törölni az alábbi felhasználótól: %(user)s. A művelet mindenki számára visszavonhatatlanul eltávolítja ezeket a beszélgetésekből. Biztos, hogy folytatja?", "Help us identify issues and improve %(analyticsOwner)s by sharing anonymous usage data. To understand how people use multiple devices, we'll generate a random identifier, shared by your devices.": "Segítsen észrevennünk a hibákat, és jobbá tenni a(z) %(analyticsOwner)s a névtelen használati adatok küldése által. Ahhoz, hogy megértsük, hogyan használnak a felhasználók egyszerre több eszközt, egy véletlenszerű azonosítót generálunk, ami az eszközei között meg lesz osztva.", "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use %(brand)s with an existing Matrix account on a different homeserver.": "Használhatja a más szerver opciót, hogy egy másik matrix szerverre jelentkezz be amihez megadod a szerver url címét. Ezzel használhatja a(z) %(brand)s klienst egy már létező Matrix fiókkal egy másik matrix szerveren.", - "%(brand)s was denied permission to fetch your location. Please allow location access in your browser settings.": "%(brand)s alkalmazásnak nincs jogosultsága a földrajzi helyzetének a lekérdezéséhez. Kérjük engedélyezze a hely hozzáférést a böngésző beállításokban.", + "%(brand)s was denied permission to fetch your location. Please allow location access in your browser settings.": "A(z) %(brand)s alkalmazásnak nincs jogosultsága a földrajzi helyzetének lekérdezéséhez. Engedélyezze a hely hozzáférését a böngészőbeállításokban.", "Share for %(duration)s": "Megosztás eddig: %(duration)s", "Debug logs contain application usage data including your username, the IDs or aliases of the rooms you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "A hibakereső napló alkalmazás használati adatokat tartalmaz beleértve a felhasználói nevedet, az általad meglátogatott szobák azonosítóit alternatív neveit, az utolsó felhasználói felület elemét amit használt és más felhasználói neveket. Csevegés üzenetek szövegét nem tartalmazza.", "Developer tools": "Fejlesztői eszközök", "Video": "Videó", - "%(brand)s is experimental on a mobile web browser. For a better experience and the latest features, use our free native app.": "%(brand)s kísérleti állapotban van mobiltelefon web böngészőjében. A jobb élmény és a legújabb funkciók használatához használja az alkalmazást.", + "%(brand)s is experimental on a mobile web browser. For a better experience and the latest features, use our free native app.": "A(z) %(brand)s kísérleti állapotban van a mobilos webböngészőkben. A jobb élmény és a legújabb funkciók használatához használja az ingyenes natív alkalmazásunkat.", "%(value)ss": "%(value)s mp", "%(value)sm": "%(value)s p", "%(value)sh": "%(value)s ó", "%(value)sd": "%(value)s n", "Sorry, your homeserver is too old to participate here.": "Sajnáljuk, a Matrix-kiszolgáló túl régi verziójú ahhoz, hogy ebben részt vegyen.", - "There was an error joining.": "Hiba volt a csatlakozásnál.", + "There was an error joining.": "A csatlakozás során hiba történt.", "The user's homeserver does not support the version of the space.": "A felhasználó Matrix-kiszolgálója nem támogatja a megadott tér verziót.", "User may or may not exist": "A felhasználó lehet, hogy nem létezik", "User does not exist": "A felhasználó nem létezik", @@ -3141,16 +3125,16 @@ "Confirm signing out these devices|other": "Megerősítés ezekből az eszközökből való kijelentkezéshez", "Turn on camera": "Kamera bekapcsolása", "Turn off camera": "Kamera kikapcsolása", - "Video devices": "Videó eszközök", - "Unmute microphone": "Mikrofon némításának megszüntetése", + "Video devices": "Videóeszközök", + "Unmute microphone": "Mikrofon némításának feloldása", "Mute microphone": "Mikrofon némítása", - "Audio devices": "Hang eszközök", - "sends hearts": "szívecskék küldése", - "Sends the given message with hearts": "Az üzenet elküldése szívecskékkel", + "Audio devices": "Hangeszközök", + "sends hearts": "szívecskéket küld", + "Sends the given message with hearts": "Szívecskékkel küldi el az üzenetet", "Enable Markdown": "Markdown engedélyezése", "Failed to join": "Csatlakozás sikertelen", "The person who invited you has already left, or their server is offline.": "Aki meghívta a szobába már távozott, vagy a kiszolgálója nem érhető el.", - "The person who invited you has already left.": "A személy aki meghívott már távozott.", + "The person who invited you has already left.": "A személy, aki meghívta, már távozott.", "Hide my messages from new joiners": "Üzeneteim elrejtése az újonnan csatlakozók elől", "You will leave all rooms and DMs that you are in": "Minden szobából és közvetlen beszélgetésből kilép", "No one will be able to reuse your username (MXID), including you: this username will remain unavailable": "Senki nem használhatja többet a felhasználónevet (matrix azonosítot), Önt is beleértve: ez a felhasználói név használhatatlan marad", @@ -3169,14 +3153,14 @@ "Your old messages will still be visible to people who received them, just like emails you sent in the past. Would you like to hide your sent messages from people who join rooms in the future?": "Azok a régi üzenetek amiket az emberek már megkaptak továbbra is láthatóak maradnak, mint az e-mailek amiket régebben küldött. Szeretné elrejteni az üzeneteit azon emberek elől aki ez után lépnek be a szobába?", "You will be removed from the identity server: your friends will no longer be able to find you with your email or phone number": "Az azonosítási kiszolgálóról törlésre kerül: a barátai többé nem találják meg az e-mail-címe vagy a telefonszáma alapján", "You can also ask your homeserver admin to upgrade the server to change this behaviour.": "A viselkedés megváltoztatásához megkérheti a Matrix-kiszolgáló rendszergazdáját, hogy frissítse a kiszolgálót.", - "If you want to retain access to your chat history in encrypted rooms you should first export your room keys and re-import them afterwards.": "Ha meg szeretné tartani hozzáférést a titkosított csevegésekhez, akkor először exportálja ki a kulcsokat majd újra töltse be azokat.", - "Changing your password on this homeserver will cause all of your other devices to be signed out. This will delete the message encryption keys stored on them, and may make encrypted chat history unreadable.": "A Matrix-kiszolgálón a jelszavának a megváltoztatása azt eredményezi, hogy az összes eszközön kijelentkezik. Ezzel az eszközök törlik magukról az üzeneteket titkosító kulcsokat, ami olvashatatlanná teheti a régi titkosított csevegéseket.", + "If you want to retain access to your chat history in encrypted rooms you should first export your room keys and re-import them afterwards.": "Ha meg szeretné tartani a hozzáférést a titkosított csevegésekhez, akkor először exportálja ki a kulcsokat, majd importálja újra azokat.", + "Changing your password on this homeserver will cause all of your other devices to be signed out. This will delete the message encryption keys stored on them, and may make encrypted chat history unreadable.": "A Matrix-kiszolgálón a jelszavának megváltoztatása azt eredményezi, hogy az összes eszközön kijelentkezik. Ezzel az eszközök törlik magukról az üzeneteket titkosító kulcsokat, ami olvashatatlanná teheti a régi titkosított csevegéseket.", "To view %(roomName)s, you need an invite": "A %(roomName)s megjelenítéséhez meghívó szükséges", "Private room": "Privát szoba", "Video room": "Videó szoba", "%(members)s and %(last)s": "%(members)s és %(last)s", "%(members)s and more": "%(members)s és mások", - "Your message wasn't sent because this homeserver has been blocked by its administrator. Please contact your service administrator to continue using the service.": "Az üzenete nem került elküldésre mert az adminisztrátor megtiltotta ezen a Matrix szerveren. A szolgáltatás további igénybevétele végett kérjük vegye fel a kapcsolatot a szolgáltatás adminisztrátorával.", + "Your message wasn't sent because this homeserver has been blocked by its administrator. Please contact your service administrator to continue using the service.": "Az üzenete nem lett elküldve, mert a Matrix-kiszolgáló rendszergazdája letiltotta. A szolgáltatás használatának folytatásához vegye fel a kapcsolatot a szolgáltatás rendszergazdájával.", "Resent!": "Újraküldve!", "Did not receive it? Resend it": "Nem kapta meg? Újraküldés", "To create your account, open the link in the email we just sent to %(emailAddress)s.": "A fiók elkészítéséhez nyissa meg az e-mailben elküldött hivatkozást amit erre a címre küldtünk: %(emailAddress)s.", @@ -3202,16 +3186,16 @@ "%(count)s people joined|other": "%(count)s személy belépett", "View related event": "Kapcsolódó események megjelenítése", "Check if you want to hide all current and future messages from this user.": "Válaszd ki ha ennek a felhasználónak a jelenlegi és jövőbeli üzeneteit el szeretnéd rejteni.", - "Ignore user": "Mellőzött felhasználó", + "Ignore user": "Felhasználó mellőzése", "Read receipts": "Olvasási visszajelzés", "Enable hardware acceleration (restart %(appName)s to take effect)": "Hardveres gyorsítás bekapcsolása (a(z) %(appName)s alkalmazást újra kell indítani)", - "You were disconnected from the call. (Error: %(message)s)": "A hívás kapcsolat megszakadt (Hiba: %(message)s)", + "You were disconnected from the call. (Error: %(message)s)": "A híváskapcsolat megszakadt (Hiba: %(message)s)", "Failed to set direct message tag": "Nem sikerült a közvetlen beszélgetés címkét beállítani", "Connection lost": "A kapcsolat megszakadt", "Minimise": "Lecsukás", "Un-maximise": "Kicsinyítés", "Deactivating your account is a permanent action — be careful!": "A fiók felfüggesztése végleges — legyen óvatos!", - "When you sign out, these keys will be deleted from this device, which means you won't be able to read encrypted messages unless you have the keys for them on your other devices, or backed them up to the server.": "A kijelentkezéssel a kulcsok az eszközről törlődnek, ami azt jelenti, hogy ha nincsenek meg máshol a kulcsok vagy nincsenek elmentve a szerverre akkor a titkosított üzenetek olvashatatlanná válnak.", + "When you sign out, these keys will be deleted from this device, which means you won't be able to read encrypted messages unless you have the keys for them on your other devices, or backed them up to the server.": "A kijelentkezéssel a kulcsok az eszközről törlődnek, ami azt jelenti, hogy ha nincsenek meg máshol a kulcsok, vagy nincsenek mentve a kiszolgálón, akkor a titkosított üzenetek olvashatatlanná válnak.", "Joining the beta will reload %(brand)s.": "A béta funkció bekapcsolása újratölti ezt: %(brand)s.", "Leaving the beta will reload %(brand)s.": "A béta kikapcsolása újratölti ezt: %(brand)s.", "Remove search filter for %(filter)s": "Keresési szűrő eltávolítása innen: %(filter)s", @@ -3237,12 +3221,12 @@ "Show HTML representation of room topics": "A szoba témájának HTML megjelenítése", "Explore public spaces in the new search dialog": "Nyilvános terek felderítése az új keresőben", "Yes, the chat timeline is displayed alongside the video.": "Igen, a szöveges idővonal a videóval együtt megjelenik.", - "Can I use text chat alongside the video call?": "Lehet a videó hívással egy időben szövegesen beszélgetni?", + "Can I use text chat alongside the video call?": "Lehet a videóhívás közben szövegesen is csevegni?", "Use the “+” button in the room section of the left panel.": "A „+” gomb használatával a szoba bal oldali panelén.", - "How can I create a video room?": "Hogy lehet videó szobát készíteni?", - "Video rooms are always-on VoIP channels embedded within a room in %(brand)s.": "Videó szobák állandó VoIP csatornák a szobákba ágyazva itt: %(brand)s.", - "A new way to chat over voice and video in %(brand)s.": "Új lehetőség hanggal és videóval csevegni itt: %(brand)s.", - "Video rooms": "Videó szobák", + "How can I create a video room?": "Hogy lehet videószobát készíteni?", + "Video rooms are always-on VoIP channels embedded within a room in %(brand)s.": "A videószobák szobákba ágyazott, folyamatosan bekapcsolat VoIP-csatornák a(z) %(brand)s alkalmazásban.", + "A new way to chat over voice and video in %(brand)s.": "Új csevegési lehetőség a(z) %(brand)s alkalmazásban, hanggal és videóval.", + "Video rooms": "Videószobák", "Stop and close": "Befejezés és kilépés", "You can't disable this later. The room will be encrypted but the embedded call will not.": "Ezt később nem lehet kikapcsolni. A szoba titkosítva lesz de a hívások nem.", "Online community members": "Online közösségek tagjai", @@ -3256,8 +3240,8 @@ "Join the room to participate": "Csatlakozz a szobához, hogy részt vehess", "Reset bearing to north": "Északi irányba állítás", "Mapbox logo": "Mapbox logó", - "Location not available": "Földrajzi helyzet nem meghatározható", - "Find my location": "Jelenlegi helyzetem megkeresése", + "Location not available": "A földrajzi helyzet nem érhető el", + "Find my location": "Saját hely megkeresése", "Exit fullscreen": "Kilépés a teljes képernyőből", "Enter fullscreen": "Teljes képernyőre váltás", "Map feedback": "Visszajelzés a térképről", @@ -3272,30 +3256,30 @@ "You did it!": "Kész!", "Only %(count)s steps to go|one": "Még %(count)s lépés", "Only %(count)s steps to go|other": "Még %(count)s lépés", - "Welcome to %(brand)s": "Üdvözlöm itt: %(brand)s", + "Welcome to %(brand)s": "Üdvözli a(z) %(brand)s", "Find your people": "Találja meg az embereket", - "Keep ownership and control of community discussion.\nScale to support millions, with powerful moderation and interoperability.": "Tartsa meg a beszélgetés feletti irányítást.\nMilliók támogatása erős moderációs képességekkel és együttműködési lehetőségekkel.", - "Community ownership": "Közösség tulajdonjoga", + "Keep ownership and control of community discussion.\nScale to support millions, with powerful moderation and interoperability.": "Tartsa meg a közösségi beszélgetések feletti irányítást.\nAkár milliók támogatásával, hatékony moderációs és együttműködési lehetőségekkel.", + "Community ownership": "Közösségi tulajdon", "Find your co-workers": "Találja meg a munkatársait", "Secure messaging for work": "Biztonságos üzenetküldés munkához", - "Start your first chat": "Az első beszélgetés elkezdése", - "With free end-to-end encrypted messaging, and unlimited voice and video calls, %(brand)s is a great way to stay in touch.": "Ingyenes végpontok közötti titkosított üzenetküldés és korlátlan hang és videó hívás, %(brand)s használata jó lehetőség a kapcsolattartáshoz.", + "Start your first chat": "Kezdje el az első csevegését", + "With free end-to-end encrypted messaging, and unlimited voice and video calls, %(brand)s is a great way to stay in touch.": "Az ingyenes, végpontok közti titkosítással rendelkező üzenetküldéssel, a korlátlan hang- és videóhívással, a(z) %(brand)s használata nagyszerű módja a kapcsolattartásnak.", "Secure messaging for friends and family": "Biztonságos üzenetküldés barátokkal, családdal", - "Enable notifications": "Értesítések engedélyezése", - "Don’t miss a reply or important message": "Ne maradjon le válaszról vagy fontos üzenetről", + "Enable notifications": "Értesítések bekapcsolása", + "Don’t miss a reply or important message": "Ne maradjon le a válaszról vagy egy fontos üzenetről", "Turn on notifications": "Értesítések bekapcsolása", - "Your profile": "Profil", - "Make sure people know it’s really you": "Biztosítsa a többieket arról, hogy Ön valójában Ön", - "Set up your profile": "Profil beállítása", + "Your profile": "Saját profil", + "Make sure people know it’s really you": "Biztosítsa a többieket arról, hogy valóban Ön az", + "Set up your profile": "Saját profil beállítása", "Download apps": "Alkalmazások letöltése", - "Find and invite your community members": "Közösség tagjának megkeresése és meghívása", - "Find people": "Emberek megkeresése", - "Get stuff done by finding your teammates": "Fejezzen be dolgokat csoporttárs megtalálásával", - "Find and invite your co-workers": "Munkatárs keresése és meghívása", + "Find and invite your community members": "Közösség tagjainak keresése és meghívása", + "Find people": "Emberek keresése", + "Get stuff done by finding your teammates": "Fejezzen be dolgokat a csapattagjai megtalálásával", + "Find and invite your co-workers": "Munkatársak keresése és meghívása", "Find friends": "Barátok keresése", - "It’s what you’re here for, so lets get to it": "Kezdjük amiért itt van", + "It’s what you’re here for, so lets get to it": "Kezdjünk neki, ezért van itt", "Find and invite your friends": "Keresse meg és hívja meg barátait", - "You made it!": "Elkészült!", + "You made it!": "Megcsinálta!", "Send read receipts": "Olvasási visszajelzés küldése", "We're creating a room with %(names)s": "Szobát készítünk: %(names)s", "Google Play and the Google Play logo are trademarks of Google LLC.": "A Google Play és a Google Play logó a Google LLC védjegye.", @@ -3306,18 +3290,18 @@ "Download on the App Store": "Letöltés az App Store-ból", "iOS": "iOS", "Download %(brand)s Desktop": "Asztali %(brand)s letöltése", - "Download %(brand)s": "%(brand)s eltöltése", + "Download %(brand)s": "A(z) %(brand)s letöltése", "Choose a locale": "Válasszon nyelvet", "Help": "Segítség", "Saved Items": "Mentett elemek", "Last activity": "Utolsó tevékenység", "Current session": "Jelenlegi munkamenet", "Sessions": "Munkamenetek", - "Your server doesn't support disabling sending read receipts.": "A kiszolgálója nem támogatja az olvasási visszajelzések elküldésének tiltását.", + "Your server doesn't support disabling sending read receipts.": "A kiszolgálója nem támogatja az olvasási visszajelzések elküldésének kikapcsolását.", "Share your activity and status with others.": "Ossza meg a tevékenységét és állapotát másokkal.", "Presence": "Állapot", "Spell check": "Helyesírás ellenőrzés", - "Complete these to get the most out of %(brand)s": "Ezen lépések befejezésével hozhatod ki a legtöbbet %(brand)s alkalmazásból", + "Complete these to get the most out of %(brand)s": "Ezen lépések befejezésével hozhatja ki a legtöbbet a(z) %(brand)s használatából", "Unverified": "Ellenőrizetlen", "Verified": "Ellenőrizve", "Inactive for %(inactiveAgeDays)s+ days": "Utolsó használat %(inactiveAgeDays)s+ napja", @@ -3330,8 +3314,8 @@ "Unverified session": "Ellenőrizetlen munkamenet", "This session is ready for secure messaging.": "Ez a munkamenet beállítva a biztonságos üzenetküldéshez.", "Verified session": "Munkamenet hitelesítve", - "Welcome": "Üdv", - "Show shortcut to welcome checklist above the room list": "Kezdő lépések elvégzéséhez való hivatkozás megjelenítése a szobalista fölött", + "Welcome": "Üdvözöljük", + "Show shortcut to welcome checklist above the room list": "Kezdő lépések elvégzésének hivatkozásának megjelenítése a szobalista fölött", "Inactive sessions": "Nem aktív munkamenetek", "View all": "Összes megtekintése", "Verify your sessions for enhanced secure messaging or sign out from those you don't recognize or use anymore.": "Erősítse meg a munkameneteit a még biztonságosabb csevegéshez vagy jelentkezzen ki ezekből, ha nem ismeri fel vagy már nem használja őket.", @@ -3353,7 +3337,7 @@ "For best security, sign out from any session that you don't recognize or use anymore.": "A legbiztonságosabb, ha minden olyan munkamenetből kijelentkezel, melyet már nem ismersz fel vagy nem használsz.", "Verified sessions": "Ellenőrzött munkamenetek", "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.": "Nyilvános szobához nem javasolt a titkosítás beállítása.Bárki megtalálhatja és csatlakozhat nyilvános szobákhoz, így bárki elolvashatja az üzeneteket bennük. A titkosítás előnyeit így nem jelentkeznek és később ezt nem lehet kikapcsolni. Nyilvános szobákban a titkosított üzenetek az üzenetküldést és fogadást csak lassítják.", - "Don’t miss a thing by taking %(brand)s with you": "Ne maradj le semmiről, ha magaddal viszed a %(brand)s terméket", + "Don’t miss a thing by taking %(brand)s with you": "Ne maradjon le semmiről, legyen Önnél a(z) %(brand)s", "Empty room (was %(oldName)s)": "Üres szoba (%(oldName)s volt)", "Inviting %(user)s and %(count)s others|one": "%(user)s és 1 további meghívása", "Inviting %(user)s and %(count)s others|other": "%(user)s és %(count)s további meghívása", @@ -3372,10 +3356,10 @@ "Your server has native support": "A kiszolgálója natívan támogatja", "%(qrCode)s or %(appLinks)s": "%(qrCode)s vagy %(appLinks)s", "%(qrCode)s or %(emojiCompare)s": "%(qrCode)s vagy %(emojiCompare)s", - "Voice broadcast": "Hang közvetítés", + "Voice broadcast": "Hangközvetítés", "Sign out of this session": "Kijelentkezés ebből a munkamenetből", "Rename session": "Munkamenet átnevezése", - "Element Call video rooms": "Element Call videó szoba", + "Element Call video rooms": "Element videóhívásos szobák", "You need to be able to kick users to do that.": "Hogy ezt tegye, ahhoz ki kell tudnia rúgni felhasználókat.", "Voice broadcasts": "Videó közvetítés", "Video call ended": "Videó hívás befejeződött", @@ -3392,21 +3376,17 @@ "Enable notifications for this device": "Értesítések engedélyezése ehhez az eszközhöz", "Turn off to disable notifications on all your devices and sessions": "Kikapcsolva az eszközökön és munkamenetekben az értesítések tiltva lesznek", "Enable notifications for this account": "Értesítések engedélyezése ehhez a fiókhoz", - "New group call experience": "Új konferenciahívás élmény", - "Live": "Élő", + "New group call experience": "Új konferenciahívási élmény", + "Live": "Élő közvetítés", "Join %(brand)s calls": "Csatlakozás ebbe a hívásba: %(brand)s", "Start %(brand)s calls": "%(brand)s hívás indítása", "Fill screen": "Képernyő kitöltése", "Sorry — this call is currently full": "Bocsánat — ez a hívás betelt", - "Record the client name, version, and url to recognise sessions more easily in session manager": "Kliens neve, verziója és url felvétele a munkamenet könnyebb azonosításához a munkamenet kezelőben", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Az új munkamenet-kezelő jobb rálátást biztosít a munkamenetekre, és nagyobb irányítást biztosít, többet között lehetővé teszi a leküldéses értesítések távoli be- és kikapcsolását.", - "Have greater visibility and control over all your sessions.": "Jobb áttekintés és felügyelet a munkamenetek felett.", - "New session manager": "Új munkamenet kezelő", - "Use new session manager": "Új munkamenet kezelő használata", - "Video call started": "Videó hívás elindult", + "Record the client name, version, and url to recognise sessions more easily in session manager": "A kliens nevének, verziójának és webcímének felvétele a munkamenetek könnyebb felismerése érdekében a munkamenet-kezelőben", + "Video call started": "A videóhívás elindult", "Unknown room": "Ismeretlen szoba", - "resume voice broadcast": "hang közvetítés folytatása", - "pause voice broadcast": "hang közvetítés szüneteltetése", + "resume voice broadcast": "hangközvetítés folytatása", + "pause voice broadcast": "hangközvetítés szüneteltetése", "Video call started in %(roomName)s. (not supported by this browser)": "Videóhívás indult itt: %(roomName)s. (ebben a böngészőben ez nem támogatott)", "Video call started in %(roomName)s.": "Videóhívás indult itt: %(roomName)s.", "Room info": "Szoba információ", @@ -3430,12 +3410,12 @@ "You do not have sufficient permissions to change this.": "Nincs megfelelő jogosultság a megváltoztatáshoz.", "%(brand)s is end-to-end encrypted, but is currently limited to smaller numbers of users.": "%(brand)s végpontok között titkosított de jelenleg csak kevés számú résztvevővel működik.", "Enable %(brand)s as an additional calling option in this room": "%(brand)s engedélyezése mint további opció hívásokhoz a szobában", - "Notifications silenced": "Értesítések elnémítva", + "Notifications silenced": "Értesítések némítva", "Stop live broadcasting?": "Megszakítja az élő közvetítést?", - "Someone else is already recording a voice broadcast. Wait for their voice broadcast to end to start a new one.": "Valaki már elindított egy hang közvetítést. Várja meg a közvetítés végét az új indításához.", - "You don't have the required permissions to start a voice broadcast in this room. Contact a room administrator to upgrade your permissions.": "Nincs jogosultsága hang közvetítést indítani ebben a szobában. Vegye fel a kapcsolatot a szoba adminisztrátorával a szükséges jogosultság megszerzéséhez.", - "You are already recording a voice broadcast. Please end your current voice broadcast to start a new one.": "Egy hang közvetítés már folyamatban van. Először fejezze be a jelenlegi közvetítést egy új indításához.", - "Can't start a new voice broadcast": "Az új hang közvetítés nem indítható el", + "Someone else is already recording a voice broadcast. Wait for their voice broadcast to end to start a new one.": "Valaki már elindított egy hangközvetítést. Várja meg a közvetítés végét az új indításához.", + "You don't have the required permissions to start a voice broadcast in this room. Contact a room administrator to upgrade your permissions.": "Nincs jogosultsága hangközvetítést indítani ebben a szobában. Vegye fel a kapcsolatot a szoba adminisztrátorával a szükséges jogosultság megszerzéséhez.", + "You are already recording a voice broadcast. Please end your current voice broadcast to start a new one.": "Egy hangközvetítés már folyamatban van. Először fejezze be a jelenlegi közvetítést egy új indításához.", + "Can't start a new voice broadcast": "Az új hangközvetítés nem indítható el", "Completing set up of your new device": "Új eszköz beállításának elvégzése", "Waiting for device to sign in": "Várakozás a másik eszköz bejelentkezésére", "Start at the sign in screen": "Kezdje a bejelentkező képernyőn", @@ -3443,7 +3423,7 @@ "By approving access for this device, it will have full access to your account.": "Ennek az eszköznek a hozzáférés engedélyezése után az eszköznek teljes hozzáférése lesz a fiókjához.", "Check that the code below matches with your other device:": "Ellenőrizze, hogy az alábbi kód megegyezik a másik eszközödön lévővel:", "Devices connected": "Összekötött eszközök", - "The homeserver doesn't support signing in another device.": "A matrix szerver nem támogatja más eszköz bejelentkeztetését.", + "The homeserver doesn't support signing in another device.": "A Matrix-kiszolgáló nem támogatja más eszköz bejelentkeztetését.", "An unexpected error occurred.": "Nemvárt hiba történt.", "The request was cancelled.": "A kérés megszakítva.", "The other device isn't signed in.": "A másik eszköz még nincs bejelentkezve.", @@ -3459,7 +3439,7 @@ "Yes, stop broadcast": "Igen, közvetítés megállítása", "Review and approve the sign in": "Belépés áttekintése és engedélyezés", "You can use this device to sign in a new device with a QR code. You will need to scan the QR code shown on this device with your device that's signed out.": "Ennek az eszköznek a felhasználásával és a QR kóddal beléptethet egy másik eszközt. Be kell olvasni a QR kódot azon az eszközön ami még nincs belépve.", - "play voice broadcast": "hang közvetítés lejátszása", + "play voice broadcast": "hangközvetítés lejátszása", "Are you sure you want to sign out of %(count)s sessions?|one": "Biztos, hogy ki szeretne lépni %(count)s munkamenetből?", "Are you sure you want to sign out of %(count)s sessions?|other": "Biztos, hogy ki szeretne lépni %(count)s munkamenetből?", "Show formatting": "Formázás megjelenítése", @@ -3481,13 +3461,12 @@ "Automatically adjust the microphone volume": "Mikrofon hangerő automatikus beállítása", "Voice settings": "Hang beállítások", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "Csak abban az esetben, ha a Matrix-kiszolgáló nem kínál fel egyet sem. Az IP-címe megosztásra kerülhet a hívás során.", - "Allow fallback call assist server (turn.matrix.org)": "Tartalék hívássegítő kiszolgáló engedélyezése (turn.matrix.org)", "Noise suppression": "Zajcsillapítás", - "Echo cancellation": "Visszhang csillapítás", - "Automatic gain control": "Automatikus hangerő szabályozás", - "When enabled, the other party might be able to see your IP address": "Ha engedélyezve van a másik fél láthatja az Ön IP címét", - "Allow Peer-to-Peer for 1:1 calls": "Ponttól-pontig kapcsolat engedélyezése az 1:1 hívásokban", - "Go live": "Élő indítása", + "Echo cancellation": "Visszhangcsillapítás", + "Automatic gain control": "Automatikus hangerőszabályozás", + "When enabled, the other party might be able to see your IP address": "Ha engedélyezett, akkor a másik fél láthatja az Ön IP-címét", + "Allow Peer-to-Peer for 1:1 calls": "Közvetlen kapcsolat engedélyezése a kétszereplős hívásoknál", + "Go live": "Élő közvetítés indítása", "%(minutes)sm %(seconds)ss left": "%(minutes)s p %(seconds)s mp van hátra", "%(hours)sh %(minutes)sm %(seconds)ss left": "%(hours)s ó %(minutes)s p %(seconds)s mp van hátra", "This means that you have all the keys needed to unlock your encrypted messages and confirm to other users that you trust this session.": "Ez azt jelenti, hogy a titkosított üzenetek visszafejtéséhez minden kulccsal rendelkezik valamint a többi felhasználó megbízhat ebben a munkamenetben.", @@ -3508,8 +3487,8 @@ "Too many attempts in a short time. Wait some time before trying again.": "Rövid idő alatt túl sok próbálkozás. Várjon egy kicsit mielőtt újra próbálkozik.", "Show details": "Részletek megmutatása", "Hide details": "Részletek elrejtése", - "30s forward": "előre 30 másodpercet", - "30s backward": "vissza 30 másodpercet", + "30s forward": "előre 30 másodperccel", + "30s backward": "vissza 30 másodperccel", "For best security and privacy, it is recommended to use Matrix clients that support encryption.": "A biztonság és adatbiztonság érdekében javasolt olyan Matrix klienst használni ami támogatja a titkosítást.", "You won't be able to participate in rooms where encryption is enabled when using this session.": "Ezzel a munkamenettel olyan szobákban ahol a titkosítás be van kapcsolva nem tud részt venni.", "Feeling experimental? Try out our latest ideas in development. These features are not finalised; they may be unstable, may change, or may be dropped altogether. Learn more.": "Kísérletező kedvében van? Próbálja ki a legújabb fejlesztési ötleteinket. Ezek nem befejezettek; lehetnek instabilak, változhatnak vagy el is tűnhetnek. Tudjon meg többet.", @@ -3528,11 +3507,11 @@ "Upcoming features": "Készülő funkciók", "Apply": "Alkalmaz", "Search users in this room…": "Felhasználók keresése a szobában…", - "Give one or multiple users in this room more privileges": "Egy vagy több felhasználónak több jog megadása a szobában", - "Add privileged users": "Privilegizált felhasználó hozzáadása", + "Give one or multiple users in this room more privileges": "Több jog adása egy vagy több felhasználónak a szobában", + "Add privileged users": "Privilegizált felhasználók hozzáadása", "Requires compatible homeserver.": "Kompatibilis Matrix-kiszolgálóra van szükség.", - "Low bandwidth mode": "Alacsony sávszélesség mód", - "Hide notification dot (only display counters badges)": "Értesítés pötty elrejtése (csak darabszám megjelenítés)", + "Low bandwidth mode": "Alacsony sávszélességű mód", + "Hide notification dot (only display counters badges)": "Értesítési pötty elrejtése (csak darabszám megjelenítése)", "Under active development.": "Aktív fejlesztés alatt.", "Favourite Messages": "Kedvenc üzenetek", "Temporary implementation. Locations persist in room history.": "Átmeneti megvalósítás. A helyadatok megmaradnak a szoba naplójában.", @@ -3543,32 +3522,21 @@ "Right panel stays open": "Jobb panel nyitva marad", "Currently experimental.": "Jelenleg kísérleti állapotban van.", "New ways to ignore people": "Új lehetőség emberek figyelmen kívül hagyására", - "In rooms that support moderation, the “Report” button will let you report abuse to room moderators.": "A moderálást támogató szobákban a problémás tartalmat a „Jelent” gombbal lehet a moderátor felé jelezni.", - "Report to moderators": "Moderátoroknak jelentés", + "In rooms that support moderation, the “Report” button will let you report abuse to room moderators.": "A moderálást támogató szobákban a problémás tartalmat a „Jelentés” gombbal lehet a moderátorok felé jelezni.", + "Report to moderators": "Jelentés a moderátoroknak", "You have unverified sessions": "Ellenőrizetlen bejelentkezései vannak", "Buffering…": "Pufferelés…", "Change input device": "Bemeneti eszköz megváltoztatása", "%(minutes)sm %(seconds)ss": "%(minutes)s p %(seconds)s mp", "%(hours)sh %(minutes)sm %(seconds)ss": "%(hours)s ó %(minutes)s p %(seconds)s mp", "%(days)sd %(hours)sh %(minutes)sm %(seconds)ss": "%(days)s n %(hours)s ó %(minutes)s p %(seconds)s mp", - "%(senderName)s ended a voice broadcast": "%(senderName)s befejezte a hang közvetítést", - "You ended a voice broadcast": "Befejezte a hang közvetítést", + "%(senderName)s ended a voice broadcast": "%(senderName)s befejezte a hangközvetítést", + "You ended a voice broadcast": "Befejezte a hangközvetítést", "Unable to decrypt message": "Üzenet visszafejtése sikertelen", "This message could not be decrypted": "Ezt az üzenetet nem lehet visszafejteni", - "Resend key requests": "Kulcskérés újraküldése", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "Sajnos, nincs olyan ellenőrzött eszköz ahonnan kulcsokat lehetne kérni. Bejelentkezéssel más eszközbe és azok ellenőrzésével ezt a probléma kiküszöbölhető a jövőben.", - "Some messages could not be decrypted": "Néhány üzenetet nem lehet visszafejteni", - "View your device list": "Eszközlista megjelenítése", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "Ez az eszköz titkosítási kulcsokat kér másik eszközeitől. Egy másik eszköz megnyitása felgyorsíthatja ezt a folyamatot.", - "Open another device to load encrypted messages": "A titkosított üzenetek betöltéséhez másik eszköz megnyitása", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "A régi visszafejtetlen üzenetekhez a hozzáférés elveszik, de a kulcsok alaphelyzetbe állítása után az új üzenetek fogadása újból lehetséges.", - "Reset your keys to prevent future decryption errors": "Kulcsok alaphelyzetbe állítása a jövőbeni visszafejtési hibák elkerüléséért", - "This device was unable to decrypt some messages because it has not been verified yet.": "Az eszköz nem tud minden üzenetet visszafejteni mert nincs ellenőrizve.", - "Verify this device to access all messages": "Eszköz ellenőrzése az üzenetekhez való hozzáféréshez", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Kérjük várj amíg az üzeneteket visszafejtjük. Ez eltarthat egy darabig.", - "Rust cryptography implementation": "Rust titkosítás implementáció", - "%(senderName)s ended a voice broadcast": "%(senderName)s befejezte a hang közvetítést", - "You ended a voice broadcast": "A hang közvetítés befejeződött", + "Rust cryptography implementation": "Rust titkosítási implementáció", + "%(senderName)s ended a voice broadcast": "%(senderName)s befejezte a hangközvetítést", + "You ended a voice broadcast": "A hangközvetítés befejeződött", "Improve your account security by following these recommendations.": "Javítsa a fiókja biztonságát azzal, hogy követi a következő javaslatokat.", "%(count)s sessions selected|one": "%(count)s munkamenet kiválasztva", "%(count)s sessions selected|other": "%(count)s munkamenet kiválasztva", @@ -3583,15 +3551,15 @@ "Text": "Szöveg", "Create a link": "Hivatkozás készítése", "Link": "Hivatkozás", - "Force 15s voice broadcast chunk length": "Hang közvetítések 15 másodperces darabolásának kényszerítése", + "Force 15s voice broadcast chunk length": "Hangközvetítések 15 másodperces darabolásának kényszerítése", "Sign out of %(count)s sessions|one": "Kijelentkezés %(count)s munkamenetből", "Sign out of %(count)s sessions|other": "Kijelentkezés %(count)s munkamenetből", "Sign out of all other sessions (%(otherSessionsCount)s)": "Kijelentkezés minden munkamenetből (%(otherSessionsCount)s)", "Yes, end my recording": "Igen, a felvétel befejezése", - "If you start listening to this live broadcast, your current live broadcast recording will be ended.": "Ha hallgatja ezt az élő közvetítést akkor a jelenlegi élő közvetítésének a felvétele befejeződik.", + "If you start listening to this live broadcast, your current live broadcast recording will be ended.": "Ha hallgatja ezt az élő közvetítést, akkor a jelenlegi élő közvetítésének a felvétele befejeződik.", "Listen to live broadcast?": "Élő közvetítés hallgatása?", "Unfortunately we're unable to start a recording right now. Please try again later.": "Sajnos most nem lehet elindítani a felvételt. Próbálja meg később.", - "Connection error": "Kapcsolat hiba", + "Connection error": "Kapcsolati hiba", "You can't start a voice message as you are currently recording a live broadcast. Please end your live broadcast in order to start recording a voice message.": "Nem lehet hang üzenetet indítani élő közvetítés felvétele közben. Az élő közvetítés bejezése szükséges a hang üzenet indításához.", "Can't start voice message": "Hang üzenetet nem lehet elindítani", "Edit link": "Hivatkozás szerkesztése", @@ -3601,15 +3569,15 @@ "%(displayName)s (%(matrixId)s)": "%(displayName)s (%(matrixId)s)", "Connection error - Recording paused": "Kapcsolódási hiba – Felvétel szüneteltetve", "%(senderName)s started a voice broadcast": "%(senderName)s hangos közvetítést indított", - "Unable to play this voice broadcast": "A hang közvetítés nem játszható le", + "Unable to play this voice broadcast": "A hangközvetítés nem játszható le", "Registration token": "Regisztrációs token", "Enter a registration token provided by the homeserver administrator.": "Adja meg a regisztrációs tokent, amelyet a Matrix-kiszolgáló rendszergazdája adott meg.", "All messages and invites from this user will be hidden. Are you sure you want to ignore them?": "Minden üzenet és meghívó ettől a felhasználótól rejtve marad. Biztos, hogy figyelmen kívül hagyja?", "Ignore %(user)s": "%(user)s figyelmen kívül hagyása", "Manage account": "Fiók kezelése", "Your account details are managed separately at %(hostname)s.": "A fiók adatok külön vannak kezelve itt: %(hostname)s.", - "Enable MSC3946 (to support late-arriving room archives)": "MSC3946 engedélyezése (a későn érkező szoba archívum támogatáshoz)", - "Dynamic room predecessors": "Dinamikus szoba előfutára", + "Enable MSC3946 (to support late-arriving room archives)": "MSC3946 engedélyezése (a későn érkező szobaarchívumok támogatáshoz)", + "Dynamic room predecessors": "A dinamikus szoba előfutárai", "Indent decrease": "Behúzás csökkentés", "Indent increase": "Behúzás növelés", "Use rich text instead of Markdown in the message composer.": "Szövegszerkesztő használata a Markdown formázás helyett az üzenet írásakor.", @@ -3631,7 +3599,7 @@ "Red": "Piros", "Grey": "Szürke", "Are you sure you want to stop your live broadcast? This will end the broadcast and the full recording will be available in the room.": "Biztos, hogy befejezi az élő közvetítést? Ez megállítja a közvetítést és a felvétel az egész szoba számára elérhető lesz.", - "Unable to decrypt voice broadcast": "A hang közvetítést nem lehet visszafejteni", + "Unable to decrypt voice broadcast": "A hangközvetítést nem lehet visszafejteni", "Your email address does not appear to be associated with a Matrix ID on this homeserver.": "Úgy tűnik, hogy ez az e-mail-cím nincs összekötve Matrix-azonosítóval ezen a Matrix-kiszolgálón.", "WARNING: session already verified, but keys do NOT MATCH!": "FIGYELEM: a munkamenet már ellenőrizve van, de a kulcsok NEM EGYEZNEK.", "Starting backup…": "Mentés indul…", @@ -3657,7 +3625,7 @@ "There are no active polls in this room": "Nincsenek aktív szavazások ebben a szobában", "Fetching keys from server…": "Kulcsok lekérése a kiszolgálóról…", "Checking…": "Ellenőrzés…", - "This room is dedicated to illegal or toxic content or the moderators fail to moderate illegal or toxic content.\nThis will be reported to the administrators of %(homeserver)s.": "Ez a szoba illegális vagy mérgező tartalmat közvetít vagy a moderátorok képtelenek ezeket megfelelően kezelni.\nEzek a szerver (%(homeserver)s) üzemeltetője felé jelzésre kerülnek.", + "This room is dedicated to illegal or toxic content or the moderators fail to moderate illegal or toxic content.\nThis will be reported to the administrators of %(homeserver)s.": "Ez a szoba illegális vagy mérgező tartalmat közvetít, vagy a moderátorok képtelenek ezeket megfelelően moderálni.\nEz jelezve lesz a(z) %(homeserver)s üzemeltetője felé.", "This user is displaying toxic behaviour, for instance by insulting other users or sharing adult-only content in a family-friendly room or otherwise violating the rules of this room.\nThis will be reported to the room moderators.": "A felhasználó mérgező viselkedést jelenít meg, például más felhasználókat inzultál vagy felnőtt tartalmat oszt meg egy családbarát szobában vagy más módon sérti meg a szoba szabályait.\nEz moderátorok felé jelzésre kerül.", "Enable '%(manageIntegrations)s' in Settings to do this.": "Ehhez engedélyezd a(z) „%(manageIntegrations)s”-t a Beállításokban.", "Waiting for partner to confirm…": "Várakozás a partner megerősítésére…", @@ -3670,7 +3638,6 @@ "Joining space…": "Belépés a térbe…", "Encrypting your message…": "Üzenet titkosítása…", "Sending your message…": "Üzenet küldése…", - "Decrypting messages…": "Üzenetek visszafejtése…", "Warning: upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "Figyelmeztetés: A szoba frissítése nem fogja automatikusan átvinni a szoba résztvevőit az új verziójú szobába. A régi szobába bekerül egy link az új szobához - a tagoknak rá kell kattintani a linkre az új szobába való belépéshez.", "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 '%(myBanList)s' - stay in this room to keep the ban list in effect.": "A személyes tiltólistád tartalmazza azokat a személyeket/szervereket akiktől nem szeretnél üzeneteket látni. Az első felhasználó/szerver figyelmen kívül hagyása után egy új szoba jelenik meg a szobák listájában „%(myBanList)s” névvel - ahhoz, hogy a lista érvényben maradjon maradj a szobában.", "Set a new account password…": "Új fiók jelszó beállítása…", @@ -3710,7 +3677,7 @@ "View poll in timeline": "Szavazás megjelenítése az idővonalon", "Once everyone has joined, you’ll be able to chat": "Amint mindenki belépett lekezdheti a beszélgetést", "Verify Session": "Munkamenet ellenőrzése", - "Ignore (%(counter)s)": "Figyelmen kívül hagy (%(counter)s)", + "Ignore (%(counter)s)": "Mellőzés (%(counter)s)", "If you know a room address, try joining through that instead.": "Ha ismeri a szoba címét próbáljon inkább azzal belépni.", "Could not find room": "A szoba nem található", "iframe has no src attribute": "az iframe-nek nincs src attribútuma", @@ -3719,18 +3686,18 @@ "There are no past polls for the past %(count)s days. Load more polls to view polls for previous months|other": "%(count)s napja nincs aktív szavazás. További szavazások betöltése az előző havi szavazások megjelenítéséhez", "There are no active polls for the past %(count)s days. Load more polls to view polls for previous months|one": "Nincs aktív szavazás az elmúlt napokból. További szavazások betöltése az előző havi szavazások megjelenítéséhez", "Invites by email can only be sent one at a time": "E-mail meghívóból egyszerre csak egy küldhető el", - "You attempted to join using a room ID without providing a list of servers to join through. Room IDs are internal identifiers and cannot be used to join a room without additional information.": "A belépéshez csak az szoba azonosítóját adta meg a kiszolgáló nélkül. A szobaazonosító egy belső azonosító, amellyel további információk nélkül nem lehet belépni szobába.", + "You attempted to join using a room ID without providing a list of servers to join through. Room IDs are internal identifiers and cannot be used to join a room without additional information.": "A belépéshez csak a szoba azonosítóját adta meg a kiszolgáló nélkül. A szobaazonosító egy belső azonosító, amellyel további információk nélkül nem lehet belépni szobába.", "An error occurred when updating your notification preferences. Please try to toggle your option again.": "Az értesítési beállítások frissítésénél hiba történt. Próbálja meg az opciót újra átkapcsolni.", "Desktop app logo": "Asztali alkalmazás profilkép", - "Log out and back in to disable": "A kikapcsoláshoz ki-, és bejelentkezésre van szükség", - "Can currently only be enabled via config.json": "Jelenleg csak a config.json-ban lehet bekapcsolni", + "Log out and back in to disable": "A kikapcsoláshoz ki-, és bejelentkezés szükséges", + "Can currently only be enabled via config.json": "Jelenleg csak a config.json fájlban lehet engedélyezni", "Requires your server to support MSC3030": "A Matrix-kiszolgálónak támogatnia kell az MSC3030-at", "Requires your server to support the stable version of MSC3827": "A Matrix-kiszolgálónak támogatnia kell az MSC3827 stabil verzióját", "Use your account to continue.": "Használja a fiókját a továbblépéshez.", "Message from %(user)s": "Üzenet tőle: %(user)s", "Message in %(room)s": "Üzenet itt: %(room)s", "User": "Felhasználó", - "Show avatars in user, room and event mentions": "Profilkép mutatása a felhasználó, szoba és esemény említéseknél", + "Show avatars in user, room and event mentions": "Profilképek megjelenítése a felhasználók, szobák és események megemlítésénél", "Error details": "Hiba részletei", "Unable to find event at that date": "Nem található esemény az adott dátumkor", "Please submit debug logs to help us track down the problem.": "Küldjön be hibakeresési naplókat, hogy segítsen nekünk a hiba megtalálásában.", @@ -3771,5 +3738,7 @@ "Error while changing password: %(error)s": "Hiba a jelszó módosítása során: %(error)s", "%(sender)s reacted %(reaction)s to %(message)s": "%(sender)s ezzel a reagált: %(reaction)s, a következőre: %(message)s", "You reacted %(reaction)s to %(message)s": "Ezzel a reagált: %(reaction)s, a következőre: %(message)s", - "Cannot invite user by email without an identity server. You can connect to one under \"Settings\".": "Matrix-kiszolgáló nélkül nem lehet felhasználókat meghívni e-mailben. Kapcsolódjon egyhez a „Beállítások” alatt." + "Cannot invite user by email without an identity server. You can connect to one under \"Settings\".": "Matrix-kiszolgáló nélkül nem lehet felhasználókat meghívni e-mailben. Kapcsolódjon egyhez a „Beállítások” alatt.", + "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s megváltoztatta a megjelenítendő nevét és profilképét", + "Failed to download source media, no source url was found": "A forrásmédia letöltése sikertelen, nem található forráswebcím" } diff --git a/src/i18n/strings/id.json b/src/i18n/strings/id.json index b6d5aca3f87..48f3a7b222b 100644 --- a/src/i18n/strings/id.json +++ b/src/i18n/strings/id.json @@ -577,8 +577,6 @@ "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Panggilan gagal karena mikrofon tidak dapat diakses. Periksa apakah mikrofon sudah dicolokkan dan diatur dengan benar.", "Unable to load! Check your network connectivity and try again.": "Tidak dapat memuat! Periksa koneksi jaringan Anda dan coba lagi.", "Unable to access microphone": "Tidak dapat mengakses mikrofon", - "Try using turn.matrix.org": "Coba menggunakan turn.matrix.org", - "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.": "Sebagai alternatif, Anda bisa coba menggunakan server publik di turn.matrix.org, tetapi ini tidak terlalu andal, dan akan membagikan alamat IP Anda dengan servernya. Anda juga bisa kelola ini di Pengaturan.", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Mohon tanyakan ke administrator homeserver Anda (%(homeserverDomain)s) untuk mengkonfigurasikan server TURN supaya panggilan dapat bekerja dengan benar.", "Call failed due to misconfigured server": "Panggilan gagal karena servernya tidak dikonfigurasi dengan benar", "Answered Elsewhere": "Dijawab di Perangkat Lain", @@ -1269,15 +1267,7 @@ "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "Simpan pesan terenkripsi secara lokal dengan aman agar muncul di hasil pencarian, menggunakan %(size)s untuk menyimpan pesan dari %(rooms)s ruangan.", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Simpan pesan terenkripsi secara lokal dengan aman agar muncul di hasil pencarian, menggunakan %(size)s untuk menyimpan pesan dari %(rooms)s ruangan.", "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Verifikasi setiap sesi yang digunakan oleh pengguna satu per satu untuk menandainya sebagai tepercaya, dan tidak memercayai perangkat yang ditandatangani silang.", - "Sign Out": "Keluarkan", "Failed to set display name": "Gagal untuk menetapkan nama tampilan", - "This device": "Perangkat ini", - "You aren't signed into any other devices.": "Anda tidak masuk di perangkat yang lain.", - "Sign out %(count)s selected devices|one": "Keluarkan %(count)s perangkat yang dipilih", - "Sign out %(count)s selected devices|other": "Keluarkan %(count)s perangkat yang dipilih", - "Devices without encryption support": "Perangkat tanpa dukungan enkripsi", - "Verified devices": "Perangkat yang terverifikasi", - "Unverified devices": "Perangkat yang belum diverifikasi", "Deselect all": "Batalkan semua pilihan", "Select all": "Pilih semua", "Sign out devices|one": "Keluarkan perangkat", @@ -1285,8 +1275,6 @@ "Click the button below to confirm signing out these devices.|one": "Klik tombol di bawah untuk mengkonfirmasi mengeluarkan perangkat ini.", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Konfirmasi mengeluarkan perangkat ini dengan menggunakan Single Sign On untuk membuktikan identitas Anda.", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "Konfirmasi mengeluarkan perangkat-perangkat ini dengan menggunakan Single Sign On untuk membuktikan identitas Anda.", - "Unable to load device list": "Tidak dapat memuat daftar perangkat", - "Your homeserver does not support device management.": "Homeserver Anda tidak mendukung pengelolaan perangkat.", "Session key:": "Kunci sesi:", "Session ID:": "ID Sesi:", "Import E2E room keys": "Impor kunci enkripsi ujung ke ujung", @@ -1542,8 +1530,6 @@ "Home is useful for getting an overview of everything.": "Beranda berguna untuk mendapatkan ikhtisar tentang semuanya.", "Spaces to show": "Space yang ditampilkan", "Sidebar": "Bilah Samping", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Kelola sesi Anda di bawah. Sebuah nama sesi dapat dilihat oleh siapa saja yang Anda berkomunikasi.", - "Where you're signed in": "Di mana Anda masuk", "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Admin server Anda telah menonaktifkan enkripsi ujung ke ujung secara bawaan di ruangan privat & Pesan Langsung.", "Message search": "Pencarian pesan", "Secure Backup": "Cadangan Aman", @@ -2317,7 +2303,6 @@ "Let's create a room for each of them.": "Mari kita buat ruangan untuk masing-masing.", "What are some things you want to discuss in %(spaceName)s?": "Apa saja yang Anda ingin bahas di %(spaceName)s?", "Invite by username": "Undang dengan nama pengguna", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Ini adalah fitur eksperimental. Untuk sementara, pengguna yang mendapatkan undangan harus membuka undangannya di untuk benar-benar bergabung.", "Make sure the right people have access. You can invite more later.": "Pastikan orang-orang tertentu mempunyai akses. Anda dapat mengundang lagi nanti.", "Invite your teammates": "Undang tim Anda", "Failed to invite the following users to your space: %(csvUsers)s": "Gagal untuk mengundang pengguna berikut ini ke space Anda: %(csvUsers)s", @@ -2787,7 +2772,6 @@ "We don't record or profile any account data": "Kami tidak merekam atau memprofil data akun apa pun", "You can read all our terms here": "Anda dapat membaca kebijakan kami di sini", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Bagikan data anonim untuk membantu kami mengidentifikasi masalah-masalah. Tidak ada yang pribadi. Tidak ada pihak ketiga.", - "Okay": "Ok", "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "Bagikan data anonim untuk membantu kami mengidentifikasi masalah-masalah. Tidak ada yang pribadi. Tidak ada pihak ketiga. Pelajari Lebih Lanjut", "You previously consented to share anonymous usage data with us. We're updating how that works.": "Anda sebelumnya setuju untuk membagikan data penggunaan anonim dengan kami. Kami memperbarui cara kerjanya.", "Help improve %(analyticsOwner)s": "Bantu membuat %(analyticsOwner)s lebih baik", @@ -3422,10 +3406,6 @@ "Unknown room": "Ruangan yang tidak diketahui", "Video call started in %(roomName)s. (not supported by this browser)": "Panggilan video dimulai di %(roomName)s. (tidak didukung oleh peramban ini)", "Video call started in %(roomName)s.": "Panggilan video dimulai di %(roomName)s.", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Pengelola sesi kami yang baru memberikan pengelihatan yang lebih baik pada semua sesi Anda, dan pengendalian yang lebih baik pada semua sesi, termasuk kemampuan untuk mensaklar notifikasi dorongan.", - "Have greater visibility and control over all your sessions.": "Miliki pengelihatan dan pengendalian yang lebih baik pada semua sesi Anda.", - "New session manager": "Pengelola sesi baru", - "Use new session manager": "Gunakan pengelola sesi baru", "resume voice broadcast": "lanjutkan siaran suara", "pause voice broadcast": "jeda siaran suara", "Underline": "Garis Bawah", @@ -3481,7 +3461,6 @@ "Automatically adjust the microphone volume": "Atur volume mikrofon secara otomatis", "Voice settings": "Pengaturan suara", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "Hanya diterapkan jika homeserver Anda tidak menyediakan satu. Alamat IP Anda akan dibagikan selama panggilan berlangsung.", - "Allow fallback call assist server (turn.matrix.org)": "Perbolehkan server panggilan bantuan cadangan (turn.matrix.org)", "Noise suppression": "Pengurangan suara bising", "Echo cancellation": "Pembatalan gema", "Automatic gain control": "Kendali suara otomatis", @@ -3555,17 +3534,6 @@ "You ended a voice broadcast": "Anda mengakhiri sebuah siaran suara", "Unable to decrypt message": "Tidak dapat mendekripsi pesan", "This message could not be decrypted": "Pesan ini tidak dapat didekripsi", - "Resend key requests": "Kirim ulang permintaan kunci", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "Sayangnya tidak ada perangkat terverifikasi lainnya untuk meminta kunci dekripsi. Memasuki dan memverifikasi perangkat lain dapat mencegah situasi ini di masa mendatang.", - "Some messages could not be decrypted": "Beberapa pesan tidak dapat didekripsi", - "View your device list": "Lihat daftar perangkat Anda", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "Perangkat ini sedang meminta kunci dekripsi dari perangkat Anda yang lain. Membuka salah satu perangkat Anda yang lain dapat mempercepat proses ini.", - "Open another device to load encrypted messages": "Buka perangkat lain untuk memuat pesan terenkripsi", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "Anda tidak akan dapat mengakses pesan lama yang tidak dapat didekripsi, tetapi mengatur ulang kunci Anda akan memungkinkan Anda untuk menerima pesan baru.", - "Reset your keys to prevent future decryption errors": "Atur ulang kunci Anda untuk mencegah kesalahan pendekripsian di masa mendatang", - "This device was unable to decrypt some messages because it has not been verified yet.": "Perangkat ini tidak dapat mendekripsi beberapa pesan karena belum diverifikasi.", - "Verify this device to access all messages": "Verifikasi perangkat ini untuk mengakses semua pesan", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Mohon tunggu saat kami mencoba untuk mendekripsi pesan Anda. Ini mungkin membutuhkan beberapa waktu.", "Rust cryptography implementation": "Implementasi kriptografi Rust", "%(senderName)s ended a voice broadcast": "%(senderName)s mdngakhiri sebuah siaran suara", "You ended a voice broadcast": "Anda mengakhiri sebuah siaran suara", @@ -3671,7 +3639,6 @@ "Joining space…": "Bergabung dengan space…", "Encrypting your message…": "Mengenkripsi pesan Anda…", "Sending your message…": "Mengirim pesan Anda…", - "Decrypting messages…": "Mendekripsi pesan…", "Set a new account password…": "Atur kata sandi akun baru…", "Downloading update…": "Mengunduh pembaruan…", "Checking for an update…": "Memeriksa pembaruan…", @@ -3777,5 +3744,7 @@ "Once invited users have joined %(brand)s, you will be able to chat and the room will be end-to-end encrypted": "Setelah pengguna yang diundang telah bergabung ke %(brand)s, Anda akan dapat bercakapan dan ruangan akan terenkripsi secara ujung ke ujung", "Waiting for users to join %(brand)s": "Menunggu pengguna untuk bergabung ke %(brand)s", "You do not have permission to invite users": "Anda tidak memiliki izin untuk mengundang pengguna", - "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s mengubah nama tampilan dan foto profilnya" + "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s mengubah nama tampilan dan foto profilnya", + "Your language": "Bahasa Anda", + "Your device ID": "ID perangkat Anda" } diff --git a/src/i18n/strings/is.json b/src/i18n/strings/is.json index 78c0ce2e288..825e8e77de1 100644 --- a/src/i18n/strings/is.json +++ b/src/i18n/strings/is.json @@ -863,7 +863,6 @@ " wants to chat": " langar til að spjalla", "Invite with email or username": "Bjóða með tölvupóstfangi eða notandanafni", "Messages containing my username": "Skilaboð sem innihalda notandanafn mitt", - "Try using turn.matrix.org": "Reyndu að nota turn.matrix.org", "Call failed due to misconfigured server": "Símtal mistókst vegna vanstillingar netþjóns", "The call was answered on another device.": "Símtalinu var svarað á öðru tæki.", "The call could not be established": "Ekki tókst að koma símtalinu á", @@ -1089,7 +1088,6 @@ "Rooms outside of a space": "Spjallrásir utan svæðis", "Sidebar": "Hliðarspjald", "Privacy": "Friðhelgi", - "Okay": "Í lagi", "Keyboard shortcuts": "Flýtileiðir á lyklaborði", "Keyboard": "Lyklaborð", "Keyboard Shortcuts": "Flýtilyklar", @@ -1116,7 +1114,6 @@ "Manage": "Stjórna", "Rename": "Endurnefna", "Display Name": "Birtingarnafn", - "Sign Out": "Skrá út", "Select all": "Velja allt", "Deselect all": "Afvelja allt", "Session ID:": "Auðkenni setu:", @@ -1286,7 +1283,6 @@ "A microphone and webcam are plugged in and set up correctly": "Hljóðnemi og vefmyndavél eru tengd og rétt upp sett", "Call failed because webcam or microphone could not be accessed. Check that:": "Símtal mistókst þar sem ekki tókst að fá aðgang að vefmyndavél eða hljóðnema. Athugaðu þetta:", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Símtal mistókst þar sem ekki tókst að fá aðgang að hljóðnema. Athugaðu hvort hljóðnemi sé tengdur og rétt upp settur.", - "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.": "Annars geturðu reynt að nota almenningsþjóninn á turn.matrix.org, en það er oft ekki eins áreiðanlegt, auk þess að þá er IP-vistfanginu þínu deilt með þeim þjóni. Þú getur líka föndrað við þetta í stillingunum.", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Spurðu kerfisstjóra (%(homeserverDomain)s) heimaþjónsins þíns um að setja upp TURN-þjón til að tryggja að símtöl virki eðlilega.", "Search (must be enabled)": "Leita (verður að vera virkjað)", "Toggle space panel": "Víxla svæðaspjaldi af/á", @@ -1519,12 +1515,8 @@ "Displays information about a user": "Birtir upplýsingar um notanda", "Define the power level of a user": "Skilgreindu völd notanda", "Failed to set display name": "Mistókst að stilla birtingarnafn", - "This device": "Þetta tæki", - "Unverified devices": "Óstaðfest tæki", - "Verified devices": "Sannvottuð tæki", "Sign out devices|one": "Skrá út tæki", "Sign out devices|other": "Skrá út tæki", - "Unable to load device list": "Ekki tókst að ná lista yfir tæki", "Show advanced": "Birta ítarlegt", "Hide advanced": "Fela ítarlegt", "Edit settings relating to your space.": "Breyta stillingum viðkomandi svæðinu þínu.", @@ -1649,7 +1641,6 @@ "Home is useful for getting an overview of everything.": "Forsíðan nýtist til að hafa yfirsýn yfir allt.", "Spaces are ways to group rooms and people. Alongside the spaces you're in, you can use some pre-built ones too.": "Svæði eru leið til að hópa fólk og spjallrásir. Auk svæðanna sem þú ert á, geturðu líka notað nokkur forútbúin svæði.", "Spaces to show": "Svæði sem á að birta", - "Your homeserver does not support device management.": "Heimaþjónninn þinn styður ekki umsýslu tækja.", "Please contact your homeserver administrator.": "Hafðu samband við kerfisstjóra heimaþjónsins þíns.", "Quick Reactions": "Flýtiviðbrögð", "Remove %(email)s?": "Fjarlægja %(email)s?", @@ -1752,8 +1743,6 @@ "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s (%(userId)s) skráði sig inn í nýja setu án þess að sannvotta hana:", "You signed in to a new session without verifying it:": "Þú skráðir inn í nýja setu án þess að sannvotta hana:", "Your messages are not secure": "Skilaboðin þín eru ekki örugg", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Haltu utan um innskráðu tækin þín hér fyrir neðan. Heiti tækis er sýnilegt þeim sem þú átt samskipti við.", - "Where you're signed in": "Hvar þú ert skráð/ur inn", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Deildu nafnlausum gögnum til að hjálpa okkur við að greina vandamál. Ekkert persónulegt. Engir utanaðkomandi.", "Could not connect to identity server": "Gat ekki tengst við auðkennisþjón", "Secret storage:": "Leynigeymsla:", @@ -1772,7 +1761,6 @@ "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Þessi seta er ekki að öryggisafrita dulritunarlyklana þína, en þú ert með fyrirliggjandi öryggisafrit sem þú getur endurheimt úr og notað til að halda áfram.", "Unable to load key backup status": "Tókst ekki að hlaða inn stöðu öryggisafritunar dulritunarlykla", "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Ertu viss? Þú munt tapa dulrituðu skilaboðunum þínum ef dulritunarlyklarnir þínir eru ekki rétt öryggisafritaðir.", - "You aren't signed into any other devices.": "Þú ert ekki skráð/ur inn í nein önnur tæki.", "in secret storage": "í leynigeymslu", "Manually verify all remote sessions": "Sannreyna handvirkt allar fjartengdar setur", "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "Deildu nafnlausum gögnum til að hjálpa okkur við að greina vandamál. Ekkert persónulegt. Engir utanaðkomandi. Kanna nánar", @@ -1915,9 +1903,6 @@ "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "Setja dulrituð skilaboð leynilega í skyndiminni á tækinu svo þau birtist í leitarniðurstöðum, notar %(size)s til að geyma skilaboð frá %(rooms)s spjallrásum.", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Setja dulrituð skilaboð leynilega í skyndiminni á tækinu svo þau birtist í leitarniðurstöðum, notar %(size)s til að geyma skilaboð frá %(rooms)s spjallrásum.", "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Sannreyndu hverja setu sem notandinn notar til að merkja hana sem treysta, án þess að treyta kross-undirrituðum tækjum.", - "Sign out %(count)s selected devices|one": "Skrá út af %(count)s völdum tæki", - "Sign out %(count)s selected devices|other": "Skrá út af %(count)s völdum tækjum", - "Devices without encryption support": "Tæki án stuðnings við dulritun", "Cross-signing private keys:": "Kross-undirritun einkalykla:", "Cross-signing public keys:": "Kross-undirritun dreifilykla:", "Cross-signing is not set up.": "Kross-undirritun er ekki uppsett.", @@ -3071,8 +3056,6 @@ "Requires compatible homeserver.": "Krefst samhæfðs heimaþjóns.", "Noise suppression": "Truflanabæling", "Echo cancellation": "Útrýming bergmáls", - "New session manager": "Ný setustýring", - "Use new session manager": "Nota nýju setustýringuna", "Temporary implementation. Locations persist in room history.": "Bráðabirgðaútfærsla. Staðsetningar haldast í ferli spjallrása.", "Live Location Sharing": "Deiling staðsetningar í rauntíma", "New group call experience": "Ný upplifun við hópsamtöl", @@ -3207,9 +3190,6 @@ "You don't have permission to view messages from before you were invited.": "Þú hefur ekki heimildir til að skoða skilaboð frá því áður en þér var boðið.", "This message could not be decrypted": "Þessi skilaboð er ekki hægt að afkóða", " in %(room)s": " í %(room)s", - "Resend key requests": "Endursenda beiðnir um lykla", - "Some messages could not be decrypted": "Ekki var hægt að afkóða sum skilaboð", - "View your device list": "Birta lista yfir tækin þín", "Sign out of %(count)s sessions|one": "Skrá út úr %(count)s setu", "Sign out of %(count)s sessions|other": "Skrá út úr %(count)s setum", "%(count)s sessions selected|one": "%(count)s seta valin", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 600270163fa..e86a95603ce 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -473,7 +473,7 @@ "Review terms and conditions": "Leggi i termini e condizioni", "Muted Users": "Utenti silenziati", "Message Pinning": "Ancoraggio messaggi", - "Mirror local video feed": "Feed video dai ripetitori locali", + "Mirror local video feed": "Invertire orizzontalmente il video locale (effetto specchio)", "Replying": "Rispondere", "Popout widget": "Oggetto a comparsa", "Share Link to User": "Condividi link utente", @@ -935,8 +935,6 @@ "Summary": "Riepilogo", "Call failed due to misconfigured server": "Chiamata non riuscita a causa di un server non configurato correttamente", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Chiedi all'amministratore del tuo homeserver(%(homeserverDomain)s) per configurare un server TURN affinché le chiamate funzionino in modo affidabile.", - "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.": "In alternativa, puoi provare a utilizzare il server pubblico all'indirizzo turn.matrix.org, ma questo non sarà così affidabile e condividerà il tuo indirizzo IP con quel server. Puoi anche gestirlo in Impostazioni.", - "Try using turn.matrix.org": "Prova a usare turn.matrix.org", "Messages": "Messaggi", "Actions": "Azioni", "Displays list of commands with usages and descriptions": "Visualizza l'elenco dei comandi con usi e descrizioni", @@ -2303,7 +2301,6 @@ "You have no ignored users.": "Non hai utenti ignorati.", "Play": "Riproduci", "Pause": "Pausa", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Questa è una funzione sperimentale. Per ora, i nuovi utenti che ricevono un invito dovranno aprirlo su per entrare.", "Select a room below first": "Prima seleziona una stanza sotto", "Join the beta": "Unisciti alla beta", "Leave the beta": "Abbandona la beta", @@ -2449,7 +2446,7 @@ "Error saving notification preferences": "Errore nel salvataggio delle preferenze di notifica", "Messages containing keywords": "Messaggi contenenti parole chiave", "Use Ctrl + F to search timeline": "Usa Ctrl + F per cercare nella linea temporale", - "Use Command + F to search timeline": "Usa Command + F per cercare nella linea temporale", + "Use Command + F to search timeline": "Usa Comando + F per cercare nella linea temporale", "Transfer Failed": "Trasferimento fallito", "Unable to transfer call": "Impossibile trasferire la chiamata", "Error downloading audio": "Errore di scaricamento dell'audio", @@ -2684,18 +2681,8 @@ "Yours, or the other users' internet connection": "La tua connessione internet o quella degli altri utenti", "The homeserver the user you're verifying is connected to": "L'homeserver al quale è connesso l'utente che stai verificando", "This room isn't bridging messages to any platforms. Learn more.": "Questa stanza non fa un bridge dei messaggi con alcuna piattaforma. Maggiori informazioni.", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Gestisci qui sotto i dispositivi in cui hai fatto l'accesso. Il nome di un dispositivo è visibile alle persone con cui comunichi.", - "Where you're signed in": "Dove hai fatto l'accesso", "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.", "Rename": "Rinomina", - "Sign Out": "Disconnetti", - "This device": "Questo dispositivo", - "You aren't signed into any other devices.": "Non sei connesso in nessun altro dispositivo.", - "Sign out %(count)s selected devices|one": "Disconnetti %(count)s dispositivo selezionato", - "Sign out %(count)s selected devices|other": "Disconnetti %(count)s dispositivi selezionati", - "Devices without encryption support": "Dispositivi senza supporto alla crittografia", - "Unverified devices": "Dispositivi non verificati", - "Verified devices": "Dispositivi verificati", "Select all": "Seleziona tutti", "Deselect all": "Deseleziona tutti", "Sign out devices|one": "Disconnetti dispositivo", @@ -2704,8 +2691,6 @@ "Click the button below to confirm signing out these devices.|other": "Clicca il pulsante sottostante per confermare la disconnessione da questi dispositivi.", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Conferma la disconnessione da questo dispositivo usando Single Sign On per dare prova della tua identità.", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "Conferma la disconnessione da questi dispositivi usando Single Sign On per dare prova della tua identità.", - "Unable to load device list": "Impossibile caricare l'elenco di dispositivi", - "Your homeserver does not support device management.": "Il tuo homeserver non supporta la gestione dei dispositivi.", "Use a more compact 'Modern' layout": "Usa una disposizione \"Moderna\" più compatta", "Add option": "Aggiungi opzione", "Write an option": "Scrivi un'opzione", @@ -2789,7 +2774,6 @@ "Share location": "Condividi posizione", "Manage pinned events": "Gestisci eventi ancorati", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Condividi dati anonimi per aiutarci a identificare problemi. Niente di personale. Niente terze parti.", - "Okay": "Okay", "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "Condividi dati anonimi per aiutarci a identificare problemi. Niente di personale. Niente terze parti. Maggiori informazioni", "You previously consented to share anonymous usage data with us. We're updating how that works.": "Hai precedentemente accettato di condividere dati anonimi di utilizzo con noi. Ne stiamo aggiornando il funzionamento.", "Help improve %(analyticsOwner)s": "Aiuta a migliorare %(analyticsOwner)s", @@ -3422,10 +3406,6 @@ "Join %(brand)s calls": "Entra in chiamate di %(brand)s", "Start %(brand)s calls": "Inizia chiamate di %(brand)s", "Sorry — this call is currently full": "Spiacenti — questa chiamata è piena", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Il nostro nuovo gestore di sessioni offre una migliore visibilità e un maggiore controllo sulle tue sessioni, inclusa la possibilità di attivare/disattivare da remoto le notifiche push.", - "Have greater visibility and control over all your sessions.": "Maggiore visibilità e controllo su tutte le tue sessioni.", - "New session manager": "Nuovo gestore di sessioni", - "Use new session manager": "Usa nuovo gestore di sessioni", "Underline": "Sottolineato", "Italic": "Corsivo", "resume voice broadcast": "riprendi trasmissione vocale", @@ -3481,7 +3461,6 @@ "Automatically adjust the microphone volume": "Regola automaticamente il volume del microfono", "Voice settings": "Impostazioni voce", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "Si applica solo se il tuo homeserver non ne offre uno. Il tuo indirizzo IP verrebbe condiviso durante una chiamata.", - "Allow fallback call assist server (turn.matrix.org)": "Permetti server di chiamata di ripiego (turn.matrix.org)", "Noise suppression": "Riduzione del rumore", "Echo cancellation": "Cancellazione dell'eco", "Automatic gain control": "Controllo automatico del guadagno", @@ -3553,21 +3532,10 @@ "Hide notification dot (only display counters badges)": "Nascondi il punto di notifica (mostra solo i contatori)", "%(senderName)s ended a voice broadcast": "%(senderName)s ha terminato una trasmissione vocale", "You ended a voice broadcast": "Hai terminato una trasmissione vocale", - "Reset your keys to prevent future decryption errors": "Reimposta le tue chiavi per evitare errori di decifrazione futuri", - "This device was unable to decrypt some messages because it has not been verified yet.": "Questo dispositivo non è riuscito a decifrare alcuni messaggi perché non è ancora stato verificato.", - "Verify this device to access all messages": "Verifica questo dispositivo per accedere ai messaggi", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Attendi mentre tentiamo di decifrare i tuoi messaggi. Potrebbe impiegarci un po'.", "%(senderName)s ended a voice broadcast": "%(senderName)s ha terminato una trasmissione vocale", "You ended a voice broadcast": "Hai terminato una trasmissione vocale", "Unable to decrypt message": "Impossibile decifrare il messaggio", "This message could not be decrypted": "Non è stato possibile decifrare questo messaggio", - "Resend key requests": "Re-invia richiesta chiavi", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "Sfortunatamente non ci sono altri dispositivi verificati a cui chiedere le chiavi di decifrazione. Accedere e verificare altri dispositivi può aiutare ad evitare questa situazione in futuro.", - "Some messages could not be decrypted": "Non è stato possibile decifrare alcuni messaggi", - "View your device list": "Vedi la lista dei dispositivi", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "Questo dispositivo sta chiedendo le chiavi di decifrazione dai tuoi altri dispositivi. Aprire uno di essi potrebbe velocizzarlo.", - "Open another device to load encrypted messages": "Apri un altro dispositivo per caricare i messaggi cifrati", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "Non potrai accedere ai vecchi messaggi indecifrabili, ma reimpostare le tue chiavi permetterà di ricevere nuovi messaggi.", "Improve your account security by following these recommendations.": "Migliora la sicurezza del tuo account seguendo questi consigli.", "%(count)s sessions selected|one": "%(count)s sessione selezionata", "%(count)s sessions selected|other": "%(count)s sessioni selezionate", @@ -3669,7 +3637,6 @@ "Joining space…": "Ingresso nello spazio…", "Encrypting your message…": "Crittazione del tuo messaggio…", "Sending your message…": "Invio del tuo messaggio…", - "Decrypting messages…": "Decifrazione messaggi…", "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 '%(myBanList)s' - stay in this room to keep the ban list in effect.": "La tua lista personale di ban contiene tutti gli utenti/server da cui non vuoi vedere messaggi. Dopo aver ignorato il tuo primo utente/server, apparirà una nuova stanza nel tuo elenco stanze chiamata '%(myBanList)s' - resta in questa stanza per mantenere effettiva la lista ban.", "Set a new account password…": "Imposta una nuova password dell'account…", "Downloading update…": "Scaricamento aggiornamento…", @@ -3777,5 +3744,11 @@ "Once invited users have joined %(brand)s, you will be able to chat and the room will be end-to-end encrypted": "Una volta che gli utenti si saranno uniti a %(brand)s, potrete scrivervi e la stanza sarà crittografata end-to-end", "Waiting for users to join %(brand)s": "In attesa che gli utenti si uniscano a %(brand)s", "You do not have permission to invite users": "Non hai l'autorizzazione per invitare utenti", - "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s ha cambiato il nome visualizzato e l'immagine del profilo" + "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s ha cambiato il nome visualizzato e l'immagine del profilo", + "Your language": "La tua lingua", + "Your device ID": "L'ID del tuo dispositivo", + "Try using %(server)s": "Prova ad usare %(server)s", + "User is not logged in": "Utente non connesso", + "Alternatively, you can try to use the public server at , but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "In alternativa puoi provare ad usare il server pubblico , ma non è molto affidabile e il tuo indirizzo IP verrà condiviso con tale server. Puoi gestire questa cosa nelle impostazioni.", + "Allow fallback call assist server (%(server)s)": "Permetti server di chiamata di ripiego (%(server)s)" } diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index bcaa25fac6f..c94e0807981 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -552,7 +552,6 @@ "Add Email Address": "メールアドレスを追加", "Add Phone Number": "電話番号を追加", "Call failed due to misconfigured server": "サーバーの不正な設定のため通話に失敗しました", - "Try using turn.matrix.org": "turn.matrix.orgを試してみる", "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.": "このサーバーは指定されたルームのバージョンをサポートしていません。", @@ -1741,7 +1740,6 @@ "Unable to access webcam / microphone": "Webカメラまたはマイクを使用できません", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "マイクを使用できなかったため、通話に失敗しました。マイクが接続され、正しく設定されているか確認してください。", "Unable to access microphone": "マイクを使用できません", - "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アドレスが共有されます。これは設定画面からも管理できます。", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "安定した通話のために、ホームサーバー(%(homeserverDomain)s)の管理者にTURNサーバーの設定を依頼してください。", "The call was answered on another device.": "他の端末で呼び出しに応答しました。", "Answered Elsewhere": "他の端末で応答しました", @@ -1908,11 +1906,7 @@ "Suggested": "おすすめ", "Joined": "参加済", "To join a space you'll need an invite.": "スペースに参加するには招待が必要です。", - "Sign out %(count)s selected devices|one": "%(count)s個の端末からサインアウト", - "Sign out %(count)s selected devices|other": "%(count)s個の端末からサインアウト", "Rename": "表示名を変更", - "Sign Out": "サインアウト", - "This device": "この端末", "Keyboard": "キーボード", "Group all your rooms that aren't part of a space in one place.": "スペースに含まれない全てのルームを一箇所にまとめる。", "Rooms outside of a space": "スペース外のルーム", @@ -1997,13 +1991,9 @@ "This upgrade will allow members of selected spaces access to this room without an invite.": "このアップグレードにより、選択したスペースのメンバーは、招待なしでこのルームにアクセスできるようになります。", "Select all": "全て選択", "Deselect all": "全ての選択を解除", - "Devices without encryption support": "暗号化をサポートしていない端末", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "以下でサインインしている端末を管理できます。コミュニケーション相手は端末名を見ることができます。", "Sign out devices|one": "端末からサインアウト", "Sign out devices|other": "端末からサインアウト", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "匿名のデータを共有すると、問題の特定に役立ちます。個人データの収集や、第三者とのデータ共有はありません。", - "Where you're signed in": "現在ログイン中のセッション", - "Okay": "はい", "Hide sidebar": "サイドバーを表示しない", "Start sharing your screen": "画面共有を開始", "Stop sharing your screen": "画面共有を停止", @@ -2225,8 +2215,6 @@ "Verify this device": "この端末を認証", "Verify with another device": "別の端末で認証", "Forgotten or lost all recovery methods? Reset all": "復元方法を全て失ってしまいましたか?リセットできます", - "You aren't signed into any other devices.": "他にサインインしている端末はありません。", - "Unverified devices": "未認証の端末", "Review to ensure your account is safe": "アカウントが安全かどうか確認してください", "Own your conversations.": "自分の会話は、自分のもの。", "Confirm your identity by entering your account password below.": "以下にアカウントのパスワードを入力して本人確認を行ってください。", @@ -2605,7 +2593,6 @@ "A browser extension is preventing the request.": "ブラウザーの拡張機能がリクエストを妨げています。", "Only do this if you have no other device to complete verification with.": "認証を行える端末がない場合のみ行ってください。", "You may contact me if you have any follow up questions": "追加で確認が必要な事項がある場合は、連絡可", - "Verified devices": "認証済の端末", "Sends the given message as a spoiler": "選択したメッセージをネタバレとして送信", "There was a problem communicating with the homeserver, please try again later.": "ホームサーバーとの通信時に問題が発生しました。後でもう一度やり直してください。", "The email address doesn't appear to be valid.": "メールアドレスが正しくありません。", @@ -2677,7 +2664,6 @@ "The poll has ended. No votes were cast.": "アンケートが終了しました。投票はありませんでした。", "Value in this room:": "このルームでの値:", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "シングルサインオンを使用して本人確認を行い、端末からのログアウトを承認してください。", - "Unable to load device list": "端末の一覧を読み込めません", "Click the button below to confirm signing out these devices.|one": "下のボタンをクリックして、端末からのログアウトを承認してください。", "Click the button below to confirm signing out these devices.|other": "下のボタンをクリックして、端末からのログアウトを承認してください。", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "シングルサインオンを使用して本人確認を行い、端末からのログアウトを承認してください。", @@ -2738,7 +2724,6 @@ "Error saving notification preferences": "通知の設定を保存する際にエラーが発生しました", "Updating spaces... (%(progress)s out of %(count)s)|other": "スペースを更新しています…(計%(count)s個のうち%(progress)s個)", "Message search initialisation failed": "メッセージの検索機能の初期化に失敗しました", - "Your homeserver does not support device management.": "このホームサーバーは端末の管理に対応していません。", "Failed to update the visibility of this space": "このスペースの見え方の更新に失敗しました", "Your server requires encryption to be enabled in private rooms.": "このサーバーでは、非公開のルームでは暗号化を有効にする必要があります。", "Your Security Key is in your Downloads folder.": "セキュリティーキーはダウンロード先のフォルダーにあります。", @@ -2797,7 +2782,6 @@ "Invalid base_url for m.homeserver": "m.homeserverの不正なbase_url", "Skip verification for now": "認証をスキップ", "Unable to verify this device": "この端末を認証できません", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "これは実験的な機能です。現在、招待を受け取る新規ユーザーが実際に参加するにはのリンクで招待を受け入れる必要があります。", "Go to my first room": "最初のルームに移動", "Failed to create initial space rooms": "最初のスペースのルームの作成に失敗しました", "Other users can invite you to rooms using your contact details": "他のユーザーはあなたの連絡先の情報を用いてルームに招待することができます", @@ -3084,9 +3068,6 @@ "Last activity": "直近のアクティビティー", "Other sessions": "その他のセッション", "Current session": "現在のセッション", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "新しいセッションマネージャーを使用すると、全てのセッションが見えやすくなり、遠隔からプッシュ通知を切り替えるなど、セッションをより容易に管理できるようになります。", - "New session manager": "新しいセッションマネージャー", - "Use new session manager": "新しいセッションマネージャーを使用", "Video room": "ビデオ通話ルーム", "Sessions": "セッション", "Spell check": "スペルチェック", @@ -3333,7 +3314,6 @@ "Sends the given message with hearts": "メッセージをハートと共に送信", "Don’t miss a reply or important message": "返信または重要なメッセージを見逃さないようにしましょう", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "あなたのホームサーバーがアシストサーバーを提供していない場合にのみ適用。IPアドレスが通話中に共有されます。", - "Allow fallback call assist server (turn.matrix.org)": "フォールバック用の通話アシストサーバーを許可(turn.matrix.org)", "Requires compatible homeserver.": "対応するホームサーバーが必要。", "Low bandwidth mode": "低速モード", "Record the client name, version, and url to recognise sessions more easily in session manager": "クライアントの名称、バージョン、URLを記録し、セッションマネージャーでより容易にセッションを認識できるよう設定", @@ -3353,18 +3333,7 @@ "Edit link": "リンクを編集", "Unable to decrypt message": "メッセージを復号化できません", "Connection error - Recording paused": "接続エラー - 録音を停止しました", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "残念ながら、復号化の鍵を要求できる認証済の端末がありません。他の端末でサインインし、その端末を認証すると、同様の事態を今後起こりにくくすることができます。", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "この端末は、復号化に使用する鍵を別の端末に要求しています。別の端末を使用すると、リクエストを迅速化できる可能性があります。", - "Open another device to load encrypted messages": "暗号化されたメッセージを読み込むには、別の端末を開いてください", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "復号化できない以前のメッセージにアクセスすることはできなくなりますが、鍵をリセットすると新しいメッセージを受信できるようになります。", - "Reset your keys to prevent future decryption errors": "今後復号化エラーが起こることを防ぐために、鍵をリセットしてください", - "This device was unable to decrypt some messages because it has not been verified yet.": "この端末はまだ認証されていないため、いくつかのメッセージを復号化できませんでした。", - "Verify this device to access all messages": "この端末を認証すると全てのメッセージにアクセスできます", - "Please wait as we try to decrypt your messages. This may take a few moments.": "メッセージの復号化を試みています。お待ちください。復号化には少々時間がかかる可能性があります。", "This message could not be decrypted": "このメッセージを復号化できませんでした", - "Some messages could not be decrypted": "いくつかのメッセージを復号化できませんでした", - "View your device list": "端末の一覧を表示", - "Resend key requests": "鍵のリクエストを再送信", "Favourite Messages": "お気に入りメッセージ", "Live Location Sharing": "位置情報(ライブ)の共有", "Currently experimental.": "現在実験中。", @@ -3442,7 +3411,6 @@ "Feeling experimental? Try out our latest ideas in development. These features are not finalised; they may be unstable, may change, or may be dropped altogether. Learn more.": "実験に参加したいですか?開発中のアイディアを試してください。これらの機能は完成していません。不安定な可能性や変更される可能性、また、開発が中止される可能性もあります。詳細を確認。", "Upcoming features": "今後の機能", "What's next for %(brand)s? Labs are the best way to get things early, test out new features and help shape them before they actually launch.": "%(brand)sのラボでは、最新の機能をいち早く使用したり、テストしたりできるほか、機能が実際にリリースされる前の改善作業を支援することができます。", - "Have greater visibility and control over all your sessions.": "改善したセッションの管理画面を使用します。", "Verify your current session for enhanced secure messaging.": "より安全なメッセージのやりとりのために、現在のセッションを認証しましょう。", "Your current session is ready for secure messaging.": "現在のセッションは安全なメッセージのやりとりに対応しています。", "Inactive for %(inactiveAgeDays)s+ days": "%(inactiveAgeDays)s日以上使用されていません", @@ -3664,7 +3632,6 @@ "Joining space…": "スペースに参加しています…", "Encrypting your message…": "メッセージを暗号化しています…", "Sending your message…": "メッセージを送信しています…", - "Decrypting messages…": "メッセージを復号化しています…", "Set a new account password…": "アカウントの新しいパスワードを設定…", "Downloading update…": "更新をダウンロードしています…", "Checking for an update…": "更新を確認しています…", diff --git a/src/i18n/strings/jbo.json b/src/i18n/strings/jbo.json index faa860187c6..2166cf642ad 100644 --- a/src/i18n/strings/jbo.json +++ b/src/i18n/strings/jbo.json @@ -143,7 +143,6 @@ "Authentication": "lo nu facki lo du'u do du ma kau", "Failed to set display name": ".i pu fliba lo nu galfi lo cmene", "OK": "je'e", - "Try using turn.matrix.org": ".i ko troci le ka pilno le se judri be zoi zoi. turn.matrix.org .zoi", "Custom (%(level)s)": "drata (%(level)s)", "Messages": "notci", "Actions": "ka'e se zukte", diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index b7432adb2fd..92d99f47e2f 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -290,7 +290,6 @@ "Please check your email and click on the link it contains. Once this is done, click continue.": "Ma ulac aɣilif, senqed imayl-ik/im syen sit ɣef useɣwen i yellan. Akken ara yemmed waya, sit ad tkemmleḍ.", "This will allow you to reset your password and receive notifications.": "Ayagi ad ak(akem)-yeǧǧ ad twennzeḍ awal-ik/im uffir yerna ad d-tremseḍ ilɣa.", "Call Failed": "Ur iddi ara usiwel", - "Try using turn.matrix.org": "Ɛreḍ aseqdec n turn.matrix.org", "You cannot place a call with yourself.": "Ur tezmireḍ ara a temsawaleḍ d yiman-ik.", "The file '%(fileName)s' failed to upload.": "Yegguma ad d-yali '%(fileName)s' ufaylu.", "Upload Failed": "Asali ur yeddi ara", @@ -345,7 +344,6 @@ "Failure to create room": "Timerna n texxamt ur teddi ara", "Call failed due to misconfigured server": "Ur yeddi ara usiwel ssebba n uqeddac ur nettuswel ara akken iwata", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Ttxil-k·m suter deg anedbal n uqeddac-ik·im agejdan (%(homeserverDomain)s) ad yeswel aqeddac TURN akken isawalen ad ddun akken ilaq.", - "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.": "Neɣ, tzemreḍ ad tεerḍed aseqdec n uqeddac azayez deg turn.matrix.org, maca ayagi ur yelhi ara, yezmer ad yebḍu tansa-inek·inem IP d uqeddac-a. Tzemreḍ ad tesferkeḍ daɣen ayagi deg yiɣewwaren.", "You do not have permission to start a conference call in this room": "Ur tesεiḍ ara tisirag ad tebduḍ asireg s usiwel deg texxamt-a", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Teɣzi n ufaylu-a '%(fileName)s' tεedda teɣzi yettusirgen sɣur aqeddac-a i usali", "Server may be unavailable, overloaded, or you hit a bug.": "Yezmer ulac aqeddac, yeččur ugar neɣ temlaleḍ-d d wabug.", diff --git a/src/i18n/strings/ko.json b/src/i18n/strings/ko.json index 88706de36ed..10ae8419dde 100644 --- a/src/i18n/strings/ko.json +++ b/src/i18n/strings/ko.json @@ -503,8 +503,6 @@ "Please contact your service administrator to continue using this service.": "이 서비스를 계속 사용하려면 서비스 관리자에게 연락하세요.", "Call failed due to misconfigured server": "잘못 구성된 서버로 전화에 실패함", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "전화가 안정적으로 작동하도록 TURN 서버를 설정하려면 당신의 홈서버 (%(homeserverDomain)s) 관리자에게 물어보세요 .", - "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를 사용해보세요", "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.": "서버가 지정된 방 버전을 지원하지 않습니다.", diff --git a/src/i18n/strings/lo.json b/src/i18n/strings/lo.json index c5a536366c8..aab21779404 100644 --- a/src/i18n/strings/lo.json +++ b/src/i18n/strings/lo.json @@ -251,8 +251,6 @@ "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "ໂທບໍ່ສຳເລັດ ເນື່ອງຈາກບໍ່ສາມາດເຂົ້າເຖິງໄມໂຄຣໂຟນໄດ້. ກວດເບິ່ງວ່າສຽບໄມໂຄຣໂຟນ ແລະ ຕັ້ງຄ່າໃຫ້ຖືກຕ້ອງ.", "Unable to access microphone": "ບໍ່ສາມາດເຂົ້າເຖິງໄມໂຄຣໂຟນໄດ້", "OK": "ຕົກລົງ", - "Try using turn.matrix.org": "ລອງໃຊ້ turn.matrix.org", - "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 ຂອງທ່ານກັບເຊີບເວີນັ້ນ. ທ່ານຍັງສາມາດຈັດການສິ່ງນີ້ໄດ້ໂດຍການຕັ້ງຄ່າ.", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "ກະລຸນາຕິດຕໍ່ຜູ້ຄຸ້ມຄອງສະຖານີຂອງທ່ານ (%(homeserverDomain)s) ເພື່ອກໍານົດຄ່າຂອງ TURN Server ເພື່ອໃຫ້ການໂທເຮັດວຽກໄດ້ຢ່າງສະຖຽນ.", "Call failed due to misconfigured server": "ການໂທບໍ່ສຳເລັດເນື່ອງຈາກເຊີບເວີຕັ້ງຄ່າຜິດພາດ", "The call was answered on another device.": "ການຮັບສາຍຢູ່ໃນອຸປະກອນອື່ນ.", @@ -517,11 +515,8 @@ "Spaces are ways to group rooms and people. Alongside the spaces you're in, you can use some pre-built ones too.": "ພຶ້ນທີ່ເປັນຊ່ອງທາງໃນການຈັດກຸ່ມຫ້ອງ ແລະ ຄົນ. ຄຽງຄູ່ກັບສະຖານທີ່ທີ່ທ່ານຢູ່ໃນ, ທ່ານສາມາດນໍາໃຊ້ບາງບ່ອນທີ່ສ້າງຂຶ້ນກ່ອນໄດ້ເຊັ່ນກັນ.", "Spaces to show": "ພຶ້ນທີ່ຈະສະແດງ", "Sidebar": "ແຖບດ້ານຂ້າງ", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "ຈັດການອຸປະກອນທີ່ເຂົ້າສູ່ລະບົບຂອງທ່ານຂ້າງລຸ່ມນີ້. ຊື່ຂອງອຸປະກອນແມ່ນເບິ່ງເຫັນໄດ້ຕໍ່ກັບຄົນທີ່ທ່ານຕິດຕໍ່ສື່ສານ.", - "Where you're signed in": "ບ່ອນທີ່ທ່ານເຂົ້າສູ່ລະບົບ", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "ແບ່ງປັນຂໍ້ມູນທີ່ບໍ່ເປີດເຜີຍຊື່ເພື່ອຊ່ວຍໃຫ້ພວກເຮົາລະບຸບັນຫາ. ບໍ່ມີຫຍັງເປັນສ່ວນຕົວ. ບໍ່ມີພາກສ່ວນທີສາມ.", "Privacy": "ຄວາມເປັນສ່ວນຕົວ", - "Okay": "ຕົກລົງ", "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "ຜູ້ຄຸມເຊີບເວີຂອງທ່ານໄດ້ປິດການນຳໃຊ້ການເຂົ້າລະຫັດແບບຕົ້ນທາງຮອດປາຍທາງໂດຍຄ່າເລີ່ມຕົ້ນໃນຫ້ອງສ່ວນຕົວ ແລະ ຂໍ້ຄວາມໂດຍກົງ.", "Cross-signing": "ການເຂົ້າລະຫັດແບບໄຂ້ວ", "Message search": "ຄົ້ນຫາຂໍ້ຄວາມ", @@ -958,7 +953,6 @@ "Let's create a room for each of them.": "ສ້າງຫ້ອງສໍາລັບແຕ່ລະຄົນ.", "What are some things you want to discuss in %(spaceName)s?": "ມີຫຍັງແດ່ທີ່ທ່ານຕ້ອງການທີ່ຈະສົນທະນາໃນ %(spaceName)s?", "Invite by username": "ເຊີນໂດຍຊື່ຜູ້ໃຊ້", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "ນີ້ແມ່ນການທົດລອງຄຸນສົມບັດ. ໃນປັດຈຸບັນ, ສໍາລັບຜູ້ໃຊ້ໃຫມ່ທີ່ໄດ້ຮັບການເຊີນຈະຕ້ອງໄດ້ເປີດຄໍາເຊີນຢູ່ໃນ ເພື່ອເຂົ້າຮ່ວມຕົວຈິງ.", "Make sure the right people have access. You can invite more later.": "ໃຫ້ແນ່ໃຈວ່າບຸກຄົນທີ່ຖືກຕ້ອງມີການເຂົ້າເຖິງ. ທ່ານສາມາດເຊີນເພີ່ມເຕີມໄດ້ໃນພາຍຫຼັງ.", "Invite your teammates": "ເຊີນເພື່ອນຮ່ວມທີມຂອງທ່ານ", "Failed to invite the following users to your space: %(csvUsers)s": "ການເຊີນຜູ້ໃຊ້ຕໍ່ໄປນີ້ໄປຫາພື້ນທີ່ຂອງທ່ານ: %(csvUsers)s ບໍ່ສຳເລັດ", @@ -1632,11 +1626,7 @@ "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "ຢືນຢັນແຕ່ລະລະບົບທີ່ໃຊ້ໂດຍຜູ້ໃຊ້ເພື່ອໝາຍວ່າເປັນທີ່ໜ້າເຊື່ອຖືໄດ້, ບໍ່ໄວ້ໃຈອຸປະກອນທີ່ cross-signed.", "Rename": "ປ່ຽນຊື່", "Display Name": "ຊື່ສະແດງ", - "Sign Out": "ອອກຈາກລະບົບ", "Failed to set display name": "ກຳນົດການສະເເດງຊື່ບໍ່ສຳເລັດ", - "This device": "ອຸປະກອນນີ້", - "You aren't signed into any other devices.": "ທ່ານຍັງບໍ່ໄດ້ເຂົ້າສູ່ລະບົບອຸປະກອນອື່ນໃດ.", - "Sign out %(count)s selected devices|one": "ອອກຈາກລະບົບ %(count)s ອຸປະກອນທີ່ເລືອກ", "Reset event store": "ກູ້ຄືນທີ່ຈັດເກັບ", "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": "ຖ້າທ່ານດຳເນິນການ, ກະລຸນາຮັບຊາບວ່າຂໍ້ຄວາມຂອງທ່ານຈະບໍ່ຖືກລຶບ, ແຕ່ການຊອກຫາອາດຈະຖືກຫຼຸດໜ້ອຍລົງເປັນເວລາສອງສາມນາທີໃນຂະນະທີ່ດັດສະນີຈະຖືກສ້າງໃໝ່", "You most likely do not want to reset your event index store": "ສ່ວນຫຼາຍແລ້ວທ່ານບໍ່ຢາກຈະກູ້ຄືນດັດສະນີຂອງທ່ານ", @@ -2525,8 +2515,6 @@ "Email (optional)": "ອີເມວ (ທາງເລືອກ)", "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "ກະລຸນາຮັບຊາບວ່າ, ຖ້າທ່ານບໍ່ເພີ່ມອີເມວ ແລະ ລືມລະຫັດຜ່ານຂອງທ່ານ, ທ່ານອາດ ສູນເສຍການເຂົ້າເຖິງບັນຊີຂອງທ່ານຢ່າງຖາວອນ.", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "ຢືນຢັນການອອກຈາກລະບົບອຸປະກອນເຫຼົ່ານີ້ໂດຍໃຊ້ລະບົບປະຕູດຽວ( SSO) ເພື່ອພິສູດຕົວຕົນຂອງທ່ານ.", - "Unable to load device list": "ບໍ່ສາມາດໂຫຼດລາຍຊື່ອຸປະກອນໄດ້", - "Your homeserver does not support device management.": "homeserver ຂອງທ່ານບໍ່ຮອງຮັບການຈັດການອຸປະກອນ.", "Session key:": "ກະແຈລະບົບ:", "Session ID:": "ID ລະບົບ:", "Cryptography": "ການເຂົ້າລະຫັດລັບ", @@ -2621,10 +2609,6 @@ "Remove them from everything I'm able to": "ລຶບອອກຈາກທຸກສິ່ງທີ່ຂ້ອຍສາມາດເຮັດໄດ້", "Remove from %(roomName)s": "ລຶບອອກຈາກ %(roomName)s", "Disinvite from %(roomName)s": "ຍົກເລີກເຊີນຈາກ %(roomName)s", - "Sign out %(count)s selected devices|other": "ອອກຈາກລະບົບ %(count)s ອຸປະກອນທີ່ເລືອກ", - "Devices without encryption support": "ອຸປະກອນທີ່ບໍ່ສະຫນັບສະຫນູນການເຂົ້າລະຫັດ", - "Unverified devices": "ອຸປະກອນທີ່ບໍ່ໄດ້ຮັບການກວດສອບ", - "Verified devices": "ອຸປະກອນທີ່ກວດສອບໄດ້", "Select all": "ເລືອກທັງຫມົດ", "Deselect all": "ຍົກເລີກການເລືອກທັງໝົດ", "Authentication": "ການຢືນຢັນ", diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index e0ac3759e56..8b4843579b8 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -429,8 +429,6 @@ "Your %(brand)s is misconfigured": "Jūsų %(brand)s yra neteisingai sukonfigūruotas", "Call failed due to misconfigured server": "Skambutis nepavyko dėl neteisingai sukonfigūruoto serverio", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Paprašykite savo serverio administratoriaus (%(homeserverDomain)s) sukonfiguruoti TURN serverį, kad skambučiai veiktų patikimai.", - "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.": "Alternatyviai, jūs galite bandyti naudoti viešą serverį turn.matrix.org, bet tai nebus taip patikima, ir tai atskleis jūsų IP adresą šiam serveriui. Jūs taip pat galite tvarkyti tai Nustatymuose.", - "Try using turn.matrix.org": "Bandyti naudojant turn.matrix.org", "The file '%(fileName)s' failed to upload.": "Failo '%(fileName)s' nepavyko įkelti.", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Failas '%(fileName)s' viršyja šio serverio įkeliamų failų dydžio limitą", "The server does not support the room version specified.": "Serveris nepalaiko nurodytos kambario versijos.", @@ -1803,21 +1801,11 @@ "Anyone can find and join.": "Bet kas gali rasti ir prisijungti.", "Only invited people can join.": "Tik pakviesti žmonės gali prisijungti.", "Private (invite only)": "Privatus (tik su pakvietimu)", - "Unable to load device list": "Nepavyko įkelti įrenginių sąrašo", - "Your homeserver does not support device management.": "Jūsų namų serveris nepalaiko įrenginių valdymo.", - "You aren't signed into any other devices.": "Jūs nesate prisijungę prie jokių kitų įrenginių.", "Click the button below to confirm signing out these devices.|other": "Spustelėkite mygtuką žemiau kad patvirtinti šių įrenginių atjungimą.", "Click the button below to confirm signing out these devices.|one": "Spustelėkite mygtuką žemiau kad patvirtinti šio įrenginio atjungimą.", - "Sign out %(count)s selected devices|one": "Atjungti %(count)s pasirinktą įrenginį", - "Sign out %(count)s selected devices|other": "Atjungti %(count)s pasirinktus įrenginius", "Rename": "Pervadinti", "Deselect all": "Nuimti pasirinkimą nuo visko", - "Devices without encryption support": "Įrenginia be šifravimo palaikymo", - "Unverified devices": "Nepatvirtinti įrenginiai", - "Verified devices": "Patvirtinti įrenginiai", "Select all": "Pasirinkti viską", - "Sign Out": "Atsijungti", - "This device": "Šis įrenginys", "Sign out devices|other": "Atjungti įrenginius", "Sign out devices|one": "Atjungti įrenginį", "Decide who can view and join %(spaceName)s.": "Nuspręskite kas gali peržiūrėti ir prisijungti prie %(spaceName)s.", @@ -2050,10 +2038,7 @@ "For best security, verify your sessions and sign out from any session that you don't recognize or use anymore.": "Kad užtikrintumėte geriausią saugumą, patikrinkite savo sesijas ir atsijunkite iš bet kurios sesijos, kurios neatpažįstate arba nebenaudojate.", "Other sessions": "Kitos sesijos", "Sessions": "Sesijos", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Toliau tvarkykite prisijungusius įrenginius. Prietaiso pavadinimas matomas žmonėms, su kuriais bendraujate.", - "Where you're signed in": "Kur esate prisijungę", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Bendrinti anoniminius duomenis, kurie padės mums nustatyti problemas. Nieko asmeniško. Jokių trečiųjų šalių.", - "Okay": "Gerai", "You have no ignored users.": "Nėra ignoruojamų naudotojų.", "Enable hardware acceleration (restart %(appName)s to take effect)": "Įjungti aparatinį pagreitinimą (kad įsigaliotų, iš naujo paleiskite %(appName)s)", "Images, GIFs and videos": "Paveikslėliai, GIF ir vaizdo įrašai", diff --git a/src/i18n/strings/lv.json b/src/i18n/strings/lv.json index 7368e37d834..59c9abff510 100644 --- a/src/i18n/strings/lv.json +++ b/src/i18n/strings/lv.json @@ -634,7 +634,6 @@ "The file '%(fileName)s' failed to upload.": "'%(fileName)s' augšupielāde neizdevās.", "You've reached the maximum number of simultaneous calls.": "Ir sasniegts maksimālais vienaicīgu zvanu skaits.", "Too Many Calls": "Pārāk daudz zvanu", - "Try using turn.matrix.org": "Mēģiniet izmantot turn.matrix.org", "Session key:": "Sesijas atslēga:", "Session ID:": "Sesijas ID:", "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Uzskatīt par uzticamām tikai individuāli verificētas lietotāja sesijas, nepaļaujoties uz ierīču cross-signing funkcionalitāti.", @@ -1458,7 +1457,6 @@ "Unable to access webcam / microphone": "Nevar piekļūt kamerai / mikrofonam", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Zvans neizdevās, jo nebija piekļuves mikrofonam. Pārliecinieties, vai mikrofons ir pievienots un pareizi konfigurēts.", "Unable to access microphone": "Nav pieejas mikrofonam", - "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.": "Varat arī iemēģināt izmantot publisko serveri vietnē turn.matrix.org , taču tas nebūs tik droši, un šajā serverī nonāks jūsu IP adrese. To var arī pārvaldīt iestatījumos.", "The call was answered on another device.": "Uz zvanu tika atbildēts no citas ierīces.", "Answered Elsewhere": "Atbildēja citur", "The call could not be established": "Savienojums nevarēja tikt izveidots", diff --git a/src/i18n/strings/nb_NO.json b/src/i18n/strings/nb_NO.json index d31936dd452..b454d6d26cd 100644 --- a/src/i18n/strings/nb_NO.json +++ b/src/i18n/strings/nb_NO.json @@ -111,8 +111,6 @@ "Changes your avatar in this current room only": "Endrer avataren din kun i det nåværende rommet", "Call failed due to misconfigured server": "Oppringingen feilet på grunn av feil-konfigurert tjener", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Vennligst be administratoren av din hjemmetjener (%(homeserverDomain)s) til å konfigurere en TURN tjener slik at samtaler vil fungere best mulig.", - "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.": "Alternativt kan du prøve å bruke felles tjeneren turn.matrix.org, men dette vil ikke bli like stabilt. I tillegg vil din IP adresse bli delt med denne tjeneren. Dette kan du endre i Innstillinger.", - "Try using turn.matrix.org": "Prøv å bruke turn.matrix.org", "OK": "OK", "Continue": "Fortsett", "The file '%(fileName)s' failed to upload.": "Filen '%(fileName)s' kunne ikke lastes opp.", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index d4cc102bd32..fde8fcc90b8 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -959,8 +959,6 @@ "Command Help": "Hulp bij opdrachten", "Call failed due to misconfigured server": "Oproep mislukt door verkeerd geconfigureerde server", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Vraag je homeserver-beheerder (%(homeserverDomain)s) een TURN-server te configureren voor de betrouwbaarheid van de oproepen.", - "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.": "Je kan ook de publieke server op turn.matrix.org gebruiken, maar dit zal minder betrouwbaar zijn, en zal jouw IP-adres met die server delen. Je kan dit ook beheren in de Instellingen.", - "Try using turn.matrix.org": "Probeer turn.matrix.org te gebruiken", "Identity server has no terms of service": "De identiteitsserver heeft geen dienstvoorwaarden", "The identity server you have chosen does not have any terms of service.": "De identiteitsserver die je hebt gekozen heeft geen dienstvoorwaarden.", "Only continue if you trust the owner of the server.": "Ga enkel verder indien je de eigenaar van de server vertrouwt.", @@ -2301,7 +2299,6 @@ "You have no ignored users.": "Je hebt geen persoon genegeerd.", "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.", "Select a room below first": "Start met selecteren van een kamer hieronder", "Join the beta": "Beta inschakelen", "Leave the beta": "Beta verlaten", @@ -2676,17 +2673,7 @@ "Click the button below to confirm signing out these devices.|other": "Klik op onderstaande knop om het uitloggen van deze apparaten te bevestigen.", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Bevestig je identiteit met eenmalig inloggen om dit apparaat uit te loggen.", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "Bevestig je identiteit met eenmalig inloggen om deze apparaten uit te loggen.", - "Unable to load device list": "Kan apparatenlijst niet laden", - "Your homeserver does not support device management.": "Jouw homeserver ondersteunt geen apparaatbeheer.", "Use a more compact 'Modern' layout": "Compacte 'Moderne'-indeling gebruiken", - "Sign Out": "Uitloggen", - "This device": "Dit apparaat", - "You aren't signed into any other devices.": "Je bent niet ingelogd op andere apparaten.", - "Sign out %(count)s selected devices|one": "%(count)s geselecteerd apparaat uitloggen", - "Sign out %(count)s selected devices|other": "%(count)s geselecteerde apparaten uitloggen", - "Devices without encryption support": "Apparaten zonder versleuteling ondersteuning", - "Unverified devices": "Ongeverifieerde apparaten", - "Verified devices": "Geverifieerde apparaten", "Other rooms": "Andere kamers", "Automatically send debug logs on any error": "Automatisch foutenlogboek versturen bij een fout", "Rename": "Hernoemen", @@ -2737,8 +2724,6 @@ "Home is useful for getting an overview of everything.": "Home is handig om een overzicht van alles te krijgen.", "Spaces to show": "Spaces om te tonen", "Sidebar": "Zijbalk", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Beheer jouw ingelogde apparaten hieronder. De naam van een apparaat is zichtbaar voor personen met wie je communiceert.", - "Where you're signed in": "Waar je bent ingelogd", "Show tray icon and minimise window to it on close": "Geef een pictogram weer in de systeembalk en minimaliseer het venster wanneer het wordt gesloten", "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 spaces waar je geen beheerder van bent. In deze spaces zal de oude kamer nog worden getoond, maar leden zullen een melding krijgen om deel te nemen aan de nieuwe kamer.", "Large": "Groot", @@ -2786,7 +2771,6 @@ "%(count)s votes cast. Vote to see the results|other": "%(count)s stemmen uitgebracht. Stem om de resultaten te zien", "No votes cast": "Geen stemmen uitgebracht", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Deel anonieme gedragsdata om ons te helpen problemen te identificeren. Geen persoonsgegevens. Geen derde partijen.", - "Okay": "Oké", "To view all keyboard shortcuts, click here.": "Om alle sneltoetsen te bekijken, klik hier.", "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "Deel anonieme data om ons problemen te laten opsporen. Geen persoonsgegeven. Geen derde partijen. Lees Meer", "You previously consented to share anonymous usage data with us. We're updating how that works.": "Je hebt eerder ingestemd met het verzamelen van anonieme gedragsdata met ons. We updaten nu hoe dit werkt.", @@ -3449,10 +3433,6 @@ "Fill screen": "Scherm vullen", "Sorry — this call is currently full": "Sorry — dit gesprek is momenteel vol", "Record the client name, version, and url to recognise sessions more easily in session manager": "Noteer de naam, versie en url van de applicatie om sessies gemakkelijker te herkennen in sessiebeheer", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Onze nieuwe sessiemanager biedt een betere zichtbaarheid van al uw sessies en meer controle erover, inclusief de mogelijkheid om op afstand pushmeldingen in te schakelen.", - "Have greater visibility and control over all your sessions.": "Meer zichtbaarheid en controle over al uw sessies.", - "New session manager": "Nieuwe sessiemanager", - "Use new session manager": "Nieuwe sessiemanager gebruiken", "New group call experience": "Nieuwe ervaring voor groepsgesprekken", "Element Call video rooms": "Element Call videokamers", "Notifications silenced": "Meldingen stilgezet", diff --git a/src/i18n/strings/nn.json b/src/i18n/strings/nn.json index df0c1053fbe..24d392bdafd 100644 --- a/src/i18n/strings/nn.json +++ b/src/i18n/strings/nn.json @@ -562,8 +562,6 @@ "Add Phone Number": "Legg til telefonnummer", "Call failed due to misconfigured server": "Samtalen gjekk gale fordi tenaren er oppsatt feil", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Spør administratoren for din heimetenar%(homeserverDomain)s om å setje opp ein \"TURN-server\" slik at talesamtalar fungerer på rett måte.", - "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.": "Alternativt, kan du prøva å nytta den offentlege tenaren på turn.matrix.org, men det kan vera mindre stabilt og IP-adressa di vil bli delt med den tenaren. Du kan og endra på det under Innstillingar.", - "Try using turn.matrix.org": "Prøv med å nytta turn.matrix.org", "The file '%(fileName)s' failed to upload.": "Fila '%(fileName)s' vart ikkje lasta opp.", "The server does not support the room version specified.": "Tenaren støttar ikkje den spesifikke versjonen av rommet.", "Messages": "Meldingar", @@ -1007,7 +1005,6 @@ "Click the button below to confirm signing out these devices.|one": "Trykk på knappen under for å stadfesta utlogging frå denne eininga.", "Confirm signing out these devices|one": "Stadfest utlogging frå denne eininga", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Stadfest utlogging av denne eininga ved å nytta Single-sign-on for å bevise identiteten din.", - "This device": "Denne eininga", "Changing your password on this homeserver will cause all of your other devices to be signed out. This will delete the message encryption keys stored on them, and may make encrypted chat history unreadable.": "Ved å endra passord på denne heimetenaren vil du bli logga ut frå alle andre einingar. Krypteringsnøklane som er lagra der vil bli sletta, og samtale-historikken din kan bli uleseleg.", "Verify this device by confirming the following number appears on its screen.": "Verifiser denne eininga ved å stadfeste det følgjande talet når det kjem til syne på skjermen.", "Quick settings": "Hurtigval", diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 708d560fb52..57705294c11 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -84,10 +84,10 @@ "and %(count)s others...|one": "i jeden inny...", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Nie można nawiązać połączenia z serwerem - proszę sprawdź twoje połączenie, upewnij się, że certyfikat SSL serwera jest zaufany, i że dodatki przeglądarki nie blokują żądania.", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Nie można nawiązać połączenia z serwerem przy użyciu HTTP podczas korzystania z HTTPS dla bieżącej strony. Użyj HTTPS lub włącz niebezpieczne skrypty.", - "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s zmienił(a) poziom mocy %(powerLevelDiffText)s.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s zmienił(a) nazwę pokoju na %(roomName)s.", + "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s zmienił poziom uprawnień %(powerLevelDiffText)s.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s zmienił nazwę pokoju na %(roomName)s.", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s usunął nazwę pokoju.", - "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s zmienił(a) temat na \"%(topic)s\".", + "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s zmienił temat na \"%(topic)s\".", "Changes your display nickname": "Zmienia Twój wyświetlany pseudonim", "Command error": "Błąd polecenia", "Commands": "Polecenia", @@ -145,11 +145,11 @@ "Publish this room to the public in %(domain)s's room directory?": "Czy opublikować ten pokój dla ogółu w spisie pokojów domeny %(domain)s?", "Logout": "Wyloguj", "Low priority": "Niski priorytet", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s uczynił(a) przyszłą historię pokoju widoczną dla wszystkich członków pokoju, od momentu ich zaproszenia.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s uczynił(a) przyszłą historię pokoju widoczną dla wszystkich członków pokoju, od momentu ich dołączenia.", - "%(senderName)s made future room history visible to all room members.": "%(senderName)s uczynił(a) przyszłą historię pokoju widoczną dla wszystkich członków pokoju.", - "%(senderName)s made future room history visible to anyone.": "%(senderName)s uczynił(a) przyszłą historię pokoju widoczną dla każdego.", - "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s uczynił(a) przyszłą historię pokoju widoczną dla nieznany (%(visibility)s).", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla wszystkich członków pokoju, od momentu ich zaproszenia.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla wszystkich członków pokoju, od momentu ich dołączenia.", + "%(senderName)s made future room history visible to all room members.": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla wszystkich członków pokoju.", + "%(senderName)s made future room history visible to anyone.": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla każdego.", + "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s uczynił przyszłą historię pokoju widoczną dla nieznanych (%(visibility)s).", "Missing room_id in request": "Brakujące room_id w żądaniu", "Missing user_id in request": "Brakujące user_id w żądaniu", "Moderator": "Moderator", @@ -179,7 +179,7 @@ "%(brand)s does not have permission to send you notifications - please check your browser settings": "%(brand)s nie ma uprawnień, by wysyłać Ci powiadomienia - sprawdź ustawienia swojej przeglądarki", "Historical": "Historyczne", "%(brand)s was not given permission to send notifications - please try again": "%(brand)s nie otrzymał uprawnień do wysyłania powiadomień - spróbuj ponownie", - "%(brand)s version:": "wersja %(brand)s:", + "%(brand)s version:": "Wersja %(brand)s:", "Room %(roomId)s not visible": "Pokój %(roomId)s nie jest widoczny", "%(roomName)s does not exist.": "%(roomName)s nie istnieje.", "%(roomName)s is not accessible at this time.": "%(roomName)s nie jest dostępny w tym momencie.", @@ -187,7 +187,7 @@ "Save": "Zapisz", "Search failed": "Wyszukiwanie nie powiodło się", "%(senderDisplayName)s sent an image.": "%(senderDisplayName)s wysłał obraz.", - "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s wysłał(a) zaproszenie do %(targetDisplayName)s do dołączenia do pokoju.", + "%(senderName)s sent an invitation to %(targetDisplayName)s to join the room.": "%(senderName)s wysłał zaproszenie do %(targetDisplayName)s do dołączenia do pokoju.", "Server error": "Błąd serwera", "Server may be unavailable, overloaded, or search timed out :(": "Serwer może być niedostępny, przeciążony, lub upłynął czas wyszukiwania :(", "Server may be unavailable, overloaded, or you hit a bug.": "Serwer może być niedostępny, przeciążony, lub trafiłeś na błąd.", @@ -277,9 +277,9 @@ "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "Wyeksportowany plik pozwoli każdej osobie będącej w stanie go odczytać na deszyfrację jakichkolwiek zaszyfrowanych wiadomości, które możesz zobaczyć, tak więc zalecane jest zachowanie ostrożności. Aby w tym pomóc, powinieneś/aś wpisać hasło poniżej; hasło to będzie użyte do zaszyfrowania wyeksportowanych danych. Późniejsze zaimportowanie tych danych będzie możliwe tylko po uprzednim podaniu owego hasła.", "Idle": "Bezczynny", "Check for update": "Sprawdź aktualizacje", - "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s zmienił(a) awatar pokoju na ", + "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s zmienił awatar pokoju na ", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s usunął awatar pokoju.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s zmienił(a) awatar %(roomName)s", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s zmienił awatar %(roomName)s", "Not a valid %(brand)s keyfile": "Niepoprawny plik klucza %(brand)s", "Authentication check failed: incorrect password?": "Próba autentykacji nieudana: nieprawidłowe hasło?", "Do you want to set an email address?": "Czy chcesz ustawić adres e-mail?", @@ -296,7 +296,7 @@ "Ignored user": "Ignorowany użytkownik", "You are now ignoring %(userId)s": "Ignorujesz teraz %(userId)s", "You are no longer ignoring %(userId)s": "Nie ignorujesz już %(userId)s", - "%(senderName)s changed the pinned messages for the room.": "%(senderName)s zmienił(a) przypiętą wiadomość dla tego pokoju.", + "%(senderName)s changed the pinned messages for the room.": "%(senderName)s zmienił przypiętą wiadomość dla tego pokoju.", "Message Pinning": "Przypinanie wiadomości", "Send": "Wyślij", "Mirror local video feed": "Lustrzane odbicie wideo", @@ -305,7 +305,7 @@ "Enable URL previews by default for participants in this room": "Włącz domyślny podgląd URL dla uczestników w tym pokoju", "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges.": "Nie będziesz mógł cofnąć tej zmiany, ponieważ degradujesz swoje uprawnienia. Jeśli jesteś ostatnim użytkownikiem uprzywilejowanym w tym pokoju, nie będziesz mógł ich odzyskać.", "Ignore": "Ignoruj", - "Mention": "Wspomnij", + "Mention": "Wzmianka", "Invite": "Zaproś", "Send an encrypted reply…": "Wyślij zaszyfrowaną odpowiedź…", "Send an encrypted message…": "Wyślij zaszyfrowaną wiadomość…", @@ -400,7 +400,7 @@ "Opens the Developer Tools dialog": "Otwiera narzędzia deweloperskie", "Unignore": "Przestań ignorować", "Jump to read receipt": "Przeskocz do potwierdzenia odczytu", - "Share Link to User": "Udostępnij odnośnik do użytkownika", + "Share Link to User": "Udostępnij link użytkownika", "Replying": "Odpowiadanie", "Share room": "Udostępnij pokój", "Banned by %(displayName)s": "Zbanowany przez %(displayName)s", @@ -442,7 +442,7 @@ "You do not have permission to start a conference call in this room": "Nie posiadasz uprawnień do rozpoczęcia rozmowy grupowej w tym pokoju", "Unignored user": "Nieignorowany użytkownik", "Forces the current outbound group session in an encrypted room to be discarded": "Wymusza odrzucenie bieżącej sesji grupowej wychodzącej z zaszyfrowanego pokoju", - "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s ustawił(a) główny adres dla tego pokoju na %(address)s.", + "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s ustawił główny adres dla tego pokoju na %(address)s.", "%(senderName)s removed the main address for this room.": "%(senderName)s usunął główny adres tego pokoju.", "This homeserver has hit its Monthly Active User limit.": "Ten serwer osiągnął miesięczny limit aktywnego użytkownika.", "This homeserver has exceeded one of its resource limits.": "Ten serwer przekroczył jeden z limitów.", @@ -459,8 +459,8 @@ "This room is a continuation of another conversation.": "Ten pokój jest kontynuacją innej rozmowy.", "Click here to see older messages.": "Kliknij tutaj, aby zobaczyć starsze wiadomości.", "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s dołączyło %(count)s razy", - "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s dołączył(a) %(count)s razy", - "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s dołączył(a)", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s dołączył %(count)s razy", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s dołączył", "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s wyszło", "were invited %(count)s times|one": "zostało zaproszonych", "Updating %(brand)s": "Aktualizowanie %(brand)s", @@ -470,7 +470,7 @@ "%(brand)s now uses 3-5x less memory, by only loading information about other users when needed. Please wait whilst we resynchronise with the server!": "%(brand)s używa teraz 3-5x mniej pamięci, ładując informacje o innych użytkownikach tylko wtedy, gdy jest to konieczne. Poczekaj, aż ponownie zsynchronizujemy się z serwerem!", "If the other version of %(brand)s is still open in another tab, please close it as using %(brand)s on the same host with both lazy loading enabled and disabled simultaneously will cause issues.": "Jeśli inna wersja %(brand)s jest nadal otwarta w innej zakładce, proszę zamknij ją, ponieważ używanie %(brand)s na tym samym komputerze z włączonym i wyłączonym jednocześnie leniwym ładowaniem będzie powodować problemy.", "And %(count)s more...|other": "I %(count)s więcej…", - "Delete Backup": "Usuń Kopię Zapasową", + "Delete Backup": "Usuń kopię zapasową", "Unable to load! Check your network connectivity and try again.": "Nie można załadować! Sprawdź połączenie sieciowe i spróbuj ponownie.", "Use a few words, avoid common phrases": "Użyj kilku słów, unikaj typowych zwrotów", "Avoid repeated words and characters": "Unikaj powtarzających się słów i znaków", @@ -496,32 +496,32 @@ "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s dołączył i wyszedł %(count)s razy", "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s dołączył i wyszedł", "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)swyszło %(count)s razy", - "%(oneUser)sleft %(count)s times|other": "%(oneUser)sopuścił(a) %(count)s razy", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)sopuścił %(count)s razy", "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s dołączyło i wyszło", "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s dołączyło i wyszło %(count)s razy", "were invited %(count)s times|other": "zostało zaproszonych %(count)s razy", "were banned %(count)s times|one": "zostało zbanowanych", "were banned %(count)s times|other": "zostało zbanowanych %(count)s razy", "was banned %(count)s times|other": "został zbanowany %(count)s razy", - "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)szmienił(a) swój awatar %(count)s razy", - "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)szmienił(a) swój awatar", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)szmienił swój awatar %(count)s razy", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)szmienił swój awatar", "%(items)s and %(count)s others|other": "%(items)s i %(count)s innych", "%(items)s and %(count)s others|one": "%(items)s i jedna inna osoba", "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)szmieniło swój awatar", "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)szmieniło swój awatar %(count)s razy", - "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)szmienił(a) swoją nazwę", - "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)szmienił(a) swoją nazwę %(count)s razy", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)szmienił swoją nazwę", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)szmienił swoją nazwę %(count)s razy", "Add some now": "Dodaj teraz kilka", "Please review and accept all of the homeserver's policies": "Przeczytaj i zaakceptuj wszystkie zasady dotyczące serwera domowego", "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)swyszło i dołączyło ponownie %(count)s razy", "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)swyszło i dołączyło ponownie", "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s wyszedł i dołączył ponownie %(count)s razy", "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s wyszedł i dołączył ponownie", - "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)sodrzucił(a) ich zaproszenie %(count)s razy", - "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)sodrzucił(a) ich zaproszenie", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)sodrzucił ich zaproszenie %(count)s razy", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)sodrzucił ich zaproszenie", "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)sodrzuciło ich zaproszenia", - "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)swycofał(a) zaproszenie %(count)s razy", - "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)swycofał(a) zaproszenie", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)swycofał zaproszenie %(count)s razy", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)swycofał zaproszenie", "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)swycofało zaproszenie %(count)s razy", "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)swycofało zaproszenie", "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)szmieniło ich nazwę %(count)s razy", @@ -554,7 +554,7 @@ "Enable Emoji suggestions while typing": "Włącz podpowiedzi Emoji podczas pisania", "Show avatar changes": "Pokaż zmiany awatara", "This room has no topic.": "Ten pokój nie ma tematu.", - "%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s zaktualizował(a) ten pokój.", + "%(senderDisplayName)s upgraded this room.": "%(senderDisplayName)s zaktualizował ten pokój.", "Show display name changes": "Pokaż zmiany wyświetlanej nazwy", "Send typing notifications": "Wyślij powiadomienia o pisaniu", "I don't want my encrypted messages": "Nie chcę moich zaszyfrowanych wiadomości", @@ -677,10 +677,9 @@ "Notification sound": "Dźwięk powiadomień", "Set a new custom sound": "Ustaw nowy niestandardowy dźwięk", "Browse": "Przeglądaj", - "Once enabled, encryption cannot be disabled.": "Po włączeniu szyfrowanie nie może zostać wyłączone.", + "Once enabled, encryption cannot be disabled.": "Po włączeniu, szyfrowanie nie może zostać wyłączone.", "Go back": "Wróć", "Call failed due to misconfigured server": "Połączenie nie udało się przez błędną konfigurację serwera", - "Try using turn.matrix.org": "Spróbuj użyć serwera turn.matrix.org", "The file '%(fileName)s' failed to upload.": "Nie udało się przesłać pliku '%(fileName)s'.", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Plik '%(fileName)s' przekracza limit rozmiaru dla tego serwera głównego", "Ask your %(brand)s admin to check your config for incorrect or duplicate entries.": "Poproś swojego administratora %(brand)s by sprawdzić Twoją konfigurację względem niewłaściwych lub zduplikowanych elementów.", @@ -700,16 +699,15 @@ "Please supply a https:// or http:// widget URL": "Podaj adres URL widżeta, zaczynający się od http:// lub https://", "You cannot modify widgets in this room.": "Nie możesz modyfikować widżetów w tym pokoju.", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Poproś administratora swojego serwera głównego (%(homeserverDomain)s) by skonfigurował serwer TURN aby rozmowy działały bardziej niezawodnie.", - "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.": "Możesz również spróbować skorzystać z publicznego serwera turn.matrix.org, lecz nie będzie aż tak niezawodny i Twój adres IP zostanie przesłany temu serwerowi. Możesz zarządzać tym w Ustawieniach.", "Sends the given emote coloured as a rainbow": "Wysyła podaną emotkę w kolorach tęczy", "Displays list of commands with usages and descriptions": "Wyświetla listę komend z przykładami i opisami", - "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s ustawił(a) pokój jako publiczny dla każdego znającego link.", - "%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s ustawił(a) pokój jako tylko dla zaproszonych.", - "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s zmienił(a) zasadę dołączania na %(rule)s", - "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s pozwolił(a) by goście dołączali do pokoju.", - "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s zabronił(a) gościom dołączać do pokoju.", + "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s ustawił pokój jako publiczny dla każdego znającego link.", + "%(senderDisplayName)s made the room invite only.": "%(senderDisplayName)s ustawił pokój jako tylko dla zaproszonych.", + "%(senderDisplayName)s changed the join rule to %(rule)s": "%(senderDisplayName)s zmienił zasadę dołączania na %(rule)s", + "%(senderDisplayName)s has allowed guests to join the room.": "%(senderDisplayName)s pozwolił, by goście dołączali do pokoju.", + "%(senderDisplayName)s has prevented guests from joining the room.": "%(senderDisplayName)s zabronił gościom dołączać do pokoju.", "%(senderDisplayName)s changed guest access to %(rule)s": "%(senderDisplayName)s zmienił dostęp dla gości dla %(rule)s", - "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s odwołał(a) zaproszenie dla %(targetDisplayName)s aby dołączył do pokoju.", + "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s odwołał zaproszenie dla %(targetDisplayName)s, aby dołączył do pokoju.", "%(names)s and %(count)s others are typing …|one": "%(names)s i jedna osoba pisze…", "Cannot reach homeserver": "Błąd połączenia z serwerem domowym", "Ensure you have a stable internet connection, or get in touch with the server admin": "Upewnij się, że posiadasz stabilne połączenie internetowe lub skontaktuj się z administratorem serwera", @@ -764,11 +762,11 @@ "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Wyrażasz zgodę na warunki użytkowania serwera%(serverName)s aby pozwolić na odkrywanie Ciebie za pomocą adresu e-mail oraz numeru telefonu.", "Discovery": "Odkrywanie", "Deactivate account": "Dezaktywuj konto", - "Legal": "Warunki prawne", + "Legal": "Zasoby prawne", "Credits": "Podziękowania", "For help with using %(brand)s, click here.": "Aby uzyskać pomoc w używaniu %(brand)s, naciśnij tutaj.", - "For help with using %(brand)s, click here or start a chat with our bot using the button below.": "Aby uzyskać pomoc w używaniu %(brand)s, naciśnij tutaj lub uruchom rozmowę z naszym botem, za pomocą odnośnika poniżej.", - "Chat with %(brand)s Bot": "Rozmowa z Botem %(brand)sa", + "For help with using %(brand)s, click here or start a chat with our bot using the button below.": "Aby uzyskać pomoc w korzystaniu z %(brand)s, kliknij tutaj lub rozpocznij czat z botem za pomocą przycisku poniżej.", + "Chat with %(brand)s Bot": "Rozmowa z Botem %(brand)s", "FAQ": "Najczęściej zadawane pytania", "Always show the window menu bar": "Zawsze pokazuj pasek menu okna", "Add Email Address": "Dodaj adres e-mail", @@ -811,7 +809,7 @@ "Request media permissions": "Zapytaj o uprawnienia", "Voice & Video": "Głos i wideo", "View older messages in %(roomName)s.": "Wyświetl starsze wiadomości w %(roomName)s.", - "Room information": "Informacje o pokoju", + "Room information": "Informacje pokoju", "Uploaded sound": "Przesłano dźwięk", "Change history visibility": "Zmień widoczność historii", "Upgrade the room": "Zaktualizuj pokój", @@ -829,7 +827,7 @@ "Use an identity server in Settings to receive invites directly in %(brand)s.": "Użyj serwera tożsamości w Ustawieniach, aby otrzymywać zaproszenia bezpośrednio w %(brand)s.", "Do you want to chat with %(user)s?": "Czy chcesz rozmawiać z %(user)s?", "Do you want to join %(roomName)s?": "Czy chcesz dołączyć do %(roomName)s?", - " invited you": " zaprosił(a) CIę", + " invited you": " zaprosił Cię", "You're previewing %(roomName)s. Want to join it?": "Przeglądasz %(roomName)s. Czy chcesz dołączyć do pokoju?", "%(count)s unread messages including mentions.|other": "%(count)s nieprzeczytanych wiadomości, wliczając wzmianki.", "%(count)s unread messages including mentions.|one": "1 nieprzeczytana wzmianka.", @@ -837,13 +835,13 @@ "%(count)s unread messages.|one": "1 nieprzeczytana wiadomość.", "Unread messages.": "Nieprzeczytane wiadomości.", "Join": "Dołącz", - "%(creator)s created and configured the room.": "%(creator)s stworzył(a) i skonfigurował(a) pokój.", + "%(creator)s created and configured the room.": "%(creator)s stworzył i skonfigurował pokój.", "View": "Wyświetl", "Missing media permissions, click the button below to request.": "Brakuje uprawnień do mediów, kliknij przycisk poniżej, aby o nie zapytać.", "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)snie wykonało zmian %(count)s razy", "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)snie wykonało zmian", - "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)snie wykonał(a) zmian %(count)s razy", - "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)snie wykonał(a) zmian", + "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)snie wykonał zmian %(count)s razy", + "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)snie wykonał zmian", "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "Nie zdołano wczytać zdarzenia, na które odpowiedziano, może ono nie istnieć lub nie masz uprawnienia, by je zobaczyć.", "e.g. my-room": "np. mój-pokój", "Some characters not allowed": "Niektóre znaki niedozwolone", @@ -859,7 +857,7 @@ "Never send encrypted messages to unverified sessions from this session": "Nigdy nie wysyłaj zaszyfrowanych wiadomości do niezweryfikowanych sesji z tej sesji", "Enable desktop notifications for this session": "Włącz powiadomienia na pulpicie dla tej sesji", "Enable audible notifications for this session": "Włącz powiadomienia dźwiękowe dla tej sesji", - "Direct Messages": "Wiadomości bezpośrednie", + "Direct Messages": "Wiadomości prywatne", "Create Account": "Utwórz konto", "Sign In": "Zaloguj się", "a few seconds ago": "kilka sekund temu", @@ -980,16 +978,16 @@ "Setting up keys": "Konfigurowanie kluczy", "Verify this session": "Zweryfikuj tę sesję", "%(name)s is requesting verification": "%(name)s prosi o weryfikację", - "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s zmienił(a) nazwę pokoju z %(oldRoomName)s na %(newRoomName)s.", - "%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s dodał(a) alternatywne adresy %(addresses)s dla tego pokoju.", - "%(senderName)s added the alternative addresses %(addresses)s for this room.|one": "%(senderName)s dodał(a) alternatywny adres %(addresses)s dla tego pokoju.", - "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s zmienił(a) alternatywne adresy dla tego pokoju.", - "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s zmienił(a) główne i alternatywne adresy dla tego pokoju.", - "%(senderName)s changed the addresses for this room.": "%(senderName)s zmienił(a) adresy dla tego pokoju.", + "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s zmienił nazwę pokoju z %(oldRoomName)s na %(newRoomName)s.", + "%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s dodał alternatywne adresy %(addresses)s dla tego pokoju.", + "%(senderName)s added the alternative addresses %(addresses)s for this room.|one": "%(senderName)s dodał alternatywny adres %(addresses)s dla tego pokoju.", + "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s zmienił alternatywne adresy dla tego pokoju.", + "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s zmienił główne i alternatywne adresy dla tego pokoju.", + "%(senderName)s changed the addresses for this room.": "%(senderName)s zmienił adresy dla tego pokoju.", "%(senderName)s placed a voice call.": "%(senderName)s wykonał połączenie głosowe.", "%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s wykonał połączenie głosowe. (nie wspierane przez tę przeglądarkę)", - "%(senderName)s placed a video call.": "%(senderName)s wykonał(a) połączenie wideo.", - "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s wykonał(a) połączenie wideo. (nie obsługiwane przez tę przeglądarkę)", + "%(senderName)s placed a video call.": "%(senderName)s wykonał połączenie wideo.", + "%(senderName)s placed a video call. (not supported by this browser)": "%(senderName)s wykonał połączenie wideo. (nie obsługiwane przez tę przeglądarkę)", "Done": "Gotowe", "about a minute ago": "około minuty temu", "about an hour ago": "około godziny temu", @@ -1008,8 +1006,8 @@ "Terms of Service": "Warunki użytkowania", "Upload %(count)s other files|other": "Prześlij %(count)s innych plików", "Upload %(count)s other files|one": "Prześlij %(count)s inny plik", - "Send a Direct Message": "Wyślij wiadomość bezpośrednią", - "Explore Public Rooms": "Przeglądaj publiczne pokoje", + "Send a Direct Message": "Wyślij wiadomość prywatną", + "Explore Public Rooms": "Przeglądaj pokoje publiczne", "Create a Group Chat": "Utwórz czat grupowy", "Log in to your new account.": "Zaloguj się do nowego konta.", "Registration Successful": "Pomyślnie zarejestrowano", @@ -1059,7 +1057,7 @@ "Switch to dark mode": "Przełącz na tryb ciemny", "Switch theme": "Przełącz motyw", "All settings": "Wszystkie ustawienia", - "You're signed out": "Wylogowano", + "You're signed out": "Zostałeś wylogowany", "That matches!": "Zgadza się!", "New Recovery Method": "Nowy sposób odzyskiwania", "If disabled, messages from encrypted rooms won't appear in search results.": "Jeśli wyłączone, wiadomości z szyfrowanych pokojów nie pojawią się w wynikach wyszukiwania.", @@ -1085,7 +1083,7 @@ "Messages in this room are end-to-end encrypted.": "Wiadomości w tym pokoju są szyfrowane end-to-end.", "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Klucz podpisujący, który podano jest taki sam jak klucz podpisujący otrzymany od %(userId)s oraz sesji %(deviceId)s. Sesja została oznaczona jako zweryfikowana.", "Sends a message to the given user": "Wysyła wiadomość do wybranego użytkownika", - "Opens chat with the given user": "Otwiera rozmowę z wybranym użytkownikiem", + "Opens chat with the given user": "Otwiera czat z wybranym użytkownikiem", "Please supply a widget URL or embed code": "Proszę podać adres URL widżetu lub embed code", "Joins room with given address": "Dołącz do pokoju o wybranym adresie", "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Dodaje ( ͡° ͜ʖ ͡°) na początku wiadomości tekstowej", @@ -1101,7 +1099,7 @@ "Add widgets, bridges & bots": "Dodaj widżety, mostki i boty", "Forget this room": "Zapomnij o tym pokoju", "List options": "Ustawienia listy", - "Explore public rooms": "Przeglądaj publiczne pokoje", + "Explore public rooms": "Przeglądaj pokoje publiczne", "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Zmiany tego, kto może przeglądać historię wyszukiwania dotyczą tylko przyszłych wiadomości w pokoju. Widoczność wcześniejszej historii nie zmieni się.", "No other published addresses yet, add one below": "Brak innych opublikowanych adresów, dodaj jakiś poniżej", "Other published addresses:": "Inne opublikowane adresy:", @@ -1146,7 +1144,7 @@ "Feedback sent": "Wysłano opinię użytkownka", "Send feedback": "Wyślij opinię użytkownika", "Feedback": "Opinia użytkownika", - "%(creator)s created this DM.": "%(creator)s utworzył(a) tę wiadomość bezpośrednią.", + "%(creator)s created this DM.": "%(creator)s utworzył tę wiadomość prywatną.", "Welcome to %(appName)s": "Witamy w %(appName)s", "Now, let's help you get started": "Teraz pomożemy Ci zacząć", "Welcome %(name)s": "Witaj, %(name)s", @@ -1440,12 +1438,12 @@ "Room %(name)s": "Pokój %(name)s", "This is the start of .": "Oto początek .", "Add a photo, so people can easily spot your room.": "Dodaj zdjęcie, aby inni mogli łatwo zauważyć Twój pokój.", - "%(displayName)s created this room.": "%(displayName)s utworzył(a) ten pokój.", + "%(displayName)s created this room.": "%(displayName)s utworzył ten pokój.", "You created this room.": "Utworzyłeś ten pokój.", "Topic: %(topic)s ": "Temat: %(topic)s ", "Topic: %(topic)s (edit)": "Temat: %(topic)s (edytuj)", "Only the two of you are in this conversation, unless either of you invites anyone to join.": "Tylko Wy jesteście w tej konwersacji, dopóki ktoś z Was nie zaprosi tu innej osoby.", - "This is the beginning of your direct message history with .": "Oto początek historii Twojej rozmowy bezpośredniej z .", + "This is the beginning of your direct message history with .": "Oto początek Twojej historii wiadomości prywatnych z .", "Start chatting": "Rozpocznij rozmowę", " wants to chat": " chce porozmawiać", "Hide Widgets": "Ukryj widżety", @@ -1454,7 +1452,7 @@ "Change the name of this room": "Zmień nazwę tego pokoju", "Not Trusted": "Nie zaufany", "Ask this user to verify their session, or manually verify it below.": "Poproś go/ją o zweryfikowanie tej sesji bądź zweryfikuj ją osobiście poniżej.", - "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s%(userId)s zalogował(a) się do nowej sesji bez zweryfikowania jej:", + "%(name)s (%(userId)s) signed in to a new session without verifying it:": "%(name)s%(userId)s zalogował się do nowej sesji bez zweryfikowania jej:", "Verify your other session using one of the options below.": "Zweryfikuj swoje pozostałe sesje używając jednej z opcji poniżej.", "You signed in to a new session without verifying it:": "Zalogowałeś się do nowej sesji bez jej zweryfikowania:", "%(senderName)s changed a rule that was banning servers matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s zmienił regułę banującą serwery pasujące do wzorca na %(oldGlob)s ustawiając nowy wzorzec %(newGlob)s z powodu %(reason)s", @@ -1589,9 +1587,9 @@ "%(senderName)s started a call": "%(senderName)s rozpoczął połączenie", "You started a call": "Rozpocząłeś połączenie", "Call ended": "Połączenie zakończone", - "%(senderName)s ended the call": "%(senderName)s zakończył(a) połączenie", + "%(senderName)s ended the call": "%(senderName)s zakończył połączenie", "You joined the call": "Dołączyłeś do połączenia", - "%(senderName)s joined the call": "%(senderName)s dołączył(a) do połączenia", + "%(senderName)s joined the call": "%(senderName)s dołączył do połączenia", "Call in progress": "Połączenie w trakcie", "You ended the call": "Zakończyłeś połączenie", "New login. Was this you?": "Nowe logowanie. Czy to byłeś Ty?", @@ -1712,8 +1710,8 @@ "Show line numbers in code blocks": "Pokazuj numery wierszy w blokach kodu", "Expand code blocks by default": "Domyślnie rozwijaj bloki kodu", "Show stickers button": "Pokaż przycisk naklejek", - "Converts the DM to a room": "Zmienia wiadomości bezpośrednie w pokój", - "Converts the room to a DM": "Zmienia pokój w wiadomość bezpośrednią", + "Converts the DM to a room": "Zmienia wiadomości prywatne w pokój", + "Converts the room to a DM": "Zamienia pokój w wiadomość prywatną", "Sends the given message as a spoiler": "Wysyła podaną wiadomość jako spoiler", "User Busy": "Użytkownik zajęty", "The user you called is busy.": "Użytkownik, do którego zadzwoniłeś jest zajęty.", @@ -1729,7 +1727,7 @@ "Message preview": "Podgląd wiadomości", "Search for rooms or people": "Szukaj pokojów i ludzi", "Some suggestions may be hidden for privacy.": "Niektóre propozycje mogą być ukryte z uwagi na prywatność.", - "Or send invite link": "Lub wyślij odnośnik z zaproszeniem", + "Or send invite link": "Lub wyślij link z zaproszeniem", "Integration manager": "Menedżer integracji", "Integration managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "Zarządcy integracji otrzymują dane konfiguracji, mogą modyfikować widżety, wysyłać zaproszenia do pokojów i ustawiać poziom uprawnień w Twoim imieniu.", "Use an integration manager to manage bots, widgets, and sticker packs.": "Użyj zarządcy integracji aby zarządzać botami, widżetami i pakietami naklejek.", @@ -1750,7 +1748,7 @@ "%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s zmienił ACLe serwera dla pokoju.", "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Dodaje ┬──┬ ノ( ゜-゜ノ) na początku wiadomości tekstowej", "%(targetName)s accepted an invitation": "%(targetName)s zaakceptował zaproszenie", - "%(targetName)s accepted the invitation for %(displayName)s": "%(targetName)s zaakceptował(a) zaproszenie do %(displayName)s", + "%(targetName)s accepted the invitation for %(displayName)s": "%(targetName)s zaakceptował zaproszenie do %(displayName)s", "Takes the call in the current room off hold": "Odwiesza połączenie w obecnym pokoju", "No active call in this room": "Brak aktywnych połączeń w tym pokoju", "Places the call in the current room on hold": "Zawiesza połączenie w obecnym pokoju", @@ -1977,11 +1975,6 @@ "Hey you. You're the best!": "Hej, ty. Jesteś super!", "Message search initialisation failed": "Inicjalizacja wyszukiwania wiadomości nie powiodła się", "Rename": "Zmień nazwę", - "Sign Out": "Wyloguj", - "This device": "To urządzenie", - "Devices without encryption support": "Urządzenia bez wsparcia dla szyfrowania", - "Unverified devices": "Niezweryfikowane urządzenia", - "Verified devices": "Zweryfikowane urządzenia", "Select all": "Zaznacz wszystkie", "Deselect all": "Odznacz wszystkie", "Close dialog or context menu": "Zamknij dialog lub menu kontekstowe", @@ -2145,7 +2138,7 @@ "Unmute the microphone": "Wyłącz wyciszenie mikrofonu", "Mute the microphone": "Wycisz mikrofon", "Dialpad": "Klawiatura telefoniczna", - "%(peerName)s held the call": "%(peerName)s zawiesił(a) rozmowę", + "%(peerName)s held the call": "%(peerName)s zawiesił rozmowę", "You held the call Switch": "Zawieszono rozmowę Przełącz", "unknown person": "nieznana osoba", "Your camera is still enabled": "Twoja kamera jest nadal włączona", @@ -2234,9 +2227,9 @@ "Jump to start of the composer": "Przejdź do początku okna edycji", "Redo edit": "Ponów edycję", "Jump to last message": "Przejdź do ostatniej wiadomości", - "Previous room or DM": "Poprzedni pokój lub wiadomość bezpośrednia", - "Previous unread room or DM": "Poprzedni nieodczytany pokój lub wiadomość bezpośrednia", - "Next unread room or DM": "Następny nieodczytany pokój lub wiadomość bezpośrednia", + "Previous room or DM": "Poprzedni pokój lub wiadomość prywatna", + "Previous unread room or DM": "Poprzedni nieodczytany pokój lub wiadomość prywatna", + "Next unread room or DM": "Następny nieodczytany pokój lub wiadomość prywatna", "Open this settings tab": "Otwórz zakładkę ustawień", "Toggle right panel": "Przełącz prawy panel", "Toggle the top left menu": "Przełącz lewe górne menu", @@ -2249,14 +2242,12 @@ "Poll": "Ankieta", "Voice Message": "Wiadomość głosowa", "Join public room": "Dołącz do publicznego pokoju", - "Debug logs contain application usage data including your username, the IDs or aliases of the rooms you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Dzienniki debugowania zawierają dane o korzystaniu z aplikacji, w tym nazwę użytkownika, identyfikatory lub aliasy odwiedzonych pokoi, elementy interfejsu użytkownika, z którymi ostatnio wchodziłeś w interakcje, oraz nazwy użytkowników innych użytkowników. Nie zawierają treści wiadomości.", - "If you've submitted a bug via GitHub, debug logs can help us track down the problem. ": "Jeśli zgłosiłeś błąd za pomocą usługi GitHub, dzienniki debugowania mogą pomóc nam w wyśledzeniu problemu. ", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Dzienniki debugowania zawierają dane o korzystaniu z aplikacji, w tym nazwę użytkownika, identyfikatory lub aliasy odwiedzonych pokoi, elementy interfejsu użytkownika, z którymi ostatnio wchodziłeś w interakcje oraz nazwy innych użytkowników. Nie zawierają treści wiadomości.", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. ": "Jeśli zgłosiłeś błąd za pomocą serwisu GitHub, dzienniki debugowania mogą pomóc nam w namierzeniu problemu. ", "Seen by %(count)s people|one": "Odczytane przez %(count)s osobę", "Seen by %(count)s people|other": "Odczytane przez %(count)s osób", "New room": "Nowy pokój", "Group all your rooms that aren't part of a space in one place.": "Pogrupuj wszystkie pokoje, które nie są częścią przestrzeni, w jednym miejscu.", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Zarządzaj urządzeniami, na których jesteś zalogowany. Nazwa urządzenia jest widoczna dla osób, z którymi się komunikujesz.", - "Where you're signed in": "Miejsca, w których jesteś zalogowany", "Show all your rooms in Home, even if they're in a space.": "Pokaż wszystkie swoje pokoje na głównej, nawet jeśli znajdują się w przestrzeni.", "Activate selected button": "Aktywuj wybrany przycisk", "Copy room link": "Kopiuj link do pokoju", @@ -2265,7 +2256,7 @@ "Complete": "Uzupełnij", "Previous autocomplete suggestion": "Poprzednia sugestia autouzupełniania", "Next autocomplete suggestion": "Następna sugestia autouzupełniania", - "Next room or DM": "Następny pokój lub wiadomość bezpośrednia", + "Next room or DM": "Następny pokój lub wiadomość prywatna", "Accessibility": "Dostępność", "Dismiss read marker and jump to bottom": "Zignoruj znacznik odczytu i przejdź na dół", "Navigate to previous message in composer history": "Przejdź do poprzedniej wiadomości w historii kompozytora", @@ -2296,7 +2287,7 @@ "Cross-signing is ready for use.": "Weryfikacja krzyżowa jest gotowa do użycia.", "Your homeserver does not support cross-signing.": "Twój serwer domowy nie obsługuje weryfikacji krzyżowej.", "Clear cross-signing keys": "Wyczyść klucze weryfikacji krzyżowej", - "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Usunięcie kluczy weryfikacji krzyżowej jest trwałe. Każdy, z kim dokonano weryfikacji, zobaczy alerty bezpieczeństwa. Prawie na pewno nie chcesz tego robić, chyba że straciłeś(aś) każde urządzenie, z którego możesz weryfikować.", + "Deleting cross-signing keys is permanent. Anyone you have verified with will see security alerts. You almost certainly don't want to do this, unless you've lost every device you can cross-sign from.": "Usunięcie kluczy weryfikacji krzyżowej jest trwałe. Każdy, z kim dokonano weryfikacji, zobaczy alerty bezpieczeństwa. Prawie na pewno nie chcesz tego robić, chyba że straciłeś każde urządzenie, z którego możesz weryfikować.", "Destroy cross-signing keys?": "Zniszczyć klucze weryfikacji krzyżowej?", "a device cross-signing signature": "sygnatura weryfikacji krzyżowej urządzenia", "a new cross-signing key signature": "nowa sygnatura kluczu weryfikacji krzyżowej", @@ -2315,7 +2306,7 @@ "Verify with Security Key": "Weryfikacja za pomocą klucza bezpieczeństwa", "Verify with Security Key or Phrase": "Weryfikacja za pomocą klucza lub frazy bezpieczeństwa", "It looks like you don't have a Security Key or any other devices you can verify against. This device will not be able to access old encrypted messages. In order to verify your identity on this device, you'll need to reset your verification keys.": "Wygląda na to, że nie masz klucza bezpieczeństwa ani żadnych innych urządzeń, które mogą weryfikować Twoją tożsamość. To urządzenie nie będzie mogło uzyskać dostępu do wcześniejszych zaszyfrowanych wiadomości. Aby zweryfikować swoją tożsamość na tym urządzeniu, należy zresetować klucze weryfikacyjne.", - "If you've forgotten your Security Key you can ": "Jeśli zapomniałeś(aś) swojego klucza bezpieczeństwa, możesz ", + "If you've forgotten your Security Key you can ": "Jeśli zapomniałeś swojego klucza bezpieczeństwa, możesz ", "Access your secure message history and set up secure messaging by entering your Security Key.": "Uzyskaj dostęp do historii bezpiecznych wiadomości i skonfiguruj bezpieczne wiadomości, wprowadzając swój klucz bezpieczeństwa.", "Not a valid Security Key": "Nieprawidłowy klucz bezpieczeństwa", "This looks like a valid Security Key!": "Wygląda to na prawidłowy klucz bezpieczeństwa!", @@ -2359,10 +2350,6 @@ "Sorry — this call is currently full": "Przepraszamy — to połączenie jest już zapełnione", "Show NSFW content": "Pokaż zawartość NSFW", "Rust cryptography implementation": "Implementacja kryptografii Rust", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Nasz nowy menedżer sesji usprawnia widoczność wszystkich Twoich sesji i zwiększa ich kontrolę włączając możliwość zdalnego przełączania powiadomień push.", - "Have greater visibility and control over all your sessions.": "Miej lepszą kontrolę nad zalogowanymi sesjami.", - "New session manager": "Nowy menedżer sesji", - "Use new session manager": "Użyj nowego menedżera sesji", "Force 15s voice broadcast chunk length": "Wymuś 15s długość kawałków dla transmisji głosowej", "Under active development.": "W trakcie aktywnego rozwoju.", "Favourite Messages": "Ulubione wiadomości", @@ -2451,7 +2438,6 @@ "Log out and back in to disable": "Zaloguj się ponownie, aby wyłączyć", "Can currently only be enabled via config.json": "Można go tylko włączyć przez config.json", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "Stosuje się go tylko wtedy, kiedy Twój serwer domowy go nie oferuje. Twój adres IP zostanie współdzielony w trakcie połączenia.", - "Allow fallback call assist server (turn.matrix.org)": "Zezwól na awaryjne przełączenie na serwer pomocniczy (turn.matrix.org)", "Requires compatible homeserver.": "Wymaga kompatybilnego serwera domowego.", "Low bandwidth mode": "Tryb niskiej przepustowości", "Record the client name, version, and url to recognise sessions more easily in session manager": "Zapisz nazwę klienta, wersję i URL, aby łatwiej rozpoznawać sesje w menedżerze sesji", @@ -2523,7 +2509,7 @@ "This backup is trusted because it has been restored on this session": "Ta kopia jest zaufana, ponieważ została przywrócona w tej sesji", "Backup has a signature from unknown session with ID %(deviceId)s": "Kopia zapasowa ma sygnaturę od nieznanego użytkownika z ID %(deviceId)s", "Master private key:": "Główny klucz prywatny:", - "Changing your password on this homeserver will cause all of your other devices to be signed out. This will delete the message encryption keys stored on them, and may make encrypted chat history unreadable.": "Zmiana hasła na tym serwerze domowym wyloguje Cię z wszystkich pozostałych urządzeń. Klucze szyfrowania wiadomości zostaną usunięte, a historia wiadomości szyfrowanych może przepaść.", + "Changing your password on this homeserver will cause all of your other devices to be signed out. This will delete the message encryption keys stored on them, and may make encrypted chat history unreadable.": "Zmiana hasła na tym serwerze domowym wyloguje Cię z wszystkich pozostałych urządzeń. Ta akcja usunie wszystkie klucze szyfrujące znajdujące się na nich, uniemożliwiając czytanie historii wiadomości szyfrowanych.", "Backup is not signed by any of your sessions": "Kopia zapisowa nie jest podpisana przez żadną z Twoich sesji", "Backup has an invalid signature from unverified session ": "Kopia zapasowa ma nieprawidłową sygnaturę z niezweryfikowanej sesji ", "Backup has an invalid signature from verified session ": "Kopia zapasowa ma nieprawidłową sygnaturę z zweryfikowanej sesji ", @@ -2546,11 +2532,6 @@ "Securely cache encrypted messages locally for them to appear in search results.": "Bezpiecznie przechowuj lokalnie wiadomości szyfrowane, aby mogły się wyświetlać w wynikach wyszukiwania.", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "Bezpiecznie przechowuj lokalnie wiadomości szyfrowane, aby mogły się wyświetlać w wynikach wyszukiwania. Zostanie użyte %(size)s do przechowywania wiadomości z %(rooms)s pokoju.", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Bezpiecznie przechowuj lokalnie wiadomości szyfrowane, aby mogły się wyświetlać w wynikach wyszukiwania. Zostanie użyte %(size)s do przechowywania wiadomości z %(rooms)s pokoi.", - "You aren't signed into any other devices.": "Nie jesteś zalogowany na żadnym innym urządzeniu.", - "Sign out %(count)s selected devices|one": "Wyloguj %(count)s zaznaczone urządzenie", - "Sign out %(count)s selected devices|other": "Wyloguj %(count)s zaznaczonych urządzeń", - "Unable to load device list": "Nie można załadować listy urządzeń", - "Your homeserver does not support device management.": "Twój serwer domowy nie wspiera zarządzania urządzeniami.", "Homeserver feature support:": "Wsparcie funkcji serwera domowego:", "User signing private key:": "Podpisany przez użytkownika klucz prywatny:", "Self signing private key:": "Samo-podpisujący klucz prywatny:", @@ -2574,7 +2555,6 @@ "Are you sure you want to sign out of %(count)s sessions?|one": "Czy na pewno chcesz się wylogować z %(count)s sesji?", "Are you sure you want to sign out of %(count)s sessions?|other": "Czy na pewno chcesz się wylogować z %(count)s sesji?", "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Twój administrator serwera wyłączył szyfrowanie end-to-end domyślnie w pokojach prywatnych i wiadomościach bezpośrednich.", - "Okay": "Okej", "You have no ignored users.": "Nie posiadasz ignorowanych użytkowników.", "Enable hardware acceleration (restart %(appName)s to take effect)": "Włącz akceleracje sprzętową (uruchom ponownie %(appName)s, aby zastosować zmiany)", "Room directory": "Katalog pokoju", @@ -2687,13 +2667,6 @@ "Room ID or address of ban list": "ID pokoju lub adres listy banów", "If this isn't what you want, please use a different tool to ignore users.": "Jeśli to nie jest to czego chciałeś, użyj innego narzędzia do ignorowania użytkowników.", "Toggle attribution": "Przełącz atrybucje", - "Open another device to load encrypted messages": "Otwórz inne urządzenie, aby wczytać wiadomości szyfrowane", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "Stracisz dostęp do starych nierozszyfrowanych wiadomości, ale zresetowanie kluczy sprawi, że będziesz mógł otrzymywać nowe wiadomości.", - "Reset your keys to prevent future decryption errors": "Zresetuj swoje klucze, aby uniknąć błędów rozszyfrowywania w przyszłości", - "This device was unable to decrypt some messages because it has not been verified yet.": "To urządzenie nie było w stanie rozszyfrować niektórych wiadomości, ponieważ nie zostało jeszcze zweryfikowane.", - "Verify this device to access all messages": "Zweryfikuj to urządzenie, aby uzyskać dostęp do wiadomości", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Poczekaj, aż rozszyfrujemy Twoje wiadomości. Może to zająć chwilę.", - "Decrypting messages…": "Rozszyfrowuję wiadomości…", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Wiadomość tekstowa wysłana do %(msisdn)s. Wprowadź kod weryfikacyjny w niej zawarty.", "Failed to set pusher state": "Nie udało się ustawić stanu pushera", "Improve your account security by following these recommendations.": "Zwiększ bezpieczeństwo swojego konta kierując się tymi rekomendacjami.", @@ -2751,11 +2724,6 @@ "You have verified this user. This user has verified all of their sessions.": "Zweryfikowałeś tego użytkownika. Użytkownik zweryfikował wszystkie swoje sesje.", "You have not verified this user.": "Nie zweryfikowałeś tego użytkownika.", "This user has not verified all of their sessions.": "Ten użytkownik nie zweryfikował wszystkich swoich sesji.", - "Resend key requests": "Wyślij ponownie żądania kluczy", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "Niestety, nie istnieją inne urządzenia zweryfikowane, które mogą żądać kluczy rozszyfrowujących. Weryfikacja swoich zalogowanych kont może pomóc w uniknięciu podobnych problemów w przyszłości.", - "Some messages could not be decrypted": "Niektóre wiadomości nie mogły zostać rozszyfrowane", - "View your device list": "Wyświetl swoją listę urządzeń", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "To urządzenie żąda kluczy rozszyfrowujących od Twoich innych urządzeń. Otwórz jedno z Twoich innych urządzeń, aby przyspieszyć proces.", "Your current session is ready for secure messaging.": "Twoja bieżąca sesja jest gotowa do wysyłania bezpiecznych wiadomości.", "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 '%(myBanList)s' - stay in this room to keep the ban list in effect.": "Twoja osobista lista banów zawiera wszystkich użytkowników/serwery, z których nie chcesz otrzymywać wiadomości. Po zignorowaniu swojego pierwszego użytkownika/serwera, nowy pokój pojawi się na Twojej liście pokoi z nazwą '%(myBanList)s' - nie wychodź z niego, aby lista działała.", "The default cover photo is © Jesús Roncero used under the terms of CC-BY-SA 4.0.": "Autorem domyślnego zdjęcia okładkowego jest Jesús Roncero na licencji CC-BY-SA 4.0.", @@ -2878,7 +2846,7 @@ "%(count)s reply|other": "%(count)s odpowiedzi", "This room is running room version , which this homeserver has marked as unstable.": "Ten pokój działa na wersji , którą serwer domowy oznaczył jako niestabilną.", "You can only pin up to %(count)s widgets|other": "Możesz przypiąć do %(count)s widżetów", - "Room info": "Informacje o pokoju", + "Room info": "Informacje pokoju", "Chat": "Czat", "We were unable to start a chat with the other user.": "Nie byliśmy w stanie rozpocząć czatu z innym użytkownikiem.", "Error starting verification": "Wystąpił błąd w trakcie weryfikacji", @@ -3279,8 +3247,8 @@ "Create options": "Utwórz opcje", "Question or topic": "Pytanie lub temat", "What is your poll question or topic?": "Jakie jest Twoje pytanie lub temat ankiety?", - "Closed poll": "Zamknięta ankieta", - "Open poll": "Otwórz ankietę", + "Closed poll": "Ankieta zamknięta", + "Open poll": "Ankieta otwarta", "Poll type": "Typ ankiety", "Failed to post poll": "Nie udało się opublikować ankiety", "Edit poll": "Edytuj ankietę", @@ -3510,7 +3478,7 @@ "Manage & explore rooms": "Zarządzaj i odkrywaj pokoje", "See room timeline (devtools)": "Pokaż oś czasu pokoju (devtools)", "Mute room": "Wycisz pokój", - "Match default setting": "Dopasuj z domyślnymi ustawieniami", + "Match default setting": "Dopasuj z ustawieniami domyślnymi", "Mark as read": "Oznacz jako przeczytane", "Forget Room": "Zapomnij pokój", "Mentions only": "Tylko wzmianki", @@ -3591,5 +3559,196 @@ "Successfully restored %(sessionCount)s keys": "Przywrócono pomyślnie %(sessionCount)s kluczy", "Keys restored": "Klucze przywrócone", "Backup could not be decrypted with this Security Phrase: please verify that you entered the correct Security Phrase.": "Kopia zapasowa nie mogła zostać rozszyfrowana za pomocą tego Hasła bezpieczeństwa: upewnij się, że wprowadzono prawidłowe Hasło bezpieczeństwa.", - "Incorrect Security Phrase": "Nieprawidłowe hasło bezpieczeństwa" + "Incorrect Security Phrase": "Nieprawidłowe hasło bezpieczeństwa", + "Sliding Sync configuration": "Konfiguracja synchronizacji przesuwanej", + "Sliding Sync mode": "Tryb synchronizacji przesuwanej", + "Spotlight": "Centrum uwagi", + "Defaults to room member list.": "Przełącza domyślnie na listę członków pokoju.", + "Reset bearing to north": "Resetuj kierunek na północ", + "Switch to space by number": "Przełącz przestrzeń za pomocą liczby", + "Previous recently visited room or space": "Poprzedni ostatnio odwiedzony pokój lub przestrzeń", + "Next recently visited room or space": "Następny ostatnio odwiedzony pokój lub przestrzeń", + "Toggle hidden event visibility": "Przełącz widoczność ukrytego wydarzenia", + "Expand room list section": "Rozwiń sekcję listy pokojów", + "Collapse room list section": "Zwiń sekcję listy pokojów", + "Select room from the room list": "Wybierz pokój z listy pokojów", + "Jump to end of the composer": "Przejdź do końca okna edycji", + "Toggle Link": "Przełącz link", + "Toggle Code Block": "Przełącz blok kodu", + "[number]": "[liczba]", + "Failed to set direct message tag": "Nie udało się ustawić tagu wiadomości prywatnych", + "Message downloading sleep time(ms)": "Opóźnienie pobierania wiadomości(ms)", + "Indexed rooms:": "Pokoje indeksowane:", + "Indexed messages:": "Wiadomości indeksowane:", + "%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "%(brand)s bezpiecznie przechowuje wiadomości szyfrowane lokalnie, aby mogły pojawić się w wynikach wyszukiwania:", + "Currently indexing: %(currentRoom)s": "Aktualnie indeksowanie: %(currentRoom)s", + "Not currently indexing messages for any room.": "Aktualnie nie są indeksowane wiadomości z żadnego pokoju.", + "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Jeśli nie usunąłeś metody odzyskiwania, atakujący może próbować dostać się na Twoje konto. Zmień hasło konta i natychmiast ustaw nową metodę odzyskiwania w Ustawieniach.", + "If you did this accidentally, you can setup Secure Messages on this session which will re-encrypt this session's message history with a new recovery method.": "Jeśli zrobiłeś to przez pomyłkę, możesz ustawić bezpieczne wiadomości w tej sesji, co zaszyfruje ponownie historię wiadomości za pomocą nowej metody odzyskiwania.", + "Recovery Method Removed": "Usunięto metodę odzyskiwania", + "Set up Secure Messages": "Skonfiguruj bezpieczne wiadomości", + "This session is encrypting history using the new recovery method.": "Ta sesja szyfruję historię za pomocą nowej metody odzyskiwania.", + "If you didn't set the new recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Jeżeli nie ustawiłeś nowej metody odzyskiwania, atakujący może uzyskać dostęp do Twojego konta. Zmień hasło konta i natychmiast ustaw nową metodę odzyskiwania w Ustawieniach.", + "Unable to set up secret storage": "Nie można ustawić sekretnego magazynu", + "Confirm Security Phrase": "Potwierdź hasło bezpieczeństwa", + "Set a Security Phrase": "Ustaw hasło bezpieczeństwa", + "Upgrade your encryption": "Ulepsz swoje szyfrowanie", + "Unable to query secret storage status": "Nie udało się uzyskać statusu sekretnego magazynu", + "Your keys are now being backed up from this device.": "Twoje klucze są właśnie przywracane z tego urządzenia.", + "Enter a Security Phrase only you know, as it's used to safeguard your data. To be secure, you shouldn't re-use your account password.": "Wprowadź hasło bezpieczeństwa, które znasz tylko Ty, ponieważ będzie użyte do ochrony Twoich danych. Ze względów bezpieczeństwa, nie wprowadzaj hasła Twojego konta.", + "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Ulepsz tę sesję, aby zezwolić jej na weryfikację innych sesji, dając im dostęp do wiadomości szyfrowanych i oznaczenie ich jako zaufane.", + "You'll need to authenticate with the server to confirm the upgrade.": "Wymagane jest uwierzytelnienie z serwerem, aby potwierdzić ulepszenie.", + "Starting backup…": "Rozpoczynanie kopii zapasowej…", + "Confirm your Security Phrase": "Potwierdź swoje hasło bezpieczeństwa", + "Set up Secure Message Recovery": "Ustaw Bezpieczne przywracanie wiadomości", + "Without setting up Secure Message Recovery, you won't be able to restore your encrypted message history if you log out or use another session.": "Jeśli nie ustawisz Bezpiecznego przywracania wiadomości, nie będziesz mógł odzyskać swoich wiadomości szyfrowanych, jeśli się wylogujesz lub będziesz na innej sesji.", + "Repeat your Security Phrase…": "Powtórz hasło bezpieczeństwa…", + "Enter your Security Phrase a second time to confirm it.": "Wprowadź hasło bezpieczeństwa ponownie, aby potwierdzić.", + "Great! This Security Phrase looks strong enough.": "Wspaniale! Hasło bezpieczeństwa wygląda na silne.", + "Enter a Security Phrase": "Wprowadź hasło bezpieczeństwa", + "Space Autocomplete": "Przerwa autouzupełniania", + "Command Autocomplete": "Komenda autouzupełniania", + "We need to know it’s you before resetting your password. Click the link in the email we just sent to %(email)s": "Przed zresetowaniem hasła musimy się upewnić, że to Ty. Kliknij link we wiadomości e-mail, którą właśnie wysłaliśmy do %(email)s", + "Verify your email to continue": "Zweryfikuj adres e-mail, aby kontynuować", + "Sign in instead": "Zamiast tego zaloguj się", + "The email address doesn't appear to be valid.": "Adres e-mail nie wygląda na prawidłowy.", + "%(homeserver)s will send you a verification link to let you reset your password.": "%(homeserver)s wyśle Tobie link weryfikacyjny, abyś mógł zresetować hasło.", + "Enter your email to reset password": "Wprowadź swój e-mail, aby zresetować hasło", + "Send email": "Wyślij e-mail", + "Verification link email resent!": "Wysłano ponownie link weryfikacyjny na e-mail!", + "Did not receive it?": "Nie otrzymałeś go?", + "Re-enter email address": "Wprowadź ponownie adres e-mail", + "Wrong email address?": "Zły adres e-mail?", + "Follow the instructions sent to %(email)s": "Podążaj za instrukcjami wysłanymi do %(email)s", + "Warning: your personal data (including encryption keys) is still stored in this session. Clear it if you're finished using this session, or want to sign in to another account.": "Ostrzeżenie: Twoje dane osobowe (włączając w to klucze szyfrujące) są wciąż przechowywane w tej sesji. Wyczyść je, jeśli chcesz zakończyć tę sesję lub chcesz zalogować się na inne konto.", + "You cannot sign in to your account. Please contact your homeserver admin for more information.": "Nie możesz zalogować się do swojego konta. Skontaktuj się z administratorem serwera domowego po więcej informacji.", + "Regain access to your account and recover encryption keys stored in this session. Without them, you won't be able to read all of your secure messages in any session.": "Odzyskaj dostęp do swojego konta i klucze szyfrujące zachowane w tej sesji. Bez nich, nie będziesz mógł przeczytać żadnej wiadomości szyfrowanej we wszystkich sesjach.", + "Shows all threads you've participated in": "Pokazuje wszystkie wątki, w których brałeś udział", + "Shows all threads from current room": "Pokazuje wszystkie wątki z bieżącego pokoju", + "A private space to organise your rooms": "Prywatna przestrzeń do organizacji Twoich pokoi", + "I'll verify later": "Zweryfikuję później", + "Without verifying, you won't have access to all your messages and may appear as untrusted to others.": "Bez weryfikacji, nie będziesz posiadać dostępu do wszystkich swoich wiadomości, a inni będą Cię widzieć jako niezaufanego.", + "Your new device is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Twoje nowe urządzenie zostało zweryfikowane. Posiada dostęp do Twoich wiadomości szyfrowanych, a inni użytkownicy będą je widzieć jako zaufane.", + "Your new device is now verified. Other users will see it as trusted.": "Twoje nowe urządzenie zostało zweryfikowane. Inni użytkownicy będą je widzieć jako zaufane.", + "Verify your identity to access encrypted messages and prove your identity to others.": "Zweryfikuj swoją tożsamość, aby uzyskać dostęp do wiadomości szyfrowanych i potwierdzić swoją tożsamość innym.", + "Verify with another device": "Weryfikuj innym urządzeniem", + "Proceed with reset": "Zresetuj", + "Decide where your account is hosted": "Decyduj, gdzie Twoje konto jest hostowane", + "Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).": "Twoje nowe konto (%(newAccountId)s) zostało zarejestrowane, lecz jesteś już zalogowany na innym koncie (%(loggedInUserId)s).", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s lub %(usernamePassword)s", + "Continue with %(ssoButtons)s": "Kontynuuj z %(ssoButtons)s", + "That e-mail address or phone number is already in use.": "Ten adres e-mail lub numer telefonu jest już w użyciu.", + "Someone already has that username, please try another.": "Ktoś już ma tę nazwę użytkownika, użyj innej.", + "Unable to query for supported registration methods.": "Nie można uzyskać wspieranych metod rejestracji.", + "Registration has been disabled on this homeserver.": "Rejestracja została wyłączona na tym serwerze domowym.", + "If you've joined lots of rooms, this might take a while": "Jeśli dołączono do wielu pokojów, może to chwilę zająć", + "Signing In…": "Logowanie…", + "Syncing…": "Synchronizacja…", + "Failed to perform homeserver discovery": "Nie udało się rozpocząć odkrywania serwerów domowych", + "This homeserver does not support login using email address.": "Ten serwer domowy nie wspiera logowania za pomocą adresu e-mail.", + "Identity server URL does not appear to be a valid identity server": "URL serwera tożsamości nie wydaje się być prawidłowym serwerem tożsamości", + "Invalid base_url for m.identity_server": "Nieprawidłowy base_url dla m.identity_server", + "Invalid identity server discovery response": "Nieprawidłowa odpowiedź na wykrycie serwera tożsamości", + "Homeserver URL does not appear to be a valid Matrix homeserver": "URL serwera domowego nie wygląda na prawidłowy serwer domowy Matrix", + "Invalid base_url for m.homeserver": "Nieprawidłowy base_url dla m.homeserver", + "Failed to get autodiscovery configuration from server": "Nie udało się uzyskać konfiguracji autodiscovery z serwera", + "Invalid homeserver discovery response": "Nieprawidłowa odpowiedź na wykrycie serwera domowego", + "Confirm new password": "Potwierdź nowe hasło", + "Reset your password": "Resetuj swoje hasło", + "Reset password": "Resetuj hasło", + "Signing out your devices will delete the message encryption keys stored on them, making encrypted chat history unreadable.": "Wylogowanie Twoich urządzeń spowoduje usunięcie wszystkich kluczy szyfrujących, które się na nich znajdują, uniemożliwiając czytanie historii wiadomości szyfrowanych.", + "Resetting your password on this homeserver will cause all of your devices to be signed out. This will delete the message encryption keys stored on them, making encrypted chat history unreadable.": "Resetowanie hasła na tym serwerze domowym wyloguje Cię ze wszystkich urządzeń. Ta akcja usunie wszystkie klucze szyfrujące znajdujące się na nich, uniemożliwiając czytanie historii wiadomości szyfrowanych.", + "Too many attempts in a short time. Retry after %(timeout)s.": "Za dużo prób w krótkim odstępie czasu. Spróbuj ponownie za%(timeout)s.", + "Too many attempts in a short time. Wait some time before trying again.": "Za dużo prób w krótkim odstępie czasu. Odczekaj trochę, zanim spróbujesz ponownie.", + "Skip verification for now": "Pomiń weryfikację na razie", + "Really reset verification keys?": "Czy na pewno zresetować klucze weryfikacyjne?", + "Device verified": "Urządzenie zweryfikowane", + "Verify this device": "Weryfikuj to urządzenie", + "Unable to verify this device": "Nie można zweryfikować tego urządzenia", + "Once invited users have joined %(brand)s, you will be able to chat and the room will be end-to-end encrypted": "Jak tylko zaproszeni użytkownicy dołączą do %(brand)s, będziesz mógł czatować w pokoju szyfrowanym end-to-end", + "Waiting for users to join %(brand)s": "Czekanie na użytkowników %(brand)s", + "Thread root ID: %(threadRootId)s": "ID root wątku: %(threadRootId)s", + "Event ID: %(eventId)s": "ID wydarzenia: %(eventId)s", + "Original event source": "Oryginalne źródło wydarzenia", + "Decrypted source unavailable": "Rozszyfrowane źródło niedostępne", + "Decrypted event source": "Rozszyfrowane wydarzenie źródłowe", + "User menu": "Menu użytkownika", + "Got an account? Sign in": "Posiadasz już konto? Zaloguj się", + "Thread": "Wątek", + "Keep discussions organised with threads": "Organizuj dyskusje za pomocą wątków", + "Tip: Use “%(replyInThread)s” when hovering over a message.": "Tip: Użyj “%(replyInThread)s” najeżdżając na wiadomość.", + "Threads help keep your conversations on-topic and easy to track.": "Dzięki wątkom Twoje rozmowy są zorganizowane i łatwe do śledzenia.", + "Show all threads": "Pokaż wszystkie wątki", + "Reply to an ongoing thread or use “%(replyInThread)s” when hovering over a message to start a new one.": "Odpowiedz do trwającego już wątku lub użyj “%(replyInThread)s” najeżdżając na wiadomość, aby rozpocząć nową.", + "Show:": "Pokaż:", + "My threads": "Moje wątki", + "All threads": "Wszystkie wątki", + "We'll create rooms for each of them.": "Utworzymy pokój dla każdego z nich.", + "What projects are your team working on?": "Nad jakimi projektami pracuje Twój zespół?", + "You can add more later too, including already existing ones.": "W przyszłości będziesz mógł dodać więcej, włączając już istniejące.", + "Let's create a room for each of them.": "Utwórzmy pokój dla każdego z nich.", + "What are some things you want to discuss in %(spaceName)s?": "O jakich rzeczach będziesz chciał dyskutować w %(spaceName)s?", + "Invite by username": "Zaproś przez nazwę użytkownika", + "Make sure the right people have access. You can invite more later.": "Upewnij się, że odpowiednie osoby mają dostęp. Możesz zaprosić więcej później.", + "Invite your teammates": "Zaproś swoich kolegów z drużyny", + "Inviting…": "Zapraszanie…", + "Failed to invite the following users to your space: %(csvUsers)s": "Nie udało się zaprosić następujących użytkowników do przestrzeni: %(csvUsers)s", + "A private space for you and your teammates": "Prywatna przestrzeń dla Ciebie i Twoich kolegów z drużyny", + "Me and my teammates": "Ja i moi koledzy z drużyny", + "Just me": "Tylko ja", + "Make sure the right people have access to %(name)s": "Upewnij się, że odpowiednie osoby mają dostęp do %(name)s", + "Who are you working with?": "Z kim pracujesz?", + "Go to my space": "Przejdź do mojej przestrzeni", + "Go to my first room": "Przejdź do mojego pierwszego pokoju", + "It's just you at the moment, it will be even better with others.": "Aktualnie jesteś tu tylko Ty, będzie jeszcze lepiej, jak dołączą inni.", + "Share %(name)s": "Udostępnij %(name)s", + "Pick rooms or conversations to add. This is just a space for you, no one will be informed. You can add more later.": "Wybierz pokoje lub konwersacje do dodania. Ta przestrzeń jest wyłącznie dla Ciebie, nikt o niej nie wie. Możesz dodać więcej później.", + "What do you want to organise?": "Co chcesz organizować?", + "Creating rooms…": "Tworzenie pokojów…", + "Skip for now": "Pomiń na razie", + "Failed to create initial space rooms": "Nie udało się utworzyć początkowych pokoi przestrzeni", + "Room name": "Nazwa pokoju", + "Support": "Wsparcie", + "Random": "Losowe", + "Welcome to ": "Witamy w ", + "Search names and descriptions": "Przeszukuj nazwy i opisy", + "Rooms and spaces": "Pokoje i przestrzenie", + "Results": "Wyniki", + "You may want to try a different search or check for typos.": "Możesz spróbować inną frazę lub sprawdzić błędy pisowni.", + "Failed to load list of rooms.": "Nie udało się wczytać listy pokoi.", + "Mark as suggested": "Oznacz jako sugerowane", + "Mark as not suggested": "Oznacz jako nie sugerowane", + "Joining": "Dołączanie", + "You have %(count)s unread notifications in a prior version of this room.|one": "Masz %(count)s nieprzeczytanych powiadomień we wcześniejszej wersji tego pokoju.", + "You have %(count)s unread notifications in a prior version of this room.|other": "Masz %(count)s nieprzeczytane powiadomienie we wcześniejszej wersji tego pokoju.", + "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "Wiadomość nie została wysłana, ponieważ serwer domowy przekroczył limit swoich zasobów. Skontaktuj się z administratorem serwisu, aby kontynuować.", + "Your message wasn't sent because this homeserver has been blocked by its administrator. Please contact your service administrator to continue using the service.": "Wiadomość nie została wysłana, ponieważ serwer domowy został zablokowany przez jego administratora. Skontaktuj się z administratorem serwisu, aby kontynuować.", + "Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please contact your service administrator to continue using the service.": "Wiadomość nie została wysłana, ponieważ serwer domowy przekroczył miesięczny limit aktywnych użytkowników. Skontaktuj się z administratorem serwisu, aby kontynuować.", + "You can't send any messages until you review and agree to our terms and conditions.": "Nie możesz wysłać żadnej wiadomości, dopóki nie zaakceptujesz naszych warunków i kondycji.", + "You're all caught up": "Jesteś na bieżąco", + "Unable to copy a link to the room to the clipboard.": "Nie można skopiować linku pokoju do schowka.", + "Unable to copy room link": "Nie można skopiować linku do pokoju", + "Are you sure you want to leave the space '%(spaceName)s'?": "Czy na pewno chcesz opuścić przestrzeń '%(spaceName)s'?", + "This space is not public. You will not be able to rejoin without an invite.": "Ta przestrzeń nie jest publiczna. Nie będziesz w stanie dołączyć bez zaproszenia.", + "You are the only person here. If you leave, no one will be able to join in the future, including you.": "Jesteś jedyną osoba tutaj. Jeśli wyjdziesz, nikt nie będzie w stanie dołączyć w przyszłości, włączając Ciebie.", + "If you know what you're doing, Element is open-source, be sure to check out our GitHub (https://github.com/vector-im/element-web/) and contribute!": "Jeśli wiesz, co robisz, pamiętaj, że Element jest open-source. Dlatego odwiedź nas na platformie GitHub (https://github.com/vector-im/element-web/) i dodaj swoją kontrybucję!", + "If someone told you to copy/paste something here, there is a high likelihood you're being scammed!": "Jeśli ktoś Ci powiedział, żeby coś stąd skopiować/wkleić, istnieje wysokie prawdopodobieństwo, że jesteś oszukiwany!", + "Wait!": "Czekaj!", + "Open dial pad": "Otwórz klawiaturę numeryczną", + "Own your conversations.": "Bądź właścicielem swoich konwersacji.", + "Add a photo so people know it's you.": "Dodaj zdjęcie, aby inni mogli Cię rozpoznać.", + "Great, that'll help people know it's you": "Świetnie, pomoże to innym Cię rozpoznać", + "Play": "Odtwórz", + "Pause": "Wstrzymaj", + "Error downloading audio": "Wystąpił błąd w trakcie pobierania audio", + "Unnamed audio": "Audio bez nazwy", + "Use email to optionally be discoverable by existing contacts.": "Użyj adresu e-mail, aby opcjonalnie móc być odkrywanym przez istniejące kontakty.", + "Someone already has that username. Try another or if it is you, sign in below.": "Ktoś już ma taką nazwę użytkownika. Użyj innej lub zaloguj się poniżej, jeśli to jesteś Ty.", + "%(completed)s of %(total)s keys restored": "%(completed)s z %(total)s kluczy przywrócono", + "Your language": "Twój język", + "Your device ID": "Twoje ID urządzenia", + "Alternatively, you can try to use the public server at , but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternatywnie możesz spróbować użyć serwera publicznego , ale mogą wystąpić problemy i zostanie udostępniony Twój adres IP z serwerem. Zarządzaj tym również w Ustawieniach.", + "Try using %(server)s": "Spróbuj użyć %(server)s", + "User is not logged in": "Użytkownik nie jest zalogowany", + "Allow fallback call assist server (%(server)s)": "Zezwól na alternatywny serwer wspierający (%(server)s)" } diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 399fd701523..711da195a0c 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -2,18 +2,18 @@ "Account": "Conta", "Admin": "Administrador", "Advanced": "Avançado", - "New passwords don't match": "As novas senhas não conferem", - "A new password must be entered.": "Uma nova senha precisa ser informada.", + "New passwords don't match": "As novas palavras-passe não coincidem", + "A new password must be entered.": "Deve ser introduzida uma nova palavra-passe.", "Are you sure you want to reject the invitation?": "Você tem certeza que deseja rejeitar este convite?", "Banned users": "Usuárias/os banidas/os", "Bans user with given id": "Banir usuários com o identificador informado", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s mudou o tópico para \"%(topic)s\".", "Changes your display nickname": "Troca o seu apelido", "Commands": "Comandos", - "Confirm password": "Confirme a nova senha", + "Confirm password": "Confirmar palavra-passe", "Continue": "Continuar", "Cryptography": "Criptografia", - "Current password": "Senha atual", + "Current password": "Palavra-passe atual", "Deactivate Account": "Desativar conta", "Default": "Padrão", "Deops user with given id": "Retirar função de moderador do usuário com o identificador informado", @@ -42,12 +42,12 @@ "Low priority": "Baixa prioridade", "Moderator": "Moderador/a", "Name": "Nome", - "New passwords must match each other.": "As novas senhas informadas precisam ser idênticas.", + "New passwords must match each other.": "Novas palavras-passe devem coincidir.", "Notifications": "Notificações", "": "", "No users have specific privileges in this room": "Nenhum/a usuário/a possui privilégios específicos nesta sala", - "Password": "Senha", - "Passwords can't be empty": "As senhas não podem estar em branco", + "Password": "Palavra-Passe", + "Passwords can't be empty": "As palavras-passe não podem estar vazias", "Permissions": "Permissões", "Phone": "Telefone", "Please check your email and click on the link it contains. Once this is done, click continue.": "Por favor verifique seu email e clique no link enviado. Quando finalizar este processo, clique para continuar.", @@ -142,7 +142,7 @@ "Attachment": "Anexo", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(day)s de %(monthName)s de %(fullYear)s às %(time)s", "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Não consigo conectar ao servidor padrão através de HTTP quando uma URL HTTPS está na barra de endereços do seu navegador. Use HTTPS ou então habilite scripts não seguros no seu navegador.", - "Change Password": "Alterar senha", + "Change Password": "Alterar Palavra-Passe", "Command error": "Erro de comando", "Decrypt %(text)s": "Descriptografar %(text)s", "Download %(text)s": "Baixar %(text)s", @@ -189,28 +189,28 @@ "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s apagou o nome da sala.", "Analytics": "Análise", "Options": "Opções", - "Passphrases must match": "As senhas têm que ser iguais", - "Passphrase must not be empty": "A senha não pode estar vazia", + "Passphrases must match": "As frases-passe devem coincidir", + "Passphrase must not be empty": "A frase-passe não pode estar vazia", "Export room keys": "Exportar chaves de sala", - "Enter passphrase": "Entre com a senha", - "Confirm passphrase": "Confirme a senha", + "Enter passphrase": "Introduza a frase-passe", + "Confirm passphrase": "Confirmar frase-passe", "Import room keys": "Importar chaves de sala", "File to import": "Arquivo para importar", "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "Este processo permite que você exporte as chaves para mensagens que você recebeu em salas criptografadas para um arquivo local. Você poderá então importar o arquivo para outro cliente Matrix no futuro, de modo que este cliente também poderá descriptografar suas mensagens.", - "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "O arquivo exportado será protegido com uma senha. Você deverá inserir a senha aqui para poder descriptografar o arquivo futuramente.", + "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "O ficheiro de exportação será protegido com uma frase-passe. Deve introduzir a frase-passe aqui, para desencriptar o ficheiro.", "You must join the room to see its files": "Você precisa ingressar na sala para ver seus arquivos", "Reject all %(invitedRooms)s invites": "Rejeitar todos os %(invitedRooms)s convites", "Failed to invite": "Falha ao enviar o convite", - "Confirm Removal": "Confirmar a remoção", + "Confirm Removal": "Confirmar Remoção", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Você tem certeza que quer apagar este evento? Note que se você apaga o nome de uma sala ou uma mudança de tópico, esta ação não poderá ser desfeita.", "Unknown error": "Erro desconhecido", - "Incorrect password": "Senha incorreta", + "Incorrect password": "Palavra-passe incorreta", "Unable to restore session": "Não foi possível restaurar a sessão", "If you have previously used a more recent version of %(brand)s, your session may be incompatible with this version. Close this window and return to the more recent version.": "Se você já usou antes uma versão mais recente do %(brand)s, a sua sessão pode ser incompatível com esta versão. Feche esta janela e tente abrir com a versão mais recente.", "Dismiss": "Descartar", "Token incorrect": "Token incorreto", "Please enter the code it contains:": "Por favor, entre com o código que está na mensagem:", - "powered by Matrix": "powered by Matrix", + "powered by Matrix": "potenciado por Matrix", "Error decrypting image": "Erro ao descriptografar a imagem", "Error decrypting video": "Erro ao descriptografar o vídeo", "Add an Integration": "Adicionar uma integração", @@ -219,13 +219,13 @@ "Online": "Online", "Idle": "Ocioso", "Offline": "Offline", - "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "O arquivo exportado irá permitir a qualquer pessoa que o acesse a descriptografar qualquer uma das mensagens criptografadas que você veja, portanto seja bastante cuidadosa(o) em manter este arquivo seguro. Para deixar este arquivo mais protegido, recomendamos que você insira uma senha abaixo, que será usada para criptografar o arquivo. Só será possível importar os dados usando exatamente a mesma senha.", + "The exported file will allow anyone who can read it to decrypt any encrypted messages that you can see, so you should be careful to keep it secure. To help with this, you should enter a passphrase below, which will be used to encrypt the exported data. It will only be possible to import the data by using the same passphrase.": "O ficheiro exportado permitirá a qualquer pessoa que o possa ler desencriptar quaisquer mensagens encriptadas que possa ver, pelo que deve ter o cuidado de o manter seguro. Para o ajudar, deve introduzir uma frase-chave abaixo, que será utilizada para encriptar os dados exportados. Só será possível importar os dados utilizando a mesma frase-chave.", "This process allows you to import encryption keys that you had previously exported from another Matrix client. You will then be able to decrypt any messages that the other client could decrypt.": "Este processo faz com que você possa importar as chaves de criptografia que tinha previamente exportado de outro cliente Matrix. Você poderá então descriptografar todas as mensagens que o outro cliente pôde criptografar.", "Start automatically after system login": "Iniciar automaticamente ao iniciar o sistema", "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "Você será levado agora a um site de terceiros para poder autenticar a sua conta para uso com o serviço %(integrationsUrl)s. Você quer continuar?", "Export": "Exportar", "Import": "Importar", - "Incorrect username and/or password.": "Nome de usuária(o) e/ou senha incorreto.", + "Incorrect username and/or password.": "Nome de utilizador e/ou palavra-passe incorreta.", "Invited": "Convidada(o)", "Verified key": "Chave verificada", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s removeu a imagem da sala.", @@ -241,7 +241,7 @@ "Anyone": "Qualquer pessoa", "Are you sure you want to leave the room '%(roomName)s'?": "Você tem certeza que deseja sair da sala '%(roomName)s'?", "Custom level": "Nível personalizado", - "Register": "Registre-se", + "Register": "Registar", "Save": "Salvar", "You have disabled URL previews by default.": "Você desabilitou pré-visualizações de links por padrão.", "You have enabled URL previews by default.": "Você habilitou pré-visualizações de links por padrão.", @@ -250,12 +250,12 @@ "Uploading %(filename)s and %(count)s others|one": "Enviando o arquivo %(filename)s e %(count)s outros arquivos", "You must register to use this functionality": "Você deve se registrar para poder usar esta funcionalidade", "Uploading %(filename)s and %(count)s others|zero": "Enviando o arquivo %(filename)s", - "Admin Tools": "Ferramentas de administração", + "Admin Tools": "Ferramentas de Administração", "%(roomName)s does not exist.": "%(roomName)s não existe.", "(~%(count)s results)|other": "(~%(count)s resultados)", "Start authentication": "Iniciar autenticação", "(~%(count)s results)|one": "(~%(count)s resultado)", - "New Password": "Nova senha", + "New Password": "Nova Palavra-Passe", "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Não foi possível conectar ao Servidor de Base. Por favor, confira sua conectividade à internet, garanta que o certificado SSL do Servidor de Base é confiável, e que uma extensão do navegador não esteja bloqueando as requisições de rede.", "Uploading %(filename)s and %(count)s others|other": "Enviando o arquivo %(filename)s e %(count)s outros arquivos", "Close": "Fechar", @@ -271,7 +271,7 @@ "Delete widget": "Apagar widget", "Define the power level of a user": "Definir o nível de privilégios de um utilizador", "Edit": "Editar", - "Enable automatic language detection for syntax highlighting": "Ativar deteção automática da linguagem para o destaque da sintaxe", + "Enable automatic language detection for syntax highlighting": "Ativar deteção automática da linguagem para realce da sintaxe", "Publish this room to the public in %(domain)s's room directory?": "Publicar esta sala ao público no diretório de salas de %(domain)s's?", "AM": "AM", "PM": "PM", @@ -281,14 +281,14 @@ "Copied!": "Copiado!", "Failed to copy": "Falha ao copiar", "Check for update": "Procurar atualizações", - "Your browser does not support the required cryptography extensions": "O seu browser não suporta as extensões de criptografia necessárias", + "Your browser does not support the required cryptography extensions": "O seu navegador não suporta as extensões de criptografia necessárias", "Not a valid %(brand)s keyfile": "Não é um ficheiro de chaves %(brand)s válido", "Authentication check failed: incorrect password?": "Erro de autenticação: palavra-passe incorreta?", "Do you want to set an email address?": "Deseja definir um endereço de e-mail?", "This will allow you to reset your password and receive notifications.": "Isto irá permitir-lhe redefinir a sua palavra-passe e receber notificações.", "Skip": "Saltar", "Create": "Criar", - "Automatically replace plain text Emoji": "Substituir Emoji em texto automaticamente", + "Automatically replace plain text Emoji": "Substituir Emoji de texto automaticamente", "%(widgetName)s widget added by %(senderName)s": "Widget %(widgetName)s adicionado por %(senderName)s", "%(widgetName)s widget removed by %(senderName)s": "Widget %(widgetName)s removido por %(senderName)s", "%(widgetName)s widget modified by %(senderName)s": "Widget %(widgetName)s modificado por %(senderName)s", @@ -364,14 +364,397 @@ "Call Failed": "A chamada falhou", "Call failed due to misconfigured server": "Chamada falhada devido a um erro de configuração do servidor", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Peça ao administrador do seu servidor inicial (%(homeserverDomain)s) de configurar um servidor TURN para que as chamadas funcionem fiavelmente.", - "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.": "Alternativamente, pode tentar usar o servidor público em turn.matrix.org, mas não será tão fiável e partilhará o seu IP com esse servidor. Também pode gerir isso nas definições.", - "Try using turn.matrix.org": "Tente utilizar turn.matrix.org", "Explore rooms": "Explorar rooms", "Sign In": "Iniciar sessão", "Create Account": "Criar conta", "Not a valid identity server (status code %(code)s)": "Servidor de Identidade inválido (código de status %(code)s)", "Identity server URL must be HTTPS": "O link do servidor de identidade deve começar com HTTPS", "Comment": "Comente", - "Confirm": "Confirme", - "Use Single Sign On to continue": "Use Single Sign On para continuar" + "Confirm": "Confirmar", + "Use Single Sign On to continue": "Use Single Sign On para continuar", + "Identity server not set": "Servidor de identidade não definido", + "No identity access token found": "Nenhum token de identidade de acesso encontrado", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Confirme adicionar este endereço de email usando Single Sign On para provar a sua identidade.", + "Confirm adding email": "Confirmar adição de email", + "Single Sign On": "Single Sign On", + "Click the button below to confirm adding this email address.": "Pressione o botão abaixo para confirmar se quer adicionar este endereço de email.", + "The add / bind with MSISDN flow is misconfigured": "A junção / vinculo com o fluxo MSISDN está mal configurado", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Confirme que quer adicionar este número de telefone usando Single Sign On para provar a sua identidade.", + "Confirm adding phone number": "Confirme que quer adicionar o número de telefone", + "Click the button below to confirm adding this phone number.": "Pressione o botão abaixo para confirmar a adição este número de telefone.", + "Unable to load! Check your network connectivity and try again.": "Impossível carregar! Verifique a sua ligação de rede e tente novamente.", + "The file '%(fileName)s' failed to upload.": "O carregamento do ficheiro '%(fileName)s' falhou.", + "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "O ficheiro '%(fileName)s' excede o tamanho limite deste homeserver para carregamentos", + "The server does not support the room version specified.": "O servidor não suporta a versão especificada da sala.", + "%(date)s at %(time)s": "%(date)s às %(time)s", + "%(value)sh": "%(value)sh", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(day)s-%(monthName)s-%(fullYear)s", + "%(value)sd": "%(value)sd", + "%(days)sd %(hours)sh %(minutes)sm %(seconds)ss": "%(days)sd %(hours)sh %(minutes)sm %(seconds)ss", + "%(hours)sh %(minutes)sm %(seconds)ss": "%(hours)sh %(minutes)sm %(seconds)ss", + "%(minutes)sm %(seconds)ss": "%(minutes)sm %(seconds)ss", + "%(value)ss": "%(value)ss", + "%(seconds)ss left": "%(seconds)ss restantes", + "%(value)sm": "%(value)sm", + "Identity server has no terms of service": "O servidor de identidade não tem termos de serviço", + "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.": "Esta acção requer acesso ao servidor de identidade padrão para validar um endereço de email ou número de telefone, mas o servidor não tem quaisquer termos de serviço.", + "%(hours)sh %(minutes)sm %(seconds)ss left": "%(hours)sh %(minutes)sm %(seconds)ss restantes", + "%(minutes)sm %(seconds)ss left": "%(minutes)sm %(seconds)ss restantes", + "Only continue if you trust the owner of the server.": "Continue apenas se confia no dono do servidor.", + "User Busy": "Utilizador ocupado", + "Trust": "Confiar", + "The user you called is busy.": "O utilizador para o qual tentou ligar está ocupado.", + "The call was answered on another device.": "A chamada foi atendida noutro dispositivo.", + "Unable to access microphone": "Não é possível aceder ao microfone", + "Answered Elsewhere": "Atendida noutro lado", + "The call could not be established": "Não foi possível estabelecer a chamada", + "Try using %(server)s": "Tente usar %(server)s", + "Cannot invite user by email without an identity server. You can connect to one under \"Settings\".": "Não é possível convidar um utilizador por email sem um servidor de identidade. Pode ligar-se a um em \"Definições\".", + "Alternatively, you can try to use the public server at , but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Em alternativa, pode tentar utilizar o servidor público em , mas não será tão fiável e irá partilhar o seu endereço IP com esse servidor. Também pode gerir isto nas Definições.", + "Unable to access webcam / microphone": "Não é possível aceder à câmera / microfone", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A chamada falhou porque o microfone não está acessível. Verifique que tem um microfone ligado e correctamente configurado.", + "You cannot place calls without a connection to the server.": "Não pode fazer chamadas sem uma conexão ao servidor.", + "Already in call": "Já em chamada", + "No other application is using the webcam": "Nenhuma outra aplicação está a utilizar a câmera", + "Connectivity to the server has been lost": "A conexão ao servidor foi perdida", + "Too Many Calls": "Demasiadas Chamadas", + "You've reached the maximum number of simultaneous calls.": "Atingiu o número máximo de chamadas em simultâneo.", + "Call failed because webcam or microphone could not be accessed. Check that:": "A chamada falhou porque não foi possível aceder à câmera ou microfone. Verifique se:", + "Permission is granted to use the webcam": "É concedida autorização para utilizar a câmera", + "A microphone and webcam are plugged in and set up correctly": "Um microfone e uma câmera estão conectados e configurados corretamente", + "You're already in a call with this person.": "Já está em chamada com esta pessoa.", + "Calls are unsupported": "Chamadas não são suportadas", + "You cannot place calls in this browser.": "Não pode fazer chamadas neste navegador.", + "Database unexpectedly closed": "Base de dados fechada inesperadamente", + "User is not logged in": "Utilizador não tem sessão iniciada", + "Reload": "Recarregar", + "Empty room (was %(oldName)s)": "Sala vazia (era %(oldName)s)", + "Anguilla": "Anguilla", + "Empty room": "Sala vazia", + "Try again": "Tente novamente", + "Your email address does not appear to be associated with a Matrix ID on this homeserver.": "O seu endereço de email não parece estar associado a um Matrix ID neste homeserver.", + "There was an error looking up the phone number": "Ocorreu um erro ao procurar o número de telefone", + "We couldn't log you in": "Não foi possível fazer login", + "United States": "Estados Unidos", + "American Samoa": "Samoa Americana", + "Aruba": "Aruba", + "Unable to transfer call": "Não foi possível transferir a chamada", + "Transfer Failed": "A Transferência Falhou", + "Inviting %(user)s and %(count)s others|other": "Convidando %(user)s e %(count)s outros", + "Azerbaijan": "Azerbaijão", + "Failed to transfer call": "Falha ao transferir chamada", + "%(user1)s and %(user2)s": "%(user1)s e %(user2)s", + "You do not have permission to start a conference call in this room": "Não tem autorização para iniciar uma chamada de conferência nesta sala", + "Unable to look up phone number": "Não foi possível procurar o número de telefone", + "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.": "Pedimos ao navegador que se lembrasse do homeserver que usa para permitir o início de sessão, mas infelizmente o seu navegador esqueceu. Aceda à página de início de sessão e tente novamente.", + "This may be caused by having the app open in multiple tabs or due to clearing browser data.": "Isto pode ser causado por ter a aplicação aberta em vários separadores ou devido à limpeza dos dados do navegador.", + "%(user)s and %(count)s others|one": "%(user)s e 1 outro", + "Inviting %(user1)s and %(user2)s": "Convidando %(user1)s e %(user2)s", + "United Kingdom": "Reino Unido", + "Bahrain": "Bahrain", + "Bahamas": "Bahamas", + "Austria": "Áustria", + "Australia": "Austrália", + "Armenia": "Arménia", + "Argentina": "Argentina", + "Antarctica": "Antártica", + "Angola": "Angola", + "Algeria": "Argélia", + "Albania": "Albânia", + "Åland Islands": "Ilhas Åland", + "Afghanistan": "Afeganistão", + "%(name)s is requesting verification": "%(name)s está a pedir verificação", + "Permission Required": "Permissão Requerida", + "%(senderName)s started a voice broadcast": "%(senderName)s iniciou uma transmissão de voz", + "%(user)s and %(count)s others|other": "%(user)s e %(count)s outros", + "Inviting %(user)s and %(count)s others|one": "Convidando %(user)s e 1 outro", + "Antigua & Barbuda": "Antígua e Barbuda", + "Andorra": "Andorra", + "Cocos (Keeling) Islands": "Ilhas Cocos (Keeling)", + "Canada": "Canadá", + "Brazil": "Brasil", + "Chile": "Chile", + "French Southern Territories": "Territórios Franceses do Sul", + "French Guiana": "Guiana Francesa", + "French Polynesia": "Polinésia Francesa", + "France": "França", + "Finland": "Finlândia", + "Faroe Islands": "Ilhas Faroé", + "Fiji": "Fiji", + "Falkland Islands": "Ilhas Malvinas", + "Ethiopia": "Etiópia", + "Estonia": "Estónia", + "Eritrea": "Eritreia", + "Equatorial Guinea": "Guiné Equatorial", + "El Salvador": "El Salvador", + "Egypt": "Egipto", + "Ecuador": "Equador", + "Dominican Republic": "República Dominicana", + "Dominica": "Dominica", + "Djibouti": "Djibouti", + "Denmark": "Dinamarca", + "Côte d’Ivoire": "Costa do Marfim", + "Czech Republic": "República Checa", + "Cyprus": "Chipre", + "Curaçao": "Curaçao", + "Comoros": "Comoros", + "Colombia": "Colômbia", + "Christmas Island": "Ilha do Natal", + "China": "China", + "Chad": "Chade", + "Central African Republic": "República Centro-Africana", + "Cayman Islands": "Ilhas Caimão", + "Caribbean Netherlands": "Países Baixos Caribenhos", + "Cape Verde": "Cabo Verde", + "Cameroon": "Camarões", + "Cambodia": "Cambodia", + "Burkina Faso": "Burkina Faso", + "Burundi": "Burundi", + "Bulgaria": "Bulgária", + "Brunei": "Brunei", + "British Virgin Islands": "Ilhas Virgens Britânicas", + "British Indian Ocean Territory": "Território Britânico do Oceano Índico", + "Bouvet Island": "Ilha Bouvet", + "Bosnia": "Bósnia", + "Botswana": "Botswana", + "Bolivia": "Bolívia", + "Bhutan": "Bhutan", + "Benin": "Benin", + "Bermuda": "Bermuda", + "Belize": "Belize", + "Belgium": "Bélgica", + "Belarus": "Bielorrússia", + "Costa Rica": "Costa Rica", + "Croatia": "Croácia", + "Cook Islands": "Ilhas Cook", + "Congo - Kinshasa": "Congo - Kinshasa", + "Congo - Brazzaville": "Congo - Brazzaville", + "Cuba": "Cuba", + "Gabon": "Gabão", + "Guinea-Bissau": "Guiné-Bissau", + "Guinea": "Guiné", + "Guernsey": "Guernsey", + "Guam": "Guam", + "Guatemala": "Guatemala", + "Guadeloupe": "Guadalupe", + "Grenada": "Granada", + "Greenland": "Gronelândia", + "Gibraltar": "Gibraltar", + "Greece": "Grécia", + "Ghana": "Gana", + "Germany": "Alemanha", + "Gambia": "Gâmbia", + "Georgia": "Geórgia", + "Mayotte": "Mayotte", + "Host account on": "Hospedar conta em", + "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Recomendamos que remova seus endereços de email e números de telefone do servidor de identidade antes de se desconectar.", + "Failed to invite users to %(roomName)s": "Falha ao convidar utilizadores para %(roomName)s", + "Command error: Unable to find rendering type (%(renderingType)s)": "Erro de comando: Não foi possível encontrar o tipo de renderização(%(renderingType)s)", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s Ou %(usernamePassword)s", + "Macau": "Macau", + "Malaysia": "Malásia", + "Some invites couldn't be sent": "Alguns convites não puderam ser enviados", + "Lesotho": "Lesoto", + "Maldives": "Maldivas", + "Mali": "Mali", + "Sends the given message as a spoiler": "Envia a mensagem como um spoiler", + " wants to chat": " quer falar", + "Start a conversation with someone using their name or username (like ).": "Comece uma conversa com alguém a partir do nome ou nome de utilizador (por exemplo: ).", + "Use email or phone to optionally be discoverable by existing contacts.": "Use email ou telefone para, opcionalmente, ser detectável por contactos existentes.", + "Invite by username": "Convidar por nome de utilizador", + "Already have an account? Sign in here": "Já tem uma conta? Entre aqui", + "Messages containing my username": "Mensagens contendo o meu nome de utilizador", + "Use an email address to recover your account": "Usar um endereço de email para recuperar a sua conta", + "Malta": "Malta", + "Other": "Outros", + "Lebanon": "Líbano", + "Marshall Islands": "Ilhas Marshall", + "Martinique": "Martinica", + "Micronesia": "Micronésia", + "Mongolia": "Mongólia", + "Norfolk Island": "Ilha Norfolk", + "Panama": "Panamá", + "South Georgia & South Sandwich Islands": "Ilhas Geórgia do Sul e Sandwich do Sul", + "St. Barthélemy": "São Bartolomeu", + "You need to be able to kick users to do that.": "Precisa ter permissão de expulsar utilizadores para fazer isso.", + "Liechtenstein": "Liechtenstein", + "Mauritania": "Mauritânia", + "Palau": "Palau", + "Use your account or create a new one to continue.": "Use a sua conta ou crie uma nova conta para continuar.", + "Restricted": "Restrito", + "Latvia": "Letónia", + "Username": "Nome de utilizador", + "Libya": "Líbia", + "Lithuania": "Lituânia", + "Malawi": "Malawi", + "We sent the others, but the below people couldn't be invited to ": "Enviámos os outros, mas as pessoas abaixo não puderam ser convidadas para ", + "Mauritius": "Maurício", + "Monaco": "Mónaco", + "Laos": "Laos", + "Use your account to continue.": "Use a sua conta para continuar.", + "Liberia": "Libéria", + "Command error: Unable to handle slash command.": "Erro de comando: Não foi possível lidar com o comando de barra.", + "Mexico": "México", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Pré-anexa (╯°□°)╯︵ ┻━┻ a uma mensagem de texto simples", + "Moldova": "Moldávia", + "Discovery options will appear once you have added an email above.": "As opções de descoberta vão aparecer assim que adicione um e-mail acima.", + "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Enviámos-lhe um email para confirmar o seu endereço. Por favor siga as instruções no email e depois clique no botão abaixo.", + "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Apenas um aviso, se não adicionar um email e depois esquecer a sua palavra-passe, poderá perder permanentemente o acesso à sua conta.", + "Create account": "Criar conta", + "Use email to optionally be discoverable by existing contacts.": "Use email para, opcionalmente, ser detectável por contactos existentes.", + "To create your account, open the link in the email we just sent to %(emailAddress)s.": "Para criar a sua conta, abra a ligação no email que acabámos de enviar para %(emailAddress)s.", + "Invite with email or username": "Convidar com email ou nome de utilizador", + "New? Create account": "Novo? Crie uma conta", + "Invite someone using their name, email address, username (like ) or share this space.": "Convide alguém a partir do nome, endereço de email, nome de utilizador (como ) ou partilhe este espaço.", + "Invite someone using their name, email address, username (like ) or share this room.": "Convide alguém a partir do nome, email ou nome de utilizador (como ) ou partilhe esta sala.", + "Debug logs contain application usage data including your username, the IDs or aliases of the rooms you have visited, which UI elements you last interacted with, and the usernames of other users. They do not contain messages.": "Os registos de depuração contêm dados de utilização da aplicação, incluindo o seu nome de utilizador, os IDs ou pseudónimos das salas que visitou, os últimos elementos da IU com que interagiu e os nomes de utilizador de outros utilizadores. No entanto não contêm mensagens.", + "Unable to check if username has been taken. Try again later.": "Não foi possível verificar se o nome de utilizador já foi usado. Tente novamente mais tarde.", + " invited you": " convidou-o", + "Someone already has that username. Try another or if it is you, sign in below.": "Alguém já tem esse nome de utilizador. Tente outro ou, se fores tu, inicia sessão em baixo.", + "No one will be able to reuse your username (MXID), including you: this username will remain unavailable": "Ninguém poderá reutilizar o seu nome de utilizador (MXID), incluindo o próprio: este nome de utilizador permanecerá indisponível", + "Your platform and username will be noted to help us use your feedback as much as we can.": "A sua plataforma e o seu nome de utilizador serão anotados para nos ajudar a utilizar o seu feedback da melhor forma possível.", + "Start a conversation with someone using their name, email address or username (like ).": "Comece uma conversa com alguém a partir do nome, endereço de email ou nome de utilizador (por exemplo: ).", + "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Pré-anexa ( ͡° ͜ʖ ͡°) a uma mensagem de texto simples", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Pré-anexa ┬──┬ ノ( ゜-゜ノ) a uma mensagem de texto simples", + "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Pré-anexa ¯ \\ _ (ツ) _ / ¯ a uma mensagem de texto simples", + "Effects": "Ações", + "Zambia": "Zâmbia", + "Missing roomId.": "Falta ID de Sala.", + "Custom (%(level)s)": "Personalizado (%(level)s)", + "Sign In or Create Account": "Iniciar Sessão ou Criar Conta", + "Zimbabwe": "Zimbabué", + "Yemen": "Iémen", + "Western Sahara": "Saara Ocidental", + "Wallis & Futuna": "Wallis e Futuna", + "Vietnam": "Vietname", + "Venezuela": "Venezuela", + "Vatican City": "Cidade do Vaticano", + "Vanuatu": "Vanuatu", + "Uzbekistan": "Uzbequistão", + "Uruguay": "Uruguai", + "United Arab Emirates": "Emirados Árabes Unidos", + "Ukraine": "Ucrânia", + "Uganda": "Uganda", + "U.S. Virgin Islands": "Ilhas Virgens Americanas", + "Tuvalu": "Tuvalu", + "Turks & Caicos Islands": "Ilhas Turcas e Caicos", + "Turkmenistan": "Turquemenistão", + "Turkey": "Turquia", + "Tunisia": "Tunísia", + "Tonga": "Tonga", + "Trinidad & Tobago": "Trindade e Tobago", + "Tokelau": "Tokelau", + "Togo": "Togo", + "Timor-Leste": "Timor-Leste", + "Thailand": "Tailândia", + "Tajikistan": "Tajiquistão", + "Tanzania": "Tanzânia", + "São Tomé & Príncipe": "São Tomé e Príncipe", + "Taiwan": "Taiwan", + "Syria": "Síria", + "Switzerland": "Suíça", + "Swaziland": "Suazilândia", + "Sweden": "Suécia", + "Svalbard & Jan Mayen": "Svalbard e Jan Mayen", + "Suriname": "Suriname", + "Sudan": "Sudão", + "St. Vincent & Grenadines": "São Vicente e Granadinas", + "St. Martin": "São Martinho", + "St. Lucia": "Santa Lúcia", + "St. Kitts & Nevis": "São Cristóvão e Nevis", + "St. Helena": "Santa Helena", + "Sri Lanka": "Sri Lanka", + "Spain": "Espanha", + "South Sudan": "Sudão do Sul", + "South Korea": "Coreia do Sul", + "South Africa": "África do Sul", + "Somalia": "Somália", + "Solomon Islands": "Ilhas Salomão", + "Slovenia": "Eslovênia", + "Slovakia": "Eslováquia", + "Sint Maarten": "São Martinho", + "Singapore": "Singapura", + "Sierra Leone": "Serra Leoa", + "Seychelles": "Seychelles", + "Serbia": "Sérvia", + "Senegal": "Senegal", + "Saudi Arabia": "Arábia Saudita", + "San Marino": "San Marino", + "Réunion": "Reunião", + "Samoa": "Samoa", + "Rwanda": "Ruanda", + "Russia": "Rússia", + "Romania": "Roménia", + "Qatar": "Catar", + "Puerto Rico": "Porto Rico", + "Portugal": "Portugal", + "Poland": "Polónia", + "Pitcairn Islands": "Ilhas Pitcairn", + "Philippines": "Filipinas", + "Peru": "Peru", + "Paraguay": "Paraguai", + "Papua New Guinea": "Papua-Nova Guiné", + "Palestine": "Palestina", + "Pakistan": "Paquistão", + "Oman": "Oman", + "Norway": "Noruega", + "Northern Mariana Islands": "Ilhas Mariana do Norte", + "North Korea": "Coreia do Norte", + "Niue": "Niue", + "Nigeria": "Nigéria", + "Niger": "Níger", + "Nicaragua": "Nicarágua", + "New Zealand": "Nova Zelândia", + "Netherlands": "Países Baixos", + "New Caledonia": "Nova Caledónia", + "Nepal": "Nepal", + "Nauru": "Nauru", + "Namibia": "Namíbia", + "Myanmar": "Myanmar", + "Morocco": "Marrocos", + "Mozambique": "Moçambique", + "Montserrat": "Montserrat", + "Montenegro": "Montenegro", + "Kyrgyzstan": "Quirguizistão", + "Kuwait": "Kuwait", + "Kosovo": "Kosovo", + "Kiribati": "Kiribati", + "Kenya": "Quénia", + "Jordan": "Jordânia", + "Kazakhstan": "Cazaquistão", + "Jersey": "Jersey", + "Japan": "Japão", + "Jamaica": "Jamaica", + "Israel": "Israel", + "Italy": "Itália", + "Isle of Man": "Ilha de Man", + "Ireland": "Irlanda", + "Iraq": "Iraque", + "Iran": "Irão", + "Indonesia": "Indonésia", + "India": "Índia", + "Iceland": "Islândia", + "Hungary": "Hungria", + "Hong Kong": "Hong Kong", + "Honduras": "Honduras", + "Heard & McDonald Islands": "Ilhas Heard e McDonald", + "Haiti": "Haiti", + "Actions": "Ações", + "Messages": "Mensagens", + "Go Back": "Voltar", + "Are you sure you want to cancel entering passphrase?": "Tem a certeza que quer cancelar a introdução da frase-passe?", + "Cancel entering passphrase?": "Cancelar a introdução da frase-passe?", + "Madagascar": "Madagáscar", + "Add an email to be able to reset your password.": "Adicione um email para poder repôr a palavra-passe.", + "New here? Create an account": "Novo aqui? Crie uma conta", + "Someone already has that username, please try another.": "Alguém já tem esse nome de utilizador, tente outro por favor.", + "Invite someone using their name, username (like ) or share this space.": "Convide alguém a partir do nome, nome de utilizador (como ) ou partilhe este espaço.", + "Macedonia": "Macedónia", + "Luxembourg": "Luxemburgo", + "St. Pierre & Miquelon": "São Pedro e Miquelon", + "Join millions for free on the largest public server": "Junte-se a milhões gratuitamente no maior servidor público", + "Enter username": "Introduza um nome de utilizador", + "Failed to send event": "Falha no envio do evento", + "Failed to read events": "Falha ao ler eventos", + "Setting up keys": "A configurar chaves" } diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index aaef56178d9..91489e493c5 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -760,8 +760,6 @@ "Add Phone Number": "Adicionar número de telefone", "Call failed due to misconfigured server": "A chamada falhou por conta de má configuração no servidor", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Por favor, peça ao administrador do seu servidor (%(homeserverDomain)s) para configurar um servidor TURN, de modo que as chamadas funcionem de maneira estável.", - "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.": "Alternativamente, você pode tentar usar o servidor público em turn.matrix.org. No entanto, ele não é tão confiável e compartilhará o seu IP com esse servidor. Você também pode configurar isso nas Configurações.", - "Try using turn.matrix.org": "Tente utilizar turn.matrix.org", "The file '%(fileName)s' failed to upload.": "O envio do arquivo '%(fileName)s' falhou.", "The server does not support the room version specified.": "O servidor não suporta a versão da sala especificada.", "Cancel entering passphrase?": "Cancelar a introdução da frase de senha?", @@ -2498,8 +2496,6 @@ "Surround selected text when typing special characters": "Circule o texto selecionado ao digitar caracteres especiais", "Use new room breadcrumbs": "Use a localização atual da nova sala", "Click the button below to confirm signing out these devices.|one": "Clique no botão abaixo para confirmar a desconexão deste dispositivo.", - "Unable to load device list": "Não foi possível carregar a lista de dispositivos", - "Your homeserver does not support device management.": "Seu homeserver não suporta gerenciamento de dispositivos.", "Click the button below to confirm signing out these devices.|other": "Clique no botão abaixo para confirmar a desconexão de outros dispositivos.", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Confirme o logout deste dispositivo usando o logon único para provar sua identidade.", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "Confirme o logout desses dispositivos usando o logon único para provar sua identidade.", @@ -2583,10 +2579,7 @@ "Home is useful for getting an overview of everything.": "A página inicial é útil para obter uma visão geral de tudo.", "Spaces to show": "Espaços para mostrar", "Sidebar": "Barra lateral", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Gerencie seus dispositivos conectados abaixo. O nome de um dispositivo é visível para as pessoas com quem você se comunica.", - "Where you're signed in": "Onde você está conectado", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Compartilhe dados anônimos para nos ajudar a identificar problemas. Nada pessoal. Sem terceiros.", - "Okay": "OK", "Displaying time": "Exibindo tempo", "To view all keyboard shortcuts, click here.": "Para ver todos os atalhos do teclado, clique aqui.", "Show tray icon and minimise window to it on close": "Mostrar o ícone da bandeja e minimizar a janela ao fechar", @@ -2602,15 +2595,7 @@ "Large": "Grande", "Image size in the timeline": "Tamanho da imagem na linha do tempo", "Rename": "Renomear", - "Sign Out": "Sair", - "This device": "Este dispositivo", - "You aren't signed into any other devices.": "Você não está conectado a nenhum outro dispositivo.", - "Sign out %(count)s selected devices|one": "Desconectar %(count)s dispositivo selecionado", - "Sign out %(count)s selected devices|other": "Sair dos %(count)s dispositivos selecionados", - "Devices without encryption support": "Dispositivos sem suporte para criptografia", "Deselect all": "Desmarcar todos", - "Unverified devices": "Dispositivos não verificados", - "Verified devices": "Dispositivos verificados", "Select all": "Selecionar tudo", "Sign out devices|one": "Desconectar dispositivo", "Sign out devices|other": "Desconectar dispositivos", diff --git a/src/i18n/strings/ro.json b/src/i18n/strings/ro.json index 7a0bd015257..0ad07900b21 100644 --- a/src/i18n/strings/ro.json +++ b/src/i18n/strings/ro.json @@ -51,8 +51,6 @@ "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Apelul nu a reușit deoarece microfonul nu a putut fi accesat. Verificați dacă un microfon este conectat și configurați corect.", "Unable to access microphone": "Nu se poate accesa microfonul", "OK": "OK", - "Try using turn.matrix.org": "Încercați să utilizați turn.matrix.org", - "Alternatively, you can try to use the public server at turn.matrix.org, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativ, puteți încerca să utilizați serverul public la turn.matrix.org, dar acest lucru nu va fi la fel de fiabil și va partaja adresa dvs. IP cu acel server. Puteți gestiona acest lucru și în Setări.", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Vă rugăm să cereți administratorului serverului dvs. (%(homeserverDomain)s) să configureze un server TURN pentru ca apelurile să funcționeze în mod fiabil.", "Call failed due to misconfigured server": "Apelul nu a reușit din cauza serverului configurat greșit", "The call was answered on another device.": "Apelul a primit răspuns pe un alt dispozitiv.", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 1c0121a8e6e..c11cc78460a 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -935,7 +935,6 @@ "Clear personal data": "Очистить персональные данные", "This account has been deactivated.": "Эта учётная запись была деактивирована.", "Call failed due to misconfigured server": "Вызов не состоялся из-за неправильно настроенного сервера", - "Try using turn.matrix.org": "Попробуйте использовать turn.matrix.org", "Messages": "Сообщения", "Actions": "Действия", "Displays list of commands with usages and descriptions": "Отображает список команд с описанием и использованием", @@ -951,7 +950,6 @@ "Disconnect": "Отключить", "Do not use an identity server": "Не использовать сервер идентификации", "Enter a new identity server": "Введите новый идентификационный сервер", - "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-адрес этому серверу. Вы также можете управлять этим в настройках.", "Sends a message as plain text, without interpreting it as markdown": "Посылает сообщение в виде простого текста, не интерпретируя его как разметку", "Use an identity server": "Используйте сервер идентификации", "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Используйте сервер идентификации что бы пригласить по электронной почте Нажмите Продолжить, чтобы использовать стандартный сервер идентифицации(%(defaultIdentityServerName)s) или изменить в Настройках.", @@ -2281,7 +2279,6 @@ "You can add more later too, including already existing ones.": "Позже можно добавить и другие, в том числе уже существующие.", "Let's create a room for each of them.": "Давайте создадим для каждого из них отдельную комнату.", "What are some things you want to discuss in %(spaceName)s?": "Какие вещи вы хотите обсуждать в %(spaceName)s?", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Это экспериментальная функция. Пока что новые пользователи, получившие приглашение, должны будут открыть приглашение на , чтобы присоединиться.", "Go to my space": "В моё пространство", "Pick rooms or conversations to add. This is just a space for you, no one will be informed. You can add more later.": "Выберите комнаты или разговоры для добавления. Это просто место для вас, никто не будет проинформирован. Вы можете добавить больше позже.", "What do you want to organise?": "Что вы хотели бы организовать?", @@ -2852,10 +2849,7 @@ "Spaces are ways to group rooms and people. Alongside the spaces you're in, you can use some pre-built ones too.": "Пространства — это способ группировки комнат и людей. Наряду с пространствами, в которых вы находитесь, вы также можете использовать некоторые предварительно созданные пространства.", "Spaces to show": "Пространства для показа", "Sidebar": "Боковая панель", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Управляйте сеансами, в которые вы вошли. Название сеанса видят люди, с которыми вы общаетесь.", - "Where you're signed in": "Где вы вошли", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Поделитесь анонимными данными, чтобы помочь нам выявить проблемы. Никаких личных данных. Никаких третьих лиц.", - "Okay": "Хорошо", "To view all keyboard shortcuts, click here.": "Чтобы просмотреть все сочетания клавиш, нажмите здесь.", "Show tray icon and minimise window to it on close": "Показывать значок в трее и сворачивать в него окно при закрытии", "Keyboard": "Горячие клавиши", @@ -2865,14 +2859,6 @@ "Large": "Большой", "Image size in the timeline": "Размер изображения в ленте сообщений", "Rename": "Переименовать", - "Sign Out": "Выйти", - "This device": "Текущий сеанс", - "You aren't signed into any other devices.": "Вы не вошли ни на каких других устройствах.", - "Sign out %(count)s selected devices|one": "Выйти из %(count)s выбранного сеанса", - "Sign out %(count)s selected devices|other": "Выйти из %(count)s выбранных сеансов", - "Devices without encryption support": "Сеансы без поддержки шифрования", - "Unverified devices": "Незаверенные сеансы", - "Verified devices": "Заверенные сеансы", "Select all": "Выбрать все", "Deselect all": "Отменить выбор", "Sign out devices|one": "Выйти из устройства", @@ -2881,8 +2867,6 @@ "Click the button below to confirm signing out these devices.|other": "Нажмите кнопку ниже, чтобы подтвердить выход из этих устройств.", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Подтвердите выход из этого устройства с помощью единого входа, чтобы подтвердить свою личность.", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "Подтвердите выход из этих устройств с помощью единого входа, чтобы подтвердить свою личность.", - "Unable to load device list": "Не удалось загрузить список устройств", - "Your homeserver does not support device management.": "Ваш домашний сервер не поддерживает управление устройствами.", "Pin to sidebar": "Закрепить на боковой панели", "Quick settings": "Быстрые настройки", "Waiting for you to verify on your other device…": "Ожидает проверки на другом устройстве…", @@ -3372,7 +3356,6 @@ "Version": "Версия", "URL": "URL-адрес", "Room info": "О комнате", - "New session manager": "Новый менеджер сеансов", "Operating system": "Операционная система", "Element Call video rooms": "Видеокомнаты Element Call", "Video call (Jitsi)": "Видеозвонок (Jitsi)", @@ -3382,10 +3365,8 @@ "Model": "Модель", "Live": "В эфире", "Video call (%(brand)s)": "Видеозвонок (%(brand)s)", - "Use new session manager": "Использовать новый менеджер сеансов", "Voice broadcasts": "Аудиопередачи", "Voice broadcast": "Голосовая трансляция", - "Have greater visibility and control over all your sessions.": "Получите наилучшую видимость и контроль над всеми вашими сеансами.", "New group call experience": "Новый опыт группового вызова", "Video call started": "Начался видеозвонок", "Video call started in %(roomName)s. (not supported by this browser)": "Видеовызов начался в %(roomName)s. (не поддерживается этим браузером)", @@ -3397,7 +3378,6 @@ "Fill screen": "Заполнить экран", "Sorry — this call is currently full": "Извините — этот вызов в настоящее время заполнен", "Record the client name, version, and url to recognise sessions more easily in session manager": "Записывать название клиента, версию и URL-адрес для более лёгкого распознавания сеансов в менеджере сеансов", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Наш новый менеджер сеансов обеспечивает лучшую видимость всех ваших сеансов и больший контроль над ними, включая возможность удаленного переключения push-уведомлений.", "Italic": "Курсив", "Underline": "Подчёркнутый", "Notifications silenced": "Оповещения приглушены", @@ -3438,7 +3418,6 @@ "Apply": "Применить", "You ended a voice broadcast": "Вы завершили голосовую трансляцию", "%(senderName)s ended a voice broadcast": "%(senderName)s завершил(а) голосовую трансляцию", - "Verify this device to access all messages": "Заверьте этот сеанс, чтобы получить доступ ко всем сообщениям", "You ended a voice broadcast": "Вы завершили голосовую трансляцию", "%(senderName)s ended a voice broadcast": "%(senderName)s завершил(а) голосовую трансляцию", "Send email": "Отправить электронное письмо", @@ -3448,11 +3427,6 @@ "New ways to ignore people": "Новые способы игнорировать людей", "Under active development, cannot be disabled.": "В активной разработке, нельзя отключить.", "Under active development.": "В активной разработке.", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Пожалуйста, ожидайте, пока мы попытаемся расшифровать ваши сообщения. Это может занять несколько минут.", - "This device was unable to decrypt some messages because it has not been verified yet.": "Этот сеанс не смог расшифровать некоторые сообщения, поскольку он ещё не подтверждён.", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "Этот сеанс запрашивает ключи расшифровки у других ваших сеансов. Открытие одного из других сеансов может ускорить этот процесс.", - "Open another device to load encrypted messages": "Откройте другой сеанс для загрузки зашифрованных сообщений", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "К сожалению, нет других подтверждённых сеансов, у которых можно было бы запросить ключи расшифровки. Вход в систему и подтверждение других сеансов могут помочь избежать подобной ситуации в будущем.", "Improve your account security by following these recommendations.": "Усильте защиту учётной записи, следуя этим рекомендациям.", "Verify your current session for enhanced secure messaging.": "Заверьте текущий сеанс для усиления защиты переписки.", "Mark as read": "Отметить как прочитанное", @@ -3463,7 +3437,6 @@ "What's next for %(brand)s? Labs are the best way to get things early, test out new features and help shape them before they actually launch.": "Что нового в %(brand)s? Labs — это лучший способ получить и испытать новые функции, помогая сформировать их перед выходом в свет.", "Upcoming features": "Новые возможности", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "Только применяется, когда у домашнего сервера нет своего TURN-сервера. Ваш IP-адрес будет виден на время звонка.", - "Allow fallback call assist server (turn.matrix.org)": "Разрешить вспомогательный сервер для звонков (turn.matrix.org)", "When enabled, the other party might be able to see your IP address": "Когда включено, другой пользователь сможет видеть ваш IP-адрес", "Allow Peer-to-Peer for 1:1 calls": "Разрешить прямое соединение для 1:1 звонков", "Connection": "Соединение", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index d65c3a2410f..e800a898d4c 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -801,8 +801,6 @@ "If you didn't remove the recovery method, an attacker may be trying to access your account. Change your account password and set a new recovery method immediately in Settings.": "Ak ste neodstránili spôsob obnovenia vy, je možné, že útočník sa pokúša dostať k vášmu účtu. Radšej si ihneď zmeňte vaše heslo a nastavte si nový spôsob obnovenia v Nastaveniach.", "Call failed due to misconfigured server": "Hovor zlyhal z dôvodu nesprávne nastaveného servera", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Prosím, požiadajte správcu vášho domovského servera (%(homeserverDomain)s) aby nakonfiguroval Turn server, čo zlepší spoľahlivosť audio / video hovorov.", - "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.": "Ako náhradu môžete použiť verejný server s adresou turn.matrix.org, čo nemusí byť úplne spoľahlivé a tiež odošle vašu adresu IP na spomínaný server. Toto môžete kedykoľvek opätovne zmeniť v časti Nastavenia.", - "Try using turn.matrix.org": "Skúsiť používať turn.matrix.org", "The file '%(fileName)s' failed to upload.": "Nepodarilo sa nahrať súbor „%(fileName)s“.", "The server does not support the room version specified.": "Server nepodporuje zadanú verziu miestnosti.", "Messages": "Správy", @@ -1510,8 +1508,6 @@ "Enable email notifications for %(email)s": "Povolenie e-mailových oznámení pre %(email)s", "Select all": "Vybrať všetky", "Deselect all": "Zrušiť výber všetkých", - "Unverified devices": "Neoverené zariadenia", - "Verified devices": "Overené zariadenia", "Images, GIFs and videos": "Obrázky, GIF animácie a videá", "New keyword": "Nové kľúčové slovo", "Keyword": "Kľúčové slovo", @@ -1554,9 +1550,6 @@ "Show all your rooms in Home, even if they're in a space.": "Zobrazte všetky miestnosti v časti Domov, aj keď sú v priestore.", "Show all rooms in Home": "Zobraziť všetky miestnosti v časti Domov", "Sign out and remove encryption keys?": "Odhlásiť sa a odstrániť šifrovacie kľúče?", - "Sign Out": "Odhlásiť sa", - "Sign out %(count)s selected devices|one": "Odhlásiť %(count)s vybrané zariadenie", - "Sign out %(count)s selected devices|other": "Odhlásiť %(count)s vybraných zariadení", "Sign out devices|one": "Odhlásiť zariadenie", "Sign out devices|other": "Odhlásené zariadenia", "Rename": "Premenovať", @@ -1607,10 +1600,7 @@ "Privacy": "Súkromie", "Cross-signing is ready for use.": "Krížové podpisovanie je pripravené na použitie.", "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.": "Zálohujte si šifrovacie kľúče s údajmi o účte pre prípad, že stratíte prístup k reláciám. Vaše kľúče budú zabezpečené jedinečným bezpečnostným kľúčom.", - "Devices without encryption support": "Zariadenia bez podpory šifrovania", "The authenticity of this encrypted message can't be guaranteed on this device.": "Vierohodnosť tejto zašifrovanej správy nie je možné na tomto zariadení zaručiť.", - "This device": "Toto zariadenie", - "Where you're signed in": "Kde ste prihlásení", "Autoplay videos": "Automaticky prehrať videá", "Autoplay GIFs": "Automaticky prehrať GIF animácie", "Surround selected text when typing special characters": "Obklopiť vybraný text pri písaní špeciálnych znakov", @@ -1674,7 +1664,6 @@ "Sign Up": "Zaregistrovať sa", "Cancel All": "Zrušiť všetky", "Revoke invite": "Odvolať pozvánku", - "Okay": "OK", "Chat": "Konverzácia", "Developer": "Vývojárske", "Experimental": "Experimentálne", @@ -1763,7 +1752,6 @@ "Olm version:": "Olm verzia:", "Backup version:": "Verzia zálohy:", "New version of %(brand)s is available": "K dispozícii je nová verzia %(brand)s", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Spravujte svoje prihlásené zariadenia. Názov zariadenia je viditeľný pre ľudí, s ktorými komunikujete.", "Role in ": "Rola v ", "Plain Text": "Obyčajný text", "To publish an address, it needs to be set as a local address first.": "Ak chcete zverejniť adresu, je potrebné ju najprv nastaviť ako lokálnu adresu.", @@ -2086,7 +2074,6 @@ "You're the only admin of some of the rooms or spaces you wish to leave. Leaving them will leave them without any admins.": "Ste jediným správcom niektorých miestností alebo priestorov, ktoré chcete opustiť. Ich opustenie ich ponechá bez administrátorov.", "You're the only admin of this space. Leaving it will mean no one has control over it.": "Ste jediným správcom tohto priestoru. Jeho opustenie bude znamenať, že nad ním nikto nebude mať kontrolu.", "Your firewall or anti-virus is blocking the request.": "Požiadavku blokuje váš firewall alebo antivírus.", - "Your homeserver does not support device management.": "Váš domovský server nepodporuje správu zariadení.", "Your homeserver doesn't seem to support this feature.": "Zdá sa, že váš domovský server túto funkciu nepodporuje.", "Your messages are not secure": "Vaše správy nie sú zabezpečené", "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "Vaše správy sú zabezpečené a jedinečné kľúče na ich odomknutie máte len vy a príjemca.", @@ -2381,7 +2368,6 @@ "Moderation": "Moderovanie", "Automatically send debug logs on any error": "Automatické odosielanie záznamov ladenia pri akejkoľvek chybe", "Developer mode": "Režim pre vývojárov", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Toto je experimentálna funkcia. Noví používatelia, ktorí dostanú pozvánku, ju zatiaľ musia otvoriť na , aby sa mohli skutočne pripojiť.", "Access your secure message history and set up secure messaging by entering your Security Key.": "Získajte prístup k histórii zabezpečených správ a nastavte bezpečné zasielanie správ zadaním bezpečnostného kľúča.", "Access your secure message history and set up secure messaging by entering your Security Phrase.": "Získajte prístup k histórii zabezpečených správ a nastavte bezpečné zasielanie správ zadaním bezpečnostnej frázy.", "Offline encrypted messaging using dehydrated devices": "Šifrované posielanie správ offline pomocou dehydrovaných zariadení", @@ -2658,10 +2644,8 @@ "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.": "Táto miestnosť sa nachádza v niektorých priestoroch, ktorých nie ste správcom. V týchto priestoroch bude stará miestnosť stále zobrazená, ale ľudia budú vyzvaní, aby sa pripojili k novej miestnosti.", "Currently, %(count)s spaces have access|one": "V súčasnosti má priestor prístup", "Currently, %(count)s spaces have access|other": "V súčasnosti má prístup %(count)s priestorov", - "You aren't signed into any other devices.": "Nie ste prihlásení do žiadneho iného zariadenia.", "Click the button below to confirm signing out these devices.|one": "Kliknutím na tlačidlo nižšie potvrdíte odhlásenie tohto zariadenia.", "Click the button below to confirm signing out these devices.|other": "Kliknutím na tlačidlo nižšie potvrdíte odhlásenie týchto zariadení.", - "Unable to load device list": "Nie je možné načítať zoznam zariadení", "not found in storage": "sa nenašiel v úložisku", "Failed to update the visibility of this space": "Nepodarilo sa aktualizovať viditeľnosť tohto priestoru", "Guests can join a space without having an account.": "Hostia sa môžu pripojiť k priestoru bez toho, aby mali konto.", @@ -3422,10 +3406,6 @@ "Start %(brand)s calls": "Spustiť %(brand)s hovory", "Fill screen": "Vyplniť obrazovku", "Sorry — this call is currently full": "Prepáčte — tento hovor je momentálne obsadený", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Náš nový správca relácií poskytuje lepší prehľad o všetkých vašich reláciách a lepšiu kontrolu nad nimi vrátane možnosti vzdialene prepínať push oznámenia.", - "Have greater visibility and control over all your sessions.": "Majte lepší prehľad a kontrolu nad všetkými reláciami.", - "New session manager": "Nový správca relácií", - "Use new session manager": "Použiť nového správcu relácií", "Underline": "Podčiarknuté", "Italic": "Kurzíva", "resume voice broadcast": "obnoviť hlasové vysielanie", @@ -3481,7 +3461,6 @@ "Automatically adjust the microphone volume": "Automaticky upraviť hlasitosť mikrofónu", "Voice settings": "Nastavenia hlasu", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "Platí len v prípade, ak váš domovský server takúto možnosť neponúka. Vaša IP adresa bude počas hovoru zdieľaná.", - "Allow fallback call assist server (turn.matrix.org)": "Povoliť asistenčný server núdzového volania (turn.matrix.org)", "Noise suppression": "Potlačenie hluku", "Echo cancellation": "Potlačenie ozveny", "Automatic gain control": "Automatické riadenie zosilnenia", @@ -3555,17 +3534,6 @@ "Defaults to room member list.": "Predvolené nastavenie je zoznam členov miestnosti.", "Unable to decrypt message": "Nie je možné dešifrovať správu", "This message could not be decrypted": "Túto správu sa nepodarilo dešifrovať", - "Resend key requests": "Opätovne odoslať žiadosti o kľúč", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "Nanešťastie neexistujú žiadne iné overené zariadenia, od ktorých by ste si mohli vyžiadať dešifrovacie kľúče. Prihlásenie a overenie iných zariadení môže pomôcť vyhnúť sa tejto situácii v budúcnosti.", - "Some messages could not be decrypted": "Niektoré správy nebolo možné dešifrovať", - "View your device list": "Zobraziť zoznam vašich zariadení", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "Toto zariadenie požaduje od vašich ostatných zariadení dešifrovacie kľúče. Otvorenie jedného z vašich ďalších zariadení to môže urýchliť.", - "Open another device to load encrypted messages": "Otvoriť iné zariadenie na načítanie zašifrovaných správ", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "K starým nedešifrovateľným správam nebudete mať prístup, ale obnovenie kľúčov vám umožní prijímať nové správy.", - "Reset your keys to prevent future decryption errors": "Obnovte svoje kľúče, aby ste predišli budúcim chybám pri dešifrovaní", - "This device was unable to decrypt some messages because it has not been verified yet.": "Toto zariadenie nebolo schopné dešifrovať niektoré správy, pretože ešte nebolo overené.", - "Verify this device to access all messages": "Overte toto zariadenie na prístup ku všetkým správam", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Počkajte, prosím, kým sa pokúsime dešifrovať vaše správy. Môže to chvíľu trvať.", "%(senderName)s ended a voice broadcast": "%(senderName)s ukončil/a hlasové vysielanie", "You ended a voice broadcast": "Ukončili ste hlasové vysielanie", "Rust cryptography implementation": "Implementácia kryptografie Rust", @@ -3667,7 +3635,6 @@ "Joining space…": "Pripájanie sa do priestoru …", "Encrypting your message…": "Šifrovanie vašej správy…", "Sending your message…": "Odosielanie vašej správy…", - "Decrypting messages…": "Dešifrovanie správ…", "Warning: upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "Pozor:Aktualizácia miestnosti neumožní automatickú migráciu členov miestnosti do novej verzie miestnosti.. Odkaz na novú miestnosť uverejníme v starej verzii miestnosti - členovia miestnosti budú musieť kliknúť na tento odkaz, aby sa mohli pripojiť k novej miestnosti.", "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 '%(myBanList)s' - stay in this room to keep the ban list in effect.": "V osobnom zozname zakázaných používateľov sú všetci používatelia/servery, od ktorých si osobne neželáte vidieť správy. Po ignorovaní prvého používateľa/servera sa vo vašom zozname miestností objaví nová miestnosť s názvom \"%(myBanList)s\" - zostaňte v tejto miestnosti, aby bol zoznam zákazov platný.", "Set a new account password…": "Nastaviť nové heslo k účtu…", @@ -3777,5 +3744,11 @@ "Once invited users have joined %(brand)s, you will be able to chat and the room will be end-to-end encrypted": "Keď sa pozvaní používatelia pripoja k aplikácii %(brand)s, budete môcť konverzovať a miestnosť bude end-to-end šifrovaná", "Waiting for users to join %(brand)s": "Čaká sa na používateľov, kým sa pripoja k aplikácii %(brand)s", "You do not have permission to invite users": "Nemáte oprávnenie pozývať používateľov", - "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s zmenil/a svoje zobrazované meno a profilový obrázok" + "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s zmenil/a svoje zobrazované meno a profilový obrázok", + "Your language": "Váš jazyk", + "Your device ID": "ID vášho zariadenia", + "Alternatively, you can try to use the public server at , but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Prípadne môžete skúsiť použiť verejný server na adrese , ale nebude to tak spoľahlivé a vaša IP adresa bude zdieľaná s týmto serverom. Môžete to spravovať aj v nastaveniach.", + "Try using %(server)s": "Skúste použiť %(server)s", + "User is not logged in": "Používateľ nie je prihlásený", + "Allow fallback call assist server (%(server)s)": "Povoliť náhradnú službu hovorov asistenčného servera (%(server)s)" } diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 36eaaa6aff7..9bed05c82ba 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -955,8 +955,6 @@ "Discovery options will appear once you have added a phone number above.": "Mundësitë e zbulimit do të shfaqen sapo të keni shtuar më sipër një numër telefoni.", "Call failed due to misconfigured server": "Thirrja dështoi për shkak shërbyesi të keqformësuar", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Që thirrjet të funksionojnë pa probleme, ju lutemi, kërkojini përgjegjësit të shërbyesit tuaj Home (%(homeserverDomain)s) të formësojë një shërbyes TURN.", - "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.": "Ndryshe, mund të provoni të përdorni shërbyesin publik te turn.matrix.org, por kjo s’do të jetë edhe aq e qëndrueshme, dhe adresa juaj IP do t’i bëhet e njohur atij shërbyesi. Këtë mund ta bëni edhe që nga Rregullimet.", - "Try using turn.matrix.org": "Provo të përdorësh turn.matrix.org", "Identity server has no terms of service": "Shërbyesi i identiteteve s’ka kushte shërbimi", "The identity server you have chosen does not have any terms of service.": "Shërbyesi i identiteteve që keni zgjedhur nuk ka ndonjë kusht shërbimi.", "Only continue if you trust the owner of the server.": "Vazhdoni vetëm nëse i besoni të zotit të shërbyesit.", @@ -2294,7 +2292,6 @@ "You have no ignored users.": "S’keni përdorues të shpërfillur.", "Play": "Luaje", "Pause": "Ndalesë", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Kjo është një veçori eksperimentale. Hëpërhë, përdoruesve të rinj që marrin një ftesë, do t’u duhet ta hapin ftesën në , që të marrin pjesë.", "Search names and descriptions": "Kërko te emra dhe përshkrime", "Select a room below first": "Së pari, përzgjidhni më poshtë një dhomë", "Join the beta": "Merrni pjesë te beta", @@ -2678,18 +2675,8 @@ "Yours, or the other users' internet connection": "Lidhja internet e juaja, ose e përdoruesve të tjerë", "The homeserver the user you're verifying is connected to": "Shërbyesi Home te i cili është lidhur përdoruesi që po verifikoni", "This room isn't bridging messages to any platforms. Learn more.": "Kjo dhomë s’kalon mesazhe në ndonjë platformë. Mësoni më tepër.", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Administroni më poshtë pajisjet tuaja ku jeni i futur. Emri i një pajisjeje është i dukshëm për persona që komunikojnë me ju.", - "Where you're signed in": "Nga ku hytë", "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.", "Rename": "Riemërtojeni", - "Sign Out": "Dilni", - "This device": "Këtë pajisje", - "You aren't signed into any other devices.": "S’keni bërë hyrjen në ndonjë pajisje tjetër.", - "Sign out %(count)s selected devices|one": "Bëj daljen nga %(count)s pajisje e përzgjedhur", - "Sign out %(count)s selected devices|other": "Bëj daljen nga %(count)s pajisje të përzgjedhura", - "Devices without encryption support": "Pajisje pa mbulim për fshehtëzim", - "Unverified devices": "Pajisje të paverifikuara", - "Verified devices": "Pajisje të verifikuara", "Select all": "Përzgjidhi krejt", "Deselect all": "Shpërzgjidhi krejt", "Sign out devices|one": "Dil nga pajisje", @@ -2698,8 +2685,6 @@ "Click the button below to confirm signing out these devices.|other": "Që të ripohoni daljen nga këto pajisje, klikoni butonin më poshtë.", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Ripohoni daljen nga kjo pajisje duke përdorur Hyrje Njëshe për të dëshmuar identitetin tuaj.", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "Ripohoni daljen nga këto pajisje duke përdorur Hyrje Njëshe për të dëshmuar identitetin tuaj.", - "Unable to load device list": "S’arrihet të ngarkohet listë pajisjesh", - "Your homeserver does not support device management.": "Shërbyesi juaj Home nuk mbulon administrim pajisjesh.", "Automatically send debug logs on any error": "Me çdo gabim, dërgo automatikisht regjistra diagnostikimi", "Use a more compact 'Modern' layout": "Përdorni një skemë “Moderne” më kompakte", "Add option": "Shtoni mundësi", @@ -2797,7 +2782,6 @@ "Share location": "Jepe vendndodhjen", "Manage pinned events": "Administroni veprimtari të fiksuara", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Ndani me ne të dhëna anonime, për të na ndihmuar të gjejmë problemet. Asgjë personale. Pa palë të treta.", - "Okay": "OK", "To view all keyboard shortcuts, click here.": "Që të shihni krejt shkurtoret e tastierës, klikoni këtu.", "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "Ndani me ne të dhëna anonime, për të na ndihmuar të gjejmë problemet. Asgjë personale. Pa palë të treta. Mësoni Më Tepër\t", "You previously consented to share anonymous usage data with us. We're updating how that works.": "Keni dhënë më parë pëlqimin të jepni për ne të dhëna anonime përdorimi. Po përditësojmë se si funksionon kjo punë.", @@ -3406,9 +3390,6 @@ "You made it!": "E bëtë!", "Sorry — this call is currently full": "Na ndjeni — aktualisht kjo thirrje është plot", "Record the client name, version, and url to recognise sessions more easily in session manager": "Regjistro emrin, versionin dhe URL-në e klientit, për të dalluar më kollaj sesionet te përgjegjës sesionesh", - "Have greater visibility and control over all your sessions.": "Shihini më qartë dhe kontrolloni më mirë krejt sesionet tuaj.", - "New session manager": "Përgjegjës i ri sesionesh", - "Use new session manager": "Përdorni përgjegjës të ri sesionesh", "Send read receipts": "Dërgo dëftesa leximi", "Notifications silenced": "Njoftime të heshtuara", "Video call started": "Nisi thirrje me video", @@ -3463,7 +3444,6 @@ "Get stuff done by finding your teammates": "Kryeni punët, duke gjetur kolegët e ekipit", "It’s what you’re here for, so lets get to it": "Kjo është ajo pse erdhët, ndaj ta bëjmë", "Show shortcut to welcome checklist above the room list": "Shhkurtoren e listës së hapave të mirëseardhjes shfaqe mbi listën e dhomave", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Përgjegjësi ynë i ri i sesioneve furnizon dukshmëri më të mirë të krejt sesioneve tuaja dhe kontroll më të fortë mbi ta, përfshi aftësinë për aktivizim/çaktivizim së largëti të njoftimeve push.", "Verify your email to continue": "Që të vazhdohet, verifikoni email-in tuaj", "%(homeserver)s will send you a verification link to let you reset your password.": "%(homeserver)s do t’ju dërgojë një lidhje verifikimi, që t’ju lejojë të ricaktoni fjalëkalimin tuaj.", "Enter your email to reset password": "Që të ricaktoni fjalëkalimin, jepni email-in tuaj", @@ -3545,17 +3525,6 @@ "You ended a voice broadcast": "Përfunduat një transmetim zanor", "Unable to decrypt message": "S’arrihet të shfshehtëzohet mesazhi", "This message could not be decrypted": "Ky mesazh s’u shfshehtëzua dot", - "Resend key requests": "Ridërgo kërkesa kyçesh", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "Mjerisht, s’ka pajisje të tjera të verifikuara prej nga të kërkohen kyçe shfshehtëzimi. Hyrja në llogari dhe verifikimi i pajisjeve të tjera mund të ndihmojë në shmangien e kësaj situate në të ardhmen.", - "Some messages could not be decrypted": "Disa mesazhe s’u shfshehtëzuan dot", - "View your device list": "Shihni listën e pajisjeve tuaja", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "Kjo pajisje lyp kyçe shfshehtëzimi prej pajisjeve tuaja të tjera. Hapja e njërës prej pajisjeve tuaja të tjera mund ta përshpejtojë këtë punë.", - "Open another device to load encrypted messages": "Që të ngarkohen mesazhet e fshehtëzuar, hapni pajisjen tjetër", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "S’do të jeni në gjendje të përdorni mesazhet e vjetër të pashfshehtëzueshëm, por riujdisja e kyçeve do t’ju lejojë të merrni mesazhet e rinj.", - "Reset your keys to prevent future decryption errors": "Që të parandaloni gabime të ardhshëm shfshehtëzimi, riujdisni kyçet tuaj", - "This device was unable to decrypt some messages because it has not been verified yet.": "Kjo pajisje s’qe e aftë të shfshehtëzojë disa mesazhe, ngaqë s’është verifikuar ende.", - "Verify this device to access all messages": "Verifikoni këtë pajisje. që të keni hyrje te krejt mesazhet", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Ju lutemi, prisni teksa provojmë të shfshehtëzojmë mesazhet tuaj. Kjo mund të dojë ca çaste.", "Rust cryptography implementation": "Sendërtim kriptografie Rust", "%(senderName)s ended a voice broadcast": "%(senderName)s përfundoi një transmetim zanor", "You ended a voice broadcast": "Përfunduat një transmetim zanor", @@ -3652,7 +3621,6 @@ "Joining space…": "Po hyhet në hapësirë…", "Encrypting your message…": "Po fshehtëzohet meszhi juaj…", "Sending your message…": "Po dërgohet mesazhi juaj…", - "Decrypting messages…": "Po shfshehtëzohen mesazhe…", "Warning: upgrading a room will not automatically migrate room members to the new version of the room. We'll post a link to the new room in the old version of the room - room members will have to click this link to join the new room.": "Kujdes: Përmirësimi i një dhome s’do të shkaktojë migrim vetvetiu të anëtarëve të dhomës te versioni i ri i saj. Do të postojmë në versionin e vjetër të dhomës një lidhje për te dhoma e re - anëtarëve të dhomës do t’u duhet të klikojnë mbi këtë lidhje, që të bëhen pjesë e dhomës së re.", "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 '%(myBanList)s' - stay in this room to keep the ban list in effect.": "Lista juaj personale e dëbimeve mban krejt përdoruesit/shërbyesit prej të cilëve ju personalisht s’dëshironi të shihni mesazhe. Pas shpërfilljes së përdoruesit/shërbyesit tuaj të parë, te lista juaj e dhomave do të shfaqet një dhomë e re e quajtur “%(myBanList)s” - që ta mbani listën e dëbimeve në fuqi, qëndroni i futur në këtë dhomë.", "Set a new account password…": "Caktoni një fjalëkalim të ri llogarie…", diff --git a/src/i18n/strings/sr.json b/src/i18n/strings/sr.json index 9d706573ecd..90eebe6aac1 100644 --- a/src/i18n/strings/sr.json +++ b/src/i18n/strings/sr.json @@ -509,8 +509,6 @@ "Are you sure you want to sign out?": "Заиста желите да се одјавите?", "Call failed due to misconfigured server": "Позив неуспешан због лоше подешеног сервера", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Замолите администратора вашег сервера (%(homeserverDomain)s) да подеси „TURN“ сервер како би позиви радили поуздано.", - "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, али ово неће бити толико поуздано и откриће вашу ИП адресу серверу. Овим можете управљати у Поставкама.", - "Try using turn.matrix.org": "Пробајте turn.matrix.org", "Use Single Sign On to continue": "Користи јединствену пријаву за наставак", "Confirm adding this email address by using Single Sign On to prove your identity.": "Потврдите додавање ове е-адресе коришћењем јединствене пријаве за доказивање вашег идентитета.", "Single Sign On": "Јединствена пријава", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 337ebb4e841..955a1ca94ba 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -791,7 +791,6 @@ "Upload Error": "Uppladdningsfel", "Your %(brand)s is misconfigured": "Din %(brand)s är felkonfigurerad", "Call failed due to misconfigured server": "Anrop misslyckades på grund av felkonfigurerad server", - "Try using turn.matrix.org": "Prova att använda turn.matrix.org", "The server does not support the room version specified.": "Servern stöder inte den angivna rumsversionen.", "Messages": "Meddelanden", "Actions": "Åtgärder", @@ -874,7 +873,6 @@ "edited": "redigerat", "Couldn't load page": "Kunde inte ladda sidan", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Be administratören för din hemserver (%(homeserverDomain)s) att konfigurera en TURN-server för att samtal ska fungera pålitligt.", - "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.": "Alternativt kan du testa att använda den offentliga servern turn.matrix.org, men det är inte lika pålitligt och det kommer att dela din IP-adress med den servern. Du kan också hantera detta under Inställningar.", "Changes the avatar of the current room": "Byter avataren i det nuvarande rummet", "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Använd en identitetsserver för att bjuda in via e-post. Klicka på Fortsätt för att använda standardidentitetsservern (%(defaultIdentityServerName)s) eller hantera det i Inställningar.", "Use an identity server to invite by email. Manage in Settings.": "Använd en identitetsserver för att bjuda in via e-post. Hantera det i inställningar.", @@ -2325,7 +2323,6 @@ "Access Token": "Åtkomsttoken", "Please enter a name for the space": "Vänligen ange ett namn för utrymmet", "Connecting": "Ansluter", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Det här är en experimentell funktion. För tillfället så behöver nya inbjudna användare öppna inbjudan på för att faktiskt gå med.", "Space Autocomplete": "Utrymmesautokomplettering", "Go to my space": "Gå till mitt utrymme", "sends space invaders": "skickar Space Invaders", @@ -2668,8 +2665,6 @@ "Light high contrast": "Ljust högkontrast", "%(senderDisplayName)s changed who can join this room.": "%(senderDisplayName)s ändrade vilka som kan gå med i det här rummet.", "%(senderDisplayName)s changed who can join this room. View settings.": "%(senderDisplayName)s ändrade vilka som kan gå med i det här rummet. Se inställningar.", - "Unable to load device list": "Kunde inte ladda enhets lista", - "Your homeserver does not support device management.": "Din hemserver stöder ännu inte enhetshantering.", "Automatically send debug logs on any error": "Skicka automatiskt felsökningsloggar vid fel", "Use a more compact 'Modern' layout": "Använd ett mer kompakt 'modernt' arrangemang", "Store your Security Key somewhere safe, like a password manager or a safe, as it's used to safeguard your encrypted data.": "Lagra din säkerhetsnyckel någonstans säkert, som en lösenordshanterare eller ett kassaskåp, eftersom den används för att säkra din krypterade data.", @@ -2697,18 +2692,8 @@ "The homeserver the user you're verifying is connected to": "Hemservern användaren du verifierar är ansluten till", "You do not have permission to start polls in this room.": "Du får inte starta omröstningar i det här rummet.", "This room isn't bridging messages to any platforms. Learn more.": "Det här rummet bryggar inte meddelanden till några platformar. Läs mer.", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Hantera dina inloggade enheter nedan. En enhets namn syns för personer du kommunicerar med.", - "Where you're signed in": "Var du är inloggad", "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.": "Det här rummet är med i några utrymmen du inte är admin för. I de utrymmena så kommer det gamla rummet fortfarande visas, men folk kommer uppmanas att gå med i det nya.", "Rename": "Döp om", - "Sign Out": "Logga ut", - "This device": "Denna enhet", - "You aren't signed into any other devices.": "Du är inte inloggad i några andra enheter.", - "Sign out %(count)s selected devices|one": "Logga ut %(count)s vald enhet", - "Sign out %(count)s selected devices|other": "Logga ut %(count)s valda enheter", - "Devices without encryption support": "Enheter utan krypteringsstöd", - "Unverified devices": "Overifierade enheter", - "Verified devices": "Verifierade enheter", "Select all": "Välj alla", "Deselect all": "Välj bort alla", "Sign out devices|one": "Logga ut enhet", @@ -2747,7 +2732,6 @@ "Spaces to show": "Utrymmen att visa", "Sidebar": "Sidofält", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Dela anonyma data med oss för att hjälpa oss att identifiera problem. Inget personligt. Inga tredje parter.", - "Okay": "Okej", "To view all keyboard shortcuts, click here.": "För att se alla tangentbordsgenvägar, klicka här.", "Show tray icon and minimise window to it on close": "Visa ikon i systembrickan och minimera programmet till den när fönstret stängs", "Large": "Stor", @@ -3296,10 +3280,6 @@ "resume voice broadcast": "återuppta röstsändning", "play voice broadcast": "spela röstsändning", "Yes, stop broadcast": "Ja, avsluta sändning", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Vår nya sessionshanterare ger dig bättre insyn i alla dina sessioner, och större kontroll över dem, inklusive förmågan att växla pushnotiser på håll.", - "Have greater visibility and control over all your sessions.": "Ha bättre insyn och kontroll över alla dina sessioner.", - "New session manager": "Ny sessionshanterare", - "Use new session manager": "Använd ny sessionshanterare", "New group call experience": "Ny gruppsamtalsupplevelse", "Record the client name, version, and url to recognise sessions more easily in session manager": "Spara klientens namn, version och URL för att lättare känna igen sessioner i sessionshanteraren", "Find and invite your friends": "Hitta och bjud in dina vänner", @@ -3324,7 +3304,6 @@ "Find friends": "Hitta vänner", "It’s what you’re here for, so lets get to it": "Det är det du är här för, så låt oss komma i gång", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "Gäller endast om din hemserver inte erbjuder en. Din IP-adress delas under samtal.", - "Allow fallback call assist server (turn.matrix.org)": "Tillåt reservserver för samtalsassistans (turn.matrix.org)", "Noise suppression": "Brusreducering", "Echo cancellation": "Ekoreducering", "Automatic gain control": "Automatisk förstärkningskontroll", @@ -3537,17 +3516,6 @@ "Sign in new device": "Logga in ny enhet", "Unable to decrypt message": "Kunde inte avkryptera meddelande", "This message could not be decrypted": "Det här meddelandet kunde inte avkrypteras", - "Resend key requests": "Återsänd nyckelförfrågningar", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "Tyvärr finns det inga andra verifierade enheter att begära avkrypteringsnycklar från. Att logga in och verifiera andra enheter kan hjälpa till att undvika detta i framtiden.", - "Some messages could not be decrypted": "Vissa meddelanden kunde inte avkrypteras", - "View your device list": "Visa din enhetslista", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "Den här enheten begär avkrypteringsnycklar från dina andra enheter. Att öppna en av dina andra enheter kan snabba upp det.", - "Open another device to load encrypted messages": "Öppna en annan enhet för att ladda krypterade meddelanden", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "Du kommer inte kunna komma åt gamla oavkrypterbara meddelanden, men att återställa dina nycklar kommer att låta dig ta emot nya meddelanden.", - "Reset your keys to prevent future decryption errors": "Återställ dina nycklar för att förhindra framtida avkrypteringsfel", - "This device was unable to decrypt some messages because it has not been verified yet.": "Den här enheten kunde inte avkryptera vissa meddelanden eftersom att den inte har verifierats än.", - "Verify this device to access all messages": "Verifiera den här enheten för att komma åt alla meddelanden", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Vänligen vänta medan vi försöker avkryptera dina meddelanden. Det här kan ta en stund.", "Rust cryptography implementation": "Kryptografiimplementering i Rust", "%(senderName)s ended a voice broadcast": "%(senderName)s avslutade en röstsändning", "You ended a voice broadcast": "Du avslutade en röstsändning", @@ -3677,7 +3645,6 @@ "Joining space…": "Går med i utrymme …", "Encrypting your message…": "Krypterar ditt meddelande …", "Sending your message…": "Skickar ditt meddelande …", - "Decrypting messages…": "Avkrypterar meddelanden …", "Set a new account password…": "Sätt ett nytt kontolösenord …", "Downloading update…": "Hämtar uppdatering …", "Checking for an update…": "Letar efter uppdatering …", @@ -3709,5 +3676,79 @@ "Verify Session": "Verifiera session", "Ignore (%(counter)s)": "Ignorera (%(counter)s)", "User": "Användare", - "Log out and back in to disable": "Logga ut och in igen för att inaktivera" + "Log out and back in to disable": "Logga ut och in igen för att inaktivera", + "View poll": "Visa omröstning", + "There are no past polls for the past %(count)s days. Load more polls to view polls for previous months|one": "Det finns inga tidigare omröstningar för det senaste dygnet. Ladda fler omröstningar för att se omröstningar för tidigare månader", + "There are no past polls for the past %(count)s days. Load more polls to view polls for previous months|other": "Det finns inga tidigare omröstningar under de senaste %(count)s dagarna. Ladda fler omröstningar för att se omröstningar för tidigare månader", + "There are no active polls for the past %(count)s days. Load more polls to view polls for previous months|one": "Det finns inga aktiva omröstningar det senaste dygnet. Ladda fler omröstningar för att se omröstningar för tidigare månader", + "There are no active polls for the past %(count)s days. Load more polls to view polls for previous months|other": "Det finns inga aktiva omröstningar under de senaste %(count)s dagarna. Ladda fler omröstningar för att se omröstningar för tidigare månader", + "There are no past polls. Load more polls to view polls for previous months": "Det finns inga tidigare omröstningar. Ladda fler omröstningar för att se omröstningar för tidigare månader", + "There are no active polls. Load more polls to view polls for previous months": "Det finns inga aktiva omröstningar. Ladda fler omröstningar för att se omröstningar för tidigare månader", + "Load more polls": "Ladda fler omröstningar", + "Loading polls": "Laddar omröstningar", + "Past polls": "Tidigare omröstningar", + "Active polls": "Aktiva omröstningar", + "View poll in timeline": "Se omröstningen i tidslinjen", + "Poll history": "Omröstningshistorik", + "Search all rooms": "Sök i alla rum", + "Search this room": "Sök i det här rummet", + "Once everyone has joined, you’ll be able to chat": "När alla har gått med kommer du kunna chatta", + "Formatting": "Formatering", + "You do not have permission to invite users": "Du är inte behörig att bjuda in användare", + "Upload custom sound": "Ladda upp anpassat ljud", + "The Twemoji emoji art is © Twitter, Inc and other contributors used under the terms of CC-BY 4.0.": "Emojigrafiken Twemoji är © Twitter, Inc och andra bidragsgivare och används under villkoren i CC-BY 4.0.", + "The twemoji-colr font is © Mozilla Foundation used under the terms of Apache 2.0.": "Teckensnittet twemoji-colr är © Mozilla Foundation och används under villkoren för Apache 2.0.", + "The default cover photo is © Jesús Roncero used under the terms of CC-BY-SA 4.0.": "Det förvalda omslagsfotot är © Jesús Roncero och används under villkoren i CC-BY-SA 4.0.", + "Error changing password": "Fel vid byte av lösenord", + "%(errorMessage)s (HTTP status %(httpStatus)s)": "%(errorMessage)s (HTTP-status %(httpStatus)s)", + "Unknown password change error (%(stringifiedError)s)": "Okänt fel vid lösenordsändring (%(stringifiedError)s)", + "Error while changing password: %(error)s": "Fel vid ändring av lösenord: %(error)s", + "Failed to download source media, no source url was found": "Misslyckades att ladda ned källmedian, ingen käll-URL hittades", + "Start messages with /plain to send without markdown.": "Börja meddelanden med /plain för att skicka utan markdown.", + "%(sender)s reacted %(reaction)s to %(message)s": "%(sender)s reagerade med %(reaction)s till %(message)s", + "You reacted %(reaction)s to %(message)s": "Du reagerade med %(reaction)s till %(message)s", + "WebGL is required to display maps, please enable it in your browser settings.": "WebGL krävs för att visa kartor, aktivera det i dina webbläsarinställningar.", + "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s bytte sitt visningsnamn och sin profilbild", + "Cannot invite user by email without an identity server. You can connect to one under \"Settings\".": "Kan inte bjuda in användare via e-post utan en identitetsserver. Du kan ansluta till en under \"Inställningar\".", + "The add / bind with MSISDN flow is misconfigured": "Flöde för tilläggning/bindning med MSISDN är felkonfigurerat", + "No identity access token found": "Ingen identitetsåtkomsttoken hittades", + "Identity server not set": "Identitetsserver inte inställd", + "A network error occurred while trying to find and jump to the given date. Your homeserver might be down or there was just a temporary problem with your internet connection. Please try again. If this continues, please contact your homeserver administrator.": "Ett nätverksfel uppstod vid försök att hitta och hoppa till det angivna datumet. Din hemserver kanske är nere eller så var det vara ett tillfälligt problem med din internetuppkoppling. Var god försök igen. Om detta fortsätter, kontakta din hemserveradministratör.", + "We were unable to find an event looking forwards from %(dateString)s. Try choosing an earlier date.": "Vi kunde inte hitta en händelse från %(dateString)s eller senare. Pröva att välja ett tidigare datum.", + "unavailable": "otillgänglig", + "Unable to create room with moderation bot": "Kunde inte skapa rum med modereringsbot", + "Due to decryption errors, some votes may not be counted": "På grund av avkrypteringsfel kanske inte vissa röster räknas", + "Notification state is %(notificationState)s": "Aviseringsstatus är %(notificationState)s", + "Room is not encrypted 🚨": "Rummet är inte krypterat 🚨", + "Message from %(user)s": "Meddelande från %(user)s", + "Answered elsewhere": "Besvarat på annat håll", + "unknown status code": "okänd statuskod", + "Image view": "Bildvy", + "Waiting for users to join %(brand)s": "Väntar på att användare går med i %(brand)s", + "Can't find the old version of this room (room ID: %(roomId)s), and we have not been provided with 'via_servers' to look for it.": "Kan inte hitta den gamla versionen av det här rummet (rums-ID: %(roomId)s), och vi har inte fått ”via_servers” för att leta efter det.", + "Error details": "Feldetaljer", + "Desktop app logo": "Skrivbordsappslogga", + "Room unread status: %(status)s, count: %(count)s|zero": "Rummets oläst-status: %(status)s", + "Your device ID": "Ditt enhets-ID", + "Message in %(room)s": "Meddelande i rum %(room)s", + "Try using %(server)s": "Pröva att använda %(server)s", + "User is not logged in": "Användaren är inte inloggad", + "Allow fallback call assist server (%(server)s)": "Tillåt reservserver för samtalsassistans (%(server)s)", + "The sender has blocked you from receiving this message": "Avsändaren har blockerat dig från att ta emot det här meddelandet", + "Alternatively, you can try to use the public server at , but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternativt kan du försöka använda den offentliga servern på , men det kommer inte att vara lika tillförlitligt och det kommer att dela din IP-adress med den servern. Du kan också hantera detta i Inställningar.", + "Ended a poll": "Avslutade en omröstning", + "Your language": "Ditt språk", + "Start DM anyway and never warn me again": "Starta DM ändå och varna mig aldrig igen", + "Start DM anyway": "Starta DM ändå", + "Server returned %(statusCode)s with error code %(errorCode)s": "Servern gav svar %(statusCode)s med felkoden %(errorCode)s", + "Unable to find profiles for the Matrix IDs listed below - would you like to start a DM anyway?": "Kunde inte hitta profiler för Matrix-ID:n nedan — skulle du vilja starta ett DM ändå?", + "Room is encrypted ✅": "Rummet är krypterat ✅", + "Once invited users have joined %(brand)s, you will be able to chat and the room will be end-to-end encrypted": "När inbjudna användare har gått med i %(brand)s kommer du att kunna chatta och rummet kommer att vara totalsträckskrypterat", + "Can't find the old version of this room (room ID: %(roomId)s), and we have not been provided with 'via_servers' to look for it. It's possible that guessing the server from the room ID will work. If you want to try, click this link:": "Kan inte hitta den gamla versionen av det här rummet (rums-ID: %(roomId)s), och vi har inte fått ”via_servers” för att leta efter det. Det är möjligt att det går att gissa servern från rums-ID:t. Om du vill pröva, klicka på den här länken:", + "Please submit debug logs to help us track down the problem.": "Vänligen skicka in felsökningsloggar för att hjälpa oss att spåra problemet.", + "Invites by email can only be sent one at a time": "Inbjudningar via e-post kan endast skickas en i taget", + "Match default setting": "Matcha förvalsinställning", + "Mute room": "Tysta rum", + "Room unread status: %(status)s, count: %(count)s|other": "Rummets oläst-status: %(status)s, antal: %(count)s", + "Unable to find event at that date": "Kunde inte hitta händelse vid det datumet" } diff --git a/src/i18n/strings/ta.json b/src/i18n/strings/ta.json index c6673d628ec..70ca5145895 100644 --- a/src/i18n/strings/ta.json +++ b/src/i18n/strings/ta.json @@ -126,8 +126,6 @@ "Unable to access webcam / microphone": "புகைப்படக்கருவி / ஒலிவாங்கியை அணுக முடியவில்லை", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "ஒலிவாங்கியை அணுக முடியாததால் அழைப்பு தோல்வியடைந்தது. ஒலிவாங்கி செருகப்பட்டுள்ளதா, சரியாக அமைக்கவும் என சரிபார்க்கவும்.", "Unable to access microphone": "ஒலிவாங்கியை அணுக முடியவில்லை", - "Try using turn.matrix.org": "turn.matrix.org ஐப் பயன்படுத்த முயற்சிக்கவும்", - "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 பயன்படுத்தி முயற்சி செய்யலாம், ஆனால் இது அவ்வளவு நம்பகமானதாக இருக்காது, மேலும் அது உங்கள் ஐபி முகவரியை அந்த சேவையகத்துடன் பகிர்ந்து கொள்ளும். இதை அமைப்புகளிலும் நிர்வகிக்கலாம்.", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "அழைப்புகள் நம்பத்தகுந்த வகையில் இயங்குவதற்காக, TURN சேவையகத்தை உள்ளமைக்க உங்கள் வீட்டுசேவையகத்தின் (%(homeserverDomain)s) நிர்வாகியிடம் கேளுங்கள்.", "Call failed due to misconfigured server": "தவறாக உள்ளமைக்கப்பட்ட சேவையகம் காரணமாக அழைப்பு தோல்வியடைந்தது", "The call was answered on another device.": "அழைப்பு மற்றொரு சாதனத்தில் பதிலளிக்கப்பட்டது.", diff --git a/src/i18n/strings/th.json b/src/i18n/strings/th.json index fa4abce4c3d..aa9ae32a053 100644 --- a/src/i18n/strings/th.json +++ b/src/i18n/strings/th.json @@ -265,8 +265,6 @@ "Unable to access webcam / microphone": "ไม่สามารถเข้าถึง กล้อง/ไมโครโฟน", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "การโทรล้มเหลวเนื่องจากไม่สามารถเข้าถึงไมโครโฟนได้ ตรวจสอบว่าเสียบไมโครโฟนและตั้งค่าถูกต้อง.", "Unable to access microphone": "ไม่สามารถเข้าถึงไมโครโฟน", - "Try using turn.matrix.org": "ลองใช้ turn.matrix.org", - "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 ของคุณกับเซิร์ฟเวอร์นั้น คุณสามารถจัดการสิ่งนี้ได้ในการตั้งค่า.", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "โปรดสอบถามผู้ดูแลระบบของโฮมเซิร์ฟเวอร์ของคุณ (%(homeserverDomain)s) เพื่อกำหนดคอนฟิกเซิร์ฟเวอร์ TURN เพื่อให้การเรียกทำงานได้อย่างน่าเชื่อถือ.", "Call failed due to misconfigured server": "การโทรล้มเหลวเนื่องจากเซิร์ฟเวอร์กำหนดค่าไม่ถูกต้อง", "The call was answered on another device.": "คุณรับสายบนอุปกรณ์อื่นแล้ว.", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 871d0858024..9f8498fcf70 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -497,7 +497,6 @@ "Registration Successful": "Kayıt Başarılı", "Forgotten your password?": "Parolanızı mı unuttunuz?", "Sign in and regain access to your account.": "Oturum açın ve yeniden hesabınıza ulaşın.", - "Try using turn.matrix.org": "turn.matrix.org i kullanarak dene", "You do not have permission to start a conference call in this room": "Bu odada bir konferans başlatmak için izniniz yok", "The file '%(fileName)s' failed to upload.": "%(fileName)s dosyası için yükleme başarısız.", "The server does not support the room version specified.": "Belirtilen oda sürümünü sunucu desteklemiyor.", @@ -908,7 +907,6 @@ "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)s %(count)s kez değişiklik yapmadı", "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)s değişiklik yapmadı", "And %(count)s more...|other": "ve %(count)s kez daha...", - "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.": "Alternatif olarak,turn.matrix.org adresindeki herkese açık sunucuyu kullanmayı deneyebilirsiniz. Fakat bu güvenilir olmayabilir. IP adresiniz bu sunucu ile paylaşılacaktır. Ayarlardan yönetebilirsiniz.", "Popout widget": "Görsel bileşeni göster", "Please create a new issue on GitHub so that we can investigate this bug.": "Lütfen GitHub’da Yeni bir talep oluşturun ki bu hatayı inceleyebilelim.", "Language Dropdown": "Dil Listesi", diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 05a1dbfaa29..bdf8f356c72 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -259,8 +259,6 @@ "Add Phone Number": "Додати номер телефону", "Call failed due to misconfigured server": "Виклик не вдався через неправильне налаштування сервера", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Запропонуйте адміністратору вашого домашнього серверу (%(homeserverDomain)s) налаштувати сервер TURN для надійної роботи викликів.", - "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", "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.": "Щоб підтвердити адресу е-пошти або телефон ця дія потребує доступу до типового серверу ідентифікації , але сервер не має жодних умов надання послуг.", "Only continue if you trust the owner of the server.": "Продовжуйте лише якщо довіряєте власнику сервера.", @@ -1995,9 +1993,6 @@ "You've previously used a newer version of %(brand)s with this session. To use this version again with end to end encryption, you will need to sign out and back in again.": "Ви раніше використовували новішу версію %(brand)s для цього сеансу. Щоб знову використовувати цю версію із наскрізним шифруванням, вам потрібно буде вийти та знову ввійти.", "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "Налаштуйте цьому сеансу резервне копіювання, інакше при виході втратите ключі, доступні лише в цьому сеансі.", "Signed Out": "Виконано вихід", - "Sign Out": "Вийти", - "Sign out %(count)s selected devices|one": "Вийти з %(count)s вибраного пристрою", - "Sign out %(count)s selected devices|other": "Вийти з %(count)s вибраних пристроїв", "Sign out devices|one": "Вийти з пристрою", "Sign out devices|other": "Вийти з пристроїв", "Click the button below to confirm signing out these devices.|other": "Клацніть кнопку внизу, щоб підтвердити вихід із цих пристроїв.", @@ -2005,7 +2000,6 @@ "To continue, use Single Sign On to prove your identity.": "Щоб продовжити, скористайтеся єдиним входом для підтвердження особи.", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Підтвердьте вихід із цього пристрою за допомогою єдиного входу, щоб підтвердити вашу особу.", "Click the button below to confirm signing out these devices.|one": "Натисніть кнопку внизу, щоб підтвердити вихід із цього пристрою.", - "This device": "Цей пристрій", "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.": "Ваші приватні повідомлення, зазвичай, зашифровані, але ця кімната — ні. Зазвичай це пов'язано з непідтримуваним пристроєм або використаним методом, наприклад, запрошення електронною поштою.", "For extra security, verify this user by checking a one-time code on both of your devices.": "Для додаткової безпеки перевірте цього користувача, звіривши одноразовий код на обох своїх пристроях.", "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Якщо звірити цей пристрій, його буде позначено надійним, а користувачі, які перевірили у вас, будуть довіряти цьому пристрою.", @@ -2016,8 +2010,6 @@ "Ignored users": "Нехтувані користувачі", "You have no ignored users.": "Ви не маєте нехтуваних користувачів.", "Rename": "Перейменувати", - "Unverified devices": "Неперевірені пристрої", - "Verified devices": "Перевірені пристрої", "The server is offline.": "Сервер вимкнено.", "%(spaceName)s and %(count)s others|one": "%(spaceName)s і %(count)s інших", "%(spaceName)s and %(count)s others|zero": "%(spaceName)s", @@ -2061,8 +2053,6 @@ "Developer mode": "Режим розробника", "Deselect all": "Скасувати вибір", "Select all": "Вибрати всі", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Керуйте авторизованими вами пристроями нижче. Назву пристрою бачать люди, з якими ви спілкуєтесь.", - "Where you're signed in": "Звідки ви входили", "Request media permissions": "Запитати медіадозволи", "Missing media permissions, click the button below to request.": "Бракує медіадозволів, натисніть кнопку нижче, щоб їх надати.", "Use a more compact 'Modern' layout": "Використовувати компактний вигляд «Модерн»", @@ -2118,7 +2108,6 @@ "No votes cast": "Жодного голосу", "Help improve %(analyticsOwner)s": "Допоможіть поліпшити %(analyticsOwner)s", "You previously consented to share anonymous usage data with us. We're updating how that works.": "Раніше ви погодилися надсилати нам анонімні дані про використання. Ми оновлюємо цей функціонал.", - "Okay": "Гаразд", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Збір анонімних даних дає нам змогу дізнаватися про збої. Жодних особистих даних. Жодних третіх сторін.", "You can read all our terms here": "Можете прочитати всі наші умови тут", "We don't record or profile any account data": "Ми не зберігаємо й не аналізуємо жодних даних облікового запису", @@ -2134,10 +2123,6 @@ "Are you sure you want to end this poll? This will show the final results of the poll and stop people from being able to vote.": "Точно завершити опитування? Буде показано підсумки опитування, і більше ніхто не зможе голосувати.", "Link to room": "Посилання на кімнату", "Use high contrast": "Висока контрастність", - "Your homeserver does not support device management.": "Ваш домашній сервер не підтримує керування пристроями.", - "Unable to load device list": "Не вдалося звантажити список пристроїв", - "Devices without encryption support": "Пристрої без підтримки шифрування", - "You aren't signed into any other devices.": "Ви не авторизовані на жодних інших пристроях.", "Matrix.org is the biggest public homeserver in the world, so it's a good place for many.": "Matrix.org — найбільший загальнодоступний домашній сервер у світі, він підійде багатьом.", "We call the places where you can host your account 'homeservers'.": "Ми називаємо місця, де ви можете розмістити обліковий запис, \"домашніми серверами\".", "You're all caught up": "Ви в курсі всього", @@ -2796,7 +2781,6 @@ "Passphrase must not be empty": "Парольна фраза обов'язкова", "Passphrases must match": "Парольні фрази мають збігатися", "Incorrect username and/or password.": "Хибне користувацьке ім'я й/або пароль.", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Це експериментальна функція. Наразі нові користувачі, які отримають запрошення, повинні відкрити запрошення на , щоб приєднатися.", "Make sure the right people have access. You can invite more later.": "Переконайтеся, що потрібні люди мають доступ. Пізніше ви можете запросити більше людей.", "Invite your teammates": "Запросіть учасників своєї команди", "Failed to invite the following users to your space: %(csvUsers)s": "Не вдалося запросити до вашого простору таких користувачів: %(csvUsers)s", @@ -3422,10 +3406,6 @@ "Join %(brand)s calls": "Приєднатися до %(brand)s викликів", "Start %(brand)s calls": "Розпочати %(brand)s викликів", "Sorry — this call is currently full": "Перепрошуємо, цей виклик заповнено", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "Наш новий менеджер сеансів забезпечує кращу видимість всіх ваших сеансів і більший контроль над ними, зокрема можливість віддаленого перемикання push-сповіщень.", - "Have greater visibility and control over all your sessions.": "Майте кращу видимість і контроль над усіма вашими сеансами.", - "New session manager": "Новий менеджер сеансів", - "Use new session manager": "Використовувати новий менеджер сеансів", "Underline": "Підкреслений", "Italic": "Курсив", "resume voice broadcast": "поновити голосову трансляцію", @@ -3479,7 +3459,6 @@ "Automatically adjust the microphone volume": "Авторегулювання гучності мікрофона", "Voice settings": "Налаштування голосу", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "Застосовується лише в тому випадку, якщо ваш домашній сервер не пропонує його. Ваша IP-адреса передаватиметься під час виклику.", - "Allow fallback call assist server (turn.matrix.org)": "Дозволити запасний сервер підтримки викликів (turn.matrix.org)", "Noise suppression": "Шумопригнічення", "Automatic gain control": "Авторегулювання підсилення", "Echo cancellation": "Пригнічення відлуння", @@ -3555,17 +3534,6 @@ "You ended a voice broadcast": "Ви завершили голосову трансляцію", "Unable to decrypt message": "Не вдалося розшифрувати повідомлення", "This message could not be decrypted": "Не вдалося розшифрувати це повідомлення", - "Resend key requests": "Повторно надіслати запити на отримання ключів", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "На жаль, немає звірених пристроїв, з яких можна було б запросити ключі розшифрування. Вхід та перевірка інших пристроїв може допомогти уникнути такої ситуації в майбутньому.", - "Some messages could not be decrypted": "Не вдалося розшифрувати частину повідомлень", - "View your device list": "Переглянути список пристроїв", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "Цей пристрій запитує ключі розшифрування з інших ваших пристроїв. Відкриття одного з інших пристроїв може прискорити цей процес.", - "Open another device to load encrypted messages": "Відкрийте інший пристрій для завантаження зашифрованих повідомлень", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "Ви не зможете отримати доступ до старих нерозшифровуваних повідомлень, але скидання ключів дозволить вам отримувати нові повідомлення.", - "Reset your keys to prevent future decryption errors": "Скиньте ключі, щоб запобігти помилкам під час розшифрування в майбутньому", - "This device was unable to decrypt some messages because it has not been verified yet.": "Цей пристрій не зміг розшифрувати деякі повідомлення, оскільки ще не звірений.", - "Verify this device to access all messages": "Звірте цей пристрій, щоб отримати доступ до всіх повідомлень", - "Please wait as we try to decrypt your messages. This may take a few moments.": "Будь ласка, зачекайте, поки ми намагаємося розшифрувати ваші повідомлення. Це може тривати кілька хвилин.", "%(senderName)s ended a voice broadcast": "%(senderName)s завершує голосову трансляцію", "You ended a voice broadcast": "Ви завершили голосову трансляцію", "Rust cryptography implementation": "Реалізація криптографії Rust", @@ -3670,7 +3638,6 @@ "Joining space…": "Приєднання до простору…", "Encrypting your message…": "Шифрування повідомлення…", "Sending your message…": "Надсилання повідомлення…", - "Decrypting messages…": "Розшифрування повідомлень…", "Set a new account password…": "Встановити новий пароль облікового запису…", "Downloading update…": "Завантаження оновлення…", "Checking for an update…": "Перевірка оновлень…", @@ -3777,5 +3744,10 @@ "Once invited users have joined %(brand)s, you will be able to chat and the room will be end-to-end encrypted": "Після того, як запрошені користувачі приєднаються до %(brand)s, ви зможете спілкуватися в бесіді, а кімната буде наскрізно зашифрована", "Waiting for users to join %(brand)s": "Очікування приєднання користувача до %(brand)s", "You do not have permission to invite users": "У вас немає дозволу запрошувати користувачів", - "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s змінює своє ім'я та зображення профілю" + "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s змінює своє ім'я та зображення профілю", + "Your language": "Ваша мова", + "Your device ID": "ID вашого пристрою", + "Alternatively, you can try to use the public server at , but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Як альтернативу, ви можете спробувати публічний сервер на , але він не буде надто надійним, а також поширюватиме вашу IP-адресу на тому сервері. Ви також можете керувати цим у налаштуваннях.", + "Try using %(server)s": "Спробуйте використати %(server)s", + "User is not logged in": "Користувач не увійшов" } diff --git a/src/i18n/strings/vi.json b/src/i18n/strings/vi.json index 53777bf413e..eab1426ffcb 100644 --- a/src/i18n/strings/vi.json +++ b/src/i18n/strings/vi.json @@ -1,7 +1,7 @@ { "This email address is already in use": "Địa chỉ thư điện tử này đã được sử dụng", "This phone number is already in use": "Số điện thoại này đã được sử dụng", - "Failed to verify email address: make sure you clicked the link in the email": "Chưa xác minh địa chỉ thư điện tử: hãy chắc chắn bạn đã nhấn vào liên kết trong thư", + "Failed to verify email address: make sure you clicked the link in the email": "Chưa xác nhận địa chỉ thư điện tử: hãy chắc chắn bạn đã nhấn vào liên kết trong thư", "Analytics": "Về dữ liệu phân tích", "Call Failed": "Không gọi được", "You cannot place a call with yourself.": "Bạn không thể tự gọi chính mình.", @@ -41,13 +41,13 @@ "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s", "Unnamed Room": "Phòng Không tên", - "Error": "Có lỗi xảy ra", + "Error": "Lỗi", "Unable to load! Check your network connectivity and try again.": "Không thể tải dữ liệu! Kiểm tra kết nối mạng và thử lại.", "Dismiss": "Bỏ qua", "%(brand)s does not have permission to send you notifications - please check your browser settings": "%(brand)s chưa có quyền để gửi thông báo cho bạn - vui lòng kiểm tra thiết lập trình duyệt", "%(brand)s was not given permission to send notifications - please try again": "%(brand)s vẫn chưa được cấp quyền để gửi thông báo - vui lòng thử lại", - "Unable to enable Notifications": "Không thể bật Thông báo", - "This email address was not found": "Địa chỉ email này không tồn tại trong hệ thống", + "Unable to enable Notifications": "Không thể bật thông báo", + "This email address was not found": "Địa chỉ thư điện tử này không tồn tại trong hệ thống", "Register": "Đăng ký", "Default": "Mặc định", "Restricted": "Bị hạn chế", @@ -56,14 +56,14 @@ "Operation failed": "Tác vụ thất bại", "Failed to invite": "Không thể mời", "You need to be logged in.": "Bạn phải đăng nhập.", - "You need to be able to invite users to do that.": "Bạn cần có quyền mời người dùng để làm được việc này.", + "You need to be able to invite users to do that.": "Bạn cần mời được người dùng thì mới làm vậy được.", "Unable to create widget.": "Không thể tạo widget.", "Missing roomId.": "Thiếu roomId.", "Failed to send request.": "Không thể gửi yêu cầu.", "This room is not recognised.": "Phòng chat không xác định.", "Power level must be positive integer.": "Cấp độ quyền phải là số nguyên dương.", "You are not in this room.": "Bạn không ở trong phòng chat này.", - "You do not have permission to do that in this room.": "Bạn không được phép làm điều đó tron phòng chat này.", + "You do not have permission to do that in this room.": "Bạn không được phép làm vậy trong phòng chat này.", "Missing room_id in request": "Thiếu room_id khi yêu cầu", "Room %(roomId)s not visible": "Phòng %(roomId)s không được hiển thị", "Missing user_id in request": "Thiếu user_id khi yêu cầu", @@ -150,7 +150,7 @@ "Unrecognised address": "Không nhận ra địa chỉ", "You do not have permission to invite people to this room.": "Bạn không đủ quyền để mời người khác vào phòng chat.", "The user must be unbanned before they can be invited.": "Người dùng phải được gỡ cấm tham gia trước khi được mời.", - "The user's homeserver does not support the version of the room.": "Phiên bản máy chủ của người dùng không hỗ trợ phiên bản phòng chat.", + "The user's homeserver does not support the version of the room.": "Phiên bản máy chủ nhà của người dùng không hỗ trợ phiên bản phòng này.", "Unknown server error": "Lỗi máy chủ không xác định", "Use a few words, avoid common phrases": "Nhập vài từ, tránh những từ phổ thông", "No need for symbols, digits, or uppercase letters": "Không cần nhập biểu tượng, số hoặc chữ in hoa", @@ -170,10 +170,10 @@ "Sequences like abc or 6543 are easy to guess": "Chuỗi ký tự như abc hoặc 6543 là rất dễ đoán", "Recent years are easy to guess": "Dùng những năm gần đây là rất dễ đoán", "Dates are often easy to guess": "Ngày thường dễ đoán", - "This is a top-10 common password": "Đây là 1 trong 10 mật khẩu phổ thông", - "This is a top-100 common password": "Đây là 1 trong 100 mật khẩu phổ thông", + "This is a top-10 common password": "Đây là 1 trong 10 mật khẩu phổ biến", + "This is a top-100 common password": "Đây là 1 trong 100 mật khẩu phổ biến", "This is a very common password": "Đây là một mật khẩu rất phổ biến", - "This is similar to a commonly used password": "Mật khẩu này tương tự mật khẩu phổ thông", + "This is similar to a commonly used password": "Mật khẩu này tương tự mật khẩu phổ biến", "A word by itself is easy to guess": "Một từ có nghĩa là rất dễ đoán", "Names and surnames by themselves are easy to guess": "Tên và họ là rất dễ đoán", "Common names and surnames are easy to guess": "Tên và họ phổ thông là rất dễ đoán", @@ -235,7 +235,7 @@ "No recent messages by %(user)s found": "Không tìm thấy tin nhắn gần đây của %(user)s", "Failed to ban user": "Đã có lỗi khi chặn người dùng", "Are you sure you want to leave the room '%(roomName)s'?": "Bạn có chắc chắn muốn rời khỏi phòng '%(roomName)s' không?", - "Use an email address to recover your account": "Sử dụng địa chỉ email để khôi phục tài khoản của bạn", + "Use an email address to recover your account": "Sử dụng địa chỉ thư điện tử để khôi phục tài khoản của bạn", "Sign in": "Đăng nhập", "Confirm adding phone number": "Xác nhận thêm số điện thoại", "Confirm adding this phone number by using Single Sign On to prove your identity.": "Xác nhận thêm số điện thoại này bằng cách sử dụng Đăng Nhập Một Lần để chứng minh danh tính của bạn.", @@ -279,7 +279,7 @@ "Indexed rooms:": "Các phòng được lập chỉ mục:", "Indexed messages:": "Tin nhắn được lập chỉ mục:", "Space used:": "Space đã sử dụng:", - "%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "%(brand)s đang lưu trữ cục bộ các thư được mã hóa một cách an toàn để chúng xuất hiện trong kết quả tìm kiếm:", + "%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "%(brand)s đang lưu trữ cục bộ an toàn các tin nhắn được mã hóa để chúng xuất hiện trong kết quả tìm kiếm:", "Currently indexing: %(currentRoom)s": "Hiện đang lập chỉ mục: %(currentRoom)s", "Not currently indexing messages for any room.": "Hiện không lập chỉ mục tin nhắn cho bất kỳ phòng nào.", "Disable": "Tắt", @@ -393,7 +393,7 @@ "Please note you are logging into the %(hs)s server, not matrix.org.": "Xin lưu ý rằng bạn đang đăng nhập vào máy chủ %(hs)s, không phải matrix.org.", "Incorrect username and/or password.": "Tên người dùng và/hoặc mật khẩu không chính xác.", "Please contact your service administrator to continue using this service.": "Vui lòng liên hệ với quản trị viên dịch vụ của bạn contact your service administrator để tiếp tục sử dụng dịch vụ này.", - "This homeserver does not support login using email address.": "Máy chủ nhà này không hỗ trợ đăng nhập bằng địa chỉ email.", + "This homeserver does not support login using email address.": "Máy chủ nhà này không hỗ trợ đăng nhập bằng địa chỉ thư điện tử.", "General failure": "Thất bại chung", "Identity server URL does not appear to be a valid identity server": "URL máy chủ nhận dạng dường như không phải là máy chủ nhận dạng hợp lệ", "Invalid base_url for m.identity_server": "Base_url không hợp lệ cho m.identity_server", @@ -404,10 +404,10 @@ "Invalid homeserver discovery response": "Phản hồi khám phá homeserver không hợp lệ", "Return to login screen": "Quay về màn hình đăng nhập", "Your password has been reset.": "Mật khẩu của bạn đã được đặt lại.", - "New Password": "mật khẩu mới", + "New Password": "Mật khẩu mới", "New passwords must match each other.": "Các mật khẩu mới phải khớp với nhau.", "A new password must be entered.": "Mật khẩu mới phải được nhập.", - "The email address linked to your account must be entered.": "Địa chỉ email được liên kết đến tài khoản của bạn phải được nhập.", + "The email address linked to your account must be entered.": "Địa chỉ thư điện tử được liên kết đến tài khoản của bạn phải được nhập.", "Original event source": "Nguồn sự kiện ban đầu", "Decrypted event source": "Nguồn sự kiện được giải mã", "Could not load user profile": "Không thể tải hồ sơ người dùng", @@ -415,7 +415,7 @@ "Switch theme": "Chuyển đổi chủ đề", "Switch to dark mode": "Chuyển sang chế độ tối", "Switch to light mode": "Chuyển sang chế độ ánh sáng", - "All settings": "Tất cả các cài đặt", + "All settings": "Tất cả cài đặt", "New here? Create an account": "Bạn là người mới? Create an account", "Got an account? Sign in": "Đã có một tài khoản? Sign in", "Failed to load timeline position": "Không tải được vị trí dòng thời gian", @@ -425,7 +425,6 @@ "Let's create a room for each of them.": "Hãy tạo một phòng cho mỗi người trong số họ.", "What are some things you want to discuss in %(spaceName)s?": "Một số điều bạn muốn thảo luận trong %(spaceName)s là gì?", "Invite by username": "Mời theo tên người dùng", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "Đây là tính năng thử nghiệm. Hiện tại, người dùng mới nhận được lời mời sẽ phải mở lời mời đó trên để thực sự tham gia.", "Make sure the right people have access. You can invite more later.": "Đảm bảo đúng người có quyền truy cập. Bạn có thể mời thêm sau.", "Invite your teammates": "Mời đồng đội của bạn", "Failed to invite the following users to your space: %(csvUsers)s": "Không mời được những người dùng sau vào space của bạn: %(csvUsers)s", @@ -475,22 +474,22 @@ "Error downloading audio": "Lỗi khi tải xuống âm thanh", "Unnamed audio": "Âm thanh không tên", "Sign in with SSO": "Đăng nhập bằng SSO", - "Use email to optionally be discoverable by existing contacts.": "Sử dụng email để dễ dàng được tìm ra bởi người dùng khác.", - "Use email or phone to optionally be discoverable by existing contacts.": "Sử dụng email hoặc điện thoại để dễ dàng được tìm ra bởi người dùng khác.", - "Add an email to be able to reset your password.": "Thêm một email để có thể đặt lại mật khẩu của bạn.", + "Use email to optionally be discoverable by existing contacts.": "Sử dụng địa chỉ thư điện tử để dễ dàng được tìm ra bởi người dùng khác.", + "Use email or phone to optionally be discoverable by existing contacts.": "Sử dụng địa chỉ thư điện tử hoặc điện thoại để dễ dàng được tìm ra bởi người dùng khác.", + "Add an email to be able to reset your password.": "Thêm một địa chỉ thư điện tử để có thể đặt lại mật khẩu của bạn.", "Phone (optional)": "Điện thoại (tùy chọn)", "Use lowercase letters, numbers, dashes and underscores only": "Chỉ sử dụng các chữ cái thường, số, dấu gạch ngang và dấu gạch dưới", "Enter phone number (required on this homeserver)": "Nhập số điện thoại (bắt buộc trên máy chủ này)", "Other users can invite you to rooms using your contact details": "Những người dùng khác có thể mời bạn vào phòng bằng cách sử dụng chi tiết liên hệ của bạn", - "Enter email address (required on this homeserver)": "Nhập địa chỉ email (bắt buộc trên máy chủ này)", + "Enter email address (required on this homeserver)": "Nhập địa chỉ thư điện tử (bắt buộc trên máy chủ này)", "Sign in with": "Đăng nhập với", "Forgot password?": "Quên mật khẩu?", "Phone": "Điện thoại", "Username": "Tên đăng nhập", - "Email": "Email", + "Email": "Thư điện tử", "That phone number doesn't look quite right, please check and try again": "Số điện thoại đó có vẻ không chính xác, vui lòng kiểm tra và thử lại", "Enter phone number": "Nhập số điện thoại", - "Enter email address": "Nhập địa chỉ email", + "Enter email address": "Nhập địa chỉ thư điện tử", "Enter username": "Điền tên đăng nhập", "Password is allowed, but unsafe": "Mật khẩu được phép, nhưng không an toàn", "Nice, strong password!": "Mật khẩu mạnh, tốt đó!", @@ -577,7 +576,7 @@ "Security Key mismatch": "Khóa bảo mật không khớp", "Unable to load backup status": "Không thể tải trạng thái sao lưu", "%(completed)s of %(total)s keys restored": "Đã khôi phục%(completed)s trong số %(total)s khóa", - "Restoring keys from backup": "Khôi phục khóa từ bản sao lưu", + "Restoring keys from backup": "Khôi phục khóa từ sao lưu", "Unable to set up keys": "Không thể thiết lập khóa", "Click the button below to confirm setting up encryption.": "Nhấp vào nút bên dưới để xác nhận thiết lập mã hóa.", "Confirm encryption setup": "Xác nhận thiết lập mã hóa", @@ -630,10 +629,10 @@ "Report Content": "Báo cáo nội dung", "Please pick a nature and describe what makes this message abusive.": "Vui lòng chọn một bản chất và mô tả điều gì khiến thông báo này bị lạm dụng.", "Please fill why you're reporting.": "Vui lòng điền lý do bạn đang báo cáo.", - "Email (optional)": "Email (tùy chọn)", - "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Lưu ý là nếu bạn không thêm email và quên mật khẩu, bạn có thể vĩnh viễn mất quyền truy cập vào tài khoản của mình permanently lose access to your account.", - "Continuing without email": "Tiếp tục mà không cần email", - "Doesn't look like a valid email address": "Không giống như một địa chỉ email hợp lệ", + "Email (optional)": "Địa chỉ thư điện tử (tùy chọn)", + "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Lưu ý là nếu bạn không thêm địa chỉ thư điện tử và quên mật khẩu, bạn có thể vĩnh viễn mất quyền truy cập vào tài khoản của mình.", + "Continuing without email": "Tiếp tục mà không cần địa chỉ thư điện tử", + "Doesn't look like a valid email address": "Không giống một địa chỉ thư điện tử hợp lệ", "Data on this screen is shared with %(widgetDomain)s": "Dữ liệu trên màn hình này được chia sẻ với %(widgetDomain)s", "Modal Widget": "widget phương thức", "Message edits": "Chỉnh sửa tin nhắn", @@ -660,7 +659,7 @@ "You'll lose access to your encrypted messages": "Bạn sẽ mất quyền truy cập vào các tin nhắn được mã hóa của mình", "Manually export keys": "Xuất các khóa thủ công", "I don't want my encrypted messages": "Tôi không muốn tin nhắn được mã hóa của mình", - "Start using Key Backup": "Bắt đầu sử dụng Khóa Sao lưu", + "Start using Key Backup": "Bắt đầu sao lưu các khóa", "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Các tin nhắn được mã hóa được bảo mật bằng mã hóa đầu cuối. Chỉ bạn và (những) người nhận mới có chìa khóa để đọc những tin nhắn này.", "Leave space": "Rời space", "Leave some rooms": "Rời một vài phòng", @@ -694,16 +693,16 @@ "Transfer": "Chuyển", "Invited people will be able to read old messages.": "Những người được mời sẽ có thể đọc tin nhắn cũ.", "Invite someone using their name, username (like ) or share this room.": "Mời ai đó thông qua tên hiển thị, tên người dùng của họ (ví dụ ) hoặc chia sẻ phòng này.", - "Invite someone using their name, email address, username (like ) or share this room.": "Mời ai đó bằng tên, địa chỉ email, tên người dùng của họ (như ) hoặc chia sẻ phòng này share this room.", + "Invite someone using their name, email address, username (like ) or share this room.": "Mời ai đó bằng tên, địa chỉ thư điện tử, tên người dùng của họ (như ) hoặc chia sẻ phòng này share this room.", "Invite someone using their name, username (like ) or share this space.": "Mời ai đó sử dụng tên hiển thị, tên đăng nhập của họ (như ) hoặc chia sẻ space này.", - "Invite someone using their name, email address, username (like ) or share this space.": "Mời ai đó sử dụng tên, địa chỉ email, tên người dùng của họ (như ) hoặc chia sẻ space này share this space.", + "Invite someone using their name, email address, username (like ) or share this space.": "Mời ai đó bằng tên, địa chỉ thư điện tử, tên người dùng của họ (như ) hoặc chia sẻ space này.", "Invite to %(roomName)s": "Mời tham gia %(roomName)s", "Unnamed Space": "space không tên", "Or send invite link": "Hoặc gửi liên kết mời", "Some suggestions may be hidden for privacy.": "Một số đề xuất có thể được ẩn để bảo mật.", "Go": "Đi", "Start a conversation with someone using their name or username (like ).": "Bắt đầu cuộc trò chuyện với ai đó bằng tên hoặc tên người dùng của họ (như ).", - "Start a conversation with someone using their name, email address or username (like ).": "Bắt đầu cuộc trò chuyện với ai đó bằng tên, địa chỉ email hoặc tên người dùng của họ (như ).", + "Start a conversation with someone using their name, email address or username (like ).": "Bắt đầu cuộc trò chuyện với ai đó bằng tên, địa chỉ thư điện tử hoặc tên người dùng của họ (như ).", "Recently Direct Messaged": "Tin nhắn trực tiếp gần đây", "Suggestions": "Gợi ý", "Recent Conversations": "Các cuộc trò chuyện gần đây", @@ -713,7 +712,7 @@ "We couldn't invite those users. Please check the users you want to invite and try again.": "Chúng tôi không thể mời những người dùng đó. Vui lòng kiểm tra những người dùng bạn muốn mời và thử lại.", "Something went wrong trying to invite the users.": "Đã xảy ra sự cố khi cố mời người dùng.", "We couldn't create your DM.": "Chúng tôi không thể tạo DM của bạn.", - "Invite by email": "Mời qua email", + "Invite by email": "Mời qua thư điện tử", "Click the button below to confirm your identity.": "Nhấp vào nút bên dưới để xác nhận danh tính của bạn.", "Confirm to continue": "Xác nhận để tiếp tục", "To continue, use Single Sign On to prove your identity.": "Để tiếp tục, hãy sử dụng Single Sign On để chứng minh danh tính của bạn.", @@ -740,7 +739,7 @@ "Report a bug": "Báo lỗi", "PRO TIP: If you start a bug, please submit debug logs to help us track down the problem.": "MẸO NHỎ: Nếu bạn là người đầu tiên gặp lỗi, vui lòng gửi nhật ký gỡ lỗi để giúp chúng tôi xử lý vấn đề.", "Comment": "Bình luận", - "Feedback sent": "Phản hồi đã gửi", + "Feedback sent": "Đã gửi phản hồi", "Export": "Xuất", "Include Attachments": "Bao gồm các đính kèm", "Size Limit": "Giới hạn kích thước", @@ -860,7 +859,7 @@ "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "Bạn có chắc chắn muốn loại bỏ (xóa) sự kiện này không? Lưu ý rằng nếu bạn xóa tên phòng hoặc thay đổi chủ đề, nó có thể hoàn tác thay đổi.", "You cannot delete this message. (%(code)s)": "Bạn không thể xóa tin nhắn này.  (%(code)s)", "Skip": "Bỏ qua", - "Email address": "Địa chỉ email", + "Email address": "Địa chỉ thư điện tử", "Changelog": "Lịch sử thay đổi", "Unavailable": "Không có sẵn", "Unable to load commit detail: %(msg)s": "Không thể tải chi tiết cam kết: %(msg)s", @@ -883,12 +882,12 @@ "Invite anyway and never warn me again": "Vẫn mời và không bao giờ cảnh báo tôi nữa", "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "Không thể tìm thấy hồ sơ cho ID Matrix được liệt kê bên dưới - bạn có muốn mời họ không?", "The following users may not exist": "Những người dùng sau có thể không tồn tại", - "Use an identity server to invite by email. Manage in Settings.": "Sử dụng máy chủ nhận dạng để mời qua email. Quản lý trong mục Cài đặt Settings.", - "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Sử dụng máy chủ nhận dạng để mời qua email. Sử dụng mặc định Use the default (%(defaultIdentityServerName)s) hoặc quản lý trong mục Cài đặt Settings.", + "Use an identity server to invite by email. Manage in Settings.": "Sử dụng máy chủ định danh để mời qua địa chỉ thư điện tử. Quản lý trong mục Cài đặt Settings.", + "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "Sử dụng máy chủ nhận dạng để mời qua thư điện tử. Sử dụng mặc định (%(defaultIdentityServerName)s) hoặc quản lý trong mục Cài đặt Settings.", "Adding spaces has moved.": "Thêm dấu cách đã di chuyển.", "Search for rooms": "Tìm kiếm phòng", "Create a new room": "Tạo phòng chat mới", - "Want to add a new room instead?": "Bạn muốn thêm một phòng mới thay thế?", + "Want to add a new room instead?": "Hay là thêm một phòng mới?", "Add existing rooms": "Thêm các phòng hiện có", "Space selection": "Lựa chọn space", "Direct Messages": "Tin nhắn trực tiếp", @@ -902,7 +901,7 @@ "Server name": "Tên máy chủ", "Enter the name of a new server you want to explore.": "Nhập tên của một máy chủ mới mà bạn muốn khám phá.", "Add a new server": "Thêm máy chủ mới", - "Matrix": "Ma trận", + "Matrix": "Matrix", "Your server": "Máy chủ của bạn", "Can't find this server or its room list": "Không thể tìm thấy máy chủ này hoặc danh sách phòng của nó", "You are not allowed to view this server's rooms list": "Bạn không được phép xem danh sách phòng của máy chủ này", @@ -985,8 +984,8 @@ "Service": "Dịch vụ", "To continue you need to accept the terms of this service.": "Để tiếp tục, bạn cần chấp nhận các điều khoản của dịch vụ này.", "Use bots, bridges, widgets and sticker packs": "Sử dụng bot, cầu nối, tiện ích và gói sticker cảm xúc", - "Be found by phone or email": "Được tìm thấy qua điện thoại hoặc email", - "Find others by phone or email": "Tìm người khác qua điện thoại hoặc email", + "Be found by phone or email": "Được tìm thấy qua điện thoại hoặc địa chỉ thư điện tử", + "Find others by phone or email": "Tìm người khác qua điện thoại hoặc địa chỉ thư điện tử", "Integration manager": "Quản lý tích hợp", "Your browser likely removed this data when running low on disk space.": "Trình duyệt của bạn có thể đã xóa dữ liệu này khi sắp hết dung lượng đĩa.", "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "Một số dữ liệu phiên, bao gồm cả khóa tin nhắn được mã hóa, bị thiếu. Đăng xuất và đăng nhập để khắc phục sự cố này, khôi phục khóa từ bản sao lưu.", @@ -1000,7 +999,7 @@ "Link to most recent message": "Liên kết đến tin nhắn gần đây nhất", "Share Room": "Phòng chia sẻ", "This will allow you to reset your password and receive notifications.": "Điều này sẽ cho phép bạn đặt lại mật khẩu của mình và nhận thông báo.", - "Please check your email and click on the link it contains. Once this is done, click continue.": "Vui lòng kiểm tra email và bấm vào liên kết trong đó. Một khi xong, bấm tiếp tục.", + "Please check your email and click on the link it contains. Once this is done, click continue.": "Vui lòng kiểm tra hòm thư và bấm vào liên kết trong đó. Khi nào xong, hãy bấm tiếp tục.", "Verification Pending": "Chờ xác thực", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Xóa bộ nhớ của trình duyệt có thể khắc phục được sự cố nhưng sẽ khiến bạn đăng xuất và khiến mọi lịch sử trò chuyện được mã hóa trở nên không thể đọc được.", "If you have previously used a more recent version of %(brand)s, your session may be incompatible with this version. Close this window and return to the more recent version.": "Nếu trước đây bạn đã sử dụng phiên bản %(brand)s mới hơn, thì phiên của bạn có thể không tương thích với phiên bản này. Đóng cửa sổ này và quay lại phiên bản mới hơn.", @@ -1306,7 +1305,7 @@ "Sort by": "Sắp xếp theo", "Show previews of messages": "Hiển thị bản xem trước của tin nhắn", "Show rooms with unread messages first": "Hiển thị các phòng có tin nhắn chưa đọc trước", - "Appearance": "Ngoại hình", + "Appearance": "Giao diện", "%(roomName)s is not accessible at this time.": "Không thể truy cập %(roomName)s vào lúc này.", "%(roomName)s does not exist.": "%(roomName)s không tồn tại.", "%(roomName)s can't be previewed. Do you want to join it?": "Không thể xem trước %(roomName)s. Bạn có muốn tham gia nó không?", @@ -1318,11 +1317,11 @@ "Start chatting": "Bắt đầu trò chuyện", " wants to chat": " muốn trò chuyện", "Do you want to chat with %(user)s?": "Bạn có muốn trò chuyện với %(user)s?", - "Share this email in Settings to receive invites directly in %(brand)s.": "Chia sẻ email này trong Cài đặt để nhận lời mời trực tiếp trong %(brand)s.", + "Share this email in Settings to receive invites directly in %(brand)s.": "Chia sẻ địa chỉ thư điện tử này trong Cài đặt để nhận lời mời trực tiếp trong %(brand)s.", "Use an identity server in Settings to receive invites directly in %(brand)s.": "Sử dụng máy chủ nhận dạng trong Cài đặt để nhận lời mời trực tiếp trong %(brand)s.", "This invite to %(roomName)s was sent to %(email)s": "Lời mời đến %(roomName)s này đã được gửi tới %(email)s", - "Link this email with your account in Settings to receive invites directly in %(brand)s.": "Liên kết email này với tài khoản của bạn trong Cài đặt để nhận lời mời trực tiếp trong %(brand)s.", - "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Lời mời đến %(roomName)s này đã được gửi đến %(email)s không được liên kết với tài khoản của bạn", + "Link this email with your account in Settings to receive invites directly in %(brand)s.": "Liên kết địa chỉ thư điện tử này với tài khoản của bạn trong Cài đặt để nhận lời mời trực tiếp trong %(brand)s.", + "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Lời mời đến %(roomName)s này đã được gửi đến %(email)s nhưng không liên kết với tài khoản của bạn", "Join the discussion": "Tham gia thảo luận", "Try to join anyway": "Cố gắng tham gia bằng mọi cách", "You can only join it with a working invite.": "Bạn chỉ có thể tham gia nó với một lời mời làm việc.", @@ -1378,7 +1377,7 @@ "Message didn't send. Click for info.": "Tin nhắn chưa gửi. Nhấn để biết thông tin.", "End-to-end encryption isn't enabled": "Mã hóa đầu-cuối chưa được bật", "Enable encryption in settings.": "Bật mã hóa trong phần cài đặt.", - "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.": "Các tin nhắn riêng tư của bạn thường được mã hóa, nhưng phòng này thì không. Thường thì điều này là do thiết bị không được hỗ trợ hoặc phương pháp đang được dùng, như các lời mời qua email.", + "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.": "Các tin nhắn riêng tư của bạn thường được mã hóa, nhưng phòng này thì không. Thường thì điều này là do thiết bị không được hỗ trợ hoặc phương pháp đang được dùng, như các lời mời qua thư điện tử.", "This is the start of .": "Đây là phần bắt đầu của .", "Add a photo, so people can easily spot your room.": "Thêm ảnh để mọi người có thể dễ dàng nhận ra phòng của bạn.", "Invite to just this room": "Mời chỉ vào phòng này", @@ -1445,7 +1444,7 @@ "Space information": "Thông tin Space", "View older messages in %(roomName)s.": "Xem các tin nhắn cũ hơn trong %(roomName)s.", "Upgrade this room to the recommended room version": "Nâng cấp phòng này lên phiên bản phòng được đề xuất", - "This room is not accessible by remote Matrix servers": "Phòng này không thể truy cập từ xa bằng máy chủ Ma trận", + "This room is not accessible by remote Matrix servers": "Phòng này không thể truy cập từ xa bằng máy chủ Matrix", "Voice & Video": "Âm thanh & Hình ảnh", "No Webcams detected": "Không có Webcam nào được phát hiện", "Camera": "Máy ảnh", @@ -1458,7 +1457,7 @@ "You may need to manually permit %(brand)s to access your microphone/webcam": "Bạn có thể cần phải cho phép %(brand)s truy cập vào micrô/webcam của mình theo cách thủ công", "No media permissions": "Không có quyền sử dụng công cụ truyền thông", "Default Device": "Thiết bị mặc định", - "Privacy": "Sự riêng tư", + "Privacy": "Quyền riêng tư", "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Người quản trị máy chủ của bạn đã vô hiệu hóa mã hóa đầu cuối theo mặc định trong phòng riêng và Tin nhắn trực tiếp.", "Cross-signing": "Xác thực chéo", "Message search": "Tìm kiếm tin nhắn", @@ -1474,7 +1473,7 @@ "Timeline": "Dòng thời gian", "Images, GIFs and videos": "Hình ảnh, GIF và video", "Code blocks": "Khối mã", - "Composer": "Người soạn nhạc", + "Composer": "Soạn thảo", "Displaying time": "Thời gian hiển thị", "Keyboard shortcuts": "Các phím tắt bàn phím", "Room list": "Danh sách phòng", @@ -1528,18 +1527,18 @@ "For help with using %(brand)s, click here or start a chat with our bot using the button below.": "Để được trợ giúp về cách sử dụng %(brand)s, hãy nhấp vào đây here hoặc bắt đầu trò chuyện với bot của chúng tôi bằng nút bên dưới.", "For help with using %(brand)s, click here.": "Để được trợ giúp về cách sử dụng %(brand)s, hãy nhấp vào đây here.", "Credits": "Tín dụng", - "Legal": "Hợp pháp", + "Legal": "Pháp lý", "Olm version:": "Phiên bản Olm:", "%(brand)s version:": "Phiên bản %(brand)s:", "Discovery": "Khám phá", "Deactivate account": "Vô hiệu hoá tài khoản", "Deactivate Account": "Hủy kích hoạt Tài khoản", "Account management": "Quản lý tài khoản", - "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Đồng ý với Điều khoản dịch vụ của máy chủ nhận dạng (%(serverName)s) để cho phép bạn có thể được tìm kiếm bằng địa chỉ email hoặc số điện thoại của bạn.", + "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Đồng ý với Điều khoản dịch vụ của máy chủ nhận dạng (%(serverName)s) để cho phép bạn có thể được tìm kiếm bằng địa chỉ thư điện tử hoặc số điện thoại.", "Language and region": "Ngôn ngữ và khu vực", "Account": "Tài khoản", "Phone numbers": "Số điện thoại", - "Email addresses": "Địa chỉ email", + "Email addresses": "Địa chỉ thư điện tử", "Failed to change password. Is your password correct?": "Không thể thay đổi mật khẩu. Mật khẩu của bạn có đúng không?", "Appearance Settings only affect this %(brand)s session.": "Cài đặt Giao diện chỉ ảnh hưởng đến phiên %(brand)s này.", "Customise your appearance": "Tùy chỉnh diện mạo của bạn", @@ -1561,14 +1560,14 @@ "Change": "Thay đổi", "Enter a new identity server": "Nhập một máy chủ nhận dạng mới", "Do not use an identity server": "Không sử dụng máy chủ nhận dạng", - "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Sử dụng máy chủ nhận dạng là tùy chọn. Nếu bạn chọn không sử dụng máy chủ nhận dạng, bạn sẽ không thể bị phát hiện bởi những người dùng khác và bạn sẽ không thể mời người khác qua email hoặc điện thoại.", - "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Ngắt kết nối khỏi máy chủ nhận dạng của bạn sẽ có nghĩa là bạn sẽ không bị những người dùng khác phát hiện và bạn sẽ không thể mời người khác qua email hoặc điện thoại.", + "Using an identity server is optional. If you choose not to use an identity server, you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Sử dụng máy chủ định danh là tùy chọn. Nếu bạn chọn không sử dụng máy chủ định danh, bạn sẽ không thể bị phát hiện bởi những người dùng khác và bạn sẽ không thể mời người khác qua thư điện tử hoặc số điện thoại.", + "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "Ngắt kết nối khỏi máy chủ định danh của bạn sẽ có nghĩa là bạn sẽ không xuất hiện trong tìm kiếm và bạn sẽ không thể mời người khác qua thư điện tử hoặc điện thoại.", "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "Bạn hiện không sử dụng máy chủ nhận dạng. Để khám phá và có thể khám phá các địa chỉ liên hệ hiện có mà bạn biết, hãy thêm một địa chỉ liên hệ bên dưới.", "Identity server": "Máy chủ định danh", "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "Nếu bạn không muốn sử dụng để khám phá và có thể phát hiện ra bởi các liên hệ hiện có mà bạn biết, hãy nhập một máy chủ nhận dạng khác bên dưới.", "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "Bạn hiện đang sử dụng để khám phá và có thể khám phá những liên hệ hiện có mà bạn biết. Bạn có thể thay đổi máy chủ nhận dạng của mình bên dưới.", "Identity server (%(server)s)": "Máy chủ định danh (%(server)s)", - "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Chúng tôi khuyên bạn nên xóa địa chỉ email và số điện thoại của mình khỏi máy chủ nhận dạng trước khi ngắt kết nối.", + "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Chúng tôi khuyên bạn nên xóa địa chỉ thư điện tử và số điện thoại của mình khỏi máy chủ định danh trước khi ngắt kết nối.", "You are still sharing your personal data on the identity server .": "Bạn vẫn đang chia sẻ dữ liệu cá nhân của mình sharing your personal data trên máy chủ nhận dạng .", "Disconnect anyway": "Vẫn ngắt kết nối", "wait and try again later": "đợi và thử lại sau", @@ -1623,7 +1622,7 @@ "Start Verification": "Bắt đầu xác minh", "Accepting…": "Đang chấp nhận…", "Waiting for %(displayName)s to accept…": "Đang chờ %(displayName)s chấp nhận…", - "Back": "Sau", + "Back": "Quay lại", "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "Khi ai đó đặt URL trong tin nhắn của họ, bản xem trước URL có thể được hiển thị để cung cấp thêm thông tin về liên kết đó như tiêu đề, mô tả và hình ảnh từ trang web.", "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.": "Trong các phòng được mã hóa, như phòng này, tính năng xem trước URL bị tắt theo mặc định để đảm bảo rằng máy chủ của bạn (nơi tạo bản xem trước) không thể thu thập thông tin về các liên kết mà bạn nhìn thấy trong phòng này.", "URL previews are disabled by default for participants in this room.": "Xem trước URL bị tắt theo mặc định đối với những người tham gia trong phòng này.", @@ -1648,9 +1647,9 @@ "Secret storage:": "Lưu trữ bí mật:", "in account data": "trong dữ liệu tài khoản", "Secret storage public key:": "Khóa công khai lưu trữ bí mật:", - "Backup key cached:": "Khóa dự phòng được lưu vào bộ nhớ đệm:", + "Backup key cached:": "Đệm các khóa được sao lưu:", "not stored": "không được lưu trữ", - "Backup key stored:": "Khoá dự phòng đã được lưu trữ:", + "Backup key stored:": "Lưu trữ hóa được sao lưu:", "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.": "Sao lưu các khóa mã hóa với dữ liệu tài khoản của bạn trong trường hợp bạn mất quyền truy cập vào các phiên của mình. Các khóa của bạn sẽ được bảo mật bằng Khóa bảo mật duy nhất.", "unexpected type": "loại bất ngờ", "well formed": "được hình thành một cách hoàn hảo", @@ -1688,7 +1687,7 @@ "Edit settings relating to your space.": "Chỉnh sửa cài đặt liên quan đến space của bạn.", "General": "Tổng quát", "Failed to save space settings.": "Không thể lưu cài đặt space.", - "Invite with email or username": "Mời bằng email hoặc tên người dùng", + "Invite with email or username": "Mời bằng thư điện tử hoặc tên người dùng", "Invite people": "Mời mọi người", "Share invite link": "Chia sẻ liên kết mời", "Failed to copy": "Sao chép không thành công", @@ -1869,11 +1868,11 @@ "Phone Number": "Số điện thoại", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Một tin nhắn văn bản đã được gửi tới +%(msisdn)s. Vui lòng nhập mã xác minh trong đó.", "Remove %(phone)s?": "Xóa %(phone)s?", - "Email Address": "Địa chỉ email", - "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Chúng tôi đã gửi cho bạn một email để xác minh địa chỉ của bạn. Vui lòng làm theo hướng dẫn ở đó và sau đó nhấp vào nút bên dưới.", - "Unable to add email address": "Không thể thêm địa chỉ email", - "This doesn't appear to be a valid email address": "Đây có vẻ không phải là một địa chỉ email hợp lệ", - "Invalid Email Address": "Địa chỉ email không hợp lệ", + "Email Address": "Địa chỉ thư điện tử", + "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Chúng tôi đã gửi cho bạn một thư điện tử để xác minh địa chỉ của bạn. Vui lòng làm theo hướng dẫn ở đó và sau đó nhấp vào nút bên dưới.", + "Unable to add email address": "Không thể thêm địa chỉ địa chỉ thư điện tử", + "This doesn't appear to be a valid email address": "Đây có vẻ không phải là một địa chỉ thư điện tử hợp lệ", + "Invalid Email Address": "Địa chỉ thư điện tử không hợp lệ", "Remove %(email)s?": "Xóa %(email)s?", "Unable to remove contact information": "Không thể xóa thông tin liên hệ", "Discovery options will appear once you have added a phone number above.": "Các tùy chọn khám phá sẽ xuất hiện khi bạn đã thêm số điện thoại ở trên.", @@ -1883,20 +1882,20 @@ "Unable to verify phone number.": "Không thể xác minh số điện thoại.", "Unable to share phone number": "Không thể chia sẻ số điện thoại", "Unable to revoke sharing for phone number": "Không thể thu hồi chia sẻ cho số điện thoại", - "Discovery options will appear once you have added an email above.": "Tùy chọn khám phá sẽ xuất hiện khi bạn đã thêm email ở trên.", + "Discovery options will appear once you have added an email above.": "Tùy chọn khám phá sẽ xuất hiện khi nào bạn đã thêm địa chỉ thư điện tử.", "Share": "Chia sẻ", "Revoke": "Rút lại", "Complete": "Hoàn thành", "Verify the link in your inbox": "Xác minh liên kết trong hộp thư đến của bạn", - "Unable to verify email address.": "Không thể xác minh địa chỉ email.", - "Click the link in the email you received to verify and then click continue again.": "Nhấp vào liên kết trong email bạn nhận được để xác minh và sau đó nhấp lại tiếp tục.", - "Your email address hasn't been verified yet": "Địa chỉ email của bạn chưa được xác minh", - "Unable to share email address": "Không thể chia sẻ địa chỉ email", - "Unable to revoke sharing for email address": "Không thể thu hồi chia sẻ cho địa chỉ email", + "Unable to verify email address.": "Không thể xác minh địa chỉ thư điện tử.", + "Click the link in the email you received to verify and then click continue again.": "Nhấp vào liên kết trong thư điện tử bạn nhận được để xác minh và sau đó nhấp lại tiếp tục.", + "Your email address hasn't been verified yet": "Địa chỉ thư điện tử của bạn chưa được xác minh", + "Unable to share email address": "Không thể chia sẻ địa chỉ thư điện tử", + "Unable to revoke sharing for email address": "Không thể thu hồi chia sẻ cho địa chỉ thư điện tử", "Access": "Truy cập", "Encrypted": "Được mã hóa", "Once enabled, encryption cannot be disabled.": "Sau khi được bật, mã hóa không thể bị vô hiệu hóa.", - "Security & Privacy": "Bảo mật & Quyền riêng tư", + "Security & Privacy": "Bảo mật & Riêng tư", "Who can read history?": "Ai có thể đọc lịch sử phòng chat?", "People with supported clients will be able to join the room without having a registered account.": "Những người có khách hàng được hỗ trợ sẽ có thể tham gia phòng mà không cần đăng ký tài khoản.", "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "Thay đổi ai có thể đọc lịch sử phòng chat chỉ được áp dụng đối với các tin nhắn từ thời điểm này.", @@ -2170,7 +2169,7 @@ "Failed to save your profile": "Không lưu được hồ sơ của bạn", "There was an error loading your notification settings.": "Đã xảy ra lỗi khi tải cài đặt thông báo của bạn.", "Notification targets": "Mục tiêu thông báo", - "Noisy": "Ồn ào", + "Noisy": "Bật âm", "On": "Bật", "Off": "Tắt", "Mentions & keywords": "Đề cập & từ khóa", @@ -2180,7 +2179,7 @@ "Enable audible notifications for this session": "Bật thông báo âm thanh cho phiên này", "Show message in desktop notification": "Hiển thị tin nhắn trong thông báo trên màn hình", "Enable desktop notifications for this session": "Bật thông báo trên màn hình cho phiên này", - "Enable email notifications for %(email)s": "Bật thông báo qua email cho %(email)s", + "Enable email notifications for %(email)s": "Bật thông báo qua thư điện tử cho %(email)s", "An error occurred whilst saving your notification preferences.": "Đã xảy ra lỗi khi lưu tùy chọn thông báo của bạn.", "Error saving notification preferences": "Lỗi khi lưu tùy chọn thông báo", "Messages containing keywords": "Tin nhắn có chứa từ khóa", @@ -2191,7 +2190,7 @@ "Updating spaces... (%(progress)s out of %(count)s)|other": "Đang cập nhật space… (%(progress)s trên %(count)s)", "Sending invites... (%(progress)s out of %(count)s)|one": "Đang gửi lời mời…", "Sending invites... (%(progress)s out of %(count)s)|other": "Đang gửi lời mời... (%(progress)s trên %(count)s)", - "Loading new room": "Đang tải phòng", + "Loading new room": "Đang tải phòng mới", "Upgrading room": "Đang nâng cấp phòng", "This upgrade will allow members of selected spaces access to this room without an invite.": "Nâng cấp này sẽ cho phép các thành viên của các space đã chọn vào phòng này mà không cần lời mời.", "Space members": "Thành viên space", @@ -2214,8 +2213,8 @@ "Size must be a number": "Kích thước phải là một số", "Hey you. You're the best!": "Này bạn. Bạn là nhất!", "Message search initialisation failed": "Khởi tạo tìm kiếm tin nhắn không thành công", - "%(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 không thể lưu trữ cục bộ các thư được mã hóa một cách an toàn khi đang chạy trong trình duyệt web. Sử dụng %(brand)s Desktop để các thư được mã hóa xuất hiện trong kết quả tìm kiếm.", - "%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with search components added.": "%(brand)s thiếu một số thành phần cần thiết để lưu trữ cục bộ các thư được mã hóa một cách an toàn. Nếu bạn muốn thử nghiệm với tính năng này, hãy tạo một Màn hình %(brand)s tùy chỉnh với các thành phần tìm kiếm được thêm vào .", + "%(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 không thể lưu trữ cục bộ an toàn các tin nhắn được mã hóa khi đang chạy trong trình duyệt web. Sử dụng %(brand)s cho máy tính để các tin nhắn được mã hóa xuất hiện trong kết quả tìm kiếm.", + "%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with search components added.": "%(brand)s thiếu một số thành phần thiết yếu để lưu trữ cục bộ an toàn các tin nhắn được mã hóa. Nếu bạn muốn thử nghiệm với tính năng này, hãy dựng một bản %(brand)s tùy chỉnh cho máy tính có thêm các thành phần để tìm kiếm.", "Securely cache encrypted messages locally for them to appear in search results.": "Bộ nhớ cache an toàn các tin nhắn được mã hóa cục bộ để chúng xuất hiện trong kết quả tìm kiếm.", "Manage": "Quản lý", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "Lưu trữ cục bộ an toàn các tin nhắn đã được mã hóa để chúng xuất hiện trong các kết quả tìm kiếm, sử dụng %(size)s để lưu trữ các tin nhắn từ %(rooms)s phòng.", @@ -2230,21 +2229,21 @@ "Import E2E room keys": "Nhập các mã khoá phòng E2E", "": "", "exists": "tồn tại", - "Homeserver feature support:": "Hỗ trợ tính năng Homeserver:", + "Homeserver feature support:": "Tính năng được hỗ trợ bởi máy chủ:", "User signing private key:": "Người dùng ký khóa cá nhân:", "Self signing private key:": "Khóa cá nhân tự ký:", "not found locally": "không tìm thấy ở địa phương", "cached locally": "được lưu trữ cục bộ", "Master private key:": "Khóa cá nhân chính:", "not found in storage": "không tìm thấy trong bộ nhớ", - "in secret storage": "trong kho bí mật", + "in secret storage": "trong vùng lưu trữ bí mật", "Cross-signing private keys:": "Khóa cá nhân xác thực chéo:", "not found": "không tìm thấy", - "in memory": "trong trí nhớ", + "in memory": "trong bộ nhớ", "Cross-signing public keys:": "Khóa công khai xác thực chéo:", "Reset": "Cài lại", "Cross-signing is not set up.": "Tính năng xác thực chéo chưa được thiết lập.", - "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Tài khoản của bạn có danh tính xác thực chéo trong bộ nhớ bí mật, nhưng tài khoản này chưa được phiên này tin cậy.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Tài khoản của bạn có danh tính xác thực chéo trong vùng lưu trữ bí mật, nhưng chưa được phiên này tin cậy.", "Cross-signing is ready but keys are not backed up.": "Xác thực chéo đã sẵn sàng nhưng các khóa chưa được sao lưu.", "Cross-signing is ready for use.": "Xác thực chéo đã sẵn sàng để sử dụng.", "Your homeserver does not support cross-signing.": "Máy chủ của bạn không hỗ trợ xác thực chéo.", @@ -2252,7 +2251,7 @@ "Current password": "Mật khẩu hiện tại", "Passwords don't match": "Mật khẩu không khớp", "Confirm password": "Xác nhận mật khẩu", - "Do you want to set an email address?": "Bạn có muốn cài đặt một địa chỉ email không?", + "Do you want to set an email address?": "Bạn có muốn đặt một địa chỉ thư điện tử không?", "Passwords can't be empty": "Mật khẩu không được để trống", "New passwords don't match": "Mật khẩu mới không khớp", "Export E2E room keys": "Xuất các mã khoá phòng E2E", @@ -2290,10 +2289,10 @@ "Deops user with given id": "Deops user với id đã cho", "Could not find user in room": "Không tìm thấy người dùng trong phòng", "Joins room with given address": "Tham gia phòng có địa chỉ được chỉ định", - "Use an identity server to invite by email. Manage in Settings.": "Sử dụng máy chủ định danh để mời qua email. Quản lý trong Cài đặt.", + "Use an identity server to invite by email. Manage in Settings.": "Sử dụng máy chủ định danh để mời qua thư điện tử. Quản lý trong Cài đặt.", "Use an identity server": "Sử dụng máy chủ định danh", "Changes the avatar of the current room": "Thay đổi ảnh đại diện của phòng hiện tại", - "You do not have the required permissions to use this command.": "Bạn không được cấp quyền để sử dụng lệnh này.", + "You do not have the required permissions to use this command.": "Bạn không có quyền để dùng lệnh này.", "Sends a message as html, without interpreting it as markdown": "Gửi tin nhắn dưới dạng html, không sử dụng định dạng văn bản Markdown", "Sends a message as plain text, without interpreting it as markdown": "Gửi tin nhắn dưới dạng văn bản thuần túy, không sử dụng định dạng văn bản Markdown", "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Thêm ( ͡° ͜ʖ ͡°) vào một tin nhắn văn bản thuần túy", @@ -2476,13 +2475,13 @@ "Never send encrypted messages to unverified sessions from this session": "Không bao giờ gửi tin nhắn được mã hóa đến các phiên chưa được xác minh từ phiên này", "System font name": "Tên phông chữ hệ thống", "Use a system font": "Sử dụng phông chữ hệ thống", - "Match system theme": "Phù hợp với chủ đề hệ thống", + "Match system theme": "Theo chủ đề hệ thống", "Surround selected text when typing special characters": "Bao quanh văn bản đã chọn khi nhập các ký tự đặc biệt", "Use Ctrl + Enter to send a message": "Sử dụng Ctrl + Enter để gửi tin nhắn", "Use Command + Enter to send a message": "Sử dụng Command + Enter để gửi tin nhắn", "Use Ctrl + F to search timeline": "Sử dụng Ctrl + F để tìm kiếm dòng thời gian", "Use Command + F to search timeline": "Sử dụng Command + F để tìm kiếm dòng thời gian", - "Show typing notifications": "Hiển thị thông báo \"đang đánh máy\"", + "Show typing notifications": "Hiển thị thông báo \"đang gõ\"", "Jump to the bottom of the timeline when you send a message": "Chuyển đến cuối dòng thời gian khi bạn gửi tin nhắn", "Show line numbers in code blocks": "Hiển thị số dòng trong các khối mã", "Expand code blocks by default": "Mở rộng các khối mã theo mặc định", @@ -2621,8 +2620,6 @@ "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Thực hiện cuộc gọi thất bại vì không thể truy cập micrô. Kiểm tra xem micrô đã được cắm và thiết lập đúng chưa.", "Unable to access microphone": "Không thể truy cập micrô", "OK": "OK", - "Try using turn.matrix.org": "Thử dùng turn.matrix.org", - "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.": "Ngoài ra, bạn có thể thử sử dụng máy chủ công khai turn.matrix.org, nhưng sẽ không ổn định và sẽ chia sẻ địa chỉ IP của bạn với máy chủ đó. Bạn cũng có thể quản lý trong Cài đặt.", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Vui lòng yêu cầu quản trị viên máy chủ của bạn (%(homeserverDomain)s) thiết lập máy chủ TURN để cuộc gọi hoạt động ổn định.", "Call failed due to misconfigured server": "Thực hiện cuộc gọi thất bại do thiết lập máy chủ sai", "The call was answered on another device.": "Cuộc gọi đã được trả lời trên một thiết bị khác.", @@ -2640,7 +2637,7 @@ "Proceed with reset": "Tiến hành đặt lại", "It looks like you don't have a Security Key or any other devices you can verify against. This device will not be able to access old encrypted messages. In order to verify your identity on this device, you'll need to reset your verification keys.": "Có vẻ như bạn không có Khóa Bảo mật hoặc bất kỳ thiết bị nào bạn có thể xác minh. Thiết bị này sẽ không thể truy cập vào các tin nhắn mã hóa cũ. Để xác minh danh tính của bạn trên thiết bị này, bạn sẽ cần đặt lại các khóa xác minh của mình.", "Someone already has that username, please try another.": "Ai đó đã có username đó, vui lòng thử một cái khác.", - "The email address doesn't appear to be valid.": "Địa chỉ email dường như không hợp lệ.", + "The email address doesn't appear to be valid.": "Địa chỉ thư điện tử dường như không hợp lệ.", "Skip verification for now": "Bỏ qua xác minh ngay bây giờ", "Really reset verification keys?": "Thực sự đặt lại các khóa xác minh?", "Clear": "Xoá", @@ -2740,10 +2737,7 @@ "Home is useful for getting an overview of everything.": "Home rất hữu ích để có cái nhìn tổng quan về mọi thứ.", "Spaces to show": "Space để hiển thị", "Sidebar": "Thanh bên", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "Quản lý các thiết bị đã đăng nhập của bạn bên dưới. Tên thiết bị được hiển thị cho mọi người mà bạn giao tiếp.", - "Where you're signed in": "Nơi bạn được đăng nhập", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "Chia sẻ dữ liệu ẩn danh giúp chúng tôi xác định các sự cố. Không có thông tin cá nhân. Không có bên thứ ba.", - "Okay": "OK", "To view all keyboard shortcuts, click here.": "Để xem tất cả các phím tắt, nhấn vào đây.", "Show tray icon and minimise window to it on close": "Hiển thị biểu tượng khay và thu nhỏ cửa sổ vào nó khi đóng", "Use high contrast": "Sử dụng độ tương phản cao", @@ -2751,14 +2745,6 @@ "Large": "Lớn", "Image size in the timeline": "Kích thước hình ảnh trong timeline", "Rename": "Đặt lại tên", - "Sign Out": "Đăng xuất", - "This device": "Thiết bị này", - "You aren't signed into any other devices.": "Bạn không đăng nhập vào bất kỳ thiết bị nào khác.", - "Sign out %(count)s selected devices|one": "Đăng xuất %(count)s thiết bị được chọn", - "Sign out %(count)s selected devices|other": "Đăng xuất %(count)s thiết bị được chọn", - "Devices without encryption support": "Các thiết bị không hỗ trợ mã hóa", - "Unverified devices": "Các thiết bị chưa xác minh", - "Verified devices": "Các thiết bị đã xác minh", "Select all": "Chọn tất cả", "Deselect all": "Bỏ chọn tất cả", "Sign out devices|one": "Đăng xuất thiết bị", @@ -2767,8 +2753,6 @@ "Click the button below to confirm signing out these devices.|other": "Nhấn nút bên dưới để xác nhận đăng xuất các thiết bị này.", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "Xác nhận đăng xuất thiết bị này bằng cách sử dụng Single Sign On để xác thực danh tính của bạn.", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "Xác nhận đăng xuất các thiết bị này bằng cách sử dụng Single Sign On để xác thực danh tính.", - "Unable to load device list": "Không thể tải danh sách thiết bị", - "Your homeserver does not support device management.": "Homeserver của bạn không hỗ trợ quản lý thiết bị.", "Pin to sidebar": "Ghim vào sidebar", "Quick settings": "Cài đặt nhanh", "sends rainfall": "gửi kiểu mưa rơi", @@ -2791,7 +2775,7 @@ "%(senderDisplayName)s changed who can join this room.": "%(senderDisplayName)s đã thay đổi ai có thể tham gia phòng này.", "%(senderDisplayName)s changed who can join this room. View settings.": "%(senderDisplayName)s đã thay đổi ai có thể tham gia phòng này. Xem cài đặt .", "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Khóa đăng nhập bạn cung cấp khớp với khóa đăng nhập bạn nhận từ thiết bị %(deviceId)s của %(userId)s. Thiết bị được đánh dấu là đã được xác minh.", - "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Sử dụng máy chủ định danh để mời qua email. Bấm Tiếp tục để sử dụng máy chủ định danh mặc định (%(defaultIdentityServerName)s) hoặc quản lý trong Cài đặt.", + "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "Sử dụng máy chủ định danh để mời qua thư điện tử. Bấm Tiếp tục để sử dụng máy chủ định danh mặc định (%(defaultIdentityServerName)s) hoặc quản lý trong Cài đặt.", "%(spaceName)s and %(count)s others|one": "%(spaceName)s và %(count)s khác", "%(spaceName)s and %(count)s others|zero": "%(spaceName)s", "%(spaceName)s and %(count)s others|other": "%(spaceName)s và %(count)s khác", @@ -2903,7 +2887,7 @@ "Toggle attribution": "Chuyển đổi thuộc tính", "This homeserver is not configured correctly to display maps, or the configured map server may be unreachable.": "Homeserver này không được cấu hình để hiển thị bản đồ chính xác, hoặc máy chủ bản đồ được cấu hình không thể kết nối.", "This homeserver is not configured to display maps.": "Homeserver này không được cấu hình để hiển thị bản đồ.", - "The user's homeserver does not support the version of the space.": "Homeserver của người dùng không hỗ trợ phiên bản của space.", + "The user's homeserver does not support the version of the space.": "Máy chủ nhà của người dùng không hỗ trợ phiên bản của space.", "User may or may not exist": "Người dùng có thể hoặc không tồn tại", "User does not exist": "Người dùng không tồn tại", "User is already in the room": "Người dùng đã trong phòng", @@ -3024,7 +3008,7 @@ "Download %(brand)s": "Tải xuống %(brand)s", "Sorry — this call is currently full": "Xin lỗi — cuộc gọi này đang đầy", "Can currently only be enabled via config.json": "Hiện chỉ có thể bật bằng tập tin cấu hình config.json", - "No identity access token found": "Không tìm thấy mã thông báo danh tính truy cập", + "No identity access token found": "Không tìm thấy mã thông báo danh tính", "Unverified sessions are sessions that have logged in with your credentials but have not been cross-verified.": "Các phiên chưa được xác thực là các phiên đăng nhập bằng thông tin đăng nhập nhưng chưa được xác thực chéo.", "Secure Backup successful": "Sao lưu bảo mật thành công", "Presence": "Hiện diện", @@ -3054,8 +3038,6 @@ "When enabled, the other party might be able to see your IP address": "Khi bật, người kia có thể thấy địa chỉ IP của bạn", "Allow Peer-to-Peer for 1:1 calls": "Cho phép cuộc gọi ngang hàng (P2P) cho các cuộc gọi 1:1", "Show avatars in user, room and event mentions": "Hiện ảnh đại diện của người dùng, phòng và thông báo sự kiện", - "New session manager": "Trình quản lý phiên mới", - "Use new session manager": "Dùng trình quản lý phiên mới", "Under active development.": "Đang được phát triển tích cực.", "Under active development, cannot be disabled.": "Đang được phát triển tích cực, không thể vô hiệu.", "Currently experimental.": "Hiện đang thử nghiệm.", @@ -3080,5 +3062,137 @@ "Could not find room": "Không tìm thấy phòng", "WARNING: session already verified, but keys do NOT MATCH!": "CẢNH BÁO: phiên đã được xác thực, nhưng các khóa KHÔNG KHỚP!", "30s forward": "30 giây kế tiếp", - "30s backward": "30 giây trước" + "30s backward": "30 giây trước", + "You reacted %(reaction)s to %(message)s": "Bạn phản ứng %(reaction)s với %(message)s", + "If you know a room address, try joining through that instead.": "Nếu bạn biết địa chỉ phòng, hãy dùng nó để tham gia.", + "Video call started": "Cuộc gọi truyền hình đã bắt đầu", + "Unknown room": "Phòng không xác định", + "Starting export process…": "Bắt đầu trích xuất…", + "Creating HTML…": "Đang tạo HTML…", + "Starting export…": "Bắt đầu trích xuất…", + "Yes, stop broadcast": "Đúng rồi, dừng phát thanh", + "You are already recording a voice broadcast. Please end your current voice broadcast to start a new one.": "Bạn hiện đang ghi một cuộc phát thanh. Kết thúc phát thanh để thực hiện một cái mới.", + "Video call started in %(roomName)s. (not supported by this browser)": "Cuộc gọi truyền hình đã được bắt đầu ở %(roomName)s. (không được trình duyệt này hỗ trợ)", + "iframe has no src attribute": "Thẻ iframe (khung) không có thuộc tính src (nguồn)", + "Check your email to continue": "Kiểm tra hòm thư để tiếp tục", + "This invite was sent to %(email)s": "Lời mời này đã được gửi tới %(email)s", + "This invite was sent to %(email)s which is not associated with your account": "Lời mời này đã được gửi đến %(email)s nhưng không liên kết với tài khoản của bạn", + "Verified sessions": "Các phiên đã xác thực", + "Unverified": "Chưa xác thực", + "Verified": "Đã xác thực", + "Inactive for %(inactiveAgeDays)s+ days": "Không hoạt động trong %(inactiveAgeDays)s+ ngày", + "Show details": "Hiện chi tiết", + "Hide details": "Ẩn chi tiết", + "Last activity": "Hoạt động cuối", + "Renaming sessions": "Đổi tên phiên", + "Confirm signing out these devices|other": "Xác nhận đăng xuất khỏi các thiết bị này", + "Call type": "Loại cuộc gọi", + "Internal room ID": "Định danh riêng của phòng", + "For best security, verify your sessions and sign out from any session that you don't recognize or use anymore.": "Để bảo mật nhất, hãy xác minh các phiên và đăng xuất khỏi phiên nào bạn không nhận ra hay dùng nữa.", + "%(errorMessage)s (HTTP status %(httpStatus)s)": "%(errorMessage)s (Trạng thái HTTP %(httpStatus)s)", + "Unknown password change error (%(stringifiedError)s)": "Lỗi không xác định khi đổi mật khẩu (%(stringifiedError)s)", + "You did it!": "Hoàn thành rồi!", + "Only %(count)s steps to go|one": "Chỉ %(count)s bước nữa thôi", + "Only %(count)s steps to go|other": "Chỉ %(count)s bước nữa thôi", + "Ignore (%(counter)s)": "Ẩn (%(counter)s)", + "Developer tools": "Công cụ phát triển", + "Match system": "Theo hệ thống", + "Search users in this room…": "Tìm người trong phòng…", + "Give one or multiple users in this room more privileges": "Cho người trong phòng này nhiều quyền hơn", + "Fill screen": "Vừa màn hình", + "Show polls button": "Hiện nút thăm dò ý kiến", + "Rust cryptography implementation": "Mã hóa dựa trên Rust", + "Favourite Messages": "Tin nhắn yêu thích", + "Live Location Sharing": "Chia sẻ vị trí thực", + "New group call experience": "Trải nghiệm gọi nhóm mới", + "Requires your server to support MSC3030": "Yêu cầu máy chủ của bạn hỗ trợ MSC3030", + "Jump to date (adds /jumptodate and jump to date headers)": "Nhảy đến ngày (thêm lệnh /jumptodate và nhảy đến ngày)", + "Defaults to room member list.": "Mặc định là danh sách thành viên phòng.", + "New ways to ignore people": "Cách mới để ẩn người dùng", + "Use rich text instead of Markdown in the message composer.": "Dùng văn bản giàu tính chất thay cho định dạng Markdown ở thanh soạn tin nhắn.", + "Rich text editor": "Trình soạn thảo văn bản giàu tính chất", + "In rooms that support moderation, the “Report” button will let you report abuse to room moderators.": "Trong các phòng hỗ trợ điều phối, nút \"Báo cáo\" sẽ giúp bạn báo cáo lạm dụng cho điều phối viên của phòng.", + "Report to moderators": "Báo cáo cho điều phối viên", + "Unsent": "Chưa gửi", + "Fetching events…": "Đang tìm các sự kiện…", + "Unknown error fetching location. Please try again later.": "Lỗi không xác định khi tìm vị trí của bạn. Hãy thử lại sau.", + "Timed out trying to fetch your location. Please try again later.": "Tìm vị trí của bạn mất quá lâu. Hãy thử lại sau.", + "Failed to fetch your location. Please try again later.": "Không tìm được vị trí của bạn. Hãy thử lại sau.", + "WebGL is required to display maps, please enable it in your browser settings.": "Cần WebGL để hiển thị bản đồ, bạn hãy bật lên trong trình duyệt.", + "Unable to connect to Homeserver. Retrying…": "Không kết nối được với máy chủ nhà. Đang thử lại…", + "Connection error - Recording paused": "Lỗi kết nối - Đã tạm dừng ghi âm", + "pause voice broadcast": "Tạm dừng phát thanh", + "Buffering…": "Đang khởi tạo bộ đệm…", + "Voice broadcast": "Phát thanh", + "Change input device": "Đổi thiết bị đầu vào", + "resume voice broadcast": "Tiếp tục phát thanh", + "Yes, end my recording": "Vâng, ngừng ghi âm tôi", + "This may be caused by having the app open in multiple tabs or due to clearing browser data.": "Mở ứng dụng trên nhiều thẻ hay xóa dữ liệu trình duyệt có thể là nguyên nhân.", + "If you want to retain access to your chat history in encrypted rooms you should first export your room keys and re-import them afterwards.": "Nếu bạn muốn duy trì truy cập vào lịch sử trò chuyện trong các phòng được mã hóa bạn cần trích xuất các khóa phòng và thêm vào lại sau.", + "Requires your server to support the stable version of MSC3827": "Cần máy chủ nhà của bạn hỗ trợ phiên bản ổn định của MSC3827", + "Feeling experimental? Try out our latest ideas in development. These features are not finalised; they may be unstable, may change, or may be dropped altogether. Learn more.": "Muốn trải nghiệm? Thử các ý tưởng mới nhất còn đang được phát triển của chúng tôi. Các tính năng này chưa được hoàn thiện, chúng có thể không ổn định, có thể thay đổi, hay bị loại bỏ hoàn toàn. Tìm hiểu thêm.", + "What's next for %(brand)s? Labs are the best way to get things early, test out new features and help shape them before they actually launch.": "Những gì sắp đến với %(brand)s? Phòng thí điểm là nơi tốt nhất để có mọi thứ sớm, thử nghiệm tính năng mới và giúp hoàn thiện trước khi chúng thực sự ra mắt.", + "Upgrade this space to the recommended room version": "Nâng cấp phòng tới phiên bản được khuyến nghị", + "View older version of %(spaceName)s.": "Xem phiên bản cũ của %(spaceName)s.", + "Start %(brand)s calls": "Bắt đầu %(brand)s cuộc gọi", + "play voice broadcast": "nghe phát thanh", + "Find your people": "Tìm người thân", + "Make sure people know it’s really you": "Đảm bảo mọi người nhận ra bạn", + "Automatically adjust the microphone volume": "Tự điều chỉnh âm lượng cho micrô", + "Enable notifications for this account": "Bật thông báo cho tài khoản này", + "Unable to play this voice broadcast": "Không thể nghe phát thanh", + "%(sender)s reacted %(reaction)s to %(message)s": "%(sender)s phản ứng %(reaction)s với %(message)s", + "Let moderators hide messages pending moderation.": "Cho phép điều phối viên ẩn các tin nhắn đang chờ duyệt.", + "Your server doesn't support disabling sending read receipts.": "Máy chủ của bạn không hỗ trợ tắt gửi thông báo đã học.", + "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "Chỉ áp dụng nếu máy chủ nhà của bạn không cung cấp. Địa chỉ Internet (IP) của bạn có thể được chia sẻ trong một cuộc gọi.", + "Enable notifications for this device": "Bật thông báo cho thiết bị này", + "An error occurred when updating your notification preferences. Please try to toggle your option again.": "Một lỗi đã xảy ra khi cập nhật tùy chọn thông báo của bạn. Hãy thử làm lại.", + "Join %(brand)s calls": "Tham gia %(brand)s cuộc gọi", + "You will not receive push notifications on other devices until you sign back in to them.": "Bạn sẽ không nhận được thông báo đẩy trên các thiết bị khác cho đến khi bạn đăng nhập lại.", + "Some results may be hidden for privacy": "Một số kết quả có thể bị ẩn để đảm bảo quyền riêng tư", + "Turn off to disable notifications on all your devices and sessions": "Tắt để vô hiệu thông bao trên tất cả các thiết bị và phiên", + "Automatically send debug logs on decryption errors": "Tự động gửi nhật ký gỡ lỗi mỗi lúc gặp lỗi khi giải mã", + "Verify Session": "Xác thực phiên", + "Start your first chat": "Bắt đầu cuộc trò chuyện đầu tiên", + "Sends the given message with hearts": "Gửi tin nhắn cùng với thả tim", + "Your account details are managed separately at %(hostname)s.": "Thông tin tài khoản bạn được quản lý riêng ở %(hostname)s.", + "Spaces are a new way to group rooms and people. What kind of Space do you want to create? You can change this later.": "Space là một cách mới để nhóm các phòng và mọi người. Loại space nào bạn muốn tạo? Bạn có thể thay đổi sau.", + "Identity server is %(identityServerUrl)s": "Máy chủ định danh là %(identityServerUrl)s", + "For best security and privacy, it is recommended to use Matrix clients that support encryption.": "Để có bảo mật và quyền riêng tư tốt nhất, nên dùng các phần mềm máy khách Matrix có hỗ trợ mã hóa.", + "If you can't find the room you're looking for, ask for an invite or create a new room.": "Nếu bạn không tìm được phòng bạn muốn, yêu cầu lời mời hay tạo phòng mới.", + "Fetching keys from server…": "Đang lấy các khóa từ máy chủ…", + "New video room": "Tạo phòng truyền hình", + "sends hearts": "thả tim", + "Go live": "Phát trực tiếp", + "Don’t miss a reply or important message": "Đừng bỏ lỡ một tin nhắn trả lời hay tin nhắn quan trọng", + "New room": "Tạo phòng", + "Secure messaging for work": "Tin nhắn bảo mật cho công việc", + "Stop live broadcasting?": "Ngừng phát thanh trực tiếp?", + "Welcome to %(brand)s": "Chào mừng bạn tới %(brand)s", + "Automatically send debug logs when key backup is not functioning": "Tự động gửi nhật ký gỡ lỗi mỗi lúc sao lưu khóa không hoạt động", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. ": "Nếu bạn đã báo cáo lỗi qua GitHub, nhật ký gỡ lỗi có thể giúp chúng tôi theo dõi vấn đề. ", + "With free end-to-end encrypted messaging, and unlimited voice and video calls, %(brand)s is a great way to stay in touch.": "Với mã hóa đầu cuối miễn phí, cuộc gọi thoại và truyền hình không giới hạn, %(brand)s là cách tuyệt vời để giữ liên lạc.", + "Connecting to integration manager…": "Đang kết nối tới quản lý tích hợp…", + "IRC (Experimental)": "IRC (thử nghiệm)", + "Unfortunately we're unable to start a recording right now. Please try again later.": "Thật không may là chúng tôi không thể bắt đầu ghi âm. Vui lòng thử lại.", + "You can also ask your homeserver admin to upgrade the server to change this behaviour.": "Bạn còn có thể yêu cầu quản trị viên máy chủ nhà nâng cấp máy chủ để thay đổi nó.", + "Don’t miss a thing by taking %(brand)s with you": "Không bỏ lỡ gì bằng cách mang %(brand)s bên bạn", + "Show HTML representation of room topics": "Hiện chủ đề phòng bằng HTML", + "Element Call video rooms": "Phòng truyền hình Element Call", + "Community ownership": "Làm chủ cộng đồng", + "Alternatively, you can try to use the public server at , but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Ngoài ra, bạn còn có thể thử dùng máy chủ công cộng tại , nhưng máy chủ này sẽ không đáng tin cậy, sẽ chia sẻ địa chỉ IP của bạn với máy chủ đó. Bạn cũng có thể quản lý ở phần Cài đặt.", + "You attempted to join using a room ID without providing a list of servers to join through. Room IDs are internal identifiers and cannot be used to join a room without additional information.": "Bạn tìm cách tham gia một phòng bằng định danh (ID) phòng nhưng không cung cấp danh sách các máy chủ để tham gia qua. Định danh phòng là nội bộ và không thể được dùng để tham gia phòng mà không có thông tin thêm.", + "Dynamic room predecessors": "Tiền nhiệm động cho phòng", + "Complete these to get the most out of %(brand)s": "Hoàn thành những việc sau để tận dụng tất cả của %(brand)s", + "Try using %(server)s": "Thử dùng %(server)s", + "User is not logged in": "Người dùng đang không đăng nhập", + "You can’t start a call as you are currently recording a live broadcast. Please end your live broadcast in order to start a call.": "Bạn không thể bắt đầu gọi vì bạn đang ghi âm để cuộc phát thanh trực tiếp. Hãy ngừng phát thanh để bắt đầu gọi.", + "Enable intentional mentions": "Bật đề cập có chủ ý", + "%(brand)s is end-to-end encrypted, but is currently limited to smaller numbers of users.": "%(brand)s được mã hóa đầu cuối, nhưng hiện giới hạn cho một lượng người dùng nhỏ.", + "Server info": "Thông tin máy chủ", + "Send custom account data event": "Gửi sự kiện tài khoản tùy chỉnh", + "Send custom timeline event": "Gửi sự kiện tùy chỉnh vào dòng thời gian", + "Feedback sent! Thanks, we appreciate it!": "Đã gửi phản hồi! Cảm ơn bạn, chúng tôi đánh giá cao các phản hồi này!", + "Send custom state event": "Gửi sự kiện trạng thái tùy chỉnh", + "Send custom room account data event": "Gửi sự kiện tài khoản tùy chỉnh trong phòng" } diff --git a/src/i18n/strings/vls.json b/src/i18n/strings/vls.json index 4e4ba696bdc..c79ce5fc501 100644 --- a/src/i18n/strings/vls.json +++ b/src/i18n/strings/vls.json @@ -959,8 +959,6 @@ "Command Help": "Hulp by ipdrachtn", "Call failed due to misconfigured server": "Iproep mislukt door verkeerd gecounfigureerde server", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "Vroagt an den beheerder van je thuusserver (%(homeserverDomain)s) vo e TURN-server te counfigureern tenende jen iproepn betrouwboar te doen werkn.", - "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.": "Je kut ook de publieke server ip turn.matrix.org gebruukn, mo da goa minder betrouwboar zyn, en goa jen IP-adresse me die server deeln. Je kut dit ook beheern in d’Instelliengn.", - "Try using turn.matrix.org": "Probeert van turn.matrix.org te gebruukn", "Identity server has no terms of service": "Den identiteitsserver èt geen dienstvoorwoardn", "The identity server you have chosen does not have any terms of service.": "Den identiteitsserver da je gekozen ghed èt, èt geen dienstvoorwoardn.", "Only continue if you trust the owner of the server.": "Goat alleene mo verder o je den eigenoar van de server betrouwt.", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index bbb76e33a47..b48eb4951ad 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -91,8 +91,8 @@ "Are you sure you want to leave the room '%(roomName)s'?": "你确定要离开房间 “%(roomName)s” 吗?", "Are you sure you want to reject the invitation?": "你确定要拒绝邀请吗?", "Bans user with given id": "按照 ID 封禁用户", - "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "无法连接主服务器 - 请检查网络连接,确保你的主服务器 SSL 证书被信任,且没有浏览器插件拦截请求。", - "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "当浏览器地址栏里有 HTTPS 的 URL 时,不能使用 HTTP 连接主服务器。请使用 HTTPS 或者允许不安全的脚本。", + "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "无法连接家服务器 - 请检查网络连接,确保你的家服务器 SSL 证书被信任,且没有浏览器插件拦截请求。", + "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "当浏览器地址栏里有 HTTPS 的 URL 时,不能使用 HTTP 连接家服务器。请使用 HTTPS 或者允许不安全的脚本。", "Change Password": "修改密码", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s 将房间名称改为 %(roomName)s。", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s 移除了房间名称。", @@ -385,7 +385,7 @@ "Uploading %(filename)s and %(count)s others|zero": "正在上传 %(filename)s", "Uploading %(filename)s and %(count)s others|one": "正在上传 %(filename)s 与其他 %(count)s 个文件", "Please note you are logging into the %(hs)s server, not matrix.org.": "请注意,你正在登录 %(hs)s,而非 matrix.org。", - "This homeserver doesn't offer any login flows which are supported by this client.": "此主服务器不兼容本客户端支持的任何登录方式。", + "This homeserver doesn't offer any login flows which are supported by this client.": "此家服务器不兼容本客户端支持的任何登录方式。", "Opens the Developer Tools dialog": "打开开发者工具窗口", "Notify the whole room": "通知房间全体成员", "This process allows you to export the keys for messages you have received in encrypted rooms to a local file. You will then be able to import the file into another Matrix client in the future, so that client will also be able to decrypt these messages.": "此操作允许你将加密房间中收到的消息的密钥导出为本地文件。你可以将文件导入其他 Matrix 客户端,以便让别的客户端在未收到密钥的情况下解密这些消息。", @@ -469,7 +469,7 @@ "Share room": "分享房间", "System Alerts": "系统警告", "Muted Users": "被禁言的用户", - "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.": "在加密的房间中,比如此房间,URL预览默认是禁用的,以确保你的主服务器(生成预览的地方)无法收集与你在此房间中看到的链接有关的信息。", + "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.": "在加密的房间中,比如此房间,URL预览默认是禁用的,以确保你的家服务器(生成预览的地方)无法收集与你在此房间中看到的链接有关的信息。", "When someone puts a URL in their message, a URL preview can be shown to give more information about that link such as the title, description, and an image from the website.": "当有人在他们的消息里放置URL时,可显示URL预览以给出更多有关链接的信息,如其网站的标题、描述以及图片。", "Are you sure you wish to remove (delete) this event? Note that if you delete a room name or topic change, it could undo the change.": "你确定要移除(删除)此事件吗?注意,如果删除房间名称或话题的更改,更改会被撤销。", "Clear Storage and Sign Out": "清除存储并登出", @@ -484,9 +484,9 @@ "Link to selected message": "选中消息的链接", "This room is not public. You will not be able to rejoin without an invite.": "此房间不是公开房间。如果没有成员邀请,你将无法重新加入。", "Can't leave Server Notices room": "无法退出服务器公告房间", - "This room is used for important messages from the Homeserver, so you cannot leave it.": "此房间是用于发布来自主服务器的重要讯息的,所以你不能退出它。", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "此房间是用于发布来自家服务器的重要讯息的,所以你不能退出它。", "Terms and Conditions": "条款与要求", - "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "若要继续使用主服务器 %(homeserverDomain)s,你必须浏览并同意我们的条款与要求。", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "若要继续使用家服务器 %(homeserverDomain)s,你必须浏览并同意我们的条款与要求。", "Review terms and conditions": "浏览条款与要求", "You can't send any messages until you review and agree to our terms and conditions.": "在你查看并同意 我们的条款与要求 之前,你不能发送任何消息。", "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "尝试了加载此房间时间线上的特定点,但你没有查看相关消息的权限。", @@ -508,12 +508,12 @@ "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "阻止用户在旧房间中发言,并发送消息建议用户迁移至新房间", "Put a link back to the old room at the start of the new room so people can see old messages": "在新房间的开始处发送一条指回旧房间的链接,这样用户可以查看旧消息", "Legal": "法律信息", - "This homeserver has hit its Monthly Active User limit.": "此主服务器已达到其每月活跃用户限制。", + "This homeserver has hit its Monthly Active User limit.": "此家服务器已达到其每月活跃用户限制。", "This homeserver has exceeded one of its resource limits.": "本服务器已达到其使用量限制之一。", "Please contact your service administrator to continue using this service.": "请 联系你的服务管理员 以继续使用本服务。", - "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "你的消息未被发送,因为本主服务器已达到其使用量限制之一。请 联系你的服务管理员 以继续使用本服务。", - "Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please contact your service administrator to continue using the service.": "你的消息未被发送,因为本主服务器已达到其每月活跃用户限制。请 联系你的服务管理员 以继续使用本服务。", - "Please contact your homeserver administrator.": "请 联系你的主服务器管理员。", + "Your message wasn't sent because this homeserver has exceeded a resource limit. Please contact your service administrator to continue using the service.": "你的消息未被发送,因为本家服务器已达到其使用量限制之一。请 联系你的服务管理员 以继续使用本服务。", + "Your message wasn't sent because this homeserver has hit its Monthly Active User Limit. Please contact your service administrator to continue using the service.": "你的消息未被发送,因为本家服务器已达到其每月活跃用户限制。请 联系你的服务管理员 以继续使用本服务。", + "Please contact your homeserver administrator.": "请 联系你的家服务器管理员。", "%(senderName)s set the main address for this room to %(address)s.": "%(senderName)s 将此房间的主要地址设为了 %(address)s。", "%(senderName)s removed the main address for this room.": "%(senderName)s 移除了此房间的主要地址。", "Unable to load! Check your network connectivity and try again.": "无法加载!请检查你的网络连接并重试。", @@ -544,7 +544,7 @@ "Capitalization doesn't help very much": "大写字母并没有很大的作用", "All-uppercase is almost as easy to guess as all-lowercase": "全大写的密码通常比全小写的更容易猜测", "Reversed words aren't much harder to guess": "把单词倒过来不会比原来的难猜很多", - "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "文件《%(fileName)s》超过了此主服务器的上传大小限制", + "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "文件“%(fileName)s”超过了此家服务器的上传大小限制", "Upgrades a room to a new version": "将房间升级到新版本", "Gets or sets the room topic": "获取或设置房间话题", "This room has no topic.": "此房间没有话题。", @@ -690,7 +690,7 @@ "Chat with %(brand)s Bot": "与 %(brand)s 机器人聊天", "Help & About": "帮助及关于", "Bug reporting": "错误上报", - "FAQ": "常见问题", + "FAQ": "常见问答集", "Versions": "版本", "Preferences": "偏好", "Composer": "编辑器", @@ -739,9 +739,9 @@ "Room Settings - %(roomName)s": "房间设置 - %(roomName)s", "Failed to decrypt %(failedCount)s sessions!": "%(failedCount)s 个会话解密失败!", "Warning: you should only set up key backup from a trusted computer.": "警告:你应此只在受信任的电脑上设置密钥备份。", - "This homeserver would like to make sure you are not a robot.": "此主服务器想要确认你不是机器人。", - "Please review and accept all of the homeserver's policies": "请阅读并接受此主服务器的所有政策", - "Please review and accept the policies of this homeserver:": "请阅读并接受此主服务器的政策:", + "This homeserver would like to make sure you are not a robot.": "此家服务器想要确认你不是机器人。", + "Please review and accept all of the homeserver's policies": "请阅读并接受此家服务器的所有政策", + "Please review and accept the policies of this homeserver:": "请阅读并接受此家服务器的政策:", "Username": "用户名", "Change": "更改", "Email (optional)": "电子邮箱(可选)", @@ -753,14 +753,14 @@ "Guest": "游客", "Could not load user profile": "无法加载用户资料", "Your password has been reset.": "你的密码已重置。", - "Invalid homeserver discovery response": "无效的主服务器搜索响应", + "Invalid homeserver discovery response": "无效的家服务器搜索响应", "Invalid identity server discovery response": "无效的身份服务器搜索响应", "General failure": "一般错误", - "This homeserver does not support login using email address.": "此主服务器不支持使用电子邮箱地址登录。", - "Failed to perform homeserver discovery": "无法执行主服务器搜索", + "This homeserver does not support login using email address.": "此家服务器不支持使用电子邮箱地址登录。", + "Failed to perform homeserver discovery": "无法执行家服务器搜索", "Sign in with single sign-on": "使用单点登录", "Create account": "创建账户", - "Registration has been disabled on this homeserver.": "此主服务器已禁止注册。", + "Registration has been disabled on this homeserver.": "此家服务器已禁止注册。", "Unable to query for supported registration methods.": "无法查询支持的注册方法。", "For maximum security, this should be different from your account password.": "为确保最大的安全性,它应该与你的账户密码不同。", "That matches!": "匹配成功!", @@ -804,7 +804,7 @@ "You cannot modify widgets in this room.": "你无法修改此房间的插件。", "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s 撤销了对 %(targetDisplayName)s 加入房间的邀请。", "Upgrade this room to the recommended room version": "升级此房间至推荐版本", - "This room is running room version , which this homeserver has marked as unstable.": "此房间运行的房间版本是 ,此版本已被主服务器标记为 不稳定 。", + "This room is running room version , which this homeserver has marked as unstable.": "此房间运行的房间版本是 ,此版本已被家服务器标记为 不稳定 。", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "升级此房间将会关闭房间的当前实例并创建一个具有相同名称的升级版房间。", "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.": "无法撤销邀请。此服务器可能出现了临时错误,或者你没有足够的权限来撤销邀请。", @@ -816,12 +816,10 @@ "Add Email Address": "添加邮箱", "Add Phone Number": "添加电话号码", "Call failed due to misconfigured server": "服务器配置错误导致通话失败", - "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "请联系你的主服务器(%(homeserverDomain)s)的管理员配置 TURN 服务器,以确保通话过程稳定。", - "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", + "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "请联系你的家服务器(%(homeserverDomain)s)的管理员配置 TURN 服务器,以确保通话过程稳定。", "Your %(brand)s is misconfigured": "你的 %(brand)s 配置有错误", "Use Single Sign On to continue": "使用单点登录继续", - "Confirm adding this email address by using Single Sign On to prove your identity.": "使用 SSO 单点登录来验证身份,以确认添加此邮箱地址。", + "Confirm adding this email address by using Single Sign On to prove your identity.": "使用单一登入证明你的身份,以确认添加此电子邮件地址。", "Single Sign On": "单点登录", "Confirm adding email": "确认添加邮箱", "Click the button below to confirm adding this email address.": "点击下面的按钮,以确认添加此邮箱地址。", @@ -907,7 +905,7 @@ "Ask this user to verify their session, or manually verify it below.": "要求此用户验证其会话,或在下面手动进行验证。", "Not Trusted": "不可信任", "Done": "完成", - "Cannot reach homeserver": "无法连接到主服务器", + "Cannot reach homeserver": "无法连接到家服务器", "Ensure you have a stable internet connection, or get in touch with the server admin": "确保你的网络连接稳定,或与服务器管理员联系", "Ask your %(brand)s admin to check your config for incorrect or duplicate entries.": "跟你的%(brand)s管理员确认你的配置不正确或重复的条目。", "Cannot reach identity server": "无法连接到身份服务器", @@ -919,8 +917,8 @@ "You can register, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "你可以注册,但部分功能在身份服务器重新上线之前不可用。如果持续看到此警告,请检查配置或联系服务器管理员。", "You can reset your password, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "你可以重置密码,但部分功能在身份服务器重新上线之前不可用。如果持续看到此警告,请检查配置或联系服务器管理员。", "You can log in, but some features will be unavailable until the identity server is back online. If you keep seeing this warning, check your configuration or contact a server admin.": "你可以登录,但部分功能在身份服务器重新上线之前不可用。如果持续看到此警告,请检查配置或联系服务器管理员。", - "No homeserver URL provided": "未输入主服务器链接", - "Unexpected error resolving homeserver configuration": "解析主服务器配置时发生未知错误", + "No homeserver URL provided": "未输入家服务器链接", + "Unexpected error resolving homeserver configuration": "解析家服务器配置时发生未知错误", "Unexpected error resolving identity server configuration": "解析身份服务器配置时发生未知错误", "a few seconds ago": "数秒前", "about a minute ago": "约一分钟前", @@ -938,11 +936,11 @@ "%(num)s days from now": "从现在开始%(num)s天", "%(name)s (%(userId)s)": "%(name)s%(userId)s", "Your browser does not support the required cryptography extensions": "你的浏览器不支持所需的密码学扩展", - "The user's homeserver does not support the version of the room.": "用户的主服务器不支持此房间版本。", + "The user's homeserver does not support the version of the room.": "用户的家服务器不支持此房间版本。", "Review": "开始验证", "Later": "稍后再说", - "Your homeserver has exceeded its user limit.": "你的主服务器已超过用户限制。", - "Your homeserver has exceeded one of its resource limits.": "你的主服务器已超过某项资源限制。", + "Your homeserver has exceeded its user limit.": "你的家服务器已超过用户限制。", + "Your homeserver has exceeded one of its resource limits.": "你的家服务器已超过某项资源限制。", "Contact your server admin.": "请联系你的服务器管理员。", "Ok": "确定", "Upgrade": "升级加密", @@ -983,7 +981,7 @@ "Upload": "上传", "Show less": "显示更少", "Show more": "显示更多", - "Your homeserver does not support cross-signing.": "你的主服务器不支持交叉签名。", + "Your homeserver does not support cross-signing.": "你的家服务器不支持交叉签名。", "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "你的账户在秘密存储中有交叉签名身份,但并没有被此会话信任。", "unexpected type": "未预期的类型", "Cross-signing public keys:": "交叉签名公钥:", @@ -1131,10 +1129,10 @@ "Compare unique emoji": "比较唯一表情符号", "Compare a unique set of emoji if you don't have a camera on either device": "若你在两个设备上都没有相机,比较唯一一组表情符号", "This bridge is managed by .": "此桥接由 管理。", - "Homeserver feature support:": "主服务器功能支持:", + "Homeserver feature support:": "家服务器功能支持:", "Securely cache encrypted messages locally for them to appear in search results.": "在本地安全地缓存加密消息以使其出现在搜索结果中。", "Cannot connect to integration manager": "不能连接到集成管理器", - "The integration manager is offline or it cannot reach your homeserver.": "此集成管理器为离线状态或者其不能访问你的主服务器。", + "The integration manager is offline or it cannot reach your homeserver.": "此集成管理器为离线状态或者其不能访问你的家服务器。", "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "检查你的浏览器是否安装有可能屏蔽身份服务器的插件(例如 Privacy Badger)", "Manage integrations": "管理集成", "Use between %(min)s pt and %(max)s pt": "请使用介于 %(min)s pt 和 %(max)s pt 之间的大小", @@ -1229,7 +1227,7 @@ "No other published addresses yet, add one below": "还没有其他公布的地址,在下方添加一个", "New published address (e.g. #alias:server)": "新的公布的地址(例如 #alias:server)", "Local Addresses": "本地地址", - "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "为此房间设置地址以便用户通过你的主服务器(%(localDomain)s)找到此房间", + "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "为此房间设置地址以便用户通过你的家服务器(%(localDomain)s)找到此房间", "Waiting for %(displayName)s to accept…": "正在等待%(displayName)s接受……", "Accepting…": "正在接受……", "Start Verification": "开始验证", @@ -1241,7 +1239,7 @@ "For extra security, verify this user by checking a one-time code on both of your devices.": "为了更加安全,在你两个设备上检查一次性代码来验证此用户。", "Your messages are not secure": "你的消息不安全", "One of the following may be compromised:": "以下之一可能被损害:", - "Your homeserver": "你的主服务器", + "Your homeserver": "你的家服务器", "Trusted": "受信任的", "Not trusted": "不受信任的", "%(count)s verified sessions|other": "%(count)s 个已验证的会话", @@ -1414,11 +1412,11 @@ "Session key": "会话密钥", "If they don't match, the security of your communication may be compromised.": "如果它们不匹配,你通讯的安全性可能已受损。", "Verify session": "验证会话", - "Your homeserver doesn't seem to support this feature.": "你的主服务器似乎不支持此功能。", + "Your homeserver doesn't seem to support this feature.": "你的家服务器似乎不支持此功能。", "Message edits": "消息编辑历史", "Please fill why you're reporting.": "请填写你为何做此报告。", - "Report Content to Your Homeserver Administrator": "向你的主服务器管理员举报内容", - "Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.": "举报此消息会将其唯一的“事件ID”发送给你的主服务器的管理员。如果此房间中的消息是加密的,则你的主服务器管理员将无法阅读消息文本,也无法查看任何文件或图片。", + "Report Content to Your Homeserver Administrator": "向你的家服务器管理员举报内容", + "Reporting this message will send its unique 'event ID' to the administrator of your homeserver. If messages in this room are encrypted, your homeserver administrator will not be able to read the message text or view any files or images.": "举报此消息会将其唯一的“事件ID”发送给你的家服务器的管理员。如果此房间中的消息是加密的,则你的家服务器管理员将无法阅读消息文本,也无法查看任何文件或图片。", "Send report": "发送报告", "Upgrading this room requires closing down the current instance of the room and creating a new room in its place. To give room members the best possible experience, we will:": "升级此房间需要关闭此房间的当前实例并创建一个新的房间代替它。为了给房间成员最好的体验,我们会:", "Upgrade private room": "更新私人房间", @@ -1475,16 +1473,16 @@ "Report Content": "举报内容", "Remove for everyone": "为所有人删除", "Confirm your identity by entering your account password below.": "在下方输入账户密码以确认你的身份。", - "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "在主服务器配置中缺少验证码公钥。请将此报告给你的主服务器管理员。", + "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "在家服务器配置中缺少验证码公钥。请将此报告给你的家服务器管理员。", "Enter password": "输入密码", "Nice, strong password!": "不错,是个强密码!", "Password is allowed, but unsafe": "密码允许但不安全", "Use an email address to recover your account": "使用邮件地址恢复你的账户", - "Enter email address (required on this homeserver)": "输入邮件地址(此主服务器上必须)", + "Enter email address (required on this homeserver)": "输入邮件地址(此家服务器上必须)", "Doesn't look like a valid email address": "看起来不像有效的邮件地址", "Passwords don't match": "密码不匹配", "Other users can invite you to rooms using your contact details": "别的用户可以使用你的联系人详情邀请你加入房间", - "Enter phone number (required on this homeserver)": "输入电话号码(此主服务器上必须)", + "Enter phone number (required on this homeserver)": "输入电话号码(此家服务器上必须)", "Use lowercase letters, numbers, dashes and underscores only": "仅使用小写字母,数字,横杠和下划线", "Enter username": "输入用户名", "Sign in with SSO": "使用单点登录", @@ -1504,7 +1502,7 @@ "User menu": "用户菜单", "Failed to get autodiscovery configuration from server": "从服务器获取自动发现配置时失败", "Invalid base_url for m.homeserver": "m.homeserver 的 base_url 无效", - "Homeserver URL does not appear to be a valid Matrix homeserver": "主服务器链接不像是有效的 Matrix 主服务器", + "Homeserver URL does not appear to be a valid Matrix homeserver": "家服务器链接不像是有效的 Matrix 家服务器", "Invalid base_url for m.identity_server": "m.identity_server 的 base_url 无效", "Identity server URL does not appear to be a valid identity server": "身份服务器链接不像是有效的身份服务器", "This account has been deactivated.": "此账户已被停用。", @@ -1513,12 +1511,12 @@ "Continue with previous account": "用之前的账户继续", "Log in to your new account.": "登录到你的新账户。", "Registration Successful": "注册成功", - "Failed to re-authenticate due to a homeserver problem": "由于主服务器的问题,重新认证失败", + "Failed to re-authenticate due to a homeserver problem": "由于家服务器的问题,重新认证失败", "Failed to re-authenticate": "重新认证失败", "Enter your password to sign in and regain access to your account.": "输入你的密码以登录并重新获取访问你账户的权限。", "Forgotten your password?": "忘记你的密码了吗?", "Sign in and regain access to your account.": "请登录以重新获取访问你账户的权限。", - "You cannot sign in to your account. Please contact your homeserver admin for more information.": "你不能登录到你的账户。请联系你的主服务器管理员以获取更多信息。", + "You cannot sign in to your account. Please contact your homeserver admin for more information.": "你不能登录到你的账户。请联系你的家服务器管理员以获取更多信息。", "You're signed out": "你已登出", "Clear personal data": "清除个人数据", "Command Autocomplete": "命令自动补全", @@ -1710,7 +1708,7 @@ "United States": "美国", "United Kingdom": "英国", "Try again": "重试", - "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.": "我们已要求浏览器记住你使用的主服务器,但不幸的是你的浏览器已忘记。请前往登录页面重试。", + "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.": "我们已要求浏览器记住你使用的家服务器,但不幸的是你的浏览器已忘记。请前往登录页面重试。", "We couldn't log you in": "我们无法使你登入", "You've reached the maximum number of simultaneous calls.": "你已达到同时通话的最大数量。", "Too Many Calls": "太多通话", @@ -1718,7 +1716,7 @@ "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "呼叫失败,因为无法使用任何麦克风。 检查是否已插入并正确设置麦克风。", "Answered Elsewhere": "已在别处接听", "Room settings": "房间设置", - "About homeservers": "关于主服务器", + "About homeservers": "关于家服务器", "About": "关于", "Share invite link": "分享邀请链接", "Click to copy": "点击复制", @@ -1787,8 +1785,8 @@ "Save Changes": "保存修改", "Leave Space": "离开空间", "Learn more": "了解更多", - "Other homeserver": "其他主服务器", - "Specify a homeserver": "指定主服务器", + "Other homeserver": "其他家服务器", + "Specify a homeserver": "指定家服务器", "Transfer": "传输", "Unnamed Space": "未命名空间", "Send feedback": "发送反馈", @@ -1803,7 +1801,7 @@ "Create a new room": "创建新房间", "Spaces": "空间", "Continue with %(provider)s": "使用 %(provider)s 继续", - "Homeserver": "主服务器", + "Homeserver": "家服务器", "Server Options": "服务器选项", "Information": "信息", "Not encrypted": "未加密", @@ -1940,8 +1938,8 @@ "This widget would like to:": "此挂件想要:", "Approve widget permissions": "批准挂件权限", "Failed to save space settings.": "空间设置保存失败。", - "Sign into your homeserver": "登录你的主服务器", - "Unable to validate homeserver": "无法验证主服务器", + "Sign into your homeserver": "登录你的家服务器", + "Unable to validate homeserver": "无法验证家服务器", "Invalid URL": "URL 无效", "Modal Widget": "模态框挂件(Modal Widget)", "Widget added by": "挂件添加者", @@ -2087,7 +2085,7 @@ "Secure your backup with a Security Phrase": "使用安全短语保护你的备份", "Confirm your Security Phrase": "确认你的安全短语", "Continue with %(ssoButtons)s": "使用 %(ssoButtons)s 继续", - "There was a problem communicating with the homeserver, please try again later.": "与主服务器通讯时出现问题,请稍后再试。", + "There was a problem communicating with the homeserver, please try again later.": "与家服务器通讯时出现问题,请稍后再试。", "Decrypted event source": "解密的事件源码", "Original event source": "原始事件源码", "Invite by username": "按照用户名邀请", @@ -2132,7 +2130,7 @@ "Guinea-Bissau": "几内亚比绍", "Guinea": "几内亚", "Guernsey": "根西岛", - "You might enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later.": "你可以启用此选项如果此房间将仅用于你的主服务器上的内部团队协作。此选项之后无法更改。", + "You might enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later.": "你可以启用此选项如果此房间将仅用于你的家服务器上的内部团队协作。此选项之后无法更改。", "Unable to access secret storage. Please verify that you entered the correct Security Phrase.": "无法访问秘密存储。请确认你输入了正确的安全短语。", "Backup could not be decrypted with this Security Key: please verify that you entered the correct Security Key.": "无法使用此安全密钥解密备份:请检查你输入的安全密钥是否正确。", "sends space invaders": "发送空间入侵者", @@ -2157,7 +2155,6 @@ "You can add more later too, including already existing ones.": "稍后你可以添加更多房间,包括现有的。", "Let's create a room for each of them.": "让我们为每个主题都创建一个房间吧。", "What are some things you want to discuss in %(spaceName)s?": "你想在 %(spaceName)s 中讨论什么?", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "这是实验性功能。当前收到邀请的新用户必须在上开启邀请才能真正加入。", "Make sure the right people have access. You can invite more later.": "确保对的人可以访问。稍后你可以邀请更多人。", "Invite your teammates": "邀请你的伙伴", "Failed to invite the following users to your space: %(csvUsers)s": "邀请以下用户加入你的空间失败:%(csvUsers)s", @@ -2193,7 +2190,7 @@ "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": "如果这样做,请注意你的消息并不会被删除,但在重新建立索引时,搜索体验可能会降低片刻", "You most likely do not want to reset your event index store": "你大概率不想重置你的活动缩影存储", "Reset event store?": "重置活动存储?", - "Use your preferred Matrix homeserver if you have one, or host your own.": "使用你偏好的Matrix主服务器,如果你有的话,或自己架设一个。", + "Use your preferred Matrix homeserver if you have one, or host your own.": "使用你偏好的Matrix家服务器,如果你有的话,或自己架设一个。", "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.": "这通常仅影响服务器如何处理房间。如果你的 %(brand)s 遇到问题,请回报错误。", "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "请注意,如果你不添加电子邮箱并且忘记密码,你将永远失去对你账户的访问权。", "Continuing without email": "不使用电子邮箱并继续", @@ -2209,7 +2206,7 @@ "A call can only be transferred to a single user.": "通话只能转移到单个用户。", "We couldn't create your DM.": "我们无法创建你的私聊。", "Block anyone not part of %(serverName)s from ever joining this room.": "阻住任何不属于 %(serverName)s 的人加入此房间。", - "You might disable this if the room will be used for collaborating with external teams who have their own homeserver. This cannot be changed later.": "如果房间用于与自己的主服务器外的团队进行协助的话,可以停用此功能。这将无法在稍后进行更改。", + "You might disable this if the room will be used for collaborating with external teams who have their own homeserver. This cannot be changed later.": "如果房间用于与自己的家服务器外的团队进行协助的话,可以停用此功能。这将无法在稍后进行更改。", "What do you want to organise?": "你想要组织什么?", "Skip for now": "暂时跳过", "Failed to create initial space rooms": "创建初始空间房间失败", @@ -2373,7 +2370,7 @@ "%(severalUsers)schanged the server ACLs %(count)s times|one": "%(severalUsers)s 已更改服务器访问控制列表", "%(severalUsers)schanged the server ACLs %(count)s times|other": "%(severalUsers)s 已更改服务器的访问控制列表 %(count)s 此", "Message search initialisation failed, check your settings for more information": "消息搜索初始化失败,请检查你的设置以获取更多信息", - "Set addresses for this space so users can find this space through your homeserver (%(localDomain)s)": "设置此空间的地址,这样用户就能通过你的主服务器找到此空间(%(localDomain)s)", + "Set addresses for this space so users can find this space through your homeserver (%(localDomain)s)": "设置此空间的地址,这样用户就能通过你的家服务器找到此空间(%(localDomain)s)", "To publish an address, it needs to be set as a local address first.": "要公布地址,首先需要将其设为本地地址。", "Published addresses can be used by anyone on any server to join your room.": "任何服务器上的人均可通过公布的地址加入你的房间。", "Published addresses can be used by anyone on any server to join your space.": "任何服务器上的人均可通过公布的地址加入你的空间。", @@ -2669,16 +2666,7 @@ "Light high contrast": "浅色高对比", "Joining": "加入中", "Automatically send debug logs on any error": "遇到任何错误自动发送调试日志", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "在下方管理你已登录的设备。与你交流的人可以看到设备的名称。", "Rename": "重命名", - "Sign Out": "登出", - "This device": "此设备", - "You aren't signed into any other devices.": "您没有登录任何其他设备。", - "Sign out %(count)s selected devices|one": "登出%(count)s台选定的设备", - "Sign out %(count)s selected devices|other": "登出%(count)s台选定的设备", - "Devices without encryption support": "不支持加密的设备", - "Unverified devices": "未验证的设备", - "Verified devices": "已验证的设备", "Select all": "全选", "Deselect all": "取消全选", "Sign out devices|one": "注销设备", @@ -2687,24 +2675,21 @@ "Click the button below to confirm signing out these devices.|other": "单击下面的按钮以确认登出这些设备。", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "确认注销此设备需要使用单点登录来证明您的身份。", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "确认注销这些设备需要使用单点登录来证明你的身份。", - "Unable to load device list": "无法加载设备列表", - "Your homeserver does not support device management.": "你的主服务器不支持设备管理。", "Store your Security Key somewhere safe, like a password manager or a safe, as it's used to safeguard your encrypted data.": "将您的安全密钥存放在安全的地方,例如密码管理器或保险箱,因为它用于保护您的加密数据。", "We'll generate a Security Key for you to store somewhere safe, like a password manager or a safe.": "我们将为您生成一个安全密钥,将其存储在安全的地方,例如密码管理器或保险箱。", "Regain access to your account and recover encryption keys stored in this session. Without them, you won't be able to read all of your secure messages in any session.": "重新获取账户访问权限并恢复存储在此会话中的加密密钥。 没有它们,您将无法在任何会话中阅读所有安全消息。", "Without verifying, you won't have access to all your messages and may appear as untrusted to others.": "如果不进行验证,您将无法访问您的所有消息,并且在其他人看来可能不受信任。", "Shows all threads you've participated in": "显示您参与的所有消息列", "You're all caught up": "一切完毕", - "We call the places where you can host your account 'homeservers'.": "我们将您可以托管账户的地方称为“主服务器”。", - "Matrix.org is the biggest public homeserver in the world, so it's a good place for many.": "Matrix.org 是世界上最大的公共主服务器,因此对许多人来说是一个好地方。", + "We call the places where you can host your account 'homeservers'.": "我们将您可以托管账户的地方称为“家服务器”。", + "Matrix.org is the biggest public homeserver in the world, so it's a good place for many.": "Matrix.org 是世界上最大的公共家服务器,因此对许多人来说是一个好地方。", "If you can't see who you're looking for, send them your invite link below.": "如果您看不到您要找的人,请将您的邀请链接发送给他们。", "You can't disable this later. Bridges & most bots won't work yet.": "之后你无法停用。桥接和大多数机器人也不能工作。", "In encrypted rooms, verify all users to ensure it's secure.": "在加密房间中,验证所有用户以确保其安全。", "Yours, or the other users' session": "你或其他用户的会话", "Yours, or the other users' internet connection": "你或其他用户的互联网连接", - "The homeserver the user you're verifying is connected to": "你正在验证的用户所连接的主服务器", + "The homeserver the user you're verifying is connected to": "你正在验证的用户所连接的家服务器", "This room isn't bridging messages to any platforms. Learn more.": "这个房间不会将消息桥接到任何平台。了解更多", - "Where you're signed in": "登录地点", "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.": "这个房间位于你不是管理员的某些空间中。 在这些空间中,旧房间仍将显示,但系统会提示人们加入新房间。", "Use a more compact 'Modern' layout": "使用更紧凑的“现代”布局", "Add option": "添加选项", @@ -2787,7 +2772,6 @@ "We don't record or profile any account data": "我们不会记录或配置任何账户数据", "You can read all our terms here": "你可以在此处阅读我们所有的条款", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "共享匿名数据以帮助我们发现问题。 与个人无关。 没有第三方。", - "Okay": "好", "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "共享匿名数据帮助我们发现问题。无个人数据。 没有第三方。了解更多", "You previously consented to share anonymous usage data with us. We're updating how that works.": "你之前同意与我们分享匿名使用数据。我们正在更新其工作方式。", "Help improve %(analyticsOwner)s": "帮助改进 %(analyticsOwner)s", @@ -2844,9 +2828,9 @@ "You were disconnected from the call. (Error: %(message)s)": "你已断开通话。(错误:%(message)s)", "Connection lost": "连接丢失", "Failed to join": "加入失败", - "The person who invited you has already left, or their server is offline.": "邀请你的人已经离开了,亦或是他们的主服务器离线了。", + "The person who invited you has already left, or their server is offline.": "邀请你的人已经离开了,亦或是他们的家服务器离线了。", "The person who invited you has already left.": "邀请你的人已经离开了。", - "Sorry, your homeserver is too old to participate here.": "抱歉,你的主服务器过旧,故无法参与其中。", + "Sorry, your homeserver is too old to participate here.": "抱歉,你的家服务器过旧,故无法参与其中。", "There was an error joining.": "加入时发生错误。", "%(brand)s is experimental on a mobile web browser. For a better experience and the latest features, use our free native app.": "在移动网页浏览器中 %(brand)s 是实验性功能。为了获取更好的体验和最新功能,请使用我们的免费原生应用。", "Reset bearing to north": "重置为向北方位", @@ -2857,9 +2841,9 @@ "Enter fullscreen": "进入全屏", "Map feedback": "地图反馈", "Toggle attribution": "切换属性", - "This homeserver is not configured correctly to display maps, or the configured map server may be unreachable.": "此主服务器未正确配置,故无法显示地图,亦或所配置的地图服务器无法使用。", - "This homeserver is not configured to display maps.": "此主服务器未配置显示地图。", - "The user's homeserver does not support the version of the space.": "用户的主服务器版本不支持空间。", + "This homeserver is not configured correctly to display maps, or the configured map server may be unreachable.": "此家服务器未正确配置,故无法显示地图,亦或所配置的地图服务器无法使用。", + "This homeserver is not configured to display maps.": "此家服务器未配置显示地图。", + "The user's homeserver does not support the version of the space.": "用户的家服务器版本不支持空间。", "User may or may not exist": "用户可能存在页可能不存在", "User does not exist": "用户不存在", "User is already in the room": "用户已在房间中", @@ -2978,9 +2962,9 @@ "IRC (Experimental)": "IRC(实验性)", "Confirm signing out these devices|one": "确认登出此设备", "Confirm signing out these devices|other": "确认登出这些设备", - "You can also ask your homeserver admin to upgrade the server to change this behaviour.": "你也可以要求主服务器的管理员升级服务器来更改这个行为。", + "You can also ask your homeserver admin to upgrade the server to change this behaviour.": "你也可以要求家服务器的管理员升级服务器来更改这个行为。", "If you want to retain access to your chat history in encrypted rooms you should first export your room keys and re-import them afterwards.": "若你想保留对加密房间的聊天历史的访问权,你应该首先导出房间的密钥,之后再重新导入。", - "Changing your password on this homeserver will cause all of your other devices to be signed out. This will delete the message encryption keys stored on them, and may make encrypted chat history unreadable.": "更改此主服务器上的密码会导致你其它所有设备登出。这会删除存储在它们上面的消息加密密钥,且使加密的聊天历史不可读。", + "Changing your password on this homeserver will cause all of your other devices to be signed out. This will delete the message encryption keys stored on them, and may make encrypted chat history unreadable.": "更改此家服务器上的密码会导致你其它所有设备登出。这会删除存储在它们上面的消息加密密钥,且使加密的聊天历史不可读。", "Spaces are a new way to group rooms and people. What kind of Space do you want to create? You can change this later.": "空间是将房间和人分组的一种新方式。你想创建什么类型的空间?你可以在以后更改。", "Match system": "匹配系统", "Developer tools": "开发者工具", @@ -3157,7 +3141,7 @@ "Failed to send event!": "发送事件失败!", "Doesn't look like valid JSON.": "看起来不像有效的JSON。", "Send custom room account data event": "发送自定义房间账户资料事件", - "Your message wasn't sent because this homeserver has been blocked by its administrator. Please contact your service administrator to continue using the service.": "你的消息未被发送,因为此主服务器已被其管理员屏蔽。请联系你的服务管理员以继续使用服务。", + "Your message wasn't sent because this homeserver has been blocked by its administrator. Please contact your service administrator to continue using the service.": "你的消息未被发送,因为此家服务器已被其管理员屏蔽。请联系你的服务管理员以继续使用服务。", "Spell check": "拼写检查", "Find your co-workers": "找到你的同事", "Start your first chat": "开始你的第一个聊天", @@ -3225,7 +3209,7 @@ "%(oneUser)ssent %(count)s hidden messages|other": "%(oneUser)s发送了%(count)s条隐藏消息", "%(oneUser)ssent %(count)s hidden messages|one": "%(oneUser)s发送了一条隐藏消息", "Remove server “%(roomServer)s”": "移除服务器“%(roomServer)s”", - "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use %(brand)s with an existing Matrix account on a different homeserver.": "你可以使用自定义服务器选项来指定不同的主服务器URL以登录其他Matrix服务器。这让你能把%(brand)s和不同主服务器上的已有Matrix账户搭配使用。", + "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use %(brand)s with an existing Matrix account on a different homeserver.": "你可以使用自定义服务器选项来指定不同的家服务器URL以登录其他Matrix服务器。这让你能把%(brand)s和不同家服务器上的已有Matrix账户搭配使用。", "Started": "已开始", "Requested": "已请求", "Unsent": "未发送", @@ -3278,7 +3262,7 @@ "You have been logged out of all devices and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "你已登出全部设备,并将不再收到推送通知。要重新启用通知,请在每台设备上再次登入。", "If you want to retain access to your chat history in encrypted rooms, set up Key Backup or export your message keys from one of your other devices before proceeding.": "若想保留对加密房间的聊天历史的访问权,请设置密钥备份或从其他设备导出消息密钥,然后再继续。", "Signing out your devices will delete the message encryption keys stored on them, making encrypted chat history unreadable.": "登出你的设备会删除存储在其上的消息加密密钥,使加密的聊天历史不可读。", - "Resetting your password on this homeserver will cause all of your devices to be signed out. This will delete the message encryption keys stored on them, making encrypted chat history unreadable.": "重置你在这个主服务器上的密码将导致你全部设备登出。这会删除存储在其上的消息加密密钥,使加密的聊天历史不可读。", + "Resetting your password on this homeserver will cause all of your devices to be signed out. This will delete the message encryption keys stored on them, making encrypted chat history unreadable.": "重置你在这个家服务器上的密码将导致你全部设备登出。这会删除存储在其上的消息加密密钥,使加密的聊天历史不可读。", "Event ID: %(eventId)s": "事件ID:%(eventId)s", "Resent!": "已重新发送!", "Did not receive it? Resend it": "没收到吗?重新发送", @@ -3374,8 +3358,7 @@ "WARNING: ": "警告:", "You have unverified sessions": "你有未验证的会话", "Change layout": "更改布局", - "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "仅当你的主服务器不提供时才适用。你的IP地址在通话期间会被分享。", - "Allow fallback call assist server (turn.matrix.org)": "允许回退到通话辅助服务器(turn.matrix.org)", + "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "仅当你的家服务器不提供时才适用。你的IP地址在通话期间会被分享。", "When enabled, the other party might be able to see your IP address": "启用后,对方可能能看到你的IP地址", "Allow Peer-to-Peer for 1:1 calls": "允许1:1通话的点对点", "Connection": "连接", @@ -3384,9 +3367,6 @@ "Voice processing": "语音处理", "Video settings": "视频设置", "Voice settings": "语音设置", - "Have greater visibility and control over all your sessions.": "对你的全部会话有更大的可见性和控制。", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "我们的新会话管理器提供更好的对你的全部会话的可见性,和更多对它们的控制,包括远程开关推送通知的能力。", - "New session manager": "新会话管理器", "Rich text editor": "富文本编辑器", "Report to moderators": "报告给协管员", "Video call started": "视频通话已开始", @@ -3428,16 +3408,36 @@ "Fill screen": "填满屏幕", "Get stuff done by finding your teammates": "找到队友,完成任务", "Sorry — this call is currently full": "抱歉——目前线路拥挤", - "Requires compatible homeserver.": "需要兼容的主服务器。", + "Requires compatible homeserver.": "需要兼容的家服务器。", "Low bandwidth mode": "低带宽模式", "Automatic gain control": "自动获得控制权", "Hide notification dot (only display counters badges)": "隐藏通知的点标记(仅显示计数标记)", - "Use new session manager": "使用新的会话管理器", "Under active development.": "积极开发中。", "Rename session": "重命名会话", "Call type": "通话类型", "You do not have sufficient permissions to change this.": "你没有足够的权限更改这个。", "%(brand)s is end-to-end encrypted, but is currently limited to smaller numbers of users.": "%(brand)s是端到端加密的,但是目前仅限于少数用户。", "Enable %(brand)s as an additional calling option in this room": "启用%(brand)s作为此房间的额外通话选项", - "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.": "不建议为公共房间添加加密。任何人都能找到并加入公共房间,所以任何人都能阅读其中的消息。你不会获得加密的任何好处,并且之后你无法将其关闭。在公共房间中加密消息会使接收和发送消息变慢。" + "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.": "不建议为公共房间添加加密。任何人都能找到并加入公共房间,所以任何人都能阅读其中的消息。你不会获得加密的任何好处,并且之后你无法将其关闭。在公共房间中加密消息会使接收和发送消息变慢。", + "Can’t start a call": "无法开始通话", + "Unfortunately we're unable to start a recording right now. Please try again later.": "很遗憾,我们现在无法开始录音。请稍后再试。", + "Connection error": "连接错误", + "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s更改了其显示名称和用户资料图片", + "Could not find room": "无法找到房间", + "WARNING: session already verified, but keys do NOT MATCH!": "警告:会话已验证,然而密钥不匹配!", + "iframe has no src attribute": "iframe无src属性", + "User (%(user)s) did not end up as invited to %(roomId)s but no error was given from the inviter utility": "用户(%(user)s)最终未被邀请到%(roomId)s,但邀请工具没给出错误", + "Failed to read events": "读取时间失败", + "Failed to send event": "发送事件失败", + "Use your account to continue.": "使用你的账户继续。", + "Your email address does not appear to be associated with a Matrix ID on this homeserver.": "你的电子邮件地址似乎未与此家服务器上的Matrix ID关联。", + "%(senderName)s started a voice broadcast": "%(senderName)s开始了语音广播", + "Reload": "重加载", + "This may be caused by having the app open in multiple tabs or due to clearing browser data.": "这可能是由于在多个标签页中打开此应用,或由于清除浏览器数据。", + "Database unexpectedly closed": "数据库意外关闭", + "Cannot invite user by email without an identity server. You can connect to one under \"Settings\".": "无法在未设置身份服务器时邀请用户,你可以在“设置”里连接一个。", + "No identity access token found": "找不到身份访问令牌", + "This session is backing up your keys.": "此会话正在备份你的密钥。", + "Identity server not set": "身份服务器未设置", + "The add / bind with MSISDN flow is misconfigured": "MSISDN的新增/绑定流程配置错误" } diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 3dc9704bad4..3e1c622dc62 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -957,8 +957,6 @@ "Disconnecting from your identity server will mean you won't be discoverable by other users and you won't be able to invite others by email or phone.": "與您的身分伺服器中斷連線後,其他使用者就無法再探索到您,您也不能透過電子郵件地址或電話號碼邀請其他人。", "Call failed due to misconfigured server": "由於伺服器設定錯誤,無法通話", "Please ask the administrator of your homeserver (%(homeserverDomain)s) to configure a TURN server in order for calls to work reliably.": "請聯繫您家伺服器(%(homeserverDomain)s)的管理員建立一套 TURN 伺服器,使通話能更穩定運作。", - "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", "Only continue if you trust the owner of the server.": "僅在您信任伺服器擁有者時才繼續。", "Identity server has no terms of service": "身分伺服器無使用條款", "The identity server you have chosen does not have any terms of service.": "您所選擇的身分伺服器沒有任何服務條款。", @@ -2303,7 +2301,6 @@ "You have no ignored users.": "您沒有忽略的使用者。", "Play": "播放", "Pause": "暫停", - "This is an experimental feature. For now, new users receiving an invite will have to open the invite on to actually join.": "這是實驗性功能。目前,收到邀請的新使用者必須在 上開啟邀請才能真的加入。", "Select a room below first": "首先選取一個聊天室", "Join the beta": "加入 Beta 測試", "Leave the beta": "離開 Beta 測試", @@ -2668,16 +2665,7 @@ "Joining": "正在加入", "Use high contrast": "使用高對比", "Light high contrast": "亮色高對比", - "Manage your signed-in devices below. A device's name is visible to people you communicate with.": "在下方管理您的登入裝置。與您交流的人可以看到裝置的名稱。", "Rename": "重新命名", - "Sign Out": "登出", - "This device": "此裝置", - "You aren't signed into any other devices.": "您未登入其他裝置。", - "Sign out %(count)s selected devices|one": "登出 %(count)s 台選取的裝置", - "Sign out %(count)s selected devices|other": "登出 %(count)s 台選取的裝置", - "Devices without encryption support": "不支援加密的裝置", - "Unverified devices": "未驗證裝置", - "Verified devices": "已驗證裝置", "Select all": "全部選取", "Deselect all": "取消選取", "Sign out devices|one": "登出裝置", @@ -2686,8 +2674,6 @@ "Click the button below to confirm signing out these devices.|other": "點下方按鈕,確認登出這些裝置。", "Confirm logging out these devices by using Single Sign On to prove your identity.|one": "請使用「單一登入」功能證明身分,確認登出這台裝置。", "Confirm logging out these devices by using Single Sign On to prove your identity.|other": "請使用「單一登入」功能證明身分,確認登出這些裝置。", - "Unable to load device list": "無法載入裝置清單", - "Your homeserver does not support device management.": "您的家伺服器不支援裝置管理功能。", "Automatically send debug logs on any error": "自動在發生錯誤時傳送除錯日誌", "Store your Security Key somewhere safe, like a password manager or a safe, as it's used to safeguard your encrypted data.": "由於安全金鑰是用來保護您的加密資料,請將其儲存在安全的地方,例如密碼管理員或保險箱等。", "We'll generate a Security Key for you to store somewhere safe, like a password manager or a safe.": "我們將為您產生一把安全金鑰。請將其儲存在安全的地方,例如密碼管理員或保險箱。", @@ -2704,7 +2690,6 @@ "Yours, or the other users' internet connection": "您或其他使用者的網際網路連線", "The homeserver the user you're verifying is connected to": "您正在驗證的使用者所連線的家伺服器", "This room isn't bridging messages to any platforms. Learn more.": "此聊天室不會將訊息橋接至任何平台。取得更多資訊。", - "Where you're signed in": "您的登入地點", "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.": "這個聊天室位於您不是管理員的某些聊天空間中。在那些聊天空間中,舊的聊天室仍將會顯示,但系統會提示使用者加入新的聊天室。", "Use a more compact 'Modern' layout": "使用更簡潔的「現代」佈局", "Copy link to thread": "複製討論串連結", @@ -2787,7 +2772,6 @@ "%(count)s votes cast. Vote to see the results|other": "已投 %(count)s 票。投票後即可檢視結果", "No votes cast": "尚無投票", "Share anonymous data to help us identify issues. Nothing personal. No third parties.": "分享匿名資料以協助我們識別問題。無個人資料。無第三方。", - "Okay": "是", "Share anonymous data to help us identify issues. Nothing personal. No third parties. Learn More": "分享匿名資料以協助我們識別問題。無個人資料。無第三方。取得更多資訊", "You previously consented to share anonymous usage data with us. We're updating how that works.": "您先前曾同意與我們分享匿名使用資料。我們正在更新其運作方式。", "Help improve %(analyticsOwner)s": "協助改善 %(analyticsOwner)s", @@ -3422,10 +3406,6 @@ "Start %(brand)s calls": "開始 %(brand)s 通話", "Fill screen": "填滿螢幕", "Sorry — this call is currently full": "抱歉 — 此通話目前已滿", - "Our new sessions manager provides better visibility of all your sessions, and greater control over them including the ability to remotely toggle push notifications.": "新版的工作階段管理員,可讓您更容易了解所有工作階段、更容易管理,還包含能夠遠端切換是否推送通知的功能。", - "Have greater visibility and control over all your sessions.": "讓您對所有工作階段有更大的能見度與控制。", - "New session manager": "新版工作階段管理員", - "Use new session manager": "使用新版工作階段管理員", "Underline": "底線", "Italic": "義式斜體", "resume voice broadcast": "恢復語音廣播", @@ -3479,7 +3459,6 @@ "Automatically adjust the microphone volume": "自動調整麥克風音量", "Voice settings": "語音設定", "Only applies if your homeserver does not offer one. Your IP address would be shared during a call.": "僅當您的家伺服器不提供時才適用。在通話期間,將會把您的 IP 位址分享給此伺服器。", - "Allow fallback call assist server (turn.matrix.org)": "允許退回使用通話輔助伺服器(turn.matrix.org)", "Noise suppression": "噪音抑制", "Echo cancellation": "迴聲消除", "Automatic gain control": "自動增益控制", @@ -3555,17 +3534,6 @@ "You ended a voice broadcast": "您結束了語音廣播", "Unable to decrypt message": "無法解密訊息", "This message could not be decrypted": "此訊息無法解密", - "Resend key requests": "重新傳送金鑰請求", - "Unfortunately, there are no other verified devices to request decryption keys from. Signing in and verifying other devices may help avoid this situation in the future.": "不幸的是,沒有其他已驗證的裝置可以從中請求解密金鑰。登入並驗證其他裝置可能可以在未來協助避免此狀況。", - "Some messages could not be decrypted": "部份訊息無法解密", - "View your device list": "檢視您的裝置清單", - "This device is requesting decryption keys from your other devices. Opening one of your other devices may speed this up.": "此裝置正在從您其他的裝置請求解密金鑰。開啟您其他裝置的其中一個可能會加快速度。", - "Open another device to load encrypted messages": "開啟其他裝置以載入已加密的訊息", - "You will not be able to access old undecryptable messages, but resetting your keys will allow you to receive new messages.": "您將無法存取舊的未解密訊息,但重設您的金鑰將讓您可以接收新的訊息。", - "Reset your keys to prevent future decryption errors": "重設您的金鑰以避免未來的解密錯誤", - "This device was unable to decrypt some messages because it has not been verified yet.": "此裝置無法解密某些訊息,因為其尚未被驗證。", - "Verify this device to access all messages": "驗證此裝置以存取所有訊息", - "Please wait as we try to decrypt your messages. This may take a few moments.": "請在我們嘗試解密您的訊息時稍候。這可能需要一點時間。", "Rust cryptography implementation": "Rust 密碼學實作", "%(senderName)s ended a voice broadcast": "%(senderName)s 已結束語音廣播", "You ended a voice broadcast": "您結束了語音廣播", @@ -3670,7 +3638,6 @@ "Joining space…": "正在加入聊天空間…", "Encrypting your message…": "正在加密您的訊息…", "Sending your message…": "正在傳送您的訊息…", - "Decrypting messages…": "正在解密訊息…", "Set a new account password…": "設定新帳號密碼…", "Downloading update…": "正在下載更新…", "Checking for an update…": "正在檢查更新…", @@ -3744,7 +3711,7 @@ "User (%(user)s) did not end up as invited to %(roomId)s but no error was given from the inviter utility": "使用者(%(user)s)並未受邀加入 %(roomId)s,但邀請工具也未提供錯誤", "Reload": "重新載入", "This may be caused by having the app open in multiple tabs or due to clearing browser data.": "這個問題可能是因為在多個分頁中開啟此應用程式,或是清除瀏覽資料所導致。", - "Database unexpectedly closed": "資料庫未預期關閉連線", + "Database unexpectedly closed": "資料庫意外關閉", "Mute room": "聊天室靜音", "Match default setting": "符合預設設定值", "Start DM anyway": "開始直接訊息", @@ -3777,5 +3744,11 @@ "Once invited users have joined %(brand)s, you will be able to chat and the room will be end-to-end encrypted": "被邀請的使用者加入 %(brand)s 後,您就可以聊天,聊天室將會進行端到端加密", "Waiting for users to join %(brand)s": "等待使用者加入 %(brand)s", "You do not have permission to invite users": "您沒有權限邀請使用者", - "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s 更改了顯示名稱與大頭照" + "%(oldDisplayName)s changed their display name and profile picture": "%(oldDisplayName)s 更改了顯示名稱與大頭照", + "Your language": "您的語言", + "Your device ID": "您的裝置 ID", + "Alternatively, you can try to use the public server at , but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "或是您也可以試著使用公開伺服器 ,但可能不夠可靠,而且會跟該伺服器分享您的 IP 位址。您也可以在設定中管理此設定。", + "Try using %(server)s": "嘗試使用 %(server)s", + "Allow fallback call assist server (%(server)s)": "允許使用備用通話輔助伺服器(%(server)s)", + "User is not logged in": "使用者未登入" } From e30e7229c386f43a691d1400a76f99a97ae45372 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 13 Jun 2023 12:32:59 +0100 Subject: [PATCH 49/54] Upgrade matrix-js-sdk to 26.1.0-rc1 --- package.json | 2 +- yarn.lock | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index ffdc149531d..db34cee751a 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "maplibre-gl": "^2.0.0", "matrix-encrypt-attachment": "^1.0.3", "matrix-events-sdk": "0.0.1", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", + "matrix-js-sdk": "26.1.0-rc1", "matrix-widget-api": "^1.4.0", "memoize-one": "^6.0.0", "minimist": "^1.2.5", diff --git a/yarn.lock b/yarn.lock index f1c7b44dcca..2ce60b41f54 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6464,9 +6464,10 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": - version "26.0.1" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/51218ddc1d9e54e99aee97f31d11c193d727b977" +matrix-js-sdk@26.1.0-rc1: + version "26.1.0-rc1" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-26.1.0-rc1.tgz#d79c0aea1d239ac8a40f7b9f8993027727652a34" + integrity sha512-ULFJWU2dTduDBDwlJq4efdsAcnoaE2L8+JWkWfsPKSOzQE09A93WXjDL/0L3aLCFJu2HWIZU28ea2VgTv6Kxeg== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-js" "^0.1.0-alpha.10" From 6b7a131e9dba6f16bc50b29cca216951db489dbe Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 13 Jun 2023 12:39:45 +0100 Subject: [PATCH 50/54] Prepare changelog for v3.74.0-rc1 --- CHANGELOG.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26fc56b7c03..b10c5ffe53a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,25 @@ +Changes in [3.74.0-rc1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.74.0-rc1) (2023-06-13) +============================================================================================================= + +## ✨ Features + * OIDC: add delegatedauthentication to validated server config ([\#11053](https://github.com/matrix-org/matrix-react-sdk/pull/11053)). Contributed by @kerryarchibald. + * Allow image pasting in plain mode in RTE ([\#11056](https://github.com/matrix-org/matrix-react-sdk/pull/11056)). Contributed by @alunturner. + * Show room options menu if "UIComponent.roomOptionsMenu" is enabled ([\#10365](https://github.com/matrix-org/matrix-react-sdk/pull/10365)). Contributed by @maheichyk. + * Allow image pasting in rich text mode in RTE ([\#11049](https://github.com/matrix-org/matrix-react-sdk/pull/11049)). Contributed by @alunturner. + * Update voice broadcast redaction to use MSC3912 `with_rel_type` instead of `with_relations` ([\#11014](https://github.com/matrix-org/matrix-react-sdk/pull/11014)). Fixes vector-im/element-web#25471. + * Add config to skip widget_build_url for DM rooms ([\#11044](https://github.com/matrix-org/matrix-react-sdk/pull/11044)). Fixes vector-im/customer-retainer#74. + * Inhibit interactions on forward dialog message previews ([\#11025](https://github.com/matrix-org/matrix-react-sdk/pull/11025)). Fixes vector-im/element-web#23459. + * Removed `DecryptionFailureBar.tsx` ([\#11027](https://github.com/matrix-org/matrix-react-sdk/pull/11027)). Fixes vector-im/element-meta#1358. Contributed by @florianduros. + +## 🐛 Bug Fixes + * Fix translucent `TextualEvent` on search results panel ([\#10810](https://github.com/matrix-org/matrix-react-sdk/pull/10810)). Fixes vector-im/element-web#25292. Contributed by @luixxiul. + * Matrix matrix scheme permalink constructor not stripping query params ([\#11060](https://github.com/matrix-org/matrix-react-sdk/pull/11060)). Fixes vector-im/element-web#25535. + * Fix: "manually verify by text" does nothing ([\#11059](https://github.com/matrix-org/matrix-react-sdk/pull/11059)). Fixes vector-im/element-web#25375. Contributed by @kerryarchibald. + * Make group calls respect the ICE fallback setting ([\#11047](https://github.com/matrix-org/matrix-react-sdk/pull/11047)). Fixes vector-im/voip-internal#65. + * Align list items on the tooltip to the start ([\#11041](https://github.com/matrix-org/matrix-react-sdk/pull/11041)). Fixes vector-im/element-web#25355. Contributed by @luixxiul. + * Clear thread panel event permalink when changing rooms ([\#11024](https://github.com/matrix-org/matrix-react-sdk/pull/11024)). Fixes vector-im/element-web#25484. + * Fix spinner placement on pinned widgets being reloaded ([\#10970](https://github.com/matrix-org/matrix-react-sdk/pull/10970)). Fixes vector-im/element-web#25431. Contributed by @luixxiul. + Changes in [3.73.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.73.1) (2023-06-09) ===================================================================================================== From c534bde698b118f56bd820f46d9e48babda6edbc Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 13 Jun 2023 12:39:48 +0100 Subject: [PATCH 51/54] v3.74.0-rc1 --- package.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index db34cee751a..92a1f1365ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "3.73.1", + "version": "3.74.0-rc1", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { @@ -23,7 +23,7 @@ "package.json", ".stylelintrc.js" ], - "main": "./src/index.ts", + "main": "./lib/index.ts", "matrix_src_main": "./src/index.ts", "matrix_lib_main": "./lib/index.ts", "matrix_lib_typings": "./lib/index.d.ts", @@ -219,5 +219,6 @@ "outputDirectory": "coverage", "outputName": "jest-sonar-report.xml", "relativePaths": true - } + }, + "typings": "./lib/index.d.ts" } From ef56fcf26395195a2d5fc59cb7e76f63a65c6ed7 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 20 Jun 2023 10:18:01 +0100 Subject: [PATCH 52/54] Upgrade matrix-js-sdk to 26.1.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 92a1f1365ef..2f1b96f2c73 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "maplibre-gl": "^2.0.0", "matrix-encrypt-attachment": "^1.0.3", "matrix-events-sdk": "0.0.1", - "matrix-js-sdk": "26.1.0-rc1", + "matrix-js-sdk": "26.1.0", "matrix-widget-api": "^1.4.0", "memoize-one": "^6.0.0", "minimist": "^1.2.5", diff --git a/yarn.lock b/yarn.lock index 2ce60b41f54..95e533d387e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6464,10 +6464,10 @@ matrix-events-sdk@0.0.1: resolved "https://registry.yarnpkg.com/matrix-events-sdk/-/matrix-events-sdk-0.0.1.tgz#c8c38911e2cb29023b0bbac8d6f32e0de2c957dd" integrity sha512-1QEOsXO+bhyCroIe2/A5OwaxHvBm7EsSQ46DEDn8RBIfQwN5HWBpFvyWWR4QY0KHPPnnJdI99wgRiAl7Ad5qaA== -matrix-js-sdk@26.1.0-rc1: - version "26.1.0-rc1" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-26.1.0-rc1.tgz#d79c0aea1d239ac8a40f7b9f8993027727652a34" - integrity sha512-ULFJWU2dTduDBDwlJq4efdsAcnoaE2L8+JWkWfsPKSOzQE09A93WXjDL/0L3aLCFJu2HWIZU28ea2VgTv6Kxeg== +matrix-js-sdk@26.1.0: + version "26.1.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-26.1.0.tgz#d09f2892ca8263a92413cf61a66c2b2d8c4f545d" + integrity sha512-2isNpMFCR0hV8wNub4GJ/+8lIbz/jag12gf1P8rU++PfLFpeObooIDI3nnffBGLV5biZ3iLkaLOKAl33dSxchA== dependencies: "@babel/runtime" "^7.12.5" "@matrix-org/matrix-sdk-crypto-js" "^0.1.0-alpha.10" From 4b84b7f59851644d08ec20ce2a5cd3c1d9d97745 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 20 Jun 2023 10:19:25 +0100 Subject: [PATCH 53/54] Prepare changelog for v3.74.0 --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b10c5ffe53a..cebdf6b3f42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,5 @@ -Changes in [3.74.0-rc1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.74.0-rc1) (2023-06-13) -============================================================================================================= +Changes in [3.74.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.74.0) (2023-06-20) +===================================================================================================== ## ✨ Features * OIDC: add delegatedauthentication to validated server config ([\#11053](https://github.com/matrix-org/matrix-react-sdk/pull/11053)). Contributed by @kerryarchibald. From 21ab205f35ee050cf3235342198d560d6e9ea42b Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Tue, 20 Jun 2023 10:19:28 +0100 Subject: [PATCH 54/54] v3.74.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2f1b96f2c73..5e7476ff189 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "3.74.0-rc1", + "version": "3.74.0", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": {