From be721c5bcb0b05d484294cc53bed95ae8a3e2f9e Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Mon, 30 Nov 2020 12:00:54 +0000 Subject: [PATCH 001/231] Create TS compatible version of replaceableComponent --- src/utils/replaceableComponent.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/utils/replaceableComponent.ts b/src/utils/replaceableComponent.ts index 8c29fdf037..f83e0c95c1 100644 --- a/src/utils/replaceableComponent.ts +++ b/src/utils/replaceableComponent.ts @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +import { func } from 'prop-types'; import * as React from 'react'; import * as sdk from '../index'; @@ -38,3 +39,12 @@ export function replaceableComponent(name: string, origComponent: React.Componen // return a falsey value like `null` when the skin doesn't have a component. return () => sdk.getComponent(name) || origComponent; } + +/** + * Typescript-compatible version of `replaceableComponent` + * @see replaceableComponent + * @param {string} name The dot-path name of the component being replaced. + */ +export function replaceableComponentTs(name: string) { + return (origComponent: typeof React.Component) => sdk.getComponent(name) || origComponent; +} \ No newline at end of file From 86200e551985e4119f193da7818dd9ecc4c828ae Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Mon, 30 Nov 2020 12:01:16 +0000 Subject: [PATCH 002/231] Convert BridgeTile to Typescript --- .../views/settings/{BridgeTile.js => BridgeTile.tsx} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename src/components/views/settings/{BridgeTile.js => BridgeTile.tsx} (95%) diff --git a/src/components/views/settings/BridgeTile.js b/src/components/views/settings/BridgeTile.tsx similarity index 95% rename from src/components/views/settings/BridgeTile.js rename to src/components/views/settings/BridgeTile.tsx index e9c58518e4..a6b607b01e 100644 --- a/src/components/views/settings/BridgeTile.js +++ b/src/components/views/settings/BridgeTile.tsx @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React from 'react'; +import React, { ReactNode } from 'react'; import PropTypes from 'prop-types'; import {getHttpUriForMxc} from "matrix-js-sdk/src/content-repo"; import {_t} from "../../../languageHandler"; @@ -23,10 +23,10 @@ import Pill from "../elements/Pill"; import {makeUserPermalink} from "../../../utils/permalinks/Permalinks"; import BaseAvatar from "../avatars/BaseAvatar"; import AccessibleButton from "../elements/AccessibleButton"; -import {replaceableComponent} from "../../../utils/replaceableComponent"; +import {replaceableComponentTs} from "../../../utils/replaceableComponent"; import SettingsStore from "../../../settings/SettingsStore"; -@replaceableComponent("views.settings.BridgeTile") +@replaceableComponentTs("views.settings.BridgeTile") export default class BridgeTile extends React.PureComponent { static propTypes = { ev: PropTypes.object.isRequired, @@ -43,7 +43,7 @@ export default class BridgeTile extends React.PureComponent { }); } - render() { + render(): ReactNode { const content = this.props.ev.getContent(); const { channel, network, protocol } = content; const protocolName = protocol.displayname || protocol.id; From 8e6061b37aebbdc158713d9431e7d5a60b8cbb30 Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Mon, 30 Nov 2020 12:05:30 +0000 Subject: [PATCH 003/231] Ts tweaks --- src/components/views/settings/BridgeTile.tsx | 33 +++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/components/views/settings/BridgeTile.tsx b/src/components/views/settings/BridgeTile.tsx index a6b607b01e..f38e97ee9b 100644 --- a/src/components/views/settings/BridgeTile.tsx +++ b/src/components/views/settings/BridgeTile.tsx @@ -25,9 +25,20 @@ import BaseAvatar from "../avatars/BaseAvatar"; import AccessibleButton from "../elements/AccessibleButton"; import {replaceableComponentTs} from "../../../utils/replaceableComponent"; import SettingsStore from "../../../settings/SettingsStore"; +import type {MatrixEvent} from "matrix-js-sdk/src/models/event"; +import { Room } from "matrix-js-sdk/src/models/room"; + +interface IProps { + ev: MatrixEvent; + room: Room; +} + +interface IState { + visible: boolean; +} @replaceableComponentTs("views.settings.BridgeTile") -export default class BridgeTile extends React.PureComponent { +export default class BridgeTile extends React.PureComponent { static propTypes = { ev: PropTypes.object.isRequired, room: PropTypes.object.isRequired, @@ -43,7 +54,7 @@ export default class BridgeTile extends React.PureComponent { }); } - render(): ReactNode { + render() { const content = this.props.ev.getContent(); const { channel, network, protocol } = content; const protocolName = protocol.displayname || protocol.id; @@ -53,22 +64,22 @@ export default class BridgeTile extends React.PureComponent { let creator = null; if (content.creator) { creator = _t("This bridge was provisioned by .", {}, { - user: , + user: () => , }); } const bot = _t("This bridge is managed by .", {}, { - user: , + />, }); let networkIcon; @@ -88,7 +99,7 @@ export default class BridgeTile extends React.PureComponent { url={ avatarUrl } />; } else { - networkIcon =
; + networkIcon =
; } const id = this.props.ev.getId(); From 8d203043d40ad6959405b4b115893213ed7b6a16 Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Mon, 30 Nov 2020 12:47:27 +0000 Subject: [PATCH 004/231] Remove hide/show behaviour --- .../dialogs/_RoomSettingsDialogBridges.scss | 18 ++++------- src/components/views/settings/BridgeTile.tsx | 32 ++++++------------- 2 files changed, 15 insertions(+), 35 deletions(-) diff --git a/res/css/views/dialogs/_RoomSettingsDialogBridges.scss b/res/css/views/dialogs/_RoomSettingsDialogBridges.scss index a1793cc75e..c97a3b69b7 100644 --- a/res/css/views/dialogs/_RoomSettingsDialogBridges.scss +++ b/res/css/views/dialogs/_RoomSettingsDialogBridges.scss @@ -89,24 +89,18 @@ limitations under the License. } } - .mx_showMore { - display: block; - text-align: left; - margin-top: 10px; - } - .metadata { color: $muted-fg-color; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; margin-bottom: 0; - } - - .metadata.visible { overflow-y: visible; text-overflow: ellipsis; white-space: normal; + padding: 0; + + > li { + padding: 0; + border: 0; + } } } } diff --git a/src/components/views/settings/BridgeTile.tsx b/src/components/views/settings/BridgeTile.tsx index f38e97ee9b..ae8faec489 100644 --- a/src/components/views/settings/BridgeTile.tsx +++ b/src/components/views/settings/BridgeTile.tsx @@ -33,26 +33,16 @@ interface IProps { room: Room; } -interface IState { - visible: boolean; +/** } @replaceableComponentTs("views.settings.BridgeTile") -export default class BridgeTile extends React.PureComponent { +export default class BridgeTile extends React.PureComponent { static propTypes = { ev: PropTypes.object.isRequired, room: PropTypes.object.isRequired, } - state = { - visible: false, - } - - _toggleVisible() { - this.setState({ - visible: !this.state.visible, - }); - } render() { const content = this.props.ev.getContent(); @@ -63,24 +53,24 @@ export default class BridgeTile extends React.PureComponent { let creator = null; if (content.creator) { - creator = _t("This bridge was provisioned by .", {}, { + creator =
  • {_t("This bridge was provisioned by .", {}, { user: () => , - }); + })}
  • ; } - const bot = _t("This bridge is managed by .", {}, { + const bot =
  • {_t("This bridge is managed by .", {}, { user: () => , - }); + })}
  • ; let networkIcon; @@ -103,7 +93,6 @@ export default class BridgeTile extends React.PureComponent { } const id = this.props.ev.getId(); - const metadataClassname = "metadata" + (this.state.visible ? " visible" : ""); return (
  • {networkIcon} @@ -114,12 +103,9 @@ export default class BridgeTile extends React.PureComponent { {_t("Workspace: %(networkName)s", {networkName})} {_t("Channel: %(channelName)s", {channelName})}

    -

    +

      {creator} {bot} -

      - - { this.state.visible ? _t("Show less") : _t("Show more") } - +
  • ); } From e448da0bcddb81e43f200dfe8031f9446e61575c Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Mon, 30 Nov 2020 12:47:51 +0000 Subject: [PATCH 005/231] Add interface for event content, and validate --- src/components/views/settings/BridgeTile.tsx | 32 ++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/BridgeTile.tsx b/src/components/views/settings/BridgeTile.tsx index ae8faec489..3fb184d828 100644 --- a/src/components/views/settings/BridgeTile.tsx +++ b/src/components/views/settings/BridgeTile.tsx @@ -25,7 +25,7 @@ import BaseAvatar from "../avatars/BaseAvatar"; import AccessibleButton from "../elements/AccessibleButton"; import {replaceableComponentTs} from "../../../utils/replaceableComponent"; import SettingsStore from "../../../settings/SettingsStore"; -import type {MatrixEvent} from "matrix-js-sdk/src/models/event"; +import {MatrixEvent} from "matrix-js-sdk/src/models/event"; import { Room } from "matrix-js-sdk/src/models/room"; interface IProps { @@ -34,6 +34,29 @@ interface IProps { } /** + * This should match https://github.com/matrix-org/matrix-doc/blob/hs/msc-bridge-inf/proposals/2346-bridge-info-state-event.md#mbridge + */ +interface IBridgeStateEvent { + bridgebot: string; + creator?: string; + protocol: { + id: string; + displayname?: string; + avatar_url?: string; + external_url?: string; + }; + network?: { + id: string; + displayname?: string; + avatar_url?: string; + external_url?: string; + }; + channel: { + id: string; + displayname?: string; + avatar_url?: string; + external_url?: string; + }; } @replaceableComponentTs("views.settings.BridgeTile") @@ -45,7 +68,12 @@ export default class BridgeTile extends React.PureComponent { render() { - const content = this.props.ev.getContent(); + const content: IBridgeStateEvent = this.props.ev.getContent(); + // Validate + if (!content.bridgebot || !content.channel?.id || !content.protocol?.id) { + console.warn(`Bridge info event ${this.props.ev.getId()} has missing content. Tile will not render`); + return null; + } const { channel, network, protocol } = content; const protocolName = protocol.displayname || protocol.id; const channelName = channel.displayname || channel.id; From d6312606e6e6afd362549670e3b9c98ad9777b21 Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Mon, 30 Nov 2020 12:48:10 +0000 Subject: [PATCH 006/231] Use correct key for avatar --- src/components/views/settings/BridgeTile.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/views/settings/BridgeTile.tsx b/src/components/views/settings/BridgeTile.tsx index 3fb184d828..f47d47cb40 100644 --- a/src/components/views/settings/BridgeTile.tsx +++ b/src/components/views/settings/BridgeTile.tsx @@ -66,7 +66,6 @@ export default class BridgeTile extends React.PureComponent { room: PropTypes.object.isRequired, } - render() { const content: IBridgeStateEvent = this.props.ev.getContent(); // Validate @@ -77,7 +76,6 @@ export default class BridgeTile extends React.PureComponent { const { channel, network, protocol } = content; const protocolName = protocol.displayname || protocol.id; const channelName = channel.displayname || channel.id; - const networkName = network ? network.displayname || network.id : protocolName; let creator = null; if (content.creator) { @@ -102,10 +100,10 @@ export default class BridgeTile extends React.PureComponent { let networkIcon; - if (protocol.avatar) { + if (protocol.avatar_url) { const avatarUrl = getHttpUriForMxc( MatrixClientPeg.get().getHomeserverUrl(), - protocol.avatar, 64, 64, "crop", + protocol.avatar_url, 64, 64, "crop", ); networkIcon = Date: Mon, 30 Nov 2020 12:48:26 +0000 Subject: [PATCH 007/231] Add support for linking to the remote network page --- src/components/views/settings/BridgeTile.tsx | 23 ++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/components/views/settings/BridgeTile.tsx b/src/components/views/settings/BridgeTile.tsx index f47d47cb40..062fdbeb6e 100644 --- a/src/components/views/settings/BridgeTile.tsx +++ b/src/components/views/settings/BridgeTile.tsx @@ -27,6 +27,7 @@ import {replaceableComponentTs} from "../../../utils/replaceableComponent"; import SettingsStore from "../../../settings/SettingsStore"; import {MatrixEvent} from "matrix-js-sdk/src/models/event"; import { Room } from "matrix-js-sdk/src/models/room"; +import { isUrlPermitted } from '../../../HtmlUtils'; interface IProps { ev: MatrixEvent; @@ -117,6 +118,22 @@ export default class BridgeTile extends React.PureComponent { } else { networkIcon =
    ; } + let networkItem = null; + if (network) { + const networkName = network.displayname || network.id; + let networkLink = {networkName}; + if (typeof network.external_url === "string" && isUrlPermitted(network.external_url)) { + networkLink = {networkName} + } + networkItem = _t("Workspace: ", {}, { + networkLink: () => networkLink, + }); + } + + let channelLink = {channelName}; + if (typeof channel.external_url === "string" && isUrlPermitted(channel.external_url)) { + channelLink = {channelName} + } const id = this.props.ev.getId(); return (
  • @@ -126,8 +143,10 @@ export default class BridgeTile extends React.PureComponent {

    {protocolName}

    - {_t("Workspace: %(networkName)s", {networkName})} - {_t("Channel: %(channelName)s", {channelName})} + {networkItem} + {_t("Channel: ", {}, { + channelLink: () => channelLink + })}

      {creator} {bot} From e7693dc95d7a84ab225f6beb58521c3c278ed447 Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Mon, 30 Nov 2020 12:50:57 +0000 Subject: [PATCH 008/231] Update variable in translation files --- src/i18n/strings/ar.json | 2 +- src/i18n/strings/cs.json | 4 ++-- src/i18n/strings/de_DE.json | 4 ++-- src/i18n/strings/en_EN.json | 4 ++-- src/i18n/strings/eo.json | 4 ++-- src/i18n/strings/es.json | 4 ++-- src/i18n/strings/et.json | 4 ++-- src/i18n/strings/eu.json | 4 ++-- src/i18n/strings/fi.json | 4 ++-- src/i18n/strings/fr.json | 4 ++-- src/i18n/strings/gl.json | 4 ++-- src/i18n/strings/hu.json | 4 ++-- src/i18n/strings/it.json | 4 ++-- src/i18n/strings/kab.json | 4 ++-- src/i18n/strings/lt.json | 4 ++-- src/i18n/strings/nl.json | 4 ++-- src/i18n/strings/pt_BR.json | 4 ++-- src/i18n/strings/ru.json | 4 ++-- src/i18n/strings/sk.json | 4 ++-- src/i18n/strings/sq.json | 4 ++-- src/i18n/strings/sv.json | 4 ++-- src/i18n/strings/tr.json | 4 ++-- src/i18n/strings/uk.json | 4 ++-- src/i18n/strings/zh_Hans.json | 4 ++-- src/i18n/strings/zh_Hant.json | 4 ++-- 25 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/i18n/strings/ar.json b/src/i18n/strings/ar.json index 5da09afd23..a58e53555e 100644 --- a/src/i18n/strings/ar.json +++ b/src/i18n/strings/ar.json @@ -1056,7 +1056,7 @@ "Failed to upload profile picture!": "تعذَّر رفع صورة الملف الشخصي!", "Show more": "أظهر أكثر", "Show less": "أظهر أقل", - "Channel: %(channelName)s": "قناة: %(channelName)s", + "Channel: ": "قناة: %(channelName)s", "This bridge is managed by .": "هذا الجسر يديره .", "Upload": "رفع", "Accept to continue:": "قبول للمتابعة:", diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 4d9d27363f..c7c09b02a3 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1753,8 +1753,8 @@ "Review": "Prohlédnout", "This bridge was provisioned by .": "Toto propojení poskytuje .", "This bridge is managed by .": "Toto propojení spravuje .", - "Workspace: %(networkName)s": "Workspace: %(networkName)s", - "Channel: %(channelName)s": "Kanál: %(channelName)s", + "Workspace: ": "Workspace: ", + "Channel: ": "Kanál: %(channelName)s", "Show less": "Skrýt detaily", "Show more": "Více", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Změna hesla resetuje šifrovací klíče pro všechny vaše relace. Pokud si nejdřív nevyexportujete klíče místností a po změně je znovu neimportujete, nedostanete se k historickým zprávám. V budoucnu se toto zjednoduší.", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 5d5ca50fc9..0c4eb8dca9 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1668,8 +1668,8 @@ "Verify yourself & others to keep your chats safe": "Verifiziere dich & andere, um eure Chats zu schützen", "This bridge was provisioned by .": "Diese Brücke wurde von bereitgestellt.", "This bridge is managed by .": "Diese Brücke wird von verwaltet.", - "Workspace: %(networkName)s": "Arbeitsbereich: %(networkName)s", - "Channel: %(channelName)s": "Kanal: %(channelName)s", + "Workspace: ": "Arbeitsbereich: ", + "Channel: ": "Kanal: %(channelName)s", "Show less": "Weniger zeigen", "Warning: You should only set up key backup from a trusted computer.": "Achtung: Du solltest die Schlüsselsicherung nur auf einem vertrauenswürdigen Gerät einrichten.", "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.": "Melde dich an um die ausschließlich in dieser Sitzung gespeicherten Verschlüsselungsschlüssel wiederherzustellen. Du benötigst sie, um deine verschlüsselten Nachrichten in jeder Sitzung zu lesen.", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index eb1d0a632e..494909800c 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -955,8 +955,8 @@ "Upload": "Upload", "This bridge was provisioned by .": "This bridge was provisioned by .", "This bridge is managed by .": "This bridge is managed by .", - "Workspace: %(networkName)s": "Workspace: %(networkName)s", - "Channel: %(channelName)s": "Channel: %(channelName)s", + "Workspace: ": "Workspace: ", + "Channel: ": "Channel: ", "Show less": "Show less", "Show more": "Show more", "Failed to upload profile picture!": "Failed to upload profile picture!", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 3545565fa3..9ea4af86ee 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -1720,7 +1720,7 @@ "They don't match": "Ili ne akordas", "To be secure, do this in person or use a trusted way to communicate.": "Por plia sekureco, faru tion persone, aŭ uzu alian fidatan komunikilon.", "Verify yourself & others to keep your chats safe": "Kontrolu vin mem kaj aliajn por sekurigi viajn babilojn", - "Channel: %(channelName)s": "Kanalo: %(channelName)s", + "Channel: ": "Kanalo: %(channelName)s", "Show less": "Montri malpli", "Show more": "Montri pli", "Help": "Helpo", @@ -1760,7 +1760,7 @@ "Review": "Rekontroli", "This bridge was provisioned by .": "Ĉi tiu ponto estas provizita de .", "This bridge is managed by .": "Ĉi tiu ponto estas administrata de .", - "Workspace: %(networkName)s": "Labortablo: %(networkName)s", + "Workspace: ": "Labortablo: ", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ŝanĝo de pasvorto nuntempe restarigos ĉiujn tutvoje ĉifrajn ŝlosilojn en ĉiuj salutaĵoj, malebligante legadon de ĉifrita historio, malse vi unue elportus la ŝlosilojn de viaj ĉambroj kaj reenportus ilin poste. Ĉi tion ni plibonigos ose.", "Your homeserver does not support cross-signing.": "Via hejmservilo ne subtenas delegajn subskribojn.", "Cross-signing and secret storage are enabled.": "Delegaj subskriboj kaj sekreta deponejo estas ŝaltitaj.", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 34c40800f7..1635284e58 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1209,8 +1209,8 @@ "Verify": "Verificar", "Later": "Más tarde", "Upload": "Subir", - "Workspace: %(networkName)s": "Espacio de trabajo: %(networkName)s", - "Channel: %(channelName)s": "Canal: %(channelName)s", + "Workspace: ": "Espacio de trabajo: ", + "Channel: ": "Canal: %(channelName)s", "Show less": "Mostrar menos", "Show more": "Mostrar más", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Cambiar la contraseña reiniciará cualquier clave de encriptación end-to-end en todas las sesiones, haciendo el historial de conversaciones encriptado ilegible, a no ser que primero exportes tus claves de sala y después las reimportes. En un futuro esto será mejorado.", diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 0b338bd9d4..868d04e0ee 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -1804,8 +1804,8 @@ "Waiting for your other session to verify…": "Ootan, et sinu teine sessioon alustaks verifitseerimist…", "This bridge was provisioned by .": "Selle võrgusilla võttis kasutusele .", "This bridge is managed by .": "Seda võrgusilda haldab .", - "Workspace: %(networkName)s": "Tööruum: %(networkName)s", - "Channel: %(channelName)s": "Kanal: %(channelName)s", + "Workspace: ": "Tööruum: ", + "Channel: ": "Kanal: %(channelName)s", "Upload new:": "Lae üles uus:", "Export E2E room keys": "Ekspordi jututubade läbiva krüptimise võtmed", "Your homeserver does not support cross-signing.": "Sinu koduserver ei toeta risttunnustamist.", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 2740ea2079..37deb7e774 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1805,8 +1805,8 @@ "Verify yourself & others to keep your chats safe": "Egiaztatu zure burua eta besteak txatak seguru mantentzeko", "Review": "Berrikusi", "This bridge was provisioned by .": "Zubi hau erabiltzaileak hornitu du.", - "Workspace: %(networkName)s": "Lan eremua: %(networkName)s", - "Channel: %(channelName)s": "Kanala: %(channelName)s", + "Workspace: ": "Lan eremua: ", + "Channel: ": "Kanala: %(channelName)s", "Show less": "Erakutsi gutxiago", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Pasahitza aldatzean oraingo muturretik muturrerako zifratze gako guztiak ezeztatuko ditu saio guztietan, zifratutako txaten historiala ezin izango da irakurri ez badituzu aurretik zure geletako gakoak esportatzen eta gero berriro inportatzen. Etorkizunean hau hobetuko da.", "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Zure kontuak zeharkako sinatze identitate bat du biltegi sekretuan, baina saio honek ez du oraindik fidagarritzat.", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 075c1e278a..47f11c2b57 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -1876,8 +1876,8 @@ "Review": "Katselmoi", "This bridge was provisioned by .": "Tämän sillan tarjoaa käyttäjä .", "This bridge is managed by .": "Tätä siltaa hallinnoi käyttäjä .", - "Workspace: %(networkName)s": "Työtila: %(networkName)s", - "Channel: %(channelName)s": "Kanava: %(channelName)s", + "Workspace: ": "Työtila: ", + "Channel: ": "Kanava: %(channelName)s", "Delete %(count)s sessions|other": "Poista %(count)s istuntoa", "Enable": "Ota käyttöön", "Backup is not signed by any of your sessions": "Mikään istuntosi ei ole allekirjoittanut varmuuskopiota", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index efae1f7b26..f1cb24a686 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1809,8 +1809,8 @@ "They match": "Ils correspondent", "They don't match": "Ils ne correspondent pas", "This bridge was provisioned by .": "Cette passerelle a été fournie par .", - "Workspace: %(networkName)s": "Espace de travail : %(networkName)s", - "Channel: %(channelName)s": "Canal : %(channelName)s", + "Workspace: ": "Espace de travail : ", + "Channel: ": "Canal : %(channelName)s", "Show less": "En voir moins", "This room is bridging messages to the following platforms. Learn more.": "Ce salon transmet les messages vers les plateformes suivantes. En savoir plus.", "This room isn’t bridging messages to any platforms. Learn more.": "Ce salon ne transmet les messages à aucune plateforme. En savoir plus.", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index fec99d1e7c..5afa95e29c 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -1307,8 +1307,8 @@ "Upload": "Subir", "This bridge was provisioned by .": "Esta ponte está proporcionada por .", "This bridge is managed by .": "Esta ponte está xestionada por .", - "Workspace: %(networkName)s": "Espazo de traballo: %(networkName)s", - "Channel: %(channelName)s": "Canal: %(channelName)s", + "Workspace: ": "Espazo de traballo: ", + "Channel: ": "Canal: %(channelName)s", "Show less": "Mostrar menos", "Show more": "Mostrar máis", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ao cambiar o contrasinal vas restablecer todas as chaves de cifrado extremo-a-extremo en tódalas sesións, facendo que o historial de conversa cifrado non sexa lexible, a menos que primeiro exportes todas as chaves das salas e as importes posteriormente. No futuro melloraremos o procedemento.", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 2739154c19..6ced904206 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1793,8 +1793,8 @@ "Enable message search in encrypted rooms": "Üzenetek keresésének bekapcsolása a titkosított szobákban", "Review": "Átnéz", "This bridge was provisioned by .": "Ezt a hidat az alábbi felhasználó készítette: .", - "Workspace: %(networkName)s": "Munkahely: %(networkName)s", - "Channel: %(channelName)s": "Csatorna: %(channelName)s", + "Workspace: ": "Munkahely: ", + "Channel: ": "Csatorna: %(channelName)s", "Show less": "Kevesebbet mutat", "Securely cache encrypted messages locally for them to appear in search results, using ": "A titkosított üzenetek kereséséhez azokat biztonságos módon helyileg kell tárolnod, felhasználva: ", " to store messages from ": " üzenetek tárolásához ", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 4ad806f55e..edb584c894 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1797,8 +1797,8 @@ "They don't match": "Non corrispondono", "Review": "Controlla", "This bridge was provisioned by .": "Questo bridge è stato fornito da .", - "Workspace: %(networkName)s": "Spazio di lavoro: %(networkName)s", - "Channel: %(channelName)s": "Canale: %(channelName)s", + "Workspace: ": "Spazio di lavoro: ", + "Channel: ": "Canale: %(channelName)s", "Show less": "Mostra meno", "Securely cache encrypted messages locally for them to appear in search results, using ": "Tieni in cache localmente i messaggi cifrati in modo sicuro affinché appaiano nei risultati di ricerca, usando ", " to store messages from ": " per conservare i messaggi da ", diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 7a9261f25c..aaeb309edb 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -847,8 +847,8 @@ "Accept to continue:": "Qbel i wakken ad tkemmleḍ:", "This bridge was provisioned by .": "Tileggit-a tella-d sɣur .", "This bridge is managed by .": "Tileggit-a tettusefrak sɣur .", - "Workspace: %(networkName)s": "Tallunt n uxeddim: %(networkName)s", - "Channel: %(channelName)s": "Abadu: %(channelName)s", + "Workspace: ": "Tallunt n uxeddim: ", + "Channel: ": "Abadu: %(channelName)s", "Upload new:": "Asali amaynut:", "New passwords don't match": "Awalen uffiren imaynuten ur mṣadan ara", "Passwords can't be empty": "Awalen uffiren ur ilaq ara ad ilin d ilmawen", diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index c1191aa020..756fe77bfd 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -1953,8 +1953,8 @@ "not found in storage": "saugykloje nerasta", "Cross-signing is not set up.": "Kryžminis pasirašymas nenustatytas.", "Cross-signing is ready for use.": "Kryžminis pasirašymas yra paruoštas naudoti.", - "Channel: %(channelName)s": "Kanalas: %(channelName)s", - "Workspace: %(networkName)s": "Darbo sritis: %(networkName)s", + "Channel: ": "Kanalas: %(channelName)s", + "Workspace: ": "Darbo sritis: ", "This bridge is managed by .": "Šis tiltas yra tvarkomas .", "This bridge was provisioned by .": "Šis tiltas buvo parūpintas .", "Your server isn't responding to some requests.": "Jūsų serveris neatsako į kai kurias užklausas.", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 1ec887c364..e09aa82b9a 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -1625,8 +1625,8 @@ "Decline (%(counter)s)": "Afwijzen (%(counter)s)", "This bridge was provisioned by .": "Dank aan voor de brug.", "This bridge is managed by .": "Brug onderhouden door .", - "Workspace: %(networkName)s": "Werkruimte: %(networkName)s", - "Channel: %(channelName)s": "Kanaal: %(channelName)s", + "Workspace: ": "Werkruimte: ", + "Channel: ": "Kanaal: %(channelName)s", "Show less": "Minder tonen", "Show more": "Meer tonen", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Momenteel stelt een wachtwoordswijziging alle berichtsleutels in alle sessies opnieuw in, en maakt zo oude versleutelde berichten onleesbaar - tenzij u uw sleutels eerst wegschrijft, en na afloop weer inleest. Dit zal verbeterd worden.", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 613f889370..0c2037e02a 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -1380,8 +1380,8 @@ "Upload": "Enviar", "This bridge was provisioned by .": "Esta integração foi disponibilizada por .", "This bridge is managed by .": "Esta integração é desenvolvida por .", - "Workspace: %(networkName)s": "Espaço de trabalho: %(networkName)s", - "Channel: %(channelName)s": "Canal: %(channelName)s", + "Workspace: ": "Espaço de trabalho: ", + "Channel: ": "Canal: %(channelName)s", "Show less": "Mostrar menos", "Show more": "Mostrar mais", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ao mudar a senha, você apagará todas as chaves de criptografia de ponta a ponta existentes em todas as sessões, fazendo com que o histórico de conversas criptografadas fique ilegível, a não ser que você exporte as salas das chaves criptografadas antes de mudar a senha e então as importe novamente depois. No futuro, isso será melhorado.", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 3c5ead3aa1..1cda0a288b 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1670,8 +1670,8 @@ "Decline (%(counter)s)": "Отклонить (%(counter)s)", "This bridge was provisioned by .": "Этот мост был подготовлен пользователем .", "This bridge is managed by .": "Этот мост управляется .", - "Workspace: %(networkName)s": "Рабочая область: %(networkName)s", - "Channel: %(channelName)s": "Канал: %(channelName)s", + "Workspace: ": "Рабочая область: ", + "Channel: ": "Канал: %(channelName)s", "Show less": "Показать меньше", "Show more": "Показать больше", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Если вы не экспортируете ключи для этой комнаты и не импортируете их в будущем, смена пароля приведёт к сбросу всех ключей сквозного шифрования и сделает невозможным чтение истории чата. В будущем это будет улучшено.", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 454d86cb64..7fa8e4dd65 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -1536,8 +1536,8 @@ "Joins room with given address": "Pridať sa do miestnosti s danou adresou", "Unrecognised room address:": "Nerozpoznaná adresa miestnosti:", "This bridge is managed by .": "Tento most spravuje .", - "Workspace: %(networkName)s": "Pracovisko: %(networkName)s", - "Channel: %(channelName)s": "Kanál: %(channelName)s", + "Workspace: ": "Pracovisko: ", + "Channel: ": "Kanál: %(channelName)s", "Show less": "Zobraziť menej", "Show more": "Zobraziť viac", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Zmena hesla reštartuje všetky šifrovacie kľúče pre všetky vaše relácie. Šifrované správy sa stanú nečitateľnými, pokiaľ najprv nevyexportujete vaše kľúče a po zmene ich nenaimportujete. V budúcnosti sa tento proces zjednoduší.", diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 74a85031ac..54236054bd 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -1819,8 +1819,8 @@ "To be secure, do this in person or use a trusted way to communicate.": "Për të qenë i sigurt, bëjeni këtë duke qenë vetë i pranishëm ose përdorni për të komunikuar një rrugë të besuar.", "Verify yourself & others to keep your chats safe": "Verifikoni veten & të tjerët, që t’i mbani bisedat tuaja të sigurta", "This bridge was provisioned by .": "Kjo urë është dhënë nga .", - "Workspace: %(networkName)s": "Hapësirë pune: %(networkName)s", - "Channel: %(channelName)s": "Kanal: %(channelName)s", + "Workspace: ": "Hapësirë pune: ", + "Channel: ": "Kanal: %(channelName)s", "Show less": "Shfaq më pak", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ndryshimi i fjalëkalimit do të sjellë zerimin e çfarëdo kyçesh fshehtëzimi skaj-më-skaj në krejt sesionet, duke e bërë të palexueshëm historikun e fshehtëzuar të bisedave, hiq rastin kur i eksportoni më parë kyçet tuaj të dhomës dhe i ri-importoni ata më pas. Në të ardhmen kjo do të përmirësohet.", "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Llogaria juaj ka një identitet cross-signing në depozitë të fshehtë, por s’është ende i besuar në këtë sesion.", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 93ff8808cb..307af905e8 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1692,8 +1692,8 @@ "From %(deviceName)s (%(deviceId)s)": "Från %(deviceName)s (%(deviceId)s)", "This bridge was provisioned by .": "Den här bryggan tillhandahålls av .", "This bridge is managed by .": "Den här bryggan tillhandahålls av .", - "Workspace: %(networkName)s": "Arbetsyta: %(networkName)s", - "Channel: %(channelName)s": "Kanal: %(channelName)s", + "Workspace: ": "Arbetsyta: ", + "Channel: ": "Kanal: %(channelName)s", "Show less": "Visa mindre", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Att byta lösenord återställer just nu alla krypteringsnycklar på alla sessioner, vilket gör krypterad chatthistorik oläslig om du inte först exporterar dina rumsnycklar och sedan importerar dem igen efteråt. Detta kommer att förbättras i framtiden.", "Your homeserver does not support cross-signing.": "Din hemserver stöder inte korssignering.", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 5a152eeab6..20ebca68a2 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -1410,8 +1410,8 @@ "Other users may not trust it": "Diğer kullanıcılar güvenmeyebilirler", "Later": "Sonra", "Review": "Gözden Geçirme", - "Workspace: %(networkName)s": "Çalışma alanı: %(networkName)s", - "Channel: %(channelName)s": "Kanal: %(channelName)s", + "Workspace: ": "Çalışma alanı: ", + "Channel: ": "Kanal: %(channelName)s", "Show less": "Daha az göster", "Show more": "Daha fazla göster", "in memory": "hafızada", diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index eaf8fdbe88..b0efb8ff07 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -955,8 +955,8 @@ "Globe": "Глобус", "This bridge was provisioned by .": "Цей місток був підготовленим .", "This bridge is managed by .": "Цей міст керується .", - "Workspace: %(networkName)s": "Робочий простір: %(networkName)s", - "Channel: %(channelName)s": "Канал: %(channelName)s", + "Workspace: ": "Робочий простір: ", + "Channel: ": "Канал: %(channelName)s", "Show less": "Згорнути", "Show more": "Розгорнути", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Змінення пароля призведе до скидання всіх ключів наскрізного шифрування та унеможливить читання історії листування, якщо тільки ви не експортуєте ваші ключі кімнати та не імпортуєте їх згодом. Це буде вдосконалено у майбутньому.", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 672b1befd1..46edda95dc 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -2320,8 +2320,8 @@ "Uploading logs": "正在上传日志", "Downloading logs": "正在下载日志", "This bridge was provisioned by .": "桥接由 准备。", - "Workspace: %(networkName)s": "工作区:%(networkName)s", - "Channel: %(channelName)s": "频道:%(channelName)s", + "Workspace: ": "工作区:", + "Channel: ": "频道:%(channelName)s", "well formed": "格式正确", "Master private key:": "主私钥:", "Self signing private key:": "自签名私钥:", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 3355a7d383..3b82222e0e 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1804,8 +1804,8 @@ "To be secure, do this in person or use a trusted way to communicate.": "為了安全,請親自進行或使用可信的通訊方式。", "Review": "評論", "This bridge was provisioned by .": "此橋接是由 設定。", - "Workspace: %(networkName)s": "工作空間:%(networkName)s", - "Channel: %(channelName)s": "頻道:%(channelName)s", + "Workspace: ": "工作空間:", + "Channel: ": "頻道:%(channelName)s", "Show less": "顯示較少", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "變更密碼將會重設所有工作階段上的所有端到端加密金鑰,讓已加密的聊天歷史無法讀取,除非您先匯出您的聊天室金鑰並在稍後重新匯入。未來會有所改善。", "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "您的帳號在秘密儲存空間中有交叉簽章的身份,但尚未被此工作階段信任。", From da86bc0b0a8a1e497dc88f4a62d84722aefa6033 Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Mon, 30 Nov 2020 13:02:04 +0000 Subject: [PATCH 009/231] Allow sender for backwards compat --- src/components/views/settings/BridgeTile.tsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/views/settings/BridgeTile.tsx b/src/components/views/settings/BridgeTile.tsx index 062fdbeb6e..67f0eb7802 100644 --- a/src/components/views/settings/BridgeTile.tsx +++ b/src/components/views/settings/BridgeTile.tsx @@ -70,10 +70,16 @@ export default class BridgeTile extends React.PureComponent { render() { const content: IBridgeStateEvent = this.props.ev.getContent(); // Validate - if (!content.bridgebot || !content.channel?.id || !content.protocol?.id) { + if (!content.channel?.id || !content.protocol?.id) { console.warn(`Bridge info event ${this.props.ev.getId()} has missing content. Tile will not render`); return null; } + if (!content.bridgebot) { + // Bridgebot was not required previously, so in order to not break rooms we are allowing + // the sender to be used in place. When the proposal is merged, this should be removed. + console.warn(`Bridge info event ${this.props.ev.getId()} does not provide a 'bridgebot' key which is deprecated behaviour. Using sender for now.`); + content.bridgebot = this.props.ev.getSender(); + } const { channel, network, protocol } = content; const protocolName = protocol.displayname || protocol.id; const channelName = channel.displayname || channel.id; From 3466813c234eaa41a49d44a901a9089a43d22d26 Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Mon, 30 Nov 2020 13:04:50 +0000 Subject: [PATCH 010/231] Remove showmore show less --- src/i18n/strings/en_EN.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 494909800c..07051ca19e 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -957,8 +957,6 @@ "This bridge is managed by .": "This bridge is managed by .", "Workspace: ": "Workspace: ", "Channel: ": "Channel: ", - "Show less": "Show less", - "Show more": "Show more", "Failed to upload profile picture!": "Failed to upload profile picture!", "Upload new:": "Upload new:", "No display name": "No display name", @@ -1520,6 +1518,7 @@ "Jump to first invite.": "Jump to first invite.", "Show %(count)s more|other": "Show %(count)s more", "Show %(count)s more|one": "Show %(count)s more", + "Show less": "Show less", "Use default": "Use default", "All messages": "All messages", "Mentions & Keywords": "Mentions & Keywords", @@ -1582,6 +1581,7 @@ "New published address (e.g. #alias:server)": "New published address (e.g. #alias:server)", "Local Addresses": "Local Addresses", "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)", + "Show more": "Show more", "Error updating flair": "Error updating flair", "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.", "Invalid community ID": "Invalid community ID", From c5e578a50246c435695afb99e68434db702632cc Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Mon, 30 Nov 2020 13:07:12 +0000 Subject: [PATCH 011/231] linting --- src/components/views/settings/BridgeTile.tsx | 14 ++++++++++---- src/utils/replaceableComponent.ts | 3 +-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/components/views/settings/BridgeTile.tsx b/src/components/views/settings/BridgeTile.tsx index 67f0eb7802..1f5448dcc1 100644 --- a/src/components/views/settings/BridgeTile.tsx +++ b/src/components/views/settings/BridgeTile.tsx @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, { ReactNode } from 'react'; +import React from 'react'; import PropTypes from 'prop-types'; import {getHttpUriForMxc} from "matrix-js-sdk/src/content-repo"; import {_t} from "../../../languageHandler"; @@ -22,7 +22,6 @@ import {MatrixClientPeg} from "../../../MatrixClientPeg"; import Pill from "../elements/Pill"; import {makeUserPermalink} from "../../../utils/permalinks/Permalinks"; import BaseAvatar from "../avatars/BaseAvatar"; -import AccessibleButton from "../elements/AccessibleButton"; import {replaceableComponentTs} from "../../../utils/replaceableComponent"; import SettingsStore from "../../../settings/SettingsStore"; import {MatrixEvent} from "matrix-js-sdk/src/models/event"; @@ -43,19 +42,25 @@ interface IBridgeStateEvent { protocol: { id: string; displayname?: string; + // eslint-disable-next-line camelcase avatar_url?: string; + // eslint-disable-next-line camelcase external_url?: string; }; network?: { id: string; displayname?: string; + // eslint-disable-next-line camelcase avatar_url?: string; + // eslint-disable-next-line camelcase external_url?: string; }; channel: { id: string; displayname?: string; + // eslint-disable-next-line camelcase avatar_url?: string; + // eslint-disable-next-line camelcase external_url?: string; }; } @@ -77,7 +82,8 @@ export default class BridgeTile extends React.PureComponent { if (!content.bridgebot) { // Bridgebot was not required previously, so in order to not break rooms we are allowing // the sender to be used in place. When the proposal is merged, this should be removed. - console.warn(`Bridge info event ${this.props.ev.getId()} does not provide a 'bridgebot' key which is deprecated behaviour. Using sender for now.`); + console.warn(`Bridge info event ${this.props.ev.getId()} does not provide a 'bridgebot' key which` + + "is deprecated behaviour. Using sender for now."); content.bridgebot = this.props.ev.getSender(); } const { channel, network, protocol } = content; @@ -151,7 +157,7 @@ export default class BridgeTile extends React.PureComponent {

      {networkItem} {_t("Channel: ", {}, { - channelLink: () => channelLink + channelLink: () => channelLink, })}

        diff --git a/src/utils/replaceableComponent.ts b/src/utils/replaceableComponent.ts index f83e0c95c1..7ea192f76b 100644 --- a/src/utils/replaceableComponent.ts +++ b/src/utils/replaceableComponent.ts @@ -14,7 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { func } from 'prop-types'; import * as React from 'react'; import * as sdk from '../index'; @@ -47,4 +46,4 @@ export function replaceableComponent(name: string, origComponent: React.Componen */ export function replaceableComponentTs(name: string) { return (origComponent: typeof React.Component) => sdk.getComponent(name) || origComponent; -} \ No newline at end of file +} From e55ec4359593484bc2e877739cbb51524df6ee85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 15 Dec 2020 14:45:10 +0100 Subject: [PATCH 012/231] Fix minimized left panel alignment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/structures/_LeftPanel.scss | 5 +++++ res/css/structures/_UserMenu.scss | 10 +++------- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/res/css/structures/_LeftPanel.scss b/res/css/structures/_LeftPanel.scss index 1424d9cda0..168590502d 100644 --- a/res/css/structures/_LeftPanel.scss +++ b/res/css/structures/_LeftPanel.scss @@ -180,6 +180,11 @@ $groupFilterPanelWidth: 56px; // only applies in this file, used for calculation .mx_LeftPanel_roomListContainer { width: 68px; + .mx_LeftPanel_userHeader { + flex-direction: row; + justify-content: center; + } + .mx_LeftPanel_filterContainer { // Organize the flexbox into a centered column layout flex-direction: column; diff --git a/res/css/structures/_UserMenu.scss b/res/css/structures/_UserMenu.scss index 84c21364ce..0673ebb058 100644 --- a/res/css/structures/_UserMenu.scss +++ b/res/css/structures/_UserMenu.scss @@ -119,14 +119,10 @@ limitations under the License. } &.mx_UserMenu_minimized { - .mx_UserMenu_userHeader { - .mx_UserMenu_row { - justify-content: center; - } + padding-right: 0px; - .mx_UserMenu_userAvatarContainer { - margin-right: 0; - } + .mx_UserMenu_userAvatarContainer { + margin-right: 0px; } } } From a33be00c08b37409c99f6d7b646c9233ba56e16f Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 15 Dec 2020 14:59:06 +0000 Subject: [PATCH 013/231] Basic call transfer initiation support Adapt the InviteDialog to select a transfer target Doesn't support supplying a roo mID fr the transfer: just leaves the transferee to work out how to contact the target themselves. MSC2747 (matrix-org/matrix-doc#2747) Requires https://github.com/matrix-org/matrix-js-sdk/pull/1558 --- .../views/context_menus/CallContextMenu.tsx | 18 +++++++++ src/components/views/dialogs/InviteDialog.tsx | 38 ++++++++++++++++++- src/i18n/strings/en_EN.json | 1 + 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/src/components/views/context_menus/CallContextMenu.tsx b/src/components/views/context_menus/CallContextMenu.tsx index 336b72cebf..3557976326 100644 --- a/src/components/views/context_menus/CallContextMenu.tsx +++ b/src/components/views/context_menus/CallContextMenu.tsx @@ -20,6 +20,8 @@ import { _t } from '../../../languageHandler'; import { ContextMenu, IProps as IContextMenuProps, MenuItem } from '../../structures/ContextMenu'; import { MatrixCall } from 'matrix-js-sdk/src/webrtc/call'; import CallHandler from '../../../CallHandler'; +import InviteDialog, { KIND_CALL_TRANSFER } from '../dialogs/InviteDialog'; +import Modal from '../../../Modal'; interface IProps extends IContextMenuProps { call: MatrixCall; @@ -46,14 +48,30 @@ export default class CallContextMenu extends React.Component { this.props.onFinished(); } + onTransferClick = () => { + Modal.createTrackedDialog( + 'Transfer Call', '', InviteDialog, {kind: KIND_CALL_TRANSFER, call: this.props.call}, + /*className=*/null, /*isPriority=*/false, /*isStatic=*/true, + ); + this.props.onFinished(); + } + render() { const holdUnholdCaption = this.props.call.isRemoteOnHold() ? _t("Resume") : _t("Hold"); const handler = this.props.call.isRemoteOnHold() ? this.onUnholdClick : this.onHoldClick; + let transferItem; + if (this.props.call.opponentCanBeTransferred()) { + transferItem = + {_t("Transfer")} + ; + } + return {holdUnholdCaption} + {transferItem} ; } } diff --git a/src/components/views/dialogs/InviteDialog.tsx b/src/components/views/dialogs/InviteDialog.tsx index 8ccbbe473c..5b936e822c 100644 --- a/src/components/views/dialogs/InviteDialog.tsx +++ b/src/components/views/dialogs/InviteDialog.tsx @@ -41,12 +41,14 @@ import SettingsStore from "../../../settings/SettingsStore"; import {UIFeature} from "../../../settings/UIFeature"; import CountlyAnalytics from "../../../CountlyAnalytics"; import {Room} from "matrix-js-sdk/src/models/room"; +import { MatrixCall } from 'matrix-js-sdk/src/webrtc/call'; // we have a number of types defined from the Matrix spec which can't reasonably be altered here. /* eslint-disable camelcase */ export const KIND_DM = "dm"; export const KIND_INVITE = "invite"; +export const KIND_CALL_TRANSFER = "call_transfer"; const INITIAL_ROOMS_SHOWN = 3; // Number of rooms to show at first const INCREMENT_ROOMS_SHOWN = 5; // Number of rooms to add when 'show more' is clicked @@ -310,6 +312,9 @@ interface IInviteDialogProps { // The room ID this dialog is for. Only required for KIND_INVITE. roomId: string, + // The call to transfer. Only required for KIND_CALL_TRANSFER. + call: MatrixCall, + // Initial value to populate the filter with initialText: string, } @@ -345,6 +350,8 @@ export default class InviteDialog extends React.PureComponent { + this._convertFilter(); + const targets = this._convertFilter(); + const targetIds = targets.map(t => t.userId); + if (targetIds.length > 1) { + this.setState({ + errorText: _t("A call can only be transferred to a single user."), + }); + } + + this.setState({busy: true}); + try { + await this.props.call.transfer(targetIds[0]); + this.setState({busy: false}); + this.props.onFinished(); + } catch (e) { + this.setState({ + busy: false, + errorText: _t("Failed to transfer call"), + }); + } + }; + _onKeyDown = (e) => { if (this.state.busy) return; const value = e.target.value.trim(); @@ -1217,7 +1247,7 @@ export default class InviteDialog extends React.PureComponent 0 diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index eb1d0a632e..5e4452a4bc 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2267,6 +2267,7 @@ "If you've forgotten your recovery key you can ": "If you've forgotten your recovery key you can ", "Resume": "Resume", "Hold": "Hold", + "Transfer": "Transfer", "Reject invitation": "Reject invitation", "Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?", "Unable to reject invite": "Unable to reject invite", From 5aa8650fac441a71cd5e08ee3023c0d1be4a6851 Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 15 Dec 2020 16:27:04 +0000 Subject: [PATCH 014/231] i18n --- src/i18n/strings/en_EN.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 5e4452a4bc..3f05713ffe 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2070,6 +2070,8 @@ "We couldn't create your DM. Please check the users you want to invite and try again.": "We couldn't create your DM. Please check the users you want to invite and try again.", "Something went wrong trying to invite the users.": "Something went wrong trying to invite the users.", "We couldn't invite those users. Please check the users you want to invite and try again.": "We couldn't invite those users. Please check the users you want to invite and try again.", + "A call can only be transferred to a single user.": "A call can only be transferred to a single user.", + "Failed to transfer call": "Failed to transfer call", "Failed to find the following users": "Failed to find the following users", "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s", "Recent Conversations": "Recent Conversations", @@ -2083,6 +2085,7 @@ "Go": "Go", "Invite someone using their name, email address, username (like ) or share this room.": "Invite someone using their name, email address, username (like ) or share this room.", "Invite someone using their name, username (like ) or share this room.": "Invite someone using their name, username (like ) or share this room.", + "Transfer": "Transfer", "a new master key signature": "a new master key signature", "a new cross-signing key signature": "a new cross-signing key signature", "a device cross-signing signature": "a device cross-signing signature", @@ -2267,7 +2270,6 @@ "If you've forgotten your recovery key you can ": "If you've forgotten your recovery key you can ", "Resume": "Resume", "Hold": "Hold", - "Transfer": "Transfer", "Reject invitation": "Reject invitation", "Are you sure you want to reject the invitation?": "Are you sure you want to reject the invitation?", "Unable to reject invite": "Unable to reject invite", From 95f9933a1570d0b34d43c1d24b718f9a1ab017f6 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Wed, 16 Dec 2020 15:42:17 +0000 Subject: [PATCH 015/231] Translated using Weblate (Czech) Currently translated at 97.0% (2631 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 56 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 3f9d231317..2b7241913e 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2751,5 +2751,59 @@ "Unable to query secret storage status": "Nelze zjistit stav úložiště klíčů", "Update %(brand)s": "Aktualizovat %(brand)s", "You can also set up Secure Backup & manage your keys in Settings.": "Zabezpečené zálohování a správu klíčů můžete také nastavit v Nastavení.", - "Set a Security Phrase": "Nastavit bezpečnostní frázi" + "Set a Security Phrase": "Nastavit bezpečnostní frázi", + "Use this when referencing your community to others. The community ID cannot be changed.": "Použijte toto, když odkazujete svou komunitu na ostatní. ID komunity nelze změnit.", + "Please go into as much detail as you like, so we can track down the problem.": "Udejte prosím co nejvíce podrobností, abychom mohli problém vystopovat.", + "Start a conversation with someone using their name or username (like ).": "Začněte konverzaci s někým pomocí jeho jména nebo uživatelského jména (například ).", + "Tell us below how you feel about %(brand)s so far.": "Níže se podělte s vašimi zkušenostmi s %(brand)s.", + "%(senderDisplayName)s set the server ACLs for this room.": "%(senderDisplayName)s", + "What's the name of your community or team?": "Jak se jmenuje vaše komunita nebo tým?", + "Invite someone using their name, username (like ) or share this room.": "Pozvěte někoho pomocí svého jména, uživatelského jména (například ) nebo sdílejte tuto místnost.", + "Confirm by comparing the following with the User Settings in your other session:": "Potvrďte porovnáním následujícího s uživatelským nastavením v jiné relaci:", + "Data on this screen is shared with %(widgetDomain)s": "Data na této obrazovce jsou sdílena s %(widgetDomain)s", + "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Jen upozornění, pokud nepřidáte e-mail a zapomenete heslo, můžete trvale ztratit přístup ke svému účtu.", + "Your area is experiencing difficulties connecting to the internet.": "Ve vaší oblasti dochází k problémům s připojením k internetu.", + "A connection error occurred while trying to contact the server.": "Při pokusu o kontakt se serverem došlo k chybě připojení.", + "The server is not configured to indicate what the problem is (CORS).": "Server není nakonfigurován tak, aby indikoval, v čem je problém (CORS).", + "Recent changes that have not yet been received": "Nedávné změny, které dosud nebyly přijaty", + "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Nelze získat přístup k úložišti klíčů. Ověřte, zda jste zadali správnou přístupovou frázi pro obnovení.", + "Enter your Security Phrase or to continue.": "Pokračujte zadáním bezpečnostní fráze nebo pro pokračování.", + "Restoring keys from backup": "Obnovení klíčů ze zálohy", + "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "Zálohu nebylo možné dešifrovat pomocí této přístupové fráze pro obnovení: ověřte, zda jste zadali správnou přístupovou frázi pro obnovení.", + "%(completed)s of %(total)s keys restored": "Obnoveno %(completed)s z %(total)s klíčů", + "Store your Security Key somewhere safe, like a password manager or a safe, as it’s used to safeguard your encrypted data.": "Uložte bezpečnostní klíč někam na bezpečné místo, například do správce hesel nebo do trezoru, který slouží k ochraně vašich šifrovaných dat.", + "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Váš klíč pro obnovení je bezpečnostní sítí - můžete jej použít k obnovení přístupu k šifrovaným zprávám, pokud zapomenete přístupovou frázi pro obnovení.", + "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Byla zjištěna data ze starší verze %(brand)s. To bude mít za následek nefunkčnost end-to-end kryptografie ve starší verzi. End-to-end šifrované zprávy vyměněné nedávno při používání starší verze nemusí být v této verzi dešifrovatelné. To může také způsobit selhání zpráv vyměňovaných s touto verzí. Pokud narazíte na problémy, odhlaste se a znovu se přihlaste. Chcete-li zachovat historii zpráv, exportujte a znovu importujte klíče.", + "Failed to find the general chat for this community": "Nepodařilo se najít obecný chat pro tuto komunitu", + "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Na náš server uložíme zašifrovanou kopii vašich klíčů. Zabezpečte zálohu pomocí přístupové fráze pro obnovení.", + "Enter your recovery passphrase a second time to confirm it.": "Zadejte podruhé přístupovou frázi pro obnovení a potvrďte ji.", + "If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "Pokud nyní nebudete pokračovat, můžete ztratit šifrované zprávy a data, pokud ztratíte přístup ke svým přihlašovacím údajům.", + "Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their avatar.": "Zprávy v této místnosti jsou šifrovány end-to-end. Když se lidé připojí, můžete je ověřit v jejich profilu, stačí klepnout na jejich avatara.", + "Revoke permissions": "Odvolat oprávnění", + "Continuing without email": "Pokračuje se bez e-mailu", + "You can change this later if needed.": "V případě potřeby to můžete později změnit.", + "Video conference started by %(senderName)s": "Videokonferenci byla zahájena uživatelem %(senderName)s", + "Video conference updated by %(senderName)s": "Videokonference byla aktualizována uživatelem %(senderName)s", + "Video conference ended by %(senderName)s": "Videokonference byla ukončena uživatelem %(senderName)s", + "Unpin": "Odepnout", + "Fill Screen": "Vyplnit obrazovku", + "Voice Call": "Hlasový hovor", + "Video Call": "Videohovor", + "%(senderName)s ended the call": "Uživatel %(senderName)s ukončil hovor", + "You ended the call": "Ukončili jste hovor", + "New version of %(brand)s is available": "K dispozici je nová verze %(brand)s", + "Error leaving room": "Při opouštění místnosti došlo k chybě", + "See messages posted to your active room": "Zobrazit zprávy odeslané do vaší aktivní místnosti", + "See messages posted to this room": "Zobrazit zprávy odeslané do této místnosti", + "See when the avatar changes in your active room": "Podívejte se, kdy se změní avatar ve vaší aktivní místnosti", + "Change the avatar of your active room": "Změňte avatar vaší aktivní místnosti", + "See when the avatar changes in this room": "Podívejte se, kdy se změní avatar v této místnosti", + "Change the avatar of this room": "Změňte avatar této místnosti", + "See when the name changes in your active room": "Podívejte se, kdy se ve vaší aktivní místnosti změní název", + "Change the name of your active room": "Změňte název své aktivní místnosti", + "Change the name of this room": "Změňte název této místnosti", + "A browser extension is preventing the request.": "Rozšíření prohlížeče brání požadavku.", + "Your firewall or anti-virus is blocking the request.": "Váš firewall nebo antivirový program blokuje požadavek.", + "The server (%(serverName)s) took too long to respond.": "Serveru (%(serverName)s) trvalo příliš dlouho, než odpověděl.", + "Your server isn't responding to some of your requests. Below are some of the most likely reasons.": "Váš server neodpovídá na některé vaše požadavky. Níže jsou některé z nejpravděpodobnějších důvodů." } From 263421a471c0dfbe1ee2b03f0780c45fde19b74a Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Thu, 17 Dec 2020 05:55:08 +0000 Subject: [PATCH 016/231] Translated using Weblate (Czech) Currently translated at 97.3% (2638 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 2b7241913e..d173956a23 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2180,7 +2180,7 @@ "%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s", "%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s", "Change notification settings": "Upravit nastavení oznámení", - "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Prototyp komunit verze 2. Vyžaduje kompatibilní domovský server. Experimentální - používejte opatrně.", + "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Prototyp skupin verze 2. Vyžaduje kompatibilní domovský server. Experimentální - používejte opatrně.", "Use custom size": "Použít vlastní velikost", "Use a more compact ‘Modern’ layout": "Používat kompaktní ‘Moderní’ vzhled", "Use a system font": "Používat systémové nastavení písma", @@ -2251,7 +2251,7 @@ "Feedback": "Zpětná vazba", "Feedback sent": "Zpětná vazba byla odeslána", "Security & privacy": "Zabezpečení", - "All settings": "Nastavení", + "All settings": "Všechna nastavení", "Start a conversation with someone using their name, email address or username (like ).": "Napište jméno nebo emailovou adresu uživatele se kterým chcete začít konverzaci (např. ).", "Start a new chat": "Založit nový chat", "Which officially provided instance you are using, if any": "Kterou oficiální instanci Riot.im používáte (a jestli vůbec)", @@ -2326,13 +2326,13 @@ "Upload a file": "Nahrát soubor", "You've reached the maximum number of simultaneous calls.": "Dosáhli jste maximálního počtu souběžných hovorů.", "Too Many Calls": "Přiliš mnoho hovorů", - "Community and user menu": "Nabídka komunity a uživatele", + "Community and user menu": "Nabídka skupiny a uživatele", "User menu": "Uživatelská nabídka", "Switch theme": "Přepnout téma", "Switch to dark mode": "Přepnout do tmavého režimu", "Switch to light mode": "Přepnout do světlého režimu", "User settings": "Uživatelská nastavení", - "Community settings": "Nastavení komunity", + "Community settings": "Nastavení skupiny", "Confirm your recovery passphrase": "Potvrďte vaši frázi pro obnovení", "Repeat your recovery passphrase...": "Opakujte přístupovou frázi pro obnovení...", "Please enter your recovery passphrase a second time to confirm.": "Potvrďte prosím podruhé svou frázi pro obnovení.", @@ -2357,8 +2357,8 @@ "Delete the room address %(alias)s and remove %(name)s from the directory?": "Smazat adresu místnosti %(alias)s a odebrat %(name)s z adresáře?", "Self-verification request": "Požadavek na sebeověření", "%(creator)s created this DM.": "%(creator)s vytvořil tuto přímou zprávu.", - "You do not have permission to create rooms in this community.": "Nemáte oprávnění k vytváření místností v této komunitě.", - "Cannot create rooms in this community": "V této komunitě nelze vytvořit místnosti", + "You do not have permission to create rooms in this community.": "Nemáte oprávnění k vytváření místností v této skupině.", + "Cannot create rooms in this community": "V této skupině nelze vytvořit místnosti", "Great, that'll help people know it's you": "Skvělé, to pomůže lidem zjistit, že jste to vy", "Add a photo so people know it's you.": "Přidejte fotku, aby lidé věděli, že jste to vy.", "Explore Public Rooms": "Prozkoumat veřejné místnosti", @@ -2399,10 +2399,10 @@ "Invite by email": "Pozvat emailem", "Comment": "Komentář", "Add comment": "Přidat komentář", - "Update community": "Aktualizovat komunitu", + "Update community": "Aktualizovat skupinu", "Create a room in %(communityName)s": "Vytvořit místnost v %(communityName)s", "Your server requires encryption to be enabled in private rooms.": "Váš server vyžaduje povolení šifrování v soukromých místnostech.", - "An image will help people identify your community.": "Obrázek pomůže lidem identifikovat vaši komunitu.", + "An image will help people identify your community.": "Obrázek pomůže lidem identifikovat vaši skupinu.", "Invite people to join %(communityName)s": "Pozvat lidi do %(communityName)s", "Send %(count)s invites|one": "Poslat %(count)s pozvánku", "Send %(count)s invites|other": "Poslat %(count)s pozvánek", @@ -2421,7 +2421,7 @@ "Use email to optionally be discoverable by existing contacts.": "Pomocí e-mailu můžete být volitelně viditelní pro existující kontakty.", "Use email or phone to optionally be discoverable by existing contacts.": "Použijte e-mail nebo telefon, abyste byli volitelně viditelní pro stávající kontakty.", "Sign in with SSO": "Přihlásit pomocí SSO", - "Create community": "Vytvořit komunitu", + "Create community": "Vytvořit skupinu", "Add an email to be able to reset your password.": "Přidejte email, abyste mohli obnovit své heslo.", "That phone number doesn't look quite right, please check and try again": "Toto telefonní číslo nevypadá úplně správně, zkontrolujte ho a zkuste to znovu", "Forgot password?": "Zapomenuté heslo?", @@ -2435,7 +2435,7 @@ "Successfully restored %(sessionCount)s keys": "Úspěšně obnoveno %(sessionCount)s klíčů", "Keys restored": "Klíče byly obnoveny", "You're all caught up.": "Vše vyřízeno.", - "There was an error updating your community. The server is unable to process your request.": "Při aktualizaci komunity došlo k chybě. Server nemůže zpracovat váš požadavek.", + "There was an error updating your community. The server is unable to process your request.": "Při aktualizaci skupiny došlo k chybě. Server nemůže zpracovat váš požadavek.", "There are two ways you can provide feedback and help us improve %(brand)s.": "Jsou dva způsoby, jak můžete poskytnout zpětnou vazbu a pomoci nám vylepšit %(brand)s.", "Rate %(brand)s": "Ohodnotit %(brand)s", "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.": "V této relaci jste již dříve používali novější verzi %(brand)s. Chcete-li tuto verzi znovu použít s šifrováním, budete se muset odhlásit a znovu přihlásit.", @@ -2446,7 +2446,7 @@ "This version of %(brand)s does not support searching encrypted messages": "Tato verze %(brand)s nepodporuje hledání v šifrovaných zprávách", "Information": "Informace", "%(count)s results|one": "%(count)s výsledek", - "Explore community rooms": "Prozkoumat místnosti komunity", + "Explore community rooms": "Prozkoumat místnosti skupin", "Role": "Role", "Madagascar": "Madagaskar", "Macedonia": "Makedonie", @@ -2752,12 +2752,12 @@ "Update %(brand)s": "Aktualizovat %(brand)s", "You can also set up Secure Backup & manage your keys in Settings.": "Zabezpečené zálohování a správu klíčů můžete také nastavit v Nastavení.", "Set a Security Phrase": "Nastavit bezpečnostní frázi", - "Use this when referencing your community to others. The community ID cannot be changed.": "Použijte toto, když odkazujete svou komunitu na ostatní. ID komunity nelze změnit.", + "Use this when referencing your community to others. The community ID cannot be changed.": "Použijte toto, když odkazujete svou skupinu na ostatní. ID skupiny nelze změnit.", "Please go into as much detail as you like, so we can track down the problem.": "Udejte prosím co nejvíce podrobností, abychom mohli problém vystopovat.", "Start a conversation with someone using their name or username (like ).": "Začněte konverzaci s někým pomocí jeho jména nebo uživatelského jména (například ).", "Tell us below how you feel about %(brand)s so far.": "Níže se podělte s vašimi zkušenostmi s %(brand)s.", - "%(senderDisplayName)s set the server ACLs for this room.": "%(senderDisplayName)s", - "What's the name of your community or team?": "Jak se jmenuje vaše komunita nebo tým?", + "%(senderDisplayName)s set the server ACLs for this room.": "", + "What's the name of your community or team?": "Jak se jmenuje vaše skupina nebo tým?", "Invite someone using their name, username (like ) or share this room.": "Pozvěte někoho pomocí svého jména, uživatelského jména (například ) nebo sdílejte tuto místnost.", "Confirm by comparing the following with the User Settings in your other session:": "Potvrďte porovnáním následujícího s uživatelským nastavením v jiné relaci:", "Data on this screen is shared with %(widgetDomain)s": "Data na této obrazovce jsou sdílena s %(widgetDomain)s", @@ -2774,7 +2774,7 @@ "Store your Security Key somewhere safe, like a password manager or a safe, as it’s used to safeguard your encrypted data.": "Uložte bezpečnostní klíč někam na bezpečné místo, například do správce hesel nebo do trezoru, který slouží k ochraně vašich šifrovaných dat.", "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Váš klíč pro obnovení je bezpečnostní sítí - můžete jej použít k obnovení přístupu k šifrovaným zprávám, pokud zapomenete přístupovou frázi pro obnovení.", "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Byla zjištěna data ze starší verze %(brand)s. To bude mít za následek nefunkčnost end-to-end kryptografie ve starší verzi. End-to-end šifrované zprávy vyměněné nedávno při používání starší verze nemusí být v této verzi dešifrovatelné. To může také způsobit selhání zpráv vyměňovaných s touto verzí. Pokud narazíte na problémy, odhlaste se a znovu se přihlaste. Chcete-li zachovat historii zpráv, exportujte a znovu importujte klíče.", - "Failed to find the general chat for this community": "Nepodařilo se najít obecný chat pro tuto komunitu", + "Failed to find the general chat for this community": "Nepodařilo se najít obecný chat pro tuto skupinu", "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "Na náš server uložíme zašifrovanou kopii vašich klíčů. Zabezpečte zálohu pomocí přístupové fráze pro obnovení.", "Enter your recovery passphrase a second time to confirm it.": "Zadejte podruhé přístupovou frázi pro obnovení a potvrďte ji.", "If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "Pokud nyní nebudete pokračovat, můžete ztratit šifrované zprávy a data, pokud ztratíte přístup ke svým přihlašovacím údajům.", @@ -2805,5 +2805,13 @@ "A browser extension is preventing the request.": "Rozšíření prohlížeče brání požadavku.", "Your firewall or anti-virus is blocking the request.": "Váš firewall nebo antivirový program blokuje požadavek.", "The server (%(serverName)s) took too long to respond.": "Serveru (%(serverName)s) trvalo příliš dlouho, než odpověděl.", - "Your server isn't responding to some of your requests. Below are some of the most likely reasons.": "Váš server neodpovídá na některé vaše požadavky. Níže jsou některé z nejpravděpodobnějších důvodů." + "Your server isn't responding to some of your requests. Below are some of the most likely reasons.": "Váš server neodpovídá na některé vaše požadavky. Níže jsou některé z nejpravděpodobnějších důvodů.", + "

        HTML for your community's page

        \n

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

        \n

        \n You can even add images with Matrix URLs \n

        \n": "

        HTML pro vaši stránku skupiny

        \n

        \n Pomocí popisu můžete představit nové členy skupiny nebo distribuovat\n některé důležité odkazy\n

        \n

        \n Můžete dokonce přidat obrázky pomocí Matrix URL \n

        \n", + "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Soukromé místnosti lze najít a připojit se do nich pouze na pozvání. Veřejné místnosti může najít a připojit se do nich kdokoli v této skupině.", + "Community ID: +:%(domain)s": "ID skupiny: +:%(domain)s", + "The operation could not be completed": "Operace nemohla být dokončena", + "Failed to save your profile": "Váš profil se nepodařilo uložit", + "%(peerName)s held the call": "%(peerName)s podržel hovor", + "You held the call Resume": "Podrželi jste hovor Pokračovat", + "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use Element with an existing Matrix account on a different homeserver.": "Můžete použít vlastní volbu serveru a přihlásit se k jiným Matrix serverům zadáním adresy URL domovského serveru. To vám umožní používat Element s existujícím Matrix účtem na jiném domovském serveru." } From 5a4fbbbdc4a6dd8b2860a1e1f02d9cefcaf8ebdf Mon Sep 17 00:00:00 2001 From: Iraklis Karagkiozoglou Date: Wed, 16 Dec 2020 17:53:12 +0000 Subject: [PATCH 017/231] Translated using Weblate (Greek) Currently translated at 19.9% (542 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/el/ --- src/i18n/strings/el.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/el.json b/src/i18n/strings/el.json index 118c87e153..398d83f3fe 100644 --- a/src/i18n/strings/el.json +++ b/src/i18n/strings/el.json @@ -604,5 +604,9 @@ "Sets the room name": "Θέτει το θέμα του δωματίου", "Use an identity server": "Χρησιμοποιήστε ένα διακομιστή ταυτοτήτων", "Your %(brand)s is misconfigured": "Οι παράμετροι του %(brand)s σας είναι λανθασμένα ρυθμισμένοι", - "Explore rooms": "Εξερευνήστε δωμάτια" + "Explore rooms": "Εξερευνήστε δωμάτια", + "Whether you're using %(brand)s as an installed Progressive Web App": "Εάν χρησιμοπιείται %(brand)s σαν εγκατεστημένο Progressive Web App", + "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Ενα χρησιμοποιείται το %(brand)s σε συσκευή αφής", + "Click the button below to confirm adding this phone number.": "Πιέστε το κουμπί από κάτω για να επιβεβαίωσετε την προσθήκη του τηλεφωνικού αριθμού.", + "Confirm": "Επιβεβαίωση" } From 0be21df1d0471f2ea9853b7e6c691ddebf80f0d8 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Thu, 17 Dec 2020 02:19:05 +0000 Subject: [PATCH 018/231] Translated using Weblate (Ukrainian) Currently translated at 54.1% (1467 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 061c0799ac..8a770989b0 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -335,7 +335,7 @@ "%(targetName)s joined the room.": "%(targetName)s приєднується до кімнати.", "VoIP conference finished.": "Дзвінок-конференцію завершено.", "%(targetName)s rejected the invitation.": "%(targetName)s відкинув/ла запрошення.", - "%(targetName)s left the room.": "%(targetName)s залишив/ла кімнату.", + "%(targetName)s left the room.": "%(targetName)s залишає кімнату.", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s розблокував/ла %(targetName)s.", "%(senderName)s kicked %(targetName)s.": "%(senderName)s викинув/ла %(targetName)s.", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s відкликав/ла запрошення %(targetName)s.", @@ -1536,5 +1536,19 @@ "Capitalization doesn't help very much": "Великі букви не дуже допомагають", "You're all caught up.": "Все готово.", "Hey you. You're the best!": "Гей, ти, так, ти. Ти найкращий!", - "You’re all caught up": "Все готово" + "You’re all caught up": "Все готово", + "%(senderName)s declined the call.": "%(senderName)s відхиляє виклик.", + "(an error occurred)": "(сталася помилка)", + "(their device couldn't start the camera / microphone)": "(їхній пристрій не зміг запустити камеру / мікрофон)", + "(connection failed)": "(не вдалося з'єднатися)", + "🎉 All servers are banned from participating! This room can no longer be used.": "🎉 Всім серверам заборонено доступ до кімнати! Нею більше не можна користуватися.", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Збій виклику, оскільки не вдалося отримати доступ до мікрофона. Переконайтеся, що мікрофон під'єднано та налаштовано правильно.", + "Effects": "Ефекти", + "You've reached the maximum number of simultaneous calls.": "Ви досягли максимальної кількості одночасних викликів.", + "Too Many Calls": "Забагато викликів", + "No other application is using the webcam": "Жодна інша програма не використовує вебкамеру", + "Permission is granted to use the webcam": "Використання вебкамери дозволено", + "A microphone and webcam are plugged in and set up correctly": "Мікрофон і вебкамера під'єднані та налаштовані правильно", + "Call failed because webcam or microphone could not be accessed. Check that:": "Збій виклику, оскільки не вдалося отримати доступ до вебкамери або мікрофона. Перевірте, що:", + "Unable to access webcam / microphone": "Не вдається отримати доступ до вебкамери / мікрофона" } From 2dba54754a240a73a35a6073308d0bb7902a38af Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Thu, 17 Dec 2020 07:02:13 +0000 Subject: [PATCH 019/231] Translated using Weblate (Czech) Currently translated at 97.3% (2638 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index d173956a23..a19d55e17a 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1263,7 +1263,7 @@ "You can still join it because this is a public room.": "I přesto můžete vstoupit, protože tato místnost je veřejná.", "Join the discussion": "Zapojit se do diskuze", "Try to join anyway": "Stejně se pokusit vstoupit", - "Do you want to chat with %(user)s?": "Chcete si povídat s uživatelem %(user)s?", + "Do you want to chat with %(user)s?": "Chcete si povídat s %(user)s?", "Do you want to join %(roomName)s?": "Chcete vstoupit do místnosti %(roomName)s?", " invited you": "Uživatel vás pozval", "You're previewing %(roomName)s. Want to join it?": "Nahlížíte do místnosti %(roomName)s. Chcete do ní vstoupit?", @@ -2253,7 +2253,7 @@ "Security & privacy": "Zabezpečení", "All settings": "Všechna nastavení", "Start a conversation with someone using their name, email address or username (like ).": "Napište jméno nebo emailovou adresu uživatele se kterým chcete začít konverzaci (např. ).", - "Start a new chat": "Založit nový chat", + "Start a new chat": "Založit novou konverzaci", "Which officially provided instance you are using, if any": "Kterou oficiální instanci Riot.im používáte (a jestli vůbec)", "Change the topic of this room": "Změnit téma této místnosti", "%(senderName)s declined the call.": "%(senderName)s odmítl/a hovor.", @@ -2392,7 +2392,7 @@ "Set up Secure Backup": "Nastavení zabezpečené zálohy", "Safeguard against losing access to encrypted messages & data by backing up encryption keys on your server.": "Chraňte se před ztrátou přístupu k šifrovaným zprávám a datům zálohováním šifrovacích klíčů na serveru.", "Safeguard against losing access to encrypted messages & data": "Zabezpečení proti ztrátě přístupu k šifrovaným zprávám a datům", - "This is the beginning of your direct message history with .": "Toto je začátek historie vašich přímých zpráv s uživatelem .", + "This is the beginning of your direct message history with .": "Toto je začátek historie vašich přímých zpráv s .", "Only the two of you are in this conversation, unless either of you invites anyone to join.": "V této konverzaci jste pouze vy dva, dokud někdo z vás nepozve někoho dalšího.", "You created this room.": "Vytvořili jste tuto místnost.", "Add a topic to help people know what it is about.": "Přidejte téma, aby lidé věděli, o co jde.", From 003f43b31b8143d81923629486fc5cb0d359235e Mon Sep 17 00:00:00 2001 From: Tuomas Hietala Date: Wed, 16 Dec 2020 17:48:13 +0000 Subject: [PATCH 020/231] Translated using Weblate (Finnish) Currently translated at 92.9% (2520 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fi/ --- src/i18n/strings/fi.json | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 842ee436b6..3de62ab492 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -2706,5 +2706,32 @@ "Favourited": "Suositut", "Use the + to make a new room or explore existing ones below": "Luo uusi huone tai tutustu alla oleviin + -painikeella", "%(senderDisplayName)s set the server ACLs for this room.": "%(senderDisplayName)s asetti palvelimen pääsyhallintaluetteloon tämän huoneen.", - "%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s muutti palvelimen pääsyhallintaluetteloa tälle huoneelle." + "%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s muutti palvelimen pääsyhallintaluetteloa tälle huoneelle.", + "Expand room list section": "Laajenna huoneluettelon osa", + "Collapse room list section": "Supista huoneluettelon osa", + "Use a different passphrase?": "Käytä eri salalausetta?", + "Already have an account? Sign in here": "Onko sinulla jo tili? Kirjaudu tästä", + "There was a problem communicating with the homeserver, please try again later.": "Yhteydessä kotipalvelimeen ilmeni ongelma, yritä myöhemmin uudelleen.", + "This widget would like to:": "Tämä sovelma haluaa:", + "Learn more": "Lue lisää", + "Other homeserver": "Muu kotipalvelin", + "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org on maailman suurin kotipalvelin, joten se on hyvä paikka monille.", + "Specify a homeserver": "Määritä kotipalvelin", + "The server has denied your request.": "Palvelin eväsi pyyntösi.", + "Just a heads up, if you don't add an email and forget your password, you could permanently lose access to your account.": "Huomio: jos et lisää sähköpostia ja unohdat salasanasi, saatat menettää pääsyn tiliisi pysyvästi.", + "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Yksityiset huoneet ovat löydettävissä ja liityttävissä vain kutsulla. Julkiset huoneet ovat kenen tahansa tämän yhteisön jäsenen löydettävissä ja liityttävissä.", + "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Yksityiset huoneet ovat löydettävissä ja liityttävissä vain kutsulla. Julkiset huoneet ovat kenen tahansa löydettävissä ja liityttävissä.", + "Homeserver": "Kotipalvelin", + "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Palvelimesi ylläpitäjä on poistanut päästä päähän -salauksen oletuksena käytöstä yksityisissä huoneissa ja yksityisviesteissä.", + "%(peerName)s held the call": "%(peerName)s piti puhelua pidossa", + "Send general files as you in your active room": "Lähetä aktiiviseen huoneeseesi yleisiä tiedostoja itsenäsi", + "Send general files as you in this room": "Lähetä tähän huoneeseen yleisiä tiedostoja itsenäsi", + "Send videos as you in your active room": "Lähetä aktiiviseen huoneeseesi videoita itsenäsi", + "Send videos as you in this room": "Lähetä tähän huoneeseen videoita itsenäsi", + "Send images as you in your active room": "Lähetä aktiiviseen huoneeseesi kuvia itsenäsi", + "Send images as you in this room": "Lähetä tähän huoneeseen kuvia itsenäsi", + "Send text messages as you in your active room": "Lähetä aktiiviseen huoneeseesi tekstiviestejä itsenäsi", + "Send text messages as you in this room": "Lähetä tähän huoneeseen tekstiviestejä itsenäsi", + "Send messages as you in your active room": "Lähetä aktiiviseen huoneeseesi viestejä itsenäsi", + "Send messages as you in this room": "Lähetä tähän huoneeseen viestejä itsenäsi" } From a85ff645b5368bc321804efee41cc8a90aa67f94 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Thu, 17 Dec 2020 11:42:32 +0000 Subject: [PATCH 021/231] Translated using Weblate (Czech) Currently translated at 97.7% (2649 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index a19d55e17a..74abd72fc0 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2813,5 +2813,16 @@ "Failed to save your profile": "Váš profil se nepodařilo uložit", "%(peerName)s held the call": "%(peerName)s podržel hovor", "You held the call Resume": "Podrželi jste hovor Pokračovat", - "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use Element with an existing Matrix account on a different homeserver.": "Můžete použít vlastní volbu serveru a přihlásit se k jiným Matrix serverům zadáním adresy URL domovského serveru. To vám umožní používat Element s existujícím Matrix účtem na jiném domovském serveru." + "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use Element with an existing Matrix account on a different homeserver.": "Můžete použít vlastní volbu serveru a přihlásit se k jiným Matrix serverům zadáním adresy URL domovského serveru. To vám umožní používat Element s existujícím Matrix účtem na jiném domovském serveru.", + "Unpin a widget to view it in this panel": "Odepněte widget, aby mohl být zobrazen v tomto panelu", + "You can only pin up to %(count)s widgets|other": "Můžete připnout až %(count)s widgetů", + "Edit widgets, bridges & bots": "Upravujte widgety, mosty a boty", + "a device cross-signing signature": "zařízení používající cross-signing podpis", + "This widget would like to:": "Tento widget by chtěl:", + "Modal Widget": "Modální widget", + "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.": "Toto můžete deaktivovat, pokud bude místnost použita pro spolupráci s externími týmy, které mají svůj vlastní domovský server. Toto nelze později změnit.", + "Join the conference from the room information card on the right": "Připojte se ke konferenci z informační karty místnosti napravo", + "Join the conference at the top of this room": "Připojte se ke konferenci v horní části této místnosti", + "There are advanced notifications which are not shown here.": "Existují pokročilá oznámení, která se zde nezobrazují.", + "Enable advanced debugging for the room list": "Povolit pokročilé ladění pro seznam místností" } From 6f4db2aa1d189966b483cdcb0ee3c127375be511 Mon Sep 17 00:00:00 2001 From: Mitja Sorsa Date: Thu, 17 Dec 2020 11:57:43 +0000 Subject: [PATCH 022/231] Translated using Weblate (Finnish) Currently translated at 93.1% (2525 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fi/ --- src/i18n/strings/fi.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 3de62ab492..293117c65c 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -2733,5 +2733,10 @@ "Send text messages as you in your active room": "Lähetä aktiiviseen huoneeseesi tekstiviestejä itsenäsi", "Send text messages as you in this room": "Lähetä tähän huoneeseen tekstiviestejä itsenäsi", "Send messages as you in your active room": "Lähetä aktiiviseen huoneeseesi viestejä itsenäsi", - "Send messages as you in this room": "Lähetä tähän huoneeseen viestejä itsenäsi" + "Send messages as you in this room": "Lähetä tähän huoneeseen viestejä itsenäsi", + "Show message previews for reactions in DMs": "Näytä reaktioille esikatselu yksityisviesteissä", + "Show message previews for reactions in all rooms": "Näytä reaktioille esikatselu kaikissa huoneissa", + "New spinner design": "Uusi kehrääjä tyyli", + "Render LaTeX maths in messages": "Suorita LaTeX-matematiikkaa viesteissä", + "* %(senderName)s %(emote)s": "* %(senderName)s %(emote)s" } From 2f22b021db0872d2c00e3351c9dfda74c155c666 Mon Sep 17 00:00:00 2001 From: Mitja Sorsa Date: Thu, 17 Dec 2020 12:13:38 +0000 Subject: [PATCH 023/231] Translated using Weblate (Finnish) Currently translated at 93.2% (2529 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fi/ --- src/i18n/strings/fi.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 293117c65c..acaffed4ae 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -2738,5 +2738,9 @@ "Show message previews for reactions in all rooms": "Näytä reaktioille esikatselu kaikissa huoneissa", "New spinner design": "Uusi kehrääjä tyyli", "Render LaTeX maths in messages": "Suorita LaTeX-matematiikkaa viesteissä", - "* %(senderName)s %(emote)s": "* %(senderName)s %(emote)s" + "* %(senderName)s %(emote)s": "* %(senderName)s %(emote)s", + "Downloading logs": "Ladataan lokeja", + "Uploading logs": "Lähetetään lokeja", + "Show chat effects": "Näytä keskustelutehosteet", + "Enable advanced debugging for the room list": "Ota huoneluettelon edistynyt virheenkorjaus käyttöön" } From d1ab11a3f7965bcc72a7998cf3bec3acef111509 Mon Sep 17 00:00:00 2001 From: Mitja Sorsa Date: Thu, 17 Dec 2020 16:57:22 +0000 Subject: [PATCH 024/231] Translated using Weblate (Finnish) Currently translated at 94.6% (2567 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fi/ --- src/i18n/strings/fi.json | 42 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index acaffed4ae..6ef98ace9d 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -2742,5 +2742,45 @@ "Downloading logs": "Ladataan lokeja", "Uploading logs": "Lähetetään lokeja", "Show chat effects": "Näytä keskustelutehosteet", - "Enable advanced debugging for the room list": "Ota huoneluettelon edistynyt virheenkorjaus käyttöön" + "Enable advanced debugging for the room list": "Ota huoneluettelon edistynyt virheenkorjaus käyttöön", + "A connection error occurred while trying to contact the server.": "Yhteysvirhe yritettäessä ottaa yhteyttä palvelimeen.", + "The %(capability)s capability": "%(capability)s-ominaisuus", + "See when the avatar changes in this room": "Katso, milloin nimi vaihtuu tässä huoneessa", + "See when the name changes in your active room": "Katso, milloin nimi muuttuu aktiivisessa huoneessa", + "If disabled, messages from encrypted rooms won't appear in search results.": "Jos ei ole käytössä, salattujen huoneiden viestejä ei näytetä hakutuloksissa.", + "Jump to start/end of the composer": "Siirry kirjoittimen alkuun/loppuun", + "Dismiss read marker and jump to bottom": "Hylkää lukumerkki ja hyppää pohjaan", + "Toggle the top left menu": "Vaihda vasemman yläkulman valikkoa", + "New? Create account": "Uusi? Luo tili", + "Continuing without email": "Jatka ilman sähköpostia", + "Invite by email": "Kutsu sähköpostilla", + "Report a bug": "Raportoi virheestä", + "Invalid Recovery Key": "Virheellinen palautusavain", + "Confirm Security Phrase": "Vahvista turvalauseke", + "Upload a file": "Lähetä tiedosto", + "Confirm encryption setup": "Vahvista salauksen asetukset", + "Verify other session": "Vahvista toinen istunto", + "Confirm account deactivation": "Vahvista tilin deaktivointi", + "Toggle right panel": "Vaihda oikea paneeli", + "Navigate composer history": "Selaa kirjoittimen historiaa", + "a key signature": "avaimen allekirjoitus", + "Homeserver feature support:": "Kotipalvelimen ominaisuuksien tuki:", + "Create key backup": "Luo avaimen varmuuskopio", + "Recovery key mismatch": "Palautusavain ei täsmää", + "%(name)s paused": "%(name)s keskeytetty", + "Invalid URL": "Virheellinen URL", + "Reason (optional)": "Syy (valinnainen)", + "Fill Screen": "Täytä näyttö", + "Send feedback": "Lähetä palautetta", + "Rate %(brand)s": "Arvioi %(brand)s", + "%(brand)s Desktop": "%(brand)s Desktop", + "%(brand)s Web": "%(brand)s Web", + "Security Phrase": "Turvalauseke", + "Security Key": "Turva-avain", + "Verify session": "Vahvista istunto", + "Hold": "Pidä", + "Resume": "Jatka", + "Comment": "Kommentti", + "Navigation": "Navigointi", + "Manage": "Hallitse" } From df7a2db3b9f01d01ec65073dfd032824b6d165e7 Mon Sep 17 00:00:00 2001 From: Ezwen Date: Thu, 17 Dec 2020 14:18:22 +0000 Subject: [PATCH 025/231] Translated using Weblate (French) Currently translated at 85.0% (2307 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index efae1f7b26..350d59a30e 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2545,5 +2545,6 @@ "You might enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later.": "Vous devriez l'activer si le salon n'est utilisé que pour collaborer avec des équipes internes sur votre serveur d'accueil. Ce ne peut pas être changé plus tard.", "Your server requires encryption to be enabled in private rooms.": "Votre serveur requiert d'activer le chiffrement dans les salons privés.", "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Les salons privés ne peuvent être trouvés et rejoints seulement par invitation. Les salons publics peut être trouvés et rejoints par n'importe qui dans cette communauté.", - "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Les salons privés ne peuvent être trouvés et rejoints seulement par invitation. Les salons publics peut être trouvés et rejoints par n'importe qui." + "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Les salons privés ne peuvent être trouvés et rejoints seulement par invitation. Les salons publics peut être trouvés et rejoints par n'importe qui.", + "Start a new chat": "Commencer une nouvelle discussion" } From c7381c1eebc2fc055e99f9c8c0c10b8a3b0cf28e Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Thu, 17 Dec 2020 18:37:45 +0000 Subject: [PATCH 026/231] Translated using Weblate (Czech) Currently translated at 97.7% (2649 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 74abd72fc0..752720d87a 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2392,7 +2392,7 @@ "Set up Secure Backup": "Nastavení zabezpečené zálohy", "Safeguard against losing access to encrypted messages & data by backing up encryption keys on your server.": "Chraňte se před ztrátou přístupu k šifrovaným zprávám a datům zálohováním šifrovacích klíčů na serveru.", "Safeguard against losing access to encrypted messages & data": "Zabezpečení proti ztrátě přístupu k šifrovaným zprávám a datům", - "This is the beginning of your direct message history with .": "Toto je začátek historie vašich přímých zpráv s .", + "This is the beginning of your direct message history with .": "Toto je začátek historie vašich přímých zpráv s uživatelem .", "Only the two of you are in this conversation, unless either of you invites anyone to join.": "V této konverzaci jste pouze vy dva, dokud někdo z vás nepozve někoho dalšího.", "You created this room.": "Vytvořili jste tuto místnost.", "Add a topic to help people know what it is about.": "Přidejte téma, aby lidé věděli, o co jde.", From babb25b1ac786132ae780de763ce05b83e31c03d Mon Sep 17 00:00:00 2001 From: Mitja Sorsa Date: Thu, 17 Dec 2020 18:27:26 +0000 Subject: [PATCH 027/231] Translated using Weblate (Finnish) Currently translated at 94.7% (2568 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fi/ --- src/i18n/strings/fi.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 6ef98ace9d..70c6215bd8 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -2782,5 +2782,6 @@ "Resume": "Jatka", "Comment": "Kommentti", "Navigation": "Navigointi", - "Manage": "Hallitse" + "Manage": "Hallitse", + "Remain on your screen when viewing another room, when running": "Pysy ruudulla katsellessasi huonetta, kun se on käynissä" } From ad32f90beb8b2f8beebb4b547fd97ba6335b1fa6 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 17 Dec 2020 13:09:35 +0000 Subject: [PATCH 028/231] Stop building at local install time This speeds up local development and CI runs by skipping build steps by default. They will now only run when just before publishing. Related to https://github.com/matrix-org/matrix-js-sdk/pull/1552 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b328823b24..b30b430a62 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "typings": "./lib/index.d.ts", "matrix_src_main": "./src/index.js", "scripts": { - "prepare": "yarn build", + "prepublishOnly": "yarn build", "i18n": "matrix-gen-i18n", "prunei18n": "matrix-prune-i18n", "diff-i18n": "cp src/i18n/strings/en_EN.json src/i18n/strings/en_EN_orig.json && ./scripts/gen-i18n.js && node scripts/compare-file.js src/i18n/strings/en_EN_orig.json src/i18n/strings/en_EN.json", From 3d3490c6d7a771eae9008cdc77e9a07b3dbb1a69 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 17 Dec 2020 15:36:32 +0000 Subject: [PATCH 029/231] For cloned deps, we only need to build types --- scripts/ci/install-deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/ci/install-deps.sh b/scripts/ci/install-deps.sh index 14b5fc5393..8a6f7489a0 100755 --- a/scripts/ci/install-deps.sh +++ b/scripts/ci/install-deps.sh @@ -7,7 +7,7 @@ scripts/fetchdep.sh matrix-org matrix-js-sdk pushd matrix-js-sdk yarn link yarn install $@ -yarn build +yarn build:types popd yarn link matrix-js-sdk From 19cfe44b16d20275abaa8298704dc41d056af76c Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 17 Dec 2020 15:46:32 +0000 Subject: [PATCH 030/231] Types from dependencies are now built explicitly --- scripts/ci/layered.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/ci/layered.sh b/scripts/ci/layered.sh index 306f9c9974..78a490f7a8 100755 --- a/scripts/ci/layered.sh +++ b/scripts/ci/layered.sh @@ -14,12 +14,14 @@ scripts/fetchdep.sh matrix-org matrix-js-sdk pushd matrix-js-sdk yarn link yarn install +yarn build:types popd # Now set up the react-sdk yarn link matrix-js-sdk yarn link yarn install +yarn build:types # Finally, set up element-web scripts/fetchdep.sh vector-im element-web From b22c28eac9d8bce4c745101df63e25fa795c651e Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 18 Dec 2020 14:49:28 +0000 Subject: [PATCH 031/231] Use TypeScript source for development, swap to build during release This changes the JS SDK to point `main` to TypeScript source and remove any indication of `typings`. For local development and CI workflows, it means many steps can run without building first, which saves lots of time. During release, we still build for Node and browsers as before. The release script adjusts the `main` and `typings` fields before publishing and distribution to point to the built output for those that use them. --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index b30b430a62..a3443af38b 100644 --- a/package.json +++ b/package.json @@ -27,9 +27,10 @@ "matrix-gen-i18n": "scripts/gen-i18n.js", "matrix-prune-i18n": "scripts/prune-i18n.js" }, - "main": "./lib/index.js", - "typings": "./lib/index.d.ts", + "main": "./src/index.js", "matrix_src_main": "./src/index.js", + "matrix_lib_main": "./lib/index.js", + "matrix_lib_typings": "./lib/index.d.ts", "scripts": { "prepublishOnly": "yarn build", "i18n": "matrix-gen-i18n", From 50427786f9c268be0d42c6fb16bfd0c4276d79ac Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 18 Dec 2020 14:59:09 +0000 Subject: [PATCH 032/231] Cloned deps do not need any building now --- scripts/ci/install-deps.sh | 1 - scripts/ci/layered.sh | 2 -- 2 files changed, 3 deletions(-) diff --git a/scripts/ci/install-deps.sh b/scripts/ci/install-deps.sh index 8a6f7489a0..bbda74ef9d 100755 --- a/scripts/ci/install-deps.sh +++ b/scripts/ci/install-deps.sh @@ -7,7 +7,6 @@ scripts/fetchdep.sh matrix-org matrix-js-sdk pushd matrix-js-sdk yarn link yarn install $@ -yarn build:types popd yarn link matrix-js-sdk diff --git a/scripts/ci/layered.sh b/scripts/ci/layered.sh index 78a490f7a8..306f9c9974 100755 --- a/scripts/ci/layered.sh +++ b/scripts/ci/layered.sh @@ -14,14 +14,12 @@ scripts/fetchdep.sh matrix-org matrix-js-sdk pushd matrix-js-sdk yarn link yarn install -yarn build:types popd # Now set up the react-sdk yarn link matrix-js-sdk yarn link yarn install -yarn build:types # Finally, set up element-web scripts/fetchdep.sh vector-im element-web From e90e51cc9b269005f52671daa842ff3c61363e84 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 18 Dec 2020 15:13:09 +0000 Subject: [PATCH 033/231] React SDK needs to build the component index --- scripts/ci/layered.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/ci/layered.sh b/scripts/ci/layered.sh index 306f9c9974..039f90c7df 100755 --- a/scripts/ci/layered.sh +++ b/scripts/ci/layered.sh @@ -20,6 +20,7 @@ popd yarn link matrix-js-sdk yarn link yarn install +yarn reskindex # Finally, set up element-web scripts/fetchdep.sh vector-im element-web From 97e811d31f89e8a8ed1165c1ffec0bc4d9681a9f Mon Sep 17 00:00:00 2001 From: Flat Earth Israel Association Date: Thu, 17 Dec 2020 23:26:41 +0000 Subject: [PATCH 034/231] Translated using Weblate (Hebrew) Currently translated at 6.9% (189 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/he/ --- src/i18n/strings/he.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index b17fc5abc5..069242c362 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -196,5 +196,19 @@ "Thank you!": "רב תודות!", "With your current browser, the look and feel of the application may be completely incorrect, and some or all features may not function. If you want to try it anyway you can continue, but you are on your own in terms of any issues you may encounter!": "באמצעות הדפדפן הנוכחי שלך המראה של היישום יכול להיות שגוי לחלוטין וחלק מהאפשרויות לא תתפקדנה. אם תרצה לנסות בכל זאת תוכל אבל אז כל האחריות עליך!", "Checking for an update...": "בודק עדכונים...", - "Your %(brand)s is misconfigured": "ה %(brand)s שלך מוגדר באופן שגוי" + "Your %(brand)s is misconfigured": "ה %(brand)s שלך מוגדר באופן שגוי", + "Which officially provided instance you are using, if any": "איזה אינסטנס רשמי אתם משתמשים אם בכללאיזה אינסטנס רשמי אתם משתמשים אם בכלל", + "Your language of choice": "בחירת שפה", + "Whether or not you're logged in (we don't record your username)": "אם הנכם מחוברים או לא (אנחנו לא שומרים מידע על המשתמש שלכם)", + "The version of %(brand)s": "גירסאת מוצר %(brand)s", + "The platform you're on": "הפלטפורמה שהינכם משתמשים בה", + "Add Phone Number": "הוסף מספר טלפון", + "Click the button below to confirm adding this phone number.": "לחצו על הכפתור לאישור הוספת מספר הטלפון הזה.", + "Confirm adding phone number": "אישור הוספת מספר טלפון", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "אשר הוספת מספר טלפון על ידי כניסה חד שלבית לאימות חשבונכם.", + "Add Email Address": "הוספת כתובת מייל", + "Confirm": "אישור", + "Click the button below to confirm adding this email address.": "לחץ על הכפתור בכדי לאשר הוספה של כתובת מייל הזו.", + "Confirm adding email": "אשר הוספת כתובת מייל", + "Single Sign On": "כניסה חד שלבית" } From 21980cc0d80a3f48a5a97feebfe78d84381d9b7f Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Fri, 18 Dec 2020 11:35:52 +0000 Subject: [PATCH 035/231] Translated using Weblate (Czech) Currently translated at 97.8% (2654 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 752720d87a..79fb77a7aa 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1519,11 +1519,11 @@ "Show all": "Zobrazit vše", "Edited at %(date)s. Click to view edits.": "Upraveno v %(date)s. Klinutím zobrazíte změny.", "Frequently Used": "Často používané", - "Smileys & People": "Obličeje & Lidé", - "Animals & Nature": "Zvířata & Příroda", - "Food & Drink": "Jídlo & Nápoje", + "Smileys & People": "Obličeje a lidé", + "Animals & Nature": "Zvířata a příroda", + "Food & Drink": "Jídlo a nápoje", "Activities": "Aktivity", - "Travel & Places": "Cestování & Místa", + "Travel & Places": "Cestování a místa", "Objects": "Objekty", "Symbols": "Symboly", "Flags": "Vlajky", @@ -1755,7 +1755,7 @@ "This bridge is managed by .": "Toto propojení spravuje .", "Workspace: %(networkName)s": "Pracovní oblast: %(networkName)s", "Channel: %(channelName)s": "Kanál: %(channelName)s", - "Show less": "Skrýt detaily", + "Show less": "Zobrazit méně", "Show more": "Více", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Změna hesla resetuje šifrovací klíče pro všechny vaše relace. Pokud si nejdřív nevyexportujete klíče místností a po změně je znovu neimportujete, nedostanete se k historickým zprávám. V budoucnu se toto zjednoduší.", "Cross-signing and secret storage are enabled.": "Cross-signing a bezpečné úložiště jsou zapnuté.", @@ -2824,5 +2824,10 @@ "Join the conference from the room information card on the right": "Připojte se ke konferenci z informační karty místnosti napravo", "Join the conference at the top of this room": "Připojte se ke konferenci v horní části této místnosti", "There are advanced notifications which are not shown here.": "Existují pokročilá oznámení, která se zde nezobrazují.", - "Enable advanced debugging for the room list": "Povolit pokročilé ladění pro seznam místností" + "Enable advanced debugging for the room list": "Povolit pokročilé ladění pro seznam místností", + "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "Bezpečně uloží zašifrované zprávy v místním úložišti, aby se mohly objevit ve výsledcích vyhledávání, využívá se %(size)s k ukládání zpráv z %(rooms)s místnosti.", + "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Bezpečně uloží zašifrované zprávy v místním úložišti, aby se mohly objevit ve výsledcích vyhledávání, využívá se %(size)s k ukládání zpráv z %(rooms)s místností.", + "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "Možná jste je nakonfigurovali v jiném klientovi než %(brand)s. Nelze je zobrazit v %(brand)s, ale stále platí.", + "well formed": "ve správném tvaru", + "There was an error creating your community. The name may be taken or the server is unable to process your request.": "Při vytváření vaší skupiny došlo k chybě. Název může být již obsazen nebo server nemůže zpracovat váš požadavek." } From 92aa7deedb89d6562e15ce31b846fea2b1ab53e4 Mon Sep 17 00:00:00 2001 From: Mitja Sorsa Date: Thu, 17 Dec 2020 20:23:06 +0000 Subject: [PATCH 036/231] Translated using Weblate (Finnish) Currently translated at 94.7% (2569 of 2711 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fi/ --- src/i18n/strings/fi.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 70c6215bd8..caedb6c363 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -2783,5 +2783,6 @@ "Comment": "Kommentti", "Navigation": "Navigointi", "Manage": "Hallitse", - "Remain on your screen when viewing another room, when running": "Pysy ruudulla katsellessasi huonetta, kun se on käynissä" + "Remain on your screen when viewing another room, when running": "Pysy ruudulla katsellessasi huonetta, kun se on käynnissä", + "Remain on your screen while running": "Pysy ruudulla käynnissä olon ajan" } From 267508a6b7fe17108d67b42378ddd6cc65c7d9cf Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Fri, 18 Dec 2020 21:33:47 +0000 Subject: [PATCH 037/231] Translated using Weblate (Russian) Currently translated at 100.0% (2713 of 2713 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index bb6dbdf308..1a5e35714e 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -2455,7 +2455,7 @@ "User settings": "Пользовательские настройки", "Community and user menu": "Сообщество и меню пользователя", "Privacy": "Конфиденциальность", - "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Добавляет ( ͡° ͜ʖ ͡°) к текстовому сообщению", + "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Добавляет ( ͡° ͜ʖ ͡°) в начало сообщения", "Unknown App": "Неизвестное приложение", "%(count)s results|one": "%(count)s результат", "Room Info": "Информация о комнате", @@ -2963,5 +2963,7 @@ "You held the call Resume": "Вы удерживаете звонок Возобновить", "%(name)s paused": "%(name)s приостановлен", "You've reached the maximum number of simultaneous calls.": "Вы достигли максимального количества одновременных звонков.", - "Too Many Calls": "Слишком много звонков" + "Too Many Calls": "Слишком много звонков", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Добавляет ┬──┬ ノ( ゜-゜ノ) в начало сообщения", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Добавляет (╯°□°)╯︵ ┻━┻ в начало сообщения" } From bac85f986fc721de9d86dca9d6cfb0dbe9760f57 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Sat, 19 Dec 2020 01:06:31 +0000 Subject: [PATCH 038/231] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2713 of 2713 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index c820d9b1cf..4152a4cb95 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2974,5 +2974,7 @@ "You held the call Resume": "您已保留通話 繼續", "%(name)s paused": "%(name)s 已暫停", "You've reached the maximum number of simultaneous calls.": "您已達到同時通話的最大數量。", - "Too Many Calls": "太多通話" + "Too Many Calls": "太多通話", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "在純文字訊息前加入 ┬──┬ ノ( ゜-゜ノ)", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "在純文字訊息前加入 (╯°□°)╯︵ ┻━┻" } From 23a4f7a2515d0d96b8ae2927fb1a7d61b5240e34 Mon Sep 17 00:00:00 2001 From: ziriSut Date: Fri, 18 Dec 2020 22:31:18 +0000 Subject: [PATCH 039/231] Translated using Weblate (Kabyle) Currently translated at 82.8% (2247 of 2713 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 7a9261f25c..e8ab1272a1 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -2449,5 +2449,6 @@ "Widgets": "Iwiǧiten", "Unpin app": "Serreḥ i usnas", "Pin to room": "Sentu deg texxamt", - "You can only pin 2 widgets at a time": "Tzemreḍ ad tsentuḍ 2 kan n yiwiǧiten ɣef tikkelt" + "You can only pin 2 widgets at a time": "Tzemreḍ ad tsentuḍ 2 kan n yiwiǧiten ɣef tikkelt", + "Call Declined": "Yettwagi usiwel" } From 6dc1c918cf52b9caa29329f3d29e0ce77232bed0 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Sat, 19 Dec 2020 18:05:13 +0000 Subject: [PATCH 040/231] Translated using Weblate (Czech) Currently translated at 99.4% (2701 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 49 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 79fb77a7aa..10d6a80adb 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2829,5 +2829,52 @@ "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "Bezpečně uloží zašifrované zprávy v místním úložišti, aby se mohly objevit ve výsledcích vyhledávání, využívá se %(size)s k ukládání zpráv z %(rooms)s místností.", "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "Možná jste je nakonfigurovali v jiném klientovi než %(brand)s. Nelze je zobrazit v %(brand)s, ale stále platí.", "well formed": "ve správném tvaru", - "There was an error creating your community. The name may be taken or the server is unable to process your request.": "Při vytváření vaší skupiny došlo k chybě. Název může být již obsazen nebo server nemůže zpracovat váš požadavek." + "There was an error creating your community. The name may be taken or the server is unable to process your request.": "Při vytváření vaší skupiny došlo k chybě. Název může být již obsazen nebo server nemůže zpracovat váš požadavek.", + "See %(eventType)s events posted to this room": "Zobrazit události %(eventType)s zveřejněné v této místnosti", + "Send stickers to your active room as you": "Poslat nálepky do vaší aktivní místnosti jako vy", + "Send stickers to this room as you": "Poslat samolepky jako vy do této místnosti", + "Change the topic of your active room": "Změnit téma vaší aktivní místnosti", + "Change which room you're viewing": "Změnit kterou místnost si prohlížíte", + "Send stickers into your active room": "Poslat nálepky do vaší aktivní místnosti", + "Send stickers into this room": "Poslat nálepky do této místnosti", + "Send messages as you in this room": "Poslat zprávy jako vy v této místnosti", + "Send messages as you in your active room": "Poslat zprávy jako vy ve vaší aktivní místnosti", + "Send text messages as you in this room": "Poslat textové zprávy jako vy v této místnosti", + "Send text messages as you in your active room": "Poslat textové zprávy jako vy ve vaší aktivní místnosti", + "See text messages posted to this room": "Podívat se na textové zprávy odeslané do této místnosti", + "See text messages posted to your active room": "Podívat se na textové zprávy odeslané do vaší aktivní místnosti", + "Send images as you in this room": "Poslat obrázky jako vy v této místnosti", + "Send images as you in your active room": "Poslat obrázky jako vy ve vaší aktivní místnosti", + "See images posted to this room": "Podívat se na obrázky zveřejněné v této místnosti", + "See images posted to your active room": "Podívat se na obrázky zveřejněné ve vaší aktivní místnosti", + "Send videos as you in this room": "Poslat videa jako vy v této místnosti", + "Send videos as you in your active room": "Podívat se na videa jako vy ve vaší aktivní místnosti", + "See videos posted to this room": "Podívat se na videa zveřejněná v této místnosti", + "See videos posted to your active room": "Podívat se na videa zveřejněná ve vaší aktivní místnosti", + "Send general files as you in this room": "Poslat obecné soubory jako vy v této místnosti", + "Send general files as you in your active room": "Poslat obecné soubory jako vy ve vaší aktivní místnosti", + "See general files posted to this room": "Prohlédnout obecné soubory zveřejněné v této místnosti", + "See general files posted to your active room": "Prohlédnout obecné soubory zveřejněné ve vaší aktivní místnosti", + "Send %(msgtype)s messages as you in this room": "Poslat zprávy %(msgtype)s jako vy v této místnosti", + "Send %(msgtype)s messages as you in your active room": "Poslat zprávy %(msgtype)s jako vy ve vašá aktivní místnosti", + "See %(msgtype)s messages posted to this room": "Prohlédnout zprávy %(msgtype)s zveřejněné v této místnosti", + "See %(msgtype)s messages posted to your active room": "Prohlédnout zprávy %(msgtype)s zveřejněné ve vaší aktivní místnosti", + "Render LaTeX maths in messages": "Ve zprávách vykreslit matematické výrazy LaTeXu", + "New spinner design": "Nový design ukazatele zpracování", + "Show message previews for reactions in DMs": "Zobrazit náhledy zpráv pro reakce v přímých zprávách", + "Show message previews for reactions in all rooms": "Zobrazit náhledy zpráv pro reakce ve všech místnostech", + "Sends the given message with confetti": "Pošle zprávu s konfetami", + "sends confetti": "pošle konfety", + "Sends the given message with fireworks": "Pošle zprávu s ohňostrojem", + "sends fireworks": "odešle ohňostroj", + "The %(capability)s capability": "Schopnost %(capability)s", + "See %(eventType)s events posted to your active room": "Zobrazit události %(eventType)s odeslané do vaší aktivní místnosti", + "Send %(eventType)s events as you in your active room": "Poslat události %(eventType)s jako vy ve vaší aktivní místnosti", + "Send %(eventType)s events as you in this room": "Poslat události %(eventType)s jako vy v této místnosti", + "with an empty state key": "s prázdným stavovým klíčem", + "with state key %(stateKey)s": "se stavovým klíčem %(stateKey)s", + "User signing private key:": "Podpisový klíč uživatele:", + "Self signing private key:": "Vlastní podpisový klíč:", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Vloží ┬──┬ ノ( ゜-゜ノ) na začátek zprávy", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Vloží (╯°□°)╯︵ ┻━┻ na začátek zprávy" } From cd3f5d378535532b0eab671c887dd98ae5ed6aaf Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Sat, 19 Dec 2020 22:12:35 +0000 Subject: [PATCH 041/231] Translated using Weblate (Czech) Currently translated at 99.6% (2705 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 10d6a80adb..ecbfcea519 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -241,7 +241,7 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Nelze se připojit k domovskému serveru přes HTTP, pokud je v adresním řádku HTTPS. Buď použijte HTTPS, nebo povolte nezabezpečené skripty.", "Click here to fix": "Pro opravu klepněte zde", "Click to mute video": "Klepněte pro zakázání videa", - "click to reveal": "pro odhlení klepněte", + "click to reveal": "klepněte pro odhalení", "Click to unmute video": "Klepněte pro povolení videa", "Click to unmute audio": "Klepněte pro povolení zvuku", "Displays action": "Zobrazí akci", @@ -1801,7 +1801,7 @@ "Session key:": "Klíč relace:", "Message search": "Vyhledávání ve zprávách", "Cross-signing": "Cross-signing", - "A session's public name is visible to people you communicate with": "Lidé, se kterými komunikujete, mohou veřejný název zobrazit", + "A session's public name is visible to people you communicate with": "Lidé, se kterými komunikujete, mohou zobrazit veřejný název", "This room is bridging messages to the following platforms. Learn more.": "Tato místnost je propojena s následujícími platformami. Více informací", "This room isn’t bridging messages to any platforms. Learn more.": "Tato místnost není propojená s žádnými dalšími platformami. Více informací.", "Bridges": "Propojení", @@ -2756,7 +2756,7 @@ "Please go into as much detail as you like, so we can track down the problem.": "Udejte prosím co nejvíce podrobností, abychom mohli problém vystopovat.", "Start a conversation with someone using their name or username (like ).": "Začněte konverzaci s někým pomocí jeho jména nebo uživatelského jména (například ).", "Tell us below how you feel about %(brand)s so far.": "Níže se podělte s vašimi zkušenostmi s %(brand)s.", - "%(senderDisplayName)s set the server ACLs for this room.": "", + "%(senderDisplayName)s set the server ACLs for this room.": "%(senderDisplayName)s nastavil seznam přístupů serveru pro tuto místnost.", "What's the name of your community or team?": "Jak se jmenuje vaše skupina nebo tým?", "Invite someone using their name, username (like ) or share this room.": "Pozvěte někoho pomocí svého jména, uživatelského jména (například ) nebo sdílejte tuto místnost.", "Confirm by comparing the following with the User Settings in your other session:": "Potvrďte porovnáním následujícího s uživatelským nastavením v jiné relaci:", @@ -2876,5 +2876,8 @@ "User signing private key:": "Podpisový klíč uživatele:", "Self signing private key:": "Vlastní podpisový klíč:", "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Vloží ┬──┬ ノ( ゜-゜ノ) na začátek zprávy", - "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Vloží (╯°□°)╯︵ ┻━┻ na začátek zprávy" + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Vloží (╯°□°)╯︵ ┻━┻ na začátek zprávy", + "Remain on your screen while running": "Při běhu zůstává na obrazovce", + "Remain on your screen when viewing another room, when running": "Při prohlížení jiné místnosti zůstává při běhu na obrazovce", + "%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s změnil seznam přístupů serveru pro tuto místnost." } From 6862b898285c08dd7faa75120fd884ca39af1422 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Sun, 20 Dec 2020 14:44:02 +0000 Subject: [PATCH 042/231] Translated using Weblate (Czech) Currently translated at 100.0% (2715 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index ecbfcea519..a0138fe786 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -764,7 +764,7 @@ "Demote": "Degradovat", "Share Link to User": "Sdílet odkaz na uživatele", "Send an encrypted reply…": "Odeslat šifrovanou odpověď …", - "Send an encrypted message…": "Odeslat šifrovanou zprávu …", + "Send an encrypted message…": "Odeslat šifrovanou zprávu…", "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s (%(userName)s) viděl %(dateTime)s", "Replying": "Odpovídá", "Share room": "Sdílet místnost", @@ -2879,5 +2879,15 @@ "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Vloží (╯°□°)╯︵ ┻━┻ na začátek zprávy", "Remain on your screen while running": "Při běhu zůstává na obrazovce", "Remain on your screen when viewing another room, when running": "Při prohlížení jiné místnosti zůstává při běhu na obrazovce", - "%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s změnil seznam přístupů serveru pro tuto místnost." + "%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s změnil seznam přístupů serveru pro tuto místnost.", + "Offline encrypted messaging using dehydrated devices": "Offline šifrovaná komunikace pomocí dehydrovaných zařízení", + "See emotes posted to your active room": "Prohlédněte si emoji zveřejněné ve vaší aktivní místnosti", + "See emotes posted to this room": "Prohlédněte si emoji zveřejněné v této místnosti", + "Send emotes as you in your active room": "Poslat emoji jako vy ve své aktivní místnosti", + "Send emotes as you in this room": "Poslat emoji jako vy v této místnosti", + "See when anyone posts a sticker to your active room": "Podívejte se, kdy někdo zveřejní nálepku ve vaší aktivní místnosti", + "See when a sticker is posted in this room": "Podívejte se, kdy je zveřejněna nálepka v této místnosti", + "See when the name changes in this room": "Podívejte se, kdy se změní název v této místnosti", + "See when the topic changes in your active room": "Podívejte se, kdy se změní téma ve vaší aktivní místnosti", + "See when the topic changes in this room": "Podívejte se, kdy se změní téma v této místnosti" } From b4250884e4bb6ba15397f3a8080daa60801fd6b7 Mon Sep 17 00:00:00 2001 From: The one with the braid Date: Sun, 20 Dec 2020 06:24:22 +0000 Subject: [PATCH 043/231] Translated using Weblate (German) Currently translated at 100.0% (2715 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 8588ccb7d6..4863648838 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -149,7 +149,7 @@ "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s hat das Berechtigungslevel von %(powerLevelDiffText)s geändert.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s hat den Raumnamen geändert zu %(roomName)s.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s hat das Thema geändert in \"%(topic)s\".", - "/ddg is not a command": "/ddg ist kein Kommando", + "/ddg is not a command": "/ddg ist kein Befehl", "%(senderName)s ended the call.": "%(senderName)s hat den Anruf beendet.", "Failed to send request.": "Anfrage konnte nicht gesendet werden.", "%(userId)s from %(fromPowerLevel)s to %(toPowerLevel)s": "%(userId)s von %(fromPowerLevel)s zu %(toPowerLevel)s", @@ -177,7 +177,7 @@ "%(senderName)s set a profile picture.": "%(senderName)s hat ein Profilbild gesetzt.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s hat den Anzeigenamen geändert in %(displayName)s.", "This room is not recognised.": "Dieser Raum wurde nicht erkannt.", - "To use it, just wait for autocomplete results to load and tab through them.": "Um diese Funktion zu nutzen, warte einfach auf die Autovervollständigungsergebnisse und benutze dann die TAB-Taste zum durchblättern.", + "To use it, just wait for autocomplete results to load and tab through them.": "Um diese Funktion zu nutzen, warte einfach auf die Ergebnisse der Autovervollständigung und benutze dann die TAB-Taste zum Durchblättern.", "%(senderName)s unbanned %(targetName)s.": "%(senderName)s hat die Verbannung von %(targetName)s aufgehoben.", "Usage": "Verwendung", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s hat die Einladung für %(targetName)s zurückgezogen.", @@ -197,7 +197,7 @@ "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Es kann keine Verbindung zum Heimserver via HTTP aufgebaut werden, wenn die Adresszeile des Browsers eine HTTPS-URL enthält. Entweder HTTPS verwenden oder alternativ unsichere Skripte erlauben.", "Click to mute audio": "Klicke um den Ton stumm zu stellen", "Click to mute video": "Klicken, um das Video stummzuschalten", - "Command error": "Befehlsfehler", + "Command error": "Fehler im Befehl", "Decrypt %(text)s": "%(text)s entschlüsseln", "Disinvite": "Einladung zurückziehen", "Download %(text)s": "%(text)s herunterladen", @@ -1189,7 +1189,7 @@ "Unable to query for supported registration methods.": "Konnte unterstützte Registrierungsmethoden nicht abrufen.", "Bulk options": "Sammeloptionen", "Join millions for free on the largest public server": "Schließe dich kostenlos auf dem größten öffentlichen Server Millionen von Menschen an", - "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Fügt ¯\\_(ツ)_/¯ vor einer Klartextnachricht ein", + "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Stellt ¯\\_(ツ)_/¯ einer Klartextnachricht voran", "Changes your display nickname in the current room only": "Ändert den Anzeigenamen ausschließlich für den aktuellen Raum", "%(senderDisplayName)s enabled flair for %(groups)s in this room.": "%(senderDisplayName)s aktivierte Abzeichen der Gruppen %(groups)s für diesen Raum.", "%(senderDisplayName)s disabled flair for %(groups)s in this room.": "%(senderDisplayName)s deaktivierte Abzeichen der Gruppen %(groups)s in diesem Raum.", @@ -1333,7 +1333,7 @@ "Only continue if you trust the owner of the server.": "Fahre nur fort, wenn du dem/r Besitzer*in des Servers vertraust.", "Trust": "Vertrauen", "Custom (%(level)s)": "Benutzerdefinierte (%(level)s)", - "Sends a message as plain text, without interpreting it as markdown": "Verschickt eine Nachricht in reinem Textformat, ohne sie in Markdown zu formatieren", + "Sends a message as plain text, without interpreting it as markdown": "Verschickt eine Nachricht in Rohtext, ohne sie als Markdown darzustellen", "Use an identity server to invite by email. Manage in Settings.": "Nutze einen Identitätsserver, um über E-Mail Einladungen zu verschicken. Verwalte es in den Einstellungen.", "%(name)s (%(userId)s)": "%(name)s (%(userId)s)", "Try out new ways to ignore people (experimental)": "Versuche neue Möglichkeiten, um Menschen zu ignorieren (experimentell)", @@ -1630,7 +1630,7 @@ "Your recovery key": "Dein Wiederherstellungsschlüssel", "Copy": "In Zwischenablage kopieren", "Make a copy of your recovery key": "Speichere deinen Wiederherstellungsschlüssel", - "Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im html-Format, ohne sie in Markdown zu formatieren", + "Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im HTML-Format, ohne sie als Markdown zu darzustellen", "Show rooms with unread notifications first": "Räume mit ungelesenen Benachrichtigungen zuerst zeigen", "Show shortcuts to recently viewed rooms above the room list": "Kurzbefehle zu den kürzlich gesichteten Räumen über der Raumliste anzeigen", "Use Single Sign On to continue": "Benutze Single Sign-On um fortzufahren", @@ -2950,5 +2950,22 @@ "Call failed because no microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Der Anruf ist fehlgeschlagen weil nicht auf das Mikrofon zugegriffen werden konnte. Stelle sicher, dass das Mikrofon richtig eingesteckt und eingerichtet ist.", "Call failed because no webcam or microphone could not be accessed. Check that:": "Der Anruf ist fehlgeschlagen weil nicht auf das Mikrofon oder die Webcam zugegriffen werden konnte. Stelle sicher, dass:", "Unable to access webcam / microphone": "Auf Webcam / Mikrofon konnte nicht zugegriffen werden", - "Unable to access microphone": "Es konnte nicht auf das Mikrofon zugegriffen werden" + "Unable to access microphone": "Es konnte nicht auf das Mikrofon zugegriffen werden", + "Host account on": "Benutzer*innenkonto betreiben an", + "Hold": "Halten", + "Resume": "Fortsetzen", + "We call the places where you can host your account ‘homeservers’.": "Den Ort, an dem du dein Benutzer*innenkonto betreibst, nennen wir „Heimserver“.", + "Invalid URL": "Ungültiger Link", + "Unable to validate homeserver": "Überprüfung des Heimservers nicht möglich", + "%(name)s paused": "%(name)s hat pausiert", + "%(peerName)s held the call": "%(peerName)s hält den Anruf", + "You held the call Resume": "Du hältst den Anruf Fortsetzen", + "sends fireworks": "sendet Feuerwerk", + "Sends the given message with fireworks": "Sendet die gewählte Nachricht mit Feuerwerk", + "sends confetti": "sendet Konfetti", + "Sends the given message with confetti": "Sendet die gewählte Nachricht ohne Konfetti", + "Show chat effects": "Chat-Effekte anzeigen", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Stellt ┬──┬ ノ( ゜-゜ノ) einer Klartextnachricht voran", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Stellt (╯°□°)╯︵ ┻━┻ einer Klartextnachricht voran", + "Effects": "Effekte" } From eee17fdfd22749b68baddfa8d8af168a88e1b3da Mon Sep 17 00:00:00 2001 From: laikq Date: Sat, 19 Dec 2020 10:24:36 +0000 Subject: [PATCH 044/231] Translated using Weblate (German) Currently translated at 100.0% (2715 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 4863648838..d8dee58b98 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2967,5 +2967,9 @@ "Show chat effects": "Chat-Effekte anzeigen", "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Stellt ┬──┬ ノ( ゜-゜ノ) einer Klartextnachricht voran", "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Stellt (╯°□°)╯︵ ┻━┻ einer Klartextnachricht voran", - "Effects": "Effekte" + "Effects": "Effekte", + "You've reached the maximum number of simultaneous calls.": "Du hast die maximale Anzahl gleichzeitiger Anrufe erreicht.", + "Too Many Calls": "Zu viele Anrufe", + "Call failed because webcam or microphone could not be accessed. Check that:": "Der Anruf ist fehlgeschlagen, weil nicht auf die Webcam oder der das Mikrofon zugegriffen werden konnte. Prüfe nach, ob:", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Der Anruf ist fehlgeschlagen, weil nicht auf das Mikrofon zugegriffen werden konnte. Prüfe noch einmal nach, ob das Mikrofon eingesteckt und richtig eingestellt ist." } From fc9a490f80d700da455f94afdc115264c6e5fc2d Mon Sep 17 00:00:00 2001 From: Flat Earth Israel Association Date: Sun, 20 Dec 2020 21:49:13 +0000 Subject: [PATCH 045/231] Translated using Weblate (Hebrew) Currently translated at 22.0% (599 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/he/ --- src/i18n/strings/he.json | 412 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 411 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index 069242c362..cfcf51c1d3 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -210,5 +210,415 @@ "Confirm": "אישור", "Click the button below to confirm adding this email address.": "לחץ על הכפתור בכדי לאשר הוספה של כתובת מייל הזו.", "Confirm adding email": "אשר הוספת כתובת מייל", - "Single Sign On": "כניסה חד שלבית" + "Single Sign On": "כניסה חד שלבית", + "Opens chat with the given user": "פתח שיחה עם המשתמש הזה", + "Send a bug report with logs": "שולח דוח תקלה עם לוג", + "Displays information about a user": "מציג מידע אודות משתמש", + "Displays list of commands with usages and descriptions": "מציג רשימת פקודות עם שימוש והוראות", + "Sends the given emote coloured as a rainbow": "שולח את האימוג'י צבוע בקשת של צבעים", + "Sends the given message coloured as a rainbow": "שולח את ההודעה כקשת של צבעים", + "Forces the current outbound group session in an encrypted room to be discarded": "מאלץ להתעלם מהתקשורת היוצאת מהתחברות של קבוצה בחדר מוצפן", + "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "המפתח החתום שנתתם תואם את המפתח שקבלתם מ %(userId)s מהתחברות %(deviceId)s. ההתחברות סומנה כמאושרת.", + "Verified key": "מפתח מאושר", + "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!": "אזהרה: אימות מפתח נכשל! חתימת המפתח של %(userId)s ושל ההתחברות של מכשיר %(deviceId)s הינו \"%(fprint)s\" אשר אינו תואם למפתח הנתון \"%(fingerprint)s\". דבר זה יכול להעיר על כך שישנו נסיון להאזין לתקשורת שלכם!", + "WARNING: Session already verified, but keys do NOT MATCH!": "אזהרה: ההתחברות כבר אושרה אך המפתחות לא תואמים!", + "Session already verified!": "ההתחברות כבר אושרה!", + "Unknown (user, session) pair:": "צימוד לא ידוע (משתמש, התחברות):", + "Verifies a user, session, and pubkey tuple": "מוודא משתמש, התחברות וצמד מפתח ציבורי", + "You cannot modify widgets in this room.": "אינכם יכולים לערוך ווידג'ט בחדר זה.", + "Please supply a https:// or http:// widget URL": "אנא הוסיפו קישור לווידג'ט עם http:// או https://", + "Please supply a widget URL or embed code": "אנא ספקו כתובת של ווידג'ט או קוד הטמעה", + "Adds a custom widget by URL to the room": "מוסיף ווידג'ט מותאם לפי קישור לחדר זה", + "Opens the Developer Tools dialog": "פותח את דיאלוג כלי המפתחים", + "Deops user with given id": "מסיר משתמש עם קוד זיהוי זה", + "Could not find user in room": "משתמש זה לא נמצא בחדר", + "Command failed": "הפקודה נכשלה", + "Define the power level of a user": "הגדירו את רמת ההרשאות של משתמש", + "You are no longer ignoring %(userId)s": "אינכם מתעלמים יותר מ %(userId)s", + "Unignored user": "משתמש מוכר", + "Stops ignoring a user, showing their messages going forward": "הפסקת התעלמות ממשתמש, אשרו את ההודעות שלהם אליכם", + "You are now ignoring %(userId)s": "אתם עכשיו מתעלמים מ %(userId)s", + "Ignored user": "משתמש נעלם", + "Ignores a user, hiding their messages from you": "התעלם ממשתמש, הסתר הודעות מהם", + "Unbans user with given ID": "ביטול חסימה של משתמש עם קוד זיהוי", + "Bans user with given id": "חסום משתמש עם קוד זיהוי", + "Kicks user with given id": "בעט במשתמש עם קוד זיהוי", + "Unrecognised room address:": "כתובת חדר לא מזוהה:", + "Leave room": "עזוב חדר", + "Joins room with given address": "חיבור לחדר עם כתובת מסויימת", + "Use an identity server to invite by email. Manage in Settings.": "השתמש בשרת זיהוי להזמין דרך מייל. ניהול דרך ההגדרות.", + "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "השתמש בשרת זיהוי על מנת להזמין דרך מייל. לחצו על המשך להשתמש בשרת ברירת המחדל %(defaultIdentityServerName)s או הגדירו את השרת שלכם בהגדרות.", + "Use an identity server": "השתמש בשרת זיהוי", + "Invites user with given id to current room": "מזמין משתמש עם זיהוי מוגדר לחדר זה", + "Sets the room name": "מגדיר את שם החדר", + "This room has no topic.": "לחדר זה אין נושא.", + "Failed to set topic": "כשלון בהגדרת נושא החדר", + "Gets or sets the room topic": "קורא או כותב את נושא החדר", + "Changes your avatar in all rooms": "משנה את האווטר שלכם בכל החדרים", + "Changes your avatar in this current room only": "משנה את האווטר שלכם בחדר זה בלבד", + "Changes the avatar of the current room": "משנה את האווטר של החדר הנוכחי", + "Changes your display nickname in the current room only": "משנה את שם התצוגה שלכם בחדר זה בלבד", + "Changes your display nickname": "משנה את שם התצוגה שלכם", + "Double check that your server supports the room version chosen and try again.": "בדקו שהשרת תומך בגרסאת החדר ונסו שוב.", + "Error upgrading room": "שגיאה בשדרוג חדר", + "You do not have the required permissions to use this command.": "אין לכם הרשאות להשתמש בפקודה זו.", + "Upgrades a room to a new version": "משדרג את החדר לגרסא חדשה", + "To use it, just wait for autocomplete results to load and tab through them.": "בכדי להשתמש אנא המתינו לתוצאות האוטומטיות להראות והשתמשו בטאב לעבור עליהן.", + "/ddg is not a command": "/ddg אינה פקודה", + "Searches DuckDuckGo for results": "חיפוש תוצאות ב DuckDuckGo", + "Sends a message as html, without interpreting it as markdown": "שלח הודעות כ HTML ללא תרגום שלהם כ MARKDOWN", + "Sends a message as plain text, without interpreting it as markdown": "שלח הודעה כטקסט פשוט ללא תרגום כקוד MARKDOWN", + "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "הוסף לפני הודעת טקסט ( ͡° ͜ʖ ͡°)", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "הוסף לפני הודעת טקסט ┬──┬ ノ( ゜-゜ノ)", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "הוסף לפני הודעת טקסט (╯°□°)╯︵ ┻━┻", + "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "הוסף לפני הודעת טקסט ¯\\_(ツ)_/¯", + "Usage": "שימוש", + "Command error": "שגיאת פקודה", + "Other": "אחר", + "Effects": "אפקטים", + "Advanced": "מתקדם", + "Actions": "פעולות", + "Messages": "הודעות", + "Setting up keys": "מגדיר מפתחות", + "Go Back": "חזרה", + "Are you sure you want to cancel entering passphrase?": "האם אתם בטוחים שהינכם רוצים לבטל?", + "Cancel entering passphrase?": "בטל הקלדת סיסמא?", + "Missing user_id in request": "קוד זיהוי משתמש חסר בשורת הבקשה", + "Room %(roomId)s not visible": "קוד זיהוי החדר %(roomId)s אינו נראה", + "Missing room_id in request": "קוד זיהוי החדר חסר בשורת הבקשה", + "You do not have permission to do that in this room.": "אין לכם הרשאות לבצע פעולה זו בחדר זה.", + "You are not in this room.": "אינכם נמצאים בחדר זה.", + "Power level must be positive integer.": "דרגת הרשאות חייבת להיות מספר חיובי.", + "This room is not recognised.": "החדר הזה אינו מזוהה.", + "Failed to send request.": "שליחת בקשה נכשלה.", + "Missing roomId.": "קוד זיהוי של החדר חסר.", + "Unable to create widget.": "לא ניתן היה ליצור ווידג'ט.", + "You need to be able to invite users to do that.": "עליכם להיות מאושרים להזמין משתמשים על מנת לבצע פעולה זו.", + "You need to be logged in.": "עליכם להיות מחוברים.", + "Failed to invite the following users to the %(roomName)s room:": "הזמנת המשתמשים הבאים לחדר %(roomName)s נכשלה:", + "Failed to invite users to the room:": "הזמנת משתמשים לחדר נכשלה:", + "Failed to invite": "הזמנה נכשלה", + "Custom (%(level)s)": "ידני %(level)s", + "Admin": "אדמין", + "Moderator": "מנהל", + "Restricted": "מחוץ לתחום", + "Timor-Leste": "טמור-לסטה", + "St. Martin": "סיינט מרטין", + "Oman": "אומן", + "Unable to load! Check your network connectivity and try again.": "טעינת הדף נכשלה. אנא בדקו את החיבור שלכם לאינטרנט ונסו שנית.", + "e.g. ": "כלומר קישור נוכחי של הדף", + "Failure to create room": "כשלון ביצירת חדר", + "The server does not support the room version specified.": "השרת אינו תומך בגירסת החדר הזו.", + "Server may be unavailable, overloaded, or you hit a bug.": "השרת יכול להיות סגור או עמוס או יתכן ויש לכם תקלה.", + "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "הקובץ %(fileName)s עולה בגודלו על הגודל המותר להעלאה", + "The file '%(fileName)s' failed to upload.": "נכשלה העלאת הקובץ %(fileName)s.", + "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "לא ניתן כעת להשיב עם קובץ. האם תרצו להעלות את הקובץ ללא תגובה?", + "Replying With Files": "משוב עם קבצים", + "This will end the conference for everyone. Continue?": "זה יסיים את הועידה עבור כולם, להמשיך?", + "End conference": "סיום ועידה", + "You do not have permission to start a conference call in this room": "אין לכם הרשאות להתחיל ועידה בחדר זה", + "Permission Required": "הרשאה דרושה", + "A call is currently being placed!": "כרגע מתבצעת התחברות לשיחה!", + "Call in Progress": "שיחה פעילה", + "You've reached the maximum number of simultaneous calls.": "הגעתם למקסימום שיחות שניתן לבצע בו זמנית.", + "Too Many Calls": "יותר מדי שיחות", + "No other application is using the webcam": "שום אפליקציה אחרת אינה משתמשת במצלמה", + "Permission is granted to use the webcam": "ניתנה הרשאה לשימוש במצלמה", + "A microphone and webcam are plugged in and set up correctly": "מצלמה ומיקרופון מחוברים ומוגדרים היטב", + "Call failed because webcam or microphone could not be accessed. Check that:": "השיחה נכשלה משום שלא ניתן היה להפעיל מצלמה או מיקרופון, בדקו אותם:", + "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.": "השיחה נענתה במכשיר אחר.", + "Answered Elsewhere": "נענה במקום אחר", + "The call could not be established": "לא ניתן להתקשר", + "The other party declined the call.": "הצד השני דחה את השיחה.", + "Call Declined": "שיחה נדחתה", + "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "כאשר הדף הזה מכיל מידע מזהה כגון, שם חדר, משתמש או קבוצה, המידע הזה מוסר לפני שהוא נשלח אל השרת.", + "The information being sent to us to help make %(brand)s better includes:": "המידע אשר נשלח אלינו על מנת לשפר את %(brand)s מכיל:", + "Analytics": "אנליטיקה", + "Your device resolution": "רזולוציית המסך של המכשיר", + "Your user agent": "סוכן המשתמש שלך", + "Every page you use in the app": "כל דף שאתם משתמשים בו באפליקציה", + "e.g. %(exampleValue)s": "כלומר %(exampleValue)s", + "Whether you're using %(brand)s as an installed Progressive Web App": "האם אתם משתמשים ב %(brand)s כהתקנה מתקשדמת של אפליקציית רשת", + "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "האם אתם משתמשים בתכונת ה 'פירורים' (אוואטרים מעל רשימת החדרים)", + "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "האם אתם משתמשים ב %(brand)s על מכשיר אשר המגע בו הוא התפעול העיקרי", + "Your homeserver's URL": "הקישור של השרת", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "האם אתם משתמשים בתכונה המתקדמת של עורך הטקסט", + "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.": "פעולה זו דורשת להכנס אל שרת הזיהוי לאשר מייל או טלפון, אבל לשרת אין כללי שרות.", + "Identity server has no terms of service": "לשרת הזיהוי אין כללי שרות", + "Unnamed Room": "חדר ללא שם", + "Failed to add the following rooms to %(groupId)s:": "הוספת החדרים אל %(groupId)s נכשלה:", + "Failed to invite users to %(groupId)s": "הזמנת משתמשים אל %(groupId)s נכשלה", + "Failed to invite users to community": "הזמנת משתמשים אל הקהילה נכשלה", + "Failed to invite the following users to %(groupId)s:": "הזמנת החברים אל %(groupId)s נכשלה:", + "Add to community": "הוסף אל קהילה", + "Room name or address": "שם חדר או כתובת", + "Name or Matrix ID": "שם או שם משתמש", + "Only continue if you trust the owner of the server.": "המשיכו רק אם הנכם בוטחים בבעלים של השרת.", + "American Samoa": "סמואה האמריקאית", + "Algeria": "אלג'ריה", + "Albania": "אלבניה", + "Åland Islands": "איי אלנד", + "Afghanistan": "אפגניסטן", + "United States": "ארצות הברית", + "United Kingdom": "אנגליה", + "Your email address does not appear to be associated with a Matrix ID on this Homeserver.": "המייל שלכם לא משוייך לחשבון בשרת הזה.", + "This email address was not found": "המייל הזה לא נמצא", + "Unable to enable Notifications": "לא מצליח להחיל התרעות", + "%(brand)s was not given permission to send notifications - please try again": "%(brand)s לא נתנו הרשאות לשלוח התרעות - אנא נסו שוב", + "%(brand)s does not have permission to send you notifications - please check your browser settings": "%(brand)s אין אישור לשלוח אליכם הודעות - אנא בדקו את הרשאות הדפדפן", + "%(name)s is requesting verification": "%(name)s מבקש אימות", + "Trust": "לבטוח", + "Andorra": "אנדורה", + "Bangladesh": "בנגלדש", + "Bahrain": "בחריין", + "Bahamas": "בהמהס", + "Azerbaijan": "אזרבייג'ין", + "Austria": "אוסטריה", + "Australia": "אוסטרליה", + "Aruba": "ארובה", + "Armenia": "ארמניה", + "Argentina": "ארגנטינה", + "Antigua & Barbuda": "אנטיגואה וברבודה", + "Antarctica": "אנטארקטיקה", + "Anguilla": "אנגילה", + "Angola": "אנגולה", + "Barbados": "ברבדוס", + "Brunei": "ברוניי", + "British Virgin Islands": "איי הבתולה הבריטיים", + "British Indian Ocean Territory": "הטריטוריה הבריטית של האוקיינוס ההודי", + "Brazil": "ברזיל", + "Bouvet Island": "איי בובט", + "Botswana": "בוטסוואנה", + "Bosnia": "בוסניה", + "Bolivia": "בוליביה", + "Bhutan": "בוטאן", + "Bermuda": "ברמודה", + "Benin": "בנין", + "Belize": "בליזה", + "Belgium": "בלגיה", + "Belarus": "בלרוס", + "Bulgaria": "בולגריה", + "Cocos (Keeling) Islands": "איי קוקוס קלינג", + "Christmas Island": "איי קריסטמס", + "China": "סין", + "Chile": "צ'ילה", + "Chad": "צ'אד", + "Central African Republic": "הרפובליקה של מרכז אפריקה", + "Cayman Islands": "איי קיימן", + "Caribbean Netherlands": "קאריבים הולנדים", + "Cape Verde": "קייפ וורדה", + "Canada": "קנדה", + "Cameroon": "קאמרון", + "Cambodia": "קאמבודיה", + "Burundi": "בורונדי", + "Burkina Faso": "בורקינה פאסו", + "Colombia": "קולומביה", + "Comoros": "קומורוס", + "Dominican Republic": "הרפובליקה הדומיניקית", + "Dominica": "דומיניקה", + "Djibouti": "דג'יבוטי", + "Denmark": "דנמרק", + "Côte d’Ivoire": "קוטה דלוואיר", + "Czech Republic": "הרפובליקה הצ'כית", + "Cyprus": "קפריסין", + "Curaçao": "קורצ'ייאו", + "Cuba": "קובה", + "Croatia": "קרואטיה", + "Costa Rica": "קוטה ריקה", + "Cook Islands": "איי קוק", + "Congo - Kinshasa": "קונגו - קינשסה", + "Congo - Brazzaville": "קונגו - בראזווילה", + "Ecuador": "אקוודור", + "French Southern Territories": "הטריטוריות הדרומיות הצרפתיות", + "French Polynesia": "פולינזיה הצרפתית", + "French Guiana": "גיניאה הצרפתית", + "France": "צרפת", + "Finland": "פינלנד", + "Fiji": "פיג'י", + "Faroe Islands": "איי פארואה", + "Falkland Islands": "איי פולקלנד", + "Ethiopia": "אתיופיה", + "Estonia": "אסטוניה", + "Eritrea": "אריתריאה", + "Equatorial Guinea": "גיניאה המשוונית", + "El Salvador": "אל סלבדור", + "Egypt": "מצריים", + "Gabon": "גאבון", + "Guinea-Bissau": "גיניאה ביסאו", + "Guinea": "גיניאה", + "Guernsey": "גורנסיי", + "Guatemala": "גואטמלה", + "Guam": "גואם", + "Guadeloupe": "גואדלופה", + "Grenada": "גרנדה", + "Greenland": "גרינלנד", + "Greece": "יוון", + "Gibraltar": "גיברלטר", + "Ghana": "גאנה", + "Germany": "גרמניה", + "Georgia": "ג'ורג'יה", + "Gambia": "גמביה", + "Guyana": "גויאנה", + "Italy": "איטליה", + "Israel": "ישראל", + "Isle of Man": "איי מן", + "Ireland": "אירלנד", + "Iraq": "עירק", + "Iran": "אירן", + "Indonesia": "אינדונזיה", + "India": "הודו", + "Iceland": "איסלנד", + "Hungary": "הונגריה", + "Hong Kong": "הונק קונג", + "Honduras": "הונדורס", + "Heard & McDonald Islands": "איי הרס ומקדונלד", + "Haiti": "הייטי", + "Jamaica": "ג'מייקה", + "Liberia": "ליבריה", + "Lesotho": "לסות'ו", + "Lebanon": "לבנון", + "Latvia": "לטביה", + "Laos": "לאוס", + "Kyrgyzstan": "קירג'יזסטן", + "Kuwait": "כווית", + "Kosovo": "קוסובו", + "Kiribati": "קיריבאטי", + "Kenya": "קניה", + "Kazakhstan": "קאזחסטן", + "Jordan": "ירדן", + "Jersey": "ג'רסי", + "Japan": "יפן", + "Libya": "לוב", + "Martinique": "מרטיניק", + "Marshall Islands": "איי מארשל", + "Malta": "מלטה", + "Mali": "מאלי", + "Maldives": "מאלדיביים", + "Malaysia": "מלזיה", + "Malawi": "מלאווי", + "Madagascar": "מדגסקר", + "Macedonia": "מאקדוניה", + "Macau": "מאקאו", + "Luxembourg": "לוקסמבורג", + "Lithuania": "ליטואניה", + "Liechtenstein": "ליכטנשטיין", + "Morocco": "מרוקו", + "Montserrat": "מונטסראט", + "Montenegro": "מונטנגרו", + "Mongolia": "מונגוליה", + "Monaco": "מונקו", + "Moldova": "מולדובה", + "Micronesia": "מיקרונזיה", + "Mexico": "מקסיקו", + "Mayotte": "מיוטה", + "Mauritius": "מאוריטיוס", + "Mauritania": "מאוריטניה", + "Namibia": "נמיביה", + "Myanmar": "מיאנמר", + "Mozambique": "מוזמביק", + "Norway": "נורבגיה", + "Northern Mariana Islands": "צפון איי מריאנה", + "North Korea": "צפון קוריאה", + "Norfolk Island": "איי נורפולק", + "Niue": "ניו", + "Nigeria": "ניגריה", + "Niger": "ניגר", + "Nicaragua": "ניקרגואה", + "New Zealand": "ניו זילנד", + "New Caledonia": "קלדוניה החדשה", + "Netherlands": "הולנד", + "Nepal": "נפאל", + "Nauru": "נארו", + "Pakistan": "פקיסטן", + "Palau": "פאלאו", + "Rwanda": "רואנדה", + "Russia": "רוסיה", + "Romania": "רומניה", + "Qatar": "קאטאר", + "Puerto Rico": "פוארטו ריקו", + "Portugal": "פורטוגל", + "Poland": "פולין", + "Pitcairn Islands": "איי פיטצ'יירן", + "Philippines": "פיליפינים", + "Peru": "פרו", + "Paraguay": "פאראגוואי", + "Papua New Guinea": "פפואה ניו גיניאה", + "Panama": "פנמה", + "Palestine": "ישראל", + "Réunion": "ריוניון", + "Slovenia": "סלובניה", + "Slovakia": "סלובקיה", + "Sint Maarten": "סיינט מרטין", + "Singapore": "סינגפור", + "Sierra Leone": "סיירה לאון", + "Seychelles": "איי סיישל", + "Serbia": "סרביה", + "Senegal": "סנגל", + "Saudi Arabia": "ערב הסעודית", + "San Marino": "סאן מרינו", + "Samoa": "סמואה", + "South Georgia & South Sandwich Islands": "דרום ג'ורג'יה ודרום איי סנדוויץ", + "St. Lucia": "סיינט לוסייה", + "St. Kitts & Nevis": "סיינט קיטס ונביס", + "St. Helena": "סיינט הלנה", + "St. Barthélemy": "סיינט ברתלמי", + "Sri Lanka": "סרילנקה", + "Spain": "ספרד", + "South Sudan": "דרום סודן", + "South Korea": "דרום קוריאה", + "South Africa": "דרום אפריקה", + "Somalia": "סומליה", + "Solomon Islands": "איי שלמה", + "St. Vincent & Grenadines": "סיינט וינסנט וגרנדינס", + "St. Pierre & Miquelon": "סיינט פייר ומיקוולון", + "Thailand": "תאילנד", + "Tanzania": "טנזניה", + "Tajikistan": "טג'יקיסטן", + "Taiwan": "טאיוואן", + "São Tomé & Príncipe": "סאו תומא ופרינציפה", + "Syria": "סוריה", + "Switzerland": "שוויץ", + "Sweden": "שוודיה", + "Swaziland": "סוואזילנד", + "Svalbard & Jan Mayen": "סוואלבאד וג'אן מיין", + "Suriname": "סורינמה", + "Sudan": "סודן", + "Togo": "תוגו", + "Uzbekistan": "אוזבקיסטן", + "Uruguay": "אורוגוואי", + "United Arab Emirates": "איחוד האמירויות", + "Ukraine": "אוקרינה", + "Uganda": "אוגנדה", + "U.S. Virgin Islands": "איי הבתולה ארה\"ב", + "Tuvalu": "תובלאו", + "Turks & Caicos Islands": "טוקרס ואיי קאייקו", + "Turkmenistan": "טורקמניסטן", + "Turkey": "טורקיה", + "Tunisia": "תוניסיה", + "Trinidad & Tobago": "טרינידאד וטובאגו", + "Tonga": "טונגה", + "Tokelau": "טוקלאו", + "Vanuatu": "ונואטו", + "Default": "ברירת מחדל", + "Sign In": "כניסה", + "Create Account": "צור חשבון", + "Use your account or create a new one to continue.": "השתמשו בחשבונכם או צרו חשבון חדש.", + "Sign In or Create Account": "התחברו או צרו חשבון", + "Zimbabwe": "זימבבואה", + "Zambia": "זמביה", + "Yemen": "תימן", + "Western Sahara": "מערב סהרה", + "Wallis & Futuna": "וואליס ופוטונה", + "Vietnam": "וייטנאם", + "Venezuela": "ונצואלה", + "Vatican City": "ותיקן", + "Use Single Sign On to continue": "השתמש בכניסה חד שלבית על מנת להמשיך", + "Confirm adding this email address by using Single Sign On to prove your identity.": "אשרו הוספת מייל זה על ידי כניסה למערכת להוכיח את זהותכם." } From 0a764fe8e7b3324c4ba53185229e0b1ccfabcbca Mon Sep 17 00:00:00 2001 From: Szimszon Date: Sun, 20 Dec 2020 13:26:27 +0000 Subject: [PATCH 046/231] Translated using Weblate (Hungarian) Currently translated at 99.2% (2695 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 90 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 2739154c19..cbb07067ef 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2846,5 +2846,93 @@ "Change the topic of this room": "A szoba témájának megváltoztatása", "Change which room you're viewing": "Az ön által nézett szoba megváltoztatása", "Send stickers into your active room": "Matricák küldése az ön aktív szobájába", - "Send stickers into this room": "Matricák küldése a szobába" + "Send stickers into this room": "Matricák küldése a szobába", + "Go to Home View": "Irány a Kezdőképernyő", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s vagy %(usernamePassword)s", + "Continue with %(ssoButtons)s": "Folytatás ezzel: %(ssoButtons)s", + "That username already exists, please try another.": "Ez a felhasználói név már létezik, kérlek próbálj ki egy másikat.", + "New? Create account": "Új vagy? Készíts egy fiókot", + "There was a problem communicating with the homeserver, please try again later.": "A szerverrel való kommunikációval probléma történt, kérlek próbáld újra.", + "New here? Create an account": "Új vagy? Készíts egy fiókot", + "Got an account? Sign in": "Van már fiókod? Jelentkezz be", + "Filter rooms and people": "Szobák és emberek szűrése", + "Forgot password?": "Elfelejtetted a jelszót?", + "That phone number doesn't look quite right, please check and try again": "Ez a telefonszám nem tűnik teljesen helyesnek, kérlek ellenőrizd újra", + "Enter phone number": "Telefonszám megadása", + "Enter email address": "E-mail cím megadása", + "Open the link in the email to continue registration.": "A regisztráció folytatásához nyisd meg a hivatkozást az e-mailben.", + "A confirmation email has been sent to %(emailAddress)s": "Megerősítő e-mail elküldve ide: %(emailAddress)s", + "Hold": "Várakoztat", + "Resume": "Folytatás", + "Decline All": "Mindet elutasít", + "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", + "Specify a homeserver": "Matrix szerver megadása", + "Invalid URL": "Érvénytelen URL", + "Unable to validate homeserver": "A matrix szervert nem lehet ellenőrizni", + "Continuing without email": "Folytatás e-mail cím nélkül", + "Reason (optional)": "Ok (opcionális)", + "Continue with %(provider)s": "Folytatás ezzel a szolgáltatóval: %(provider)s", + "Homeserver": "Matrix kiszolgáló", + "Role": "Szerepkör", + "Start a new chat": "Új beszélgetés indítása", + "%(name)s paused": "%(name)s megállítva", + "Return to call": "Visszatérés a híváshoz", + "Fill Screen": "Képernyő kitöltése", + "Voice Call": "Hanghívás", + "Video Call": "Videohívás", + "%(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", + "Show chat effects": "Beszélgetés effektek megjelenítése", + "Use Ctrl + Enter to send a message": "Ctrl + Enter használata az üzenet elküldéséhez", + "Use Command + Enter to send a message": "Operációs rendszer billentyű + Enter használata az üzenet küldéséhez", + "Render LaTeX maths in messages": "LaTeX matematikai kifejezések megjelenítése az üzenetekben", + "See %(msgtype)s messages posted to your active room": "%(msgtype)s üzenetek megjelenítése az aktív szobádban", + "See %(msgtype)s messages posted to this room": "%(msgtype)s üzenetek megjelenítése ebben a szobában", + "See general files posted to your active room": "Az aktív szobádba küldött fájlok megjelenítése", + "See general files posted to this room": "Ebbe a szobába küldött fájlok megjelenítése", + "See videos posted to your active room": "Az aktív szobádba küldött videók megjelenítése", + "See videos posted to this room": "Ebbe a szobába küldött videók megjelenítése", + "See images posted to your active room": "Az aktív szobádba küldött képek megjelenítése", + "See images posted to this room": "Ebbe a szobába küldött képek megjelenítése", + "See text messages posted to your active room": "Az aktív szobádba küldött szöveges üzenetek megjelenítése", + "See text messages posted to this room": "Ebbe a szobába küldött szöveges üzenetek megjelenítése", + "See messages posted to your active room": "Az aktív szobádba küldött üzenetek megjelenítése", + "See messages posted to this room": "Ebbe a szobába küldött üzenetek megjelenítése", + "The %(capability)s capability": "%(capability)s képesség", + "See %(eventType)s events posted to your active room": "%(eventType)s események megjelenítése az aktív szobában", + "Send %(eventType)s events as you in your active room": "%(eventType)s események küldése a nevedben az aktív szobába", + "See %(eventType)s events posted to this room": "%(eventType)s események megjelenítése ebben a szobában", + "Send %(eventType)s events as you in this room": "%(eventType)s esemény küldése a nevedben a szobába", + "with state key %(stateKey)s": "ezzel a státusz kulccsal: %(stateKey)s", + "with an empty state key": "üres státusz kulccsal", + "See when anyone posts a sticker to your active room": "Bárki által az aktív szobádba küldött matrica megjelenítése", + "See when a sticker is posted in this room": "Matrica küldésének megjelenítése ebben a szobában", + "See when the avatar changes in your active room": "Profilkép változás megjelenítése az aktív szobában", + "Change the avatar of your active room": "Az aktív szoba profilképének megváltoztatása", + "See when the avatar changes in this room": "Profilkép változás megjelenítése ebben a szobában", + "See when the name changes in your active room": "Név változásának megjelenítése az aktív szobában", + "Change the name of your active room": "Az aktív szoba nevének megváltoztatása", + "See when the name changes in this room": "Név változásának megjelenítése ebben a szobában", + "See when the topic changes in your active room": "Téma változásának megjelenítése az aktív szobában", + "See when the topic changes in this room": "Szoba téma változásának megmutatása", + "Remain on your screen while running": "Maradjon a képernyőn ameddig amíg fut", + "Remain on your screen when viewing another room, when running": "Maradjon a képernyőn ameddig másik szobát nézel, amíg fut", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "┬──┬ ノ( ゜-゜ノ) -t tesz a szöveg elejére", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "(╯°□°)╯︵ ┻━┻ -t tesz a szöveg elejére", + "Effects": "Effektek", + "You've reached the maximum number of simultaneous calls.": "Elérted az egyidejű hívások maximális számát.", + "Too Many Calls": "Túl sok hívás", + "No other application is using the webcam": "A webkamerát nem használja másik alkalmazás", + "Permission is granted to use the webcam": "A webkamera használatának az engedélye megadva", + "A microphone and webcam are plugged in and set up correctly": "A mikrofon és webkamera csatlakoztatva van és megfelelően be van állítva", + "Unable to access webcam / microphone": "A webkamerát / mikrofont nem lehet használni", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A hívás meghiúsult mert a mikrofont nem lehet használni. Ellenőrizd, hogy csatlakoztatva van-e és megfelelően be van állítva.", + "Unable to access microphone": "A mikrofont nem lehet használni" } From 6a1482bede3e747e8dbe0491280ee36e2ab66473 Mon Sep 17 00:00:00 2001 From: notramo Date: Sat, 19 Dec 2020 14:44:20 +0000 Subject: [PATCH 047/231] Translated using Weblate (Hungarian) Currently translated at 99.2% (2695 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index cbb07067ef..57a3ecd7e5 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1069,7 +1069,7 @@ "Homeserver URL": "Matrixszerver URL", "Identity Server URL": "Azonosítási Szerver URL", "Free": "Szabad", - "Join millions for free on the largest public server": "Milliók kapcsolódnak ingyen a legnagyobb nyilvános szerveren", + "Join millions for free on the largest public server": "Csatlakozzon több millió felhasználóhoz ingyen a legnagyobb nyilvános szerveren", "Premium": "Prémium", "Premium hosting for organisations Learn more": "Prémium üzemeltetés szervezetek részére Tudj meg többet", "Other": "Más", @@ -1804,7 +1804,7 @@ "Enable": "Engedélyez", "%(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.": "A %(brand)sból a titkosított üzenetek biztonságos helyi tárolásához hiányzik néhány dolog. Ha kísérletezni szeretne ezzel a lehetőséggel, akkor fordítson le egy saját %(brand)s Desktopot a kereső komponens hozzáadásával.", "Message search": "Üzenet keresése", - "This room is bridging messages to the following platforms. Learn more.": "Ez a szoba összeköti az üzeneteket a következő platformokkal, tudj meg többet.", + "This room is bridging messages to the following platforms. Learn more.": "Ez a szoba összeköti az üzeneteket a felsorolt platformokkal, tudj meg többet.", "This room isn’t bridging messages to any platforms. Learn more.": "Ez a szoba egy platformmal sem köt össze üzeneteket. Tudj meg többet.", "Bridges": "Hidak", "New session": "Új munkamenet", @@ -2934,5 +2934,21 @@ "A microphone and webcam are plugged in and set up correctly": "A mikrofon és webkamera csatlakoztatva van és megfelelően be van állítva", "Unable to access webcam / microphone": "A webkamerát / mikrofont nem lehet használni", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A hívás meghiúsult mert a mikrofont nem lehet használni. Ellenőrizd, hogy csatlakoztatva van-e és megfelelően be van állítva.", - "Unable to access microphone": "A mikrofont nem lehet használni" + "Unable to access microphone": "A mikrofont nem lehet használni", + "Already have an account? Sign in here": "Van már fiókod? Belépés", + "Use email to optionally be discoverable by existing contacts.": "Az e-mail (nem kötelező) megadása segíthet abban, hogy az ismerőseid megtaláljanak Matrix-on.", + "Use email or phone to optionally be discoverable by existing contacts.": "Az e-mail, vagy telefonszám használatával a jelenlegi ismerőseid is megtalálhatnak.", + "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.", + "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use Element with an existing Matrix account on a different homeserver.": "Megadhatsz egyéni szervert, amit használni szeretnél, a címének beírásával. Ez lehetővé teszi, hogy, ha a fiókod másik szerveren van, be tudj jelentkezni oda.", + "Server Options": "Szerver lehetőségek", + "Learn more": "Tudj meg többet", + "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.", + "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", + "Host account on": "Fiók létrehozása itt:", + "We call the places where you can host your account ‘homeservers’.": "Matrix szervereknek nevezzük azokat a helyeket, ahol fiókot lehet létrehozni.", + "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 ezt:", + "Decide where your account is hosted": "Döntse el, hol szeretne fiókot létrehozni!" } From 3fa8e2c779d52b4281dc16a0e237510d0228cf56 Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Sat, 19 Dec 2020 12:47:15 +0000 Subject: [PATCH 048/231] Translated using Weblate (Russian) Currently translated at 100.0% (2715 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 1a5e35714e..6187e479ee 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -2965,5 +2965,7 @@ "You've reached the maximum number of simultaneous calls.": "Вы достигли максимального количества одновременных звонков.", "Too Many Calls": "Слишком много звонков", "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Добавляет ┬──┬ ノ( ゜-゜ノ) в начало сообщения", - "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Добавляет (╯°□°)╯︵ ┻━┻ в начало сообщения" + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Добавляет (╯°□°)╯︵ ┻━┻ в начало сообщения", + "sends fireworks": "отправляет фейерверк", + "Sends the given message with fireworks": "Отправляет сообщение с фейерверком" } From fac5c8d9e3144aaca49508c9e240ef5d2ad063df Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Sat, 19 Dec 2020 13:24:46 +0000 Subject: [PATCH 049/231] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2715 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 4152a4cb95..82749d8d48 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2976,5 +2976,7 @@ "You've reached the maximum number of simultaneous calls.": "您已達到同時通話的最大數量。", "Too Many Calls": "太多通話", "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "在純文字訊息前加入 ┬──┬ ノ( ゜-゜ノ)", - "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "在純文字訊息前加入 (╯°□°)╯︵ ┻━┻" + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "在純文字訊息前加入 (╯°□°)╯︵ ┻━┻", + "sends fireworks": "傳送煙火", + "Sends the given message with fireworks": "與煙火一同傳送指定訊息" } From 8cb9d915feb57396b3ef44dfa44fbcf4d2dc49f2 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Mon, 21 Dec 2020 09:55:33 +0000 Subject: [PATCH 050/231] Translated using Weblate (Czech) Currently translated at 100.0% (2715 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index a0138fe786..3c3485b035 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1820,7 +1820,7 @@ "Encrypted by a deleted session": "Šifrované smazanou relací", "Invite only": "Pouze na pozvání", "Send a reply…": "Odpovědět…", - "Send a message…": "Napsat zprávu…", + "Send a message…": "Odeslat zprávu…", "Direct Messages": "Přímé zprávy", "Reject & Ignore user": "Odmítnout & ignorovat uživatele", "Unknown Command": "Neznámý příkaz", From 270048a69e1f55298e59b81d16b013a08d4e5b23 Mon Sep 17 00:00:00 2001 From: XoseM Date: Sat, 19 Dec 2020 05:21:30 +0000 Subject: [PATCH 051/231] Translated using Weblate (Galician) Currently translated at 100.0% (2715 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index cc3575dbb3..362d526200 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -920,7 +920,7 @@ "Messages": "Mensaxes", "Actions": "Accións", "Other": "Outro", - "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Anteponse ¯\\_(ツ)_/¯ a mensaxe en texto plano", + "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Antecede con ¯\\_(ツ)_/¯ a mensaxe en texto plano", "Sends a message as plain text, without interpreting it as markdown": "Envía unha mensaxe como texto plano, sen interpretalo como markdown", "Sends a message as html, without interpreting it as markdown": "Envía unha mensaxe como html, sen interpretalo como markdown", "Upgrades a room to a new version": "Subir a sala de versión", @@ -2971,5 +2971,9 @@ "You held the call Resume": "Colgaches a chamada, Retomar", "You've reached the maximum number of simultaneous calls.": "Acadaches o número máximo de chamadas simultáneas.", "Too Many Calls": "Demasiadas chamadas", - "%(name)s paused": "detido por %(name)s" + "%(name)s paused": "detido por %(name)s", + "sends fireworks": "envía fogos de artificio", + "Sends the given message with fireworks": "Envia a mensaxe dada con fogos de artificio", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Antecede con ┬──┬ ノ( ゜-゜ノ) a unha mensaxe de texto plano", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Antecede con (╯°□°)╯︵ ┻━┻ a unha mensaxe de texto plano" } From 587d209bf8a2f22653891086aad664c829397709 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Sat, 19 Dec 2020 09:15:40 +0000 Subject: [PATCH 052/231] Translated using Weblate (Albanian) Currently translated at 99.7% (2707 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 827df3fb70..4c6e5dccde 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2963,5 +2963,9 @@ "You've reached the maximum number of simultaneous calls.": "Keni mbërritur në numrin maksimum të thirrjeve të njëkohshme.", "Too Many Calls": "Shumë Thirrje", "Call failed because webcam or microphone could not be accessed. Check that:": "Thirrja dështoi, ngaqë s’u hy dot kamera ose mikrofoni. Kontrolloni që:", - "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Thirrja dështoi, ngaqë s’u hy dot te mikrofoni. Kontrolloni që të jetë futur një mikrofon dhe të jetë ujdisur saktësisht." + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Thirrja dështoi, ngaqë s’u hy dot te mikrofoni. Kontrolloni që të jetë futur një mikrofon dhe të jetë ujdisur saktësisht.", + "sends fireworks": "dërgon fishekzjarrë", + "Sends the given message with fireworks": "E dërgon me fishekzjarrë mesazhin e dhënë", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "E paraprin një mesazh tekst i thjeshtë me ┬──┬ ノ( ゜-゜ノ)", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "E paraprin një mesazh tekst i thjeshtë me (╯°□°)╯︵ ┻━┻" } From d528821eed99535f63bb00acfcdd63fa4aa74296 Mon Sep 17 00:00:00 2001 From: Nils Haugen Date: Sat, 19 Dec 2020 14:45:27 +0000 Subject: [PATCH 053/231] Translated using Weblate (Norwegian Nynorsk) Currently translated at 45.4% (1233 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nn/ --- src/i18n/strings/nn.json | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/nn.json b/src/i18n/strings/nn.json index be785e3f11..70b242d06d 100644 --- a/src/i18n/strings/nn.json +++ b/src/i18n/strings/nn.json @@ -744,7 +744,7 @@ "Labs": "Labben", "Check for update": "Sjå etter oppdateringar", "Reject all %(invitedRooms)s invites": "Kanseller alle invitasjonar frå %(invitedRooms)s", - "Start automatically after system login": "Start automagisk etter systeminnlogging", + "Start automatically after system login": "Start automatisk etter systeminnlogging", "No media permissions": "Ingen mediatilgang", "You may need to manually permit %(brand)s to access your microphone/webcam": "Det kan henda at du må gje %(brand)s tilgang til mikrofonen/nettkameraet for hand", "No Audio Outputs detected": "Ingen ljodavspelingseiningar funne", @@ -1332,5 +1332,33 @@ "Order rooms by name": "Sorter rom etter namn", "Show rooms with unread notifications first": "Vis rom med ulesne varsel fyrst", "Show rooms with unread messages first": "Vis rom med ulesne meldingar fyrst", - "People": "Folk" + "People": "Folk", + "Show tray icon and minimize window to it on close": "Vis ikon i systemstatusfeltet og minimer vindauget dit ved lukking", + "Always show the window menu bar": "Vis alltid menyfeltet i toppen av vindauget", + "Report a bug": "Send inn feilrapport", + "%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please submit a bug report.": "Feilkode %(errcode)s vart returnert under lasting av rommet. Viss du trur dette er ein feil, send inn ein feilrapport.", + "Feedback": "Tilbakemeldingar", + "Security & privacy": "Sikkerheit og personvern", + "All settings": "Alle innstillingar", + "Use default": "Bruk standard", + "Delete Backup": "Slett sikkerheitskopi", + "Restore from Backup": "Gjenopprett frå sikkerheitskopi", + "This session is backing up your keys. ": "Denne økta har aktivert sikkerheitskopiering av nøklane dine ", + "Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key.": "Lag sikkerheitskopiar av krypteringsnøklane saman med kontoinnstillingane, slik at du kan gjenopprette data viss det skulle skje at du å mister tilgang til øktene dine. Sikkerheitskopiane er beskytta med ein unik gjenopprettingsnøkkel (Recovery Key).", + "Encryption": "Kryptografi", + "Use Ctrl + Enter to send a message": "Bruk tastekombinasjonen Ctrl + Enter for å sende meldingar", + "Set the name of a font installed on your system & %(brand)s will attempt to use it.": "Skriv namnet på skrifttypen(fonten) og %(brand)s forsøka å henta den frå operativsystemet.", + "Use a system font": "Bruk tilpassa skrifttype henta frå operativsystemet", + "System font name": "Namn på skrifttype", + "Enable experimental, compact IRC style layout": "Bruk ei kompakt, IRC-liknande visning (eksperimentell)", + "Use a more compact ‘Modern’ layout": "Bruk 'Modern layout' - ei meir kompakt visning", + "Custom font size can only be between %(min)s pt and %(max)s pt": "Tilpassa skriftstorleik må vere mellom %(min)s og %(max)s punkt", + "Font size": "Skriftstorleik", + "Dark": "Mørkt tema", + "Light": "Lyst tema", + "Appearance": "Utsjånad", + "Appearance Settings only affect this %(brand)s session.": "Innstillingane gjeld berre for denne %(brand)s-økta.", + "Customise your appearance": "Tilpass utsjånad", + "Change notification settings": "Endra varslingsinnstillingar", + "Enable desktop notifications": "Aktiver skrivebordsvarsel" } From 2442cf66b6cdc48f7a67dae5561f5be979355737 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Sat, 19 Dec 2020 20:43:33 +0000 Subject: [PATCH 054/231] Translated using Weblate (Estonian) Currently translated at 100.0% (2715 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 80 +++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 38 deletions(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 10f4b6f4a0..fcd0747b0f 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -62,7 +62,7 @@ "Voice call": "Häälkõne", "Video call": "Videokõne", "Hangup": "Katkesta kõne", - "Upload file": "Lae fail üles", + "Upload file": "Laadi fail üles", "Send an encrypted reply…": "Saada krüptitud vastus…", "Send a reply…": "Saada vastus…", "Send an encrypted message…": "Saada krüptitud sõnum…", @@ -105,7 +105,7 @@ "expand": "laienda", "Communities": "Kogukonnad", "You cannot delete this image. (%(code)s)": "Sa ei saa seda pilti eemaldada, (%(code)s)", - "Uploaded on %(date)s by %(user)s": "Üles laetud %(date)s %(user)s poolt", + "Uploaded on %(date)s by %(user)s": "Üles laaditud %(date)s %(user)s poolt", "Rotate Left": "Pööra vasakule", "Rotate counter-clockwise": "Pööra vastupäeva", "Rotate Right": "Pööra paremale", @@ -157,7 +157,7 @@ "Remove from community": "Eemalda kogukonnast", "Remove this user from community?": "Kas eemaldan selle kasutaja kogukonnast?", "Failed to remove user from community": "Kasutaja eemaldamine kogukonnast ebaõnnestus", - "Failed to load group members": "Grupi liikmete laadimine ebaõnnestus", + "Failed to load group members": "Grupi liikmete laadimine ei õnnestunud", "Filter community members": "Filtreeri kogukonna liikmeid", "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "Kas sa soovid eemaldada %(roomName)s jututoa %(groupId)s kogukonnast?", "Removing a room from the community will also remove it from the community page.": "Eemaldades jututoa kogukonnast eemaldad selle ka kogukonna lehelt.", @@ -172,11 +172,11 @@ "%(networkName)s rooms": "%(networkName)s jututoad", "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.": "Kas sa oled kindel et soovid eemaldada (kustutada) seda sündmust? Pane tähele, et see muutus võib tagasi pöörduda, kui muudad hiljem jututoa nime või teema nime.", "Sign out and remove encryption keys?": "Logi välja ja eemalda krüptimisvõtmed?", - "Upload files (%(current)s of %(total)s)": "Lae failid üles (%(current)s / %(total)s)", - "Upload files": "Lae failid üles", + "Upload files (%(current)s of %(total)s)": "Laadin faile üles (%(current)s / %(total)s)", + "Upload files": "Laadi failid üles", "These files are too large to upload. The file size limit is %(limit)s.": "Need failid on üleslaadimiseks liiga suured. Failisuuruse piir on %(limit)s.", "Some files are too large to be uploaded. The file size limit is %(limit)s.": "Mõned failid on üleslaadimiseks liiga suured. Failisuuruse piir on %(limit)s.", - "Upload %(count)s other files|other": "Lae üles %(count)s muud faili", + "Upload %(count)s other files|other": "Laadi üles %(count)s muud faili", "Unable to reject invite": "Ei õnnestu kutset tagasi lükata", "Resend": "Saada uuesti", "Resend edit": "Saada muudetud sõnum uuesti", @@ -222,7 +222,7 @@ "Remove %(name)s from the directory?": "Eemalda %(name)s kataloogist?", "Remove from Directory": "Eemalda kataloogist", "remove %(name)s from the directory.": "eemalda %(name)s kataloogist.", - "You seem to be uploading files, are you sure you want to quit?": "Tundub, et sa parasjagu laed faile üles. Kas sa kindlasti soovid väljuda?", + "You seem to be uploading files, are you sure you want to quit?": "Tundub, et sa parasjagu laadid faile üles. Kas sa kindlasti soovid väljuda?", "Failed to set direct chat tag": "Otsevestluse sildi lisamine ei õnnestunud", "Failed to remove tag %(tagName)s from room": "Sildi %(tagName)s eemaldamine jututoast ebaõnnestus", "Calls": "Kõned", @@ -322,7 +322,7 @@ "Attachment": "Manus", "Error decrypting attachment": "Viga manuse dekrüptimisel", "Decrypt %(text)s": "Dekrüpti %(text)s", - "Download %(text)s": "Lae alla %(text)s", + "Download %(text)s": "Laadi alla %(text)s", "Invalid file%(extra)s": "Vigane fail %(extra)s", "Error decrypting image": "Viga pildi dekrüptimisel", "Show image": "Näita pilti", @@ -416,7 +416,7 @@ "System Alerts": "Süsteemi teated", "This room": "See jututuba", "Joining room …": "Liitun jututoaga …", - "Loading …": "Laen …", + "Loading …": "Laadin …", "e.g. %(exampleValue)s": "näiteks %(exampleValue)s", "Could not find user in room": "Jututoast ei leidnud kasutajat", "Show timestamps in 12 hour format (e.g. 2:30pm)": "Näita ajatempleid 12-tunnises vormingus (näiteks 2:30pl)", @@ -468,7 +468,7 @@ "Search…": "Otsi…", "Cancel search": "Tühista otsing", "Search failed": "Otsing ebaõnnestus", - "Server may be unavailable, overloaded, or search timed out :(": "Server kas pole leitav, on üle koormatud või otsing aegus :(", + "Server may be unavailable, overloaded, or search timed out :(": "Server kas pole leitav, on ülekoormatud või otsing aegus :(", "No more results": "Rohkem otsingutulemusi pole", "%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "Otsingus kasutamiseks %(brand)s puhverdab turvaliselt kohalikku arvutisse krüptitud sõnumeid:", "%(brand)s does not have permission to send you notifications - please check your browser settings": "%(brand)s'il puudub luba sulle teavituste kuvamiseks - palun kontrolli oma brauseri seadistusi", @@ -584,10 +584,10 @@ "You have verified this user. This user has verified all of their sessions.": "Sa oled selle kasutaja verifitseerinud. See kasutaja on verifitseerinud kõik nende sessioonid.", "Someone is using an unknown session": "Keegi kasutab tundmatut sessiooni", "This event could not be displayed": "Seda sündmust ei õnnestunud kuvada", - "Downloading update...": "Laen alla uuendust...", - "Download this file": "Lae see fail alla", + "Downloading update...": "Laadin alla uuendust...", + "Download this file": "Laadi see fail alla", "You can now close this window or log in to your new account.": "Sa võid nüüd sulgeda selle akna või logida sisse oma uuele kontole.", - "Download": "Lae alla", + "Download": "Laadi alla", "Your recovery key is in your Downloads folder.": "Sinu taastevõti on sinu Allalaadimised kasutas.", "Disable": "Lülita välja", "Not currently indexing messages for any room.": "Mitte ainsamagi jututoa sõnumeid hetkel ei indekseerita.", @@ -619,7 +619,7 @@ "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s muutis jututoa vana nime %(oldRoomName)s uueks nimeks %(newRoomName)s.", "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s muutis jututoa nimeks %(roomName)s.", "Show info about bridges in room settings": "Näita jututoa seadistustes teavet sõnumisildade kohta", - "Upload": "Lae üles", + "Upload": "Laadi üles", "Save": "Salvesta", "General": "Üldist", "Notifications": "Teavitused", @@ -701,7 +701,7 @@ "Show display name changes": "Näita kuvatava nime muutusi", "Match system theme": "Kasuta süsteemset teemat", "Messages containing my display name": "Sõnumid, mis sisaldavad minu kuvatavat nime", - "Failed to upload profile picture!": "Profiilipildi üleslaadimine ebaõnnestus!", + "Failed to upload profile picture!": "Profiilipildi üleslaadimine ei õnnestunud!", "No display name": "Kuvatav nimi puudub", "New passwords don't match": "Uued salasõnad ei klapi", "Passwords can't be empty": "Salasõna ei saa olla tühi", @@ -920,9 +920,9 @@ "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "Üritasin laadida teatud hetke selle jututoa ajajoonelt, kuid sul ei ole õigusi selle sõnumi nägemiseks.", "Failed to load timeline position": "Asukoha laadimine ajajoonel ei õnnestunud", "Guest": "Külaline", - "Uploading %(filename)s and %(count)s others|other": "Laen üles %(filename)s ning %(count)s muud faili", - "Uploading %(filename)s and %(count)s others|zero": "Laen üles %(filename)s", - "Uploading %(filename)s and %(count)s others|one": "Laen üles %(filename)s ning veel %(count)s faili", + "Uploading %(filename)s and %(count)s others|other": "Laadin üles %(filename)s ning %(count)s muud faili", + "Uploading %(filename)s and %(count)s others|zero": "Laadin üles %(filename)s", + "Uploading %(filename)s and %(count)s others|one": "Laadin üles %(filename)s ning veel %(count)s faili", "Verify this login": "Verifitseeri see sisselogimissessioon", "Session verified": "Sessioon on verifitseeritud", "Failed to send email": "E-kirja saatmine ebaõnnestus", @@ -974,7 +974,7 @@ "You have no visible notifications": "Sul ei ole nähtavaid teavitusi", "%(brand)s failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "%(brand)s'il ei õnnestunud koduserverist laadida toetatud protokollide loendit. Toetamaks kolmandate osapoolte võrke võib koduserver olla liiga vana.", "%(brand)s failed to get the public room list.": "%(brand)s'il ei õnnestunud laadida avalike jututubade loendit.", - "The homeserver may be unavailable or overloaded.": "Koduserver pole kas saadaval või on üle koormatud.", + "The homeserver may be unavailable or overloaded.": "Koduserver pole kas saadaval või on ülekoormatud.", "Room not found": "Jututuba ei leidunud", "Preview": "Eelvaade", "View": "Näita", @@ -1011,7 +1011,7 @@ "Everyone": "Kes iganes soovib", "Your community hasn't got a Long Description, a HTML page to show to community members.
        Click here to open settings and give it one!": "Sinu kogukonnal on puudu pikk kirjeldus, mis pole muud, kui lihtne HTML-leht, mida kuvatakse liikmetele.
        Klõpsi siia ja loo selline leht!", "Long Description (HTML)": "Pikk kirjeldus (HTML)", - "Upload avatar": "Lae üles profiilipilt ehk avatar", + "Upload avatar": "Laadi üles profiilipilt ehk avatar", "Description": "Kirjeldus", "Community %(groupId)s not found": "%(groupId)s kogukonda ei leidunud", "This homeserver does not support communities": "See koduserver ei toeta kogukondade funktsionaalsust", @@ -1030,7 +1030,7 @@ "Click here to fix": "Parandamiseks klõpsi siia", "Server error": "Serveri viga", "Command error": "Käsu viga", - "Server unavailable, overloaded, or something else went wrong.": "Kas server pole saadaval, on üle koormatud või midagi muud läks viltu.", + "Server unavailable, overloaded, or something else went wrong.": "Server pole kas saadaval, on ülekoormatud või midagi muud läks viltu.", "Unknown Command": "Tundmatu käsk", "Unrecognised command: %(commandText)s": "Tundmatu käsk: %(commandText)s", "Send as message": "Saada sõnumina", @@ -1054,7 +1054,7 @@ "Rejecting invite …": "Hülgan kutset …", "Join the conversation with an account": "Liitu vestlusega kasutades oma kontot", "Sign Up": "Registreeru", - "Loading room preview": "Laen jututoa eelvaadet", + "Loading room preview": "Laadin jututoa eelvaadet", "You were kicked from %(roomName)s by %(memberName)s": "%(memberName)s müksas sind välja jututoast %(roomName)s", "Reason: %(reason)s": "Põhjus: %(reason)s", "Forget this room": "Unusta see jututuba", @@ -1177,13 +1177,13 @@ "Recently Direct Messaged": "Viimased otsesõnumite saajad", "Invite someone using their name, username (like ), email address or share this room.": "Kutsu kedagi tema nime, kasutajanime (nagu ), e-posti aadressi alusel või jaga seda jututuba.", "Upload completed": "Üleslaadimine valmis", - "%(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 kasutab varasemaga võrreldes 3-5 korda vähem mälu, sest laeb teavet kasutajate kohta vaid siis, kui vaja. Palun oota hetke, kuni sünkroniseerime andmeid serveriga!", + "%(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 kasutab varasemaga võrreldes 3-5 korda vähem mälu, sest laadib teavet kasutajate kohta vaid siis, kui vaja. Palun oota hetke, kuni sünkroniseerime andmeid serveriga!", "Updating %(brand)s": "Uuendan rakendust %(brand)s", "I don't want my encrypted messages": "Ma ei soovi oma krüptitud sõnumeid", "Manually export keys": "Ekspordi võtmed käsitsi", "You'll lose access to your encrypted messages": "Sa kaotad ligipääsu oma krüptitud sõnumitele", "Are you sure you want to sign out?": "Kas sa oled kindel, et soovid välja logida?", - "Upload %(count)s other files|one": "Lae üles %(count)s muu fail", + "Upload %(count)s other files|one": "Laadi üles %(count)s muu fail", "Cancel All": "Tühista kõik", "Upload Error": "Üleslaadimise viga", "Verify other session": "Verifitseeri teine sessioon", @@ -1275,7 +1275,7 @@ "Your password has been reset.": "Sinu salasõna on muudetud.", "Dismiss read marker and jump to bottom": "Ära arvesta loetud sõnumite järjehoidjat ning mine kõige lõppu", "Jump to oldest unread message": "Mine vanima lugemata sõnumi juurde", - "Upload a file": "Lae fail üles", + "Upload a file": "Laadi fail üles", "Read Marker lifetime (ms)": "Lugemise markeri iga (ms)", "Unignore": "Lõpeta eiramine", "": "", @@ -1289,7 +1289,7 @@ "Key backup": "Võtmete varundus", "Cross-signing": "Risttunnustamine", "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.": "Hoiatus: Jututoa versiooni uuendamine ei koli jututoa liikmeid automaatselt uude jututoa olekusse. Vanas jututoa versioonis saab olema viide uuele versioonile ning kõik liikmed peavad seda viidet klõpsama.", - "Uploaded sound": "Üleslaetud heli", + "Uploaded sound": "Üleslaaditud heli", "Sounds": "Helid", "Notification sound": "Teavitusheli", "Reset": "Taasta algolek", @@ -1326,7 +1326,7 @@ "The file '%(fileName)s' failed to upload.": "Faili '%(fileName)s' üleslaadimine ei õnnestunud.", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "Faili '%(fileName)s' suurus ületab serveris seadistatud üleslaadimise piiri", "Upload Failed": "Üleslaadimine ei õnnestunud", - "Server may be unavailable, overloaded, or you hit a bug.": "Server kas pole võrgus või on üle koormatud, aga võib-olla oled komistanud süsteemivea otsa.", + "Server may be unavailable, overloaded, or you hit a bug.": "Server kas pole võrgus või on ülekoormatud, aga võib-olla oled hoopis komistanud süsteemivea otsa.", "The server does not support the room version specified.": "See server ei toeta antud jututoa versiooni.", "Failure to create room": "Jututoa loomine ei õnnestunud", "If you cancel now, you won't complete verifying the other user.": "Kui sa katkestad nüüd, siis sul jääb teise kasutaja verifitseerimine lõpetamata.", @@ -1370,7 +1370,7 @@ "Ensure you have a stable internet connection, or get in touch with the server admin": "Palun kontrolli, kas sul on toimiv internetiühendus ning kui on, siis küsi abi koduserveri haldajalt", "Your %(brand)s is misconfigured": "Sinu %(brand)s'i seadistused on paigast ära", "Your homeserver does not support session management.": "Sinu koduserver ei toeta sessioonide haldust.", - "Unable to load session list": "Sessioonide laadimine ei õnnestunud", + "Unable to load session list": "Sessioonide loendi laadimine ei õnnestunud", "Identity server URL does not appear to be a valid identity server": "Isikutuvastusserveri aadress ei tundu viitama kehtivale isikutuvastusserverile", "Looks good!": "Tundub õige!", "Use Recovery Key or Passphrase": "Kasuta taastevõtit või paroolifraasi", @@ -1579,8 +1579,8 @@ "You can now return to your account after signing out, and sign in on other devices.": "Nüüd sa saad peale väljalogimist pöörduda tagasi oma konto juurde või logida sisse muudest seadmetest.", "Remember, you can always set an email address in user settings if you change your mind.": "Jäta meelde, et sa saad alati hiljem määrata kasutajaseadetest oma e-posti aadressi.", "Use bots, bridges, widgets and sticker packs": "Kasuta roboteid, sõnumisildu, vidinaid või kleepsupakke", - "Upload all": "Lae kõik üles", - "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "See fail on üleslaadimiseks liiga suur. Üleslaetavate failide mahupiir on %(limit)s, kuid selle faili suurus on %(sizeOfThisFile)s.", + "Upload all": "Laadi kõik üles", + "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "See fail on üleslaadimiseks liiga suur. Üleslaaditavate failide mahupiir on %(limit)s, kuid selle faili suurus on %(sizeOfThisFile)s.", "Appearance": "Välimus", "Enter recovery passphrase": "Sisesta taastamise paroolifraas", "For security, this session has been signed out. Please sign in again.": "Turvalisusega seotud põhjustel on see sessioon välja logitud. Palun logi uuesti sisse.", @@ -1751,7 +1751,7 @@ "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s lahkusid ja liitusid uuesti", "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s lahkus ja liitus uuesti %(count)s korda", "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s lahkus ja liitus uuesti", - "To use it, just wait for autocomplete results to load and tab through them.": "Selle kasutamiseks oota, kuni automaatne sõnalõpetus laeb kõik valikud ja sa saad nad läbi lapata.", + "To use it, just wait for autocomplete results to load and tab through them.": "Selle kasutamiseks oota, kuni automaatne sõnalõpetus laadib kõik valikud ja sa saad nad läbi lapata.", "Bans user with given id": "Keela ligipääs antud tunnusega kasutajale", "Unbans user with given ID": "Taasta ligipääs antud tunnusega kasutajale", "Ignores a user, hiding their messages from you": "Eirab kasutajat peites kõik tema sõnumid sinu eest", @@ -1806,7 +1806,7 @@ "This bridge is managed by .": "Seda võrgusilda haldab .", "Workspace: %(networkName)s": "Tööruum: %(networkName)s", "Channel: %(channelName)s": "Kanal: %(channelName)s", - "Upload new:": "Lae üles uus:", + "Upload new:": "Laadi üles uus:", "Export E2E room keys": "Ekspordi jututubade läbiva krüptimise võtmed", "Your homeserver does not support cross-signing.": "Sinu koduserver ei toeta risttunnustamist.", "Cross-signing and secret storage are enabled.": "Risttunnustamine ja turvahoidla on kasutusel.", @@ -1843,7 +1843,7 @@ "Legal": "Juriidiline teave", "Credits": "Tänuavaldused", "Bug reporting": "Vigadest teatamine", - "Clear cache and reload": "Tühjenda puhver ja lae uuesti", + "Clear cache and reload": "Tühjenda puhver ja laadi uuesti", "FAQ": "Korduma kippuvad küsimused", "Versions": "Versioonid", "%(brand)s version:": "%(brand)s'i versioon:", @@ -1905,7 +1905,7 @@ "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (õigused %(powerLevelNumber)s)", "Emoji picker": "Emoji'de valija", "No pinned messages.": "Klammerdatud sõnumeid ei ole.", - "Loading...": "Laen...", + "Loading...": "Laadin...", "Pinned Messages": "Klammerdatud sõnumid", "Unpin Message": "Eemalda sõnumi klammerdus", "No recently visited rooms": "Hiljuti külastatud jututubasid ei leidu", @@ -2414,13 +2414,13 @@ "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.": "Kui %(brand)s teine versioon on mõnel teisel vahekaardil endiselt avatud, palun sulge see. %(brand)s kasutamine samal serveril põhjustab vigu olukorras, kus laisk laadimine on samal ajal lubatud ja keelatud.", "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "%(brand)s vanema versiooni andmed on tuvastatud. See kindlasti põhjustab läbiva krüptimise tõrke vanemas versioonis. Läbivalt krüptitud sõnumid, mida on vanema versiooni kasutamise ajal hiljuti vahetatud, ei pruugi selles versioonis olla dekrüptitavad. See võib põhjustada vigu ka selle versiooniga saadetud sõnumite lugemisel. Kui teil tekib probleeme, logige välja ja uuesti sisse. Sõnumite ajaloo säilitamiseks eksportige ja uuesti importige oma krüptovõtmed.", "Navigation": "Navigeerimine", - "Uploading logs": "Laen üles logisid", - "Downloading logs": "Laen alla logisid", + "Uploading logs": "Laadin logisid üles", + "Downloading logs": "Laadin logisid alla", "Can't see what you’re looking for?": "Kas sa ei leia seda, mida otsisid?", "Explore all public rooms": "Sirvi kõiki avalikke jututubasid", "%(count)s results|other": "%(count)s tulemust", "Preparing to download logs": "Valmistun logikirjete allalaadimiseks", - "Download logs": "Lae logikirjed alla", + "Download logs": "Laadi logikirjed alla", "Unexpected server error trying to leave the room": "Jututoast lahkumisel tekkis serveris ootamatu viga", "Error leaving room": "Viga jututoast lahkumisel", "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Kogukondade v2 prototüüp. Eeldab, et koduserver toetab sellist funktsionaalsust. Lahendus on esialgne ja katseline - kui kasutad, siis väga ettevaatlikult.", @@ -2972,5 +2972,9 @@ "You held the call Resume": "Sa panid kõne ootele. Jätka kõnet", "You've reached the maximum number of simultaneous calls.": "Oled jõudnud suurima lubatud samaaegsete kõnede arvuni.", "%(name)s paused": "%(name)s peatas ajutiselt kõne", - "Too Many Calls": "Liiga palju kõnesid" + "Too Many Calls": "Liiga palju kõnesid", + "sends fireworks": "saadab ilutulestiku", + "Sends the given message with fireworks": "Lisab sellele sõnumile ilutulestiku", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Lisab vormindamata sõnumi ette ┬──┬ ノ( ゜-゜ノ)", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Lisab vormindamata sõnumi ette (╯°□°)╯︵ ┻━┻" } From 2e180d0d9490932f95f36218848542f262dd4ceb Mon Sep 17 00:00:00 2001 From: Rachida S Date: Sat, 19 Dec 2020 09:49:59 +0000 Subject: [PATCH 055/231] Translated using Weblate (Kabyle) Currently translated at 82.7% (2247 of 2715 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index e8ab1272a1..93552f4c70 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -959,7 +959,7 @@ "Pinned Messages": "Iznan yerzin", "Online for %(duration)s": "Srid azal n %(duration)s", "Idle for %(duration)s": "D arurmid azal n %(duration)s", - "Offline for %(duration)s": "Beṛṛa n tuqqna azal n %(duration)s", + "Offline for %(duration)s": "Beṛṛa n tuqqna azal n %(duration)s", "Seen by %(userName)s at %(dateTime)s": "Iwala-t %(userName)s at %(dateTime)s", "Replying": "Tiririt", "Guests can join": "Inebgawen zemren ad ttekkin", @@ -2003,7 +2003,7 @@ "Read Marker off-screen lifetime (ms)": "Ɣer tanzagt n tudert n tecreḍt beṛṛa n ugdil (ms)", "Unignore": "Ur yettwazgel ara", "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Anedbal-ik·im n uqeddac issens awgelhen seg yixef ɣer yixef s wudem amezwer deg texxamin tusligin & yiznan usriden.", - "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Sefrek ismawen syen ffeɣ seg tɣimiyin-ik·im ddaw neɣ senqed-itent deg umaɣnu-ik·im n useqdac.", + "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Sefrek ismawen syen ffeɣ seg tɣimiyin-ik·im ddaw neɣ senqed-itent deg umaɣnu-ik·im n useqdac.", "A session's public name is visible to people you communicate with": "Isem n tiɣimit tazayezt yettban i yimdanen wukud tettmeslayeḍ", "%(brand)s collects anonymous analytics to allow us to improve the application.": "%(brand)s ileqqeḍ tasleḍt tudrigt i wakken ad aɣ-iɛawen ad nesnerni asnas.", "You have ignored this user, so their message is hidden. Show anyways.": "Tzegleḍ useqdac-a, ihi iznan-ines ffren. Ɣas akken sken-iten-id.", @@ -2119,7 +2119,7 @@ "Remember my selection for this widget": "Cfu ɣef tefrant-inu i uwiǧit-a", "Wrong file type": "Anaw n yifuyla d arameɣtu", "Looks good!": "Yettban igerrez!", - "Enter your Security Phrase or to continue.": "Sekcem tafyirt-ik·im n tɣellist neɣ to continue.": "Sekcem tafyirt-ik·im n tɣellist neɣ i wakken ad tkemmleḍ.", "Warning: you should only set up key backup from a trusted computer.": "Ɣur-k·m: ilaq ad tesbaduḍ aḥraz n tsarut seg uselkim kan iɣef tettekleḍ.", "Warning: You should only set up key backup from a trusted computer.": "Ɣur-k·m: Ilaq ad tesbaduḍ aḥraz n tsarut seg uselkim kan iɣef tettekleḍ.", "Please check your email to continue registration.": "Ttxil-k·m senqed imayl-ik·im i wakken ad tkemmleḍ asekles.", @@ -2283,7 +2283,7 @@ "Server did not require any authentication": "Aqeddac ur isuter ara akk asesteb", "Server did not return valid authentication information.": "Aqeddac ur d-yerri ara talɣut n usesteb tameɣtut.", "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "Ttxil-k·m ttu akk iznan i yuzneɣ mi ara senseɣ amiḍan-iw (Ɣur-k·m: iseqdacen ara d-yernun ad walin idiwenniyen ur nemmid ara)", - "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Senqed aseqdac-a i wakken ad tcerḍeḍ fell-as d uttkil. Iseqdac uttkilen ad ak·am-d-awin lehna meqqren meqqren i uqerru mi ara tesseqdaceḍ iznan yettwawgelhen seg yixef ɣer yixef.", + "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Senqed aseqdac-a i wakken ad tcerḍeḍ fell-as d uttkil. Iseqdac uttkilen ad ak·am-d-awin lehna meqqren i uqerru mi ara tesseqdaceḍ iznan yettwawgelhen seg yixef ɣer yixef.", "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Asenqed n useqdac-a ad yecreḍ ɣef tɣimit-is tettwattkal, yerna ad yecreḍ ula ɣef tɣimit-ik·im tettwattkal i netta·nettat.", "Enable 'Manage Integrations' in Settings to do this.": "Rmed 'imsidaf n usefrek' deg yiɣewwaren i tigin n waya.", "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s-ik·im ur ak·am yefki ara tisirag i useqdec n umsefrak n umsidef i wakken ad tgeḍ aya. Ttxil-k·m nermes anedbal.", @@ -2300,7 +2300,7 @@ "If they don't match, the security of your communication may be compromised.": "Ma yella ur mṣadan ara, taɣellist n teywalt-ik·im tezmer ad tettwaker.", "Your homeserver doesn't seem to support this feature.": "Aqeddac-ik·im agejdan ur yettban ara yessefrak tamahilt-a.", "The internet connection either session is using": "Tuqqna n internet yettusqedcen deg yal tiɣimit", - "We recommend you change your password and recovery key in Settings immediately": "Ad ak·akem-nwellah ad tesnifleḍ awal-ik·im uffir d tsarut n tririt deg yiɣewwaren tura tura", + "We recommend you change your password and recovery key in Settings immediately": "Ad ak·akem-nwelleh ad tesnifleḍ awal-ik·im uffir d tsarut n tririt deg yiɣewwaren tura tura", "Use this session to verify your new one, granting it access to encrypted messages:": "Seqdec tiɣimit-a i usenqed tiɣimit-ik·im tamaynut, s tikci n uzref i wakken ad tekcem ɣer yiznan yettwawgelhen:", "If you run into any bugs or have feedback you'd like to share, please let us know on GitHub.": "Ma yella tettemliliḍ-d abugen neɣ tesɛiḍ tamawin i beṭṭu, ttxil-k·m selɣu-aɣ-d deg Github.", "To help avoid duplicate issues, please view existing issues first (and add a +1) or create a new issue if you can't find it.": "I tallalt n ussinef n wuguren i d-yettuɣalen, ttxil-k·m wali uguren yellan deg tazwara (syen rnu yiwen +1) neɣ rnu ugur amaynut ma yella ur t-tufiḍ ara.", @@ -2352,12 +2352,12 @@ "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.": "Ma yella tesqedceḍ yakan lqem n melmi kan n %(brand)s, tiɣimit-ik·im tezmer ur tettemṣada ara d lqem-a. Mdel afaylu-a syen uɣal ɣer lqem n melmi kan.", "Cross-signing and secret storage are ready for use.": "Azmul anmidag d uklas uffir wejden i useqdec.", "Cross-signing is ready for use, but secret storage is currently not being used to backup your keys.": "Azmul anmidag yewjed i useqdec, maca aklas uffir akka tura ur yettuseqdac ara i uḥraz n tsura.", - "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.": "Amiḍan-ik·im ad yuɣal ur yettwaseqdac ara i lebda. Ur tettizmireḍ ara ad tkecmeḍ, daɣen ulac win ara yizmiren ad issekle asulay-a n useqdac. Ad yerr amiḍăn-ik·im ad yettwakkes seg meṛṛa tixxamin ideg tettekkaḍ, rnu ad yekkes akk talqayt seg uqeddac-ik·im n timagit. Ulac tuɣalin ɣer deffir deg tigawt-a.", + "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.": "Amiḍan-ik·im ad yuɣal ur yettwaseqdac ara i lebda. Ur tettizmireḍ ara ad tkecmeḍ, daɣen ulac win ara yizmiren ad yekles s usulay-a n useqdac. Ad yerr amiḍan-ik·im ad yettwakkes seg meṛṛa tixxamin ideg tettekkaḍ, rnu ad yekkes akk talqayt seg uqeddac-ik·im n timagit. Ulac tuɣalin ɣer deffir deg tigawt-a.", "Deactivating your account does not by default cause us to forget messages you have sent. If you would like us to forget your messages, please tick the box below.": "Asemmet n umiḍan-ik·im ur aɣ-isettu ara iznan i tuzneḍ s wudem amezwer. Ma yella teɣiḍ ad nettu iznan-ik·im, ttxil-k·m mwati tabewwaḍt ddaaw.", "Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.": "Abani n yiznan deg Matrix kifkif d wid n yimayl. Mi ara nettu iznan-ik·im, aya yebɣa ad d-yini iznan i tuzneḍ ur ttwabḍan ara ula d yiwen useqdac amaynut neɣ wid ur njerred ara, maca iseqdacen yettujerrden i yesɛan yakan anekcum ɣer yiznan-a mazal ad sɛun anekcum ɣer unɣal-nsen.", "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Senqed ibenk-a i wakken ad tcerḍeḍ fell-as yettwattkal. Attkal n yibenk-a ad imudd i kečč·kemm d yiseqdacen-nniḍen lehna n uqerru mi ara tesqedcem awgelhen seg yixef ɣer yixef.", "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Asenqed n yibenk-a ad yettucreḍ fall-as yettuklal, syen iseqdacen yettusneqden yid-k·m ad tteklen ɣef yibenk-a.", - "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Tesqedceḍ yakan %(brand)s ɣef %(host)s s usali ẓẓayen d yiɛeggalen i iremden. Deg lqem-a asali ẓẓayen yensa. Am tkatut tuffirt tadigant ur temṣada ara gar sin-a n yiɣewwaren, %(brand)s yesra allus n umtawi amiḍan-ik·im.", + "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Tesqedceḍ yakan %(brand)s ɣef %(host)s s usali ẓẓayen n yiɛeggalen uremden. Deg lqem-a asali ẓẓayen yensa. Am tkatut tuffirt tadigant ur temṣada ara gar sin-a n yiɣewwaren, %(brand)s yesra allus n umtawi n umiḍan-ik·im.", "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.": "Ma yella ileqman-nniḍen n %(brand)s mazal-iten ldin deg yiccer-nniḍen, ttxil-k·m mdel-it acku aseqec n %(brand)s deg yiwet n tnezduɣt s usali ẓẓayenurmid, asensi-nsen ɣef tikkelt ad d-yeglu s wuguren.", "%(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 tura isseqdac drus n tkatut seg 3 ɣer 5 n tikkal, s usali n talɣut n yiseqdac-nniḍen ma yili tettusra. Ttxil-k·m rǧu s leɛqel alamma nules amtawi d useqdac!", "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:": "Aleqqem n texxamt-a yesra amdal n tummant tamirant n texxamt d tmerna n texxamt tamaynut deg wadeg-is. I tikci n tarmit i igerrzen iwumi nezmer i yiɛeggalen n texxamt, ad neg:", From b63b1bbe1ce9a07a3d36392006ebaf0b1f92beb6 Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Mon, 21 Dec 2020 15:03:32 +0000 Subject: [PATCH 056/231] Translated using Weblate (Albanian) Currently translated at 99.6% (2709 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 4c6e5dccde..0259ccac82 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2967,5 +2967,8 @@ "sends fireworks": "dërgon fishekzjarrë", "Sends the given message with fireworks": "E dërgon me fishekzjarrë mesazhin e dhënë", "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "E paraprin një mesazh tekst i thjeshtë me ┬──┬ ノ( ゜-゜ノ)", - "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "E paraprin një mesazh tekst i thjeshtë me (╯°□°)╯︵ ┻━┻" + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "E paraprin një mesazh tekst i thjeshtë me (╯°□°)╯︵ ┻━┻", + "%(name)s on hold": "%(name)s e mbajtur", + "sends snowfall": "dërgon rënie bore", + "Sends the given message with snowfall": "E dërgon mesazhin e dhënë të stolisur me rënie bore" } From 8790188888e8c44d401d6bf8e924a80951ac8f73 Mon Sep 17 00:00:00 2001 From: Nils Haugen Date: Mon, 21 Dec 2020 15:51:20 +0000 Subject: [PATCH 057/231] Translated using Weblate (Norwegian Nynorsk) Currently translated at 45.5% (1237 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nn/ --- src/i18n/strings/nn.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nn.json b/src/i18n/strings/nn.json index 70b242d06d..e520cb4253 100644 --- a/src/i18n/strings/nn.json +++ b/src/i18n/strings/nn.json @@ -1360,5 +1360,9 @@ "Appearance Settings only affect this %(brand)s session.": "Innstillingane gjeld berre for denne %(brand)s-økta.", "Customise your appearance": "Tilpass utsjånad", "Change notification settings": "Endra varslingsinnstillingar", - "Enable desktop notifications": "Aktiver skrivebordsvarsel" + "Enable desktop notifications": "Aktiver skrivebordsvarsel", + "Toggle video on/off": "Slå video på/av", + "Video conference started by %(senderName)s": "Videokonferanse starta av %(senderName)s", + "Video conference updated by %(senderName)s": "Videokonferanse oppdatert av %(senderName)s", + "Video conference ended by %(senderName)s": "Videokonferanse avslutta av %(senderName)s" } From 9af213817111c65af6fdd8b8b5df8c558e04142e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Dec 2020 17:19:21 +0000 Subject: [PATCH 058/231] Bump node-notifier from 8.0.0 to 8.0.1 Bumps [node-notifier](https://github.com/mikaelbr/node-notifier) from 8.0.0 to 8.0.1. - [Release notes](https://github.com/mikaelbr/node-notifier/releases) - [Changelog](https://github.com/mikaelbr/node-notifier/blob/v8.0.1/CHANGELOG.md) - [Commits](https://github.com/mikaelbr/node-notifier/compare/v8.0.0...v8.0.1) Signed-off-by: dependabot[bot] --- yarn.lock | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/yarn.lock b/yarn.lock index 9681f9a7a4..974e44bd2b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6429,6 +6429,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -6812,9 +6819,9 @@ node-modules-regexp@^1.0.0: integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= node-notifier@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.0.tgz#a7eee2d51da6d0f7ff5094bc7108c911240c1620" - integrity sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA== + version "8.0.1" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.1.tgz#f86e89bbc925f2b068784b31f382afdc6ca56be1" + integrity sha512-BvEXF+UmsnAfYfoapKM9nGxnP+Wn7P91YfXmrKnfcYCx6VBeoN5Ez5Ogck6I8Bi5k4RlpqRYaw75pAwzX9OphA== dependencies: growly "^1.3.0" is-wsl "^2.2.0" @@ -8354,9 +8361,11 @@ semver@7.0.0: integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== semver@^7.2.1, semver@^7.3.2: - version "7.3.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" - integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" serialize-javascript@^2.1.2: version "2.1.2" @@ -9506,9 +9515,9 @@ uuid@^3.3.2: integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== uuid@^8.3.0: - version "8.3.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" - integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache@^2.0.3: version "2.1.1" @@ -9798,6 +9807,11 @@ yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + yargs-parser@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" From 15d10042eeba2c608a334fbb8d70885fd6733af3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 22 Dec 2020 08:52:21 +0100 Subject: [PATCH 059/231] Fixed 16014 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- .../room_settings/RoomProfileSettings.js | 60 +++++++++++-------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/src/components/views/room_settings/RoomProfileSettings.js b/src/components/views/room_settings/RoomProfileSettings.js index ca09c3093a..f08860d52b 100644 --- a/src/components/views/room_settings/RoomProfileSettings.js +++ b/src/components/views/room_settings/RoomProfileSettings.js @@ -120,17 +120,21 @@ export default class RoomProfileSettings extends React.Component { }; _onDisplayNameChanged = (e) => { - this.setState({ - displayName: e.target.value, - enableProfileSave: true, - }); + this.setState({displayName: e.target.value}); + if (this.state.originalDisplayName === e.target.value) { + this.setState({enableProfileSave: false}); + } else { + this.setState({enableProfileSave: true}); + } }; _onTopicChanged = (e) => { - this.setState({ - topic: e.target.value, - enableProfileSave: true, - }); + this.setState({topic: e.target.value}); + if (this.state.originalTopic === e.target.value) { + this.setState({enableProfileSave: false}); + } else { + this.setState({enableProfileSave: true}); + } }; _onAvatarChanged = (e) => { @@ -158,6 +162,29 @@ export default class RoomProfileSettings extends React.Component { render() { const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); const AvatarSetting = sdk.getComponent('settings.AvatarSetting'); + + let profileSettingsButtons; + if (this.state.enableProfileSave) { + profileSettingsButtons = ( +
        + + {_t("Cancel")} + + + {_t("Save")} + +
        + ); + } + return (
    -
    - - {_t("Cancel")} - - - {_t("Save")} - -
    + { profileSettingsButtons } ); } From 48cfd3f9da5b8200a902dad94e061666180e9fcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 22 Dec 2020 09:29:35 +0100 Subject: [PATCH 060/231] Fixed some avatar stuff MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/room_settings/RoomProfileSettings.js | 1 + src/components/views/settings/AvatarSetting.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/views/room_settings/RoomProfileSettings.js b/src/components/views/room_settings/RoomProfileSettings.js index f08860d52b..ccbe8e288a 100644 --- a/src/components/views/room_settings/RoomProfileSettings.js +++ b/src/components/views/room_settings/RoomProfileSettings.js @@ -62,6 +62,7 @@ export default class RoomProfileSettings extends React.Component { } _uploadAvatar = () => { + if (!this.state.canSetAvatar) return; this._avatarUpload.current.click(); }; diff --git a/src/components/views/settings/AvatarSetting.js b/src/components/views/settings/AvatarSetting.js index 487c752c38..93b982467a 100644 --- a/src/components/views/settings/AvatarSetting.js +++ b/src/components/views/settings/AvatarSetting.js @@ -65,7 +65,7 @@ const AvatarSetting = ({avatarUrl, avatarAltText, avatarName, uploadAvatar, remo const avatarClasses = classNames({ "mx_AvatarSetting_avatar": true, - "mx_AvatarSetting_avatar_hovering": isHovering, + "mx_AvatarSetting_avatar_hovering": isHovering && uploadAvatar, }); return
    {avatarElement} From ffe2727cf72e2fe305e532a2b70dc904744f5910 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 22 Dec 2020 09:40:39 +0100 Subject: [PATCH 061/231] Fixed topic field resizing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- res/css/views/settings/_ProfileSettings.scss | 6 ++++++ src/components/views/room_settings/RoomProfileSettings.js | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/res/css/views/settings/_ProfileSettings.scss b/res/css/views/settings/_ProfileSettings.scss index 732cbedf02..4cbcb8e708 100644 --- a/res/css/views/settings/_ProfileSettings.scss +++ b/res/css/views/settings/_ProfileSettings.scss @@ -14,6 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ +.mx_ProfileSettings_controls_topic { + & > textarea { + resize: vertical; + } +} + .mx_ProfileSettings_profile { display: flex; } diff --git a/src/components/views/room_settings/RoomProfileSettings.js b/src/components/views/room_settings/RoomProfileSettings.js index ccbe8e288a..9d96e6da35 100644 --- a/src/components/views/room_settings/RoomProfileSettings.js +++ b/src/components/views/room_settings/RoomProfileSettings.js @@ -200,7 +200,7 @@ export default class RoomProfileSettings extends React.Component { -
    From fa99c2e8c5a4d90385b3b6377169dfb38e972a63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 22 Dec 2020 13:14:55 +0100 Subject: [PATCH 062/231] Hide add button when new item field is empty MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/elements/EditableItemList.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/views/elements/EditableItemList.js b/src/components/views/elements/EditableItemList.js index 34e53906a2..3537d8fad0 100644 --- a/src/components/views/elements/EditableItemList.js +++ b/src/components/views/elements/EditableItemList.js @@ -118,15 +118,23 @@ export default class EditableItemList extends React.Component { }; _renderNewItemField() { + let addButton; + console.log(this.props.newItem); + if (this.props.newItem) { + addButton = ( + + {_t("Add")} + + ); + } + return (
    - - {_t("Add")} - + { addButton } ); } From a7ca1d0856cc438190a08f4eb55797c37af7c383 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 22 Dec 2020 13:26:53 +0100 Subject: [PATCH 063/231] Remove unnecessary line MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/room_settings/RoomProfileSettings.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/views/room_settings/RoomProfileSettings.js b/src/components/views/room_settings/RoomProfileSettings.js index 9d96e6da35..6904351cad 100644 --- a/src/components/views/room_settings/RoomProfileSettings.js +++ b/src/components/views/room_settings/RoomProfileSettings.js @@ -62,7 +62,6 @@ export default class RoomProfileSettings extends React.Component { } _uploadAvatar = () => { - if (!this.state.canSetAvatar) return; this._avatarUpload.current.click(); }; From 1cd5a879db5913d7301721bd6fb1eca63a218a5f Mon Sep 17 00:00:00 2001 From: Sam-Apostel Date: Tue, 22 Dec 2020 08:57:31 +0000 Subject: [PATCH 064/231] Translated using Weblate (Dutch) Currently translated at 68.8% (1871 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nl/ --- src/i18n/strings/nl.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 1ec887c364..c394337eec 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -2027,5 +2027,11 @@ "Restart": "Herstarten", "People": "Tweegesprekken", "Set a room address to easily share your room with other people.": "Geef het gesprek een adres om het gemakkelijk met anderen te kunnen delen.", - "Invite people to join %(communityName)s": "Stuur uitnodigingen voor %(communityName)s" + "Invite people to join %(communityName)s": "Stuur uitnodigingen voor %(communityName)s", + "Unable to access microphone": "Je microfoon lijkt niet beschikbaar", + "The call was answered on another device.": "De oproep werd op een ander toestel beantwoord.", + "Answered Elsewhere": "Ergens anders beantwoord", + "The call could not be established": "De oproep kon niet worden volbracht", + "The other party declined the call.": "De tegenpartij heeft je oproep afgewezen.", + "Call Declined": "Oproep Afgewezen" } From 3e8fce3be733686616aa5193d61ecba0da1f9cd8 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Mon, 21 Dec 2020 21:04:38 +0000 Subject: [PATCH 065/231] Translated using Weblate (Swedish) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 52 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 8c053de410..99cd403818 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -2860,5 +2860,55 @@ "Show chat effects": "Visa chatteffekter", "Effects": "Effekter", "Call failed because webcam or microphone could not be accessed. Check that:": "Samtal misslyckades eftersom webbkamera eller mikrofon inte kunde kommas åt. Kolla att:", - "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Samtal misslyckades eftersom att mikrofonen inte kunde kommas åt. Kolla att en mikrofon är inkopplat och korrekt inställd." + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Samtal misslyckades eftersom att mikrofonen inte kunde kommas åt. Kolla att en mikrofon är inkopplat och korrekt inställd.", + "Go to Home View": "Gå till hemvyn", + "Decide where your account is hosted": "Bestäm var ditt konto finns", + "Host account on": "Skapa kontot på", + "Already have an account? Sign in here": "Har du redan ett konto? Logga in här", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s Eller %(usernamePassword)s", + "Continue with %(ssoButtons)s": "Fortsätt med %(ssoButtons)s", + "That username already exists, please try another.": "Det användarnamnet finns redan, vänligen pröva ett annat.", + "New? Create account": "Ny? Skapa konto", + "There was a problem communicating with the homeserver, please try again later.": "Ett problem inträffade vi kommunikation med hemservern, vänligen försök igen senare.", + "New here? Create an account": "Ny här? Skapa ett konto", + "Got an account? Sign in": "Har du ett konto? Logga in", + "Filter rooms and people": "Filtrera rum och personer", + "

    HTML for your community's page

    \n

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

    \n

    \n You can even add images with Matrix URLs \n

    \n": "

    HTML för din gemenskaps sida

    \n

    \n Använd den långa beskrivningen för att introducera nya medlemmar till gemenskapen, eller\n sprida några viktiga länkar\n

    \n

    \n Du kan till och med lägga till bilder med Matrix-URLer \n

    \n", + "Use email to optionally be discoverable by existing contacts.": "Använd e-post för att valfritt kunna upptäckas av existerande kontakter.", + "Use email or phone to optionally be discoverable by existing contacts.": "Använd e-post eller telefon för att valfritt kunna upptäckas av existerande kontakter.", + "Add an email to be able to reset your password.": "Lägg till en e-postadress för att kunna återställa ditt lösenord.", + "Forgot password?": "Glömt lösenordet?", + "That phone number doesn't look quite right, please check and try again": "Det telefonnumret ser inte korrekt ut, vänligen kolla det och försök igen", + "Enter phone number": "Ange telefonnummer", + "Enter email address": "Ange e-postadress", + "Open the link in the email to continue registration.": "Öppna länken i e-brevet för att fortsätta registreringen.", + "A confirmation email has been sent to %(emailAddress)s": "Ett bekräftelse-e-brev har skickats till %(emailAddress)s", + "Hold": "Parkera", + "Resume": "Återuppta", + "Decline All": "Neka alla", + "Approve": "Godta", + "This widget would like to:": "Den här widgeten skulle vilja:", + "Approve widget permissions": "Godta widgetbehörigheter", + "About homeservers": "Om hemservrar", + "Learn more": "Läs mer", + "Use your preferred Matrix homeserver if you have one, or host your own.": "Använd din föredragna hemserver om du har en, eller driv din egen.", + "We call the places where you can host your account ‘homeservers’.": "Vi kallar platser där du kan ha ditt konto 'hemservrar'.", + "Other homeserver": "Annan hemserver", + "Sign into your homeserver": "Logga in på din hemserver", + "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org är den största offentliga hemservern i världen, så den är ett bra ställe för många.", + "Specify a homeserver": "Specificera en hemserver", + "Invalid URL": "Ogiltig URL", + "Unable to validate homeserver": "Kan inte validera hemservern", + "%(name)s on hold": "%(name)s parkerad", + "%(peerName)s held the call": "%(peerName)s parkerade samtalet", + "You held the call Resume": "Du parkerade samtalet Återuppta", + "You held the call Switch": "Du parkerade samtalet Byt", + "sends snowfall": "skickar snöfall", + "Sends the given message with snowfall": "Skickar det givna meddelandet med snöfall", + "sends fireworks": "skickar fyrverkerier", + "Sends the given message with fireworks": "Skicka det givna meddelandet med fyrverkerier", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Lägger till ┬──┬ ノ( ゜-゜ノ) till början av ett textmeddelande", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Lägger till (╯°□°)╯︵ ┻━┻ till början av ett textmeddelande", + "You've reached the maximum number of simultaneous calls.": "Du har nått det maximala antalet samtidiga samtal.", + "Too Many Calls": "För många samtal" } From 4be6741387b920ac4b1aa2ffcff6900b9ea89abc Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 22 Dec 2020 02:13:40 +0000 Subject: [PATCH 066/231] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 82749d8d48..74d5709646 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2978,5 +2978,9 @@ "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "在純文字訊息前加入 ┬──┬ ノ( ゜-゜ノ)", "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "在純文字訊息前加入 (╯°□°)╯︵ ┻━┻", "sends fireworks": "傳送煙火", - "Sends the given message with fireworks": "與煙火一同傳送指定訊息" + "Sends the given message with fireworks": "與煙火一同傳送指定訊息", + "%(name)s on hold": "保留 %(name)s", + "You held the call Switch": "您已保留通話 切換", + "sends snowfall": "傳送雪球", + "Sends the given message with snowfall": "與雪球一同傳送指定訊息" } From 1835332a02efca2f26d6eed5472380f3966128e7 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Mon, 21 Dec 2020 18:58:20 +0000 Subject: [PATCH 067/231] Translated using Weblate (Czech) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 3c3485b035..a461ee9d2e 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2866,7 +2866,7 @@ "Sends the given message with confetti": "Pošle zprávu s konfetami", "sends confetti": "pošle konfety", "Sends the given message with fireworks": "Pošle zprávu s ohňostrojem", - "sends fireworks": "odešle ohňostroj", + "sends fireworks": "pošle ohňostroj", "The %(capability)s capability": "Schopnost %(capability)s", "See %(eventType)s events posted to your active room": "Zobrazit události %(eventType)s odeslané do vaší aktivní místnosti", "Send %(eventType)s events as you in your active room": "Poslat události %(eventType)s jako vy ve vaší aktivní místnosti", @@ -2889,5 +2889,9 @@ "See when a sticker is posted in this room": "Podívejte se, kdy je zveřejněna nálepka v této místnosti", "See when the name changes in this room": "Podívejte se, kdy se změní název v této místnosti", "See when the topic changes in your active room": "Podívejte se, kdy se změní téma ve vaší aktivní místnosti", - "See when the topic changes in this room": "Podívejte se, kdy se změní téma v této místnosti" + "See when the topic changes in this room": "Podívejte se, kdy se změní téma v této místnosti", + "%(name)s on hold": "%(name)s podržen", + "You held the call Switch": "Podrželi jste hovor Přepnout", + "sends snowfall": "pošle sněžení", + "Sends the given message with snowfall": "Pošle zprávu se sněžením" } From be0a6985eee82f80fdeae81a962df0a149040a71 Mon Sep 17 00:00:00 2001 From: XoseM Date: Tue, 22 Dec 2020 06:26:42 +0000 Subject: [PATCH 068/231] Translated using Weblate (Galician) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 362d526200..ae1c35ab8a 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2975,5 +2975,9 @@ "sends fireworks": "envía fogos de artificio", "Sends the given message with fireworks": "Envia a mensaxe dada con fogos de artificio", "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Antecede con ┬──┬ ノ( ゜-゜ノ) a unha mensaxe de texto plano", - "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Antecede con (╯°□°)╯︵ ┻━┻ a unha mensaxe de texto plano" + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Antecede con (╯°□°)╯︵ ┻━┻ a unha mensaxe de texto plano", + "%(name)s on hold": "%(name)s agardando", + "You held the call Switch": "Pausaches a chamada Cambiar", + "sends snowfall": "envía neve", + "Sends the given message with snowfall": "Engade neve caendo á mensaxe" } From c4c621b8818c35c6feed4449a2664fd6b0eaae9b Mon Sep 17 00:00:00 2001 From: "aka. nils on element-translations" Date: Mon, 21 Dec 2020 21:38:57 +0000 Subject: [PATCH 069/231] Translated using Weblate (Norwegian Nynorsk) Currently translated at 45.7% (1243 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nn/ --- src/i18n/strings/nn.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nn.json b/src/i18n/strings/nn.json index e520cb4253..d7ad9e8320 100644 --- a/src/i18n/strings/nn.json +++ b/src/i18n/strings/nn.json @@ -1364,5 +1364,12 @@ "Toggle video on/off": "Slå video på/av", "Video conference started by %(senderName)s": "Videokonferanse starta av %(senderName)s", "Video conference updated by %(senderName)s": "Videokonferanse oppdatert av %(senderName)s", - "Video conference ended by %(senderName)s": "Videokonferanse avslutta av %(senderName)s" + "Video conference ended by %(senderName)s": "Videokonferanse avslutta av %(senderName)s", + "Show previews of messages": "Vis førehandsvisningar for meldingar", + "Activity": "Aktivitet", + "Sort by": "Sorter etter", + "List options": "Sjå alternativ", + "Explore Public Rooms": "Utforsk offentlege rom", + "Explore all public rooms": "Utforsk alle offentlege rom", + "Explore public rooms": "Utforsk offentlege rom" } From 48a820d2c88b012ed0ac6118ee32c78c01f18b8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Mon, 21 Dec 2020 18:43:44 +0000 Subject: [PATCH 070/231] Translated using Weblate (Estonian) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index fcd0747b0f..7a2f430935 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2976,5 +2976,9 @@ "sends fireworks": "saadab ilutulestiku", "Sends the given message with fireworks": "Lisab sellele sõnumile ilutulestiku", "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Lisab vormindamata sõnumi ette ┬──┬ ノ( ゜-゜ノ)", - "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Lisab vormindamata sõnumi ette (╯°□°)╯︵ ┻━┻" + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Lisab vormindamata sõnumi ette (╯°□°)╯︵ ┻━┻", + "You held the call Switch": "Sa panid kõne ootele Lülita tagasi", + "%(name)s on hold": "%(name)s on ootel", + "sends snowfall": "saadab lumesaju", + "Sends the given message with snowfall": "Saadab antud sõnumi koos lumesajuga" } From 47e76596c7209dbe03e7d71d35bfcdc011f71aea Mon Sep 17 00:00:00 2001 From: Rachida S Date: Tue, 22 Dec 2020 05:03:15 +0000 Subject: [PATCH 071/231] Translated using Weblate (Kabyle) Currently translated at 92.6% (2517 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 286 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 278 insertions(+), 8 deletions(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 93552f4c70..f4f893bb95 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -959,7 +959,7 @@ "Pinned Messages": "Iznan yerzin", "Online for %(duration)s": "Srid azal n %(duration)s", "Idle for %(duration)s": "D arurmid azal n %(duration)s", - "Offline for %(duration)s": "Beṛṛa n tuqqna azal n %(duration)s", + "Offline for %(duration)s": "Beṛṛa n tuqqna azal n %(duration)s", "Seen by %(userName)s at %(dateTime)s": "Iwala-t %(userName)s at %(dateTime)s", "Replying": "Tiririt", "Guests can join": "Inebgawen zemren ad ttekkin", @@ -2003,7 +2003,7 @@ "Read Marker off-screen lifetime (ms)": "Ɣer tanzagt n tudert n tecreḍt beṛṛa n ugdil (ms)", "Unignore": "Ur yettwazgel ara", "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "Anedbal-ik·im n uqeddac issens awgelhen seg yixef ɣer yixef s wudem amezwer deg texxamin tusligin & yiznan usriden.", - "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Sefrek ismawen syen ffeɣ seg tɣimiyin-ik·im ddaw neɣ senqed-itent deg umaɣnu-ik·im n useqdac.", + "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "Sefrek ismawen syen ffeɣ seg tɣimiyin-ik·im ddaw neɣ senqed-itent deg umaɣnu-ik·im n useqdac.", "A session's public name is visible to people you communicate with": "Isem n tiɣimit tazayezt yettban i yimdanen wukud tettmeslayeḍ", "%(brand)s collects anonymous analytics to allow us to improve the application.": "%(brand)s ileqqeḍ tasleḍt tudrigt i wakken ad aɣ-iɛawen ad nesnerni asnas.", "You have ignored this user, so their message is hidden. Show anyways.": "Tzegleḍ useqdac-a, ihi iznan-ines ffren. Ɣas akken sken-iten-id.", @@ -2119,7 +2119,7 @@ "Remember my selection for this widget": "Cfu ɣef tefrant-inu i uwiǧit-a", "Wrong file type": "Anaw n yifuyla d arameɣtu", "Looks good!": "Yettban igerrez!", - "Enter your Security Phrase or to continue.": "Sekcem tafyirt-ik·im n tɣellist neɣ i wakken ad tkemmleḍ.", + "Enter your Security Phrase or to continue.": "Sekcem tafyirt-ik·im n tɣellist neɣ ": "Ha elfelejtetted a visszaállítási kulcsot ", "Set up with a recovery key": "Beállítás visszaállítási kulccsal", From 06798964091aa9b8583140b91c69dcde4d29815f Mon Sep 17 00:00:00 2001 From: Szimszon Date: Sat, 26 Dec 2020 19:13:05 +0000 Subject: [PATCH 078/231] Translated using Weblate (Hungarian) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 102 ++++++++++++++++++++++++--------------- 1 file changed, 63 insertions(+), 39 deletions(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 57d4c5e742..3f24fb98dc 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -5,7 +5,7 @@ "Custom Server Options": "Egyéni kiszolgálóbeállítások", "Dismiss": "Eltüntetés", "Error": "Hiba", - "Failed to forget room %(errCode)s": "Nem sikerült elfelejteni a szobát: %(errCode)s", + "Failed to forget room %(errCode)s": "A szobát nem sikerült elfelejtetni: %(errCode)s", "Favourite": "Kedvenc", "Mute": "Elnémít", "Notifications": "Értesítések", @@ -116,7 +116,7 @@ "Failed to set display name": "Megjelenítési nevet nem sikerült beállítani", "Failed to unban": "Kizárás visszavonása sikertelen", "Failed to upload profile picture!": "Profil kép feltöltése sikertelen!", - "Failed to verify email address: make sure you clicked the link in the email": "E-mail cím ellenőrzése sikertelen: ellenőrizd, hogy az e-mailben lévő hivatkozásra kattintottál", + "Failed to verify email address: make sure you clicked the link in the email": "E-mail cím ellenőrzése sikertelen: ellenőrizze, hogy az e-mailben lévő hivatkozásra kattintott-e", "Failure to create room": "Szoba létrehozása sikertelen", "Favourites": "Kedvencek", "Fill screen": "Képernyő kitöltése", @@ -279,8 +279,8 @@ "Who can read history?": "Ki olvashatja a régi üzeneteket?", "%(senderName)s withdrew %(targetName)s's invitation.": "%(senderName)s visszavonta %(targetName)s meghívóját.", "You are already in a call.": "Már hívásban vagy.", - "You cannot place a call with yourself.": "Nem hívhatod fel saját magadat.", - "You cannot place VoIP calls in this browser.": "Nem indíthatsz VoIP hívást ebben a böngészőben.", + "You cannot place a call with yourself.": "Nem hívhatja fel saját magát.", + "You cannot place VoIP calls in this browser.": "Nem indíthat VoIP hívást ebben a böngészőben.", "You do not have permission to post to this room": "Nincs jogod üzenetet küldeni ebbe a szobába", "You have disabled URL previews by default.": "Az URL előnézet alapból tiltva van.", "You have enabled URL previews by default.": "Az URL előnézet alapból engedélyezve van.", @@ -292,13 +292,13 @@ "You seem to be in a call, are you sure you want to quit?": "Úgy tűnik hívásban vagy, biztosan kilépsz?", "You seem to be uploading files, are you sure you want to quit?": "Úgy tűnik fájlokat töltesz fel, biztosan kilépsz?", "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Nem leszel képes visszavonni ezt a változtatást mivel a felhasználót ugyanarra a szintre emeled amin te vagy.", - "Sun": "v", - "Mon": "h", - "Tue": "k", - "Wed": "sze", - "Thu": "cs", - "Fri": "p", - "Sat": "szo", + "Sun": "Vas", + "Mon": "Hé", + "Tue": "Ke", + "Wed": "Sze", + "Thu": "Csü", + "Fri": "Pé", + "Sat": "Szo", "Jan": "jan.", "Feb": "feb.", "Mar": "már.", @@ -626,12 +626,12 @@ "Learn more about how we use analytics.": "Tudj meg többet arról hogyan használjuk az analitikai adatokat.", "The information being sent to us to help make %(brand)s better includes:": "Az alábbi információk kerülnek elküldésre, amivel jobbá tehetjük a %(brand)sot:", "Where this page includes identifiable information, such as a room, user or group ID, that data is removed before being sent to the server.": "Minden azonosításra alkalmas adat, mint a szoba-, felhasználó- vagy csoportazonosítók, eltávolításra kerülnek, mielőtt elküldenénk a kiszolgálónak.", - "The platform you're on": "A platform amit használsz", + "The platform you're on": "A platform amit használ", "The version of %(brand)s": "%(brand)s verziója", "Your language of choice": "A használt nyelv", - "Which officially provided instance you are using, if any": "Melyik hivatalosan nyújtott példányt használod", - "Whether or not you're using the Richtext mode of the Rich Text Editor": "Használod-e a Richtext módot a szerkesztőben vagy nem", - "Your homeserver's URL": "A Matrix kiszolgálód URL-je", + "Which officially provided instance you are using, if any": "Melyik hivatalos példányt használja", + "Whether or not you're using the Richtext mode of the Rich Text Editor": "Használja-e a Richtext módot a szerkesztőben vagy nem", + "Your homeserver's URL": "A ön Matrix kiszolgálója URL-je", "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(fullYear)s. %(monthName)s %(day)s, %(weekDayName)s", "This room is not public. You will not be able to rejoin without an invite.": "Ez a szoba nem nyilvános. Kilépés után csak újabb meghívóval tudsz újra belépni a szobába.", "Community IDs cannot be empty.": "A közösségi azonosító nem lehet üres.", @@ -784,9 +784,9 @@ "Checking for an update...": "Frissítés keresése...", "Missing roomId.": "Hiányzó szobaazonosító.", "Popout widget": "Kiugró kisalkalmazás", - "Every page you use in the app": "Minden oldal, amit az alkalmazásban használsz", + "Every page you use in the app": "Minden oldal, amit az alkalmazásban használ", "e.g. ": "pl.: ", - "Your device resolution": "Eszközöd felbontása", + "Your device resolution": "Eszköz felbontása", "Always show encryption icons": "Titkosítási ikon folyamatos megjelenítése", "Send Logs": "Naplók küldése", "Clear Storage and Sign Out": "Tárhely törlése és kijelentkezés", @@ -833,8 +833,8 @@ "Demote": "Lefokozás", "This event could not be displayed": "Az eseményt nem lehet megjeleníteni", "Permission Required": "Jogosultság szükséges", - "You do not have permission to start a conference call in this room": "Nincs jogosultságod konferencia hívást kezdeményezni ebben a szobában", - "A call is currently being placed!": "A hívás indítás alatt van!", + "You do not have permission to start a conference call in this room": "Nincs jogosultsága konferencia hívást kezdeményezni ebben a szobában", + "A call is currently being placed!": "A hívás indítás alatt!", "Failed to remove widget": "A kisalkalmazás törlése sikertelen", "An error ocurred whilst trying to remove the widget from the room": "A kisalkalmazás szobából való törlése közben hiba történt", "System Alerts": "Rendszer figyelmeztetések", @@ -881,7 +881,7 @@ "Incompatible Database": "Nem kompatibilis adatbázis", "Continue With Encryption Disabled": "Folytatás a titkosítás kikapcsolásával", "Sign in with single sign-on": "Bejelentkezés „egyszeri bejelentkezéssel”", - "Unable to load! Check your network connectivity and try again.": "A betöltés sikertelen! Ellenőrizd a hálózati kapcsolatot és próbáld újra.", + "Unable to load! Check your network connectivity and try again.": "A betöltés sikertelen! Ellenőrizze a hálózati kapcsolatot és próbálja újra.", "Delete Backup": "Mentés törlése", "Unable to load key backup status": "A mentett kulcsok állapotát nem lehet lekérdezni", "Backup version: ": "Mentés verzió: ", @@ -1084,7 +1084,7 @@ "Recovery Method Removed": "Visszaállítási eljárás törölve", "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.": "Ha nem Ön törölte a visszaállítási módot, akkor egy támadó hozzá akar férni a fiókjához. Azonnal változtassa meg a jelszavát, és állítson be egy visszaállítási módot a Beállításokban.", "Chat with %(brand)s Bot": "Csevegés a %(brand)s Robottal", - "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "A(z) „%(fileName)s” mérete nagyobb mint amekkorát a Matrix-kiszolgáló enged feltölteni", + "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "A(z) „%(fileName)s” mérete nagyobb mint amekkorát a Matrix-kiszolgáló megenged feltölteni", "Gets or sets the room topic": "Lekérdezi vagy beállítja a szoba témáját", "This room has no topic.": "A szobának nincs témája.", "%(senderDisplayName)s made the room public to whoever knows the link.": "%(senderDisplayName)s hozzáférhetővé tette a szobát bárkinek, aki ismeri a linket.", @@ -1255,9 +1255,9 @@ "The homeserver may be unavailable or overloaded.": "A Matrix szerver elérhetetlen vagy túlterhelt.", "You have %(count)s unread notifications in a prior version of this room.|other": "%(count)s olvasatlan értesítésed van a régi verziójú szobában.", "You have %(count)s unread notifications in a prior version of this room.|one": "%(count)s olvasatlan értesítésed van a régi verziójú szobában.", - "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Használsz-e „morzsákat” (profilképek a szobalista felett)", + "Whether or not you're using the 'breadcrumbs' feature (avatars above the room list)": "Használ-e „morzsákat” (profilképek a szobalista felett)", "Replying With Files": "Válasz fájlokkal", - "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Egyelőre nem lehet fájllal válaszolni. Szeretnéd feltölteni a fájlt úgy, hogy az nem egy válasz lesz?", + "At this time it is not possible to reply with a file. Would you like to upload this file without replying?": "Egyelőre nem lehet fájllal válaszolni. Szeretné feltölteni a fájlt úgy, hogy az nem egy válasz lesz?", "The file '%(fileName)s' failed to upload.": "A(z) „%(fileName)s” fájl feltöltése sikertelen.", "Rotate counter-clockwise": "Óramutató járásával ellentétesen fordít", "Rotate clockwise": "Óramutató járásával megegyező irányba fordít", @@ -1403,8 +1403,8 @@ "Service": "Szolgáltatás", "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érd meg a Matrix-kiszolgálód (%(homeserverDomain)s) adminisztrátorá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álhatod a turn.matrix.org nyilvános kiszolgálót, de ez nem lesz annyira megbízható, és megosztja az IP-címedet a kiszolgálóval. A Beállításokban állíthatod be.", + "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) adminisztrátorá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. 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", @@ -1940,8 +1940,8 @@ "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.": "Eszközök közti hitelesítési kulcsok törlése végleges. Mindenki akit ezzel hitelesítettél biztonsági figyelmeztetéseket fog látni. Hacsak nem vesztetted el az összes eszközödet amivel eszközök közti hitelesítést tudsz végezni, nem valószínű, hogy ezt szeretnéd tenni.", "Clear cross-signing keys": "Eszközök közti hitelesítési kulcsok törlése", "Reset cross-signing and secret storage": "Eszközök közti hitelesítés és biztonsági tároló alaphelyzetbe állítása", - "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Olyan eszközön használod-e a %(brand)sot, ahol az érintés az elsődleges beviteli mód", - "Whether you're using %(brand)s as an installed Progressive Web App": "Progresszív webalkalmazásként használod-e a %(brand)sot", + "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Olyan eszközön használja-e a %(brand)sot, ahol az érintés az elsődleges beviteli mód", + "Whether you're using %(brand)s as an installed Progressive Web App": "Progresszív webalkalmazásként használja-e a %(brand)sot", "Your user agent": "Felhasználói ügynök", "The session 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 munkamenet nem támogatja se a QR kód beolvasást se az emodzsi ellenőrzést, amit a %(brand)s támogat. Próbáld meg egy másik klienssel.", "You declined": "Elutasítottad", @@ -2077,7 +2077,7 @@ "Space": "Szóköz", "End": "End", "Session backup key:": "Munkamenet másolat kulcs:", - "Use Single Sign On to continue": "A folytatáshoz használd az egyszeri bejelentkezést (SSO)", + "Use Single Sign On to continue": "A folytatáshoz használja az egyszeri bejelentkezést (SSO)", "Single Sign On": "Egyszeri bejelentkezés", "%(name)s is requesting verification": "%(name)s ellenőrzést kér", "Sends a message as html, without interpreting it as markdown": "Az üzenet elküldése html szövegként anélkül, hogy „markdown” formázásként értelmezné", @@ -2117,11 +2117,11 @@ "Self-verification request": "Ön ellenőrzés kérése", "Cancel replying to a message": "Üzenet válasz megszakítása", "Confirm adding email": "E-mail hozzáadásának megerősítése", - "Click the button below to confirm adding this email address.": "Az e-mail cím hozzáadásának megerősítéséhez kattints a gombra lent.", + "Click the button below to confirm adding this email address.": "Az e-mail cím hozzáadásának megerősítéséhez kattintson a gombra lent.", "Confirm adding phone number": "Telefonszám hozzáadásának megerősítése", - "Click the button below to confirm adding this phone number.": "Az telefonszám hozzáadásának megerősítéséhez kattints a gombra lent.", - "Confirm adding this email address by using Single Sign On to prove your identity.": "Erősítsd meg, hogy az egyszeri bejelentkezésnél a személyazonosságod bizonyításaként használt e-mail címet hozzáadod.", - "Confirm adding this phone number by using Single Sign On to prove your identity.": "Erősítsd meg, hogy az egyszeri bejelentkezésnél a személyazonosságod bizonyításaként használt telefonszámot hozzáadod.", + "Click the button below to confirm adding this phone number.": "Az telefonszám hozzáadásának megerősítéséhez kattintson a gombra lent.", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Erősítse meg, hogy az egyszeri bejelentkezésnél a személyazonossága bizonyításaként használt e-mail címet hozzáadja.", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Erősítse meg, hogy az egyszeri bejelentkezésnél a személyazonossága bizonyításaként használt telefonszámot hozzáadja.", "If you cancel now, you won't complete your operation.": "A műveletet nem fejezed be, ha ezt most megszakítod.", "Failed to set topic": "A téma beállítása sikertelen", "Command failed": "A parancs sikertelen", @@ -2514,7 +2514,7 @@ "Cannot create rooms in this community": "A közösségben nem lehet szobát készíteni", "You do not have permission to create rooms in this community.": "A közösségben szoba létrehozásához nincs jogosultságod.", "End conference": "Konferenciahívás befejezése", - "This will end the conference for everyone. Continue?": "Mindenki számára befejeződik a konferencia. Folytatod?", + "This will end the conference for everyone. Continue?": "Mindenki számára befejeződik a konferencia. Folytatja?", "Offline encrypted messaging using dehydrated devices": "Kapcsolat nélküli titkosított üzenetküldés tartósított eszközökkel", "Ignored attempt to disable encryption": "A titkosítás kikapcsolására tett kísérlet figyelmen kívül lett hagyva", "Join the conference at the top of this room": "Csatlakozz a konferenciához a szoba tetején", @@ -2839,14 +2839,14 @@ "You created this room.": "Te készítetted ezt a szobát.", "Add a topic to help people know what it is about.": "Állítsd be a szoba témáját, hogy az emberek tudják, hogy miről van itt szó.", "Topic: %(topic)s ": "Téma: %(topic)s ", - "Send stickers to this room as you": "Ön helyett matricák küldése a szobába", + "Send stickers to this room as you": "Matricák küldése ebbe a szobába saját néven", "Change the avatar of this room": "A szoba képének megváltoztatása", "Change the name of this room": "A szoba nevének megváltoztatása", "Change the topic of your active room": "Az aktív szoba témájának megváltoztatása", "Change the topic of this room": "A szoba témájának megváltoztatása", "Change which room you're viewing": "Az ön által nézett szoba megváltoztatása", - "Send stickers into your active room": "Matricák küldése az ön aktív szobájába", - "Send stickers into this room": "Matricák küldése a szobába", + "Send stickers into your active room": "Matricák küldése az aktív szobába", + "Send stickers into this room": "Matricák küldése ebbe a szobába", "Go to Home View": "Irány a Kezdőképernyő", "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s vagy %(usernamePassword)s", "Continue with %(ssoButtons)s": "Folytatás ezzel: %(ssoButtons)s", @@ -2927,13 +2927,13 @@ "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "┬──┬ ノ( ゜-゜ノ) -t tesz a szöveg elejére", "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "(╯°□°)╯︵ ┻━┻ -t tesz a szöveg elejére", "Effects": "Effektek", - "You've reached the maximum number of simultaneous calls.": "Elérted az egyidejű hívások maximális számát.", + "You've reached the maximum number of simultaneous calls.": "Elérte az egyidejű hívások maximális számát.", "Too Many Calls": "Túl sok hívás", "No other application is using the webcam": "A webkamerát nem használja másik alkalmazás", "Permission is granted to use the webcam": "A webkamera használatának az engedélye megadva", "A microphone and webcam are plugged in and set up correctly": "A mikrofon és webkamera csatlakoztatva van és megfelelően be van állítva", "Unable to access webcam / microphone": "A webkamerát / mikrofont nem lehet használni", - "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A hívás meghiúsult mert a mikrofont nem lehet használni. Ellenőrizd, hogy csatlakoztatva van-e és megfelelően be van állítva.", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "A hívás meghiúsult mert a mikrofont nem lehet használni. Ellenőrizze, hogy csatlakoztatva van-e és megfelelően be van állítva.", "Unable to access microphone": "A mikrofont nem lehet használni", "Already have an account? Sign in here": "Van már fiókod? Belépés", "Use email to optionally be discoverable by existing contacts.": "Az e-mail (nem kötelező) megadása segíthet abban, hogy az ismerőseid megtaláljanak Matrix-on.", @@ -2950,5 +2950,29 @@ "Host account on": "Fiók létrehozása itt:", "We call the places where you can host your account ‘homeservers’.": "Matrix szervereknek nevezzük azokat a helyeket, ahol fiókot lehet létrehozni.", "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 ezt:", - "Decide where your account is hosted": "Döntse el, hol szeretne fiókot létrehozni!" + "Decide where your account is hosted": "Döntse el, hol szeretne fiókot létrehozni!", + "Send %(msgtype)s messages as you in your active room": "%(msgtype)s üzenet küldése az aktív szobádba saját néven", + "Send %(msgtype)s messages as you in this room": "%(msgtype)s üzenet küldése ebbe a szobába saját néven", + "Send general files as you in your active room": "Fájlok küldése az aktív szobájába saját néven", + "Send general files as you in this room": "Fájlok küldése ebbe a szobába saját néven", + "Send videos as you in your active room": "Videók küldése az aktív szobájába saját néven", + "Send videos as you in this room": "Videók küldése ebbe a szobába saját néven", + "Send images as you in your active room": "Képek küldése az aktív szobájába saját néven", + "Send images as you in this room": "Képek küldése ebbe a szobába saját néven", + "Send emotes as you in your active room": "Emodzsik küldése az aktív szobájába saját néven", + "Send emotes as you in this room": "Emodzsik küldése ebbe a szobába saját néven", + "Send text messages as you in your active room": "Szöveges üzenetek küldése az aktív szobájába saját néven", + "Send text messages as you in this room": "Szöveges üzenetek küldése ebbe a szobába saját néven", + "Send messages as you in your active room": "Üzenetek küldése az aktív szobájába saját néven", + "Send messages as you in this room": "Üzenetek küldése ebbe a szobába saját néven", + "Send stickers to your active room as you": "Matricák küldése az aktív szobába saját néven", + "

    HTML for your community's page

    \n

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

    \n

    \n You can even add images with Matrix URLs \n

    \n": "

    HTML a közössége oldalához

    \n

    \n Az új tagnak a közösség bemutatásához vagy fontos \n hivatkozások megosztásához a hosszú leírást lehet használni.\n

    \n

    \n Képeket Matrix URL-ekkel lehet hozzáadni: \n

    \n", + "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", + "You held the call Switch": "A hívás várakozik, átkapcsolás", + "sends snowfall": "hóesés küldése", + "Sends the given message with snowfall": "Az üzenet elküldése hóeséssel", + "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" } From 9a2d0ee353280a70fa84f087f12d3f44c8a79301 Mon Sep 17 00:00:00 2001 From: DO4TQe1jcGNLk9GvtDKqismfsIht20JBP7bps1OzQnvTDSwYSN Date: Fri, 25 Dec 2020 12:01:46 +0000 Subject: [PATCH 079/231] Translated using Weblate (Dutch) Currently translated at 68.8% (1871 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nl/ --- src/i18n/strings/nl.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index c394337eec..c7ef8d38f6 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -340,7 +340,7 @@ "File to import": "In te lezen bestand", "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.": "Hiermee kunt u de sleutels van uw ontvangen berichten in versleutelde gesprekken naar een lokaal bestand wegschrijven. Als u dat bestand dan in een andere Matrix-cliënt inleest kan die ook die berichten ontcijferen.", "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.": "Wie het weggeschreven bestand kan lezen, kan daarmee ook alle versleutelde berichten die u kunt zien ontcijferen - ga er dus zorgvuldig mee om! Daartoe kunt u hieronder een wachtwoord invoeren, dat dan gebruikt zal worden om het bestand te versleutelen. Het is dan enkel mogelijk de gegevens in te lezen met hetzelfde wachtwoord.", - "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.": "Hiermee kunt u vanuit een andere Matrix-cliënt weggeschreven versleutelingssleutels inlezen, zodat u alle berichten die de andere cliënt kon ontcijferen ook hier kunt lezen.", + "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.": "Hiermee kunt u vanuit een andere Matrix-cliënt weggeschreven versleutelingssleutels inlezen, zodat u alle berichten die de andere cliënt kon ontcijferen ook hier kunt lezen.", "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "Het weggeschreven bestand is beveiligd met een wachtwoord. Voer dat wachtwoord hier in om het bestand te ontsleutelen.", "You must join the room to see its files": "Slechts na toetreding tot het gesprek zult u de bestanden kunnen zien", "Reject all %(invitedRooms)s invites": "Alle %(invitedRooms)s de uitnodigingen weigeren", @@ -449,7 +449,7 @@ "Unban this user?": "Deze gebruiker ontbannen?", "Ban this user?": "Deze gebruiker verbannen?", "Mirror local video feed": "Lokale videoaanvoer ook elders opslaan (spiegelen)", - "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.": "Zelfdegradatie is onomkeerbaar. Als u de laatste bevoorrechte gebruiker in het gesprek bent zullen deze rechten voorgoed verloren gaan.", + "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.": "Zelfdegradatie is onomkeerbaar. Als u de laatste bevoorrechte gebruiker in het gesprek bent zullen deze rechten voorgoed verloren gaan.", "Unignore": "Niet meer negeren", "Ignore": "Negeren", "Jump to read receipt": "Naar het laatst gelezen bericht gaan", @@ -607,7 +607,7 @@ "Community %(groupId)s not found": "Gemeenschap %(groupId)s is niet gevonden", "Failed to load %(groupId)s": "Laden van %(groupId)s is mislukt", "Old cryptography data detected": "Oude cryptografiegegevens gedetecteerd", - "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Er zijn gegevens van een oudere versie van %(brand)s gevonden, die problemen veroorzaakt hebben met de eind-tot-eind-versleuteling in de oude versie. Onlangs vanuit de oude versie verzonden eind-tot-eind-versleutelde berichten zijn mogelijk onontsleutelbaar in deze versie. Ook kunnen berichten die met deze versie uitgewisseld zijn falen. Mocht u problemen ervaren, meld u dan opnieuw aan. Schrijf uw sleutels weg en lees ze weer in om uw berichtgeschiedenis te behouden.", + "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Er zijn gegevens van een oudere versie van %(brand)s gevonden, die problemen veroorzaakt hebben met de eind-tot-eind-versleuteling in de oude versie. Onlangs vanuit de oude versie verzonden eind-tot-eind-versleutelde berichten zijn mogelijk onontsleutelbaar in deze versie. Ook kunnen berichten die met deze versie uitgewisseld zijn falen. Mocht u problemen ervaren, meld u dan opnieuw aan. Schrijf uw sleutels weg en lees ze weer in om uw berichtgeschiedenis te behouden.", "Your Communities": "Uw gemeenschappen", "Error whilst fetching joined communities": "Er is een fout opgetreden bij het ophalen van de gemeenschappen waarvan u lid bent", "Create a new community": "Maak een nieuwe gemeenschap aan", @@ -635,7 +635,7 @@ "Whether or not you're using the Richtext mode of the Rich Text Editor": "Of u de tekstverwerker al dan niet in de modus voor opgemaakte tekst gebruikt", "Your homeserver's URL": "De URL van uw thuisserver", "In reply to ": "Als antwoord op ", - "This room is not public. You will not be able to rejoin without an invite.": "Dit is geen openbaar gesprek. Slechts op uitnodiging zult u opnieuw kunnen toetreden.", + "This room is not public. You will not be able to rejoin without an invite.": "Dit is geen openbaar gesprek. Slechts op uitnodiging zult u opnieuw kunnen toetreden.", "were unbanned %(count)s times|one": "zijn ontbannen", "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s heeft %(displayName)s als weergavenaam aangenomen.", "Key request sent.": "Sleutelverzoek verstuurd.", @@ -1029,7 +1029,7 @@ "Language and region": "Taal en regio", "Theme": "Thema", "Account management": "Accountbeheer", - "Deactivating your account is a permanent action - be careful!": "Pas op! Het sluiten van uw account is onherroepelijk!", + "Deactivating your account is a permanent action - be careful!": "Pas op! Het sluiten van uw account is onherroepelijk!", "General": "Algemeen", "Legal": "Wettelijk", "Credits": "Met dank aan", @@ -1094,7 +1094,7 @@ "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "Er is een fout opgetreden bij het bijwerken van het hoofdadres van het gesprek. Dit wordt mogelijk niet toegestaan door de server, of er is een tijdelijk probleem opgetreden.", "Main address": "Hoofdadres", "Error updating flair": "Fout bij bijwerken van badge", - "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Er is een fout opgetreden bij het bijwerken van de badge voor dit gesprek. Wellicht ondersteunt de server dit niet, of er is een tijdelijke fout opgetreden.", + "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "Er is een fout opgetreden bij het bijwerken van de badge voor dit gesprek. Wellicht ondersteunt de server dit niet, of er is een tijdelijke fout opgetreden.", "Room avatar": "Gespreksavatar", "Room Name": "Gespreksnaam", "Room Topic": "Gespreksonderwerp", @@ -1228,16 +1228,16 @@ "Don't ask again": "Niet opnieuw vragen", "New Recovery Method": "Nieuwe herstelmethode", "A new recovery passphrase and key for Secure Messages have been detected.": "Er zijn een nieuw herstelwachtwoord en een nieuwe herstelsleutel voor beveiligde berichten gedetecteerd.", - "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.": "Als u deze nieuwe herstelmethode niet heeft ingesteld, is het mogelijk dat er een aanvaller toegang tot uw account probeert te verkrijgen. Wijzig onmiddellijk uw accountwachtwoord en stel een nieuwe herstelmethode in in de instellingen.", + "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.": "Als u deze nieuwe herstelmethode niet heeft ingesteld, is het mogelijk dat een aanvaller toegang tot uw account probeert te krijgen. Wijzig onmiddellijk uw accountwachtwoord en stel in het instellingenmenu een nieuwe herstelmethode in.", "Go to Settings": "Ga naar instellingen", "Set up Secure Messages": "Beveiligde berichten instellen", "Recovery Method Removed": "Herstelmethode verwijderd", - "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.": "Als u de herstelmethode niet heeft verwijderd, is het mogelijk dat er een aanvaller toegang tot uw account probeert te verkrijgen. Wijzig onmiddellijk uw accountwachtwoord en stel een nieuwe herstelmethode in in de instellingen.", + "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.": "Als u de herstelmethode niet heeft verwijderd, is het mogelijk dat er een aanvaller toegang tot uw account probeert te verkrijgen. Wijzig onmiddellijk uw accountwachtwoord en stel in het instellingenmenu een nieuwe herstelmethode in.", "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.": "Let op: gesprekken bijwerken voegt gespreksleden niet automatisch toe aan de nieuwe versie van het gesprek. Er komt in het oude gesprek een koppeling naar het nieuwe, waarop gespreksleden moeten klikken om aan het nieuwe gesprek deel te nemen.", "Adds a custom widget by URL to the room": "Voegt met een URL een aangepaste widget toe aan het gesprek", "Please supply a https:// or http:// widget URL": "Voer een https://- of http://-widget-URL in", "You cannot modify widgets in this room.": "U kunt de widgets in dit gesprek niet aanpassen.", - "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s heeft de uitnodiging aan %(targetDisplayName)s toe te treden tot het gesprek ingetrokken.", + "%(senderName)s revoked the invitation for %(targetDisplayName)s to join the room.": "%(senderName)s heeft de uitnodiging aan %(targetDisplayName)s toe te treden tot het gesprek ingetrokken.", "Upgrade this room to the recommended room version": "Werk dit gesprek bij tot de aanbevolen versie", "This room is running room version , which this homeserver has marked as unstable.": "Dit gesprek draait op groepsgespreksversie , die door deze thuisserver als onstabiel is gemarkeerd.", "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "Bijwerken zal de huidige versie van dit gesprek sluiten, en onder dezelfde naam een bijgewerkte versie starten.", @@ -1551,7 +1551,7 @@ "Setting up keys": "Sleutelconfiguratie", "Verify this session": "Deze sessie verifiëren", "Encryption upgrade available": "Er is een bijgewerkte versleuteling beschikbaar", - "You can use /help to list available commands. Did you mean to send this as a message?": "Typ /help om alle opdrachten te zien. Was het uw bedoeling dit als bericht te sturen?", + "You can use /help to list available commands. Did you mean to send this as a message?": "Typ /help om alle opdrachten te zien. Was het uw bedoeling dit als bericht te sturen?", "Help": "Hulp", "Set up encryption": "Versleuteling instellen", "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.": "Dit vergt validatie van een e-mailadres of telefoonnummer middels de standaardidentiteitsserver , maar die server heeft geen gebruiksvoorwaarden.", @@ -1610,7 +1610,7 @@ "Enable message search in encrypted rooms": "Sta zoeken in versleutelde gesprekken toe", "How fast should messages be downloaded.": "Ophaalfrequentie van berichten.", "My Ban List": "Mijn banlijst", - "This is your list of users/servers you have blocked - don't leave the room!": "Dit is de lijst van door u geblokkeerde servers/gebruikers. Verlaat dit gesprek niet!", + "This is your list of users/servers you have blocked - don't leave the room!": "Dit is de lijst van door u geblokkeerde servers/gebruikers. Verlaat dit gesprek niet!", "Waiting for %(displayName)s to verify…": "Wachten tot %(displayName)s geverifieerd heeft…", "They match": "Ze komen overeen", "They don't match": "Ze komen niet overeen", @@ -1756,7 +1756,7 @@ "Show rooms with unread notifications first": "Gesprekken met ongelezen meldingen eerst tonen", "Show shortcuts to recently viewed rooms above the room list": "Snelkoppelingen naar de gesprekken die u recent heeft bekeken bovenaan de gesprekslijst weergeven", "Cancelling…": "Bezig met annuleren…", - "%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with search components added.": "In %(brand)s ontbreken enige modulen vereist voor het veilig lokaal bewaren van versleutelde berichten. Wilt u deze functie uittesten, compileer dan een aangepaste versie van %(brand)s Desktop die de zoekmodulen bevat.", + "%(brand)s is missing some components required for securely caching encrypted messages locally. If you'd like to experiment with this feature, build a custom %(brand)s Desktop with search components added.": "In %(brand)s ontbreken enige modulen vereist voor het veilig lokaal bewaren van versleutelde berichten. Wilt u deze functie uittesten, compileer dan een aangepaste versie van %(brand)s Desktop die de zoekmodulen bevat.", "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "Deze sessie maakt geen back-ups van uw sleutels, maar u beschikt over een reeds bestaande back-up waaruit u kunt herstellen en waaraan u nieuwe sleutels vanaf nu kunt toevoegen.", "Customise your experience with experimental labs features. Learn more.": "Personaliseer uw ervaring met experimentele functies. Klik hier voor meer informatie.", "Cross-signing": "Kruiselings ondertekenen", @@ -1884,7 +1884,7 @@ "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Verifieer dit apparaat om het als vertrouwd te markeren. Door dit apparaat te vertrouwen geeft u extra gemoedsrust aan uzelf en andere gebruikers bij het gebruik van eind-tot-eind-versleutelde berichten.", "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Dit apparaat verifiëren zal het als vertrouwd markeren, en gebruikers die met u geverifieerd hebben zullen het vertrouwen.", "Integrations are disabled": "Integraties zijn uitgeschakeld", - "Enable 'Manage Integrations' in Settings to do this.": "Schakel ‘Beheer integraties’ in in de instellingen om dit te doen.", + "Enable 'Manage Integrations' in Settings to do this.": "Schakel in het Algemene Instellingenmenu ‘Beheer integraties’ in om dit te doen.", "Integrations not allowed": "Integraties niet toegestaan", "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "Uw %(brand)s laat u geen integratiebeheerder gebruiken om dit te doen. Neem contact op met een beheerder.", "Failed to invite the following users to chat: %(csvUsers)s": "Het uitnodigen van volgende gebruikers voor gesprek is mislukt: %(csvUsers)s", @@ -2009,13 +2009,13 @@ "Verify all your sessions to ensure your account & messages are safe": "Controleer al uw sessies om zeker te zijn dat uw account & berichten veilig zijn", "Verify the new login accessing your account: %(name)s": "Verifieer de nieuwe aanmelding op uw account: %(name)s", "Confirm your account deactivation by using Single Sign On to prove your identity.": "Bevestig uw intentie deze account te sluiten door met Single Sign On uw identiteit te bewijzen.", - "Are you sure you want to deactivate your account? This is irreversible.": "Weet u zeker dat u uw account wil sluiten? Dit is onomkeerbaar.", + "Are you sure you want to deactivate your account? This is irreversible.": "Weet u zeker dat u uw account wil sluiten? Dit is onomkeerbaar.", "Confirm account deactivation": "Bevestig accountsluiting", "Room name or address": "Gespreksnaam of -adres", "Joins room with given address": "Neem aan het gesprek met dat adres deel", "Unrecognised room address:": "Gespreksadres niet herkend:", "Help us improve %(brand)s": "Help ons %(brand)s nog beter te maken", - "Send anonymous usage data which helps us improve %(brand)s. This will use a cookie.": "Stuur anonieme gebruiksinformatie waarmee we %(brand)s kunnen verbeteren. Dit plaatst een cookie.", + "Send anonymous usage data which helps us improve %(brand)s. This will use a cookie.": "Stuur anonieme gebruiksinformatie waarmee we %(brand)s kunnen verbeteren. Dit plaatst een cookie.", "I want to help": "Ik wil helpen", "Your homeserver has exceeded its user limit.": "Uw thuisserver heeft het maximaal aantal gebruikers overschreden.", "Your homeserver has exceeded one of its resource limits.": "Uw thuisserver heeft een van zijn limieten overschreden.", From f744d45ec0afa0ba7295c117df7c1f2968fa4b29 Mon Sep 17 00:00:00 2001 From: Marcelo Filho Date: Sat, 26 Dec 2020 22:04:20 +0000 Subject: [PATCH 080/231] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt_BR/ --- src/i18n/strings/pt_BR.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index b456c98aed..8ae85a5013 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -2903,5 +2903,13 @@ "You held the call Resume": "Você pausou a chamada Retomar", "You've reached the maximum number of simultaneous calls.": "Você atingiu o número máximo de chamadas simultâneas.", "Too Many Calls": "Muitas chamadas", - "%(name)s paused": "%(name)s pausou" + "%(name)s paused": "%(name)s pausou", + "You held the call Switch": "Você pausou a chamada Retomar", + "%(name)s on hold": "%(name)s em espera", + "sends snowfall": "envia neve caindo", + "Sends the given message with snowfall": "Envia a mensagem com neve caindo", + "sends fireworks": "envia fogos de artifício", + "Sends the given message with fireworks": "Envia a mensagem com fogos de artifício", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Adiciona ┬──┬ ノ( ゜-゜ノ) a uma mensagem de texto simples", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Adiciona (╯°□°)╯︵ ┻━┻ a uma mensagem de texto" } From 79e75983fea24caecc3e43b0bc85d4dd1a542d6a Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Fri, 25 Dec 2020 07:08:45 +0000 Subject: [PATCH 081/231] Translated using Weblate (Russian) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 6187e479ee..fdb1584d56 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -2967,5 +2967,9 @@ "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Добавляет ┬──┬ ノ( ゜-゜ノ) в начало сообщения", "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Добавляет (╯°□°)╯︵ ┻━┻ в начало сообщения", "sends fireworks": "отправляет фейерверк", - "Sends the given message with fireworks": "Отправляет сообщение с фейерверком" + "Sends the given message with fireworks": "Отправляет сообщение с фейерверком", + "%(name)s on hold": "%(name)s на удержании", + "You held the call Switch": "Вы удерживаете звонок Переключить", + "sends snowfall": "отправляет снегопад", + "Sends the given message with snowfall": "Отправляет сообщение со снегопадом" } From 7376c8a1b78fd8d942fafb9bf188e05deb4e86e1 Mon Sep 17 00:00:00 2001 From: random Date: Thu, 24 Dec 2020 09:52:28 +0000 Subject: [PATCH 082/231] Translated using Weblate (Italian) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 74255a6d2a..0ca278aba3 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2971,5 +2971,13 @@ "%(peerName)s held the call": "%(peerName)s ha sospeso la chiamata", "You held the call Resume": "Hai sospeso la chiamata Riprendi", "You've reached the maximum number of simultaneous calls.": "Hai raggiungo il numero massimo di chiamate simultanee.", - "Too Many Calls": "Troppe chiamate" + "Too Many Calls": "Troppe chiamate", + "%(name)s on hold": "%(name)s in sospeso", + "You held the call Switch": "Hai sospeso la chiamata Cambia", + "sends snowfall": "invia nevicata", + "Sends the given message with snowfall": "Invia il messaggio con una nevicata", + "sends fireworks": "invia fuochi d'artificio", + "Sends the given message with fireworks": "Invia il messaggio con fuochi d'artificio", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Antepone ┬──┬ ノ( ゜-゜ノ) ad un messaggio di testo", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Antepone (╯°□°)╯︵ ┻━┻ ad un messaggio di testo" } From 06647321d9b75d624aff6d541438bba2c689ab6f Mon Sep 17 00:00:00 2001 From: Mitja Sorsa Date: Wed, 23 Dec 2020 14:17:00 +0000 Subject: [PATCH 083/231] Translated using Weblate (Finnish) Currently translated at 95.7% (2603 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fi/ --- src/i18n/strings/fi.json | 83 +++++++++++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 18 deletions(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 417ad62040..be8a1a771c 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -76,7 +76,7 @@ "Custom": "Mukautettu", "Custom level": "Mukautettu taso", "/ddg is not a command": "/ddg ei ole komento", - "Deactivate Account": "Deaktivoi tili", + "Deactivate Account": "Poista tili pysyvästi", "Decline": "Hylkää", "Default": "Oletus", "Disinvite": "Peru kutsu", @@ -1099,7 +1099,7 @@ "An error ocurred whilst trying to remove the widget from the room": "Poistaessa sovelmaa huoneesta tapahtui virhe", "Minimize apps": "Pienennä sovellukset", "Popout widget": "Avaa sovelma omassa ikkunassaan", - "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Lisää ”¯\\_(ツ)_/¯” viestin alkuun", + "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Lisää ¯\\_(ツ)_/¯ viestin alkuun", "User %(userId)s is already in the room": "Käyttäjä %(userId)s on jo huoneessa", "The user must be unbanned before they can be invited.": "Käyttäjän porttikielto täytyy poistaa ennen kutsumista.", "Upgrade to your own domain": "Päivitä omaan verkkotunnukseen", @@ -1135,7 +1135,7 @@ "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.": "Tämä tekee tilistäsi lopullisesti käyttökelvottoman. Et voi kirjautua sisään, eikä kukaan voi rekisteröidä samaa käyttäjätunnusta. Tilisi poistuu kaikista huoneista, joihin se on liittynyt, ja tilisi tiedot poistetaan identiteettipalvelimeltasi. Tämä toimenpidettä ei voi kumota.", "Deactivating your account does not by default cause us to forget messages you have sent. If you would like us to forget your messages, please tick the box below.": "Tilisi poistaminen käytöstä ei oletuksena saa meitä unohtamaan lähettämiäsi viestejä. Jos haluaisit meidän unohtavan viestisi, rastita alla oleva ruutu.", "Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.": "Viestien näkyvyys Matrixissa on samantapainen kuin sähköpostissa. Vaikka se, että unohdamme viestisi, tarkoittaa, ettei viestejäsi jaeta enää uusille tai rekisteröitymättömille käyttäjille, käyttäjät, jotka ovat jo saaneet viestisi pystyvät lukemaan jatkossakin omaa kopiotaan viesteistäsi.", - "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "Unohda kaikki viestit, jotka olen lähettänyt, kun tilini poistetaan käytöstä (Varoitus: tämä saa tulevat käyttäjät näkemään epätäydellisen version keskusteluista)", + "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "Unohda kaikki viestit, jotka olen lähettänyt, kun tilini poistetaan (Varoitus: tämä saa tulevat käyttäjät näkemään epätäydellisen version keskusteluista)", "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Varmenna tämä käyttäjä merkitäksesi hänet luotetuksi. Käyttäjiin luottaminen antaa sinulle ylimääräistä mielenrauhaa käyttäessäsi osapuolten välistä salausta.", "Waiting for partner to confirm...": "Odotetaan, että toinen osapuoli varmistaa...", "Incoming Verification Request": "Saapuva varmennuspyyntö", @@ -1250,7 +1250,7 @@ "If you don't want to set this up now, you can later in Settings.": "Jos et halua ottaa tätä käyttöön nyt, voit tehdä sen myöhemmin asetuksissa.", "Set up": "Ota käyttöön", "New Recovery Method": "Uusi palautustapa", - "A new recovery passphrase and key for Secure Messages have been detected.": "Uusi palautuksen salalause ja avain salatuille viesteille on löydetty.", + "A new recovery passphrase and key for Secure Messages have been detected.": "Uusi palautuksen salasana ja avain salatuille viesteille on löydetty.", "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.": "Jos et ottanut käyttöön uutta palautustapaa, hyökkääjä saattaa yrittää käyttää tiliäsi. Vaihda tilisi salasana ja aseta uusi palautustapa asetuksissa välittömästi.", "Set up Secure Messages": "Ota käyttöön salatut viestit", "Recovery Method Removed": "Palautustapa poistettu", @@ -1431,11 +1431,11 @@ "Terms of service not accepted or the identity server is invalid.": "Käyttöehtoja ei ole hyväksytty tai identiteettipalvelin ei ole kelvollinen.", "Enter a new identity server": "Syötä uusi identiteettipalvelin", "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "Hyväksy identiteettipalvelimen (%(serverName)s) käyttöehdot (Terms of Service), jotta sinut voi löytää sähköpostiosoitteen tai puhelinnumeron perusteella.", - "Deactivate account": "Deaktivoi tili", + "Deactivate account": "Poista tili pysyvästi", "Remove %(email)s?": "Poista %(email)s?", "Remove %(phone)s?": "Poista %(phone)s?", "Command Help": "Komento-ohje", - "This account has been deactivated.": "Tämä tili on deaktivoitu.", + "This account has been deactivated.": "Tämä tili on poistettu.", "Sends a message as plain text, without interpreting it as markdown": "Lähettää viestin pelkkänä tekstinä, tulkitsematta sitä markdownina", "You do not have the required permissions to use this command.": "Sinulla ei ole vaadittavia oikeuksia tämän komennon käyttämiseksi.", "Use an identity server": "Käytä identiteettipalvelinta", @@ -1467,7 +1467,7 @@ "Strikethrough": "Yliviivattu", "Code block": "Ohjelmakoodia", "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "Kutsu huoneeseen %(roomName)s lähetettiin osoitteeseen %(email)s, joka ei ole yhteydessä tiliisi", - "Filter": "Suodata", + "Filter": "Haku", "Filter rooms…": "Suodata huoneita…", "Changes the avatar of the current room": "Vaihtaa nykyisen huoneen kuvan", "Error changing power level requirement": "Virhe muutettaessa oikeustasovaatimusta", @@ -1492,9 +1492,9 @@ "Explore rooms": "Selaa huoneita", "ID": "Tunnus", "Unable to revoke sharing for phone number": "Puhelinnumeron jakamista ei voi kumota", - "Deactivate user?": "Deaktivoi käyttäjä?", - "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "Käyttäjän deaktivoiminen kirjaa hänet ulos ja estää häntä kirjautumasta takaisin sisään. Lisäksi hän poistuu kaikista huoneista, joissa hän on. Tätä toimintoa ei voi kumota. Oletko varma, että haluat deaktivoida tämän käyttäjän?", - "Deactivate user": "Deaktivoi käyttäjä", + "Deactivate user?": "Poista käyttäjä pysyvästi?", + "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "Käyttäjän poistaminen kirjaa hänet ulos ja estää häntä kirjautumasta takaisin sisään. Lisäksi hän poistuu kaikista huoneista, joissa hän on. Tätä toimintoa ei voi kumota. Oletko varma, että haluat pysyvästi poistaa tämän käyttäjän?", + "Deactivate user": "Poista käyttäjä pysyvästi", "Link this email with your account in Settings to receive invites directly in %(brand)s.": "Linkitä tämä sähköposti tilisi kanssa asetuksissa, jotta voit saada kutsuja suoraan %(brand)sissa.", "e.g. my-room": "esim. oma-huone", "Please enter a name for the room": "Syötä huoneelle nimi", @@ -1541,7 +1541,7 @@ "Jump to first invite.": "Siirry ensimmäiseen kutsuun.", "DuckDuckGo Results": "DuckDuckGo-tulokset", "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "Tekstiviesti on lähetetty numeroon +%(msisdn)s. Syötä siinä oleva varmistuskoodi.", - "Failed to deactivate user": "Käyttäjän deaktivointi epäonnistui", + "Failed to deactivate user": "Käyttäjän poistaminen epäonnistui", "Hide advanced": "Piilota edistyneet", "Show advanced": "Näytä edistyneet", "Document": "Asiakirja", @@ -1739,7 +1739,7 @@ "Lock": "Lukko", "Whether you're using %(brand)s on a device where touch is the primary input mechanism": "Käytätkö %(brand)sia laitteella, jossa kosketus on ensisijainen syöttömekanismi", "Whether you're using %(brand)s as an installed Progressive Web App": "Käytätkö %(brand)sia asennettuna PWA:na (Progressive Web App)", - "Cancel entering passphrase?": "Peruuta salalauseen syöttäminen?", + "Cancel entering passphrase?": "Peruuta salasanan syöttäminen?", "Encryption upgrade available": "Salauksen päivitys saatavilla", "a few seconds ago": "muutama sekunti sitten", "about a minute ago": "noin minuutti sitten", @@ -1808,7 +1808,7 @@ "Suggestions": "Ehdotukset", "Your account is not secure": "Tilisi ei ole turvallinen", "Your password": "Salasanasi", - "Incorrect recovery passphrase": "Virheellinen palautuksen salalause", + "Incorrect recovery passphrase": "Virheellinen palautussalasana", "Enter recovery passphrase": "Syötä palautuksen salalause", "Enter recovery key": "Syötä palautusavain", "Confirm your identity by entering your account password below.": "Vahvista henkilöllisyytesi syöttämällä tilisi salasana alle.", @@ -1956,7 +1956,7 @@ "Liberate your communication": "Vapauta viestintäsi", "Send a Direct Message": "Lähetä yksityisviesti", "Explore Public Rooms": "Selaa julkisia huoneita", - "Create a Group Chat": "Luo ryhmä", + "Create a Group Chat": "Luo huone", "Super": "Super", "Cancel replying to a message": "Peruuta viestiin vastaaminen", "Jump to room search": "Siirry huonehakuun", @@ -2257,8 +2257,8 @@ "(their device couldn't start the camera / microphone)": "(hänen laitteensa ei voinut käynnistää kameraa tai mikrofonia)", "(connection failed)": "(yhteys katkesi)", "🎉 All servers are banned from participating! This room can no longer be used.": "Kaikki palvelimet ovat saaneet porttikiellon huoneeseen! Tätä huonetta ei voi enää käyttää.", - "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Lisää hymiön ( ͡° ͜ʖ ͡°) viestin alkuun", - "Are you sure you want to cancel entering passphrase?": "Haluatko varmasti peruuttaa salalauseen syöttämisen?", + "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Lisää ( ͡° ͜ʖ ͡°) viestin alkuun", + "Are you sure you want to cancel entering passphrase?": "Haluatko varmasti peruuttaa salasanan syöttämisen?", "The call was answered on another device.": "Puheluun vastattiin toisessa laitteessa.", "Answered Elsewhere": "Vastattu muualla", "The call could not be established": "Puhelua ei voitu aloittaa", @@ -2341,7 +2341,7 @@ "Enter phone number": "Syötä puhelinnumero", "Now, let's help you get started": "Autetaanpa sinut alkuun", "delete the address.": "poista osoite.", - "Filter rooms and people": "Suodata huoneita ja ihmisiä", + "Filter rooms and people": "Hae huoneita ja ihmisiä", "Go to Home View": "Siirry kotinäkymään", "Community and user menu": "Yhteisö- ja käyttäjävalikko", "Decline All": "Kieltäydy kaikista", @@ -2785,5 +2785,52 @@ "Manage": "Hallitse", "Remain on your screen when viewing another room, when running": "Pysy ruudulla katsellessasi huonetta, kun se on käynnissä", "Remain on your screen while running": "Pysy ruudulla käynnissä olon ajan", - "Move autocomplete selection up/down": "Siirrä automaattisen täydennyksen valintaa ylös/alas" + "Move autocomplete selection up/down": "Siirrä automaattisen täydennyksen valintaa ylös/alas", + "sends snowfall": "lähetä lumisadetta", + "Sends the given message with snowfall": "Lähetä viesti lumisateen kera", + "Sends the given message with fireworks": "Lähettää viestin ilotulitteiden kera", + "sends confetti": "lähetä konfettia", + "Sends the given message with confetti": "Lähettää viestin konfettien kera", + "sends fireworks": "lähetä ilotulitus", + "You held the call Switch": "Puhelu pidossa Vaihda", + "You held the call Resume": "Puhelu pidossa Jatka", + "%(name)s on hold": "%(name)s on pidossa", + "Please verify the room ID or address and try again.": "Tarkista huonetunnus ja yritä uudelleen.", + "Use this when referencing your community to others. The community ID cannot be changed.": "Käytä tätä, kun kutsut muita yhteisöösi. Yhteisötunnusta ei voi muuttaa.", + "Community ID: +:%(domain)s": "Yhteisötunnus: +:%(domain)s", + "Are you sure you want to deactivate your account? This is irreversible.": "Haluatko varmasti poistaa tilisi pysyvästi?", + "Data on this screen is shared with %(widgetDomain)s": "Tällä näytöllä olevia tietoja jaetaan %(widgetDomain)s:n kanssa", + "A browser extension is preventing the request.": "Selainlaajennus estää pyynnön.", + "Approve widget permissions": "Hyväksy sovelman käyttöoikeudet", + "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "Olet kirjautunut ulos kaikista istunnoista, etkä enää saa push-ilmoituksia. Ota ilmoitukset uudelleen käyttöön kirjautumalla uudelleen kullekin laitteelle.", + "That username already exists, please try another.": "Antamasi käyttäjänimi on varattu, kokeile toista.", + "Continue with %(ssoButtons)s": "Jatka %(ssoButtons)slla", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s Tai %(usernamePassword)s", + "Host account on": "Isännöi tiliä osoitteessa", + "Decide where your account is hosted": "Päätä, missä tiliäsi isännöidään", + "Your new session is now verified. Other users will see it as trusted.": "Uusi istuntosi on vahvistettu. Muut käyttäjät näkevät sen luotettavana.", + "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "Uusi istuntosi on vahvistettu. Sillä on nyt pääsy salattuihin viesteihisi, ja muut käyttäjät näkevät sen luotettavana.", + "Enter a recovery passphrase": "Syötä palautuksen salasana", + "Great! This recovery passphrase looks strong enough.": "Hienoa! Tämä palautuksen salasana näyttää riittävän vahvalta.", + "Please enter your recovery passphrase a second time to confirm.": "Vahvista antamalla palautuksen salasana uudelleen.", + "Repeat your recovery passphrase...": "Toista palautuksen salasana...", + "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.": "Syötä salasana, jonka tiedät vain sinä, koska sitä käytetään tietojesi suojaamiseen. Turvallisuuden takaamiseksi älä käytä samaa salasanaa muualla.", + "Enter your recovery passphrase a second time to confirm it.": "Vahvista antamalla palautuksen salasana uudelleen.", + "Message downloading sleep time(ms)": "Viestin lataamisen odotusaika(ms)", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Lisää ┬──┬ ノ( ゜-゜ノ) viestin alkuun", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Lisää (╯°□°)╯︵ ┻━┻ viestin alkuun", + "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Salaisen tallenustilan avaaminen epäonnistui. Varmista, että syötit oikean palautuksen salasanan.", + "Enter a Security Phrase": "Kirjoita turvalauseke", + "Set a Security Phrase": "Aseta turvalauseke", + "Unable to query secret storage status": "Salaisen tallennustilan tilaa ei voi kysellä", + "If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "Jos peruutat nyt, voit menettää salattuja viestejä ja tietoja, jos menetät pääsyn kirjautumistietoihisi.", + "You can also set up Secure Backup & manage your keys in Settings.": "Voit myös ottaa käyttöön suojatun varmuuskopioinnin ja hallita avaimia asetuksista.", + "Save your Security Key": "Tallenna turva-avain", + "This session is encrypting history using the new recovery method.": "Tämä istunto salaa historiansa käyttäen uutta palautustapaa.", + "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "Tämä istunto on havainnut, että palauttamisen salauslause ja salattujen viestien avain on poistettu.", + "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.": "Jos teit tämän vahingossa, voit ottaa käyttöön turvalliset viestit tälle istunnolle, se salaa tämän istunnon viestihistorian uudella palautustavalla.", + "Close dialog or context menu": "Sulje valintaikkuna tai pikavalikko", + "%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "%(brand)s tallentaa turvallisesti salattuja viestejä välimuistiin, jotta ne näkyvät hakutuloksissa:", + "Navigate recent messages to edit": "Voit muokata viimeisimpiä viestejä", + "Clear room list filter field": "Tyhjennä huoneluettelon suodatinkenttä" } From f4190ccae206e68c3e4cbd4c4611e101e94182e3 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sun, 27 Dec 2020 21:01:51 +0000 Subject: [PATCH 084/231] Fix mini avatar uploader "working" even without permissions --- src/components/views/elements/MiniAvatarUploader.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/views/elements/MiniAvatarUploader.tsx b/src/components/views/elements/MiniAvatarUploader.tsx index 8517da6dfb..51b55601f7 100644 --- a/src/components/views/elements/MiniAvatarUploader.tsx +++ b/src/components/views/elements/MiniAvatarUploader.tsx @@ -15,6 +15,7 @@ limitations under the License. */ import React, {useContext, useRef, useState} from 'react'; +import {EventType} from 'matrix-js-sdk/src/@types/event'; import classNames from 'classnames'; import AccessibleButton from "./AccessibleButton"; @@ -23,6 +24,7 @@ import MatrixClientContext from "../../../contexts/MatrixClientContext"; import {useTimeout} from "../../../hooks/useTimeout"; import Analytics from "../../../Analytics"; import CountlyAnalytics from '../../../CountlyAnalytics'; +import RoomContext from "../../../contexts/RoomContext"; export const AVATAR_SIZE = 52; @@ -50,6 +52,10 @@ const MiniAvatarUploader: React.FC = ({ hasAvatar, hasAvatarLabel, noAva const label = (hasAvatar || busy) ? hasAvatarLabel : noAvatarLabel; + const {room} = useContext(RoomContext); + const canSetAvatar = room?.currentState.maySendStateEvent(EventType.RoomAvatar, cli.getUserId()); + if (!canSetAvatar) return children; + return Date: Sun, 27 Dec 2020 21:13:01 +0000 Subject: [PATCH 085/231] Unfloat the MiniAvatarUploader "tooltip" --- res/css/views/elements/_MiniAvatarUploader.scss | 10 ++++++++++ .../views/elements/MiniAvatarUploader.tsx | 14 ++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/res/css/views/elements/_MiniAvatarUploader.scss b/res/css/views/elements/_MiniAvatarUploader.scss index 2502977331..698184a095 100644 --- a/res/css/views/elements/_MiniAvatarUploader.scss +++ b/res/css/views/elements/_MiniAvatarUploader.scss @@ -18,6 +18,16 @@ limitations under the License. position: relative; width: min-content; + // this isn't a floating tooltip so override some things to not need to bother with z-index and floating + .mx_Tooltip { + display: inline-block; + position: absolute; + z-index: unset; + width: max-content; + left: 72px; + top: 0; + } + &::before, &::after { content: ''; position: absolute; diff --git a/src/components/views/elements/MiniAvatarUploader.tsx b/src/components/views/elements/MiniAvatarUploader.tsx index 51b55601f7..1802bcd3dd 100644 --- a/src/components/views/elements/MiniAvatarUploader.tsx +++ b/src/components/views/elements/MiniAvatarUploader.tsx @@ -19,7 +19,6 @@ import {EventType} from 'matrix-js-sdk/src/@types/event'; import classNames from 'classnames'; import AccessibleButton from "./AccessibleButton"; -import Tooltip from './Tooltip'; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import {useTimeout} from "../../../hooks/useTimeout"; import Analytics from "../../../Analytics"; @@ -56,6 +55,7 @@ const MiniAvatarUploader: React.FC = ({ hasAvatar, hasAvatarLabel, noAva const canSetAvatar = room?.currentState.maySendStateEvent(EventType.RoomAvatar, cli.getUserId()); if (!canSetAvatar) return children; + const visible = !!label && (hover || show); return = ({ hasAvatar, hasAvatarLabel, noAva > { children } - +
    +
    + { label } +
    ; }; From ce5b244a246e16725009d9f9f5938de517e23958 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sun, 27 Dec 2020 21:25:48 +0000 Subject: [PATCH 086/231] delint --- src/components/views/elements/MiniAvatarUploader.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/elements/MiniAvatarUploader.tsx b/src/components/views/elements/MiniAvatarUploader.tsx index 1802bcd3dd..77c4e402eb 100644 --- a/src/components/views/elements/MiniAvatarUploader.tsx +++ b/src/components/views/elements/MiniAvatarUploader.tsx @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, {useContext, useRef, useState} from 'react'; +import React, {ReactChildren, ReactNode, useContext, useRef, useState} from 'react'; import {EventType} from 'matrix-js-sdk/src/@types/event'; import classNames from 'classnames'; @@ -53,7 +53,7 @@ const MiniAvatarUploader: React.FC = ({ hasAvatar, hasAvatarLabel, noAva const {room} = useContext(RoomContext); const canSetAvatar = room?.currentState.maySendStateEvent(EventType.RoomAvatar, cli.getUserId()); - if (!canSetAvatar) return children; + if (!canSetAvatar) return { children }; const visible = !!label && (hover || show); return From 7af147105266ce559e840178a70d01ce2318c4a6 Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Sun, 27 Dec 2020 21:46:56 +0000 Subject: [PATCH 087/231] delint2 --- src/components/views/elements/MiniAvatarUploader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/elements/MiniAvatarUploader.tsx b/src/components/views/elements/MiniAvatarUploader.tsx index 77c4e402eb..b2609027d4 100644 --- a/src/components/views/elements/MiniAvatarUploader.tsx +++ b/src/components/views/elements/MiniAvatarUploader.tsx @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, {ReactChildren, ReactNode, useContext, useRef, useState} from 'react'; +import React, {useContext, useRef, useState} from 'react'; import {EventType} from 'matrix-js-sdk/src/@types/event'; import classNames from 'classnames'; From a6c9994fec31ad2dcb73292ac28f59aef5e88cbf Mon Sep 17 00:00:00 2001 From: Simon Date: Sun, 27 Dec 2020 22:06:56 +0000 Subject: [PATCH 088/231] Translated using Weblate (Danish) Currently translated at 21.5% (585 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/da/ --- src/i18n/strings/da.json | 87 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index f44d724643..9ddbaffcce 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -18,7 +18,7 @@ "Kicks user with given id": "Smider bruger med givet id ud", "Changes your display nickname": "Ændrer dit viste navn", "Searches DuckDuckGo for results": "Søger på DuckDuckGo efter resultater", - "Commands": "kommandoer", + "Commands": "Kommandoer", "Emoji": "Emoji", "Sign in": "Log ind", "Warning!": "Advarsel!", @@ -69,7 +69,7 @@ "World readable": "Læselig af alle", "Guests can join": "Gæster kan deltage", "No rooms to show": "Ingen rum at vise", - "This email address is already in use": "Denne emailadresse er allerede i brug", + "This email address is already in use": "Denne email adresse er allerede i brug", "This phone number is already in use": "Dette telefonnummer er allerede i brug", "Failed to verify email address: make sure you clicked the link in the email": "Kunne ikke bekræfte emailaddressen: vær sikker på at klikke på linket i emailen", "Call Timeout": "Opkalds Timeout", @@ -536,5 +536,86 @@ "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s opdaterede den regel der banner rum som matcher %(glob)s på grund af %(reason)s", "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s opdaterede den regel der banner servere der matcher %(glob)s på grund af %(reason)s", "%(senderName)s updated a ban rule matching %(glob)s for %(reason)s": "%(senderName)s opdaterede en ban-regel der matcher %(glob)s på grund af %(reason)s", - "Explore rooms": "Udforsk rum" + "Explore rooms": "Udforsk rum", + "Verification code": "Verifikationskode", + "Who can access this room?": "Hvem kan tilgå dette rum?", + "Encrypted": "Krypteret", + "Once enabled, encryption cannot be disabled.": "Efter aktivering er det ikke muligt at slå kryptering fra.", + "Security & Privacy": "Sikkerhed & Privatliv", + "Who can read history?": "Hvem kan læse historikken?", + "Enable encryption?": "Aktiver kryptering?", + "Only people who have been invited": "Kun folk som er blevet inviteret", + "Add a User": "Tilføj en bruger", + "Everyone": "Alle", + "Description": "Beskrivelse", + "Create a Group Chat": "Opret en gruppechat", + "Explore Public Rooms": "Udforsk offentlige rum", + "Send a Direct Message": "Send en Direkte Besked", + "Permissions": "Tilladelser", + "Headphones": "Hovedtelefoner", + "Show more": "Vis mere", + "Show less": "Vis mindre", + "Passwords don't match": "Adgangskoderne matcher ikke", + "Confirm password": "Bekræft adgangskode", + "Reset": "Nulstil", + "No": "Nej", + "Enter password": "Indtast adgangskode", + "Add a new server": "Tilføj en ny server", + "Matrix": "Matrix", + "Remove server": "Fjern server", + "Change notification settings": "Skift notifikations indstillinger", + "%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s", + "%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s", + "%(senderName)s: %(message)s": "%(senderName)s: %(message)s", + "* %(senderName)s %(emote)s": "* %(senderName)s %(emote)s", + "%(senderName)s is calling": "%(senderName)s ringer", + "Waiting for answer": "Venter på svar", + "%(senderName)s started a call": "%(senderName)s startede et opkald", + "You started a call": "Du startede et opkald", + "Verified!": "Bekræftet!", + "Video Call": "Video Opkald", + "Accept": "Accepter", + "Decline": "Afvis", + "Save": "Gem", + "Profile picture": "Profil billede", + "Categories": "Kategorier", + "Checking server": "Tjekker server", + "You're signed out": "Du er logget ud", + "Change Password": "Skift adgangskode", + "Current password": "Nuværende adgangskode", + "Theme added!": "Tema tilføjet!", + "The other party declined the call.": "Den anden part afviste opkaldet.", + "Comment": "Kommentar", + "or": "eller", + "%(brand)s Android": "%(brand)s Android", + "%(brand)s iOS": "%(brand)s iOS", + "Privacy": "Privatliv", + "Please enter a name for the room": "Indtast et navn for rummet", + "No results": "Ingen resultater", + "Disable": "Deaktiver", + "Profile": "Profil", + "Local address": "Lokal adresse", + "This room has no local addresses": "Dette rum har ingen lokal adresse", + "The conversation continues here.": "Samtalen fortsætter her.", + "Send a message…": "Send en besked…", + "Send an encrypted message…": "Send en krypteret besked…", + "Send a reply…": "Besvar…", + "Message deleted on %(date)s": "Besked slettet d. %(date)s", + "Message deleted by %(name)s": "Besked slettet af %(name)s", + "Message deleted": "Besked slettet", + "Theme": "Tema", + "France": "Frankrig", + "Finland": "Finland", + "Egypt": "Egypten", + "Denmark": "Danmark", + "Cuba": "Cuba", + "China": "Kina", + "Canada": "Canada", + "End conference": "Afslut konference", + "Too Many Calls": "For mange opkald", + "Permission is granted to use the webcam": "Tilladelse er givet til brug af webcam", + "Unable to access webcam / microphone": "Kan ikke tilgå webcam / mikrofon", + "Unable to access microphone": "Kan ikke tilgå mikrofonen", + "The call could not be established": "Opkaldet kunne ikke etableres", + "Call Declined": "Opkald afvist" } From b8bb6ade3c1e59e767cd85597fb5b5b36d24867d Mon Sep 17 00:00:00 2001 From: Nadia Holmquist Pedersen Date: Sun, 27 Dec 2020 21:58:55 +0000 Subject: [PATCH 089/231] Translated using Weblate (Danish) Currently translated at 21.5% (585 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/da/ --- src/i18n/strings/da.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/da.json b/src/i18n/strings/da.json index 9ddbaffcce..1f4eef4d93 100644 --- a/src/i18n/strings/da.json +++ b/src/i18n/strings/da.json @@ -617,5 +617,6 @@ "Unable to access webcam / microphone": "Kan ikke tilgå webcam / mikrofon", "Unable to access microphone": "Kan ikke tilgå mikrofonen", "The call could not be established": "Opkaldet kunne ikke etableres", - "Call Declined": "Opkald afvist" + "Call Declined": "Opkald afvist", + "Folder": "Mappe" } From 7912091bc5914518ec201710ef2a4beacd1e05c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 29 Dec 2020 16:08:54 +0100 Subject: [PATCH 090/231] Revert "Hide add button when new item field is empty" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit fa99c2e8c5a4d90385b3b6377169dfb38e972a63. Signed-off-by: Šimon Brandner --- src/components/views/elements/EditableItemList.js | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/components/views/elements/EditableItemList.js b/src/components/views/elements/EditableItemList.js index 3537d8fad0..34e53906a2 100644 --- a/src/components/views/elements/EditableItemList.js +++ b/src/components/views/elements/EditableItemList.js @@ -118,23 +118,15 @@ export default class EditableItemList extends React.Component { }; _renderNewItemField() { - let addButton; - console.log(this.props.newItem); - if (this.props.newItem) { - addButton = ( - - {_t("Add")} - - ); - } - return (
    - { addButton } + + {_t("Add")} + ); } From 0083cf56bf3970ca44a8d66f9c90fe89102a45a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Tue, 29 Dec 2020 16:20:43 +0100 Subject: [PATCH 091/231] Hide buttons only if perrmissions are missing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/room_settings/RoomProfileSettings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/room_settings/RoomProfileSettings.js b/src/components/views/room_settings/RoomProfileSettings.js index 6904351cad..c76c0823e4 100644 --- a/src/components/views/room_settings/RoomProfileSettings.js +++ b/src/components/views/room_settings/RoomProfileSettings.js @@ -164,7 +164,7 @@ export default class RoomProfileSettings extends React.Component { const AvatarSetting = sdk.getComponent('settings.AvatarSetting'); let profileSettingsButtons; - if (this.state.enableProfileSave) { + if (this.state.canSetTopic && this.state.canSetName) { profileSettingsButtons = (
    Date: Tue, 29 Dec 2020 16:30:20 +0100 Subject: [PATCH 092/231] Disable add button if the field is empty MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/views/elements/EditableItemList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/elements/EditableItemList.js b/src/components/views/elements/EditableItemList.js index 34e53906a2..5a07a400d7 100644 --- a/src/components/views/elements/EditableItemList.js +++ b/src/components/views/elements/EditableItemList.js @@ -124,7 +124,7 @@ export default class EditableItemList extends React.Component { - + {_t("Add")} From 7e0cf5c7832a46243f4b145a06c7ac821eda4e14 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 29 Dec 2020 12:35:48 -0700 Subject: [PATCH 093/231] Wire up MSC2931 widget navigation Fixes https://github.com/vector-im/element-web/issues/16006 **Requires https://github.com/matrix-org/matrix-widget-api/pull/27** --- src/i18n/strings/en_EN.json | 1 + src/stores/widgets/ElementWidgetActions.ts | 7 +++++++ src/stores/widgets/ElementWidgetCapabilities.ts | 3 +++ src/stores/widgets/StopGapWidgetDriver.ts | 9 +++++++++ src/widgets/CapabilityText.tsx | 3 +++ 5 files changed, 23 insertions(+) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index c0939871e2..4dad7a97f1 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -584,6 +584,7 @@ "Send stickers into this room": "Send stickers into this room", "Send stickers into your active room": "Send stickers into your active room", "Change which room you're viewing": "Change which room you're viewing", + "Change which room you're viewing and use permalinks": "Change which room you're viewing and use permalinks", "Change the topic of this room": "Change the topic of this room", "See when the topic changes in this room": "See when the topic changes in this room", "Change the topic of your active room": "Change the topic of your active room", diff --git a/src/stores/widgets/ElementWidgetActions.ts b/src/stores/widgets/ElementWidgetActions.ts index 76390086ab..de48746a74 100644 --- a/src/stores/widgets/ElementWidgetActions.ts +++ b/src/stores/widgets/ElementWidgetActions.ts @@ -20,9 +20,16 @@ export enum ElementWidgetActions { ClientReady = "im.vector.ready", HangupCall = "im.vector.hangup", OpenIntegrationManager = "integration_manager_open", + + /** + * @deprecated Use MSC2931 instead + */ ViewRoom = "io.element.view_room", } +/** + * @deprecated Use MSC2931 instead + */ export interface IViewRoomApiRequest extends IWidgetApiRequest { data: { room_id: string; // eslint-disable-line camelcase diff --git a/src/stores/widgets/ElementWidgetCapabilities.ts b/src/stores/widgets/ElementWidgetCapabilities.ts index 3f17d27909..e493d5618f 100644 --- a/src/stores/widgets/ElementWidgetCapabilities.ts +++ b/src/stores/widgets/ElementWidgetCapabilities.ts @@ -15,5 +15,8 @@ */ export enum ElementWidgetCapabilities { + /** + * @deprecated Use MSC2931 instead. + */ CanChangeViewedRoom = "io.element.view_room", } diff --git a/src/stores/widgets/StopGapWidgetDriver.ts b/src/stores/widgets/StopGapWidgetDriver.ts index 2d2d1fcbdb..8baea97fe0 100644 --- a/src/stores/widgets/StopGapWidgetDriver.ts +++ b/src/stores/widgets/StopGapWidgetDriver.ts @@ -43,6 +43,7 @@ import { EventType } from "matrix-js-sdk/src/@types/event"; import { CHAT_EFFECTS } from "../../effects"; import { containsEmoji } from "../../effects/utils"; import dis from "../../dispatcher/dispatcher"; +import {tryTransformPermalinkToLocalHref} from "../../utils/permalinks/Permalinks"; // TODO: Purge this from the universe @@ -171,4 +172,12 @@ export class StopGapWidgetDriver extends WidgetDriver { }, }); } + + public async navigate(uri: string): Promise { + const localUri = tryTransformPermalinkToLocalHref(uri); + if (!localUri || localUri === uri) { // parse failure can lead to an unmodified URL + throw new Error("Failed to transform URI"); + } + window.location.hash = localUri; // it'll just be a fragment + } } diff --git a/src/widgets/CapabilityText.tsx b/src/widgets/CapabilityText.tsx index 834ea3ec37..044b7701ba 100644 --- a/src/widgets/CapabilityText.tsx +++ b/src/widgets/CapabilityText.tsx @@ -60,6 +60,9 @@ export class CapabilityText { [ElementWidgetCapabilities.CanChangeViewedRoom]: { [GENERIC_WIDGET_KIND]: _td("Change which room you're viewing"), }, + [MatrixCapabilities.MSC2931Navigate]: { + [GENERIC_WIDGET_KIND]: _td("Change which room you're viewing and use permalinks"), + }, }; private static stateSendRecvCaps: ISendRecvStaticCapText = { From 254e0b9a94e0eede95b9085cc8c099aa092bd2c5 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 29 Dec 2020 15:30:22 -0700 Subject: [PATCH 094/231] Add a basic widget explorer to devtools (per-room) --- .../views/dialogs/DevtoolsDialog.js | 94 +++++++++++++++++++ src/i18n/strings/en_EN.json | 2 + 2 files changed, 96 insertions(+) diff --git a/src/components/views/dialogs/DevtoolsDialog.js b/src/components/views/dialogs/DevtoolsDialog.js index a0c5375843..a754a62b50 100644 --- a/src/components/views/dialogs/DevtoolsDialog.js +++ b/src/components/views/dialogs/DevtoolsDialog.js @@ -32,6 +32,8 @@ import { PHASE_STARTED, PHASE_CANCELLED, } from "matrix-js-sdk/src/crypto/verification/request/VerificationRequest"; +import WidgetStore from "../../../stores/WidgetStore"; +import {UPDATE_EVENT} from "../../../stores/AsyncStore"; class GenericEditor extends React.PureComponent { // static propTypes = {onBack: PropTypes.func.isRequired}; @@ -701,6 +703,97 @@ class VerificationExplorer extends React.Component { } } +class WidgetExplorer extends React.Component { + static getLabel() { + return _t("Active Widgets"); + } + + constructor(props) { + super(props); + + this.state = { + query: '', + editWidget: null, // set to an IApp when editing + }; + } + + onWidgetStoreUpdate = () => { + this.forceUpdate(); + }; + + onQueryChange = (query) => { + this.setState({query}); + }; + + onEditWidget = (widget) => { + this.setState({editWidget: widget}); + }; + + onBack = () => { + const widgets = WidgetStore.instance.getApps(this.props.room.roomId); + if (this.state.editWidget && widgets.includes(this.state.editWidget)) { + this.setState({editWidget: null}); + } else { + this.props.onBack(); + } + }; + + componentDidMount() { + WidgetStore.instance.on(UPDATE_EVENT, this.onWidgetStoreUpdate); + } + + componentWillUnmount() { + WidgetStore.instance.off(UPDATE_EVENT, this.onWidgetStoreUpdate); + } + + render() { + const room = this.props.room; + + const editWidget = this.state.editWidget; + const widgets = WidgetStore.instance.getApps(room.roomId); + if (editWidget && widgets.includes(editWidget)) { + const allState = Array.from(Array.from(room.currentState.events.values()).map(e => e.values())) + .reduce((p, c) => {p.push(...c); return p;}, []); + const stateEv = allState.find(ev => ev.getId() === editWidget.eventId); + if (!stateEv) { // "should never happen" + return
    + {_t("There was an error finding this widget.")} +
    + +
    +
    ; + } + return ; + } + + return (
    +
    + + {widgets.map(w => + + )} + +
    +
    + +
    +
    ); + } +} + const Entries = [ SendCustomEvent, RoomStateExplorer, @@ -708,6 +801,7 @@ const Entries = [ AccountDataExplorer, ServersInRoomList, VerificationExplorer, + WidgetExplorer, ]; export default class DevtoolsDialog extends React.PureComponent { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index c0939871e2..155dc34c8c 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2042,6 +2042,8 @@ "Explore Account Data": "Explore Account Data", "View Servers in Room": "View Servers in Room", "Verification Requests": "Verification Requests", + "Active Widgets": "Active Widgets", + "There was an error finding this widget.": "There was an error finding this widget.", "Toolbox": "Toolbox", "Developer Tools": "Developer Tools", "There was an error updating your community. The server is unable to process your request.": "There was an error updating your community. The server is unable to process your request.", From 64b056d689cd1337e87d988da6abd5a9ea08c71f Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 29 Dec 2020 15:34:40 -0700 Subject: [PATCH 095/231] Appease the linter --- src/components/views/dialogs/DevtoolsDialog.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/dialogs/DevtoolsDialog.js b/src/components/views/dialogs/DevtoolsDialog.js index a754a62b50..00c41ec4b1 100644 --- a/src/components/views/dialogs/DevtoolsDialog.js +++ b/src/components/views/dialogs/DevtoolsDialog.js @@ -779,11 +779,11 @@ class WidgetExplorer extends React.Component {
    {widgets.map(w => - + >{w.url}) )}
    From 5773d78464aa958126bf20ccaa7cfa4b889b10e0 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 29 Dec 2020 15:40:44 -0700 Subject: [PATCH 096/231] Maybe this will appease the linter. --- src/components/views/dialogs/DevtoolsDialog.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/views/dialogs/DevtoolsDialog.js b/src/components/views/dialogs/DevtoolsDialog.js index 00c41ec4b1..7d4e3b462f 100644 --- a/src/components/views/dialogs/DevtoolsDialog.js +++ b/src/components/views/dialogs/DevtoolsDialog.js @@ -778,13 +778,13 @@ class WidgetExplorer extends React.Component { return (
    - {widgets.map(w => - () - )} + >{w.url}; + })}
    From fc6349b11fa65310ff5476f5d745c7c5240cfa97 Mon Sep 17 00:00:00 2001 From: Flat Earth Israel Association Date: Wed, 30 Dec 2020 11:00:23 +0000 Subject: [PATCH 097/231] Translated using Weblate (Hebrew) Currently translated at 43.3% (1178 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/he/ --- src/i18n/strings/he.json | 373 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 370 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index 458a7bdcf4..d030313856 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -161,7 +161,7 @@ "Unable to look up room ID from server": "לא ניתן לאתר מזהה חדר על השרת", "Couldn't find a matching Matrix room": "לא נמצא חדר כזה ב מטריקס", "Invite to this room": "הזמן לחדר זה", - "You cannot delete this message. (%(code)s)": "לא ניתן למחוק הודעה זו. (%(code)s)", + "You cannot delete this message. (%(code)s)": "לא ניתן למחוק הודעה זו. (%(code)s)", "Thursday": "חמישי", "Search…": "חפש…", "Logs sent": "יומנים נשלחו", @@ -331,7 +331,7 @@ "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 על מנת שהשיחות יפעלו בעקביות.", + "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.": "השיחה נענתה במכשיר אחר.", "Answered Elsewhere": "נענה במקום אחר", @@ -832,5 +832,372 @@ "Displays action": "הצג פעולה", "Takes the call in the current room off hold": "מחזיר את השיחה הנוכחית ממצב המתנה", "Places the call in the current room on hold": "שם את השיחה הנוכחית במצב המתנה", - "Sends a message to the given user": "שליחת הודעת למשתמש מסויים" + "Sends a message to the given user": "שליחת הודעת למשתמש מסויים", + "Your keys are not being backed up from this session.": "המפתחות שלך אינם מגובים מהתחברות זו .", + "Algorithm:": "אלגוריתם:", + "Backup version:": "גירסת גיבוי:", + "This backup is trusted because it has been restored on this session": "ניתן לסמוך על גיבוי זה מכיוון שהוא שוחזר בהפעלה זו", + "Backup is not signed by any of your sessions": "גיבוי אינו חתום על ידי אף אחד מההתחברויות שלכם", + "Backup has an invalid signature from unverified session ": "לגיבוי יש חתימה לא תקינה מהתחברות לא מאומתת ", + "Backup has an invalid signature from verified session ": "לגיבוי יש חתימה לא תקינה מהתחברות מאומתת ", + "Backup has a valid signature from verified session ": "לגיבוי יש חתימה תקפה מהתחברות מאומתת ", + "Backup has a valid signature from unverified session ": "לגיבוי יש חתימה תקפה מהתחברות לא מאומתת ", + "Backup has an invalid signature from this session": "לגיבוי יש חתימה לא תקפה מהפעלה זו", + "Backup has a valid signature from this session": "לגיבוי יש חתימה תקפה מהפעלה זו", + "Backup has a signature from unknown session with ID %(deviceId)s": "לגיבוי יש חתימה מ- לא ידוע עם %(deviceId)s", + "Backup has a signature from unknown user with ID %(deviceId)s": "לגיבוי יש חתימה ממשתמש לא ידוע עם ID% (deviceId) s", + "Backup has a invalid signature from this user": "לגיבוי יש חתימה לא תקפה ממשתמש זה", + "Backup has a valid signature from this user": "לגיבוי יש חתימה תקפה ממשתמש זה", + "All keys backed up": "כל המפתחות מגובים", + "Backing up %(sessionsRemaining)s keys...": "מגבה מפתחות %(sessionsRemaining)s...", + "Connect this session to Key Backup": "חבר את התחברות הזו לגיבוי מפתח", + "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "חבר את ההפעלה הזו לגיבוי המפתח לפני היציאה, כדי למנוע אובדן מפתחות שיכולים להיות רק בפגישה זו.", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "הפעלה זו אינה מגבה את המפתחות שלך , אך יש לך גיבוי קיים ממנו תוכל לשחזר ולהוסיף להמשך.", + "This session is backing up your keys. ": "ההתחברות הזו תגבה את כל המפתחות שלכם. ", + "Restore from Backup": "שחזר מגיבוי", + "Unable to load key backup status": "לא ניתן לטעון את מצב גיבוי המפתח", + "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "האם אתה בטוח? תאבד את ההודעות המוצפנות שלך אם המפתחות שלך לא מגובים כראוי.", + "Delete Backup": "מחק גיבוי", + "Save": "שמירה", + "Profile picture": "תמונת פרופיל", + "Display Name": "הצג שם", + "Profile": "פרופיל", + "Upgrade to your own domain": "שדרגו לדומיין משלכם", + "The operation could not be completed": "לא ניתן היה להשלים את הפעולה", + "Failed to save your profile": "שמירת הפרופיל שלכם נכשלה", + "Enable audible notifications for this session": "אפשר התראות נשמעות עבור התחברות זו", + "Enable desktop notifications for this session": "החל התראות עבור התחברות זו", + "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "יכול להיות שתגדיר אותם בלקוח שאינו %(brand)s. אינך יכול לכוון אותם ב- %(brand)s אך הם עדיין חלים.", + "There are advanced notifications which are not shown here.": "ישנן התראות מתקדמות שלא מוצגות כאן.", + "Add an email address to configure email notifications": "הוסף כתובת דוא\"ל להגדרת התראות דוא\"ל", + "Clear notifications": "נקה התראות", + "The integration manager is offline or it cannot reach your homeserver.": "מנהל האינטגרציה לא מקוון או שהוא לא יכול להגיע לשרת הבית שלך.", + "Cannot connect to integration manager": "לא ניתן להתחבר אל מנהל האינטגרציה", + "Connecting to integration manager...": "מתחבר למנהל האינטגרציה ...", + "%(brand)s can't securely cache encrypted messages locally while running in a web browser. Use %(brand)s Desktop for encrypted messages to appear in search results.": "%(brand)s אינם יכולים לשמור במטמון מאובטח הודעות מוצפנות באופן מקומי בזמן שהם פועלים בדפדפן אינטרנט. השתמש ב- % (brand) s Desktop כדי שהודעות מוצפנות יופיעו בתוצאות החיפוש.", + "%(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 חסרים כמה רכיבים הנדרשים לצורך אחסון במטמון מאובטח של הודעות מוצפנות באופן מקומי. אם תרצה להתנסות בתכונה זו, בנה %(brand)s מותאם אישית לדסקטום עם חפש רכיבים להוספה.", + "Securely cache encrypted messages locally for them to appear in search results.": "שמור באופן מאובטח הודעות מוצפנות באופן מקומי כדי שיופיעו בתוצאות החיפוש.", + "Manage": "ניהול", + "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "שמור באופן מאובטח הודעות מוצפנות באופן מקומי כדי שיופיעו בתוצאות החיפוש באמצעות %(size)s לשמור הודעות מחדרים %(rooms)s.", + "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "שמור באופן מאובטח הודעות מוצפנות באופן מקומי כדי שיופיעו בתוצאות החיפוש באמצעות %(size)s לשמור הודעות מחדרים %(rooms)s.", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "אמת בנפרד כל מושב שמשתמש בו כדי לסמן אותו כאמצעי מהימן, ולא אמון על מכשירים חתומים צולבים.", + "Encryption": "הצפנה", + "Failed to set display name": "תצוגת שם נכשלה", + "Last seen": "שם משפחה", + "Public Name": "שם ציבורי", + "ID": "קוד זיהוי", + "Delete %(count)s sessions|one": "מחק התחברות %(count)s", + "Delete %(count)s sessions|other": "מחק התחברויות %(count)s", + "Authentication": "אימות", + "Delete sessions|one": "מחק התחברות", + "Delete sessions|other": "מחק התחברויות", + "Click the button below to confirm deleting these sessions.|one": "לחץ על הלחצן למטה כדי לאשר את מחיקת התחברויות אלו.", + "Click the button below to confirm deleting these sessions.|other": "לחץ על הלחצן למטה כדי לאשר את מחיקת הפעלות אלה.", + "Confirm deleting these sessions": "אשר מחיקת התחברויות אלו", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "אשר את מחיקת ההפעלה באמצעות כניסה יחידה כדי להוכיח את זהותך.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "אשר את מחיקת המפגשים האלה באמצעות כניסה יחידה כדי להוכיח את זהותך.", + "Unable to load session list": "לא מצליח לטעון את רשימת ההתחברויות", + "Your homeserver does not support session management.": "השרת שלכם לא תומך בניהול התחברויות.", + "exists": "קיים", + "Homeserver feature support:": "תמיכה שרת:", + "User signing private key:": "משתמש חותם על מפתח פרטי:", + "Self signing private key:": "מפתח פרטי ברישום עצמאי:", + "not found locally": "לא נמצא באחסון מקומי", + "cached locally": "אוחסן מקומי", + "Master private key:": "מפתח מאסטר פרטי:", + "not found in storage": "לא נמצא באחסון", + "in secret storage": "באחסון סודי", + "Cross-signing private keys:": "מפתחות פרטיים של חתימה צולבת:", + "not found": "לא נמצא", + "in memory": "בזכרון", + "Cross-signing public keys:": "מפתחות ציבוריים של חתימה צולבת:", + "Reset": "אתחל", + "Set up": "הגדר", + "Cross-signing is not set up.": "חתימה צולבת אינה מוגדרת עדיין.", + "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "לחשבונך זהות חתימה צולבת באחסון סודי, אך הפגישה זו אינה מהימנה עדיין.", + "Your homeserver does not support cross-signing.": "השרת שלכם אינו תומך בחתימות-צולבות.", + "Cross-signing is ready for use.": "חתימה צולבת מוכנה לשימוש.", + "Change Password": "שנה סיסמא", + "Current password": "הסיסמא הנוכחית", + "Passwords don't match": "ססמאות לא תואמות", + "Confirm password": "אשרו סיסמא", + "Do you want to set an email address?": "האם אתם רוצים להגדיר כתובת דוא\"ל?", + "Export E2E room keys": "ייצא מפתחות חדר E2E", + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "שינוי הסיסמה יאפס כרגע את כל מפתחות ההצפנה מקצה לקצה בכל ההפעלות, מה שהופך את היסטוריית הצ'אט המוצפנת לבלתי קריאה, אלא אם כן אתה מייצא תחילה את מפתחות החדר שלך ומייבא אותם מחדש לאחר מכן. בעתיד זה ישופר.", + "Passwords can't be empty": "ססמאות לא יכולות להיות ריקות", + "New passwords don't match": "הססמאות החדשות לא תואמות", + "No display name": "אין תצוגת שם", + "Upload new:": "העלאה חדשה:", + "Failed to upload profile picture!": "העלאת תמונת פרופיל נכשלה!", + "Show more": "הצג יותר", + "Show less": "הצג פחות", + "Channel: %(channelName)s": "ערוץ: %(channelName)s", + "Workspace: %(networkName)s": "סביבת עבודה: %(networkName)s", + "This bridge is managed by .": "הגשר הזה מנוהל על ידי משתמש .", + "This bridge was provisioned by .": "הגשר הזה נוצר על ידי משתמש .", + "Upload": "העלאה", + "Accept to continue:": "קבל להמשך:", + "Decline (%(counter)s)": "סרב %(counter)s", + "From %(deviceName)s (%(deviceId)s)": "מ- %(deviceName)s %(deviceId)s", + "Your server isn't responding to some requests.": "השרת שלכם אינו מגיב לבקשות מסויימות בקשות.", + "Pin": "נעץ", + "Folder": "תקיה", + "Headphones": "אוזניות", + "Anchor": "עוגן", + "Ball": "כדור", + "Bell": "פעמון", + "Trumpet": "חצוצרה", + "Guitar": "גיטרה", + "Trophy": "פרס", + "Rocket": "רקטה", + "Aeroplane": "אוירון", + "Bicycle": "אופניים", + "Train": "רכבת", + "Flag": "דגל", + "Telephone": "טלפון", + "Hammer": "פטיש", + "Key": "מפתח", + "Lock": "מנעול", + "Scissors": "מספריים", + "Paperclip": "מהדק נייר", + "Pencil": "עפרון", + "Book": "ספר", + "Light bulb": "נורה", + "Gift": "מתנה", + "Clock": "שעון", + "Hourglass": "שעון חול", + "Umbrella": "מטריה", + "Thumbs up": "חיובי", + "Santa": "סנטה", + "Spanner": "סביבון", + "Glasses": "משקפיים", + "Hat": "כובע", + "Robot": "רובוט", + "Smiley": "חיוך", + "Heart": "לב", + "Cake": "עוגה", + "Pizza": "פיצה", + "Corn": "תירס", + "Strawberry": "תות", + "Apple": "תפוח", + "Banana": "בננה", + "Fire": "אש", + "Cloud": "ענן", + "Moon": "לבנה", + "Globe": "גלובוס-דמיוני", + "Mushroom": "פטריה", + "Cactus": "קקטוס", + "Tree": "עץ", + "Flower": "פרח", + "Butterfly": "פרפר", + "Octopus": "תמנון", + "Fish": "דג", + "Turtle": "צב", + "Penguin": "פנגוין", + "Rooster": "תרנגול", + "Panda": "פנדה", + "Rabbit": "שפן", + "Elephant": "פיל", + "Pig": "חזיר", + "Unicorn": "חד קרן", + "Horse": "סוס", + "Lion": "אריה", + "Cat": "חתול", + "Dog": "כלב", + "To be secure, do this in person or use a trusted way to communicate.": "בכדי להיות מאובטח, עשו זאת ביחד או השתמשו בדרך בטוחה לתקשר.", + "They don't match": "הם לא זהים", + "They match": "הם זהים", + "Cancelling…": "מבטל…", + "Waiting for %(displayName)s to verify…": "ממתין ל- %(displayName)s בכדי לאמת…", + "Waiting for your other session to verify…": "ממתין להתחברות השניה שלכם בכדי לאמת…", + "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "ממתין להתחברות השניה שלכם, %(deviceName)s %(deviceId)s, בכדי לאמת…", + "Unable to find a supported verification method.": "לא מצליח למצוא שיטות אימות נתמכות.", + "Verify this user by confirming the following number appears on their screen.": "אמת את המשתמש הזה בכך שאותו מספר מופיע אצלו במסך.", + "Verify this session by confirming the following number appears on its screen.": "אמת את ההתחברות בכך שאותו מספר מופיע לשניכם על המסך.", + "Verify this user by confirming the following emoji appear on their screen.": "אמת את המשתמש הזה בכך שסדרת הסמלים מוצגת זהה אצלו במסך.", + "Confirm the emoji below are displayed on both sessions, in the same order:": "אשר שסדרת הסמלים המוצגת בשתי ההתחברויות הינה זהה ובאותו הסדר:", + "Start": "התחל", + "Compare a unique set of emoji if you don't have a camera on either device": "השווה קבוצה של סמלים אם אין ברשותכם מצלמה על שום מכשיר", + "Compare unique emoji": "השווה סמלים מסויימים", + "or": "או", + "Scan this unique code": "סרוק את הקוד הזה", + "Verify this session by completing one of the following:": "אמת את ההתחברות הזו על ידי סיום אחת מהאפשרויות הבאות:", + "Got It": "קבלתי", + "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "הודעות מאובטחות עם משתמש זה כעת מוצפנות מקצה לקצה ואינן יכולות להקרא על ידי אחרים.", + "You've successfully verified this user.": "המשתמש הזה אומת בהצלחה.", + "Verified!": "אומת!", + "The other party cancelled the verification.": "הצד השני ביטל את האימות.", + "Accept": "קבל", + "Decline": "סרב", + "Incoming call": "שיחה נכנסת", + "Incoming video call": "שיחת וידאו נכנסת", + "Incoming voice call": "שיחה קולית נכנסת", + "Unknown caller": "מתקשר לא ידוע", + "%(name)s on hold": "%(name)s במצב המתנה", + "You held the call Switch": "שמם את השיחה על המתנה להחליף", + "sends snowfall": "שלח שלג נופל", + "Sends the given message with snowfall": "שלח הודעה זו עם שלג נופל", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "%(weekDayName)s, %(monthName)s%(day)s%(fullYear)s%(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s": "%(weekDayName)s, %(monthName)s - %(day)s - %(fullYear)s", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s, %(monthName)s - %(day)s - %(time)s", + "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", + "Return to call": "חזור לשיחה", + "Fill Screen": "מסך מלא", + "Voice Call": "שיחת אודיו", + "Video Call": "שיחת וידאו", + "%(peerName)s held the call": "%(peerName)s שם את השיחה במצב המתנה", + "You held the call Resume": "שמתם את השיחה במצב המתנה לשוב", + "sends fireworks": "שלח זיקוקים", + "Sends the given message with fireworks": "שולח הודעה זו עם זיקוקים", + "sends confetti": "שלח קונפטי", + "Sends the given message with confetti": "שולח הודעה זו ביחד עם קונפטי", + "This is your list of users/servers you have blocked - don't leave the room!": "זוהי רשימת השרתים\\משתמשים אשר בחרתם לחסום - אל תצאו מחדר זה!", + "My Ban List": "רשימת החסומים שלי", + "When rooms are upgraded": "כאשר חדרים משתדרגים", + "Encrypted messages in group chats": "הודעות מוצפנות בצאטים של קבוצות", + "Encrypted messages in one-to-one chats": "הודעות מוצפנות בחדרים של אחד-ל-לאחד", + "Messages containing @room": "הודעות שמכילות שם חדר כגון: room@", + "Messages containing my username": "הודעות שמכילות את שם המשתמש שלי", + "Downloading logs": "מוריד לוגים", + "Uploading logs": "מעלה לוגים", + "Show chat effects": "הצג אפקטים של צאט", + "Enable experimental, compact IRC style layout": "אפשר באופן נסיוני תצוגה ממוזערת בסגנון של IRC", + "IRC display name width": "רוחב תצוגת השם של IRC", + "Manually verify all remote sessions": "אמת באופן ידני את כל ההתחברויות", + "How fast should messages be downloaded.": "באיזו מהירות הודעות יורדות.", + "Enable message search in encrypted rooms": "אפשר חיפוש הודעות בחדרים מוצפנים", + "Show previews/thumbnails for images": "הראה תצוגה מקדימה\\ממוזערת של תמונות", + "Allow fallback call assist server turn.matrix.org when your homeserver does not offer one (your IP address would be shared during a call)": "אפשר שימוש בשרת של מטריקס כאשר השרת שלכם לא פעיל (כתובת ה-IP שלכם תשותף במהלך השיחה)", + "Low bandwidth mode": "תצורת התחברות איטית", + "Show hidden events in timeline": "הצג ארועים מוסתרים בקו הזמן", + "Show shortcuts to recently viewed rooms above the room list": "הצג קיצורים אל חדרים שנצפו לאחרונה מעל לרשימת החדרים", + "Show rooms with unread notifications first": "הצג קודם חדרים עם התרעות שלא נקראו", + "Order rooms by name": "סדר חדרים לפי שם", + "Show developer tools": "הצג כלי מפתחים", + "Prompt before sending invites to potentially invalid matrix IDs": "שאלו אותי לפני שאתם שולחים הזמנה אל קוד זיהוי אפשרי של משתמש מערכת", + "Enable widget screenshots on supported widgets": "אפשר צילומי מסך של ישומונים עבור ישומונים נתמכים", + "Room Colour": "צבע החדר", + "Enable URL previews by default for participants in this room": "אפשר לחברים בחדר זה לצפות בתצוגת קישורים", + "Enable URL previews for this room (only affects you)": "אפשר תצוגת קישורים בחדר זה בלבד (רק משפיע עליכם)", + "Enable inline URL previews by default": "אפשר צפייה של תצוגת קישורים בצאט כברירת מחדל", + "Never send encrypted messages to unverified sessions in this room from this session": "לעולם אל תשלח הודעות מוצפנות אל התחברות שאינה מאומתת בחדר זה, מהתחברות זו", + "Never send encrypted messages to unverified sessions from this session": "לעולם אל תשלח הודעות מוצפנות אל התחברות שאינה מאומתת מהתחברות זו", + "Send analytics data": "שלח מידע אנליטי", + "Allow Peer-to-Peer for 1:1 calls": "אפשר התקשרות ישירה 1:1", + "System font name": "שם גופן מערכת", + "Use a system font": "השתמש בגופן מערכת", + "Match system theme": "התאם לתבנית המערכת", + "Enable Community Filter Panel": "החל פנל לסינון קהילות", + "Mirror local video feed": "שקף זרימת וידאו מקומית", + "Automatically replace plain text Emoji": "החלף טקסט עם סמל באופן אוטומטי", + "Use Ctrl + Enter to send a message": "השתמש ב Ctrl + Enter על מנת לשלוח הודעה", + "Use Command + Enter to send a message": "השתמש במקלדת Command + Enter על מנת לשלוח הודעה", + "Show typing notifications": "הצג התרעות כתיבה", + "Send typing notifications": "שלח התרעות כתיבה", + "Enable big emoji in chat": "החל סמלים גדולים בצאט", + "Show avatars in user and room mentions": "הצג אווטארים באזכורים של משתמשים וחדרים", + "Enable automatic language detection for syntax highlighting": "החל זיהוי שפה אוטומטי עבור הדגשת מבנה הכתיבה", + "Autoplay GIFs and videos": "נגן אנימציות וסרטונים", + "Always show message timestamps": "תמיד הצג חותמות זמן של הודעות", + "Show timestamps in 12 hour format (e.g. 2:30pm)": "הצג חותמות זמן של 12 שעות (כלומר 2:30pm)", + "Show read receipts sent by other users": "הצג הודעות שנקראו בידי משתמשים אחרים", + "Show display name changes": "הצג שינויים של שמות", + "Show avatar changes": "הצג שינויים באווטר", + "Show join/leave messages (invites/kicks/bans unaffected)": "הצג הודעות הצתרף\\עזב (הזמנות\\בעיטות\\חסימות לא מושפעות)", + "Show a placeholder for removed messages": "הצד מקום לתצוגת הודעות שהוסרו", + "Use a more compact ‘Modern’ layout": "השתמש בתצוגה מודרנית ומצומצמת יותר", + "Enable Emoji suggestions while typing": "החל הצעות לסמלים בזמן כתיבה", + "Use custom size": "השתמש בגודל מותאם אישית", + "Font size": "גודל אותיות", + "Show info about bridges in room settings": "הצג מידע אודות גשרים בהגדרות של החדרים", + "Enable advanced debugging for the room list": "החל דיבאגין מתקדם עבור רשימת החדרים", + "Offline encrypted messaging using dehydrated devices": "שליחת הודעות מוצפנות במצב אופליין עם שימוש במכשיר מיובש", + "Show message previews for reactions in all rooms": "הראה תצוגה מקדימה של הודעות עבור תגובות בכל החדרים", + "Show message previews for reactions in DMs": "הראה תצוגת הודעות מוקדמת עבור תגובות במצב דינאמי", + "Support adding custom themes": "מיכה להוספת תבניות מותאמות אישית", + "Try out new ways to ignore people (experimental)": "נסו דרכים חדשות להתעלם מאנשים (נסיוני)", + "Multiple integration managers": "מנהלי אנטגרציות מרובות", + "Render simple counters in room header": "הצג ספירה בראש החדר", + "Group & filter rooms by custom tags (refresh to apply changes)": "סינון קבוצות וחדרים על פי תגיות מנוסחות (ריפרש להחיל שינויים)", + "Custom user status messages": "נוסח הודעות מצב של משתמשים", + "Message Pinning": "נעיצת הודעות", + "New spinner design": "עיצוב מסובב חדש", + "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "גירסת קהילות 2. דורש שרת תואם. מאוד נסיוני - השתמשו בזהירות.", + "Render LaTeX maths in messages": "בצע מתמטיקה של LaTeX בהודעות", + "Change notification settings": "שינוי הגדרת התרעות", + "%(senderName)s: %(stickerName)s": "%(senderName)s: %(stickerName)s", + "%(senderName)s: %(message)s": "%(senderName)s :%(message)s", + "%(senderName)s: %(reaction)s": "%(senderName)s: %(reaction)s", + "* %(senderName)s %(emote)s": "* %(senderName)s %(emote)s", + "%(senderName)s is calling": "%(senderName)s מתקשר", + "Waiting for answer": "ממתין לתשובה", + "%(senderName)s started a call": "%(senderName)s התחיל שיחה", + "You started a call": "התחלתם שיחה", + "Call ended": "השיחה הסתיימה", + "%(senderName)s ended the call": "%(senderName)s סיים את השיחה", + "You ended the call": "סיימתם את השיחה", + "Call in progress": "שיחה פעילה", + "%(senderName)s joined the call": "%(senderName)s התחבר אל השיחה", + "You joined the call": "התחברתם אל השיחה בהצלחה", + "Failed to join room": "התחברות לחדר נכשלה", + "The person who invited you already left the room, or their server is offline.": "האדם שהזמין אתכם כבר עזב את החדר או שהשרת לא פעיל.", + "The person who invited you already left the room.": "האדם שהזמין אתכם כבר עזב את החדר.", + "Please contact your homeserver administrator.": "אנא צרו קשר עם מנהל השרת שלכם.", + "Sorry, your homeserver is too old to participate in this room.": "סליחה, השרת שלכם ישן מדי בשביל להתחבר אל חדר זה.", + "There was an error joining the room": "הייתה שגיאה בהתחברות אל החדר", + "Guest": "אורח", + "New version of %(brand)s is available": "גרסה חדשה של %(brand)s קיימת", + "Update %(brand)s": "עדכן %(brand)s", + "Verify the new login accessing your account: %(name)s": "אמתו את הכניסה החדשה לחשבונכם: %(name)s", + "New login. Was this you?": "כניסה חדשה. האם זה אתם?", + "Other users may not trust it": "יתכן משתמשים אחרים לא יבטחו בזה", + "Safeguard against losing access to encrypted messages & data": "שמור מפני איבוד גישה אל הודעות ומידע מוצפן", + "Verify": "אימות", + "Upgrade": "שדרג", + "Verify this session": "אשרו את ההתחברות הזאת", + "Encryption upgrade available": "שדרוג הצפנה קיים", + "Set up Secure Backup": "צור גיבוי מאובטח", + "Ok": "בסדר", + "Contact your server admin.": "צרו קשר עם מנהל השרת.", + "Your homeserver has exceeded one of its resource limits.": "השרת שלכם חרג מאחד או יותר משאבים אשר הוקצו לו.", + "Your homeserver has exceeded its user limit.": "השרת שלכם חרג ממגבלות מספר המשתמשים שלו.", + "Enable": "החל", + "Enable desktop notifications": "אשרו התרעות שולחן עבודה", + "Don't miss a reply": "אל תפספסו תגובה", + "Later": "מאוחר יותר", + "Review where you’re logged in": "סקור מהיכן כבר התחברת", + "Review": "סקירה", + "Verify all your sessions to ensure your account & messages are safe": "אשרו את כל ההתחברויות שלך על מנת לוודא שהחשבון וההודעות שלכם מאובטחים", + "No": "לא", + "Yes": "כן", + "Send anonymous usage data which helps us improve %(brand)s. This will use a cookie.": "שלח מידע שימוש אנונימי אשר עוזר לנו לשפר את %(brand)s. זה ישתמש ב עוגייה.", + "Help us improve %(brand)s": "עזרו לנו לשפר את %(brand)s", + "Unknown App": "אפליקציה לא ידועה", + "Short keyboard patterns are easy to guess": "דפוסים קצרים קל לנחש", + "Straight rows of keys are easy to guess": "שורות מסודרות של מקשים מאוד קל לנחש", + "Common names and surnames are easy to guess": "שמות משפחה ושמות רגילים מאוד קל לנחש", + "Names and surnames by themselves are easy to guess": "שמות ושמות משפחה בעצמם קלים מאוד לניחוש", + "A word by itself is easy to guess": "מילה כשלעצמה מאוד קל לנחש", + "This is similar to a commonly used password": "זוהי סיסמא זהה לסיסמא מאוד מוכרת", + "This is a very common password": "זוהי סיסמא מאוד מוכרת", + "This is a top-100 common password": "זוהי אחת ממאה הסיסמאות המוכרות ביותר", + "This is a top-10 common password": "זוהי אחת מעשר הסיסמאות המוכרות ביותר", + "Dates are often easy to guess": "תאריכים לעתים קל לנחש", + "Recent years are easy to guess": "קל לנחש שנים קודמות", + "Sequences like abc or 6543 are easy to guess": "סדרות כמו 'abc' ו '6543' קלות לניחוש", + "Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\"": "דפוסים כמו 'abcabcabc' קשות רק מעט יותר מ- 'abc'", + "Repeats like \"aaa\" are easy to guess": "דפוסים כמו 'aaa' קל לנחש", + "Add another word or two. Uncommon words are better.": "הוסיפו עוד מילה או שניים. מילים לא מוכרות טובות יותר.", + "Predictable substitutions like '@' instead of 'a' don't help very much": "שינויים צפויים כמו שינוי a ל '@' גם לא עוזר הרבה", + "Reversed words aren't much harder to guess": "מילים הפוכות לא ממש קשה לנחש", + "All-uppercase is almost as easy to guess as all-lowercase": "ניתן לנחש את כל האותיות הקטנות כגדולות בקלות", + "Capitalization doesn't help very much": "אותיות גדולות לא ממש עוזרות", + "Avoid dates and years that are associated with you": "המנעו מתאריכים ושנים אשר משוייכים אליכם", + "Avoid years that are associated with you": "המנעו משנים אשר משוייכים אליכם", + "Avoid recent years": "המנעו משימוש בשנים קודמות", + "Avoid sequences": "המנעו מסדרות", + "Avoid repeated words and characters": "המנעו ממילים ואותיות נשנות", + "Use a longer keyboard pattern with more turns": "השתמשו בדפוס ארוך שמכיל אותיות מכל שורה במקלדת", + "No need for symbols, digits, or uppercase letters": "אין צורך בסמלים, מספרים או אותיות גדולות", + "Use a few words, avoid common phrases": "השתמשו במילים ספורות, המנעו מביטויים מוכרים" } From ac88121cc1ad8f81659e2ef55a00e452337afa2a Mon Sep 17 00:00:00 2001 From: notramo Date: Wed, 30 Dec 2020 16:50:49 +0000 Subject: [PATCH 098/231] Translated using Weblate (Hungarian) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 3f24fb98dc..5e129b80a6 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1382,7 +1382,7 @@ "Changes your avatar in all rooms": "Megváltoztatja a profilképed 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.": "A Matrix szervered úgy tűnik nem támogatja ezt a szolgáltatást.", "Resend edit": "Szerkesztés újraküldése", "Resend %(unsentCount)s reaction(s)": "%(unsentCount)s reakció újraküldése", "Resend removal": "Törlés újraküldése", @@ -1948,7 +1948,7 @@ "%(name)s declined": "%(name)s elutasította", "Cancelling…": "Megszakítás…", "Your homeserver does not support cross-signing.": "A matrix szervered nem támogatja az eszközök közti hitelesítést.", - "Homeserver feature support:": "Matrix szerver támogatott szolgáltatások:", + "Homeserver feature support:": "Matrix szerver támogatja-e a szolgáltatást:", "exists": "létezik", "Accepting…": "Elfogadás…", "Accepting …": "Elfogadás …", From 65312141fe63f7a0305b945b6512d21b6084bd55 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Tue, 29 Dec 2020 17:51:10 +0000 Subject: [PATCH 099/231] Translated using Weblate (Hungarian) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 5e129b80a6..17f139a4f1 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2974,5 +2974,6 @@ "sends snowfall": "hóesés küldése", "Sends the given message with snowfall": "Az üzenet elküldése hóeséssel", "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" + "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." } From 6758b21eacac851c5016fbe3fe54c995bfe59f41 Mon Sep 17 00:00:00 2001 From: Marcelo Filho Date: Thu, 31 Dec 2020 14:37:38 +0000 Subject: [PATCH 100/231] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pt_BR/ --- src/i18n/strings/pt_BR.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 8ae85a5013..486652a449 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -2911,5 +2911,6 @@ "sends fireworks": "envia fogos de artifício", "Sends the given message with fireworks": "Envia a mensagem com fogos de artifício", "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Adiciona ┬──┬ ノ( ゜-゜ノ) a uma mensagem de texto simples", - "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Adiciona (╯°□°)╯︵ ┻━┻ a uma mensagem de texto" + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Adiciona (╯°□°)╯︵ ┻━┻ a uma mensagem de texto", + "You have no visible notifications.": "Não há notificações." } From 6d8fd481a91c002393bd96f58de2f8e4a8685323 Mon Sep 17 00:00:00 2001 From: sr093906 Date: Thu, 31 Dec 2020 10:22:17 +0000 Subject: [PATCH 101/231] Translated using Weblate (Chinese (Simplified)) Currently translated at 81.4% (2215 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hans/ --- src/i18n/strings/zh_Hans.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 672b1befd1..167fea70e1 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -1960,7 +1960,7 @@ "Close dialog": "关闭对话框", "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "请告诉我们哪里出错了,或最好创建一个 GitHub issue 来描述该问题。", "Reminder: Your browser is unsupported, so your experience may be unpredictable.": "提醒:您的浏览器不被支持,所以您的体验可能不可预料。", - "GitHub issue": "GitHub issue", + "GitHub issue": "GitHub 上的 issue", "Notes": "提示", "If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.": "如果有额外的上下文可以帮助我们分析问题,比如您当时在做什么、房间 ID、用户 ID 等等,请将其列于此处。", "Removing…": "正在删除…", From 167913e6165bddd6f4d03661e48abd8041ea110c Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Wed, 30 Dec 2020 01:32:26 +0000 Subject: [PATCH 102/231] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 74d5709646..9a81f4f21c 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2982,5 +2982,6 @@ "%(name)s on hold": "保留 %(name)s", "You held the call Switch": "您已保留通話 切換", "sends snowfall": "傳送雪球", - "Sends the given message with snowfall": "與雪球一同傳送指定訊息" + "Sends the given message with snowfall": "與雪球一同傳送指定訊息", + "You have no visible notifications.": "您沒有可見的通知。" } From 4fa8496b95a53998c5dabaa46cd016c6a3b62cc2 Mon Sep 17 00:00:00 2001 From: random Date: Wed, 30 Dec 2020 09:47:09 +0000 Subject: [PATCH 103/231] Translated using Weblate (Italian) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 0ca278aba3..4d806617fd 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2979,5 +2979,6 @@ "sends fireworks": "invia fuochi d'artificio", "Sends the given message with fireworks": "Invia il messaggio con fuochi d'artificio", "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Antepone ┬──┬ ノ( ゜-゜ノ) ad un messaggio di testo", - "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Antepone (╯°□°)╯︵ ┻━┻ ad un messaggio di testo" + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Antepone (╯°□°)╯︵ ┻━┻ ad un messaggio di testo", + "You have no visible notifications.": "Non hai notifiche visibili." } From abc389330faada349891c37b26b8dac7f43466f8 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Tue, 29 Dec 2020 16:04:08 +0000 Subject: [PATCH 104/231] Translated using Weblate (Czech) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index a461ee9d2e..09526b304f 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2893,5 +2893,6 @@ "%(name)s on hold": "%(name)s podržen", "You held the call Switch": "Podrželi jste hovor Přepnout", "sends snowfall": "pošle sněžení", - "Sends the given message with snowfall": "Pošle zprávu se sněžením" + "Sends the given message with snowfall": "Pošle zprávu se sněžením", + "You have no visible notifications.": "Nejsou dostupná žádná oznámení." } From e73aa39c37e8b095f818f2661dbffd0340dfa594 Mon Sep 17 00:00:00 2001 From: XoseM Date: Wed, 30 Dec 2020 06:42:06 +0000 Subject: [PATCH 105/231] Translated using Weblate (Galician) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index ae1c35ab8a..c8d828894a 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2979,5 +2979,6 @@ "%(name)s on hold": "%(name)s agardando", "You held the call Switch": "Pausaches a chamada Cambiar", "sends snowfall": "envía neve", - "Sends the given message with snowfall": "Engade neve caendo á mensaxe" + "Sends the given message with snowfall": "Engade neve caendo á mensaxe", + "You have no visible notifications.": "Non tes notificacións visibles." } From fe1b474359b3cc1cabcfec912f798a43c06687b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 29 Dec 2020 15:40:09 +0000 Subject: [PATCH 106/231] Translated using Weblate (Estonian) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 7a2f430935..1cd1d5dc63 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2980,5 +2980,6 @@ "You held the call Switch": "Sa panid kõne ootele Lülita tagasi", "%(name)s on hold": "%(name)s on ootel", "sends snowfall": "saadab lumesaju", - "Sends the given message with snowfall": "Saadab antud sõnumi koos lumesajuga" + "Sends the given message with snowfall": "Saadab antud sõnumi koos lumesajuga", + "You have no visible notifications.": "Sul pole nähtavaid teavitusi." } From 828d5d221eca5a1050a219611542bb41f8b208b8 Mon Sep 17 00:00:00 2001 From: Rachida S Date: Thu, 31 Dec 2020 07:14:37 +0000 Subject: [PATCH 107/231] Translated using Weblate (Kabyle) Currently translated at 92.5% (2516 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index f4f893bb95..d713e13efd 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -790,7 +790,7 @@ "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s yekkes tansa-nni tayeḍ %(addresses)s i texxamt-a.", "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s ibeddel tansa-nni tayeḍ n texxamt-a.", "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s ibeddel tansa tagejdant d tansa-nni tayeḍ i texxamt-a.", - "Sends a message as html, without interpreting it as markdown": "Yuzen izen d html war ma isegza-t s tukksa n tecreḍt", + "Sends a message as html, without interpreting it as markdown": "Yuzen izen d html war ma isegza-t belli d tukksa n tecreḍt", "Deops user with given id": "Aseqdac Deops s usulay i d-yettunefken", "Sends the given message coloured as a rainbow": "Yuzen iznan i d-yettunefken yeɣman s yiniten am teslit n Unẓar", "Sends the given emote coloured as a rainbow": "Yuzen tanfalit i d-yettunefken yeɣman s yiniten am teslit n Unẓar", From c3348ba0267ef83a776a5d8649c8d14f250aa409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D7=90=D7=91=D7=99=20=D7=98=D7=99=D7=99=D7=91?= Date: Sat, 2 Jan 2021 20:39:50 +0000 Subject: [PATCH 108/231] Translated using Weblate (Hebrew) Currently translated at 76.1% (2070 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/he/ --- src/i18n/strings/he.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index d030313856..6bd366d21e 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -1199,5 +1199,8 @@ "Avoid repeated words and characters": "המנעו ממילים ואותיות נשנות", "Use a longer keyboard pattern with more turns": "השתמשו בדפוס ארוך שמכיל אותיות מכל שורה במקלדת", "No need for symbols, digits, or uppercase letters": "אין צורך בסמלים, מספרים או אותיות גדולות", - "Use a few words, avoid common phrases": "השתמשו במילים ספורות, המנעו מביטויים מוכרים" + "Use a few words, avoid common phrases": "השתמשו במילים ספורות, המנעו מביטויים מוכרים", + "Verification Requests": "בקשות אימות", + "View Servers in Room": "צפה בשרתים בחדר", + "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "אנא שכח את כל ההודעות ששלחתי כאשר חשבוני מושבת ( אזהרה: זה יגרום למשתמשים עתידיים לראות תצוגה חלקית של שיחות)" } From 6172bcc3465405ebe2cb35338b913e0a4a0624c6 Mon Sep 17 00:00:00 2001 From: Flat Earth Israel Association Date: Sat, 2 Jan 2021 20:27:20 +0000 Subject: [PATCH 109/231] Translated using Weblate (Hebrew) Currently translated at 76.1% (2070 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/he/ --- src/i18n/strings/he.json | 891 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 890 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index 6bd366d21e..066bf9c438 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -1202,5 +1202,894 @@ "Use a few words, avoid common phrases": "השתמשו במילים ספורות, המנעו מביטויים מוכרים", "Verification Requests": "בקשות אימות", "View Servers in Room": "צפה בשרתים בחדר", - "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "אנא שכח את כל ההודעות ששלחתי כאשר חשבוני מושבת ( אזהרה: זה יגרום למשתמשים עתידיים לראות תצוגה חלקית של שיחות)" + "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "אנא שכח את כל ההודעות ששלחתי כאשר חשבוני מושבת ( אזהרה: זה יגרום למשתמשים עתידיים לראות תצוגה חלקית של שיחות)", + "Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.": "נראות ההודעות במטריקס דומה לדוא\"ל. המשמעות של שכחת ההודעות שלך היא שהודעות ששלחת לא ישותפו עם משתמשים חדשים או לא רשומים, אך למשתמשים רשומים שכבר יש להם גישה להודעות אלה עדיין תהיה גישה להעתק שלהם.", + "Deactivating your account does not by default cause us to forget messages you have sent. If you would like us to forget your messages, please tick the box below.": "השבתת חשבונך אינה ברירת המחדל גורמת לנו לשכוח הודעות ששלחת. אם תרצה שנשכח את הודעותיך, סמן את התיבה למטה.", + "This will make your account permanently unusable. You will not be able to log in, and no one will be able to re-register the same user ID. This will cause your account to leave all rooms it is participating in, and it will remove your account details from your identity server. This action is irreversible.": "זה יהפוך את חשבונך ללא שימוש לצמיתות. לא תוכל להתחבר, ואף אחד לא יוכל לרשום מחדש את אותו מזהה משתמש. זה יביא לחשבונך לעזוב את כל החדרים בהם הוא משתתף, וזה יסיר את פרטי חשבונך משרת הזהות שלך. פעולה זו היא בלתי הפיכה. ", + "Server did not return valid authentication information.": "השרת לא החזיר מידע אימות תקף.", + "Server did not require any authentication": "השרת לא נדרש לאימות כלשהו", + "There was a problem communicating with the server. Please try again.": "הייתה בעיה בתקשורת עם השרת. בבקשה נסה שוב.", + "To continue, please enter your password:": "להמשך, הזן את הסיסמה שלך:", + "Confirm account deactivation": "אשר את השבתת החשבון", + "Are you sure you want to deactivate your account? This is irreversible.": "האם אתה בטוח שברצונך להשבית את חשבונך? זה בלתי הפיך.", + "Confirm your account deactivation by using Single Sign On to prove your identity.": "אשר את השבתת חשבונך באמצעות כניסה יחידה כדי להוכיח את זהותך.", + "Continue With Encryption Disabled": "המשך כאשר ההצפנה מושבתת", + "Incompatible Database": "מסד נתונים לא תואם", + "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 עם הפעלה זו. כדי להשתמש בגרסה זו שוב עם הצפנה מקצה לקצה, יהיה עליך לצאת ולחזור שוב.", + "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": "כדי להימנע מאיבוד היסטוריית הצ'אט שלך, עליך לייצא את מפתחות החדר שלך לפני שאתה מתנתק. יהיה עליך לחזור לגרסה החדשה יותר של %(brand)s כדי לעשות זאת", + "Sign out": "יציאה", + "Create Room": "צור חדר", + "Block anyone not part of %(serverName)s from ever joining this room.": "חסום ממישהו שאינו חלק מ- %(serverName)s מלהצטרף אי פעם לחדר זה.", + "Make this room public": "הפוך חדר זה לציבורי", + "Topic (optional)": "נושא (לא חובה)", + "Name": "שם", + "Create a room in %(communityName)s": "צור חדר בקהילה %(communityName)s", + "Create a private room": "צור חדר פרטי", + "Create a public room": "צור חדר ציבורי", + "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 enable this if the room will only be used for collaborating with internal teams on your homeserver. This cannot be changed later.": "ייתכן שתאפשר זאת אם החדר ישמש רק לשיתוף פעולה עם צוותים פנימיים בשרת הבית שלך. לא ניתן לשנות זאת מאוחר יותר.", + "Enable end-to-end encryption": "אפשר הצפנה מקצה לקצה", + "Your server requires encryption to be enabled in private rooms.": "השרת שלכם דורש הפעלת הצפנה בחדרים פרטיים.", + "You can’t disable this later. Bridges & most bots won’t work yet.": "אינך יכול להשבית זאת מאוחר יותר. גשרים ורוב הרובוטים עדיין לא יעבדו.", + "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "ניתן למצוא חדרים פרטיים ולהצטרף אליהם בהזמנה בלבד. חדרים ציבוריים יכולים למצוא ולהצטרף לכל אחד בקהילה זו.", + "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "ניתן למצוא חדרים פרטיים ולהצטרף אליהם בהזמנה בלבד. חדרים ציבוריים יכולים למצוא ולהצטרף לכל אחד.", + "Please enter a name for the room": "אנא הזינו שם לחדר", + "example": "דוגמא", + "Community ID": "זהות קהילה", + "Example": "דוגמא", + "Community Name": "שם קהילה", + "Create Community": "צור קהילה", + "Something went wrong whilst creating your community": "משהו השתבש בעת יצירת הקהילה שלך", + "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "מזהי קהילה עשויים להכיל רק תווים a-z, 0-9 או '= _-. /'", + "Community IDs cannot be empty.": "מזהי קהילה לא יכולים להיות ריקים.", + "An image will help people identify your community.": "תמונה תעזור לאנשים לזהות את הקהילה שלך.", + "Add image (optional)": "הוספת תמונה (לא חובה)", + "Create": "צור", + "Enter name": "הזן שם", + "What's the name of your community or team?": "איך קוראים לקהילה או לצוות שלך?", + "You can change this later if needed.": "תוכל לשנות זאת מאוחר יותר במידת הצורך.", + "Use this when referencing your community to others. The community ID cannot be changed.": "השתמש בזה בעת התייחסות לקהילה שלך לאחרים. לא ניתן לשנות את מזהה הקהילה.", + "Community ID: +:%(domain)s": "קוד קהילה: +:%(domain)s", + "There was an error creating your community. The name may be taken or the server is unable to process your request.": "אירעה שגיאה ביצירת הקהילה שלך. השם עשוי להילקח או שהשרת אינו יכול לעבד את בקשתך.", + "Clear all data": "נקה את כל הנתונים", + "Clearing all data from this session is permanent. Encrypted messages will be lost unless their keys have been backed up.": "ניקוי כל הנתונים מהפגישה זו הוא קבוע. הודעות מוצפנות יאבדו אלא אם כן גובו על המפתחות שלהן.", + "Clear all data in this session?": "למחוק את כל הנתונים בפגישה זו?", + "Reason (optional)": "סיבה (לא חובה)", + "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.": "האם אתה בטוח שברצונך להסיר (למחוק) אירוע זה? שים לב שאם תמחק שם של חדר או שינוי נושא, זה עלול לבטל את השינוי.", + "Confirm Removal": "אשר הסרה", + "Removing…": "מסיר…", + "Invite people to join %(communityName)s": "הזמן אנשים להצתרף אל %(communityName)s", + "Send %(count)s invites|one": "שלח %(count)s הזמנות", + "Send %(count)s invites|other": "שלח %(count)s הזמנות", + "Skip": "דלג", + "Show": "הצג", + "Hide": "הסתר", + "People you know on %(brand)s": "אנשים שאתם מכירים ב-%(brand)s", + "Add another email": "הוסף עוד כתובת דוא\"ל", + "Email address": "כתובת דוא\"ל", + "Unable to load commit detail: %(msg)s": "לא ניתן לטעון את פרטי ההתחייבות: %(msg)s", + "If there is additional context that would help in analysing the issue, such as what you were doing at the time, room IDs, user IDs, etc., please include those things here.": "אם ישנו הקשר נוסף שיעזור לניתוח הבעיה, כגון מה שעשיתם באותו זמן, תעודות זהות, מזהי משתמש וכו ', אנא כללו את הדברים כאן.", + "Notes": "הערות", + "GitHub issue": "סוגיית GitHub", + "Download logs": "הורד יומנים", + "Before submitting logs, you must create a GitHub issue to describe your problem.": "לפני שמגישים יומנים, עליכם ליצור בעיה של GitHub כדי לתאר את הבעיה שלכם.", + "Reminder: Your browser is unsupported, so your experience may be unpredictable.": "תזכורת: הדפדפן שלך אינו נתמך, כך שהחוויה שלך עשויה להיות בלתי צפויה.", + "Preparing to download logs": "מתכונן להורדת יומנים", + "Please tell us what went wrong or, better, create a GitHub issue that describes the problem.": "אנא ספר לנו מה השתבש או, יותר טוב, צור בעיה של GitHub המתארת את הבעיה.", + "Close dialog": "סגור דיאלוג", + "Invite anyway": "הזמן בכל מקרה", + "Invite anyway and never warn me again": "הזמן בכל מקרה ולעולם לא הזהיר אותי שוב", + "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "לא הצלחת למצוא פרופילים עבור מזהי המטריצה המפורטים להלן - האם תרצה להזמין אותם בכל זאת?", + "The following users may not exist": "המשתמשים הבאים עשויים שלא להתקיים", + "Use an identity server to invite by email. Manage in Settings.": "השתמש בשרת זהות כדי להזמין בדוא\"ל. לנהל ב הגדרות.", + "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "השתמש בשרת זהות כדי להזמין בדוא\"ל. השתמש בברירת המחדל (%(defaultIdentityServerName)) או נהל ב הגדרות.", + "Try using one of the following valid address types: %(validTypesList)s.": "נסה להשתמש באחד מסוגי הכתובות החוקיים הבאים: %(validTypesList)s.", + "You have entered an invalid address.": "הזנת כתובת לא חוקית.", + "That doesn't look like a valid email address": "זה לא נראה כמו כתובת דוא\"ל תקפה", + "email address": "כתובת דוא\"ל", + "Matrix Room ID": "זהות חדר מטריקס", + "Matrix ID": "זהות מטריקס", + "Matrix rooms": "חדרים במטריקס", + "%(networkName)s rooms": "חדרים ב-%(networkName)s", + "Add a new server...": "הוסף שרת חדש...", + "Server name": "שם השרת", + "Enter the name of a new server you want to explore.": "הזן את שם השרת החדש שתרצה לחקור.", + "Add a new server": "הוסף שרת חדש", + "Matrix": "מטריקס", + "Remove server": "הסר שרת", + "Are you sure you want to remove %(serverName)s": "האם אתה בטוח שברצונך להסיר %(serverName)s", + "Your server": "השרת שלכם", + "All rooms": "כל החדרים", + "Can't find this server or its room list": "לא ניתן למצוא שרת זה או את רשימת החדרים שלו", + "Looks good": "נראה טוב", + "Enter a server name": "הכנס שם שרת", + "Home": "הבית", + "And %(count)s more...|other": "ו%(count)s עוד...", + "Sign in with single sign-on": "היכנס באמצעות כניסה יחידה", + "Continue with %(provider)s": "המשך עם %(provider)s", + "Homeserver": "שרת הבית", + "Join millions for free on the largest public server": "הצטרפו למיליונים בחינם בשרת הציבורי הגדול ביותר", + "You can use the custom server options to sign into other Matrix servers by specifying a different homeserver URL. This allows you to use Element with an existing Matrix account on a different homeserver.": "באפשרותך להשתמש באפשרויות השרת המותאמות אישית כדי להיכנס לשרתי מטריקס אחרים על ידי ציון כתובת URL אחרת של שרת בית. זה מאפשר לך להשתמש ב- Element עם חשבון מטריקס קיים בשרת בית אחר.", + "Server Options": "אפשרויות שרת", + "Room directory": "מדריך חדרים", + "This address is already in use": "כתובת זו נמצאת בשימוש", + "This address is available to use": "כתובת זו זמינה לשימוש", + "Please provide a room address": "אנא ספקו כתובת לחדר", + "Some characters not allowed": "חלק מהתווים אינם מורשים", + "e.g. my-room": "כגון החדר-שלי", + "Room address": "כתובת חדר", + "In reply to ": " בתשובה ל- ", + "Unable to load event that was replied to, it either does not exist or you do not have permission to view it.": "לא ניתן לטעון אירוע שהשיב לו, או שהוא לא קיים או שאין לך הרשאה להציג אותו.", + "QR Code": "קוד QR", + "Custom level": "דרגה מותאמת", + "Power level": "דרגת מנהל", + "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)s לא ערכו שינוי", + "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)s לא ערך שום שינוי %(count)s פעמים", + "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)s לא ערכו שום שינוי", + "%(severalUsers)smade no changes %(count)s times|other": "%(severalUsers)s לא ערכו שום שינוי %(count)s פעמים", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)s שינו את האוואטר שלהם", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)s שינו את האוואטר שלהם %(count)s פעמים", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)s שינו את האוואטר שלהם", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)s שימו את האווטאר שלהם %(count)s פעמים", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)s שינו את שמם", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)s שינו את שמם %(count)s פעמים", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)s שינו את שמם", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)s שינו את שמם %(count)s פעמים", + "was kicked %(count)s times|one": "נבעטו", + "was kicked %(count)s times|other": "נבעטו %(count)s פעמים", + "were kicked %(count)s times|one": "נבעט", + "were kicked %(count)s times|other": "נבעט %(count)s פעמים", + "was unbanned %(count)s times|one": "חסימה בוטלה", + "was unbanned %(count)s times|other": "חסימה בוטלה %(count)s פעמים", + "were unbanned %(count)s times|one": "חסימה בוטלה", + "were unbanned %(count)s times|other": "חסימה בוטלה %(count)s פעמים", + "was banned %(count)s times|one": "נחסם", + "was banned %(count)s times|other": "נחסם %(count)s פעמים", + "were banned %(count)s times|one": "נחסמו", + "were banned %(count)s times|other": "נחסם %(count)s פעמים", + "was invited %(count)s times|one": "הוזמן", + "was invited %(count)s times|other": "הוזמן %(count)s פעמים", + "were invited %(count)s times|one": "הוזמנו", + "were invited %(count)s times|other": "הוזמנו %(count)s פעמים", + "%(oneUser)shad their invitation withdrawn %(count)s times|one": "%(oneUser)s משכו את ההזמנה שלהם", + "%(oneUser)shad their invitation withdrawn %(count)s times|other": "%(oneUser)s משך את ההזמנה שלו %(count)s פעמים", + "%(severalUsers)shad their invitations withdrawn %(count)s times|one": "%(severalUsers)s משכו את ההזמנות שלהם", + "%(severalUsers)shad their invitations withdrawn %(count)s times|other": "%(severalUsers)s משכו את ההזמנות שלהם %(count)s פעמים", + "%(oneUser)srejected their invitation %(count)s times|one": "%(oneUser)s דחו את ההזמנה שלו\\ה", + "%(oneUser)srejected their invitation %(count)s times|other": "%(oneUser)s דחה את ההזמנה %(count)s פעמים", + "%(severalUsers)srejected their invitations %(count)s times|one": "%(severalUsers)s דחו את ההזמנה שלהם", + "%(severalUsers)srejected their invitations %(count)s times|other": "%(severalUsers)s דחו את ההזמנה שלהם%(count)s פעמים", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)s עזב וחזר", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)s עזב וחזר %(count)s פעמים", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)s עזבו וחזרו", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)s עזבו וחזרו %(count)s פעמים", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)s הצתרף ועזב", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)s הצתרף ועזב %(count)s פעמים", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)s הצתרפו ועזבו", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)s הצתרפו ועזבו %(count)s פעמים", + "%(oneUser)sleft %(count)s times|one": "%(oneUser)s עזב\\ה", + "%(oneUser)sleft %(count)s times|other": "%(oneUser)s עזב %(count)s פעמים", + "%(severalUsers)sleft %(count)s times|one": "%(severalUsers)s עזבו", + "%(severalUsers)sleft %(count)s times|other": "%(severalUsers)s עזבו %(count)s פעמים", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)s הצתרפו", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)s הצתרפו %(count)s פעמים", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)s הצתרפו %(count)s פעמים", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)s הצתרף", + "%(nameList)s %(transitionList)s": "%(nameList)s-%(transitionList)s", + "Language Dropdown": "תפריט שפות", + "Information": "מידע", + "Rotate clockwise": "סובב עם כיוון השעון", + "Rotate Right": "סובב ימינה", + "Rotate counter-clockwise": "סובב נגד כיוון השעון", + "Rotate Left": "סובב שמאלה", + "collapse": "כווץ", + "expand": "הרחב", + "Please create a new issue on GitHub so that we can investigate this bug.": "אנא צור בעיה חדשה ב- GitHub כדי שנוכל לחקור את הבאג הזה.", + "No results": "אין תוצאות", + "Join": "הצתרפות", + "This version of %(brand)s does not support searching encrypted messages": "גרסה זו של %(brand)s אינה תומכת בחיפוש הודעות מוצפנות", + "This version of %(brand)s does not support viewing some encrypted files": "גרסה זו של %(brand)s אינה תומכת בצפייה בקבצים מוצפנים מסוימים", + "Use the Desktop app to search encrypted messages": "השתמשו ב אפליקציית שולחן העבודה לחיפוש הודעות מוצפנות", + "Use the Desktop app to see all encrypted files": "השתמשו ב אפליקציית שולחן העבודה כדי לראות את כל הקבצים המוצפנים", + "Popout widget": "יישומון קופץ", + "Message deleted": "הודעה נמחקה", + "reacted with %(shortName)s": " הגיבו עם %(shortName)s", + " reacted with %(content)s": " הגיבו עם %(content)s", + "Reactions": "תגובות", + "Show all": "הצג הכל", + "Error decrypting video": "שגיאה בפענוח וידאו", + "You sent a verification request": "שלחתם בקשה לקוד אימות", + "%(name)s wants to verify": "%(name)s רוצה לאמת", + "Declining …": "מסרב…", + "Accepting …": "מקבל…", + "%(name)s cancelled": "%(name)s ביטל", + "%(name)s declined": "%(name)s סרב", + "You cancelled": "ביטלתם", + "You declined": "דחיתם", + "%(name)s accepted": "%(name)s אישרו", + "You accepted": "אשרתם", + "%(name)s cancelled verifying": "%(name)s ביטל את האימות", + "You cancelled verifying %(name)s": "בטלתם אימות עם %(name)s", + "You verified %(name)s": "אימתת את %(name)s", + "You have ignored this user, so their message is hidden. Show anyways.": "התעלמת ממשתמש זה, ולכן המסר שלו מוסתר. הצג בכל מקרה. ", + "Video conference started by %(senderName)s": "ועידת וידאו התחילה על ידי %(senderName)s", + "Video conference updated by %(senderName)s": "ועידת הווידאו עודכנה על ידי %(senderName)s", + "Video conference ended by %(senderName)s": "ועידת הווידיאו הסתיימה ב- %(senderName)s", + "Join the conference from the room information card on the right": "הצטרפו לכנס מכרטיס המידע על החדר בצד ימין", + "Join the conference at the top of this room": "הצטרף לכנס בחלק העליון של החדר הזה", + "Show image": "הצג תמונה", + "Error decrypting image": "שגיאה בפענוח הודעה", + "Invalid file%(extra)s": "קובץ לא תקין %(extra)s", + "Download %(text)s": "הורד %(text)s", + "Decrypt %(text)s": "פענח %(text)s", + "Error decrypting attachment": "שגיאה בפענוח קבצים מצורפים", + "Attachment": "נספחים", + "Message Actions": "פעולות הודעה", + "React": "הגב", + "Error decrypting audio": "שגיאה בפענוח שמע", + "The encryption used by this room isn't supported.": "ההצפנה בה משתמשים בחדר זה אינה נתמכת.", + "Encryption not enabled": "ההצפנה לא מופעלת", + "Ignored attempt to disable encryption": "התעלם מהניסיון להשבית את ההצפנה", + "Encryption enabled": "הצפנה הופעלה", + "Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their avatar.": "ההודעות בחדר זה מוצפנות מקצה לקצה. כשאנשים מצטרפים, אתה יכול לאמת אותם בפרופיל שלהם, פשוט הקש על הדמות שלהם.", + "Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "ההודעות כאן מוצפנות מקצה לקצה. אמת את %(displayName)s בפרופיל שלהם - הקש על הדמות שלהם.", + "Compare emoji": "השווה סמלים", + "Verification cancelled": "אימות בוטל", + "You cancelled verification.": "בטלתם את האימות.", + "%(displayName)s cancelled verification.": "הצג אימותים מבוטלים %(displayName)s.", + "You cancelled verification on your other session.": "ביטלת את האימות בהפעלה האחרת שלך.", + "Verification timed out.": "תם הזמן הקצוב לאימות.", + "Start verification again from their profile.": "התחל לאמת שוב מהפרופיל שלהם.", + "Start verification again from the notification.": "התחל אימות שוב מההודעה.", + "Got it": "הבנתי", + "Verified": "מאומת", + "You've successfully verified %(displayName)s!": "אמתתם בהצלחה את %(displayName)s!", + "You've successfully verified %(deviceName)s (%(deviceId)s)!": "אימתת בהצלחה את %(deviceName)s (%(deviceId)s)!", + "You've successfully verified your device!": "אימתת בהצלחה את המכשיר שלך!", + "In encrypted rooms, verify all users to ensure it’s secure.": "בחדרים מוצפנים, אמת את כל המשתמשים כדי לוודא שהוא מאובטח.", + "Verify all users in a room to ensure it's secure.": "אמת את כל המשתמשים בחדר כדי לוודא שהוא מאובטח.", + "Almost there! Is %(displayName)s showing the same shield?": "כמעט שם! האם %(displayName)s מציג את אותו מגן?", + "Almost there! Is your other session showing the same shield?": "כמעט שם! האם הפגישה השנייה שלך מראה את אותו מגן?", + "Verify by emoji": "אמת על ידי אמוג'י", + "Verify by comparing unique emoji.": "אמת את זה על ידי השוואת אמוג'י ייחודי.", + "If you can't scan the code above, verify by comparing unique emoji.": "אם אינך יכול לסרוק את הקוד לעיל, ודא על ידי השוואת אמוג'י ייחודי.", + "Ask %(displayName)s to scan your code:": "בקש מ- %(displayName)s לסרוק את הקוד שלכם:", + "Verify by scanning": "אמת על ידי סריקה", + "The session 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.": "ההפעלה שאתה מנסה לאמת אינה תומכת בסריקת קוד QR או אימות אמוג'י, וזה מה שתומך ב- %(brand)s. נסה עם לקוח אחר.", + "Security": "אבטחה", + "This client does not support end-to-end encryption.": "לקוח זה אינו תומך בהצפנה מקצה לקצה.", + "Role": "תפקיד", + "Failed to deactivate user": "השבתת משתמש נכשלה", + "Deactivate user?": "השבת משתמש?", + "Deactivate user": "השבת משתמש", + "Deactivating this user will log them out and prevent them from logging back in. Additionally, they will leave all the rooms they are in. This action cannot be reversed. Are you sure you want to deactivate this user?": "השבתת משתמש זה תנתק אותו וימנע ממנו להתחבר חזרה. בנוסף, הם יעזבו את כל החדרים בהם הם נמצאים. לא ניתן לבטל פעולה זו. האם אתה בטוח שברצונך להשבית משתמש זה?", + "Are you sure?": "האם אתם בטוחים?", + "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "לא תוכל לבטל את השינוי הזה מכיוון שאתה מקדם את המשתמש לאותה רמת ניהול כמוך.", + "Failed to change power level": "שינוי דרגת מנהל נכשל", + "Failed to remove user from community": "הסרת המשתמש מהקהילה נכשלה", + "Failed to withdraw invitation": "ביטול ההזמנה נכשל", + "Remove this user from community?": "הסר משתמש זה מהקהילה?", + "Disinvite this user from community?": "הסר הזמנה למשתמש זה מהקהילה?", + "Remove from community": "הסר מהקהילה", + "Unmute": "בטל השתקה", + "Failed to mute user": "כשלון בהשתקת משתמש", + "Failed to ban user": "כשלון בחסימת משתמש", + "Ban this user?": "חסום משתמש זה?", + "Unban this user?": "בטל חסימה למשתמש זה?", + "Ban": "חסום", + "Remove recent messages": "הסר הודעות אחרונות", + "Remove %(count)s messages|one": "הסר הודעה 1", + "Remove %(count)s messages|other": "הסר %(count)s הודעות", + "For a large amount of messages, this might take some time. Please don't refresh your client in the meantime.": "עבור כמות גדולה של הודעות, זה עלול לארוך זמן מה. אנא אל תרענן את הלקוח שלך בינתיים.", + "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|one": "אתה עומד להסיר הודעה אחת מאת %(user)s. אי אפשר לבטל את זה. האם אתה מקווה להמשיך?", + "You are about to remove %(count)s messages by %(user)s. This cannot be undone. Do you wish to continue?|other": "אתה עומד להסיר %(count)s הודעות מאת %(user)s. אי אפשר לבטל את זה. האם אתה מקווה להמשיך?", + "Remove recent messages by %(user)s": "הסר את ההודעות האחרונות של %(user)s", + "Try scrolling up in the timeline to see if there are any earlier ones.": "נסה לגלול למעלה בציר הזמן כדי לראות אם יש קודמים.", + "No recent messages by %(user)s found": "לא נמצאו הודעות אחרונות של %(user)s", + "Failed to kick": "כשלון לבעוט משתמש החוצה", + "Kick this user?": "בעט את משתמש זה?", + "Disinvite this user?": "הסר הזמנה למשתמש זה?", + "Kick": "בעט", + "Disinvite": "לבטל את הזמנתו", + "Demote": "הורד", + "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.": "לא תוכל לבטל את השינוי הזה מכיוון שאתה מוריד את עצמך בדרגה, אם אתה המשתמש המיועד האחרון בחדר, אי אפשר יהיה להחזיר לו הרשאות.", + "Demote yourself?": "להוריד את עצמך?", + "Direct message": "הודעה ישירה", + "Share Link to User": "שתף קישור למשתמש", + "Invite": "הזמן", + "Mention": "אזכר", + "Jump to read receipt": "קפצו לקבלת קריאה", + "Hide sessions": "הסתר מושבים", + "%(count)s sessions|one": "%(count)s מושבים", + "%(count)s sessions|other": "%(count)s מושבים", + "Hide verified sessions": "הסתר מושבים מאומתים", + "%(count)s verified sessions|one": "1 מושב מאומת", + "%(count)s verified sessions|other": "%(count)s מושבים מאומתים", + "Not trusted": "לא אמין", + "Trusted": "אמין", + "Room settings": "הגדרות חדר", + "Share room": "שתף חדר", + "Show files": "הצג קבצים", + "%(count)s people|one": "%(count)s cbh בני אדם", + "%(count)s people|other": "%(count)s אנשים%(count)s", + "About": "אודות", + "Not encrypted": "לא מוצפן", + "Add widgets, bridges & bots": "הוסף יישומונים, גשרים ובוטים", + "Edit widgets, bridges & bots": "ערוך ישומונים, גשרים ובוטים", + "Widgets": "ישומונים", + "Options": "אפשרויות", + "Unpin a widget to view it in this panel": "הסר נעיצת יישומון על מנת להציגו בפנל זה", + "Unpin": "הסר נעיצה", + "You can only pin up to %(count)s widgets|other": "אתה יכול להצמיד עד%(count)s ווידג'טים בלבד", + "Room Info": "מידע החדר", + "Yours, or the other users’ session": "שלך, או ההפעלה של המשתמשים האחרים", + "Yours, or the other users’ internet connection": "שלך, או חיבור האינטרנט של המשתמשים האחרים", + "The homeserver the user you’re verifying is connected to": "שרת הבית שהמשתמש שאתה מאמת מחובר אליו", + "Your homeserver": "שרת הבית שלכם", + "One of the following may be compromised:": "אחד מהדברים הבאים עלול להוות סיכון:", + "Your messages are not secure": "ההודעות שלך אינן מאובטחות", + "For extra security, verify this user by checking a one-time code on both of your devices.": "ליתר ביטחון, אמת משתמש זה על ידי בדיקת קוד חד פעמי בשני המכשירים שלך.", + "Verify User": "אמת משתמש", + "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "בחדרים מוצפנים ההודעות שלכם מאובטחות ורק לכם ולמקבל יש את המפתחות הייחודיים לפתיחתן.", + "Messages in this room are not end-to-end encrypted.": "הודעות בחדר זה אינן מוצפנות מקצה לקצה.", + "Your messages are secured and only you and the recipient have the unique keys to unlock them.": "ההודעות שלך מאובטחות ורק לך ולמקבל יש את המפתחות הייחודיים לפתיחתן.", + "Messages in this room are end-to-end encrypted.": "ההודעות בחדר זה מוצפנות מקצה לקצה.", + "Start Verification": "התחל אימות", + "Accepting…": "מקבל…", + "Waiting for %(displayName)s to accept…": "ממתין לקבלת %(displayName)s …", + "Waiting for you to accept on your other session…": "מחכה שתסכים בפגישה השנייה שלך …", + "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 להודעה שלו, ניתן להציג תצוגה מקדימה של כתובת אתר כדי לתת מידע נוסף על קישור זה, כמו הכותרת, התיאור והתמונה מהאתר.", + "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 previews are disabled by default for participants in this room.": "תצוגות מקדימות של כתובות אתרים מושבתות כברירת מחדל עבור משתתפים בחדר זה.", + "URL previews are enabled by default for participants in this room.": "תצוגות מקדימות של כתובות אתרים מופעלות כברירת מחדל עבור משתתפים בחדר זה.", + "You have disabled URL previews by default.": "יש לך השבת תצוגות מקדימות של כתובות אתרים כברירת מחדל.", + "You have enabled URL previews by default.": "כברירת מחדל, הפעלת תצוגה מקדימה של כתובות אתרים.", + "Publish this room to the public in %(domain)s's room directory?": "לפרסם את החדר הזה לציבור במדריך החדרים של%(domain)s?", + "Room avatar": "אוואטר של החדר", + "Room Topic": "נושא החדר", + "Room Name": "שם חדר", + "New community ID (e.g. +foo:%(localDomain)s)": "מזהה קהילה חדש (למשל + foo:%(localDomain)s)", + "This room is not showing flair for any communities": "חדר זה אינו מגלה כישרון בקרב קהילות כלשהן", + "Showing flair for these communities:": "מציג כשרון עבור קהילות אלו:", + "'%(groupId)s' is not a valid community ID": "'%(groupId)s' אינו קוד זהות קהילה תקין", + "Invalid community ID": "קוד זהות קהילה שגוי", + "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "אירעה שגיאה בעדכון הכשרון לחדר זה. ייתכן שהשרת לא מאפשר זאת או שהתרחשה שגיאה זמנית.", + "Error updating flair": "שגיאה בעדכון כשרון", + "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "הגדר כתובות לחדר זה כדי שמשתמשים יוכלו למצוא את החדר הזה דרך שרת הבית שלך (%(localDomain)s)", + "Local Addresses": "כתובות מקומיות", + "New published address (e.g. #alias:server)": "כתובת חדשה שפורסמה (למשל #alias:server)", + "No other published addresses yet, add one below": "עדיין אין כתובות שפורסמו, הוסף כתובת למטה", + "Other published addresses:": "כתובות מפורסמות אחרות:", + "Published addresses can be used by anyone on any server to join your room. To publish an address, it needs to be set as a local address first.": "כל אחד מהשרתים יכול להשתמש בכתובות שפורסמו כדי להצטרף לחדר שלך. כדי לפרסם כתובת, תחילה יש להגדיר אותה ככתובת מקומית.", + "Published Addresses": "כתובות מפורסמות", + "Local address": "כתובות מקומיות", + "This room has no local addresses": "לחדר זה אין כתובות מקומיות", + "not specified": "לא מוגדר", + "Main address": "כתובת ראשית", + "Error removing address": "שגיאה בהסרת כתובת", + "There was an error removing that address. It may no longer exist or a temporary error occurred.": "אירעה שגיאה בהסרת כתובת זו. יתכן שהוא כבר לא קיים או שהתרחשה שגיאה זמנית.", + "You don't have permission to delete the address.": "אין לך הרשאה למחוק את הכתובת.", + "There was an error creating that address. It may not be allowed by the server or a temporary failure occurred.": "אירעה שגיאה ביצירת כתובת זו. ייתכן שהשרת אינו מאפשר זאת או שהתרחש כשל זמני.", + "Error creating address": "שגיאה ביצירת כתובת", + "There was an error updating the room's alternative addresses. It may not be allowed by the server or a temporary failure occurred.": "אירעה שגיאה בעדכון הכתובות החלופיות של החדר. ייתכן שהשרת אינו מאפשר זאת או שהתרחש כשל זמני.", + "There was an error updating the room's main address. It may not be allowed by the server or a temporary failure occurred.": "אירעה שגיאה בעדכון הכתובת הראשית של החדר. ייתכן שהשרת אינו מאפשר זאת או שהתרחש כשל זמני.", + "Error updating main address": "שגיאה בעדכון כתובת ראשית", + "Mark all as read": "סמן הכל כנקרא", + "Jump to first unread message.": "קפצו להודעה הראשונה שלא נקראה.", + "Invited by %(sender)s": "הוזמנו על ידי %(sender)s", + "Revoke invite": "שלול הזמנה", + "Admin Tools": "כלי מנהל", + "Could not revoke the invite. The server may be experiencing a temporary problem or you do not have sufficient permissions to revoke the invite.": "לא ניתן היה לבטל את ההזמנה. ייתכן שהשרת נתקל בבעיה זמנית או שאין לך הרשאות מספיקות לבטל את ההזמנה.", + "Failed to revoke invite": "ביטול ההזמנה נכשל", + "Show Stickers": "הצג מדבקות", + "Stickerpack": "חבילת מדבקות", + "Hide Stickers": "הסתר מדבקות", + "Add some now": "הוסף אותם כעת", + "You don't currently have any stickerpacks enabled": "כרגע אין לך חבילות מדבקה מופעלות", + "Failed to connect to integration manager": "ההתחברות למנהל האינטגרציה נכשלה", + "Send as message": "שלח כהודעה", + "Hint: Begin your message with // to start it with a slash.": "רמז: התחל את ההודעה שלך עם // כדי להתחיל אותה עם קו נטוי.", + "You can use /help to list available commands. Did you mean to send this as a message?": "באפשרותך להשתמש ב- /help כדי לרשום פקודות זמינות. האם התכוונת לשלוח זאת כהודעה?", + "Unrecognised command: %(commandText)s": "פקודה לא מזוהה: %(commandText)s", + "Unknown Command": "פקודה לא ידועה", + "Server unavailable, overloaded, or something else went wrong.": "השרת לא זמין, עמוס מדי או שמשהו אחר השתבש.", + "Server error": "שגיאת שרת", + "Only room administrators will see this warning": "רק מנהלי חדרים יראו את האזהרה הזו", + "This room is running room version , which this homeserver has marked as unstable.": "חדר זה מריץ את גרסת החדר , ששרת הבית הזה סימן כ- לא יציב .", + "This room has already been upgraded.": "החדר הזה כבר שודרג.", + "Upgrading this room will shut down the current instance of the room and create an upgraded room with the same name.": "שדרוג חדר זה יסגור את המופע הנוכחי של החדר וייצור חדר משודרג עם אותו שם.", + "Unread messages.": "הודעות שלא נקראו.", + "%(count)s unread messages.|one": "1 הודעה שלא נקראה.", + "%(count)s unread messages.|other": "%(count)s הודעות שלא נקראו.", + "%(count)s unread messages including mentions.|one": "1 אזכור שלא נקרא.", + "%(count)s unread messages including mentions.|other": "%(count)s הודעות שלא נקראו כולל אזכורים.", + "Room options": "אפשרויות חדר", + "Loading room preview": "טוען תצוגת חדר", + "Sign Up": "הרשמה", + "Join the conversation with an account": "הצטרף לשיחה עם חשבון", + "Rejecting invite …": "דוחה הזמנה…", + "Loading …": "טוען…", + "Joining room …": "מצתרף אל חדר…", + "This room": "חדר זה", + "%(count)s results|one": "תוצאות %(count)s", + "%(count)s results|other": "תוצאות %(count)s", + "Use the + to make a new room or explore existing ones below": "השתמשו ב- + כדי ליצור חדר חדש או לחקור את החדרים הקיימים למטה", + "Explore all public rooms": "צפה בכל החדרים הציבוריים", + "Start a new chat": "התחל צאט חדש", + "Can't see what you’re looking for?": "אינכם מוצאים את מה שאתם מחפשים?", + "Custom Tag": "תגיות מותאמות", + "Historical": "היסטוריה", + "System Alerts": "התרעות מערכת", + "Low priority": "עדיפות נמוכה", + "Explore public rooms": "שוטט בחדרים ציבוריים", + "Explore community rooms": "שוטט בחדרי קהילות", + "Create new room": "צור חדר חדש", + "Add room": "הוסף חדר", + "Start chat": "התחל שיחה", + "People": "אנשים", + "Favourites": "מועדפים", + "Invites": "הזמנות", + "Show Widgets": "הצג ישומונים", + "Hide Widgets": "הסתר ישומונים", + "Forget room": "שכח חדר", + "Join Room": "הצתרף אל חדר", + "(~%(count)s results)|one": "(תוצאת %(count)s)", + "(~%(count)s results)|other": "(תוצאת %(count)s)", + "No recently visited rooms": "אין חדרים שבקרתם בהם לאחרונה", + "Room %(name)s": "חדר %(name)s", + "Replying": "משיבים", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "נראה על ידי %(displayName)s (%(userName)s) בזמן %(dateTime)s", + "Seen by %(userName)s at %(dateTime)s": "נראה על ידי %(userName)s בזמן %(dateTime)s", + "Unknown": "לא ידוע", + "Offline": "לא מחובר", + "Idle": "לא פעיל", + "Unknown for %(duration)s": "זמן לא ידוע %(duration)s", + "Offline for %(duration)s": "לא מחובר %(duration)s", + "Idle for %(duration)s": "לא פעיל %(duration)s", + "Online for %(duration)s": "מחובר %(duration)s", + "%(duration)sd": "%(duration)s (ימים)", + "%(duration)sh": "%(duration)s (שעות)", + "%(duration)sm": "%(duration)s (דקות)", + "%(duration)ss": "(שניות) %(duration)s", + "Jump to message": "קפוץ להודעה", + "Pinned Messages": "הודעות מוצמדות", + "Loading...": "טוען...", + "No pinned messages.": "אין הודעות מוצמדות.", + "This is the start of .": "זוהי התחלת חדר .", + "Add a photo, so people can easily spot your room.": "הוסף תמונה, כך שאנשים יוכלו לזהות את החדר שלך בקלות.", + "%(displayName)s created this room.": "%(displayName)s יצר את החדר הזה.", + "You created this room.": "אתם יצרתם את החדר הזה.", + "Add a topic to help people know what it is about.": "הוספת נושא לעזור לאנשים להבין במה מדובר.", + "Topic: %(topic)s ": "נושאים: %(topic)s ", + "Topic: %(topic)s (edit)": "נושאים: %(topic)s (עריכה)", + "This is the beginning of your direct message history with .": "זו ההתחלה של היסטוריית ההודעות הישירות שלך עם .", + "Only the two of you are in this conversation, unless either of you invites anyone to join.": "רק שניכם נמצאים בשיחה הזו, אלא אם כן מישהו מכם מזמין מישהו להצטרף.", + "Code block": "בלוק קוד", + "Strikethrough": "קו חוצה", + "Italics": "נטוי", + "Bold": "מודגש", + "You do not have permission to post to this room": "אין לך הרשאה לפרסם בחדר זה", + "This room has been replaced and is no longer active.": "חדר זה הוחלף ואינו פעיל יותר.", + "The conversation continues here.": "השיחה נמשכת כאן.", + "Send a message…": "שליחת הודעה…", + "Send an encrypted message…": "שליחת הודעה מוצפנת…", + "Send a reply…": "שליחת תגובה…", + "Send an encrypted reply…": "שליחת תגובה מוצפנת…", + "Upload file": "העלאת קובץ", + "Emoji picker": "בחירת סמלים", + "Hangup": "ניתוק", + "Video call": "שיחת וידאו", + "Voice call": "שיחת אודיו", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (ניהול %(powerLevelNumber)s)", + "Filter room members": "סינון חברי חדר", + "Invited": "מוזמן", + "and %(count)s others...|one": "ועוד אחד אחר...", + "and %(count)s others...|other": "ו %(count)s אחרים...", + "Close preview": "סגור תצוגה מקדימה", + "Scroll to most recent messages": "גלול להודעות האחרונות", + "Please select the destination room for this message": "אנא בחר בחדר היעד להודעה זו", + "The authenticity of this encrypted message can't be guaranteed on this device.": "לא ניתן להבטיח את האותנטיות של הודעה מוצפנת זו במכשיר זה.", + "Encrypted by a deleted session": "הוצפן על ידי מושב שנמחק", + "Unencrypted": "לא מוצפן", + "Encrypted by an unverified session": "הוצפן על ידי מושב לא מאומת", + "This message cannot be decrypted": "לא ניתן לפענח את ההודעה הזו", + "Re-request encryption keys from your other sessions.": " בקש מחדש מפתחות הצפנה מהפעלות האחרות שלך.", + "Key request sent.": "בקשת המפתח נשלחה.", + "If your other sessions do not have the key for this message you will not be able to decrypt them.": "אם למפגשים האחרים שלך אין מפתח להודעה זו לא תוכל לפענח אותם.", + "Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "בקשות לשיתוף מפתח נשלחות להפעלות האחרות שלך באופן אוטומטי. אם דחית או דחית את בקשת שיתוף המפתח בהפעלות האחרות שלך, לחץ כאן לבקש שוב את המפתחות להפעלה זו.", + "Your key share request has been sent - please check your other sessions for key share requests.": "בקשת שיתוף המפתח שלך נשלחה - אנא בדוק אם קיימות בקשות לשיתוף מפתח בהפעלות האחרות שלך.", + "%(senderName)s uploaded a file": "%(senderName)s העלה תמונה", + "%(senderName)s sent a video": "%(senderName)s שלח\\ה סרטון", + "%(senderName)s sent an image": "%(senderName)s שלח\\ה תמונה", + "This event could not be displayed": "לא ניתן להציג את הארוע הזה", + "Mod": "ממתן", + "Edit message": "ערוך הודעה", + "Everyone in this room is verified": "כולם מאומתים בחדר זה", + "This room is end-to-end encrypted": "חדר זה מוצפן מקצה לקצה", + "Someone is using an unknown session": "מישהו משתמש בהפעלה לא ידועה", + "You have verified this user. This user has verified all of their sessions.": "אימתת משתמש זה. משתמש זה אימת את כל ההפעלות שלו.", + "You have not verified this user.": "לא אימתת משתמש זה.", + "This user has not verified all of their sessions.": "משתמש זה לא אימת את כל ההפעלות שלו.", + "Drop file here to upload": "גרור קובץ לכאן בכדי להעלות", + "Drop File Here": "גרור קובץ לכאן", + "Phone Number": "מספר טלפון", + "A text message has been sent to +%(msisdn)s. Please enter the verification code it contains.": "הודעת טקסט נשלחה אל %(msisdn)s. אנא הזן את קוד האימות שהוא מכיל.", + "Remove %(phone)s?": "הסר מספרי %(phone)s ?", + "Email Address": "כתובת דוא\"ל", + "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "שלחנו לך דוא\"ל לאימות הכתובת שלך. אנא עקוב אחר ההוראות שם ואז לחץ על הכפתור למטה.", + "Add": "הוספה", + "Unable to add email address": "לא ניתן להוסיף את כתובת הדוא\"ל", + "This doesn't appear to be a valid email address": "לא נראה שזו כתובת דוא\"ל חוקית", + "Invalid Email Address": "כתובת דוא\"ל לא תקינה", + "Remove %(email)s?": "הסר כתובות %(email)s ?", + "Unable to remove contact information": "לא ניתן להסיר את פרטי הקשר", + "Discovery options will appear once you have added a phone number above.": "אפשרויות גילוי יופיעו לאחר הוספת מספר טלפון לעיל.", + "Verification code": "קוד אימות", + "Please enter verification code sent via text.": "אנא הזן קוד אימות שנשלח באמצעות טקסט.", + "Incorrect verification code": "קוד אימות שגוי", + "Unable to verify phone number.": "לא ניתן לאמת את מספר הטלפון.", + "Unable to share phone number": "לא ניתן לשתף מספר טלפון", + "Unable to revoke sharing for phone number": "לא ניתן לבטל את השיתוף למספר טלפון", + "Discovery options will appear once you have added an email above.": "אפשרויות גילוי יופיעו לאחר הוספת דוא\"ל לעיל.", + "Share": "לשתף", + "Revoke": "לשלול", + "Complete": "מושלם", + "Verify the link in your inbox": "אמת את הקישור בתיבת הדואר הנכנס שלך", + "Unable to verify email address.": "לא ניתן לאמת את כתובת הדוא\"ל.", + "Click the link in the email you received to verify and then click continue again.": "לחץ על הקישור בהודעת הדוא\"ל שקיבלת כדי לאמת ואז לחץ על המשך שוב.", + "Your email address hasn't been verified yet": "כתובת הדוא\"ל שלך עדיין לא אומתה", + "Unable to share email address": "לא ניתן לשתף את כתובת הדוא\"ל", + "Unable to revoke sharing for email address": "לא ניתן לבטל את השיתוף לכתובת הדוא\"ל", + "Who can access this room?": "למי מותר להכנס לחדר זה?", + "Encrypted": "מוצפן", + "Once enabled, encryption cannot be disabled.": "לאחר הפעלתו, לא ניתן לבטל את ההצפנה.", + "Security & Privacy": "אבטחה ופרטיות", + "Who can read history?": "למי מותר לקרוא הסטוריה?", + "Members only (since they joined)": "חברים בלבד (מאז שהצתרפו)", + "Members only (since they were invited)": "חברים בלבד (מאז שהוזמנו)", + "Members only (since the point in time of selecting this option)": "חברים בלבד (מאז נקודת הזמן לבחירת אפשרות זו)", + "Anyone": "כולם", + "Changes to who can read history will only apply to future messages in this room. The visibility of existing history will be unchanged.": "שינויים במי שיכול לקרוא היסטוריה יחולו רק על הודעות עתידיות בחדר זה. נראות ההיסטוריה הקיימת לא תשתנה.", + "Anyone who knows the room's link, including guests": "כל מי שמכיר את קישור החדר, כולל אורחים", + "Anyone who knows the room's link, apart from guests": "כל מי שמכיר את קישור החדר, מלבד האורחים", + "Only people who have been invited": "רק משתמשים אשר הוזמנו", + "To link to this room, please add an address.": "לקישור לחדר זה, אנא הוסף כתובת.", + "Click here to fix": "לחץ כאן לתקן", + "Guests cannot join this room even if explicitly invited.": "אורחים אינם יכולים להצטרף לחדר זה גם אם הם מוזמנים במפורש.", + "Once enabled, encryption for a room cannot be disabled. Messages sent in an encrypted room cannot be seen by the server, only by the participants of the room. Enabling encryption may prevent many bots and bridges from working correctly. Learn more about encryption.": "לאחר הפעלתו, לא ניתן להשבית את ההצפנה לחדר. הודעות שנשלחות בחדר מוצפן אינן נראות על ידי השרת, רק על ידי משתתפי החדר. הפעלת הצפנה עשויה למנוע בוטים וגשרים רבים לעבוד כראוי. למידע נוסף על הצפנה. ", + "Enable encryption?": "הפעל הצפנה?", + "Select the roles required to change various parts of the room": "בחר את התפקידים הנדרשים לשינוי חלקים שונים של החדר", + "Permissions": "הרשאות", + "Roles & Permissions": "תפקידים והרשאות", + "Send %(eventType)s events": "שלח התרעות %(eventType)s", + "Banned users": "משתמשים חסומים", + "Muted Users": "משתמשים מושתקים", + "Privileged Users": "משתמשים מורשים", + "No users have specific privileges in this room": "אין למשתמשים הרשאות ספציפיות בחדר זה", + "Notify everyone": "התרעה לכולם", + "Remove messages sent by others": "הסרת הודעות שנשלחו על ידי אחרים", + "Ban users": "חסימת משתמשים", + "Kick users": "בעט משתמשים", + "Change settings": "שינוי הגדרות", + "Invite users": "הזמנת משתמשים", + "Send messages": "שלח הודעות", + "Default role": "תפקיד ברירת מחדל", + "An error occurred changing the user's power level. Ensure you have sufficient permissions and try again.": "אירעה שגיאה בשינוי רמת ההספק של המשתמש. ודא שיש לך הרשאות מספיקות ונסה שוב.", + "Error changing power level": "שגיאה בשינוי דרגת הניהול", + "An error occurred changing the room's power level requirements. Ensure you have sufficient permissions and try again.": "אירעה שגיאה בשינוי דרישות רמת הניהול של החדר. ודא שיש לך הרשאות מספיקות ונסה שוב.", + "Error changing power level requirement": "שגיאה בשינוי דרישת דרגת ניהול", + "Banned by %(displayName)s": "נחסם על ידי %(displayName)s", + "Unban": "הסר חסימה", + "Failed to unban": "שגיאה בהסרת חסימה", + "Modify widgets": "שנה ישומונים", + "Enable room encryption": "הפעל הצפנת חדר", + "Upgrade the room": "שדרג את החדר", + "Change topic": "שנה נושא", + "Change permissions": "שנה הרשאות", + "This widget may use cookies.": "יישומון זה עשוי להשתמש בעוגיות.", + "Widget added by": "ישומון נוסף על ידי", + "Widgets do not use message encryption.": "יישומונים אינם משתמשים בהצפנת הודעות.", + "Using this widget may share data with %(widgetDomain)s.": "שימוש ביישומון זה עשוי לשתף נתונים עם %(widgetDomain)s.", + "Using this widget may share data with %(widgetDomain)s & your Integration Manager.": "שימוש ביישומון זה עשוי לשתף נתונים עם %(widgetDomain)s ומנהל האינטגרציה שלך.", + "Widget ID": "קוד זהות הישומון", + "Room ID": "קוד זהות החדר", + "%(brand)s URL": "קישור %(brand)s", + "Your theme": "ערכת הנושא שלכם", + "Your user ID": "קוד זהות המשתמש שלכם", + "Your avatar URL": "כתובת הקישור לאווטאר שלכם", + "Your display name": "שם התצוגה שלכם", + "Any of the following data may be shared:": "ניתן לשתף כל אחד מהנתונים הבאים:", + "Unknown Address": "כתובת לא ידועה", + "Cancel search": "בטל חיפוש", + "Quick Reactions": "תגובות מהירות", + "Categories": "נושאים", + "Flags": "דגלים", + "Symbols": "סמלים", + "Objects": "עצמים", + "Travel & Places": "טיולים ומקומות", + "Activities": "פעילויות", + "Food & Drink": "משקאות ומזון", + "Animals & Nature": "חיות וטבע", + "Smileys & People": "סמיילי ואנשים", + "Frequently Used": "לעיתים קרובות בשימוש", + "You're not currently a member of any communities.": "כרגע אינך חבר בקהילות כלשהן.", + "Display your community flair in rooms configured to show it.": "הצג את הכשרון הקהילתי שלך בחדרים שהוגדרו להציג אותו.", + "Something went wrong when trying to get your communities.": "משהו השתבש כשניסה להשיג את הקהילות שלך.", + "Filter community rooms": "סנן חדרי קהילה", + "Only visible to community members": "גלוי רק לחברי הקהילה", + "Visible to everyone": "גלוי לכולם", + "Visibility in Room List": "נראות ברשימת החדרים", + "The visibility of '%(roomName)s' in %(groupId)s could not be updated.": "לא ניתן היה לעדכן את החשיפה של '%(roomName)s' ב-%(groupId)s.", + "Something went wrong!": "משהו השתבש!", + "Failed to remove '%(roomName)s' from %(groupId)s": "הסרת '%(roomName)s' מ-%(groupId)s נכשלה", + "Failed to remove room from community": "הסרת החדר מהקהילה נכשלה", + "Removing a room from the community will also remove it from the community page.": "הסרת חדר מהקהילה תסיר אותו גם מדף הקהילה.", + "Are you sure you want to remove '%(roomName)s' from %(groupId)s?": "האם אתה בטוח שברצונך להסיר את '%(roomName)s' מ-%(groupId)s?", + "Filter community members": "סנן את חברי הקהילה", + "Failed to load group members": "טעינת חברי הקבוצה נכשלה", + "Can't load this message": "לא ניתן לטעון הודעה זו", + "Submit logs": "הגש יומנים", + "edited": "נערך", + "Edited at %(date)s. Click to view edits.": "נערך ב-%(date)s. לחץ לצפייה בעריכות.", + "Click to view edits": "לחץ לצפות בעריכות", + "Edited at %(date)s": "נערך ב-%(date)s", + "You are about to be taken to a third-party site so you can authenticate your account for use with %(integrationsUrl)s. Do you wish to continue?": "אתה עומד להועבר לאתר של צד שלישי כדי שתוכל לאמת את חשבונך לשימוש עם %(integrationsUrl)s. האם אתה מקווה להמשיך?", + "Add an Integration": "הוסף אינטגרציה", + "Failed to copy": "שגיאה בהעתקה", + "Copied!": "הועתק!", + "This room is a continuation of another conversation.": "החדר הזה הוא המשך לשיחה אחרת.", + "Click here to see older messages.": "לחץ כאן לראות הודעות ישנות.", + "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s שינה את האווטאר של החדר ל- ", + "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s הסיר את האווטאר של החדר.", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s שינה את האווטר עבור חדר %(roomName)s", + "Message deleted on %(date)s": "הודעה נמחקה בתאריך %(date)s", + "Message deleted by %(name)s": "הודעה נמחקה על ידיד%(name)s", + "Change history visibility": "שנה תצוגת הסטוריה", + "Change main address for the room": "שנה את הכתובת הראשית של החדר", + "Change room name": "שנה את שם החדר", + "Change room avatar": "שנה אווטר של החדר", + "Browse": "דפדף", + "Set a new custom sound": "הגדר צליל מותאם אישי", + "Notification sound": "צלילי התרעה", + "Sounds": "צלילים", + "Uploaded sound": "צלילים שהועלו", + "Room Addresses": "כתובות חדרים", + "URL Previews": "תצוגת קישורים", + "Bridges": "גשרים", + "This room isn’t bridging messages to any platforms. Learn more.": "החדר הזה לא מגשר על מסרים לאף פלטפורמה. למידע נוסף. ", + "This room is bridging messages to the following platforms. Learn more.": "חדר זה מגשר בין מסרים לפלטפורמות הבאות. למידע נוסף. ", + "Open Devtools": "פתח כלי מפתח", + "Developer options": "אפשרויות מפתח", + "Room version:": "גרסאת חדש:", + "Room version": "גרסאת חדר", + "Internal room ID:": "תעודת זהות בחדר פנימי:", + "Room information": "מידע החדר", + "View older messages in %(roomName)s.": "צפה בהודעות ישנות ב-%(roomName)s.", + "this room": "חדר זה", + "Upgrade this room to the recommended room version": "שדרג חדר זה לגרסת החדר המומלצת", + "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.": " אזהרה : שדרוג חדר לא יעביר באופן אוטומטי את חברי החדר לגרסה החדשה של החדר. נפרסם קישור לחדר החדש בגרסה הישנה של החדר - חברי החדר יצטרכו ללחוץ על קישור זה כדי להצטרף לחדר החדש.", + "This room is not accessible by remote Matrix servers": "לא ניתן לגשת לחדר זה באמצעות שרתי מטריקס מרוחקים", + "Voice & Video": "שמע ווידאו", + "Camera": "מצלמה", + "Microphone": "מיקרופון", + "Audio Output": "יציאת שמע", + "Default Device": "התקן ברירת מחדל", + "No Webcams detected": "לא נמצאה מצלמת רשת", + "No Microphones detected": "לא נמצא מיקרופון", + "No Audio Outputs detected": "לא התגלו יציאות אודיו", + "Request media permissions": "בקש הרשאות למדיה", + "Missing media permissions, click the button below to request.": "חסרות הרשאות מדיה, לחץ על הלחצן למטה כדי לבקש.", + "You may need to manually permit %(brand)s to access your microphone/webcam": "ייתכן שיהיה עליך לאפשר ידנית ל-%(brand)s גישה למיקרופון / מצלמת האינטרנט שלך", + "No media permissions": "אין הרשאות מדיה", + "A session's public name is visible to people you communicate with": "השם הציבורי של הפגישה גלוי לאנשים שאיתם אתה מתקשר", + "Manage the names of and sign out of your sessions below or verify them in your User Profile.": "נהל את שמות ההפעלות שלך והוצא אותן למטה או אמת אותן בפרופיל המשתמש שלך .", + "Where you’re logged in": "היכן שאתה מחובר", + "Learn more about how we use analytics.": "למידע נוסף על אופן השימוש שלנו בניתוחים.", + "Privacy is important to us, so we don't collect any personal or identifiable data for our analytics.": "פרטיות חשובה לנו, ולכן איננו אוספים נתונים אישיים או ניתנים לזיהוי לניתוח שלנו.", + "%(brand)s collects anonymous analytics to allow us to improve the application.": "%(brand)s אוספת ניתוח אנונימי כדי לאפשר לנו לשפר את היישום.", + "Privacy": "פרטיות", + "Your server admin has disabled end-to-end encryption by default in private rooms & Direct Messages.": "מנהל השרת שלך השבית הצפנה מקצה לקצה כברירת מחדל בחדרים פרטיים ובהודעות ישירות.", + "Cross-signing": "חתימה צולבת", + "Message search": "חיפוש הודעה", + "Secure Backup": "גיבוי מאובטח", + "Reject all %(invitedRooms)s invites": "דחה את כל ההזמנות של %(invitedRooms)s", + "Accept all %(invitedRooms)s invites": "קבל את כל ההזמנות של %(invitedRooms)s", + "Bulk options": "אפשרויות בתפזורת", + "Session key:": "מפתח מושב:", + "Session ID:": "מזהה מושב:", + "Cryptography": "קריפטוגרפיה", + "Import E2E room keys": "ייבא מפתחות לחדר E2E", + "": "<לא נתמך>", + "Unignore": "הסר התעלמות", + "Read Marker off-screen lifetime (ms)": "חיי סמן קריאה מחוץ למסך (ms)", + "Read Marker lifetime (ms)": "חיי סמן קריאה (ms)", + "Autocomplete delay (ms)": "עיכוב השלמה אוטומטית (ms)", + "Timeline": "קו זמן", + "Composer": "כתבן", + "Room list": "רשימת חדרים", + "Preferences": "העדפות", + "Show tray icon and minimize window to it on close": "הצג את סמל המגש וצמצם את החלון אליו בסגירה", + "Always show the window menu bar": "הראה תמיד את שורת תפריט החלונות", + "Start automatically after system login": "התחל באופן אוטומטי לאחר הכניסה", + "Subscribe": "הרשמה", + "Room ID or address of ban list": "זהות החדר או כתובת של רשימת החסומים", + "If this isn't what you want, please use a different tool to ignore users.": "אם זה לא מה שאתה רוצה, השתמש בכלי אחר כדי להתעלם ממשתמשים.", + "Subscribing to a ban list will cause you to join it!": "הרשמה לרשימת איסורים תגרום לך להצטרף אליה!", + "Subscribed lists": "רשימת הרשמות", + "Ignore": "התעלם", + "eg: @bot:* or example.org": "למשל: @bot: * או example.org", + "Server or user ID to ignore": "שרת או משתמש להתעלם ממנו", + "Your personal ban list holds all the users/servers you personally don't want to see messages from. After ignoring your first user/server, a new room will show up in your room list named 'My Ban List' - stay in this room to keep the ban list in effect.": "רשימת האיסורים האישית שלך מכילה את כל המשתמשים / שרתים שאתה אישית לא רוצה לראות מהם הודעות. לאחר שהתעלמת מהמשתמש / השרת הראשונים שלך, חדר חדש יופיע ברשימת החדרים שלך בשם 'רשימת האיסורים שלי' - הישאר בחדר זה כדי לשמור על רשימת האיסורים.", + "Personal ban list": "רשימת חסומים פרטית", + "Ignoring people is done through ban lists which contain rules for who to ban. Subscribing to a ban list means the users/servers blocked by that list will be hidden from you.": "התעלמות מאנשים נעשית באמצעות רשימות איסור המכילות כללים למי לאסור. הרשמה להרשמה לרשימת איסורים פירושה שהמשתמשים / השרתים החסומים על ידי רשימה זו יוסתרו ממך.", + "Add users and servers you want to ignore here. Use asterisks to have %(brand)s match any characters. For example, @bot:* would ignore all users that have the name 'bot' on any server.": "הוסף משתמשים ושרתים שתרצה להתעלם מהם כאן. השתמש בכוכביות כדי שאחוזים %(brand)s יתאימו לכל תו. לדוגמא, @bot: * יתעלם מכל המשתמשים שיש להם את השם 'בוט' בשרת כלשהו.", + "⚠ These settings are meant for advanced users.": "⚠ הגדרות אלה מיועדות למשתמשים מתקדמים.", + "Ignored users": "משתמשים שהתעלמתם מהם", + "You are currently subscribed to:": "אתם רשומים אל:", + "View rules": "צפה בכללים", + "Unsubscribe": "הסרת הרשמה", + "You are not subscribed to any lists": "אימכם רשומים לשום רשימה", + "You are currently ignoring:": "אתם כרגע מתעלמים מ:", + "You have not ignored anyone.": "לא התעלמתם מאף אחד.", + "User rules": "כללי משתמש", + "Server rules": "כללי שרת", + "Ban list rules - %(roomName)s": "כללים לרשימת חסימות - %(roomName)s", + "None": "ללא", + "Please try again or view your console for hints.": "נסה שוב או הצג את המסוף שלך לקבלת רמזים.", + "Error unsubscribing from list": "שגיאה בהסרת הרשמה מרשימה זו", + "Error removing ignored user/server": "שגיאה בהסרת משתמש / שרת שהתעלמו ממנו", + "Please verify the room ID or address and try again.": "אנא אמת את מזהה החדר או את הכתובת ונסה שוב.", + "Error subscribing to list": "שגיאה בהרשמה אל הרשימה", + "Something went wrong. Please try again or view your console for hints.": "משהו השתבש. נסה שוב או הצג את המסוף שלך לקבלת רמזים.", + "Error adding ignored user/server": "שגיאה בהוספת שרת\\משתמש שהתעלמתם ממנו", + "Ignored/Blocked": "התעלם\\חסום", + "Customise your experience with experimental labs features. Learn more.": "התאם אישית את החוויה שלך בעזרת תכונות מעבדתיות ניסיוניות. למידע נוסף .", + "Labs": "מעבדות", + "Clear cache and reload": "נקה מטמון ואתחל", + "click to reveal": "לחץ בשביל לחשוף", + "Access Token:": "אסימון גישה:", + "Identity Server is": "שרת ההזדהות הינו", + "Homeserver is": "שרת הבית הינו", + "olm version:": "גרסת OLM:", + "%(brand)s version:": "גרסאת %(brand)s:", + "Versions": "גרסאות", + "Keyboard Shortcuts": "קיצורי מקלדת", + "FAQ": "שאלות", + "Help & About": "עזרה ואודות", + "To report a Matrix-related security issue, please read the Matrix.org Security Disclosure Policy.": "כדי לדווח על בעיית אבטחה הקשורה למטריקס, אנא קראו את מדיניות גילוי האבטחה של Matrix.org .", + "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "אם הגשת באג באמצעות GitHub, יומני איתור באגים יכולים לעזור לנו לאתר את הבעיה. יומני איתור באגים מכילים נתוני שימוש ביישומים הכוללים את שם המשתמש שלך, המזהים או הכינויים של החדרים או הקבוצות שבהם ביקרת ושמות המשתמשים של משתמשים אחרים. הם אינם מכילים הודעות.", + "Bug reporting": "דיווח על תקלות ובאגים", + "Chat with %(brand)s Bot": "דבר עם הבוט של %(brand)s", + "For help with using %(brand)s, click here or start a chat with our bot using the button below.": "לעזרה בשימוש ב-%(brand)s לחץ על כאן או התחל צ'אט עם הבוט שלנו באמצעות הלחצן למטה.", + "For help with using %(brand)s, click here.": "בשביל לעזור בקידום ושימוש ב- %(brand)s, לחצו כאן.", + "Credits": "בזכות", + "Legal": "חוקי", + "General": "כללי", + "Discovery": "מציאה", + "Deactivate account": "סגור חשבון", + "Deactivate Account": "סגור חשבון", + "Deactivating your account is a permanent action - be careful!": "סגירת החשבון הינה פעולה מוחלטת - היו זהירים!", + "Account management": "ניהול חשבון", + "Agree to the identity server (%(serverName)s) Terms of Service to allow yourself to be discoverable by email address or phone number.": "הסכים לתנאי השירות של שרת הזהות (%(serverName)s) כדי לאפשר לעצמך להיות גלוי על ידי כתובת דוא\"ל או מספר טלפון.", + "Language and region": "שפה ואיזור", + "Account": "חשבון", + "Set a new account password...": "הגדר סיסמא חדשה לחשבון...", + "Phone numbers": "מספרי טלפון", + "Email addresses": "כתובות דוא\"ל", + "Your password was successfully changed. You will not receive push notifications on other sessions until you log back in to them": "הסיסמה שלך שונתה בהצלחה. לא תקבל התראות דחיפה בפגישות אחרות עד שתתחבר אליהם שוב", + "Success": "הצלחה", + "Flair": "כשרון", + "Appearance Settings only affect this %(brand)s session.": "התאמת תצוגה משפיעה רק על התחברות זו %(brand)s.", + "Customise your appearance": "התאם את התצוגה שלך", + "Set the name of a font installed on your system & %(brand)s will attempt to use it.": "הגדר את שם הגופן המותקן במערכת שלך ו- %(brand)s ים ינסו להשתמש בו.", + "Show advanced": "הצג מתקדם", + "Hide advanced": "הסתר מתקדם", + "Modern": "מודרני", + "Compact": "ממוזער", + "Message layout": "תבנית הודעה", + "Theme": "ערכת נושא", + "Add theme": "הוסף ערכת נושא חדשה", + "Custom theme URL": "כתובת ערכת נושא מותאמת אישית", + "Theme added!": "ערכת נושא התווספה בהצלחה!", + "Error downloading theme information.": "שגיאה בהורדת מידע אודות ערכת הנושא.", + "Invalid theme schema.": "סכמת תבנית לא תקינה.", + "Use between %(min)s pt and %(max)s pt": "השתמש בין %(min)s ל %(max)s נקודות", + "Custom font size can only be between %(min)s pt and %(max)s pt": "גודל גופן מותאם אישית יכול להיות רק בין %(min)s ל %(max)s נקודות", + "Size must be a number": "הגדול חייב להיות מספר", + "Hey you. You're the best!": "היי, אתם אלופים!", + "Check for update": "בדוק עדכונים", + "New version available. Update now.": "גרסא חדשה קיימת. שדרגו עכשיו.", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "מנהלי שילוב מקבלים נתוני תצורה ויכולים לשנות ווידג'טים, לשלוח הזמנות לחדר ולהגדיר רמות הספק מטעמכם.", + "Manage integrations": "נהל שילובים", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "השתמש במנהל שילוב לניהול בוטים, ווידג'טים וחבילות מדבקות.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "השתמש במנהל שילוב (%(serverName) s) לניהול בוטים, ווידג'טים וחבילות מדבקות.", + "Change": "שנה", + "Enter a new identity server": "הכנס שרת הזדהות חדש", + "Do not use an identity server": "אל תשתמש בשרת הזדהות", + "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.": "השימוש בשרת זהות הוא אופציונלי. אם תבחר לא להשתמש בשרת זהות, משתמשים אחרים לא יוכלו לגלות ולא תוכל להזמין אחרים בדוא\"ל או בטלפון.", + "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.": "ההתנתקות משרת הזהות שלך פירושה שלא תגלה משתמשים אחרים ולא תוכל להזמין אחרים בדוא\"ל או בטלפון.", + "You are not currently using an identity server. To discover and be discoverable by existing contacts you know, add one below.": "אינך משתמש כרגע בשרת זהות. כדי לגלות ולהיות נגלים על ידי אנשי קשר קיימים שאתה מכיר, הוסף אחד למטה.", + "Identity Server": "שרת הזדהות", + "If you don't want to use to discover and be discoverable by existing contacts you know, enter another identity server below.": "אם אינך רוצה להשתמש ב- כדי לגלות ולהיות נגלה על ידי אנשי קשר קיימים שאתה מכיר, הזן שרת זהות אחר למטה.", + "You are currently using to discover and be discoverable by existing contacts you know. You can change your identity server below.": "אתה משתמש כרגע ב די לגלות ולהיות נגלה על ידי אנשי קשר קיימים שאתה מכיר. תוכל לשנות את שרת הזהות שלך למטה.", + "Identity Server (%(server)s)": "שרת הזדהות (%(server)s)", + "Go back": "חזרה", + "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "אנו ממליצים שתסיר את כתובות הדוא\"ל ומספרי הטלפון שלך משרת הזהות לפני שתתנתק.", + "You are still sharing your personal data on the identity server .": "אתה עדיין משתף את הנתונים האישיים שלך בשרת הזהות .", + "Disconnect anyway": "התנתק בכל מקרה", + "wait and try again later": "המתינו ונסו שוב מאוחר יותר", + "contact the administrators of identity server ": "צרו קשר עם מנהל שרת ההזדהות ", + "check your browser plugins for anything that might block the identity server (such as Privacy Badger)": "בדוק בתוספי הדפדפן שלך כל דבר העלול לחסום את שרת הזהות (כגון תגית פרטיות)", + "You should:": "עליכם:", + "You should remove your personal data from identity server before disconnecting. Unfortunately, identity server is currently offline or cannot be reached.": "עליך להסיר את הנתונים האישיים שלך משרת הזהות לפני ההתנתקות. למרבה הצער, שרת זהות נמצא במצב לא מקוון או שאי אפשר להגיע אליו.", + "Disconnect": "התנתק", + "Disconnect from the identity server ?": "התנק משרת ההזדהות ?", + "Disconnect identity server": "נתק שרת הזדהות", + "The identity server you have chosen does not have any terms of service.": "לשרת הזהות שבחרת אין תנאי שירות.", + "Terms of service not accepted or the identity server is invalid.": "תנאי השרות לא התקבלו או ששרת הזיהוי אינו תקין.", + "Disconnect from the identity server and connect to instead?": "התנתק משרת זיהוי עכשווי והתחבר אל במקום?", + "Change identity server": "שנה כתובת של שרת הזיהוי", + "Checking server": "בודק שרת", + "Could not connect to Identity Server": "לא ניתן להתחבר אל שרת הזיהוי", + "Not a valid Identity Server (status code %(code)s)": "שרת זיהוי לא מאושר(קוד סטטוס %(code)s)", + "Identity Server URL must be HTTPS": "הזיהוי של כתובת השרת חייבת להיות מאובטחת ב- HTTPS", + "not ready": "לא מוכן", + "ready": "מוכן", + "Secret storage:": "אחסון סודי:", + "in account data": "במידע בחשבון", + "Secret storage public key:": "מקום שמירה סודי של המפתח הציבורי:", + "Backup key cached:": "גבה מפתח במטמון:", + "not stored": "לא שמור", + "Backup key stored:": "גבה מפתח שמור:", + "Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key.": "גבה את מפתחות ההצפנה שלך עם נתוני חשבונך במקרה שתאבד גישה למפגשים שלך. המפתחות שלך מאובטחים באמצעות מפתח שחזור ייחודי.", + "unexpected type": "סוג בלתי צפוי", + "well formed": "מעוצב היטב", + "Back up your keys before signing out to avoid losing them.": "גבה את המפתחות שלך לפני היציאה כדי להימנע מלאבד אותם.", + "Leave Room": "עזוב חדר", + "Settings": "הגדרות", + "Favourited": "מועדפים", + "Forget Room": "שכח חדר", + "Notification options": "אפשרויות התרעות", + "Mentions & Keywords": "אזכורים ומילות מפתח", + "Use default": "השתמש בברירת מחדל", + "Show %(count)s more|one": "הצג עוד %(count)s", + "Show %(count)s more|other": "הצג עוד %(count)s", + "Jump to first invite.": "קפצו להזמנה ראשונה.", + "Jump to first unread room.": "קפצו לחדר הראשון שלא נקרא.", + "List options": "רשימת אפשרויות", + "A-Z": "א-ת", + "Activity": "פעילות", + "Sort by": "סדר לפי", + "Show previews of messages": "הצג תצוגה מקדימה של הודעות", + "Show rooms with unread messages first": "הצג תחילה חדרים עם הודעות שלא נקראו", + "Appearance": "מראה", + "%(errcode)s was returned while trying to access the room. If you think you're seeing this message in error, please submit a bug report.": "%(errcode)s הוחזר בזמן שניסה לגשת לחדר. אם אתה חושב שאתה רואה הודעה זו בטעות, אנא הגש דוח באגים .", + "Try again later, or ask a room admin to check if you have access.": "נסה שוב מאוחר יותר, או בקש ממנהל החדר לבדוק אם יש לך גישה.", + "%(roomName)s is not accessible at this time.": "לא ניתן להכנס אל %(roomName)s בזמן הזה.", + "This room doesn't exist. Are you sure you're at the right place?": "החדר הזה לא קיים. האם אתה בטוח שאתה נמצא במקום הנכון?", + "%(roomName)s does not exist.": "%(roomName)s לא קיים.", + "%(roomName)s can't be previewed. Do you want to join it?": "לא ניתן לצפות ב-%(roomName)s. האם תרצו להצתרף?", + "You're previewing %(roomName)s. Want to join it?": "אתם צופים ב- %(roomName)s. האם תרצו להצתרף?", + "Reject & Ignore user": "דחה והתעלם ממשתמש זה", + " invited you": " הזמין אתכם", + "Do you want to join %(roomName)s?": "האם אתם מעוניינים להצתרף אל %(roomName)s?", + "Start chatting": "החלו לדבר", + " wants to chat": " מעוניין לדבר איתכם", + "Do you want to chat with %(user)s?": "האם אתם רוצים לדבר עם %(user)s?", + "Share this email in Settings to receive invites directly in %(brand)s.": "שתף דוא\"ל זה בהגדרות כדי לקבל הזמנות ישירות ב-%(brand)s.", + "Use an identity server in Settings to receive invites directly in %(brand)s.": "השתמש בשרת זהות בהגדרות כדי לקבל הזמנות ישירות ב-%(brand)s.", + "This invite to %(roomName)s was sent to %(email)s": "הזמנה לחדר %(roomName)s נשלחה לכתובת %(email)s", + "Link this email with your account in Settings to receive invites directly in %(brand)s.": "קשר דוא\"ל זה לחשבונך בהגדרות כדי לקבל הזמנות ישירות ב-%(brand)s.", + "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "הזמנה זו ל-%(roomName)s נשלחה ל-%(email)s שאינה משויכת לחשבונך", + "Join the discussion": "הצתרף אל הדיון", + "You can still join it because this is a public room.": "אתה עדיין יכול להצטרף אליו כי זה חדר ציבורי.", + "Try to join anyway": "נסה להצתרף בכל מקרה", + "You can only join it with a working invite.": "אתה יכול להצטרף אליו רק עם הזמנה עובדת.", + "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "שגיאה (%(errcode)s) הוחזרה בעת ניסיון לאמת את ההזמנה שלך. אתה יכול לנסות להעביר מידע זה למנהל חדר.", + "Something went wrong with your invite to %(roomName)s": "משהו השתבש עם ההזמנה שלכם אל חדר %(roomName)s", + "You were banned from %(roomName)s by %(memberName)s": "נחסמתם מ-%(roomName)s על ידי %(memberName)s", + "Re-join": "הצתרפות מחדש", + "Forget this room": "שכח חדר זה", + "Reason: %(reason)s": "סיבה: %(reason)s", + "You were kicked from %(roomName)s by %(memberName)s": "אתם נבעטתם מ-%(roomName)s על ידי %(memberName)s" } From a258a3874b87351b06787945536e9b27b553d501 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 4 Jan 2021 11:51:27 +0000 Subject: [PATCH 110/231] Use objectShallowClone --- src/components/views/rooms/RoomList.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/views/rooms/RoomList.tsx b/src/components/views/rooms/RoomList.tsx index 4a4afbc5ac..2d6396c83f 100644 --- a/src/components/views/rooms/RoomList.tsx +++ b/src/components/views/rooms/RoomList.tsx @@ -223,7 +223,7 @@ export default class RoomList extends React.PureComponent { }; // shallow-copy from the template as we need to make modifications to it - this.tagAesthetics = Object.assign({}, TAG_AESTHETICS); + this.tagAesthetics = objectShallowClone(TAG_AESTHETICS); this.updateDmAddRoomAction(); this.dispatcherRef = defaultDispatcher.register(this.onAction); @@ -242,7 +242,7 @@ export default class RoomList extends React.PureComponent { } private updateDmAddRoomAction() { - const dmTagAesthetics = Object.assign({}, TAG_AESTHETICS[DefaultTagID.DM]); + const dmTagAesthetics = objectShallowClone(TAG_AESTHETICS[DefaultTagID.DM]); if (CallHandler.sharedInstance().getSupportsPstnProtocol()) { dmTagAesthetics.addRoomContextMenu = dmAddRoomContextMenu; } else { From 3fa2b7d55c550805aa468bc212379bd55adef4f7 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 4 Jan 2021 11:54:10 +0000 Subject: [PATCH 111/231] Document payload (or in this case, lack thereof) --- src/dispatcher/actions.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dispatcher/actions.ts b/src/dispatcher/actions.ts index be292774de..ce27f9b289 100644 --- a/src/dispatcher/actions.ts +++ b/src/dispatcher/actions.ts @@ -102,6 +102,7 @@ export enum Action { /** * Fired when CallHandler has checked for PSTN protocol support + * payload: none * XXX: Is an action the right thing for this? */ PstnSupportUpdated = "pstn_support_updated", From 4b43929aa33992ddc9514ed344b7b3f660a19866 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 4 Jan 2021 20:01:43 +0000 Subject: [PATCH 112/231] Add in-call dialpad for DTMF sending Requires https://github.com/matrix-org/matrix-js-sdk/pull/1573 --- res/css/_components.scss | 1 + res/css/views/voip/_CallView.scss | 10 ++- res/css/views/voip/_DialPadContextMenu.scss | 47 +++++++++++++ res/img/voip/dialpad.svg | 17 +++++ src/components/structures/ContextMenu.tsx | 38 +++++++++- .../context_menus/DialpadContextMenu.tsx | 59 ++++++++++++++++ src/components/views/voip/CallView.tsx | 69 ++++++++++++++++--- src/components/views/voip/DialPad.tsx | 19 ++--- src/components/views/voip/DialPadModal.tsx | 3 +- 9 files changed, 242 insertions(+), 21 deletions(-) create mode 100644 res/css/views/voip/_DialPadContextMenu.scss create mode 100644 res/img/voip/dialpad.svg create mode 100644 src/components/views/context_menus/DialpadContextMenu.tsx diff --git a/res/css/_components.scss b/res/css/_components.scss index 9041eef13f..a6e1f81583 100644 --- a/res/css/_components.scss +++ b/res/css/_components.scss @@ -237,5 +237,6 @@ @import "./views/voip/_CallContainer.scss"; @import "./views/voip/_CallView.scss"; @import "./views/voip/_DialPad.scss"; +@import "./views/voip/_DialPadContextMenu.scss"; @import "./views/voip/_DialPadModal.scss"; @import "./views/voip/_VideoFeed.scss"; diff --git a/res/css/views/voip/_CallView.scss b/res/css/views/voip/_CallView.scss index a9b02ff5d8..7eb329594a 100644 --- a/res/css/views/voip/_CallView.scss +++ b/res/css/views/voip/_CallView.scss @@ -310,8 +310,14 @@ limitations under the License. } } -// Makes the alignment correct -.mx_CallView_callControls_nothing { +.mx_CallView_callControls_dialpad { + margin-right: auto; + &::before { + background-image: url('$(res)/img/voip/dialpad.svg'); + } +} + +.mx_CallView_callControls_button_dialpad_hidden { margin-right: auto; cursor: initial; } diff --git a/res/css/views/voip/_DialPadContextMenu.scss b/res/css/views/voip/_DialPadContextMenu.scss new file mode 100644 index 0000000000..520f51cf93 --- /dev/null +++ b/res/css/views/voip/_DialPadContextMenu.scss @@ -0,0 +1,47 @@ +/* +Copyright 2020 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. +*/ + +.mx_DialPadContextMenu_header { + margin-top: 12px; + margin-left: 12px; + margin-right: 12px; +} + +.mx_DialPadContextMenu_title { + color: $muted-fg-color; + font-size: 12px; + font-weight: 600; +} + +.mx_DialPadContextMenu_dialled { + height: 1em; + font-size: 18px; + font-weight: 600; +} + +.mx_DialPadContextMenu_dialPad { + margin: 16px; +} + +.mx_DialPadContextMenu_horizSep { + position: relative; + &::before { + content: ''; + position: absolute; + width: 100%; + border-bottom: 1px solid $input-darker-bg-color; + } +} diff --git a/res/img/voip/dialpad.svg b/res/img/voip/dialpad.svg new file mode 100644 index 0000000000..79c9ba1612 --- /dev/null +++ b/res/img/voip/dialpad.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/components/structures/ContextMenu.tsx b/src/components/structures/ContextMenu.tsx index 190b231b74..aab7701f26 100644 --- a/src/components/structures/ContextMenu.tsx +++ b/src/components/structures/ContextMenu.tsx @@ -397,7 +397,8 @@ export const toRightOf = (elementRect: DOMRect, chevronOffset = 12) => { return {left, top, chevronOffset}; }; -// Placement method for to position context menu right-aligned and flowing to the left of elementRect +// Placement method for to position context menu right-aligned and flowing to the left of elementRect, +// and either above or below: wherever there is more space (maybe this should be aboveOrBelowLeftOf?) export const aboveLeftOf = (elementRect: DOMRect, chevronFace = ChevronFace.None, vPadding = 0) => { const menuOptions: IPosition & { chevronFace: ChevronFace } = { chevronFace }; @@ -416,6 +417,41 @@ export const aboveLeftOf = (elementRect: DOMRect, chevronFace = ChevronFace.None return menuOptions; }; +// Placement method for to position context menu right-aligned and flowing to the left of elementRect +// and always above elementRect +export const alwaysAboveLeftOf = (elementRect: DOMRect, chevronFace = ChevronFace.None, vPadding = 0) => { + const menuOptions: IPosition & { chevronFace: ChevronFace } = { chevronFace }; + + const buttonRight = elementRect.right + window.pageXOffset; + const buttonBottom = elementRect.bottom + window.pageYOffset; + const buttonTop = elementRect.top + window.pageYOffset; + // Align the right edge of the menu to the right edge of the button + menuOptions.right = window.innerWidth - buttonRight; + // Align the menu vertically on whichever side of the button has more space available. + if (buttonBottom < window.innerHeight / 2) { + menuOptions.top = buttonBottom + vPadding; + } else { + menuOptions.bottom = (window.innerHeight - buttonTop) + vPadding; + } + + return menuOptions; +}; + +// Placement method for to position context menu right-aligned and flowing to the right of elementRect +// and always above elementRect +export const alwaysAboveRightOf = (elementRect: DOMRect, chevronFace = ChevronFace.None, vPadding = 0) => { + const menuOptions: IPosition & { chevronFace: ChevronFace } = { chevronFace }; + + const buttonLeft = elementRect.left + window.pageXOffset; + const buttonTop = elementRect.top + window.pageYOffset; + // Align the left edge of the menu to the left edge of the button + menuOptions.left = buttonLeft; + // Align the menu vertically above the menu + menuOptions.bottom = (window.innerHeight - buttonTop) + vPadding; + + return menuOptions; +}; + type ContextMenuTuple = [boolean, RefObject, () => void, () => void, (val: boolean) => void]; export const useContextMenu = (): ContextMenuTuple => { const button = useRef(null); diff --git a/src/components/views/context_menus/DialpadContextMenu.tsx b/src/components/views/context_menus/DialpadContextMenu.tsx new file mode 100644 index 0000000000..e3aed0179b --- /dev/null +++ b/src/components/views/context_menus/DialpadContextMenu.tsx @@ -0,0 +1,59 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import React from 'react'; +import { _t } from '../../../languageHandler'; +import { ContextMenu, IProps as IContextMenuProps } from '../../structures/ContextMenu'; +import { MatrixCall } from 'matrix-js-sdk/src/webrtc/call'; +import Dialpad from '../voip/DialPad'; + +interface IProps extends IContextMenuProps { + call: MatrixCall; +} + +interface IState { + value: string; +} + +export default class DialpadContextMenu extends React.Component { + constructor(props) { + super(props); + + this.state = { + value: '', + } + } + + onDigitPress = (digit) => { + this.props.call.sendDtmfDigit(digit); + this.setState({value: this.state.value + digit}); + } + + render() { + return +
    +
    + {_t("Dial pad")} +
    +
    {this.state.value}
    +
    +
    +
    + +
    + ; + } +} diff --git a/src/components/views/voip/CallView.tsx b/src/components/views/voip/CallView.tsx index 6748728278..6fbc396bee 100644 --- a/src/components/views/voip/CallView.tsx +++ b/src/components/views/voip/CallView.tsx @@ -27,9 +27,10 @@ import { CallEvent } from 'matrix-js-sdk/src/webrtc/call'; import classNames from 'classnames'; import AccessibleButton from '../elements/AccessibleButton'; import {isOnlyCtrlOrCmdKeyEvent, Key} from '../../../Keyboard'; -import {aboveLeftOf, ChevronFace, ContextMenuButton} from '../../structures/ContextMenu'; +import {alwaysAboveLeftOf, alwaysAboveRightOf, ChevronFace, ContextMenuButton} from '../../structures/ContextMenu'; import CallContextMenu from '../context_menus/CallContextMenu'; import { avatarUrlForMember } from '../../../Avatar'; +import DialpadContextMenu from '../context_menus/DialpadContextMenu'; interface IProps { // The call for us to display @@ -60,6 +61,7 @@ interface IState { callState: CallState, controlsVisible: boolean, showMoreMenu: boolean, + showDialpad: boolean, } function getFullScreenElement() { @@ -102,6 +104,7 @@ export default class CallView extends React.Component { private dispatcherRef: string; private contentRef = createRef(); private controlsHideTimer: number = null; + private dialpadButton = createRef(); private contextMenuButton = createRef(); constructor(props: IProps) { @@ -115,6 +118,7 @@ export default class CallView extends React.Component { callState: this.props.call.state, controlsVisible: true, showMoreMenu: false, + showDialpad: false, } this.updateCallListeners(null, this.props.call); @@ -226,7 +230,7 @@ export default class CallView extends React.Component { } private showControls() { - if (this.state.showMoreMenu) return; + if (this.state.showMoreMenu || this.state.showDialpad) return; if (!this.state.controlsVisible) { this.setState({ @@ -239,6 +243,29 @@ export default class CallView extends React.Component { this.controlsHideTimer = window.setTimeout(this.onControlsHideTimer, CONTROLS_HIDE_DELAY); } + private onDialpadClick = () => { + if (!this.state.showDialpad) { + if (this.controlsHideTimer) { + clearTimeout(this.controlsHideTimer); + this.controlsHideTimer = null; + } + + this.setState({ + showDialpad: true, + controlsVisible: true, + }); + } else { + if (this.controlsHideTimer !== null) { + clearTimeout(this.controlsHideTimer); + } + this.controlsHideTimer = window.setTimeout(this.onControlsHideTimer, CONTROLS_HIDE_DELAY); + + this.setState({ + showDialpad: false, + }); + } + } + private onMicMuteClick = () => { const newVal = !this.state.micMuted; @@ -265,6 +292,13 @@ export default class CallView extends React.Component { }); } + private closeDialpad = () => { + this.setState({ + showDialpad: false, + }); + this.controlsHideTimer = window.setTimeout(this.onControlsHideTimer, CONTROLS_HIDE_DELAY); + } + private closeContextMenu = () => { this.setState({ showMoreMenu: false, @@ -323,20 +357,29 @@ export default class CallView extends React.Component { CallHandler.sharedInstance().setActiveCallRoomId(this.props.call.roomId); } - private onSecondaryCallResumeClick = () => { - CallHandler.sharedInstance().setActiveCallRoomId(this.props.secondaryCall.roomId); - } - public render() { const client = MatrixClientPeg.get(); const callRoom = client.getRoom(this.props.call.roomId); const secCallRoom = this.props.secondaryCall ? client.getRoom(this.props.secondaryCall.roomId) : null; + let dialPad; let contextMenu; + if (this.state.showDialpad) { + dialPad = ; + } + if (this.state.showMoreMenu) { contextMenu = { onClick={this.onVidMuteClick} /> : null; - // The 'more' button actions are only relevant in a connected call + // The dial pad & 'more' button actions are only relevant in a connected call // When not connected, we have to put something there to make the flexbox alignment correct + const dialpadButton = this.state.callState === CallState.Connected ? :
    ; + const contextMenuButton = this.state.callState === CallState.Connected ? { // in the near future, the dial pad button will go on the left. For now, it's the nothing button // because something needs to have margin-right: auto to make the alignment correct. const callControls =
    -
    + {dialpadButton} { return
    {header} {contentView} + {dialPad} {contextMenu}
    ; } diff --git a/src/components/views/voip/DialPad.tsx b/src/components/views/voip/DialPad.tsx index 4ab7241f53..da88f49adf 100644 --- a/src/components/views/voip/DialPad.tsx +++ b/src/components/views/voip/DialPad.tsx @@ -54,8 +54,9 @@ class DialPadButton extends React.PureComponent { interface IProps { onDigitPress: (string) => void; - onDeletePress: (string) => void; - onDialPress: (string) => void; + hasDialAndDelete: boolean; + onDeletePress?: (string) => void; + onDialPress?: (string) => void; } export default class Dialpad extends React.PureComponent { @@ -68,12 +69,14 @@ export default class Dialpad extends React.PureComponent { />); } - buttonNodes.push(); - buttonNodes.push(); + if (this.props.hasDialAndDelete) { + buttonNodes.push(); + buttonNodes.push(); + } return
    {buttonNodes} diff --git a/src/components/views/voip/DialPadModal.tsx b/src/components/views/voip/DialPadModal.tsx index 9f7e4140c9..74b39e0721 100644 --- a/src/components/views/voip/DialPadModal.tsx +++ b/src/components/views/voip/DialPadModal.tsx @@ -101,7 +101,8 @@ export default class DialpadModal extends React.PureComponent {
    - From 4f96d5dee5fa91bc0d84a65789cb2227adf17999 Mon Sep 17 00:00:00 2001 From: Aaron Raimist Date: Mon, 4 Jan 2021 19:17:12 -0600 Subject: [PATCH 113/231] Change a bunch of strings from Recovery Key/Phrase to Security Key/Phrase Signed-off-by: Aaron Raimist --- .../dialogs/security/CreateKeyBackupDialog.js | 32 ++++----- .../security/CreateSecretStorageDialog.js | 8 +-- .../security/NewRecoveryMethodDialog.js | 2 +- .../security/RecoveryMethodRemovedDialog.js | 2 +- .../structures/auth/SetupEncryptionBody.js | 4 +- .../views/dialogs/NewSessionReviewDialog.js | 2 +- .../security/AccessSecretStorageDialog.js | 6 +- .../security/RestoreKeyBackupDialog.js | 30 ++++---- .../views/settings/SecureBackupPanel.js | 2 +- src/i18n/strings/en_EN.json | 70 +++++++++---------- .../dialogs/AccessSecretStorageDialog-test.js | 6 +- 11 files changed, 82 insertions(+), 82 deletions(-) diff --git a/src/async-components/views/dialogs/security/CreateKeyBackupDialog.js b/src/async-components/views/dialogs/security/CreateKeyBackupDialog.js index ab39a094db..7b5dbe4d28 100644 --- a/src/async-components/views/dialogs/security/CreateKeyBackupDialog.js +++ b/src/async-components/views/dialogs/security/CreateKeyBackupDialog.js @@ -238,7 +238,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { )}

    {_t( "We'll store an encrypted copy of your keys on our server. " + - "Secure your backup with a recovery passphrase.", + "Secure your backup with a Security Phrase.", )}

    {_t("For maximum security, this should be different from your account password.")}

    @@ -252,10 +252,10 @@ export default class CreateKeyBackupDialog extends React.PureComponent { onValidate={this._onPassPhraseValidate} fieldRef={this._passphraseField} autoFocus={true} - label={_td("Enter a recovery passphrase")} - labelEnterPassword={_td("Enter a recovery passphrase")} - labelStrongPassword={_td("Great! This recovery passphrase looks strong enough.")} - labelAllowedButUnsafe={_td("Great! This recovery passphrase looks strong enough.")} + label={_td("Enter a Security Phrase")} + labelEnterPassword={_td("Enter a Security Phrase")} + labelStrongPassword={_td("Great! This Security Phrase looks strong enough.")} + labelAllowedButUnsafe={_td("Great! This Security Phrase looks strong enough.")} />
    @@ -270,7 +270,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent {
    {_t("Advanced")} - {_t("Set up with a recovery key")} + {_t("Set up with a Security Key")}
    ; @@ -310,7 +310,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); return

    {_t( - "Please enter your recovery passphrase a second time to confirm.", + "Please enter your Security Phrase a second time to confirm.", )}

    @@ -319,7 +319,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { onChange={this._onPassPhraseConfirmChange} value={this.state.passPhraseConfirm} className="mx_CreateKeyBackupDialog_passPhraseInput" - placeholder={_t("Repeat your recovery passphrase...")} + placeholder={_t("Repeat your Security Phrase...")} autoFocus={true} />
    @@ -338,15 +338,15 @@ export default class CreateKeyBackupDialog extends React.PureComponent { _renderPhaseShowKey() { return

    {_t( - "Your recovery key is a safety net - you can use it to restore " + - "access to your encrypted messages if you forget your recovery passphrase.", + "Your Security Key is a safety net - you can use it to restore " + + "access to your encrypted messages if you forget your Security Phrase.", )}

    {_t( "Keep a copy of it somewhere secure, like a password manager or even a safe.", )}

    - {_t("Your recovery key")} + {_t("Your Security Key")}
    @@ -369,12 +369,12 @@ export default class CreateKeyBackupDialog extends React.PureComponent { let introText; if (this.state.copied) { introText = _t( - "Your recovery key has been copied to your clipboard, paste it to:", + "Your Security Key has been copied to your clipboard, paste it to:", {}, {b: s => {s}}, ); } else if (this.state.downloaded) { introText = _t( - "Your recovery key is in your Downloads folder.", + "Your Security Key is in your Downloads folder.", {}, {b: s => {s}}, ); } @@ -433,14 +433,14 @@ export default class CreateKeyBackupDialog extends React.PureComponent { _titleForPhase(phase) { switch (phase) { case PHASE_PASSPHRASE: - return _t('Secure your backup with a recovery passphrase'); + return _t('Secure your backup with a Security Phrase'); case PHASE_PASSPHRASE_CONFIRM: - return _t('Confirm your recovery passphrase'); + return _t('Confirm your Security Phrase'); case PHASE_OPTOUT_CONFIRM: return _t('Warning!'); case PHASE_SHOWKEY: case PHASE_KEEPITSAFE: - return _t('Make a copy of your recovery key'); + return _t('Make a copy of your Security Key'); case PHASE_BACKINGUP: return _t('Starting backup...'); case PHASE_DONE: diff --git a/src/async-components/views/dialogs/security/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/security/CreateSecretStorageDialog.js index b1a14062f4..5c190a0e2f 100644 --- a/src/async-components/views/dialogs/security/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/security/CreateSecretStorageDialog.js @@ -593,10 +593,10 @@ export default class CreateSecretStorageDialog extends React.PureComponent { onValidate={this._onPassPhraseValidate} fieldRef={this._passphraseField} autoFocus={true} - label={_td("Enter a recovery passphrase")} - labelEnterPassword={_td("Enter a recovery passphrase")} - labelStrongPassword={_td("Great! This recovery passphrase looks strong enough.")} - labelAllowedButUnsafe={_td("Great! This recovery passphrase looks strong enough.")} + label={_td("Enter a Security Phrase")} + labelEnterPassword={_td("Enter a Security Phrase")} + labelStrongPassword={_td("Great! This Security Phrase looks strong enough.")} + labelAllowedButUnsafe={_td("Great! This Security Phrase looks strong enough.")} />
    diff --git a/src/async-components/views/dialogs/security/NewRecoveryMethodDialog.js b/src/async-components/views/dialogs/security/NewRecoveryMethodDialog.js index 9f5045635d..8c09cc6d16 100644 --- a/src/async-components/views/dialogs/security/NewRecoveryMethodDialog.js +++ b/src/async-components/views/dialogs/security/NewRecoveryMethodDialog.js @@ -58,7 +58,7 @@ export default class NewRecoveryMethodDialog extends React.PureComponent { ; const newMethodDetected =

    {_t( - "A new recovery passphrase and key for Secure Messages have been detected.", + "A new Security Phrase and key for Secure Messages have been detected.", )}

    ; const hackWarning =

    {_t( diff --git a/src/async-components/views/dialogs/security/RecoveryMethodRemovedDialog.js b/src/async-components/views/dialogs/security/RecoveryMethodRemovedDialog.js index cda353e717..b60e6fd3cb 100644 --- a/src/async-components/views/dialogs/security/RecoveryMethodRemovedDialog.js +++ b/src/async-components/views/dialogs/security/RecoveryMethodRemovedDialog.js @@ -56,7 +56,7 @@ export default class RecoveryMethodRemovedDialog extends React.PureComponent { >

    {_t( - "This session has detected that your recovery passphrase and key " + + "This session has detected that your Security Phrase and key " + "for Secure Messages have been removed.", )}

    {_t( diff --git a/src/components/structures/auth/SetupEncryptionBody.js b/src/components/structures/auth/SetupEncryptionBody.js index 6d090936e5..c3d02073bd 100644 --- a/src/components/structures/auth/SetupEncryptionBody.js +++ b/src/components/structures/auth/SetupEncryptionBody.js @@ -120,9 +120,9 @@ export default class SetupEncryptionBody extends React.Component { const store = SetupEncryptionStore.sharedInstance(); let recoveryKeyPrompt; if (store.keyInfo && keyHasPassphrase(store.keyInfo)) { - recoveryKeyPrompt = _t("Use Recovery Key or Passphrase"); + recoveryKeyPrompt = _t("Use Security Key or Passphrase"); } else if (store.keyInfo) { - recoveryKeyPrompt = _t("Use Recovery Key"); + recoveryKeyPrompt = _t("Use Security Key"); } let useRecoveryKeyButton; diff --git a/src/components/views/dialogs/NewSessionReviewDialog.js b/src/components/views/dialogs/NewSessionReviewDialog.js index 2613dcc6e6..e17501da40 100644 --- a/src/components/views/dialogs/NewSessionReviewDialog.js +++ b/src/components/views/dialogs/NewSessionReviewDialog.js @@ -47,7 +47,7 @@ export default class NewSessionReviewDialog extends React.PureComponent {

  • {_t("The internet connection either session is using")}
  • - {_t("We recommend you change your password and recovery key in Settings immediately")} + {_t("We recommend you change your password and Security Key in Settings immediately")}
    , onFinished: () => this.props.onFinished(false), diff --git a/src/components/views/dialogs/security/AccessSecretStorageDialog.js b/src/components/views/dialogs/security/AccessSecretStorageDialog.js index 21655e7fd4..6d5aea8e50 100644 --- a/src/components/views/dialogs/security/AccessSecretStorageDialog.js +++ b/src/components/views/dialogs/security/AccessSecretStorageDialog.js @@ -199,11 +199,11 @@ export default class AccessSecretStorageDialog extends React.PureComponent { } else if (this.state.recoveryKeyCorrect) { return _t("Looks good!"); } else if (this.state.recoveryKeyValid) { - return _t("Wrong Recovery Key"); + return _t("Wrong Security Key"); } else if (this.state.recoveryKeyValid === null) { return ''; } else { - return _t("Invalid Recovery Key"); + return _t("Invalid Security Key"); } } @@ -231,7 +231,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent { keyStatus =
    {"\uD83D\uDC4E "}{_t( "Unable to access secret storage. " + - "Please verify that you entered the correct recovery passphrase.", + "Please verify that you entered the correct Security Phrase.", )}
    ; } else { diff --git a/src/components/views/dialogs/security/RestoreKeyBackupDialog.js b/src/components/views/dialogs/security/RestoreKeyBackupDialog.js index 2362133460..ca28ca094c 100644 --- a/src/components/views/dialogs/security/RestoreKeyBackupDialog.js +++ b/src/components/views/dialogs/security/RestoreKeyBackupDialog.js @@ -297,19 +297,19 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { } else if (this.state.restoreError) { if (this.state.restoreError.errcode === MatrixClient.RESTORE_BACKUP_ERROR_BAD_KEY) { if (this.state.restoreType === RESTORE_TYPE_RECOVERYKEY) { - title = _t("Recovery key mismatch"); + title = _t("Security Key mismatch"); content =

    {_t( - "Backup could not be decrypted with this recovery key: " + - "please verify that you entered the correct recovery key.", + "Backup could not be decrypted with this Security Key: " + + "please verify that you entered the correct Security Key.", )}

    ; } else { - title = _t("Incorrect recovery passphrase"); + title = _t("Incorrect Security Phrase"); content =

    {_t( - "Backup could not be decrypted with this recovery passphrase: " + - "please verify that you entered the correct recovery passphrase.", + "Backup could not be decrypted with this Security Phrase: " + + "please verify that you entered the correct Security Phrase.", )}

    ; } @@ -342,7 +342,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { } else if (backupHasPassphrase && !this.state.forceRecoveryKey) { const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); - title = _t("Enter recovery passphrase"); + title = _t("Enter Security Phrase"); content =

    {_t( "Warning: you should only set up key backup " + @@ -351,7 +351,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { )}

    {_t( "Access your secure message history and set up secure " + - "messaging by entering your recovery passphrase.", + "messaging by entering your Security Phrase.", )}

    @@ -371,8 +371,8 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { /> {_t( - "If you've forgotten your recovery passphrase you can "+ - "use your recovery key or " + + "If you've forgotten your Security Phrase you can "+ + "use your Security Key or " + "set up new recovery options" , {}, { button1: s => ; } else { - title = _t("Enter recovery key"); + title = _t("Enter Security Key"); const DialogButtons = sdk.getComponent('views.elements.DialogButtons'); const AccessibleButton = sdk.getComponent('elements.AccessibleButton'); @@ -399,11 +399,11 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { keyStatus =
    ; } else if (this.state.recoveryKeyValid) { keyStatus =
    - {"\uD83D\uDC4D "}{_t("This looks like a valid recovery key!")} + {"\uD83D\uDC4D "}{_t("This looks like a valid Security Key!")}
    ; } else { keyStatus =
    - {"\uD83D\uDC4E "}{_t("Not a valid recovery key")} + {"\uD83D\uDC4E "}{_t("Not a valid Security Key")}
    ; } @@ -415,7 +415,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { )}

    {_t( "Access your secure message history and set up secure " + - "messaging by entering your recovery key.", + "messaging by entering your Security Key.", )}

    @@ -434,7 +434,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent { />
    {_t( - "If you've forgotten your recovery key you can "+ + "If you've forgotten your Security Key you can "+ "" , {}, { button: s => {_t( "Back up your encryption keys with your account data in case you " + "lose access to your sessions. Your keys will be secured with a " + - "unique Recovery Key.", + "unique Security Key.", )}

    {statusDescription}
    diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index c0939871e2..4e15cbfc1e 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1087,7 +1087,7 @@ "Back up your keys before signing out to avoid losing them.": "Back up your keys before signing out to avoid losing them.", "well formed": "well formed", "unexpected type": "unexpected type", - "Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key.": "Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key.", + "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.": "Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Security Key.", "Backup key stored:": "Backup key stored:", "not stored": "not stored", "Backup key cached:": "Backup key cached:", @@ -2127,7 +2127,7 @@ "Your password": "Your password", "This session, or the other session": "This session, or the other session", "The internet connection either session is using": "The internet connection either session is using", - "We recommend you change your password and recovery key in Settings immediately": "We recommend you change your password and recovery key in Settings immediately", + "We recommend you change your password and Security Key in Settings immediately": "We recommend you change your password and Security Key in Settings immediately", "New session": "New session", "Use this session to verify your new one, granting it access to encrypted messages:": "Use this session to verify your new one, granting it access to encrypted messages:", "If you didn’t sign in to this session, your account may be compromised.": "If you didn’t sign in to this session, your account may be compromised.", @@ -2235,10 +2235,10 @@ "Deny": "Deny", "Wrong file type": "Wrong file type", "Looks good!": "Looks good!", - "Wrong Recovery Key": "Wrong Recovery Key", - "Invalid Recovery Key": "Invalid Recovery Key", + "Wrong Security Key": "Wrong Security Key", + "Invalid Security Key": "Invalid Security Key", "Security Phrase": "Security Phrase", - "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.", + "Unable to access secret storage. Please verify that you entered the correct Security Phrase.": "Unable to access secret storage. Please verify that you entered the correct Security Phrase.", "Enter your Security Phrase or to continue.": "Enter your Security Phrase or to continue.", "Security Key": "Security Key", "Use your Security Key to continue.": "Use your Security Key to continue.", @@ -2253,25 +2253,25 @@ "Fetching keys from server...": "Fetching keys from server...", "%(completed)s of %(total)s keys restored": "%(completed)s of %(total)s keys restored", "Unable to load backup status": "Unable to load backup status", - "Recovery key mismatch": "Recovery key mismatch", - "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.", - "Incorrect recovery passphrase": "Incorrect recovery passphrase", - "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.", + "Security Key mismatch": "Security Key mismatch", + "Backup could not be decrypted with this Security Key: please verify that you entered the correct Security Key.": "Backup could not be decrypted with this Security Key: please verify that you entered the correct Security Key.", + "Incorrect Security Phrase": "Incorrect Security Phrase", + "Backup could not be decrypted with this Security Phrase: please verify that you entered the correct Security Phrase.": "Backup could not be decrypted with this Security Phrase: please verify that you entered the correct Security Phrase.", "Unable to restore backup": "Unable to restore backup", "No backup found!": "No backup found!", "Keys restored": "Keys restored", "Failed to decrypt %(failedCount)s sessions!": "Failed to decrypt %(failedCount)s sessions!", "Successfully restored %(sessionCount)s keys": "Successfully restored %(sessionCount)s keys", - "Enter recovery passphrase": "Enter recovery passphrase", + "Enter Security Phrase": "Enter Security Phrase", "Warning: you should only set up key backup from a trusted computer.": "Warning: you should only set up key backup from a trusted computer.", - "Access your secure message history and set up secure messaging by entering your recovery passphrase.": "Access your secure message history and set up secure messaging by entering your recovery passphrase.", - "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options": "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options", - "Enter recovery key": "Enter recovery key", - "This looks like a valid recovery key!": "This looks like a valid recovery key!", - "Not a valid recovery key": "Not a valid recovery key", + "Access your secure message history and set up secure messaging by entering your Security Phrase.": "Access your secure message history and set up secure messaging by entering your Security Phrase.", + "If you've forgotten your Security Phrase you can use your Security Key or set up new recovery options": "If you've forgotten your Security Phrase you can use your Security Key or set up new recovery options", + "Enter Security Key": "Enter Security Key", + "This looks like a valid Security Key!": "This looks like a valid Security Key!", + "Not a valid Security Key": "Not a valid Security Key", "Warning: You should only set up key backup from a trusted computer.": "Warning: You should only set up key backup from a trusted computer.", - "Access your secure message history and set up secure messaging by entering your recovery key.": "Access your secure message history and set up secure messaging by entering your recovery key.", - "If you've forgotten your recovery key you can ": "If you've forgotten your recovery key you can ", + "Access your secure message history and set up secure messaging by entering your Security Key.": "Access your secure message history and set up secure messaging by entering your Security Key.", + "If you've forgotten your Security Key you can ": "If you've forgotten your Security Key you can ", "Resume": "Resume", "Hold": "Hold", "Reject invitation": "Reject invitation", @@ -2548,8 +2548,8 @@ "Create account": "Create account", "Host account on": "Host account on", "Decide where your account is hosted": "Decide where your account is hosted", - "Use Recovery Key or Passphrase": "Use Recovery Key or Passphrase", - "Use Recovery Key": "Use Recovery Key", + "Use Security Key or Passphrase": "Use Security Key or Passphrase", + "Use Security Key": "Use Security Key", "Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.", "This requires the latest %(brand)s on your other devices:": "This requires the latest %(brand)s on your other devices:", "%(brand)s Web": "%(brand)s Web", @@ -2584,39 +2584,38 @@ "Room Autocomplete": "Room Autocomplete", "Users": "Users", "User Autocomplete": "User Autocomplete", - "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.", + "We'll store an encrypted copy of your keys on our server. Secure your backup with a Security Phrase.": "We'll store an encrypted copy of your keys on our server. Secure your backup with a Security Phrase.", "For maximum security, this should be different from your account password.": "For maximum security, this should be different from your account password.", - "Enter a recovery passphrase": "Enter a recovery passphrase", - "Great! This recovery passphrase looks strong enough.": "Great! This recovery passphrase looks strong enough.", - "Set up with a recovery key": "Set up with a recovery key", + "Enter a Security Phrase": "Enter a Security Phrase", + "Great! This Security Phrase looks strong enough.": "Great! This Security Phrase looks strong enough.", + "Set up with a Security Key": "Set up with a Security Key", "That matches!": "That matches!", "Use a different passphrase?": "Use a different passphrase?", "That doesn't match.": "That doesn't match.", "Go back to set it again.": "Go back to set it again.", - "Please enter your recovery passphrase a second time to confirm.": "Please enter your recovery passphrase a second time to confirm.", - "Repeat your recovery passphrase...": "Repeat your recovery passphrase...", - "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.", + "Please enter your Security Phrase a second time to confirm.": "Please enter your Security Phrase a second time to confirm.", + "Repeat your Security Phrase...": "Repeat your Security Phrase...", + "Your Security Key is a safety net - you can use it to restore access to your encrypted messages if you forget your Security Phrase.": "Your Security Key is a safety net - you can use it to restore access to your encrypted messages if you forget your Security Phrase.", "Keep a copy of it somewhere secure, like a password manager or even a safe.": "Keep a copy of it somewhere secure, like a password manager or even a safe.", - "Your recovery key": "Your recovery key", + "Your Security Key": "Your Security Key", "Download": "Download", - "Your recovery key has been copied to your clipboard, paste it to:": "Your recovery key has been copied to your clipboard, paste it to:", - "Your recovery key is in your Downloads folder.": "Your recovery key is in your Downloads folder.", + "Your Security Key has been copied to your clipboard, paste it to:": "Your Security Key has been copied to your clipboard, paste it to:", + "Your Security Key is in your Downloads folder.": "Your Security Key is in your Downloads folder.", "Print it and store it somewhere safe": "Print it and store it somewhere safe", "Save it on a USB key or backup drive": "Save it on a USB key or backup drive", "Copy it to your personal cloud storage": "Copy it to your personal cloud storage", "Your keys are being backed up (the first backup could take a few minutes).": "Your keys are being backed up (the first backup could take a few minutes).", "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.": "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.", "Set up Secure Message Recovery": "Set up Secure Message Recovery", - "Secure your backup with a recovery passphrase": "Secure your backup with a recovery passphrase", - "Confirm your recovery passphrase": "Confirm your recovery passphrase", - "Make a copy of your recovery key": "Make a copy of your recovery key", + "Secure your backup with a Security Phrase": "Secure your backup with a Security Phrase", + "Confirm your Security Phrase": "Confirm your Security Phrase", + "Make a copy of your Security Key": "Make a copy of your Security Key", "Starting backup...": "Starting backup...", "Success!": "Success!", "Create key backup": "Create key backup", "Unable to create key backup": "Unable to create key backup", "Generate a Security Key": "Generate a Security Key", "We’ll generate a Security Key for you to store somewhere safe, like a password manager or a safe.": "We’ll generate a Security Key for you to store somewhere safe, like a password manager or a safe.", - "Enter a Security Phrase": "Enter a Security Phrase", "Use a secret phrase only you know, and optionally save a Security Key to use for backup.": "Use a secret phrase only you know, and optionally save a Security Key to use for backup.", "Safeguard against losing access to encrypted messages & data by backing up encryption keys on your server.": "Safeguard against losing access to encrypted messages & data by backing up encryption keys on your server.", "Enter your account password to confirm the upgrade:": "Enter your account password to confirm the upgrade:", @@ -2626,6 +2625,7 @@ "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.", "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.": "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.", "Enter your recovery passphrase a second time to confirm it.": "Enter your recovery passphrase a second time to confirm it.", + "Confirm your recovery passphrase": "Confirm your recovery passphrase", "Store your Security Key somewhere safe, like a password manager or a safe, as it’s used to safeguard your encrypted data.": "Store your Security Key somewhere safe, like a password manager or a safe, as it’s used to safeguard your encrypted data.", "Unable to query secret storage status": "Unable to query secret storage status", "If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "If you cancel now, you may lose encrypted messages & data if you lose access to your logins.", @@ -2650,13 +2650,13 @@ "File to import": "File to import", "Import": "Import", "New Recovery Method": "New Recovery Method", - "A new recovery passphrase and key for Secure Messages have been detected.": "A new recovery passphrase and key for Secure Messages have been detected.", + "A new Security Phrase and key for Secure Messages have been detected.": "A new Security Phrase and key for Secure Messages have been detected.", "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.": "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.", "This session is encrypting history using the new recovery method.": "This session is encrypting history using the new recovery method.", "Go to Settings": "Go to Settings", "Set up Secure Messages": "Set up Secure Messages", "Recovery Method Removed": "Recovery Method Removed", - "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "This session has detected that your recovery passphrase and key for Secure Messages have been removed.", + "This session has detected that your Security Phrase and key for Secure Messages have been removed.": "This session has detected that your Security Phrase and key for Secure Messages have been removed.", "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.": "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.", "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.": "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.", "If disabled, messages from encrypted rooms won't appear in search results.": "If disabled, messages from encrypted rooms won't appear in search results.", diff --git a/test/components/views/dialogs/AccessSecretStorageDialog-test.js b/test/components/views/dialogs/AccessSecretStorageDialog-test.js index 7c4b2996c9..76412a6a82 100644 --- a/test/components/views/dialogs/AccessSecretStorageDialog-test.js +++ b/test/components/views/dialogs/AccessSecretStorageDialog-test.js @@ -58,7 +58,7 @@ describe("AccessSecretStorageDialog", function() { expect(recoveryKeyValid).toBe(true); }); - it("Notifies the user if they input an invalid recovery key", async function(done) { + it("Notifies the user if they input an invalid Security Key", async function(done) { const testInstance = TestRenderer.create( false} @@ -80,7 +80,7 @@ describe("AccessSecretStorageDialog", function() { className: "mx_AccessSecretStorageDialog_recoveryKeyFeedback " + "mx_AccessSecretStorageDialog_recoveryKeyFeedback_invalid", }); - expect(notification.props.children).toEqual("Invalid Recovery Key"); + expect(notification.props.children).toEqual("Invalid Security Key"); done(); }); @@ -105,7 +105,7 @@ describe("AccessSecretStorageDialog", function() { }); expect(notification.props.children).toEqual( ["\uD83D\uDC4E ", "Unable to access secret storage. Please verify that you " + - "entered the correct recovery passphrase."]); + "entered the correct Security Phrase."]); done(); }); }); From 247bd09312e403a190f0e1cec4fe50478f592780 Mon Sep 17 00:00:00 2001 From: SimonBrandner Date: Tue, 5 Jan 2021 13:20:59 +0100 Subject: [PATCH 114/231] Fixed 16071 Signed-off-by: SimonBrandner --- .../views/dialogs/security/AccessSecretStorageDialog.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/security/AccessSecretStorageDialog.js b/src/components/views/dialogs/security/AccessSecretStorageDialog.js index 21655e7fd4..35cfe69bf5 100644 --- a/src/components/views/dialogs/security/AccessSecretStorageDialog.js +++ b/src/components/views/dialogs/security/AccessSecretStorageDialog.js @@ -298,7 +298,7 @@ export default class AccessSecretStorageDialog extends React.PureComponent {
    Date: Sat, 2 Jan 2021 15:11:14 +0000 Subject: [PATCH 115/231] Translated using Weblate (German) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index d8dee58b98..7100cd5005 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2971,5 +2971,10 @@ "You've reached the maximum number of simultaneous calls.": "Du hast die maximale Anzahl gleichzeitiger Anrufe erreicht.", "Too Many Calls": "Zu viele Anrufe", "Call failed because webcam or microphone could not be accessed. Check that:": "Der Anruf ist fehlgeschlagen, weil nicht auf die Webcam oder der das Mikrofon zugegriffen werden konnte. Prüfe nach, ob:", - "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Der Anruf ist fehlgeschlagen, weil nicht auf das Mikrofon zugegriffen werden konnte. Prüfe noch einmal nach, ob das Mikrofon eingesteckt und richtig eingestellt ist." + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Der Anruf ist fehlgeschlagen, weil nicht auf das Mikrofon zugegriffen werden konnte. Prüfe noch einmal nach, ob das Mikrofon eingesteckt und richtig eingestellt ist.", + "You have no visible notifications.": "Du hast keine sichtbaren Benachrichtigungen.", + "%(name)s on hold": "%(name)s wird gehalten", + "You held the call Switch": "Du hältst den Anruf Wechseln", + "sends snowfall": "sendet Schneeflocken", + "Sends the given message with snowfall": "Sendet die gewählte Nachricht mit Schneeflocken" } From 3dea71e7a6eb443d7f987c4370d7671e36c03fbb Mon Sep 17 00:00:00 2001 From: Flat Earth Israel Association Date: Sun, 3 Jan 2021 19:25:01 +0000 Subject: [PATCH 116/231] Translated using Weblate (Hebrew) Currently translated at 89.2% (2427 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/he/ --- src/i18n/strings/he.json | 359 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 358 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index 066bf9c438..a5a65367c3 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -2091,5 +2091,362 @@ "Re-join": "הצתרפות מחדש", "Forget this room": "שכח חדר זה", "Reason: %(reason)s": "סיבה: %(reason)s", - "You were kicked from %(roomName)s by %(memberName)s": "אתם נבעטתם מ-%(roomName)s על ידי %(memberName)s" + "You were kicked from %(roomName)s by %(memberName)s": "אתם נבעטתם מ-%(roomName)s על ידי %(memberName)s", + "Are you sure you want to leave the room '%(roomName)s'?": "האם אתה בטוח שברצונך לעזוב את החדר '%(roomName)s'?", + "This room is not public. You will not be able to rejoin without an invite.": "חדר זה אינו ציבורי. לא תוכל להצטרף שוב ללא הזמנה.", + "You do not have permission to create rooms in this community.": "אין לך הרשאה ליצור חדרים בקהילה זו.", + "Cannot create rooms in this community": "לא ניתן ליצור חדרים בקהילה זו", + "Failed to reject invitation": "דחיית ההזמנה נכשלה", + "Explore rooms": "חקור חדרים", + "Create a Group Chat": "צור צ'אט קבוצתי", + "Explore Public Rooms": "חקור חדרים ציבוריים", + "Send a Direct Message": "שלח הודעה ישירה", + "Liberate your communication": "שחררו את התקשורת שלכם", + "Welcome to %(appName)s": "ברוכים הבאים אל %(appName)s", + "Now, let's help you get started": "עכשיו, בואו נעזור לכם להתחיל", + "Welcome %(name)s": "ברוכים הבאים %(name)s", + "Add a photo so people know it's you.": "הוסף תמונה כדי שאנשים יידעו שאתה זה.", + "Great, that'll help people know it's you": "נהדר, זה יעזור לאנשים לדעת שזה אתה", + "Failed to load %(groupId)s": "טעינת %(groupId)s נכשלה", + "This homeserver does not support communities": "שרת בית זה אינו תומך בקהילות", + "Community %(groupId)s not found": "קהילת %(groupId)s לא נמצאה", + "Description": "תאור", + "Upload avatar": "העלה אוואטר", + "Long Description (HTML)": "תאור ארוך (HTML)", + "Your community hasn't got a Long Description, a HTML page to show to community members.
    Click here to open settings and give it one!": "לקהילה שלך אין תיאור ארוך, דף HTML להצגה בפני חברי הקהילה.
    לחץ כאן כדי לפתוח הגדרות ולתת לו אחת!", + "Everyone": "כולם", + "Who can join this community?": "מי יכול להצתרף לקהילה זו?", + "You are a member of this community": "אתם חברים בקהילה זו", + "You are an administrator of this community": "אתם המנהלים של קהילה זו", + "Leave this community": "עזוב קהילה זו", + "Join this community": "הצתרף לקהילה זו", + "%(inviter)s has invited you to join this community": "%(inviter)s הזמין אותך להצטרף לקהילה זו", + "Featured Users:": "משתמשים מומלצים:", + "Featured Rooms:": "חדרים מומלצים:", + "These rooms are displayed to community members on the community page. Community members can join the rooms by clicking on them.": "חדרים אלה מוצגים בפני חברי הקהילה בדף הקהילה. חברי הקהילה יכולים להצטרף לחדרים על ידי לחיצה עליהם.", + "Changes made to your community name and avatar might not be seen by other users for up to 30 minutes.": "שינויים שבוצעו בקהילתך שם וב- הדמות ייתכן שלא יופיעו על ידי משתמשים אחרים למשך עד 30 דקות.", + "Want more than a community? Get your own server": "רוצה יותר מקהילה? קבל שרת משלך ", + "Community Settings": "הגדרות קהילה", + "Unable to leave community": "לא ניתן לעזוב את הקהילה", + "Leave %(groupName)s?": "עזוב את %(groupName)s?", + "Leave Community": "עזוב קהילה", + "You are an administrator of this community. You will not be able to rejoin without an invite from another administrator.": "אתה מנהל קהילה זו. לא תוכל להצטרף מחדש ללא הזמנה ממנהל אחר.", + "Unable to join community": "לא ניתן להצטרף לקהילה", + "Unable to accept invite": "לא ניתן לקבל הזמנה", + "Failed to update community": "עדכון הקהילה נכשל", + "Failed to upload image": "העלאת התמונה נכשלה", + "The user '%(displayName)s' could not be removed from the summary.": "לא ניתן היה להסיר את המשתמש '%(displayName)s' מהסיכום.", + "Failed to remove a user from the summary of %(groupId)s": "הסרת משתמש מהסיכום של %(groupId)s נכשלה", + "Add a User": "הוסף משתמש", + "Failed to add the following users to the summary of %(groupId)s:": "נכשל הוספת המשתמשים הבאים לסיכום של %(groupId)s:", + "Who would you like to add to this summary?": "את מי תרצה להוסיף לסיכום זה?", + "Add users to the community summary": "הוסף משתמשים לסיכום הקהילה", + "The room '%(roomName)s' could not be removed from the summary.": "לא ניתן היה להסיר את החדר '%(roomName)s' מהסיכום.", + "Failed to remove the room from the summary of %(groupId)s": "הסרת החדר נכשלה מהסיכום של %(groupId)s", + "Add a Room": "הוסף חדר", + "Failed to add the following rooms to the summary of %(groupId)s:": "נכשלה הוספת החדרים הבאים לסיכום של %(groupId)s:", + "Add to summary": "הוסף לסיכום", + "Which rooms would you like to add to this summary?": "אילו חדרים תרצה להוסיף לסיכום זה?", + "Add rooms to the community summary": "הוסף חדרים לסיכום הקהילה", + "

    HTML for your community's page

    \n

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

    \n

    \n You can even add images with Matrix URLs \n

    \n": "

    HTML לדף הקהילה שלך

    \n

    \n השתמש בתיאור הארוך כדי להציג חברים חדשים בקהילה, או הפץ\n כמה קישורים חשובים\n

    \n

    \n אתה יכול אפילו להוסיף תמונות עם כתובות אתרי מטריצה \n

    \n", + "Create community": "צור קהילה", + "Communities": "קהילות", + "Attach files from chat or just drag and drop them anywhere in a room.": "צרף קבצים מצ'ט או פשוט גרור ושחרר אותם לכל מקום בחדר.", + "No files visible in this room": "אין קבצים גלויים בחדר זה", + "You must join the room to see its files": "עליך להצטרף לחדר כדי לראות את הקבצים שלו", + "You must register to use this functionality": "עליך להירשם כדי להשתמש בפונקציונליות זו", + "Couldn't load page": "לא ניתן לטעון את הדף", + "Sign in with SSO": "היכנס באמצעות SSO", + "Use email to optionally be discoverable by existing contacts.": "השתמש באימייל כדי שאפשר יהיה למצוא אותו על ידי אנשי קשר קיימים.", + "Use email or phone to optionally be discoverable by existing contacts.": "השתמש בדוא\"ל או בטלפון בכדי שאפשר יהיה לגלות אותם על ידי אנשי קשר קיימים.", + "Add an email to be able to reset your password.": "הוסף דוא\"ל כדי שתוכל לאפס את הסיסמה שלך.", + "Phone (optional)": "טלפון (לא חובה)", + "Use lowercase letters, numbers, dashes and underscores only": "השתמש באותיות קטנות, מספרים, מקפים וקווים תחתונים בלבד", + "Enter phone number (required on this homeserver)": "הזן מספר טלפון (חובה בשרת בית זה)", + "Other users can invite you to rooms using your contact details": "משתמשים אחרים יכולים להזמין אותך לחדרים באמצעות פרטי יצירת הקשר שלך", + "Enter email address (required on this homeserver)": "הזן כתובת דוא\"ל (חובה בשרת הבית הזה)", + "Use an email address to recover your account": "השתמש בכתובת דוא\"ל לשחזור חשבונך", + "Sign in": "כניסה", + "Sign in with": "כניסה עם", + "Forgot password?": "שכחנו סיסמה?", + "Phone": "טלפון", + "Username": "שם משתמש", + "Email": "דוא\"ל", + "That phone number doesn't look quite right, please check and try again": "מספר הטלפון הזה לא נראה בסדר, אנא בדוק ונסה שוב", + "Enter phone number": "הזן טלפון", + "Enter email address": "הזן כתובת דוא\"ל", + "Enter username": "הזן שם משתמש", + "Keep going...": "המשיכו...", + "Password is allowed, but unsafe": "סיסמא מותרת, אך אינה בטוחה", + "Nice, strong password!": "יפה, סיסמה חזקה!", + "Enter password": "הזן סיסמה", + "Start authentication": "התחל אימות", + "Submit": "הגש", + "Code": "קוד", + "Please enter the code it contains:": "אנא הכנס את הקוד שהוא מכיל:", + "A text message has been sent to %(msisdn)s": "הודעת טקסט נשלחה אל %(msisdn)s", + "Token incorrect": "אסימון שגוי", + "Open the link in the email to continue registration.": "פתח את הקישור בדוא\"ל להמשך ההרשמה.", + "A confirmation email has been sent to %(emailAddress)s": "דוא\"ל אישור נשלח אל %(emailAddress)s", + "Please review and accept the policies of this homeserver:": "אנא עיין וקבל את המדיניות של שרת בית זה:", + "Please review and accept all of the homeserver's policies": "אנא עיין וקבל את כל המדיניות של שרת הבית", + "Missing captcha public key in homeserver configuration. Please report this to your homeserver administrator.": "חסר מפתח ציבורי של captcha בתצורת שרת הבית. אנא דווח על כך למנהל שרת הבית שלך.", + "Password": "סיסמה", + "Confirm your identity by entering your account password below.": "אשר את זהותך על ידי הזנת סיסמת החשבון שלך למטה.", + "Country Dropdown": "נפתח במדינה", + "This homeserver would like to make sure you are not a robot.": "שרת בית זה רוצה לוודא שאתה לא רובוט.", + "User Status": "סטטוס משתמש", + "Away": "מרוחק", + "This room is public": "חדר זה ציבורי", + "Move right": "הזז ימינה", + "Move left": "הזז שמאלה", + "Revoke permissions": "שלילת הרשאות", + "Remove for everyone": "הסר לכולם", + "Delete widget": "מחק ישומון", + "Deleting a widget removes it for all users in this room. Are you sure you want to delete this widget?": "מחיקת יישומון מסירה אותו לכל המשתמשים בחדר זה. האם אתה בטוח שברצונך למחוק את היישומון הזה?", + "Delete Widget": "מחק ישומון", + "Take a picture": "צלם תמונה", + "Set a new status...": "הגדר סטטוס חדש ...", + "Set status": "הגדר סטטוס", + "Update status": "עדכן סטטוס", + "Clear status": "נקה סטטוס", + "Report Content": "דווח על תוכן", + "Collapse Reply Thread": "כווץ התשובה", + "Share Message": "שתף הודעה", + "Share Permalink": "שתף קישור קבוע", + "Resend removal": "שלח את ההסרה מחדש", + "Resend %(unsentCount)s reaction(s)": "שלח שוב תגובות %(unsentCount)s", + "Resend edit": "שלח שוב את העריכה", + "Unable to reject invite": "לא ניתן לדחות את ההזמנה", + "Are you sure you want to reject the invitation?": "האם אתם בטוחים שברצונכם לדחות את ההזמנה?", + "Reject invitation": "דחה הזמנה", + "Hold": "החזק", + "Resume": "תקציר", + "If you've forgotten your recovery key you can ": "אם שכחת את מפתח השחזור שלך, תוכל ", + "Access your secure message history and set up secure messaging by entering your recovery key.": "גש להיסטוריית ההודעות המאובטחות שלך והגדר הודעות מאובטחות על ידי הזנת מפתח השחזור שלך.", + "Warning: You should only set up key backup from a trusted computer.": " אזהרה : עליך להגדיר גיבוי מקשים רק ממחשב מהימן.", + "Not a valid recovery key": "לא מפתח שחזור תקף", + "This looks like a valid recovery key!": "זה נראה כמו מפתח שחזור תקף!", + "Enter recovery key": "הזן מפתח שחזור", + "If you've forgotten your recovery passphrase you can use your recovery key or set up new recovery options": "אם שכחת את ביטוי סיסמת ההתאוששות שלך, תוכל להשתמש במפתח השחזור או להגדיר אפשרויות שחזור חדשות ", + "Access your secure message history and set up secure messaging by entering your recovery passphrase.": "גש להיסטוריית ההודעות המאובטחות שלך והגדר הודעות מאובטחות על ידי הזנת משפט סיסמה לשחזור שלך.", + "Warning: you should only set up key backup from a trusted computer.": " אזהרה : עליך להגדיר גיבוי מקשים רק ממחשב מהימן.", + "Enter recovery passphrase": "הזן ביטוי סיסמה לשחזור", + "Successfully restored %(sessionCount)s keys": "שוחזר בהצלחה %(sessionCount)s מפתחות", + "Failed to decrypt %(failedCount)s sessions!": "הפענוח של %(failedCount)s שניות נכשל!", + "Keys restored": "מפתחות משוחזרים", + "No backup found!": "לא נמצא גיבוי!", + "Unable to restore backup": "לא ניתן לשחזר את הגיבוי", + "Backup could not be decrypted with this recovery passphrase: please verify that you entered the correct recovery passphrase.": "לא ניתן היה לפענח גיבוי עם ביטוי סיסמה לשחזור זה: ודא שהזנת את משפט סיסמת השחזור הנכון.", + "Incorrect recovery passphrase": "משפט סיסמה שגוי לשחזור", + "Backup could not be decrypted with this recovery key: please verify that you entered the correct recovery key.": "לא ניתן היה לפענח גיבוי באמצעות מפתח שחזור זה: ודא שהזנת את מפתח השחזור הנכון.", + "Recovery key mismatch": "אי התאמה בין מפתח השחזור", + "Unable to load backup status": "לא ניתן לטעון את מצב הגיבוי", + "%(completed)s of %(total)s keys restored": "%(completed)s שניות מתוך %(total)s מפתחות שוחזרו", + "Fetching keys from server...": "מאחזר מפתחות מהשרת ...", + "Restoring keys from backup": "שחזור מפתחות מגיבוי", + "Retry": "נסה שוב", + "Unable to set up keys": "לא ניתן להגדיר מקשים", + "Click the button below to confirm setting up encryption.": "לחץ על הלחצן למטה כדי לאשר את הגדרת ההצפנה.", + "Confirm encryption setup": "אשר את הגדרת ההצפנה", + "Clear cross-signing keys": "נקה מפתחות חתימה צולבת", + "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.": "מחיקת מפתחות חתימה צולבת הינה קבועה. כל מי שאימתת איתו יראה התראות אבטחה. כמעט בוודאות אינך רוצה לעשות זאת, אלא אם איבדת כל מכשיר ממנו תוכל לחתום.", + "Destroy cross-signing keys?": "להרוס מפתחות חתימה צולבת?", + "Use your Security Key to continue.": "השתמש במפתח האבטחה שלך כדי להמשיך.", + "Security Key": "מפתח אבטחה", + "Enter your Security Phrase or to continue.": "הזן את ביטוי האבטחה שלך או כדי להמשיך.", + "Unable to access secret storage. Please verify that you entered the correct recovery passphrase.": "אין אפשרות לגשת לאחסון סודי. אנא ודא שהזנת את משפט סיסמת השחזור הנכון.", + "Security Phrase": "ביטוי אבטחה", + "Invalid Recovery Key": "מפתח שחזור לא תקין", + "Wrong Recovery Key": "מפתח שחזור שגוי", + "Looks good!": "נראה טוב!", + "Wrong file type": "סוג קובץ שגוי", + "Deny": "סרב", + "Allow": "אפשר", + "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "יישומון שנמצא ב- %(widgetUrl)s מעוניין לאמת את זהותך. בכך שתאפשר זאת, היישומון יוכל לאמת את מזהה המשתמש שלך, אך לא לבצע פעולות כמוך.", + "A widget would like to verify your identity": "יישומון רוצה לאמת את זהותך", + "Remember my selection for this widget": "זכור את הבחירה שלי עבור יישומון זה", + "Decline All": "סרב להכל", + "Approve": "אישור", + "This widget would like to:": "יישומון זה רוצה:", + "Approve widget permissions": "אשר הרשאות יישומון", + "Verification Request": "בקשת אימות", + "Verify other session": "אמת מושבים אחרים", + "Upload Error": "שגיאת העלאה", + "Cancel All": "בטל הכל", + "Upload %(count)s other files|one": "העלה %(count)s של קובץ אחר", + "Upload %(count)s other files|other": "העלה %(count)s של קבצים אחרים", + "Some files are too large to be uploaded. The file size limit is %(limit)s.": "חלק מהקבצים גדולים מדי כדי להעלות אותם. מגבלת גודל הקובץ היא %(limit)s.", + "These files are too large to upload. The file size limit is %(limit)s.": "קבצים אלה גדולים מדי להעלאה. מגבלת גודל הקובץ היא %(limit)s.", + "This file is too large to upload. The file size limit is %(limit)s but this file is %(sizeOfThisFile)s.": "קובץ זה גדול מדי להעלאה. מגבלת גודל הקובץ היא %(limit)s אך קובץ זה הוא %(sizeOfThisFile)s.", + "Upload all": "מעלה הכל", + "Upload files (%(current)s of %(total)s)": "מעלה קבצים (%(current)s מ %(total)s)", + "Upload files": "מעלה קבצים", + "Next": "הבא", + "Document": "מסמך", + "Summary": "תקציר", + "Service": "שֵׁרוּת", + "To continue you need to accept the terms of this service.": "כדי להמשיך עליך לקבל את תנאי השירות הזה.", + "Terms of Service": "תנאי השירות", + "Use bots, bridges, widgets and sticker packs": "השתמש בבוטים, גשרים, ווידג'טים וחבילות מדבקות", + "Be found by phone or email": "להימצא בטלפון או בדוא\"ל", + "Find others by phone or email": "מצא אחרים בטלפון או בדוא\"ל", + "Integration Manager": "מנהל אינטגרציה", + "Your browser likely removed this data when running low on disk space.": "סביר להניח שהדפדפן שלך הסיר נתונים אלה כאשר שטח הדיסק שלהם נמוך.", + "Some session data, including encrypted message keys, is missing. Sign out and sign in to fix this, restoring keys from backup.": "חלק מנתוני ההפעלה, כולל מפתחות הודעות מוצפנים, חסרים. צא והיכנס כדי לתקן זאת, ושחזר את המפתחות מהגיבוי.", + "Missing session data": "חסרים נתוני הפעלות", + "To help us prevent this in future, please send us logs.": "כדי לעזור לנו למנוע זאת בעתיד, אנא שלחו לנו יומנים .", + "Command Help": "עזרה לפיקוד", + "Copy": "העתק", + "Link to selected message": "קישור להודעה שנבחרה", + "Share Room Message": "שתף הודעה בחדר", + "Share Community": "שתף קהילה", + "Share User": "שתף משתמש", + "Link to most recent message": "קישור להודעה האחרונה", + "Share Room": "שתף חדר", + "This will allow you to reset your password and receive notifications.": "זה יאפשר לך לאפס את הסיסמה שלך ולקבל התראות.", + "Please check your email and click on the link it contains. Once this is done, click continue.": "אנא בדוק את הדוא\"ל שלך ולחץ על הקישור שהוא מכיל. לאחר שתסיים, לחץ על המשך.", + "Verification Pending": "אימות בהמתנה", + "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "ניקוי שטח האחסון של הדפדפן עשוי לפתור את הבעיה, אך ינתק אתכם ויגרום לכל היסטוריית צ'אט מוצפנת להיות בלתי קריאה.", + "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.": "אם השתמשת בעבר בגרסה עדכנית יותר של %(brand)s, ייתכן שההפעלה שלך אינה תואמת לגרסה זו. סגרו חלון זה וחזרו לגרסה העדכנית יותר.", + "We encountered an error trying to restore your previous session.": "נתקלנו בשגיאה בניסיון לשחזר את ההפעלה הקודמת שלך.", + "Unable to restore session": "לא ניתן לשחזר את ההפעלה", + "Refresh": "רענן", + "Send Logs": "שלח יומנים", + "Clear Storage and Sign Out": "נקה אחסון והתנתק", + "Sign out and remove encryption keys?": "להתנתק ולהסיר מפתחות הצפנה?", + "About homeservers": "אודות שרתי בית", + "Learn more": "למד עוד", + "Use your preferred Matrix homeserver if you have one, or host your own.": "השתמש בשרת הבית המועדף על מטריקס אם יש לך כזה, או מארח משלך.", + "Other homeserver": "שרת בית אחר", + "We call the places where you can host your account ‘homeservers’.": "אנו מכנים את המקומות שבהם אתה יכול לארח את חשבונך 'שרתים ביתיים'.", + "Sign into your homeserver": "היכנס לשרת הבית שלך", + "Matrix.org is the biggest public homeserver in the world, so it’s a good place for many.": "Matrix.org היא שרת הבית הציבורי הגדול בעולם, ולכן זה מקום טוב עבור רבים.", + "Specify a homeserver": "ציין שרת בית", + "Invalid URL": "כתובת אתר לא חוקית", + "Unable to validate homeserver": "לא ניתן לאמת את שרת הבית", + "Recent changes that have not yet been received": "שינויים אחרונים שטרם התקבלו", + "The server is not configured to indicate what the problem is (CORS).": "השרת אינו מוגדר לציין מהי הבעיה (CORS).", + "A connection error occurred while trying to contact the server.": "אירעה שגיאת חיבור בעת ניסיון ליצור קשר עם השרת.", + "Your area is experiencing difficulties connecting to the internet.": "האזור שלך חווה קשיים בחיבור לאינטרנט.", + "The server has denied your request.": "השרת דחה את בקשתך.", + "The server is offline.": "השרת לא מקוון.", + "A browser extension is preventing the request.": "סיומת דפדפן מונעת את הבקשה.", + "Your firewall or anti-virus is blocking the request.": "חומת האש או האנטי-וירוס שלך חוסמים את הבקשה.", + "The server (%(serverName)s) took too long to respond.": "לשרת (%(serverName)s) לקח יותר מדי זמן להגיב.", + "Your server isn't responding to some of your requests. Below are some of the most likely reasons.": "השרת שלך לא מגיב לחלק מהבקשות שלך. להלן כמה מהסיבות הסבירות ביותר.", + "Server isn't responding": "השרת לא מגיב", + "You're all caught up.": "כולכם נתפסתם.", + "You'll upgrade this room from to .": "תשדרג את החדר הזה מ- ל- .", + "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, אנא דווח על באג .", + "Upgrading a room is an advanced action and is usually recommended when a room is unstable due to bugs, missing features or security vulnerabilities.": "שדרוג חדר הוא פעולה מתקדמת ומומלץ בדרך כלל כאשר החדר אינו יציב עקב באגים, תכונות חסרות או פרצות אבטחה.", + "Upgrade public room": "שדרג חדר ציבורי", + "Upgrade private room": "שדרג חדר פרטי", + "Automatically invite users": "הזמן משתמשים באופן אוטומטי", + "Put a link back to the old room at the start of the new room so people can see old messages": "החזירו קישור לחדר הישן בתחילת החדר החדש כדי שאנשים יוכלו לראות הודעות ישנות", + "Stop users from speaking in the old version of the room, and post a message advising users to move to the new room": "עצור מהמשתמשים לדבר בגרסה הישנה של החדר, ושלח הודעה הממליצה למשתמשים לעבור לחדר החדש", + "Update any local room aliases to point to the new room": "עדכן את כינויי החדר המקומיים בכדי להצביע על החדר החדש", + "Create a new room with the same name, description and avatar": "צור חדר חדש עם אותו שם, תיאור ואווטאר", + "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 Room Version": "גרסת חדר שדרוג", + "Upgrade this room to version %(version)s": "שדרג חדר זה לגרסה %(version)s", + "The room upgrade could not be completed": "לא ניתן היה להשלים את שדרוג החדר", + "Failed to upgrade room": "שדרוג החדר נכשל", + "Room Settings - %(roomName)s": "הגדרות חדר - %(roomName)s", + "Send report": "שלח דיווח", + "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.": "דיווח על הודעה זו ישלח את 'מזהה האירוע' הייחודי למנהל שרת הבית שלך. אם הודעות בחדר זה מוצפנות, מנהל שרת הבית שלך לא יוכל לקרוא את טקסט ההודעה או להציג קבצים או תמונות.", + "Report Content to Your Homeserver Administrator": "דווח על תוכן למנהל שרת הבית שלך", + "Please fill why you're reporting.": "אנא מלאו מדוע אתם מדווחים.", + "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.": "רק קדימה, אם לא תוסיף דוא\"ל ושכחת את הסיסמה שלך, אתה יכול לאבד לצמיתות את הגישה לחשבונך .", + "Continuing without email": "ממשיך ללא דוא\"ל", + "Doesn't look like a valid email address": "לא נראה כמו כתובת דוא\"ל תקפה", + "This wasn't me": "זה לא הייתי אני", + "If you didn’t sign in to this session, your account may be compromised.": "אם לא נכנסת למפגש זה, ייתכן שחשבונך נפגע.", + "Use this session to verify your new one, granting it access to encrypted messages:": "השתמש בפגישה זו כדי לאמת את הפגישה החדשה שלך, והעניק לה גישה להודעות מוצפנות:", + "New session": "מושב חדש", + "We recommend you change your password and recovery key in Settings immediately": "אנו ממליצים לך לשנות את הסיסמה ומפתח השחזור שלך בהגדרות באופן מיידי", + "The internet connection either session is using": "חיבור האינטרנט או כל מושב משתמש", + "This session, or the other session": "המושב הזה או המושב האחר", + "Your password": "הסיסמה שלכם", + "Your account is not secure": "חשבונכם אינו מאובטח", + "Data on this screen is shared with %(widgetDomain)s": "הנתונים על המסך הזה משותפים עם %(widgetDomain)s", + "Modal Widget": "יישומון מודאלי", + "Message edits": "עריכת הודעות", + "Your homeserver doesn't seem to support this feature.": "נראה ששרת הבית שלך אינו תומך בתכונה זו.", + "Verify session": "אמת מושב", + "If they don't match, the security of your communication may be compromised.": "אם הם לא תואמים, אבטחת התקשורת שלך עלולה להיפגע.", + "Session key": "מפתח מושב", + "Session ID": "זהות מושב", + "Session name": "שם מושב", + "Confirm this user's session by comparing the following with their User Settings:": "אשר את הפעלת המשתמש הזה על ידי השוואה בין הדברים הבאים להגדרות המשתמש שלהם:", + "Confirm by comparing the following with the User Settings in your other session:": "אשר על ידי השוואה בין הדברים הבאים להגדרות המשתמש בפגישה האחרת שלך:", + "Are you sure you want to sign out?": "האם אתה בטוח שברצונך לצאת?", + "You'll lose access to your encrypted messages": "תאבד את הגישה להודעות המוצפנות שלך", + "Manually export keys": "ייצא ידנית מפתחות", + "I don't want my encrypted messages": "אני לא רוצה את ההודעות המוצפנות שלי", + "Start using Key Backup": "התחל להשתמש בגיבוי מקשים", + "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "הודעות מוצפנות מאובטחות באמצעות הצפנה מקצה לקצה. רק לך ולמקבל / ים יש / ה מקשים לקריאת הודעות אלה.", + "Updating %(brand)s": "מעדכן %(brand)s", + "%(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 משתמש כעת בזכרון פחות פי 3-5, על ידי טעינת מידע רק על משתמשים אחרים בעת הצורך. אנא המתן בזמן שאנחנו מסתנכרנים מחדש עם השרת!", + "Clear cache and resync": "נקה מטמון וסנכרן מחדש", + "Incompatible local cache": "מטמון מקומי לא תואם", + "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.": "אם הגרסה האחרת של %(brand)s עדיין פתוחה בכרטיסייה אחרת, אנא סגור אותה כשימוש ב-%(brand)s באותו מארח כאשר טעינה עצלה מופעלת וגם מושבתת בו זמנית תגרום לבעיות.", + "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "השתמשת בעבר ב- %(brand)s ב- %(host)s עם טעינה עצלה של חברים מופעלת. בגרסה זו טעינה עצלה מושבתת. מכיוון שהמטמון המקומי אינו תואם בין שתי ההגדרות הללו, %(brand)s צריך לסנכרן מחדש את חשבונך.", + "Signature upload failed": "העלאת החתימה נכשלה", + "Signature upload success": "הצלחה בהעלאת חתימה", + "Unable to upload": "לא ניתן להעלות", + "Cancelled signature upload": "העלאת החתימה בוטלה", + "Upload completed": "העלאה הושלמה", + "%(brand)s encountered an error during upload of:": "%(brand)s נתקל בשגיאה במהלך ההעלאה של:", + "a key signature": "חתימת מפתח", + "a new cross-signing key signature": "חתימת מפתח צולבת חדשה", + "a device cross-signing signature": "חתימה צולבת של התקן", + "a new master key signature": "חתימת מפתח ראשית חדשה", + "Invite someone using their name, username (like ) or share this room.": "הזמינו מישהו המשתמש בשמו, שם המשתמש (כמו ) או שתפו את החדר הזה .", + "Invite someone using their name, email address, username (like ) or share this room.": "הזמינו מישהו המשתמש בשמו, כתובת הדוא\"ל, שם המשתמש (כמו ) או שתפו את החדר הזה .", + "Go": "המשך", + "This won't invite them to %(communityName)s. To invite someone to %(communityName)s, click here": "זה לא יזמין אותם ל- %(communityName)s. להזמנת מישהו ל- %(communityName)s לחץ על כאן ", + "Start a conversation with someone using their name or username (like ).": "התחל שיחה עם מישהו המשתמש בשמו או בשם המשתמש שלו (כמו ).", + "Start a conversation with someone using their name, email address or username (like ).": "התחל שיחה עם מישהו המשתמש בשמו, כתובת הדוא\"ל או שם המשתמש שלו (כמו ).", + "Direct Messages": "הודעות ישירות", + "Recently Direct Messaged": "הודעות ישירות לאחרונה", + "May include members not in %(communityName)s": "עשוי לכלול חברים שאינם ב- %(communityName)s", + "Suggestions": "הצעות", + "Recent Conversations": "שיחות אחרונות", + "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "המשתמשים הבאים עשויים שלא להתקיים או שאינם תקפים, ולא ניתן להזמין אותם: %(csvNames)s", + "Failed to find the following users": "מציאת המשתמשים הבאים נכשלה", + "We couldn't invite those users. Please check the users you want to invite and try again.": "לא יכולנו להזמין את המשתמשים האלה. אנא בדוק את המשתמשים שברצונך להזמין ונסה שוב.", + "Something went wrong trying to invite the users.": "משהו השתבש בניסיון להזמין את המשתמשים.", + "We couldn't create your DM. Please check the users you want to invite and try again.": "לא הצלחנו ליצור את ה- DM שלך. אנא בדוק את המשתמשים שברצונך להזמין ונסה שוב.", + "Failed to invite the following users to chat: %(csvUsers)s": "הזמנת המשתמשים הבאים לצ'אט נכשלה: %(csvUsers)s", + "Invite by email": "הזמנה באמצעות דוא\"ל", + "Click the button below to confirm your identity.": "לחץ על הלחצן למטה כדי לאשר את זהותך.", + "Confirm to continue": "אשרו בכדי להמשיך", + "To continue, use Single Sign On to prove your identity.": "כדי להמשיך, השתמש בכניסה יחידה כדי להוכיח את זהותך.", + "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s שלכם אינו מאפשר לך להשתמש במנהל שילוב לשם כך. אנא צרו קשר עם מנהל מערכת.", + "Integrations not allowed": "שילובים אינם מורשים", + "Enable 'Manage Integrations' in Settings to do this.": "אפשר 'ניהול אינטגרציות' בהגדרות כדי לעשות זאת.", + "Integrations are disabled": "שילובים מושבתים", + "Incoming Verification Request": "בקשת אימות נכנסת", + "Waiting for partner to confirm...": "מחכה לשותף שיאשר ...", + "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "אימות מכשיר זה יסמן אותו כאמין, ומשתמשים שאימתו איתך יסמכו על מכשיר זה.", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "אמת את המכשיר הזה כדי לסמן אותו כאמין. אמון במכשיר זה מעניק לך ולמשתמשים אחרים שקט נפשי נוסף בשימוש בהודעות מוצפנות מקצה לקצה.", + "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "אימות משתמש זה יסמן את ההפעלה שלו כאמינה, וגם יסמן את ההפעלה שלך כאמינה להם.", + "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "אמת את המשתמש הזה כדי לסמן אותו כאמין. אמון במשתמשים מעניק לך שקט נפשי נוסף בשימוש בהודעות מוצפנות מקצה לקצה.", + "Send feedback": "שלח משוב", + "PRO TIP: If you start a bug, please submit debug logs to help us track down the problem.": "טיפ למקצוענים: אם אתה מפעיל באג, שלח יומני איתור באגים כדי לעזור לנו לאתר את הבעיה.", + "Please view existing bugs on Github first. No match? Start a new one.": "אנא צפה תחילה ב באגים קיימים ב- Github . אין התאמה? התחל חדש .", + "Report a bug": "דיווח על תקלה", + "Feedback": "משוב", + "There are two ways you can provide feedback and help us improve %(brand)s.": "ישנן שתי דרכים בהן ניתן לספק משוב ולעזור לנו לשפר את %(brand)s.", + "Comment": "תגובה", + "Add comment": "הוספת תגובה", + "Please go into as much detail as you like, so we can track down the problem.": "אנא פרט כמה שתרצה, כדי שנוכל לאתר את הבעיה.", + "Tell us below how you feel about %(brand)s so far.": "ספר לנו בהמשך מה אתה מרגיש לגבי %(brand)s עד כה.", + "Rate %(brand)s": "דרג את %(brand)s", + "Feedback sent": "משוב נשלח", + "An error has occurred.": "קרתה שגיאה.", + "Update community": "עדכן קהילה", + "There was an error updating your community. The server is unable to process your request.": "אירעה שגיאה בעדכון הקהילה שלך. השרת אינו יכול לעבד את בקשתך." } From 8f131a2eb05c1f2170a3bfe02d5785785a2bf8e9 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Sat, 2 Jan 2021 21:19:51 +0000 Subject: [PATCH 117/231] Translated using Weblate (Swedish) Currently translated at 100.0% (2718 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 99cd403818..f60a97241f 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -2910,5 +2910,6 @@ "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Lägger till ┬──┬ ノ( ゜-゜ノ) till början av ett textmeddelande", "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Lägger till (╯°□°)╯︵ ┻━┻ till början av ett textmeddelande", "You've reached the maximum number of simultaneous calls.": "Du har nått det maximala antalet samtidiga samtal.", - "Too Many Calls": "För många samtal" + "Too Many Calls": "För många samtal", + "You have no visible notifications.": "Du har inga synliga aviseringar." } From 554197eda9ae0437f8d44a6d7ace467979b57b54 Mon Sep 17 00:00:00 2001 From: Tirifto Date: Tue, 5 Jan 2021 16:49:12 +0000 Subject: [PATCH 118/231] Translated using Weblate (Esperanto) Currently translated at 96.4% (2621 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/eo/ --- src/i18n/strings/eo.json | 178 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 170 insertions(+), 8 deletions(-) diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 3545565fa3..748d265c89 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -655,9 +655,9 @@ "Messages in one-to-one chats": "Mesaĝoj en duopaj babiloj", "Unavailable": "Nedisponebla", "View Decrypted Source": "Vidi malĉifritan fonton", - "Failed to update keywords": "Malsukcesis ĝisdatigi la ŝlosilvortojn", + "Failed to update keywords": "Malsukcesis ĝisdatigi la ĉefvortojn", "remove %(name)s from the directory.": "forigi %(name)s de la katalogo.", - "Notifications on the following keywords follow rules which can’t be displayed here:": "La sciigoj de la jenaj ŝlosilvortoj sekvas regulojn kiuj ne povas esti montrataj ĉi tie:", + "Notifications on the following keywords follow rules which can’t be displayed here:": "La sciigoj de la jenaj ĉefvortoj obeas regulojn kiuj ne povas esti montrataj ĉi tie:", "Please set a password!": "Bonvolu agordi pasvorton!", "You have successfully set a password!": "Vi sukcese agordis pasvorton!", "An error occurred whilst saving your email notification preferences.": "Konservo de agordoj pri retpoŝtaj sciigoj eraris.", @@ -671,10 +671,10 @@ "Collecting app version information": "Kolektante informon pri versio de la aplikaĵo", "Enable notifications for this account": "Ŝalti sciigojn por tiu ĉi konto", "Invite to this community": "Inviti al tiu ĉi komunumo", - "Messages containing keywords": "Mesaĝoj enhavantaj ŝlosilovortojn", + "Messages containing keywords": "Mesaĝoj enhavantaj ĉefvortojn", "Error saving email notification preferences": "Konservo de preferoj pri retpoŝtaj sciigoj eraris", "Tuesday": "Mardo", - "Enter keywords separated by a comma:": "Entajpu ŝlosilvortojn apartigitajn per komoj:", + "Enter keywords separated by a comma:": "Entajpu ĉefvortojn apartigitajn per komoj:", "Search…": "Serĉi…", "You have successfully set a password and an email address!": "Vi sukcese agordis pasvorton kaj retpoŝtadreson!", "Remove %(name)s from the directory?": "Ĉu forigi %(name)s de la katalogo?", @@ -708,7 +708,7 @@ "What's new?": "Kio novas?", "Notify me for anything else": "Sciigu min pri ĉio alia", "When I'm invited to a room": "Kiam mi estas invitita al ĉambro", - "Keywords": "Ŝlosilvortoj", + "Keywords": "Ĉefvortoj", "Can't update user notification settings": "Agordoj de sciigoj al uzanto ne ĝisdatigeblas", "Notify for all other messages/rooms": "Sciigu min por ĉiuj aliaj mesaĝoj/ĉambroj", "Unable to look up room ID from server": "Ne povas akiri ĉambran identigilon de la servilo", @@ -2072,7 +2072,7 @@ "Invalid theme schema.": "Nevalida skemo de haŭto.", "Mod": "Reguligisto", "In encrypted rooms, your messages are secured and only you and the recipient have the unique keys to unlock them.": "En ĉifritaj ĉambroj, viaj mesaĝoj estas sekurigitaj, kaj nur vi kaj la ricevanto havas la unikajn malĉifrajn ŝlosilojn.", - "Verify all users in a room to ensure it's secure.": "Kontroli ĉiujn uzantojn en ĉambro por certigi, ke ĝi sekuras.", + "Verify all users in a room to ensure it's secure.": "Kontrolu ĉiujn uzantojn en ĉambro por certigi, ke ĝi sekuras.", "In encrypted rooms, verify all users to ensure it’s secure.": "En ĉifritaj ĉambroj, kontroli ĉiujn uzantojn por certigi, ke ili sekuras.", "Verified": "Kontrolita", "Verification cancelled": "Kontrolo nuliĝis", @@ -2329,7 +2329,7 @@ "Show %(count)s more|other": "Montri %(count)s pliajn", "Show %(count)s more|one": "Montri %(count)s plian", "Use default": "Uzi implicitan", - "Mentions & Keywords": "Mencioj kaj ŝlosilvortoj", + "Mentions & Keywords": "Mencioj kaj ĉefvortoj", "Notification options": "Elektebloj pri sciigoj", "Favourited": "Elstarigita", "Leave Room": "Foriri de ĉambro", @@ -2697,5 +2697,167 @@ "Caribbean Netherlands": "Kariba Nederlando", "Burkina Faso": "Burkino", "Bouvet Island": "Buvet-Insulo", - "Anguilla": "Angvilo" + "Anguilla": "Angvilo", + "%(name)s on hold": "%(name)s estas paŭzigita", + "Return to call": "Reveni al voko", + "Fill Screen": "Plenigi ekranon", + "Voice Call": "Voĉvoko", + "Video Call": "Vidvoko", + "%(peerName)s held the call": "%(peerName)s paŭzigis la vokon", + "You held the call Resume": "Vi paŭzigis la vokon Daŭrigi", + "You held the call Switch": "Vi paŭzigis la vokon Baskuli", + "Render LaTeX maths in messages": "Bildigi matematikon de Lateĥo en mesaĝoj", + "%(senderName)s ended the call": "%(senderName)s finis la vokon", + "You ended the call": "Vi finis la vokon", + "New version of %(brand)s is available": "Nova versio de %(brand)s disponeblas", + "Update %(brand)s": "Ĝisdatigi %(brand)s", + "Enable desktop notifications": "Ŝalti labortablajn sciigojn", + "See %(msgtype)s messages posted to your active room": "Vidi mesaĝojn de speco %(msgtype)s afiŝitajn al via aktiva ĉambro", + "See %(msgtype)s messages posted to this room": "Vidi mesaĝojn de speco %(msgtype)s afiŝitajn al ĉi tiu ĉambro", + "Send %(msgtype)s messages as you in your active room": "Sendi mesaĝojn de speco %(msgtype)s kiel vi en via aktiva ĉambro", + "Send %(msgtype)s messages as you in this room": "Sendi mesaĝojn de speco %(msgtype)s kiel vi en ĉi tiu ĉambro", + "See general files posted to your active room": "Sendi ĝeneralajn dosierojn afiŝitajn al via aktiva ĉambro", + "See general files posted to this room": "Sendi ĝeneralajn dosierojn afiŝitajn al ĉi tiu ĉambro", + "Send general files as you in your active room": "Sendi ĝeneralajn dosierojn kiel vi en via aktiva ĉambro", + "Send general files as you in this room": "Sendi ĝeneralajn dosierojn kiel vi en ĉi tiu ĉambro", + "See videos posted to your active room": "Vidi filmojn afiŝitajn al via aktiva ĉambro", + "See videos posted to this room": "Vidi filmojn afiŝitajn al ĉi tiu ĉambro", + "Send videos as you in your active room": "Sendi filmojn kiel vi en via aktiva ĉambro", + "Send videos as you in this room": "Sendi filmojn kiel vi en ĉi tiu ĉambro", + "See images posted to your active room": "Vidi bildojn afiŝitajn al via aktiva ĉambro", + "See images posted to this room": "Vidi bildojn afiŝitajn al ĉi tiu ĉambro", + "Send images as you in your active room": "Sendi bildojn kiel vi en via aktiva ĉambro", + "Send images as you in this room": "Sendi bildojn kiel vi en ĉi tiu ĉambro", + "The %(capability)s capability": "La kapablo %(capability)s", + "See %(eventType)s events posted to your active room": "Vidi eventojn de speco %(eventType)s afiŝitajn al via aktiva ĉambro", + "Send %(eventType)s events as you in your active room": "Sendi eventojn de speco %(eventType)s kiel vi en via aktiva ĉambro", + "See %(eventType)s events posted to this room": "Vidi eventojn de speco %(eventType)s afiŝitajn al ĉi tiu ĉambro", + "Send %(eventType)s events as you in this room": "Sendi eventojn de speco %(eventType)s kiel vi en ĉi tiu ĉambro", + "See messages posted to your active room": "Vidi mesaĝojn senditajn al via aktiva ĉambro", + "See messages posted to this room": "Vidi mesaĝojn senditajn al ĉi tiu ĉambro", + "Send messages as you in your active room": "Sendi mesaĝojn kiel vi en via aktiva ĉambro", + "Send messages as you in this room": "Sendi mesaĝojn kiel vi en ĉi tiu ĉambro", + "See when anyone posts a sticker to your active room": "Vidi ies ajn afiŝojn de glumarkoj al via aktiva ĉambro", + "Send stickers to your active room as you": "Sendi glumarkojn al via aktiva ĉambro kiel vi", + "See when a sticker is posted in this room": "Vidi afiŝojn de glumarkoj en ĉi tiu ĉambro", + "Send stickers to this room as you": "Sendi glumarkojn al ĉi tiu ĉambro kiel vi", + "See when the avatar changes in your active room": "Vidi ŝanĝojn de bildo de ĉambro en via aktiva ĉambro", + "Change the avatar of your active room": "Ŝanĝi la bildon de via aktiva ĉambro", + "See when the avatar changes in this room": "Vidi ŝanĝojn de bildo de ĉambro en ĉi tiu ĉambro", + "Change the avatar of this room": "Ŝanĝi la bildon de ĉi tiu ĉambro", + "See when the name changes in your active room": "Vidi ŝanĝojn de nomo en via aktiva ĉambro", + "Change the name of your active room": "Ŝanĝi la nomon de via aktiva ĉambro", + "See when the name changes in this room": "Vidi ŝanĝojn de nomo en ĉi tiu ĉambro", + "Change the name of this room": "Ŝanĝi la nomon de ĉi tiu ĉambro", + "See when the topic changes in your active room": "Vidi ŝanĝojn de temo en via aktiva ĉambro", + "Change the topic of your active room": "Ŝanĝi la temon de via aktiva ĉambro", + "See when the topic changes in this room": "Vidi ŝanĝojn de temo en ĉi tiu ĉambro", + "Change the topic of this room": "Ŝanĝi la temon de ĉi tiu ĉambro", + "Change which room you're viewing": "Ŝanĝi la vidatan ĉambron", + "Send stickers into your active room": "Sendi glumarkojn al via aktiva ĉambro", + "Send stickers into this room": "Sendi glumarkojn al ĉi tiu ĉambro", + "Takes the call in the current room off hold": "Malpaŭzigas la vokon en la nuna ĉambro", + "Places the call in the current room on hold": "Paŭzigas la vokon en la nuna ĉambro", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Antaŭmetas ┬──┬ ノ( ゜-゜ノ) al platteksta mesaĝo", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Antaŭmetas (╯°□°)╯︵ ┻━┻ al platteksta mesaĝo", + "Effects": "Efektoj", + "Zimbabwe": "Zimbabvo", + "Zambia": "Zambio", + "Yemen": "Jemeno", + "Western Sahara": "Okcidenta Saharo", + "Wallis & Futuna": "Valiso kaj Futuno", + "Vietnam": "Vjetnamujo", + "Venezuela": "Venezuelo", + "Vatican City": "Vatikano", + "Vanuatu": "Vanuatuo", + "Uruguay": "Urugvajo", + "U.S. Virgin Islands": "Usonaj Virgulininsuloj", + "Tuvalu": "Tuvalo", + "Turks & Caicos Islands": "Turkoj kaj Kajkoj", + "Turkmenistan": "Turkmenujo", + "Trinidad & Tobago": "Trinidado kaj Tobago", + "Switzerland": "Svisujo", + "Sweden": "Svedujo", + "Swaziland": "Svaziujo", + "Svalbard & Jan Mayen": "Svalbardo kaj Janmajeno", + "Suriname": "Surinamo", + "Sudan": "Sudano", + "St. Vincent & Grenadines": "Sankt-Vincento kaj Grenadinoj", + "St. Pierre & Miquelon": "Sankt-Pjero kaj Mikelono", + "St. Martin": "Sankt-Marteno", + "St. Lucia": "Sankt-Lucio", + "St. Kitts & Nevis": "Sankt-Kito kaj Neviso", + "St. Barthélemy": "Sankt-Bartolomeo", + "St. Helena": "Sankt-Heleno", + "South Sudan": "Sud-Sudano", + "South Georgia & South Sandwich Islands": "Sud-Georgio kaj Sud-Sandviĉinsuloj", + "Sint Maarten": "Sint-Marteno", + "Réunion": "Reunio", + "Pitcairn Islands": "Pitkernaj insuloj", + "Northern Mariana Islands": "Nord-Marianoj", + "Norfolk Island": "Norfolkinsulo", + "Nicaragua": "Nikaragvo", + "Mongolia": "Mongolujo", + "Monaco": "Monako", + "Moldova": "Moldavujo", + "Micronesia": "Mikronezio", + "Mexico": "Meksiko", + "Mayotte": "Majoto", + "Mauritius": "Maŭricio", + "Mauritania": "Maŭritanio", + "Martinique": "Martiniko", + "Marshall Islands": "Marŝaloj", + "Malawi": "Malavio", + "Madagascar": "Madagaskaro", + "Macedonia": "Makedonujo", + "Macau": "Makao", + "Libya": "Libio", + "Liberia": "Liberio", + "Lesotho": "Lesoto", + "Lebanon": "Libano", + "Kuwait": "Kuvajto", + "Kiribati": "Kiribato", + "Jordan": "Jordanio", + "Jersey": "Ĵerzejo", + "Heard & McDonald Islands": "Insuloj de Herdo kaj Makdonaldo", + "Guyana": "Gujano", + "Guinea-Bissau": "Gvineo-Bisaŭo", + "Guinea": "Gvineo", + "Guernsey": "Gernezejo", + "Guam": "Gvamo", + "Guadeloupe": "Gvadelupo", + "Ghana": "Ganao", + "Georgia": "Kartvelujo", + "Gambia": "Gambio", + "Gabon": "Gabono", + "French Southern Territories": "Francaj sudaj teritorioj", + "French Polynesia": "Franca Polinezio", + "Congo - Kinshasa": "Demokratia respubliko Kongo (Kinŝasa)", + "Congo - Brazzaville": "Respubliko Kongo (Brazavila)", + "British Indian Ocean Territory": "Brita hindoceana teritorio", + "Tonga": "Tongo", + "Tokelau": "Tokelao", + "Togo": "Togolando", + "Timor-Leste": "Orienta Timoro", + "Thailand": "Tajujo", + "Tanzania": "Tanzanio", + "Taiwan": "Tajvano", + "São Tomé & Príncipe": "Santomeo kaj Principeo", + "Syria": "Sirio", + "French Guiana": "Franca Gujano", + "Faroe Islands": "Ferooj", + "Falkland Islands": "Falklandoj", + "Djibouti": "Ĝibutio", + "Curaçao": "Kuracao", + "Cocos (Keeling) Islands": "Kokosinsuloj", + "Cayman Islands": "Kajmaninsuloj", + "You've reached the maximum number of simultaneous calls.": "Vi atingis la maksimuman nombron de samtempaj vokoj.", + "Too Many Calls": "Tro multaj vokoj", + "No other application is using the webcam": "Neniu alia aplikaĵo uzas la retfilmilon", + "Permission is granted to use the webcam": "Permeso uzi la retfilmilon estas donita", + "A microphone and webcam are plugged in and set up correctly": "Mikrofono kaj retfilmilo estas ĝuste konektitaj kaj agorditaj", + "Call failed because webcam or microphone could not be accessed. Check that:": "Voko malsukcesis, ĉar retfilmilo aŭ mikrofono ne povis uziĝi. Kontrolu, ke:", + "Unable to access webcam / microphone": "Ne povas aliri retfilmilon / mikrofonon", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Voko malsukcesis, ĉar mikrofono ne estis uzebla. Kontrolu, ĉu mikrofono estas ĝuste konektita kaj agordita.", + "Unable to access microphone": "Ne povas aliri mikrofonon" } From 8cd2772dd5e0a7f2c27d0583e611743cebbde50f Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Sat, 2 Jan 2021 16:06:14 +0000 Subject: [PATCH 119/231] Translated using Weblate (Albanian) Currently translated at 99.6% (2708 of 2718 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 0259ccac82..7720599870 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -807,7 +807,7 @@ "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ëse më herët keni përdorur një version më të freskët të %(brand)s-it, sesioni juaj mund të jetë i papërputhshëm me këtë version. Mbylleni këtë dritare dhe kthehuni te versioni më i ri.", "Clearing your browser's storage may fix the problem, but will sign you out and cause any encrypted chat history to become unreadable.": "Spastrimi i gjërave të depozituara në shfletuesin tuaj mund ta ndreqë problemin, por kjo do të sjellë nxjerrjen tuaj nga llogari dhe do ta bëjë të palexueshëm çfarëdo historiku të fshehtëzuar të bisedës.", "If you already have a Matrix account you can log in instead.": "Nëse keni tashmë një llogari Matrix, mund të bëni hyrjen.", - "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Krijoni një bashkësi që bëni tok përdorues dhe dhoma! Krijoni një faqe hyrëse vetjake, që të ravijëzoni hapësirën tuaj në universin Matrix.", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Krijoni një bashkësi që të bëni tok përdorues dhe dhoma! Krijoni një faqe hyrëse vetjake, që të ravijëzoni hapësirën tuaj në universin Matrix.", "Sent messages will be stored until your connection has returned.": "Mesazhet e dërguar do të depozitohen deri sa lidhja juaj të jetë rikthyer.", "Server may be unavailable, overloaded, or search timed out :(": "Shërbyesi mund të jetë i pakapshëm, i mbingarkuar, ose kërkimit i mbaroi koha :(", "If you've submitted a bug via GitHub, debug logs can help us track down the problem. Debug logs contain application usage data including your username, the IDs or aliases of the rooms or groups you have visited and the usernames of other users. They do not contain messages.": "Nëse parashtruat një të metë përmes GitHub-it, regjistrat e diagnostikimit mund të na ndihmojnë të ndjekim problemin. Regjistrat e diagnostikimit përmbajnë të dhëna përdorimi, përfshi emrin tuaj të përdoruesit, ID-të ose aliaset e dhomave apo grupeve që keni vizituar dhe emrat e përdoruesve të përdoruesve të tjerë. Në to nuk përmbahen mesazhet.", From b7093826d76b043356e5f3d1bf5f018f897c80fe Mon Sep 17 00:00:00 2001 From: Flat Earth Israel Association Date: Thu, 7 Jan 2021 19:24:36 +0000 Subject: [PATCH 120/231] Translated using Weblate (Hebrew) Currently translated at 100.0% (2721 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/he/ --- src/i18n/strings/he.json | 310 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 302 insertions(+), 8 deletions(-) diff --git a/src/i18n/strings/he.json b/src/i18n/strings/he.json index a5a65367c3..a1ca215c3b 100644 --- a/src/i18n/strings/he.json +++ b/src/i18n/strings/he.json @@ -840,19 +840,19 @@ "Backup is not signed by any of your sessions": "גיבוי אינו חתום על ידי אף אחד מההתחברויות שלכם", "Backup has an invalid signature from unverified session ": "לגיבוי יש חתימה לא תקינה מהתחברות לא מאומתת ", "Backup has an invalid signature from verified session ": "לגיבוי יש חתימה לא תקינה מהתחברות מאומתת ", - "Backup has a valid signature from verified session ": "לגיבוי יש חתימה תקפה מהתחברות מאומתת ", - "Backup has a valid signature from unverified session ": "לגיבוי יש חתימה תקפה מהתחברות לא מאומתת ", + "Backup has a valid signature from verified session ": "לגיבוי יש חתימה תקפה מ התחברות מאומתת ממושב ", + "Backup has a valid signature from unverified session ": "לגיבוי יש חתימה תקפה מהתחברות לא מאומתת ממושב ", "Backup has an invalid signature from this session": "לגיבוי יש חתימה לא תקפה מהפעלה זו", "Backup has a valid signature from this session": "לגיבוי יש חתימה תקפה מהפעלה זו", "Backup has a signature from unknown session with ID %(deviceId)s": "לגיבוי יש חתימה מ- לא ידוע עם %(deviceId)s", - "Backup has a signature from unknown user with ID %(deviceId)s": "לגיבוי יש חתימה ממשתמש לא ידוע עם ID% (deviceId) s", + "Backup has a signature from unknown user with ID %(deviceId)s": "לגיבוי יש חתימה ממשתמש לא ידוע עם ID%(deviceId)s", "Backup has a invalid signature from this user": "לגיבוי יש חתימה לא תקפה ממשתמש זה", "Backup has a valid signature from this user": "לגיבוי יש חתימה תקפה ממשתמש זה", "All keys backed up": "כל המפתחות מגובים", "Backing up %(sessionsRemaining)s keys...": "מגבה מפתחות %(sessionsRemaining)s...", "Connect this session to Key Backup": "חבר את התחברות הזו לגיבוי מפתח", "Connect this session to key backup before signing out to avoid losing any keys that may only be on this session.": "חבר את ההפעלה הזו לגיבוי המפתח לפני היציאה, כדי למנוע אובדן מפתחות שיכולים להיות רק בפגישה זו.", - "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "הפעלה זו אינה מגבה את המפתחות שלך , אך יש לך גיבוי קיים ממנו תוכל לשחזר ולהוסיף להמשך.", + "This session is not backing up your keys, but you do have an existing backup you can restore from and add to going forward.": "הפעלה זו אינה מגבה את המפתחות שלך , אך יש לך גיבוי קיים ממנו תוכל לשחזר ולהוסיף להמשך.", "This session is backing up your keys. ": "ההתחברות הזו תגבה את כל המפתחות שלכם. ", "Restore from Backup": "שחזר מגיבוי", "Unable to load key backup status": "לא ניתן לטעון את מצב גיבוי המפתח", @@ -874,7 +874,7 @@ "The integration manager is offline or it cannot reach your homeserver.": "מנהל האינטגרציה לא מקוון או שהוא לא יכול להגיע לשרת הבית שלך.", "Cannot connect to integration manager": "לא ניתן להתחבר אל מנהל האינטגרציה", "Connecting to integration manager...": "מתחבר למנהל האינטגרציה ...", - "%(brand)s can't securely cache encrypted messages locally while running in a web browser. Use %(brand)s Desktop for encrypted messages to appear in search results.": "%(brand)s אינם יכולים לשמור במטמון מאובטח הודעות מוצפנות באופן מקומי בזמן שהם פועלים בדפדפן אינטרנט. השתמש ב- % (brand) s Desktop כדי שהודעות מוצפנות יופיעו בתוצאות החיפוש.", + "%(brand)s can't securely cache encrypted messages locally while running in a web browser. Use %(brand)s Desktop for encrypted messages to appear in search results.": "%(brand)s אינם יכולים לשמור במטמון מאובטח הודעות מוצפנות באופן מקומי בזמן שהם פועלים בדפדפן אינטרנט. השתמש ב- %(brand)s Desktop כדי שהודעות מוצפנות יופיעו בתוצאות החיפוש.", "%(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 חסרים כמה רכיבים הנדרשים לצורך אחסון במטמון מאובטח של הודעות מוצפנות באופן מקומי. אם תרצה להתנסות בתכונה זו, בנה %(brand)s מותאם אישית לדסקטום עם חפש רכיבים להוספה.", "Securely cache encrypted messages locally for them to appear in search results.": "שמור באופן מאובטח הודעות מוצפנות באופן מקומי כדי שיופיעו בתוצאות החיפוש.", "Manage": "ניהול", @@ -1282,7 +1282,7 @@ "Unable to find profiles for the Matrix IDs listed below - would you like to invite them anyway?": "לא הצלחת למצוא פרופילים עבור מזהי המטריצה המפורטים להלן - האם תרצה להזמין אותם בכל זאת?", "The following users may not exist": "המשתמשים הבאים עשויים שלא להתקיים", "Use an identity server to invite by email. Manage in Settings.": "השתמש בשרת זהות כדי להזמין בדוא\"ל. לנהל ב הגדרות.", - "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "השתמש בשרת זהות כדי להזמין בדוא\"ל. השתמש בברירת המחדל (%(defaultIdentityServerName)) או נהל ב הגדרות.", + "Use an identity server to invite by email. Use the default (%(defaultIdentityServerName)s) or manage in Settings.": "השתמש בשרת זהות כדי להזמין בדוא\"ל. השתמש בברירת המחדל (%(defaultIdentityServerName)s) או נהל ב הגדרות.", "Try using one of the following valid address types: %(validTypesList)s.": "נסה להשתמש באחד מסוגי הכתובות החוקיים הבאים: %(validTypesList)s.", "You have entered an invalid address.": "הזנת כתובת לא חוקית.", "That doesn't look like a valid email address": "זה לא נראה כמו כתובת דוא\"ל תקפה", @@ -2002,7 +2002,7 @@ "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "מנהלי שילוב מקבלים נתוני תצורה ויכולים לשנות ווידג'טים, לשלוח הזמנות לחדר ולהגדיר רמות הספק מטעמכם.", "Manage integrations": "נהל שילובים", "Use an Integration Manager to manage bots, widgets, and sticker packs.": "השתמש במנהל שילוב לניהול בוטים, ווידג'טים וחבילות מדבקות.", - "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "השתמש במנהל שילוב (%(serverName) s) לניהול בוטים, ווידג'טים וחבילות מדבקות.", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "השתמש במנהל שילוב (%(serverName)s) לניהול בוטים, ווידג'טים וחבילות מדבקות.", "Change": "שנה", "Enter a new identity server": "הכנס שרת הזדהות חדש", "Do not use an identity server": "אל תשתמש בשרת הזדהות", @@ -2448,5 +2448,299 @@ "Feedback sent": "משוב נשלח", "An error has occurred.": "קרתה שגיאה.", "Update community": "עדכן קהילה", - "There was an error updating your community. The server is unable to process your request.": "אירעה שגיאה בעדכון הקהילה שלך. השרת אינו יכול לעבד את בקשתך." + "There was an error updating your community. The server is unable to process your request.": "אירעה שגיאה בעדכון הקהילה שלך. השרת אינו יכול לעבד את בקשתך.", + "Transfer": "לְהַעֲבִיר", + "Failed to transfer call": "העברת השיחה נכשלה", + "A call can only be transferred to a single user.": "ניתן להעביר שיחה רק למשתמש יחיד.", + "End": "מקש סוף", + "Space": "מקש רווח", + "Enter": "מקש אנטר", + "Esc": "אסקייפ Esc", + "Page Down": "עמוד למטה", + "Page Up": "גלול למעלה", + "Cancel autocomplete": "בטל השלמה אוטומטית", + "Move autocomplete selection up/down": "הזז את הבחירה בהשלמה אוטומטית למעלה / למטה", + "Go to Home View": "עבור אל תצוגת הבית", + "Toggle this dialog": "החלף דו-שיח זה", + "Toggle right panel": "החלף את החלונית הימנית", + "Activate selected button": "הפעל את הלחצן שנבחר", + "Close dialog or context menu": "סגור את תיבת הדו-שיח או את תפריט ההקשר", + "Toggle the top left menu": "החלף את התפריט הימני העליון", + "Previous/next room or DM": "החדר הקודם / הבא או DM", + "Previous/next unread room or DM": "חדר שלא נקרא / DM הקודם / הבא", + "Clear room list filter field": "נקה את שדה הסינון של רשימת החדרים", + "Expand room list section": "הרחב את קטע רשימת החדרים", + "Collapse room list section": "כווץ את קטע רשימת החדרים", + "Select room from the room list": "בחר חדר מרשימת החדרים", + "Navigate up/down in the room list": "נווט למעלה / למטה ברשימת החדרים", + "Jump to room search": "קפצו לחיפוש חדרים", + "Upload a file": "לעלות קובץ", + "Jump to oldest unread message": "קפיצה להודעה הוותיקה ביותר שלא נקראה", + "Dismiss read marker and jump to bottom": "דחה את סמן הקריאה וקפוץ לתחתית", + "Scroll up/down in the timeline": "גלול למעלה / למטה בציר הזמן", + "Toggle video on/off": "הפעל / כבה את הסרטון", + "Toggle microphone mute": "החלף השתקה של מיקרופון", + "Cancel replying to a message": "בטל מענה להודעה", + "Navigate composer history": "נווט בהיסטוריית המלחין", + "Jump to start/end of the composer": "קפיצה להתחלה / סוף של המלחין", + "Navigate recent messages to edit": "נווט בהודעות אחרונות לעריכה", + "New line": "שורה חדשה", + "Toggle Quote": "גרשיים", + "Toggle Italics": "אותיות נטויות", + "Toggle Bold": "הדגשת אותיות", + "Ctrl": "קונטרול", + "Super": "סופר", + "Shift": "הזזה", + "Alt Gr": "החלפה ל Gr", + "Alt": "החלפה", + "Autocomplete": "השלמה אוטומטית", + "Room List": "רשימת חדרים", + "Calls": "שיחות", + "Navigation": "ניווט", + "Message downloading sleep time(ms)": "הורדת זמן שינה (ms)", + "%(doneRooms)s out of %(totalRooms)s": "%(doneRooms)s מתוך %(totalRooms)s", + "Indexed rooms:": "חדרים רשומים:", + "Indexed messages:": "הודעות באינדקס:", + "Space used:": "שטח משומש:", + "%(brand)s is securely caching encrypted messages locally for them to appear in search results:": "%(brand)s מאחסן באופן מאובטח הודעות מוצפנות באופן מקומי כדי שיופיעו בתוצאות החיפוש:", + "Currently indexing: %(currentRoom)s": "אינדקס כרגע: %(currentRoom)s", + "Not currently indexing messages for any room.": "כרגע לא מוסיף לאינדקס הודעות עבור אף חדר.", + "Disable": "השבת", + "If disabled, messages from encrypted rooms won't appear in search results.": "אם מושבת, הודעות מחדרים מוצפנים לא יופיעו בתוצאות החיפוש.", + "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.": "אם לא הסרת את שיטת השחזור, ייתכן שתוקף מנסה לגשת לחשבונך. שנה את סיסמת החשבון שלך והגדר מיד שיטת שחזור חדשה בהגדרות.", + "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.": "אם עשית זאת בטעות, באפשרותך להגדיר הודעות מאובטחות בהפעלה זו אשר תצפין מחדש את היסטוריית ההודעות של הפגישה בשיטת שחזור חדשה.", + "This session has detected that your recovery passphrase and key for Secure Messages have been removed.": "בפגישה זו זוהה כי ביטוי הסיסמה והמפתח לשחזור שלך עבור הודעות מאובטחות הוסר.", + "Recovery Method Removed": "שיטת השחזור הוסרה", + "Set up Secure Messages": "הגדר הודעות מאובטחות", + "Go to Settings": "עבור להגדרות", + "This session is encrypting history using the new recovery method.": "הפעלה זו היא הצפנת היסטוריה בשיטת השחזור החדשה.", + "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.": "אם לא הגדרת את שיטת השחזור החדשה, ייתכן שתוקף מנסה לגשת לחשבונך. שנה את סיסמת החשבון שלך והגדר מיד שיטת שחזור חדשה בהגדרות.", + "A new recovery passphrase and key for Secure Messages have been detected.": "ביטוי סיסמה ומפתח שחזור חדשים עבור הודעות מאובטחות זוהו.", + "New Recovery Method": "שיטת שחזור חדשה", + "Import": "יבא", + "File to import": "קובץ ליבא", + "The export file will be protected with a passphrase. You should enter the passphrase here, to decrypt the file.": "קובץ הייצוא יהיה מוגן באמצעות משפט סיסמה. עליך להזין כאן את משפט הסיסמה כדי לפענח את הקובץ.", + "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.": "תהליך זה מאפשר לך לייבא מפתחות הצפנה שייצאת בעבר מלקוח מטריקס אחר. לאחר מכן תוכל לפענח את כל ההודעות שהלקוח האחר יכול לפענח.", + "Import room keys": "יבא מפתחות חדר", + "Export": "יצא", + "Confirm passphrase": "אשר ביטוי", + "Enter passphrase": "הזן ביטוי סיסמה", + "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.": "הקובץ המיוצא יאפשר לכל מי שיוכל לקרוא אותו לפענח את כל ההודעות המוצפנות שאתה יכול לראות, לכן עליך להקפיד לשמור עליו מאובטח. כדי לעזור בכך, עליך להזין משפט סיסמה למטה, שישמש להצפנת הנתונים המיוצאים. ניתן יהיה לייבא את הנתונים רק באמצעות אותו ביטוי סיסמה.", + "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.": "תהליך זה מאפשר לך לייצא את המפתחות להודעות שקיבלת בחדרים מוצפנים לקובץ מקומי. לאחר מכן תוכל לייבא את הקובץ ללקוח מטריקס אחר בעתיד, כך שלקוח יוכל גם לפענח הודעות אלה.", + "Export room keys": "ייצא מפתחות לחדר", + "Unknown error": "שגיאה לא ידועה", + "Passphrase must not be empty": "ביטוי הסיסמה לא יכול להיות ריק", + "Passphrases must match": "ביטויי סיסמה חייבים להתאים", + "Unable to set up secret storage": "לא ניתן להגדיר אחסון סודי", + "Save your Security Key": "שמור את מפתח האבטחה שלך", + "Confirm Security Phrase": "אשר את ביטוי האבטחה", + "Set a Security Phrase": "הגדר ביטוי אבטחה", + "Upgrade your encryption": "שדרג את ההצפנה שלך", + "You can also set up Secure Backup & manage your keys in Settings.": "אתה יכול גם להגדיר גיבוי מאובטח ולנהל את המפתחות שלך בהגדרות.", + "If you cancel now, you may lose encrypted messages & data if you lose access to your logins.": "אם תבטל עכשיו, אתה עלול לאבד הודעות ונתונים מוצפנים אם תאבד את הגישה לכניסות שלך.", + "Unable to query secret storage status": "לא ניתן לשאול על סטטוס האחסון הסודי", + "Store your Security Key somewhere safe, like a password manager or a safe, as it’s used to safeguard your encrypted data.": "אחסן את מפתח האבטחה שלך במקום בטוח, כמו מנהל סיסמאות או כספת, מכיוון שהוא משמש כדי להגן על הנתונים המוצפנים שלך.", + "Enter your recovery passphrase a second time to confirm it.": "הזן את משפט סיסמת ההתאוששות שלך בפעם השנייה כדי לאשר זאת.", + "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.": "הזן ביטוי אבטחה רק אתה מכיר, מכיוון שהוא משמש כדי להגן על הנתונים שלך. כדי להיות בטוח, אתה לא צריך להשתמש מחדש בסיסמת החשבון שלך.", + "Upgrade this session to allow it to verify other sessions, granting them access to encrypted messages and marking them as trusted for other users.": "שדרג את ההפעלה הזו כדי לאפשר לה לאמת פעילויות אחרות, הענק להם גישה להודעות מוצפנות וסמן אותן כאמינות עבור משתמשים אחרים.", + "You'll need to authenticate with the server to confirm the upgrade.": "יהיה עליך לבצע אימות מול השרת כדי לאשר את השדרוג.", + "Restore": "לשחזר", + "Restore your key backup to upgrade your encryption": "שחזר את גיבוי המפתח שלך כדי לשדרג את ההצפנה שלך", + "Enter your account password to confirm the upgrade:": "הזן את סיסמת החשבון שלך כדי לאשר את השדרוג:", + "Safeguard against losing access to encrypted messages & data by backing up encryption keys on your server.": "הגן מפני אובדן גישה להודעות ונתונים מוצפנים על ידי גיבוי של מפתחות הצפנה בשרת שלך.", + "Use a secret phrase only you know, and optionally save a Security Key to use for backup.": "השתמש בביטוי סודי רק אתה מכיר, ושמור שמור מפתח אבטחה לשימוש לגיבוי.", + "Enter a Security Phrase": "הזן ביטוי אבטחה", + "We’ll generate a Security Key for you to store somewhere safe, like a password manager or a safe.": "ניצור עבורך מפתח אבטחה לאחסון בטוח, כמו מנהל סיסמאות או כספת.", + "Generate a Security Key": "צור מפתח אבטחה", + "Unable to create key backup": "לא ניתן ליצור גיבוי מפתח", + "Create key backup": "צור מפתח גיבוי", + "Success!": "הצלחה!", + "Starting backup...": "מתחיל גיבוי...", + "Make a copy of your recovery key": "צור עותק של מפתח השחזור שלך", + "Confirm your recovery passphrase": "אשר את משפט סיסמת ההתאוששות שלך", + "Secure your backup with a recovery passphrase": "אבטח את הגיבוי שלך עם משפט סיסמה לשחזור", + "Set up Secure Message Recovery": "הגדר שחזור הודעות מאובטח", + "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.": "מבלי להגדיר שחזור הודעות מאובטח, לא תוכל לשחזר את היסטוריית ההודעות המוצפנת שלך אם אתה מתנתק או משתמש בהפעלה אחרת.", + "Your keys are being backed up (the first backup could take a few minutes).": "גיבוי המפתחות שלך (הגיבוי הראשון יכול לקחת מספר דקות).", + "Copy it to your personal cloud storage": " העתק אותו לאחסון הענן האישי שלך", + "Save it on a USB key or backup drive": " שמור אותו במפתח USB או בכונן גיבוי", + "Print it and store it somewhere safe": " הדפיסו אותו ואחסנו במקום בטוח", + "Your recovery key is in your Downloads folder.": "מפתח השחזור שלך נמצא בתיקיה הורדות .", + "Your recovery key has been copied to your clipboard, paste it to:": "מפתח השחזור שלך הועתק אל הלוח שלך , הדבק אותו ל:", + "Download": "הורדה", + "Your recovery key": "מפתח ההתאוששות שלך", + "Keep a copy of it somewhere secure, like a password manager or even a safe.": "שמור עותק ממנו במקום מאובטח, כמו מנהל סיסמאות או אפילו כספת.", + "Your recovery key is a safety net - you can use it to restore access to your encrypted messages if you forget your recovery passphrase.": "מפתח השחזור שלך הוא רשת ביטחון - אתה יכול להשתמש בו כדי להחזיר את הגישה להודעות המוצפנות שלך אם תשכח את משפט הסיסמה לשחזור שלך.", + "Repeat your recovery passphrase...": "חזור על משפט סיסמת ההתאוששות שלך ...", + "Please enter your recovery passphrase a second time to confirm.": "אנא הזן את משפט סיסמת השחזור שלך בפעם השנייה כדי לאשר.", + "Go back to set it again.": "חזור להגדיר אותו שוב.", + "That doesn't match.": "זה לא תואם.", + "Use a different passphrase?": "להשתמש בביטוי סיסמה אחר?", + "That matches!": "זה מתאים!", + "Set up with a recovery key": "הגדר עם מפתח שחזור", + "Great! This recovery passphrase looks strong enough.": "גדול! ביטוי סיסמה לשחזור זה נראה מספיק חזק.", + "Enter a recovery passphrase": "הזן ביטוי סיסמה לשחזור", + "For maximum security, this should be different from your account password.": "ליתר ביטחון, זה צריך להיות שונה מסיסמת החשבון שלך.", + "We'll store an encrypted copy of your keys on our server. Secure your backup with a recovery passphrase.": "נאחסן עותק מוצפן של המפתחות שלך בשרת שלנו. אבטח את הגיבוי שלך עם משפט סיסמה לשחזור.", + "User Autocomplete": "השלמה אוטומטית למשתמשים", + "Users": "משתמשים", + "Room Autocomplete": "השלמה אוטומטית לחדרים", + "Notification Autocomplete": "השלמה אוטומטית להתראות", + "Room Notification": "הודעת חדר", + "Notify the whole room": "הודע לכל החדר", + "Emoji Autocomplete": "השלמה אוטומטית של אימוג'י", + "Emoji": "אימוג'י", + "DuckDuckGo Results": "תוצאות DuckDuckGo", + "Results from DuckDuckGo": "תוצאות מ- DuckDuckGo", + "Community Autocomplete": "השלמה אוטומטית של קהילות", + "Command Autocomplete": "השלמה אוטומטית של פקודות", + "Commands": "פקודות", + "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.": "אזהרה: הנתונים האישיים שלך (כולל מפתחות הצפנה) עדיין נשמרים בפגישה זו. נקה זאת אם סיימת להשתמש בהפעלה זו, או אם ברצונך להיכנס לחשבון אחר.", + "Clear personal data": "נקה מידע אישי", + "You're signed out": "התנתקתם", + "You cannot sign in to your account. Please contact your homeserver admin for more information.": "אינך יכול להיכנס לחשבונך. אנא פנה למנהל שרת הבית שלך למידע נוסף.", + "Sign in and regain access to your account.": "היכנס וקבל שוב גישה לחשבונך.", + "Forgotten your password?": "שכחת את הסיסמה שלך?", + "Enter your password to sign in and regain access to your account.": "הזן את הסיסמה שלך כדי להיכנס לחזרה ולחזור אליה.", + "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.": "השיב שוב גישה לחשבונך ושחזר מפתחות הצפנה המאוחסנים בהפעלה זו. בלעדיהם, לא תוכל לקרוא את כל ההודעות המאובטחות שלך בשום הפעלה.", + "Failed to re-authenticate": "האימות מחדש נכשל", + "Incorrect password": "סיסמה שגויה", + "Failed to re-authenticate due to a homeserver problem": "האימות מחדש נכשל עקב בעיית שרת בית", + "Without completing security on this session, it won’t have access to encrypted messages.": "מבלי להשלים את האבטחה במפגש זה, לא תהיה לו גישה להודעות מוצפנות.", + "Your new session is now verified. Other users will see it as trusted.": "ההפעלה החדשה שלך אומתה. משתמשים אחרים יראו בכך אמין.", + "Your new session is now verified. It has access to your encrypted messages, and other users will see it as trusted.": "ההפעלה החדשה שלך אומתה. יש לו גישה להודעות המוצפנות שלך, ומשתמשים אחרים יראו בכך אמינים.", + "or another cross-signing capable Matrix client": "או לקוח מטריקס אחר עם יכולת חתימה צולבת", + "%(brand)s Android": "%(brand)s אנדרויד", + "%(brand)s iOS": "%(brand)s אפל", + "%(brand)s Desktop": "%(brand)s למחשב דסקטופ", + "%(brand)s Web": "%(brand)s ברשת", + "This requires the latest %(brand)s on your other devices:": "לשם כך נדרשים האחוזים האחרונים %(brand)s במכשירים האחרים שלך:", + "Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "אשר את זהותך על ידי אימות התחברות זו מאחד מהפגישות האחרות שלך, והעניק לה גישה להודעות מוצפנות.", + "Use Recovery Key": "השתמש במפתח שחזור", + "Use Recovery Key or Passphrase": "השתמש במפתח השחזור או בביטוי הסיסמה", + "Decide where your account is hosted": "החלט היכן מתארח חשבונך", + "Host account on": "חשבון מארח ב", + "Create account": "צור חשבון", + "Registration Successful": "ההרשמה בוצעה בהצלחה", + "You can now close this window or log in to your new account.": "כעת תוכלו לסגור חלון זה או להיכנס לחשבונכם החדש.", + "Log in to your new account.": " היכנס לחשבונך החדש.", + "Continue with previous account": "המשך בחשבון הקודם", + "Your new account (%(newAccountId)s) is registered, but you're already logged into a different account (%(loggedInUserId)s).": "החשבון החדש שלך (%(newAccountId)s) רשום, אך אתה כבר מחובר לחשבון אחר (%(loggedInUserId)s).", + "Already have an account? Sign in here": "כבר יש לכם חשבון? היכנסו כאן ", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s או %(usernamePassword)s", + "Continue with %(ssoButtons)s": "המשך עם %(ssoButtons)s", + "That username already exists, please try another.": "שם משתמש זה כבר קיים, אנא נסה אחר.", + "This server does not support authentication with a phone number.": "שרת זה אינו תומך באימות עם מספר טלפון.", + "Registration has been disabled on this homeserver.": "ההרשמה הושבתה בשרת הבית הזה.", + "Unable to query for supported registration methods.": "לא ניתן לשאול לשיטות רישום נתמכות.", + "New? Create account": "חָדָשׁ? צור חשבון ", + "If you've joined lots of rooms, this might take a while": "אם הצטרפת להרבה חדרים, זה עשוי לקחת זמן מה", + "Signing In...": "מתחבר...", + "Syncing...": "מסנכרן...", + "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.": "לא ניתן להתחבר לשרת ביתי באמצעות HTTP כאשר כתובת HTTPS נמצאת בסרגל הדפדפן שלך. השתמש ב- HTTPS או הפעל סקריפטים לא בטוחים .", + "There was a problem communicating with the homeserver, please try again later.": "הייתה תקשורת עם שרת הבית. נסה שוב מאוחר יותר.", + "This homeserver doesn't offer any login flows which are supported by this client.": "שרת בית זה אינו מציע זרמי התחברות הנתמכים על ידי לקוח זה.", + "Failed to perform homeserver discovery": "נכשל גילוי שרת הבית", + "Please note you are logging into the %(hs)s server, not matrix.org.": "שים לב שאתה מתחבר לשרת %(hs)s, לא ל- matrix.org.", + "Incorrect username and/or password.": "שם משתמש ו / או סיסמה שגויים.", + "This account has been deactivated.": "חשבון זה הושבת.", + "Please contact your service administrator to continue using this service.": "אנא פנה למנהל השירות שלך כדי להמשיך להשתמש בשירות זה.", + "This homeserver does not support login using email address.": "שרת בית זה אינו תומך בכניסה באמצעות כתובת דוא\"ל.", + "General failure": "שגיאה כללית", + "Identity server URL does not appear to be a valid identity server": "נראה שכתובת האתר של שרת זהות אינה שרת זהות חוקי", + "Invalid base_url for m.identity_server": "Base_url לא חוקי עבור m.identity_server", + "Invalid identity server discovery response": "תגובת גילוי שרת זהות לא חוקית", + "Homeserver URL does not appear to be a valid Matrix homeserver": "נראה שכתובת האתר של שרת הבית אינה שרת ביתי של מטריקס", + "Invalid base_url for m.homeserver": "Base_url לא חוקי עבור m.homeserver", + "Failed to get autodiscovery configuration from server": "קבלת תצורת הגילוי האוטומטי מהשרת נכשלה", + "Invalid homeserver discovery response": "תגובת גילוי שרת בית לא חוקית", + "Set a new password": "הגדר סיסמה חדשה", + "Return to login screen": "חזור למסך הכניסה", + "You have been logged out of all sessions and will no longer receive push notifications. To re-enable notifications, sign in again on each device.": "הוצאת מכל ההפעלות ולא תקבל עוד התראות דחיפה. כדי להפעיל מחדש את ההתראות, היכנס שוב בכל מכשיר.", + "Your password has been reset.": "הסיסמה שלך אופסה.", + "I have verified my email address": "אימתתי את כתובת הדוא\"ל שלי", + "An email has been sent to %(emailAddress)s. Once you've followed the link it contains, click below.": "דוא\"ל נשלח אל %(emailAddress)s. לאחר שתעקוב אחר הקישור שהוא מכיל, לחץ למטה.", + "Sign in instead": "היכנס במקום זאת", + "Send Reset Email": "שלח איפוס אימייל", + "A verification email will be sent to your inbox to confirm setting your new password.": "דוא\"ל אימות יישלח לתיבת הדואר הנכנס שלך כדי לאשר את הגדרת הסיסמה החדשה שלך.", + "New Password": "סיסמה חדשה", + "Changing your password will reset any end-to-end encryption keys on all of your sessions, making encrypted chat history unreadable. Set up Key Backup or export your room keys from another session before resetting your password.": "שינוי הסיסמה יאפס את כל מפתחות ההצפנה מקצה לקצה בכל ההפעלות שלך, מה שהופך את היסטוריית הצ'אט המוצפנת לבלתי קריאה. הגדר גיבוי מקשים או ייצא את מפתחות החדר שלך מהפעלה אחרת לפני איפוס הסיסמה שלך.", + "New passwords must match each other.": "סיסמאות חדשות חייבות להתאים זו לזו.", + "A new password must be entered.": "יש להזין סיסמה חדשה.", + "The email address linked to your account must be entered.": "יש להזין את כתובת הדוא\"ל המקושרת לחשבונך.", + "Failed to send email": "כשלון בשליחת מייל", + "Session verified": "מושב נכשל", + "Verify this login": "אמת את הכניסה הזאת", + "Could not load user profile": "לא ניתן לטעון את פרופיל המשתמש", + "Community and user menu": "תפריט משתמש וקהילה", + "User menu": "תפריט משתמש", + "Switch theme": "שנה ערכת נושא", + "Switch to dark mode": "שנה למצב כהה", + "Switch to light mode": "שנה למצב בהיר", + "User settings": "הגדרות משתמש", + "Community settings": "הגדרות קהילה", + "All settings": "כל ההגדרות", + "Security & privacy": "אבטחה ופרטיות", + "Notification settings": "הגדרות התראה", + "New here? Create an account": "חדש פה? צור חשבון ", + "Got an account? Sign in": "יש לך חשבון? היכנס ", + "Failed to find the general chat for this community": "מציאת הצ'אט הכללי לקהילה זו נכשלה", + "Uploading %(filename)s and %(count)s others|one": "מעלה %(filename)s ו-%(count)s אחרים", + "Uploading %(filename)s and %(count)s others|zero": "מעלה %(filename)s", + "Uploading %(filename)s and %(count)s others|other": "מעלה %(filename)s ו-%(count)s אחרים", + "Failed to load timeline position": "טעינת מיקום ציר הזמן נכשלה", + "Tried to load a specific point in this room's timeline, but was unable to find it.": "ניסה לטעון נקודה מסוימת בציר הזמן של החדר הזה, אך לא הצליח למצוא אותה.", + "Tried to load a specific point in this room's timeline, but you do not have permission to view the message in question.": "ניסיתי לטעון נקודה ספציפית בציר הזמן של החדר הזה, אך אין לך הרשאה להציג את ההודעה המדוברת.", + "You have %(count)s unread notifications in a prior version of this room.|one": "יש לך %(count)s הודעה שלא נקראה בגירסה קודמת של חדר זה.", + "You have %(count)s unread notifications in a prior version of this room.|other": "יש לך %(count)s הודעות שלא נקראו בגרסה קודמת של חדר זה.", + "Failed to reject invite": "דחיית הזמנה נכשלה", + "Room": "חדר", + "No more results": "אין יותר תוצאות", + "Server may be unavailable, overloaded, or search timed out :(": "יתכן שהשרת לא יהיה זמין, עמוס יתר על המידה או שתם הזמן הקצוב לחיפוש :(", + "Search failed": "החיפוש נכשל", + "You seem to be in a call, are you sure you want to quit?": "נראה שאתה בשיחה, האם אתה בטוח שאתה רוצה להפסיק?", + "You seem to be uploading files, are you sure you want to quit?": "נראה שאתה מעלה קבצים, האם אתה בטוח שברצונך להפסיק?", + "Sent messages will be stored until your connection has returned.": "הודעות שנשלחו יאוחסנו עד שהחיבור שלך יחזור.", + "Connectivity to the server has been lost.": "הקישוריות לשרת אבדה.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|one": " שלח הכל מחדש או בטל הכל עכשיו. אתה יכול גם לבחור הודעות בודדות לשליחה מחדש או לביטול.", + "%(count)s Resend all or cancel all now. You can also select individual messages to resend or cancel.|other": " שלח הכל מחדש או בטל הכל עכשיו. אתה יכול גם לבחור הודעות בודדות לשליחה מחדש או לביטול.", + "%(count)s of your messages have not been sent.|one": "ההודעה שלך לא נשלחה.", + "%(count)s of your messages have not been sent.|other": "חלק מההודעות שלך לא נשלחו.", + "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.": "ההודעה שלך לא נשלחה מכיוון ששרת הבתים הזה הגיע למגבלת המשתמשים הפעילים החודשיים שלה. אנא פנה למנהל השירות שלך כדי להמשיך להשתמש בשירות.", + "You can't send any messages until you review and agree to our terms and conditions.": "אינך יכול לשלוח שום הודעה עד שתבדוק ותסכים ל התנאים וההגבלות שלנו .", + "Filter rooms and people": "סנן חדרים ואנשים", + "Clear filter": "נקה מסנן", + "Filter": "סנן", + "Explore rooms in %(communityName)s": "חקור חדרים בקהילת %(communityName)s", + "If you can't find the room you're looking for, ask for an invite or Create a new room.": "אם אינך מוצא את החדר שאתה מחפש, בקש הזמנה או צור חדר חדש .", + "Find a room… (e.g. %(exampleRoom)s)": "מצא חדר (דוגמא: %(exampleRoom)s)", + "Find a room…": "מצא חדר…", + "View": "צפה", + "Preview": "תצוגה מקדימה", + "delete the address.": "מחק את הכתובת.", + "Delete the room address %(alias)s and remove %(name)s from the directory?": "למחוק את כתובת החדר %(alias)s ולהסיר את %(name)s מהספרייה?", + "The homeserver may be unavailable or overloaded.": "שרת הבית עשוי להיות לא זמין או עומס יתר.", + "%(brand)s failed to get the public room list.": "%(brand)s לא הצליחו להשיג את רשימת החדרים הציבוריים.", + "%(brand)s failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "%(brand)s לא הצליחו להשיג את רשימת הפרוטוקולים משרת הבית. שרת הבית עשוי להיות זקן מכדי לתמוך ברשתות צד שלישי.", + "You have no visible notifications.": "אין לך התראות גלויות.", + "You’re all caught up": "כולכם מעודכנים", + "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "צור קהילה שתקבץ משתמשים וחדרים! בנה דף בית מותאם אישית כדי לסמן את החלל שלך ביקום מטריקס.", + "Create a new community": "צור קהילה חדשה", + "Error whilst fetching joined communities": "שגיאה בעת אחזור קהילות שהצטרפו", + "To set up a filter, drag a community avatar over to the filter panel on the far left hand side of the screen. You can click on an avatar in the filter panel at any time to see only the rooms and people associated with that community.": "להגדרת מסנן, גרור אווטאר קהילתי לחלונית המסנן בצד שמאל הקיצוני של המסך. אתה יכול ללחוץ על אווטאר בחלונית המסנן בכל עת כדי לראות רק את החדרים והאנשים המשויכים לקהילה זו.", + "Did you know: you can use communities to filter your %(brand)s experience!": "האם ידעת: תוכל להשתמש בקהילות כדי לסנן את חוויית %(brand)s שלך!", + "Your Communities": "הקהילות שלכם", + "%(creator)s created and configured the room.": "%(creator)s יצא והגדיר את החדר.", + "%(creator)s created this DM.": "%(creator)s יצר את DM הזה.", + "Logout": "יציאה", + "Self-verification request": "בקשה לאימות עצמי", + "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "נתגלו גרסאות ישנות יותר של %(brand)s. זה יגרום לתקלה בקריפטוגרפיה מקצה לקצה בגרסה הישנה יותר. הודעות מוצפנות מקצה לקצה שהוחלפו לאחרונה בעת השימוש בגרסה הישנה עשויות שלא להיות ניתנות לפענוח בגירסה זו. זה עלול גם לגרום להודעות שהוחלפו עם גרסה זו להיכשל. אם אתה נתקל בבעיות, צא וחזור שוב. כדי לשמור על היסטוריית ההודעות, ייצא וייבא מחדש את המפתחות שלך.", + "Old cryptography data detected": "נתגלו נתוני הצפנה ישנים", + "Terms and Conditions": "תנאים והגבלות", + "Review terms and conditions": "עיין בתנאים ובהגבלות", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "כדי להמשיך להשתמש בשרת הבית (%(homeserverDomain)s), עליך לבדוק ולהסכים לתנאים ולהגבלות שלנו.", + "For security, this session has been signed out. Please sign in again.": "למען ביטחון, הפגישה הזו נותקה. אנא היכנסו שוב.", + "Signed Out": "יציאה" } From 41cfb8757b92f1ff5e5a8cb7c1ddab788a237397 Mon Sep 17 00:00:00 2001 From: Szimszon Date: Tue, 5 Jan 2021 18:41:10 +0000 Subject: [PATCH 121/231] Translated using Weblate (Hungarian) Currently translated at 100.0% (2721 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/hu/ --- src/i18n/strings/hu.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 17f139a4f1..eb03026096 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -2975,5 +2975,8 @@ "Sends the given message with snowfall": "Az üzenet elküldése hóeséssel", "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." + "You have no visible notifications.": "Nincsenek látható értesítések.", + "Transfer": "Átadás", + "Failed to transfer call": "A hívás átadása nem sikerült", + "A call can only be transferred to a single user.": "Csak egy felhasználónak lehet átadni a hívást." } From c91cfaf8491b9d6566062654b4d2807f38103c3a Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Thu, 7 Jan 2021 03:33:38 +0000 Subject: [PATCH 122/231] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2721 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 9a81f4f21c..228fa19817 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2983,5 +2983,8 @@ "You held the call Switch": "您已保留通話 切換", "sends snowfall": "傳送雪球", "Sends the given message with snowfall": "與雪球一同傳送指定訊息", - "You have no visible notifications.": "您沒有可見的通知。" + "You have no visible notifications.": "您沒有可見的通知。", + "Transfer": "傳輸", + "Failed to transfer call": "傳輸通話失敗", + "A call can only be transferred to a single user.": "一個通話只能傳輸給ㄧ個使用者。" } From 36553f831c9f77a2b0a1d8650ae6f11f1594a3e0 Mon Sep 17 00:00:00 2001 From: m4sk1n Date: Tue, 5 Jan 2021 22:39:15 +0000 Subject: [PATCH 123/231] Translated using Weblate (Polish) Currently translated at 68.7% (1872 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pl/ --- src/i18n/strings/pl.json | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index f5171c8472..be30368d9b 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -1970,5 +1970,28 @@ "Mayotte": "Majotta", "Mauritius": "Mauritius", "Mauritania": "Mauretania", - "Martinique": "Martynika" + "Martinique": "Martynika", + "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.", + "You created this room.": "Utworzyłeś(-aś) 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 .", + "%(count)s results|other": "%(count)s wyniki(-ów)", + "Security & privacy": "Bezpieczeństwo i prywatność", + "Start chatting": "Rozpocznij rozmowę", + " wants to chat": " chce porozmawiać", + "Rejecting invite …": "Odrzucanie zaproszenia…", + "Use the + to make a new room or explore existing ones below": "Użyj + aby utworzyć nowy pokój, lub przeglądaj istniejące poniżej", + "%(count)s results|one": "%(count)s wynik", + "Custom Tag": "Niestandardowy tag", + "Explore community rooms": "Przeglądaj pokoje społeczności", + "Hide Widgets": "Ukryj widgety", + "No recently visited rooms": "Brak ostatnio odwiedzonych pokoi", + "Show Widgets": "Pokaż widgety", + "Can't see what you’re looking for?": "Nie możesz znaleźć tego, czego szukasz?", + "Start a new chat": "Rozpocznij nową rozmowę" } From 3ac300aa243938ce5b898d086c3a3f746cd00a0b Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Tue, 5 Jan 2021 20:04:27 +0000 Subject: [PATCH 124/231] Translated using Weblate (Czech) Currently translated at 100.0% (2721 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 09526b304f..a62ae4d063 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2894,5 +2894,8 @@ "You held the call Switch": "Podrželi jste hovor Přepnout", "sends snowfall": "pošle sněžení", "Sends the given message with snowfall": "Pošle zprávu se sněžením", - "You have no visible notifications.": "Nejsou dostupná žádná oznámení." + "You have no visible notifications.": "Nejsou dostupná žádná oznámení.", + "Transfer": "Přepojit", + "Failed to transfer call": "Hovor se nepodařilo přepojit", + "A call can only be transferred to a single user.": "Hovor lze přepojit pouze jednomu uživateli." } From d07e49f5a2e4ba3bdea18f5e6fdd8ba941a320c9 Mon Sep 17 00:00:00 2001 From: XoseM Date: Wed, 6 Jan 2021 05:54:19 +0000 Subject: [PATCH 125/231] Translated using Weblate (Galician) Currently translated at 100.0% (2721 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index c8d828894a..a2083438f5 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2980,5 +2980,8 @@ "You held the call Switch": "Pausaches a chamada Cambiar", "sends snowfall": "envía neve", "Sends the given message with snowfall": "Engade neve caendo á mensaxe", - "You have no visible notifications.": "Non tes notificacións visibles." + "You have no visible notifications.": "Non tes notificacións visibles.", + "Transfer": "Transferir", + "Failed to transfer call": "Fallou a transferencia da chamada", + "A call can only be transferred to a single user.": "Unha chamada só se pode transferir a unha única usuaria." } From 18296613802ec3708676d57a0280e802bb6c099c Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Tue, 5 Jan 2021 18:40:03 +0000 Subject: [PATCH 126/231] Translated using Weblate (Albanian) Currently translated at 99.6% (2712 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sq/ --- src/i18n/strings/sq.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index 7720599870..02d206fefe 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -2970,5 +2970,9 @@ "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "E paraprin një mesazh tekst i thjeshtë me (╯°□°)╯︵ ┻━┻", "%(name)s on hold": "%(name)s e mbajtur", "sends snowfall": "dërgon rënie bore", - "Sends the given message with snowfall": "E dërgon mesazhin e dhënë të stolisur me rënie bore" + "Sends the given message with snowfall": "E dërgon mesazhin e dhënë të stolisur me rënie bore", + "You have no visible notifications.": "S’keni njoftime të dukshme.", + "Transfer": "Shpërngule", + "Failed to transfer call": "S’u arrit të shpërngulej thirrje", + "A call can only be transferred to a single user.": "Një thirrje mund të shpërngulet vetëm te një përdorues." } From 84e4e671012926a11b39a4cc338ae86a6d98666f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 5 Jan 2021 19:36:24 +0000 Subject: [PATCH 127/231] Translated using Weblate (Estonian) Currently translated at 100.0% (2721 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 1cd1d5dc63..c42850be5a 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2981,5 +2981,8 @@ "%(name)s on hold": "%(name)s on ootel", "sends snowfall": "saadab lumesaju", "Sends the given message with snowfall": "Saadab antud sõnumi koos lumesajuga", - "You have no visible notifications.": "Sul pole nähtavaid teavitusi." + "You have no visible notifications.": "Sul pole nähtavaid teavitusi.", + "Transfer": "Suuna kõne edasi", + "Failed to transfer call": "Kõne edasisuunamine ei õnnestunud", + "A call can only be transferred to a single user.": "Kõnet on võimalik edasi suunata vaid ühele kasutajale." } From d5fc63378dad06516b9b28458caf7c280c17569a Mon Sep 17 00:00:00 2001 From: Maik Wagner Date: Fri, 8 Jan 2021 16:36:06 +0000 Subject: [PATCH 128/231] Translated using Weblate (German) Currently translated at 100.0% (2721 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 7100cd5005..2a11061ba4 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1633,7 +1633,7 @@ "Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im HTML-Format, ohne sie als Markdown zu darzustellen", "Show rooms with unread notifications first": "Räume mit ungelesenen Benachrichtigungen zuerst zeigen", "Show shortcuts to recently viewed rooms above the room list": "Kurzbefehle zu den kürzlich gesichteten Räumen über der Raumliste anzeigen", - "Use Single Sign On to continue": "Benutze Single Sign-On um fortzufahren", + "Use Single Sign On to continue": "Single Sign On zum Fortfahren nutzen", "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte E-Mail-Adresse mit Single Sign-On, um deine Identität nachzuweisen.", "Single Sign On": "Single Sign-On", "Confirm adding email": "Bestätige hinzugefügte E-Mail-Addresse", From 6c74836a5c0cafdf3249eb676f289af998a984ea Mon Sep 17 00:00:00 2001 From: Ludwig Bald Date: Fri, 8 Jan 2021 16:35:26 +0000 Subject: [PATCH 129/231] Translated using Weblate (German) Currently translated at 100.0% (2721 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 2a11061ba4..c5aa22750b 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -2976,5 +2976,8 @@ "%(name)s on hold": "%(name)s wird gehalten", "You held the call Switch": "Du hältst den Anruf Wechseln", "sends snowfall": "sendet Schneeflocken", - "Sends the given message with snowfall": "Sendet die gewählte Nachricht mit Schneeflocken" + "Sends the given message with snowfall": "Sendet die gewählte Nachricht mit Schneeflocken", + "Transfer": "Übertragen", + "Failed to transfer call": "Anruf-Übertragung fehlgeschlagen", + "A call can only be transferred to a single user.": "Ein Anruf kann nur auf einen einzelnen Nutzer übertragen werden." } From 448a5ea42d28bdb1cd8020b98b639cdb7282012a Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Fri, 8 Jan 2021 18:07:48 +0000 Subject: [PATCH 130/231] Remove replaceableComponentTs from BridgeTile --- src/components/views/settings/BridgeTile.tsx | 2 -- src/utils/replaceableComponent.ts | 9 --------- 2 files changed, 11 deletions(-) diff --git a/src/components/views/settings/BridgeTile.tsx b/src/components/views/settings/BridgeTile.tsx index 1f5448dcc1..58499ebd25 100644 --- a/src/components/views/settings/BridgeTile.tsx +++ b/src/components/views/settings/BridgeTile.tsx @@ -22,7 +22,6 @@ import {MatrixClientPeg} from "../../../MatrixClientPeg"; import Pill from "../elements/Pill"; import {makeUserPermalink} from "../../../utils/permalinks/Permalinks"; import BaseAvatar from "../avatars/BaseAvatar"; -import {replaceableComponentTs} from "../../../utils/replaceableComponent"; import SettingsStore from "../../../settings/SettingsStore"; import {MatrixEvent} from "matrix-js-sdk/src/models/event"; import { Room } from "matrix-js-sdk/src/models/room"; @@ -65,7 +64,6 @@ interface IBridgeStateEvent { }; } -@replaceableComponentTs("views.settings.BridgeTile") export default class BridgeTile extends React.PureComponent { static propTypes = { ev: PropTypes.object.isRequired, diff --git a/src/utils/replaceableComponent.ts b/src/utils/replaceableComponent.ts index 7ea192f76b..8c29fdf037 100644 --- a/src/utils/replaceableComponent.ts +++ b/src/utils/replaceableComponent.ts @@ -38,12 +38,3 @@ export function replaceableComponent(name: string, origComponent: React.Componen // return a falsey value like `null` when the skin doesn't have a component. return () => sdk.getComponent(name) || origComponent; } - -/** - * Typescript-compatible version of `replaceableComponent` - * @see replaceableComponent - * @param {string} name The dot-path name of the component being replaced. - */ -export function replaceableComponentTs(name: string) { - return (origComponent: typeof React.Component) => sdk.getComponent(name) || origComponent; -} From 726dfcc4b8fe0a974548408860bcd8a2c1d352ea Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Fri, 8 Jan 2021 18:08:16 +0000 Subject: [PATCH 131/231] Fix language strings --- src/i18n/strings/ar.json | 2 +- src/i18n/strings/bg.json | 4 ++-- src/i18n/strings/cs.json | 4 ++-- src/i18n/strings/de_DE.json | 2 +- src/i18n/strings/eo.json | 2 +- src/i18n/strings/es.json | 2 +- src/i18n/strings/et.json | 2 +- src/i18n/strings/eu.json | 2 +- src/i18n/strings/fi.json | 2 +- src/i18n/strings/fr.json | 2 +- src/i18n/strings/gl.json | 2 +- src/i18n/strings/hu.json | 2 +- src/i18n/strings/it.json | 2 +- src/i18n/strings/kab.json | 2 +- src/i18n/strings/lt.json | 2 +- src/i18n/strings/nl.json | 2 +- src/i18n/strings/pt_BR.json | 2 +- src/i18n/strings/ru.json | 2 +- src/i18n/strings/sk.json | 2 +- src/i18n/strings/sq.json | 2 +- src/i18n/strings/sv.json | 2 +- src/i18n/strings/tr.json | 2 +- src/i18n/strings/uk.json | 2 +- src/i18n/strings/zh_Hans.json | 2 +- src/i18n/strings/zh_Hant.json | 2 +- 25 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/i18n/strings/ar.json b/src/i18n/strings/ar.json index a58e53555e..8e8ae3f775 100644 --- a/src/i18n/strings/ar.json +++ b/src/i18n/strings/ar.json @@ -1056,7 +1056,7 @@ "Failed to upload profile picture!": "تعذَّر رفع صورة الملف الشخصي!", "Show more": "أظهر أكثر", "Show less": "أظهر أقل", - "Channel: ": "قناة: %(channelName)s", + "Channel: ": "قناة: ", "This bridge is managed by .": "هذا الجسر يديره .", "Upload": "رفع", "Accept to continue:": "قبول للمتابعة:", diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index e4010e8b64..ebe4e65a16 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1840,8 +1840,8 @@ "Other users may not trust it": "Други потребители може да не се доверят", "From %(deviceName)s (%(deviceId)s)": "От %(deviceName)s (%(deviceId)s)", "This bridge was provisioned by .": "Мостът е настроен от .", - "Workspace: %(networkName)s": "Работна област: %(networkName)s", - "Channel: %(channelName)s": "Канал: %(channelName)s", + "Workspace: ": "Работна област: ", + "Channel: ": "Канал: ", "Show less": "Покажи по-малко", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Промяната на паролата в момента би нулирало всички ключове за шифроване-от-край-до-край, правейки историята на чата нечетима, освен ако първо не експортирате ключовете, а след промяната на паролата ги импортирате. В бъдеще, това ще бъде подобрено.", "Your homeserver does not support cross-signing.": "Сървърът ви не поддържа кръстосано-подписване.", diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index 3f9d231317..d4451bb902 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1753,8 +1753,8 @@ "Review": "Prohlédnout", "This bridge was provisioned by .": "Toto propojení poskytuje .", "This bridge is managed by .": "Toto propojení spravuje .", - "Workspace: %(networkName)s": "Pracovní oblast: %(networkName)s", - "Channel: %(channelName)s": "Kanál: %(channelName)s", + "Workspace: ": "Pracovní oblast: ", + "Channel: ": "Kanál: ", "Show less": "Skrýt detaily", "Show more": "Více", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Změna hesla resetuje šifrovací klíče pro všechny vaše relace. Pokud si nejdřív nevyexportujete klíče místností a po změně je znovu neimportujete, nedostanete se k historickým zprávám. V budoucnu se toto zjednoduší.", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 974e002ca8..972440e80a 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1669,7 +1669,7 @@ "This bridge was provisioned by .": "Diese Brücke wurde von bereitgestellt.", "This bridge is managed by .": "Diese Brücke wird von verwaltet.", "Workspace: ": "Arbeitsbereich: ", - "Channel: ": "Kanal: %(channelName)s", + "Channel: ": "Kanal: ", "Show less": "Weniger zeigen", "Warning: You should only set up key backup from a trusted computer.": "Achtung: Du solltest die Schlüsselsicherung nur auf einem vertrauenswürdigen Gerät einrichten.", "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.": "Melde dich an um die ausschließlich in dieser Sitzung gespeicherten Verschlüsselungsschlüssel wiederherzustellen. Du benötigst sie, um deine verschlüsselten Nachrichten in jeder Sitzung zu lesen.", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index 9ea4af86ee..f151d8a857 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -1720,7 +1720,7 @@ "They don't match": "Ili ne akordas", "To be secure, do this in person or use a trusted way to communicate.": "Por plia sekureco, faru tion persone, aŭ uzu alian fidatan komunikilon.", "Verify yourself & others to keep your chats safe": "Kontrolu vin mem kaj aliajn por sekurigi viajn babilojn", - "Channel: ": "Kanalo: %(channelName)s", + "Channel: ": "Kanalo: ", "Show less": "Montri malpli", "Show more": "Montri pli", "Help": "Helpo", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 1635284e58..11c92c9ccf 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1210,7 +1210,7 @@ "Later": "Más tarde", "Upload": "Subir", "Workspace: ": "Espacio de trabajo: ", - "Channel: ": "Canal: %(channelName)s", + "Channel: ": "Canal: ", "Show less": "Mostrar menos", "Show more": "Mostrar más", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Cambiar la contraseña reiniciará cualquier clave de encriptación end-to-end en todas las sesiones, haciendo el historial de conversaciones encriptado ilegible, a no ser que primero exportes tus claves de sala y después las reimportes. En un futuro esto será mejorado.", diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 1d0fe52c0b..3361242ce5 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -1805,7 +1805,7 @@ "This bridge was provisioned by .": "Selle võrgusilla võttis kasutusele .", "This bridge is managed by .": "Seda võrgusilda haldab .", "Workspace: ": "Tööruum: ", - "Channel: ": "Kanal: %(channelName)s", + "Channel: ": "Kanal: ", "Upload new:": "Lae üles uus:", "Export E2E room keys": "Ekspordi jututubade läbiva krüptimise võtmed", "Your homeserver does not support cross-signing.": "Sinu koduserver ei toeta risttunnustamist.", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 37deb7e774..8809129efe 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1806,7 +1806,7 @@ "Review": "Berrikusi", "This bridge was provisioned by .": "Zubi hau erabiltzaileak hornitu du.", "Workspace: ": "Lan eremua: ", - "Channel: ": "Kanala: %(channelName)s", + "Channel: ": "Kanala: ", "Show less": "Erakutsi gutxiago", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Pasahitza aldatzean oraingo muturretik muturrerako zifratze gako guztiak ezeztatuko ditu saio guztietan, zifratutako txaten historiala ezin izango da irakurri ez badituzu aurretik zure geletako gakoak esportatzen eta gero berriro inportatzen. Etorkizunean hau hobetuko da.", "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Zure kontuak zeharkako sinatze identitate bat du biltegi sekretuan, baina saio honek ez du oraindik fidagarritzat.", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index 65c7b41e8c..e4bcc0623d 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -1877,7 +1877,7 @@ "This bridge was provisioned by .": "Tämän sillan tarjoaa käyttäjä .", "This bridge is managed by .": "Tätä siltaa hallinnoi käyttäjä .", "Workspace: ": "Työtila: ", - "Channel: ": "Kanava: %(channelName)s", + "Channel: ": "Kanava: ", "Delete %(count)s sessions|other": "Poista %(count)s istuntoa", "Enable": "Ota käyttöön", "Backup is not signed by any of your sessions": "Mikään istuntosi ei ole allekirjoittanut varmuuskopiota", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index f1cb24a686..8b7e2656ea 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1810,7 +1810,7 @@ "They don't match": "Ils ne correspondent pas", "This bridge was provisioned by .": "Cette passerelle a été fournie par .", "Workspace: ": "Espace de travail : ", - "Channel: ": "Canal : %(channelName)s", + "Channel: ": "Canal : ", "Show less": "En voir moins", "This room is bridging messages to the following platforms. Learn more.": "Ce salon transmet les messages vers les plateformes suivantes. En savoir plus.", "This room isn’t bridging messages to any platforms. Learn more.": "Ce salon ne transmet les messages à aucune plateforme. En savoir plus.", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index 63c7dd2423..d43ff020ab 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -1308,7 +1308,7 @@ "This bridge was provisioned by .": "Esta ponte está proporcionada por .", "This bridge is managed by .": "Esta ponte está xestionada por .", "Workspace: ": "Espazo de traballo: ", - "Channel: ": "Canal: %(channelName)s", + "Channel: ": "Canal: ", "Show less": "Mostrar menos", "Show more": "Mostrar máis", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ao cambiar o contrasinal vas restablecer todas as chaves de cifrado extremo-a-extremo en tódalas sesións, facendo que o historial de conversa cifrado non sexa lexible, a menos que primeiro exportes todas as chaves das salas e as importes posteriormente. No futuro melloraremos o procedemento.", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index 6ced904206..d8d3f01f66 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1794,7 +1794,7 @@ "Review": "Átnéz", "This bridge was provisioned by .": "Ezt a hidat az alábbi felhasználó készítette: .", "Workspace: ": "Munkahely: ", - "Channel: ": "Csatorna: %(channelName)s", + "Channel: ": "Csatorna: ", "Show less": "Kevesebbet mutat", "Securely cache encrypted messages locally for them to appear in search results, using ": "A titkosított üzenetek kereséséhez azokat biztonságos módon helyileg kell tárolnod, felhasználva: ", " to store messages from ": " üzenetek tárolásához ", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 47d7d993d9..616071c785 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1798,7 +1798,7 @@ "Review": "Controlla", "This bridge was provisioned by .": "Questo bridge è stato fornito da .", "Workspace: ": "Spazio di lavoro: ", - "Channel: ": "Canale: %(channelName)s", + "Channel: ": "Canale: ", "Show less": "Mostra meno", "Securely cache encrypted messages locally for them to appear in search results, using ": "Tieni in cache localmente i messaggi cifrati in modo sicuro affinché appaiano nei risultati di ricerca, usando ", " to store messages from ": " per conservare i messaggi da ", diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index aaeb309edb..74b203efb6 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -848,7 +848,7 @@ "This bridge was provisioned by .": "Tileggit-a tella-d sɣur .", "This bridge is managed by .": "Tileggit-a tettusefrak sɣur .", "Workspace: ": "Tallunt n uxeddim: ", - "Channel: ": "Abadu: %(channelName)s", + "Channel: ": "Abadu: ", "Upload new:": "Asali amaynut:", "New passwords don't match": "Awalen uffiren imaynuten ur mṣadan ara", "Passwords can't be empty": "Awalen uffiren ur ilaq ara ad ilin d ilmawen", diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index 8ffc1eac55..b4fc60b931 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -1953,7 +1953,7 @@ "not found in storage": "saugykloje nerasta", "Cross-signing is not set up.": "Kryžminis pasirašymas nenustatytas.", "Cross-signing is ready for use.": "Kryžminis pasirašymas yra paruoštas naudoti.", - "Channel: ": "Kanalas: %(channelName)s", + "Channel: ": "Kanalas: ", "Workspace: ": "Darbo sritis: ", "This bridge is managed by .": "Šis tiltas yra tvarkomas .", "This bridge was provisioned by .": "Šis tiltas buvo parūpintas .", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index e09aa82b9a..1277769ad3 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -1626,7 +1626,7 @@ "This bridge was provisioned by .": "Dank aan voor de brug.", "This bridge is managed by .": "Brug onderhouden door .", "Workspace: ": "Werkruimte: ", - "Channel: ": "Kanaal: %(channelName)s", + "Channel: ": "Kanaal: ", "Show less": "Minder tonen", "Show more": "Meer tonen", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Momenteel stelt een wachtwoordswijziging alle berichtsleutels in alle sessies opnieuw in, en maakt zo oude versleutelde berichten onleesbaar - tenzij u uw sleutels eerst wegschrijft, en na afloop weer inleest. Dit zal verbeterd worden.", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index 2d9c66f4c5..d3ecf00c1c 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -1381,7 +1381,7 @@ "This bridge was provisioned by .": "Esta integração foi disponibilizada por .", "This bridge is managed by .": "Esta integração é desenvolvida por .", "Workspace: ": "Espaço de trabalho: ", - "Channel: ": "Canal: %(channelName)s", + "Channel: ": "Canal: ", "Show less": "Mostrar menos", "Show more": "Mostrar mais", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ao mudar a senha, você apagará todas as chaves de criptografia de ponta a ponta existentes em todas as sessões, fazendo com que o histórico de conversas criptografadas fique ilegível, a não ser que você exporte as salas das chaves criptografadas antes de mudar a senha e então as importe novamente depois. No futuro, isso será melhorado.", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index 53247765cf..b99fef0915 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1671,7 +1671,7 @@ "This bridge was provisioned by .": "Этот мост был подготовлен пользователем .", "This bridge is managed by .": "Этот мост управляется .", "Workspace: ": "Рабочая область: ", - "Channel: ": "Канал: %(channelName)s", + "Channel: ": "Канал: ", "Show less": "Показать меньше", "Show more": "Показать больше", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Если вы не экспортируете ключи для этой комнаты и не импортируете их в будущем, смена пароля приведёт к сбросу всех ключей сквозного шифрования и сделает невозможным чтение истории чата. В будущем это будет улучшено.", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 7fa8e4dd65..77e7d9de2b 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -1537,7 +1537,7 @@ "Unrecognised room address:": "Nerozpoznaná adresa miestnosti:", "This bridge is managed by .": "Tento most spravuje .", "Workspace: ": "Pracovisko: ", - "Channel: ": "Kanál: %(channelName)s", + "Channel: ": "Kanál: ", "Show less": "Zobraziť menej", "Show more": "Zobraziť viac", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Zmena hesla reštartuje všetky šifrovacie kľúče pre všetky vaše relácie. Šifrované správy sa stanú nečitateľnými, pokiaľ najprv nevyexportujete vaše kľúče a po zmene ich nenaimportujete. V budúcnosti sa tento proces zjednoduší.", diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index b96ab81f2f..a65892f4d0 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -1820,7 +1820,7 @@ "Verify yourself & others to keep your chats safe": "Verifikoni veten & të tjerët, që t’i mbani bisedat tuaja të sigurta", "This bridge was provisioned by .": "Kjo urë është dhënë nga .", "Workspace: ": "Hapësirë pune: ", - "Channel: ": "Kanal: %(channelName)s", + "Channel: ": "Kanal: ", "Show less": "Shfaq më pak", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ndryshimi i fjalëkalimit do të sjellë zerimin e çfarëdo kyçesh fshehtëzimi skaj-më-skaj në krejt sesionet, duke e bërë të palexueshëm historikun e fshehtëzuar të bisedave, hiq rastin kur i eksportoni më parë kyçet tuaj të dhomës dhe i ri-importoni ata më pas. Në të ardhmen kjo do të përmirësohet.", "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Llogaria juaj ka një identitet cross-signing në depozitë të fshehtë, por s’është ende i besuar në këtë sesion.", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 1405ea6145..4824895988 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1693,7 +1693,7 @@ "This bridge was provisioned by .": "Den här bryggan tillhandahålls av .", "This bridge is managed by .": "Den här bryggan tillhandahålls av .", "Workspace: ": "Arbetsyta: ", - "Channel: ": "Kanal: %(channelName)s", + "Channel: ": "Kanal: ", "Show less": "Visa mindre", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Att byta lösenord återställer just nu alla krypteringsnycklar på alla sessioner, vilket gör krypterad chatthistorik oläslig om du inte först exporterar dina rumsnycklar och sedan importerar dem igen efteråt. Detta kommer att förbättras i framtiden.", "Your homeserver does not support cross-signing.": "Din hemserver stöder inte korssignering.", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 20ebca68a2..c7711973f9 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -1411,7 +1411,7 @@ "Later": "Sonra", "Review": "Gözden Geçirme", "Workspace: ": "Çalışma alanı: ", - "Channel: ": "Kanal: %(channelName)s", + "Channel: ": "Kanal: ", "Show less": "Daha az göster", "Show more": "Daha fazla göster", "in memory": "hafızada", diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 3feddd0a33..37b9472d3c 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -956,7 +956,7 @@ "This bridge was provisioned by .": "Цей місток був підготовленим .", "This bridge is managed by .": "Цей міст керується .", "Workspace: ": "Робочий простір: ", - "Channel: ": "Канал: %(channelName)s", + "Channel: ": "Канал: ", "Show less": "Згорнути", "Show more": "Розгорнути", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Змінення пароля призведе до скидання всіх ключів наскрізного шифрування та унеможливить читання історії листування, якщо тільки ви не експортуєте ваші ключі кімнати та не імпортуєте їх згодом. Це буде вдосконалено у майбутньому.", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 46edda95dc..45ca22fdcd 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -2321,7 +2321,7 @@ "Downloading logs": "正在下载日志", "This bridge was provisioned by .": "桥接由 准备。", "Workspace: ": "工作区:", - "Channel: ": "频道:%(channelName)s", + "Channel: ": "频道:", "well formed": "格式正确", "Master private key:": "主私钥:", "Self signing private key:": "自签名私钥:", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index ba63c5f450..b8cecd3b76 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1805,7 +1805,7 @@ "Review": "評論", "This bridge was provisioned by .": "此橋接是由 設定。", "Workspace: ": "工作空間:", - "Channel: ": "頻道:%(channelName)s", + "Channel: ": "頻道:", "Show less": "顯示較少", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "變更密碼將會重設所有工作階段上的所有端到端加密金鑰,讓已加密的聊天歷史無法讀取,除非您先匯出您的聊天室金鑰並在稍後重新匯入。未來會有所改善。", "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "您的帳號在秘密儲存空間中有交叉簽章的身份,但尚未被此工作階段信任。", From 82528de8c8f972e468e82c85ad4adcbd8a487fe3 Mon Sep 17 00:00:00 2001 From: Tom Van Eyck Date: Sun, 10 Jan 2021 12:18:52 +0000 Subject: [PATCH 132/231] Translated using Weblate (Dutch) Currently translated at 69.8% (1901 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nl/ --- src/i18n/strings/nl.json | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index c7ef8d38f6..098790349d 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -2033,5 +2033,35 @@ "Answered Elsewhere": "Ergens anders beantwoord", "The call could not be established": "De oproep kon niet worden volbracht", "The other party declined the call.": "De tegenpartij heeft je oproep afgewezen.", - "Call Declined": "Oproep Afgewezen" + "Call Declined": "Oproep Afgewezen", + "Bahrain": "Bahrein", + "Bahamas": "Bahama's", + "Azerbaijan": "Azerbeidzjan", + "Austria": "Oostenrijk", + "Australia": "Australië", + "Aruba": "Aruba", + "Armenia": "Armenië", + "Argentina": "Argentinië", + "Antigua & Barbuda": "Antigua & Barbuda", + "Antarctica": "Antarctica", + "Anguilla": "Anguilla", + "Angola": "Angola", + "Andorra": "Andorra", + "American Samoa": "Amerikaans Samoa", + "Algeria": "Algerije", + "Albania": "Albanië", + "Åland Islands": "Åland", + "Afghanistan": "Afghanistan", + "United States": "Verenigde Staten", + "United Kingdom": "Verenigd Koninkrijk", + "This will end the conference for everyone. Continue?": "Dit beëindigt de vergadering voor iedereen. Doorgaan?", + "End conference": "Beëindig vergadering", + "You've reached the maximum number of simultaneous calls.": "Je hebt het maximum aantal van gelijktijdige oproepen bereikt.", + "Too Many Calls": "Te veel oproepen", + "No other application is using the webcam": "Geen andere applicatie de camera gebruikt", + "Permission is granted to use the webcam": "Toegang tot de webcam is toegestaan", + "A microphone and webcam are plugged in and set up correctly": "Een microfoon en webcam zijn aangesloten en juist ingesteld", + "Call failed because webcam or microphone could not be accessed. Check that:": "Oproep mislukt omdat er geen toegang is tot de webcam of de microfoon. Kijk na dat:", + "Unable to access webcam / microphone": "Je webcam of microfoon lijkt niet beschikbaar", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Oproep mislukt omdat er geen toegang is tot de microfoon. Kijk na dat de microfoon juist is aangesloten en ingesteld." } From e7152e9a8304f04e5174441c1375f160b4746ec8 Mon Sep 17 00:00:00 2001 From: Ludwig Bald Date: Fri, 8 Jan 2021 16:36:25 +0000 Subject: [PATCH 133/231] Translated using Weblate (German) Currently translated at 100.0% (2721 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/de/ --- src/i18n/strings/de_DE.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index c5aa22750b..14fba36d90 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1633,7 +1633,7 @@ "Sends a message as html, without interpreting it as markdown": "Verschickt eine Nachricht im HTML-Format, ohne sie als Markdown zu darzustellen", "Show rooms with unread notifications first": "Räume mit ungelesenen Benachrichtigungen zuerst zeigen", "Show shortcuts to recently viewed rooms above the room list": "Kurzbefehle zu den kürzlich gesichteten Räumen über der Raumliste anzeigen", - "Use Single Sign On to continue": "Single Sign On zum Fortfahren nutzen", + "Use Single Sign On to continue": "Single-Sign-On zum Fortfahren nutzen", "Confirm adding this email address by using Single Sign On to prove your identity.": "Bestätige die hinzugefügte E-Mail-Adresse mit Single Sign-On, um deine Identität nachzuweisen.", "Single Sign On": "Single Sign-On", "Confirm adding email": "Bestätige hinzugefügte E-Mail-Addresse", From 320ae23e56e29c3dffaeea257eed913e7a3d4fd5 Mon Sep 17 00:00:00 2001 From: Miquel Lionel Date: Mon, 11 Jan 2021 13:52:48 +0000 Subject: [PATCH 134/231] Translated using Weblate (French) Currently translated at 85.8% (2335 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 350d59a30e..00eac69033 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2546,5 +2546,34 @@ "Your server requires encryption to be enabled in private rooms.": "Votre serveur requiert d'activer le chiffrement dans les salons privés.", "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Les salons privés ne peuvent être trouvés et rejoints seulement par invitation. Les salons publics peut être trouvés et rejoints par n'importe qui dans cette communauté.", "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Les salons privés ne peuvent être trouvés et rejoints seulement par invitation. Les salons publics peut être trouvés et rejoints par n'importe qui.", - "Start a new chat": "Commencer une nouvelle discussion" + "Start a new chat": "Commencer une nouvelle discussion", + "Add a photo so people know it's you.": "Ajoutez une photo pour que les gens savent que c'est vous", + "%(ssoButtons)s Or %(usernamePassword)s": "%(ssoButtons)s ou %(usernamePassword)s", + "Decide where your account is hosted": "Décidez où votre compte est hébergé", + "Go to Home View": "Revenir à la page d'accueil", + "Use Ctrl + Enter to send a message": "Utilisez Ctrl + Entrée pour envoyer un message", + "%(senderName)s ended the call": "%(senderName)s a terminé l'appel", + "You ended the call": "Vous avez terminé l'appel", + "%(creator)s created this DM.": "%(creator)s a envoyé ce DM.", + "Now, let's help you get started": "Maintenant, commençons à vous initier", + "Welcome %(name)s": "Bienvenue %(name)s", + "Filter rooms and people": "Filtrer des salons et personnes", + "Got an account? Sign in": "Vous avez un compte ? Connectez-vous", + "New here? Create an account": "Nouveau ici ? Créez un compte", + "There was a problem communicating with the homeserver, please try again later.": "Il y a eu un problème lors de la communication avec le serveur d'accueil, veuillez réessayer ultérieurement.", + "New? Create account": "Nouveau? Créez un compte", + "That username already exists, please try another.": "Ce nom d'utilisateur existe déjà, essayez-en un autre.", + "Already have an account? Sign in here": "Vous avez déjà un compte ? Connectez-vous ici", + "Algeria": "Algérie", + "Albania": "Albanie", + "Åland Islands": "Îles Åland", + "Afghanistan": "Afghanistan", + "United States": "États-Unis", + "United Kingdom": "Royaume-Uni", + "You've reached the maximum number of simultaneous calls.": "Vous avez atteint le nombre maximum d'appels en simultané.", + "No other application is using the webcam": "Aucune autre application n'est en train d'utiliser la caméra", + "A microphone and webcam are plugged in and set up correctly": "Un microphone et une caméra sont branchées et bien configurées", + "Unable to access webcam / microphone": "Impossible d'accéder à la caméra ou microphone", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "La fonction a échoué car le microphone n'a pas pu être accédé. Vérifiez qu'un microphone est branché et bien configuré.", + "Unable to access microphone": "Impossible d'accéder au microphone" } From 472d69c4fc11dbd1d622b28f1269bc6f44494954 Mon Sep 17 00:00:00 2001 From: Tom Van Eyck Date: Sun, 10 Jan 2021 13:54:51 +0000 Subject: [PATCH 135/231] Translated using Weblate (Dutch) Currently translated at 78.3% (2132 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/nl/ --- src/i18n/strings/nl.json | 234 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 233 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 098790349d..d10b942636 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -2063,5 +2063,237 @@ "A microphone and webcam are plugged in and set up correctly": "Een microfoon en webcam zijn aangesloten en juist ingesteld", "Call failed because webcam or microphone could not be accessed. Check that:": "Oproep mislukt omdat er geen toegang is tot de webcam of de microfoon. Kijk na dat:", "Unable to access webcam / microphone": "Je webcam of microfoon lijkt niet beschikbaar", - "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Oproep mislukt omdat er geen toegang is tot de microfoon. Kijk na dat de microfoon juist is aangesloten en ingesteld." + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Oproep mislukt omdat er geen toegang is tot de microfoon. Kijk na dat de microfoon juist is aangesloten en ingesteld.", + "Video conference started by %(senderName)s": "Videovergadering gestart door %(senderName)s", + "Video conference updated by %(senderName)s": "Videovergadering geüpdatet door %(senderName)s", + "Video conference ended by %(senderName)s": "Videovergadering beëindigt door %(senderName)s", + "Join the conference from the room information card on the right": "Neem deel aan de vergadering via de informatiekaart rechts", + "List options": "Lijstopties", + "A-Z": "A-Z", + "Activity": "Activiteit", + "Sort by": "Sorteer op", + "Compare emoji": "Vergelijk de emoji's", + "Verification cancelled": "Verificatie geannuleerd", + "You cancelled verification.": "Je hebt de verificatie geannuleerd.", + "%(displayName)s cancelled verification.": "%(displayName)s heeft de verificatie geannuleerd.", + "You cancelled verification on your other session.": "Je hebt de verificatie vanuit jouw andere sessie beëindigt.", + "Verification timed out.": "Verificatie verlopen.", + "Start verification again from their profile.": "Begin verificatie opnieuw vanaf hun profiel.", + "Romania": "Roemenië", + "St. Martin": "Sint Maarten/Sint-Maarten", + "St. Kitts & Nevis": "Saint Kitts en Nevis", + "St. Barthélemy": "Saint-Barthélemy", + "South Korea": "Zuid-Korea", + "Somalia": "Somalië", + "Papua New Guinea": "Papoea-Nieuw-Guinea", + "North Korea": "Noord-Korea", + "Netherlands": "Nederland", + "Malta": "Malta", + "Mali": "Mali", + "Macau": "Macau", + "Laos": "Laos", + "Kosovo": "Kosovo", + "India": "India", + "Guinea": "Guinee", + "Guinea-Bissau": "Guinee-Bissau", + "Gibraltar": "Gibraltar", + "Georgia": "Georgië", + "Equatorial Guinea": "Equatoriaal-Guinea", + "Dominican Republic": "Dominicaanse Republiek", + "Dominica": "Dominica", + "Czech Republic": "Tsjechië", + "Congo - Kinshasa": "Congo-Kinshasa", + "Congo - Brazzaville": "Congo-Brazzaville", + "Caribbean Netherlands": "Caribisch Nederland", + "Cape Verde": "Kaapverdië", + "British Indian Ocean Territory": "Brits Indische Oceaanterritorium", + "Zimbabwe": "Zimbabwe", + "Zambia": "Zambia", + "Yemen": "Jemen", + "Western Sahara": "Westelijke Sahara", + "Wallis & Futuna": "Wallis en Futuna", + "U.S. Virgin Islands": "Amerikaanse Maagdeneilanden", + "British Virgin Islands": "Britse Maagdeneilanden", + "Vietnam": "Vietnam", + "Venezuela": "Venezuela", + "Vanuatu": "Vanuatu", + "Uzbekistan": "Oezbekistan", + "Uruguay": "Uruguay", + "Ireland": "Verenigd Koninkrijk", + "United Arab Emirates": "Verenigde Arabische Emiraten", + "Ukraine": "Oekraïne", + "Uganda": "Oeganda", + "Tuvalu": "Tuvalu", + "Turks & Caicos Islands": "Turks- en Caicoseilanden", + "Turkmenistan": "Turkmenistan", + "Turkey": "Turkije", + "Tunisia": "Tunesië", + "Trinidad & Tobago": "Trinidad en Tobago", + "Tonga": "Tonga", + "Tokelau": "Tokelau", + "Togo": "Togo", + "Timor-Leste": "Oost-Timor", + "Thailand": "Thailand", + "Tanzania": "Tanzania", + "Tajikistan": "Tadzjikistan", + "Syria": "Syrië", + "Switzerland": "Zwitserland", + "Sweden": "Zweden", + "Svalbard & Jan Mayen": "Spitsbergen en Jan Mayen", + "Suriname": "Suriname", + "Sri Lanka": "Sri Lanka", + "Spain": "Spanje", + "South Africa": "Zuid-Afrika", + "Solomon Islands": "Salomonseilanden", + "Slovenia": "Slovenië", + "Slovakia": "Slowakije", + "Sint Maarten": "Sint Maarten", + "Singapore": "Singapore", + "Sierra Leone": "Sierra Leone", + "Seychelles": "Seychellen", + "Serbia": "Servië", + "Senegal": "Senegal", + "Saudi Arabia": "Saoedi-Arabië", + "San Marino": "San Marino", + "Samoa": "Samoa", + "Rwanda": "Rwanda", + "Russia": "Rusland", + "Réunion": "Réunion", + "Qatar": "Qatar", + "Puerto Rico": "Puerto Rico", + "Portugal": "Portugal", + "Poland": "Polen", + "Pitcairn Islands": "Pitcairneilanden", + "Philippines": "Filipijnen", + "Peru": "Peru", + "Paraguay": "Paraguay", + "Panama": "Panama", + "Palestine": "Palestina", + "Palau": "Palau", + "Pakistan": "Pakistan", + "Norway": "Noorwegen", + "Northern Mariana Islands": "Noordelijke Marianen", + "Macedonia": "Noord-Macedonië", + "Norfolk Island": "Norfolk", + "Niue": "Niue", + "Nigeria": "Nigeria", + "Niger": "Niger", + "Nicaragua": "Nicaragua", + "New Zealand": "Nieuw-Zeeland", + "New Caledonia": "Nieuw-Caledonië", + "Nepal": "Nepal", + "Nauru": "Nauru", + "Namibia": "Namibië", + "Myanmar": "Myanmar", + "Mozambique": "Mozambique", + "Morocco": "Marokko", + "Montserrat": "Montserrat", + "Montenegro": "Montenegro", + "Mongolia": "Mongolië", + "Monaco": "Monaco", + "Moldova": "Moldavië", + "Micronesia": "Micronesia", + "Mexico": "Mexico", + "Mayotte": "Mayotte", + "Mauritius": "Mauritius", + "Mauritania": "Mauritanië", + "Martinique": "Martinique", + "Marshall Islands": "Marshalleilanden", + "Maldives": "Maldiven", + "Malaysia": "Maleisië", + "Malawi": "Malawi", + "Madagascar": "Madagaskar", + "Luxembourg": "Luxemburg", + "Lithuania": "Litouwen", + "Liechtenstein": "Liechtenstein", + "Libya": "Libië", + "Liberia": "Liberia", + "Lesotho": "Lesotho", + "Lebanon": "Libanon", + "Latvia": "Letland", + "Kyrgyzstan": "Kirgizië", + "Kuwait": "Koeweit", + "Kiribati": "Kiribati", + "Kenya": "Kenia", + "Kazakhstan": "Kazachstan", + "Jordan": "Jordanië", + "Jersey": "Jersey", + "Japan": "Japan", + "Jamaica": "Jamaica", + "Italy": "Italië", + "Israel": "Israël", + "Isle of Man": "Man", + "Iraq": "Irak", + "Iran": "Iran", + "Indonesia": "Indonesië", + "Iceland": "IJsland", + "Hungary": "Hongarije", + "Hong Kong": "Hongkong", + "Honduras": "Honduras", + "Heard & McDonald Islands": "Heard en McDonaldeilanden", + "Haiti": "Haïti", + "Guyana": "Guyana", + "Guernsey": "Guernsey", + "Guatemala": "Guatemala", + "Guam": "Guam", + "Guadeloupe": "Guadeloupe", + "Grenada": "Grenada", + "Greenland": "Groenland", + "Greece": "Griekenland", + "Ghana": "Ghana", + "Germany": "Duitsland", + "Gambia": "Gambia", + "Gabon": "Gabon", + "French Southern Territories": "Franse Zuidelijke en Antarctische Gebieden", + "French Polynesia": "Frans-Polynesië", + "French Guiana": "Frans-Guyana", + "France": "Frankrijk", + "Finland": "Finland", + "Fiji": "Fiji", + "Faroe Islands": "Faeröer", + "Falkland Islands": "Falklandeilanden", + "Ethiopia": "Ethiopië", + "Estonia": "Estland", + "Eritrea": "Eritrea", + "El Salvador": "El Salvador", + "Egypt": "Egypte", + "Ecuador": "Ecuador", + "Djibouti": "Djibouti", + "Denmark": "Denemarken", + "Cyprus": "Cyprus", + "Curaçao": "Curaçao", + "Cuba": "Cuba", + "Croatia": "Kroatië", + "Côte d’Ivoire": "Ivoorkust", + "Costa Rica": "Costa Rica", + "Cook Islands": "Cookeilanden", + "Comoros": "Comoren", + "Colombia": "Colombia", + "Cocos (Keeling) Islands": "Cocoseilanden", + "Christmas Island": "Christmaseiland", + "China": "China", + "Chile": "Chili", + "Chad": "Tsjaad", + "Central African Republic": "Centraal-Afrikaanse Republiek", + "Cayman Islands": "Kaaimaneilanden", + "Canada": "Canada", + "Cameroon": "Kameroen", + "Cambodia": "Cambodja", + "Burundi": "Burundi", + "Burkina Faso": "Burkina Faso", + "Bulgaria": "Bulgarije", + "Brunei": "Brunei", + "Brazil": "Brazilië", + "Bouvet Island": "Bouveteiland", + "Botswana": "Botswana", + "Bosnia": "Bosnië en Herzegovina", + "Bolivia": "Bolivia", + "Bhutan": "Bhutan", + "Bermuda": "Bermuda", + "Benin": "Benin", + "Belize": "Belize", + "Belgium": "België", + "Belarus": "Wit-Rusland", + "Barbados": "Barbados", + "Bangladesh": "Bangladesh" } From 11f80bef9b8bb14024ed3816e9fe35e0832c6293 Mon Sep 17 00:00:00 2001 From: Nikita Epifanov Date: Fri, 8 Jan 2021 22:42:49 +0000 Subject: [PATCH 136/231] Translated using Weblate (Russian) Currently translated at 100.0% (2721 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ru/ --- src/i18n/strings/ru.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index fdb1584d56..07cea98506 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -2971,5 +2971,9 @@ "%(name)s on hold": "%(name)s на удержании", "You held the call Switch": "Вы удерживаете звонок Переключить", "sends snowfall": "отправляет снегопад", - "Sends the given message with snowfall": "Отправляет сообщение со снегопадом" + "Sends the given message with snowfall": "Отправляет сообщение со снегопадом", + "You have no visible notifications.": "У вас нет видимых уведомлений.", + "Transfer": "Перевод", + "Failed to transfer call": "Не удалось перевести звонок", + "A call can only be transferred to a single user.": "Вызов может быть передан только одному пользователю." } From 2861fa13baa54b906bf2066e40f45afd7e342da0 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Fri, 8 Jan 2021 12:30:08 +0000 Subject: [PATCH 137/231] Translated using Weblate (Swedish) Currently translated at 100.0% (2721 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index f60a97241f..9abed78c62 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1902,7 +1902,7 @@ "Show %(count)s more|other": "Visa %(count)s till", "Show %(count)s more|one": "Visa %(count)s till", "Use default": "Använd förval", - "Mentions & Keywords": "Benämningar & nyckelord", + "Mentions & Keywords": "Omnämnanden & nyckelord", "Notification options": "Aviseringsinställningar", "Forget Room": "Glöm rum", "Favourited": "Favoritmarkerade", @@ -2911,5 +2911,8 @@ "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Lägger till (╯°□°)╯︵ ┻━┻ till början av ett textmeddelande", "You've reached the maximum number of simultaneous calls.": "Du har nått det maximala antalet samtidiga samtal.", "Too Many Calls": "För många samtal", - "You have no visible notifications.": "Du har inga synliga aviseringar." + "You have no visible notifications.": "Du har inga synliga aviseringar.", + "Transfer": "Överlåt", + "Failed to transfer call": "Misslyckades att överlåta samtal", + "A call can only be transferred to a single user.": "Ett samtal kan bara överlåtas till en enskild användare." } From 788806ed32f0e8b91cd41a691586abd568051916 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Sat, 9 Jan 2021 17:16:28 +0000 Subject: [PATCH 138/231] Translated using Weblate (Ukrainian) Currently translated at 54.8% (1492 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/uk/ --- src/i18n/strings/uk.json | 45 +++++++++++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 8a770989b0..b79de72891 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -329,8 +329,8 @@ "%(oldDisplayName)s changed their display name to %(displayName)s.": "%(oldDisplayName)s змінює своє видиме ім'я на %(displayName)s.", "%(senderName)s set their display name to %(displayName)s.": "%(senderName)s зазначив(-ла) своє видиме ім'я: %(displayName)s.", "%(senderName)s removed their display name (%(oldDisplayName)s).": "%(senderName)s видалив(-ла) своє видиме ім'я (%(oldDisplayName)s).", - "%(senderName)s removed their profile picture.": "%(senderName)s вилучав/ла свою світлину профілю.", - "%(senderName)s set a profile picture.": "%(senderName)s встановлює світлину профілю.", + "%(senderName)s removed their profile picture.": "%(senderName)s вилучає зображення свого профілю.", + "%(senderName)s set a profile picture.": "%(senderName)s встановлює зображення профілю.", "VoIP conference started.": "Розпочато дзвінок-конференцію.", "%(targetName)s joined the room.": "%(targetName)s приєднується до кімнати.", "VoIP conference finished.": "Дзвінок-конференцію завершено.", @@ -352,7 +352,7 @@ "Show developer tools": "Показувати розробницькі засоби", "Default": "Типово", "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s зробив(-ла) майбутню історію кімнати видимою для всіх учасників з моменту, коли вони приєдналися.", - "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s зробив(-ла) майбутню історію кімнати видимою для всіх учасників з моменту, коли вони приєдналися.", + "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s робить майбутню історію кімнати видимою для всіх учасників від часу їхнього приєднання.", "%(senderName)s made future room history visible to all room members.": "%(senderName)s зробив(-ла) майбутню історію видимою для всіх учасників кімнати.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s зробив(-ла) майбутню історію кімнати видимою для всіх.", "%(senderName)s made future room history visible to unknown (%(visibility)s).": "%(senderName)s зробив(-ла) майбутню історію видимою для невідомого значення (%(visibility)s).", @@ -392,7 +392,7 @@ "Incorrect verification code": "Неправильний код перевірки", "Submit": "Надіслати", "Phone": "Телефон", - "Failed to upload profile picture!": "Не вдалося відвантажити світлину профілю!", + "Failed to upload profile picture!": "Не вдалося відвантажити зображення профілю!", "Upload new:": "Відвантажити нову:", "No display name": "Немає видимого імені", "New passwords don't match": "Нові паролі не збігаються", @@ -712,7 +712,7 @@ "Unexpected error resolving homeserver configuration": "Неочікувана помилка в налаштуваннях домашнього серверу", "Unexpected error resolving identity server configuration": "Незрозуміла помилка при розборі параметру сервера ідентифікації", "The message you are trying to send is too large.": "Ваше повідомлення було занадто велике.", - "%(items)s and %(count)s others|other": "%(items)s та ще %(count)s учасника(ів)", + "%(items)s and %(count)s others|other": "%(items)s та ще %(count)s учасників", "%(items)s and %(count)s others|one": "%(items)s і ще хтось", "a few seconds ago": "Декілька секунд тому", "about a minute ago": "близько хвилини тому", @@ -779,8 +779,8 @@ "A new version of %(brand)s is available!": "Нова версія %(brand)s вже доступна!", "Guest": "Гість", "There was an error joining the room": "Помилка при вході в кімнату", - "You joined the call": "Ви приєднались до дзвінку", - "%(senderName)s joined the call": "%(senderName)s приєднується до розмови", + "You joined the call": "Ви приєднались до виклику", + "%(senderName)s joined the call": "%(senderName)s приєднується до виклику", "Call in progress": "Дзвінок у процесі", "You left the call": "Ви припинили розмову", "%(senderName)s left the call": "%(senderName)s покинув(ла) дзвінок", @@ -875,7 +875,7 @@ "You will not be able to undo this change as you are promoting the user to have the same power level as yourself.": "Ви не зможете скасувати цю зміну через те, що ви підвищуєте рівень повноважень користувача до свого рівня.", "React": "Відреагувати", "Message deleted": "Повідомлення видалено", - "Message deleted by %(name)s": "Повідомлення видалено від %(name)s", + "Message deleted by %(name)s": "Повідомлення видалено %(name)s", "Message deleted on %(date)s": "Повідомлення видалено %(date)s", "Power level": "Рівень повноважень", "Use an identity server to invite by email. Manage in Settings.": "Використовуйте сервер ідентифікації щоб запрошувати через е-пошту. Керується у налаштуваннях.", @@ -1222,7 +1222,7 @@ "Clear filter": "Очистити фільтр", "Syncing...": "Синхронізування…", "Signing In...": "Входження…", - "If you've joined lots of rooms, this might take a while": "Якщо ви приєднались до багатьох кімнат, це може зайняти деякий час", + "If you've joined lots of rooms, this might take a while": "Якщо ви приєднались до багатьох кімнат, це може тривати деякий час", "Create account": "Створити обліковий запис", "Failed to fetch avatar URL": "Не вдалось вибрати URL личини", "Clear room list filter field": "Очистити поле фільтра списку кімнат", @@ -1550,5 +1550,30 @@ "Permission is granted to use the webcam": "Використання вебкамери дозволено", "A microphone and webcam are plugged in and set up correctly": "Мікрофон і вебкамера під'єднані та налаштовані правильно", "Call failed because webcam or microphone could not be accessed. Check that:": "Збій виклику, оскільки не вдалося отримати доступ до вебкамери або мікрофона. Перевірте, що:", - "Unable to access webcam / microphone": "Не вдається отримати доступ до вебкамери / мікрофона" + "Unable to access webcam / microphone": "Не вдається отримати доступ до вебкамери / мікрофона", + "%(severalUsers)sjoined and left %(count)s times|other": "%(severalUsers)sприєдналися й вийшли %(count)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.": "Ви можете вимкнути це, якщо кімната буде використовуватися для співпраці із зовнішніми командами, які мають власний домашній сервер. Це неможливо змінити пізніше.", + "%(oneUser)schanged their avatar %(count)s times|one": "%(oneUser)sзмінює свій аватар", + "%(oneUser)schanged their avatar %(count)s times|other": "%(oneUser)sзмінюють свої аватари %(count)s разів", + "%(severalUsers)schanged their avatar %(count)s times|one": "%(severalUsers)sзмінюють свої аватари", + "%(severalUsers)schanged their avatar %(count)s times|other": "%(severalUsers)sзмінюють свої аватари %(count)s разів", + "%(oneUser)schanged their name %(count)s times|one": "%(oneUser)sзмінює своє ім'я", + "%(oneUser)schanged their name %(count)s times|other": "%(oneUser)sзмінює своє ім'я %(count)s разів", + "%(severalUsers)schanged their name %(count)s times|one": "%(severalUsers)sзмінили свої імена", + "%(severalUsers)schanged their name %(count)s times|other": "%(severalUsers)sзмінили свої імена %(count)s разів", + "Error whilst fetching joined communities": "Помилка під час отримання спільнот до яких ви приєдналися", + "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone in this community.": "Закриті кімнати можна знайти та приєднатися до них лише за запрошенням. Загальнодоступні кімнати може знайти і приєднатись кожен з цієї спільноти.", + "Private rooms can be found and joined by invitation only. Public rooms can be found and joined by anyone.": "Закриті кімнати можна знайти та приєднатися до них лише за запрошенням. Загальнодоступні кімнати може знайти і приєднатись кожен.", + "%(oneUser)sleft and rejoined %(count)s times|one": "%(oneUser)sвиходить і повертається", + "%(oneUser)sleft and rejoined %(count)s times|other": "%(oneUser)sвиходить і повертається %(count)s разів", + "%(severalUsers)sleft and rejoined %(count)s times|one": "%(severalUsers)sвиходять і повертаються", + "%(severalUsers)sleft and rejoined %(count)s times|other": "%(severalUsers)sвиходять і повертаються %(count)s разів", + "%(oneUser)sjoined and left %(count)s times|one": "%(oneUser)sприєднується й виходить", + "%(oneUser)sjoined and left %(count)s times|other": "%(oneUser)sприєднується й виходить %(count)s разів", + "%(severalUsers)sjoined and left %(count)s times|one": "%(severalUsers)sприєдналися й вийшли", + "%(oneUser)sjoined %(count)s times|one": "%(oneUser)sприєднується", + "%(oneUser)sjoined %(count)s times|other": "%(oneUser)sприєднується %(count)s разів", + "%(severalUsers)sjoined %(count)s times|one": "%(severalUsers)sприєдналися", + "%(severalUsers)sjoined %(count)s times|other": "%(severalUsers)sприєдналися %(count)s разів", + "Members only (since they joined)": "Лише учасники (від часу приєднання)" } From 8997b9dfe64e9a39569f367548be3b021e91697b Mon Sep 17 00:00:00 2001 From: GokdenizK Date: Mon, 11 Jan 2021 09:38:30 +0000 Subject: [PATCH 139/231] Translated using Weblate (Turkish) Currently translated at 75.1% (2045 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/tr/ --- src/i18n/strings/tr.json | 489 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 472 insertions(+), 17 deletions(-) diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 5a152eeab6..ea782459e4 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -39,11 +39,11 @@ "Bans user with given id": "Yasaklanan(Banlanan) Kullanıcılar , ID'leri ile birlikte", "Call Timeout": "Arama Zaman Aşımı", "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.": "Ana Sunucu'ya bağlanılamıyor - lütfen bağlantınızı kontrol edin , Ana Sunucu SSL sertifikanızın güvenilir olduğundan ve bir tarayıcı uzantısının istekleri engellemiyor olduğundan emin olun.", - "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Tarayıcı çubuğunuzda bir HTTPS URL'si olduğunda Ana Sunusuna HTTP üzerinden bağlanılamıyor . Ya HTTPS kullanın veya güvensiz komut dosyalarını etkinleştirin.", + "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.": "Tarayıcı çubuğunuzda bir HTTPS URL'si olduğunda Ana Sunusuna HTTP üzerinden bağlanılamıyor . Ya HTTPS kullanın veya güvensiz komut dosyalarını etkinleştirin.", "Change Password": "Şifre Değiştir", "%(senderName)s changed their profile picture.": "%(senderName)s profil resmini değiştirdi.", "%(senderName)s changed the power level of %(powerLevelDiffText)s.": "%(senderName)s %(powerLevelDiffText)s'nin güç düzeyini değiştirdi.", - "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s odanın ismini %(roomName)s olarak değiştirdi.", + "%(senderDisplayName)s changed the room name to %(roomName)s.": "%(senderDisplayName)s odanın ismini %(roomName)s olarak değiştirdi.", "%(senderDisplayName)s removed the room name.": "%(senderDisplayName)s oda adını kaldırdı.", "%(senderDisplayName)s changed the topic to \"%(topic)s\".": "%(senderDisplayName)s konuyu \"%(topic)s\" olarak değiştirdi.", "Changes your display nickname": "Görünen takma adınızı değiştirir", @@ -226,7 +226,7 @@ "This email address is already in use": "Bu e-posta adresi zaten kullanımda", "This email address was not found": "Bu e-posta adresi bulunamadı", "The email address linked to your account must be entered.": "Hesabınıza bağlı e-posta adresi girilmelidir.", - "The remote side failed to pick up": "Uzak taraf toplanamadı(alınamadı)", + "The remote side failed to pick up": "Karşı taraf cevaplayamadı", "This room has no local addresses": "Bu oda hiçbir yerel adrese sahip değil", "This room is not recognised.": "Bu oda tanınmıyor.", "This doesn't appear to be a valid email address": "Bu geçerli bir e-posta adresi olarak gözükmüyor", @@ -305,9 +305,9 @@ "Oct": "Ekim", "Nov": "Kasım", "Dec": "Aralık", - "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s , %(monthName)s %(day)s %(time)s", - "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "Hafta - %(weekDayName)s , %(day)s -%(monthName)s -%(fullYear)s , %(time)s", - "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(time)s": "%(weekDayName)s , %(monthName)s %(day)s %(time)s", + "%(weekDayName)s, %(monthName)s %(day)s %(fullYear)s %(time)s": "Hafta - %(weekDayName)s , %(day)s -%(monthName)s -%(fullYear)s , %(time)s", + "%(weekDayName)s %(time)s": "%(weekDayName)s %(time)s", "Set a display name:": "Görünür isim ayarla :", "Upload an avatar:": "Bir Avatar yükle :", "This server does not support authentication with a phone number.": "Bu sunucu bir telefon numarası ile kimlik doğrulamayı desteklemez.", @@ -373,7 +373,7 @@ "Offline": "Çevrimdışı", "%(senderDisplayName)s changed the room avatar to ": "%(senderDisplayName)s odanın avatarını olarak çevirdi", "%(senderDisplayName)s removed the room avatar.": "%(senderDisplayName)s odanın avatarını kaldırdı.", - "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s %(roomName)s için avatarı değiştirdi", + "%(senderDisplayName)s changed the avatar for %(roomName)s": "%(senderDisplayName)s %(roomName)s için avatarı değiştirdi", "Username available": "Kullanıcı ismi uygun", "Username not available": "Kullanıcı ismi uygun değil", "Something went wrong!": "Bir şeyler yanlış gitti!", @@ -821,13 +821,13 @@ "DuckDuckGo Results": "DuckDuckGo Sonuçları", "Emoji Autocomplete": "Emoji Oto Tamamlama", "Notify the whole room": "Tüm odayı bilgilendir", - "Room Notification": "Oda Bildirimi", + "Room Notification": "Oda Bildirimi", "Set up with a recovery key": "Kurtarma anahtarı ile kur", "That matches!": "Eşleşti!", "That doesn't match.": "Eşleşmiyor.", "Download": "İndir", "Print it and store it somewhere safe": "Yazdır ve güvenli bir yerde sakla", - "Save it on a USB key or backup drive": "Bir USB anahtara kaydet veya sürücüye yedekle", + "Save it on a USB key or backup drive": "Bir USB anahtara kaydet veya sürücüye yedekle", "Copy it to your personal cloud storage": "Kişisel bulut depolamaya kopyala", "Success!": "Başarılı!", "Retry": "Yeniden Dene", @@ -902,7 +902,7 @@ "Show developer tools": "Geliştirici araçlarını göster", "Low bandwidth mode": "Düşük bant genişliği modu", "Messages containing my username": "Kullanıcı adımı içeren mesajlar", - "When rooms are upgraded": "Odaların güncellenme zamanları", + "When rooms are upgraded": "Odalar güncellendiğinde", "My Ban List": "Yasaklı Listem", "Verified!": "Doğrulandı!", "You've successfully verified this user.": "Bu kullanıcıyı başarılı şekilde doğruladınız.", @@ -1150,7 +1150,7 @@ "Copied!": "Kopyalandı!", "Failed to copy": "Kopyalama başarısız", "edited": "düzenlendi", - "You are still sharing your personal data on the identity server .": "Kimlik sunucusu üzerinde hala kişisel veri paylaşımı yapıyorsunuz \n.", + "You are still sharing your personal data on the identity server .": "Kimlik sunucusu üzerinde hala kişisel veri paylaşımı yapıyorsunuz .", "We recommend that you remove your email addresses and phone numbers from the identity server before disconnecting.": "Kimlik sunucusundan bağlantıyı kesmeden önce telefon numaranızı ve e-posta adreslerinizi silmenizi tavsiye ederiz.", "Set a new account password...": "Yeni bir hesap parolası belirle...", "Deactivating your account is a permanent action - be careful!": "Hesabınızı pasifleştirmek bir kalıcı eylemdir - dikkat edin!", @@ -1243,7 +1243,7 @@ "Avoid years that are associated with you": "Sizle ilişkili yıllardan kaçının", "Avoid dates and years that are associated with you": "Sizle ilişkili tarihler ve yıllardan kaçının", "Capitalization doesn't help very much": "Baş harfi büyük yapmak size pek yardımcı olmaz", - "All-uppercase is almost as easy to guess as all-lowercase": "Bütün harflerin büyük olmasıyla tümünün küçük olması tahmin için hemen hemen aynı kolaylıktadır", + "All-uppercase is almost as easy to guess as all-lowercase": "Bütün harflerin büyük olmasıyla tümünün küçük olması tahmin edilmesi bakımından hemen hemen aynı kolaylıktadır", "Reversed words aren't much harder to guess": "Ters kelimeler tahmin için çok zor değil", "Repeats like \"aaa\" are easy to guess": "“aaa” gibi tekrarlar tahmin için oldukça kolay", "Dates are often easy to guess": "Tarihler sıklıkla tahmin için daha kolaydır", @@ -1326,7 +1326,7 @@ "Community IDs may only contain characters a-z, 0-9, or '=_-./'": "Topluluk ID leri sadece a-z, 0-9 ya da '=_-./' karakterlerini içerebilir", "Create a public room": "Halka açık bir oda oluşturun", "Make this room public": "Bu odayı halka açık yap", - "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": "Sohbet tarihçesini kaybetmemek için, çıkmadan önce odanızın anahtarlarını dışarıya aktarın. Bunu yapabilmek için %(brand)sun daha yeni sürümü gerekli. Ulaşmak için geri gitmeye ihtiyacınız var", + "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": "Sohbet tarihçesini kaybetmemek için, çıkmadan önce odanızın anahtarlarını dışarıya aktarın. Bunu yapabilmek için %(brand)sun daha yeni sürümü gerekli. Ulaşmak için geri gitmeye ihtiyacınız var", "Continue With Encryption Disabled": "Şifreleme Kapalı Şekilde Devam Et", "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "%(fileName)s dosyası anasunucunun yükleme boyutu limitini aşıyor", "Double check that your server supports the room version chosen and try again.": "Seçtiğiniz oda sürümünün sunucunuz tarafından desteklenip desteklenmediğini iki kez kontrol edin ve yeniden deneyin.", @@ -1592,7 +1592,7 @@ "To continue you need to accept the terms of this service.": "Devam etmek için bu servisi kullanma şartlarını kabul etmeniz gerekiyor.", "Upload files (%(current)s of %(total)s)": "Dosyaları yükle (%(current)s / %(total)s)", "Incorrect recovery passphrase": "Hatalı kurtarma parolası", - "Failed to decrypt %(failedCount)s sessions!": "Çözümlemesi başarısız olan %(failedCount)s oturum!", + "Failed to decrypt %(failedCount)s sessions!": "%(failedCount)s adet oturum çözümlenemedi!", "Enter recovery passphrase": "Kurtarma parolasını girin", "Confirm your identity by entering your account password below.": "Hesabınızın şifresini aşağıya girerek kimliğinizi teyit edin.", "An email has been sent to %(emailAddress)s": "%(emailAddress)s adresine bir e-posta gönderildi", @@ -1635,7 +1635,7 @@ "Sends a message as plain text, without interpreting it as markdown": "Mesajı markdown kullanmadan basit metin olarak iletir", "Use an identity server to invite by email. Click continue to use the default identity server (%(defaultIdentityServerName)s) or manage in Settings.": "E-posta ile davet etmek için kimlik sunucusu kullan. Varsayılan kimlik sunucusunu (%(defaultIdentityServerName)s) kullanmak için devam edin ya da ayarlardan değiştirin.", "Unignored user": "Reddedilmemiş kullanıcı", - "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!": "UYARI: ANAHTAR DOĞRULAMASI BAŞARISIZ! %(userld)s'nin/nın %(deviceld)s oturumu için imza anahtarı \"%(fprint)s\" verilen anahtar ile uyumsuz \"%(fingerprint)s\". Bu iletişiminizin engellendiği anlamına gelebilir!", + "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!": "UYARI: ANAHTAR DOĞRULAMASI BAŞARISIZ! %(userld)s'nin/nın %(deviceId)s oturumu için imza anahtarı \"%(fprint)s\" verilen anahtar ile uyuşmuyor \"%(fingerprint)s\". Bu iletişiminizin engellendiği anlamına gelebilir!", "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Verilen imza anahtarı %(userld)s'nin/nın %(deviceld)s oturumundan gelen anahtar ile uyumlu. Oturum doğrulanmış olarak işaretlendi.", "Forces the current outbound group session in an encrypted room to be discarded": "Şifreli bir odadaki geçerli giden grup oturumunun atılmasını zorlar", "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s oda ismini %(oldRoomName)s bununla değiştirdi %(newRoomName)s.", @@ -1726,7 +1726,7 @@ "Ok": "Tamam", "Set password": "Parola belirle", "To return to your account in future you need to set a password": "İleride hesabınızı tekrar kullanabilmek için bir parola belirlemeniz gerek", - "New login. Was this you?": "", + "New login. Was this you?": "Yeni giriş. Bu siz miydiniz?", "Restart": "Yeniden başlat", "You joined the call": "Çağrıya katıldınız", "%(senderName)s joined the call": "%(senderName)s çağrıya katıldı", @@ -1757,5 +1757,460 @@ "You were kicked": "Atıldınız", "%(targetName)s was kicked": "%(targetName)s atıldı", "You rejected the invite": "Daveti reddettiniz", - "%(targetName)s rejected the invite": "%(targetName)s daveti reddetti" + "%(targetName)s rejected the invite": "%(targetName)s daveti reddetti", + "See when anyone posts a sticker to your active room": "Aktif odanızda birisi çıkartma paylaştığında görün", + "See when a sticker is posted in this room": "Bu odada çıkartma paylaşıldığında görün", + "See when the avatar changes in your active room": "Aktif odanızdaki avatar değişikliklerini görün", + "See when the avatar changes in this room": "Bu odadaki avatar değişikliklerini görün", + "The person who invited you already left the room, or their server is offline.": "Seni davet eden kişi zaten odadan ayrılmış yada sunucuları çevrim dışı.", + "The person who invited you already left the room.": "Seni davet eden kişi zaten odadan ayrılmış.", + "New version of %(brand)s is available": "%(brand)s 'in yeni versiyonu hazır", + "Update %(brand)s": "%(brand)s 'i güncelle", + "Verify the new login accessing your account: %(name)s": "Hesabınıza erişen yeni girişi onaylayın: %(name)s", + "Safeguard against losing access to encrypted messages & data": "Şifrelenmiş mesajlara ve verilere erişimi kaybetmemek için koruma sağlayın", + "Set up Secure Backup": "Güvenli Yedekleme kur", + "Enable desktop notifications": "Masaüstü bildirimlerini etkinleştir", + "Don't miss a reply": "Yanıtları kaçırma", + "Send anonymous usage data which helps us improve %(brand)s. This will use a cookie.": "%(brand)s 'i geliştirmemize yardımcı olan gizli kullanım verilerini gönder. Bu çerez kullanacaktır.", + "Help us improve %(brand)s": "%(brand)s 'i geliştirmemize yardım et", + "Unknown App": "Bilinmeyen uygulama", + "Error leaving room": "Odadan ayrılırken hata", + "This room is used for important messages from the Homeserver, so you cannot leave it.": "Bu oda, Ana Sunucudan gelen önemli mesajlar için kullanılır, bu yüzden ayrılamazsınız.", + "Can't leave Server Notices room": "Sunucu Bildirimleri odasından ayrılınamıyor", + "Unexpected server error trying to leave the room": "Odadan ayrılmaya çalışırken beklenmeyen sunucu hatası", + "See images posted to your active room": "Aktif odanıza gönderilen fotoğrafları görün", + "See emotes posted to your active room": "Aktif odanıza gönderilen ifadeleri görün", + "See emotes posted to this room": "Bu odaya gönderilen ifadeleri görün", + "See text messages posted to your active room": "Aktif odanıza gönderilen metin mesajlarını görün", + "See text messages posted to this room": "Bu odaya gönderilen metin mesajlarını gör", + "The %(capability)s capability": "%(capability)s kabiliyet", + "See messages posted to your active room": "Aktif odanıza gönderilen mesajları görün", + "See messages posted to this room": "Bu odaya gönderilen mesajları görün", + "Change the avatar of your active room": "Aktif odanın avatarını değiştir", + "Change the avatar of this room": "Bu odanın avatarını değiştir", + "Change the name of your active room": "Aktif odanızın ismini değiştirin", + "%(senderName)s declined the call.": "%(senderName)s aramayı reddetti.", + "🎉 All servers are banned from participating! This room can no longer be used.": "🎉 Tüm sunucuların katılımı yasaklanmıştır! Bu oda artık kullanılamaz.", + "Change the name of this room": "Bu odanın ismini değiştirin", + "Change the topic of your active room": "Aktif odanızın konusunu değiştirin", + "Change the topic of this room": "Bu odanın konusunu değiştirin", + "Change which room you're viewing": "Görüntülediğiniz odayı değiştirin", + "Send stickers into your active room": "Aktif odanıza çıkartma gönderin", + "Send stickers into this room": "Bu odaya çıkartma gönderin", + "(an error occurred)": "(bir hata meydana geldi)", + "(their device couldn't start the camera / microphone)": "(Cihazları kamerayı/mikrofonu başlatamadı )", + "(connection failed)": "(bağlantı hatası)", + "%(senderDisplayName)s changed the server ACLs for this room.": "%(senderDisplayName)s bu oda için sunucu ACL'lerini değiştirdi.", + "%(senderDisplayName)s set the server ACLs for this room.": "%(senderDisplayName)s bu oda için sunucu ACL'lerini ayarladı.", + "Takes the call in the current room off hold": "Mevcut odadaki aramayı beklemeden çıkarır", + "Places the call in the current room on hold": "Mevcut odadaki aramayı beklemeye alır", + "Please supply a widget URL or embed code": "Lütfen bir widget URL'si veya yerleşik kod girin", + "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Düz metin mesajının başına (͡ ° ͜ʖ ͡ °) ekler", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Düz metin mesajının başına ┬──┬ ノ (゜ - ゜ ノ) ekler", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Düz metin mesajının başına (╯°□°)╯︵ ┻━┻ ekler", + "Zimbabwe": "Zimbabve", + "Zambia": "Zambiya", + "Yemen": "Yemen", + "Western Sahara": "Batı Sahra", + "Wallis & Futuna": "Wallis & Futuna", + "Vietnam": "Vietnam", + "Venezuela": "Venezuela", + "Vatican City": "Vatikan Şehri", + "Vanuatu": "Vanuatu", + "Uzbekistan": "Özbekistan", + "Uruguay": "Uruguay", + "United Arab Emirates": "Birleşik Arap Emirlikleri", + "Ukraine": "Ukrayna", + "Uganda": "Uganda", + "U.S. Virgin Islands": "Amerika Birleşik Devletleri Virgin Adaları", + "Tuvalu": "Tuvalu", + "Turks & Caicos Islands": "Turks ve Caicos Adaları", + "Turkmenistan": "Türkmenistan", + "Turkey": "Türkiye", + "Tunisia": "Tunus", + "Trinidad & Tobago": "Trinidad & Tobago", + "Tonga": "Tonga", + "Tokelau": "Tokelau", + "Togo": "Togo", + "Timor-Leste": "Doğu Timor", + "Thailand": "Tayland", + "Tanzania": "Tanzanya", + "Tajikistan": "Tajikistan", + "Taiwan": "Tayvan", + "São Tomé & Príncipe": "São Tomé ve Príncipe", + "Syria": "Suriye", + "Switzerland": "İsviçre", + "Sweden": "İsveç", + "Swaziland": "Svaziland", + "Svalbard & Jan Mayen": "Svalbard & Jan Mayen", + "Suriname": "Surinam", + "Sudan": "Sudan", + "St. Vincent & Grenadines": "St. Vincent ve Grenadinler", + "St. Pierre & Miquelon": "St. Pierre ve Miquelon", + "St. Martin": "St. Martin", + "St. Lucia": "St. Lucia", + "St. Kitts & Nevis": "St. Kitts ve Nevis", + "St. Helena": "St. Helena", + "St. Barthélemy": "St. Barthélemy", + "Sri Lanka": "Sri Lanka", + "Spain": "İspanya", + "South Sudan": "Güney Sudan", + "South Korea": "Güney Kore", + "South Georgia & South Sandwich Islands": "Güney Georgia ve Güney Sandwich Adaları", + "South Africa": "Güney Afrika", + "Somalia": "Somali", + "Solomon Islands": "Solomon Adaları", + "Slovenia": "Slovenya", + "Slovakia": "Slovakya", + "Sint Maarten": "St Martin", + "Singapore": "Singapur", + "Sierra Leone": "Sierra Leone", + "Seychelles": "Şeyseller", + "Serbia": "Sırbistan", + "Senegal": "Senegal", + "Saudi Arabia": "Suudi Arabistan", + "San Marino": "San Marino", + "Samoa": "Samoa", + "Réunion": "Réunion", + "Rwanda": "Ruanda", + "Russia": "Rusya", + "Romania": "Romanya", + "Qatar": "Katar", + "Puerto Rico": "Porto Riko", + "Portugal": "Portekiz", + "Poland": "Polonya", + "Pitcairn Islands": "Pitcairn Adaları", + "Philippines": "Filipinler", + "Peru": "Peru", + "Paraguay": "Paraguay", + "Papua New Guinea": "Papua Yeni Gine", + "Panama": "Panama", + "Palestine": "Filistin", + "Palau": "Palau", + "Pakistan": "Pakistan", + "Oman": "Umman", + "Norway": "Norveç", + "Northern Mariana Islands": "Kuzey Mariana Adaları", + "North Korea": "Kuzey Kore", + "Norfolk Island": "Norfolk Adası", + "Niue": "Niue", + "Nigeria": "Nijerya", + "Niger": "Nijer", + "Nicaragua": "Nikaragua", + "New Zealand": "Yeni Zelanda", + "New Caledonia": "Yeni Kaledonya", + "Netherlands": "Hollanda", + "Nepal": "Nepal", + "Macau": "Makao", + "Nauru": "Nauru", + "Namibia": "Namibya", + "Myanmar": "Myanmar", + "Mozambique": "Mozambik", + "Morocco": "Fas", + "Montserrat": "Montserrat", + "Montenegro": "Karadağ", + "Mongolia": "Moğolistan", + "Monaco": "Monako", + "Moldova": "Moldova", + "Micronesia": "Mikronezya", + "Mexico": "Meksika", + "Mayotte": "Mayotte", + "Mauritius": "Mauritius", + "Mauritania": "Moritanya", + "Martinique": "Martinik", + "Marshall Islands": "Marşal Adaları", + "Malta": "Malta", + "Mali": "Mali", + "Maldives": "Maldivler", + "Malaysia": "Malezya", + "Malawi": "Malawi", + "Madagascar": "Madagaskar", + "Macedonia": "Makedonya", + "Luxembourg": "Lüksemburg", + "Lithuania": "Litvanya", + "Liechtenstein": "Lihtenştayn", + "Libya": "Libya", + "Liberia": "Liberya", + "Lesotho": "Lesoto", + "Lebanon": "Lübnan", + "Latvia": "Letonya", + "Laos": "Laos", + "Kyrgyzstan": "Kırgızistan", + "Kuwait": "Kuveyt", + "Jordan": "Ürdün", + "Kosovo": "Kosova", + "Kiribati": "Kiribati", + "Kenya": "Kenya", + "Kazakhstan": "Kazakistan", + "Jersey": "Jersey", + "Japan": "Japonya", + "Jamaica": "Jamaika", + "Italy": "İtalya", + "Israel": "İsrail", + "Isle of Man": "Man Adası", + "Ireland": "İrlanda", + "Iraq": "Irak", + "Iran": "İran", + "Indonesia": "Endonezya", + "India": "Hindistan", + "Iceland": "İzlanda", + "Hungary": "Macaristan", + "Hong Kong": "Hong Kong", + "Honduras": "Honduras", + "Heard & McDonald Islands": "Heard ve McDonald Adaları", + "Haiti": "Haiti", + "Guyana": "Guyana", + "Guinea-Bissau": "Gine-Bissau", + "Guinea": "Gine", + "Guernsey": "Guernsey", + "Guatemala": "Guatemala", + "Guam": "Guam", + "Guadeloupe": "Guadeloupe", + "Grenada": "Grenada", + "Greenland": "Grönland", + "Greece": "Yunanistan", + "Gibraltar": "Cebelitarık", + "Ghana": "Gana", + "Germany": "Almanya", + "Georgia": "Gürcistan", + "Gambia": "Gambiya", + "Gabon": "Gabon", + "French Southern Territories": "Fransız Güney Toprakları", + "French Polynesia": "Fransız Polinezyası", + "French Guiana": "Fransız Guyanası", + "France": "Fransa", + "Finland": "Finlandiya", + "Fiji": "Fij", + "Faroe Islands": "Faroe adaları", + "Falkland Islands": "Falkland adaları", + "Ethiopia": "Etiyopya", + "Estonia": "Estonya", + "Eritrea": "Eritre", + "Equatorial Guinea": "Ekvator Ginesi", + "El Salvador": "El Salvador", + "Egypt": "Mısır", + "Ecuador": "Ekvador", + "Dominican Republic": "Dominik cumhuriyeti", + "Dominica": "Dominik", + "Denmark": "Danimarka", + "Djibouti": "Cibuti", + "Côte d’Ivoire": "Fildişi Sahili", + "Czech Republic": "Çek cumhuriyeti", + "Cyprus": "Kıbrıs", + "Curaçao": "Curacao", + "Cuba": "Küba", + "Croatia": "Hırvatistan", + "Costa Rica": "Kosta Rika", + "Cook Islands": "Cook Adaları", + "Congo - Kinshasa": "Kongo - Kinşasa", + "Congo - Brazzaville": "Kongo - Brazzaville", + "Comoros": "Komorlar", + "Colombia": "Kolombiya", + "Cocos (Keeling) Islands": "Cocos (Keeling) Adaları", + "Christmas Island": "Noel Adası", + "China": "Çin", + "Chile": "Şili", + "Chad": "Çad", + "Central African Republic": "Orta Afrika Cumhuriyeti", + "Cayman Islands": "Cayman Adaları", + "Caribbean Netherlands": "Karayip Hollandası", + "Cape Verde": "Cape Verde", + "Canada": "Kanada", + "Cameroon": "Kamerun", + "Cambodia": "Kamboçya", + "Burundi": "Burundi", + "Burkina Faso": "Burkina Faso", + "Bulgaria": "Bulgaristan", + "Brunei": "Brunei", + "British Virgin Islands": "Britanya Virjin Adaları", + "British Indian Ocean Territory": "İngiliz Hint Okyanusu Bölgesi", + "Brazil": "Brezilya", + "Bouvet Island": "Bouvet Adası", + "Botswana": "Botsvana", + "Bosnia": "Bosna", + "Bolivia": "Bolivya", + "Bhutan": "Butan", + "Bermuda": "Bermuda", + "Benin": "Benin", + "Belize": "Belize", + "Belgium": "Belçika", + "Belarus": "Belarus", + "Barbados": "Barbados", + "Bangladesh": "Bangladeş", + "See %(msgtype)s messages posted to this room": "Bu odada gönderilen %(msgtype)s mesajlara bak", + "Send %(msgtype)s messages as you in this room": "Bu odadayken %(msgtype)s mesajlar gönder", + "Bahrain": "Bahreyn", + "Bahamas": "Bahamalar", + "Azerbaijan": "Azerbaycan", + "Austria": "Avusturya", + "Review terms and conditions": "Hükümler ve koşulları incele", + "Terms and Conditions": "Hükümler ve koşullar", + "To continue using the %(homeserverDomain)s homeserver you must review and agree to our terms and conditions.": "%(homeserverDomain)s ana sunucusunu kullanmaya devam etmek için hüküm ve koşulları incelemeli ve kabul etmelisiniz.", + "You do not have permission to create rooms in this community.": "Bu toplulukta oda oluşturmaya izniniz yok.", + "Cannot create rooms in this community": "Bu toplulukta oda oluşturulamıyor", + "Create a Group Chat": "Grup sohbeti başlat", + "Explore Public Rooms": "Herkese açık odaları keşfet", + "Send a Direct Message": "Direkt mesaj gönderin", + "Liberate your communication": "İletişiminizi özgürleştirin", + "Welcome to %(appName)s": "%(appName)s' e hoş geldiniz", + "Now, let's help you get started": "Şimdi, başlamanıza yardım edelim", + "Click to view edits": "Düzenlemeleri görmek için tıkla", + "Edited at %(date)s": "%(date)s tarihinde düzenlendi", + "This room is a continuation of another conversation.": "Bu oda başka bir görüşmenin devamıdır.", + "Message deleted on %(date)s": "Mesaj %(date)s tarihinde silindi", + "Message deleted by %(name)s": "Mesaj %(name)s tarafından silindi", + "Message deleted": "Mesaj silindi", + "%(name)s declined": "%(name)s reddetti", + "You declined": "Reddettiniz", + "You have ignored this user, so their message is hidden. Show anyways.": "Bu kullanıcıyı yok saydınız, bu yüzden mesajları gizlidir. Yine de göster.", + "Video conference started by %(senderName)s": "Video konferans %(senderName)s tarafından başlatıldı", + "Video conference updated by %(senderName)s": "Video konferans %(senderName)s tarafından güncellendi", + "Video conference ended by %(senderName)s": "Video konferans %(senderName)s tarafından sonlandırıldı", + "React": "Tepki ver", + "The encryption used by this room isn't supported.": "Bu odada kullanılan şifreleme desteklenmiyor.", + "Encryption not enabled": "Şifreleme etkin değil", + "Ignored attempt to disable encryption": "Şifrelemeyi devre dışı bırakma denemesi yok sayıldı", + "Encryption enabled": "Şifreleme etkin", + "Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their avatar.": "Bu odadaki mesajlar uçtan uca şifrelenmiştir. İnsanlar katıldığında, onları profillerinden doğrulayabilirsiniz, avatarlarına dokunmanız yeterlidir.", + "Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "Buradaki mesajlar uçtan uca şifrelenmiştir. %(displayName)s kullanıcısını profilinden onaylayın -avatarına dokunun.", + "Compare emoji": "Emoji karşılaştır", + "Verification cancelled": "Doğrulama iptal edildi", + "You cancelled verification.": "Doğrulamayı iptal ettiniz.", + "%(displayName)s cancelled verification.": "%(displayName)s doğrulamayı iptal etti.", + "You cancelled verification on your other session.": "Diğer oturumunuzda doğrulamayı iptal ettiniz.", + "Verification timed out.": "Doğrulama zaman aşımına uğradı.", + "Delete sessions|one": "Oturumu sil", + "Delete sessions|other": "Oturumları sil", + "Click the button below to confirm deleting these sessions.|one": "Bu oturumları silmeyi onaylamak için aşağıdaki butona tıklayın.", + "See when the name changes in your active room": "Aktif odanızın isim değişikliklerini görün", + "See when the name changes in this room": "Bu odanın isim değişikliklerini görün", + "See when the topic changes in this room": "Bu odada konu değişikliğini görün", + "See when the topic changes in your active room": "Aktif odanızda konu değiştiğinde görün", + "Remain on your screen when viewing another room, when running": "a", + "Incoming call": "Gelen arama", + "Incoming video call": "Gelen görüntülü arama", + "Incoming voice call": "Gelen sesli arama", + "Unknown caller": "Bilinmeyen arayan", + "%(name)s on hold": "%(name)s beklemede", + "Return to call": "Aramaya dön", + "Fill Screen": "Ekrana sığdır", + "Voice Call": "Sesi arama", + "%(peerName)s held the call": "%(peerName)s aramayı duraklattı", + "Video Call": "Görüntülü arama", + "sends snowfall": "Kartopu gönderir", + "Sends the given message with snowfall": "Mesajı kartopu ile gönderir", + "sends fireworks": "Havai fişek gönderir", + "Sends the given message with fireworks": "Mesajı havai fişeklerle gönderir", + "sends confetti": "Konfeti gönderir", + "Send stickers to this room as you": "", + "Send stickers to your active room as you": "", + "Send messages as you in this room": "", + "Answered Elsewhere": "Arama başka bir yerde yanıtlandı", + "Effects": "Efektler", + "Sends the given message with confetti": "Mesajı konfeti ile gönderir", + "Downloading logs": "Günlükler indiriliyor", + "Uploading logs": "Günlükler yükleniyor", + "Show chat effects": "Sohbet efektlerini gösterin", + "Enable experimental, compact IRC style layout": "Deneysel, kompakt IRC tarzı düzeni etkinleştirin", + "IRC display name width": "IRC görünen ad genişliği", + "Manually verify all remote sessions": "Bütün uzaktan oturumları el ile onayla", + "How fast should messages be downloaded.": "Mesajlar ne kadar hızlı indirilmeli.", + "Show previews/thumbnails for images": "Fotoğraflar için ön izleme/küçük resim göster", + "System font name": "Sistem yazı tipi ismi", + "Use a system font": "Bir sistem yazı tipi kullanın", + "Use Ctrl + Enter to send a message": "Mesaj göndermek için Ctrl + Enter tuşlarını kullanın", + "Use Command + Enter to send a message": "Mesaj göndermek için Command + Enter tuşlarını kullanın", + "Use a more compact ‘Modern’ layout": "Daha kompakt \"Modern\" düzen", + "Use custom size": "Özel büyüklük kullan", + "Font size": "Yazı boyutu", + "Enable advanced debugging for the room list": "Oda listesi için gelişmiş hata ayıklamayı etkinleştirin", + "Show message previews for reactions in DMs": "DM'lerdeki tepkiler için mesaj ön izlemelerini göster", + "Show message previews for reactions in all rooms": "Tüm odalardaki tepkiler için mesaj ön izlemelerini göster", + "Communities v2 prototypes. Requires compatible homeserver. Highly experimental - use with caution.": "Topluluklar v2 prototipleri. Uygun ana sunucu gerektirir. Deneysel - dikkatli kullanın.", + "End": "End", + "Space": "Boşluk", + "Enter": "Enter", + "Esc": "Esc", + "%(senderName)s: %(stickerName)s": "%(senderName)s%(stickerName)s", + "%(senderName)s: %(reaction)s": "%(senderName)s%(reaction)s", + "%(senderName)s: %(message)s": "%(senderName)s%(message)s", + "* %(senderName)s %(emote)s": "%(senderName)s%(emote)s", + "%(senderName)s ended the call": "%(senderName)s aramayı sonlandırdı", + "You ended the call": "Aramayı sonlandırdınız", + "Click the button below to confirm deleting these sessions.|other": "Bu oturumları silmeyi onaylamak için aşağıdaki butona tıklayın.", + "Confirm deleting these sessions": "Bu oturumları silmeyi onayla", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|one": "Kimliğinizi kanıtlamak için Tek Seferliğine Oturum Açma özelliğini kullanarak bu oturumu silmeyi onaylayın.", + "Confirm deleting these sessions by using Single Sign On to prove your identity.|other": "Kimliğinizi kanıtlamak için Tek Seferlik Oturum Açma kullanarak bu oturumları silmeyi onaylayın.", + "New published address (e.g. #alias:server)": "Yeni yayınlanmış adresler (e.g. #alias:server)", + "Published Addresses": "Yayınlanmış adresler", + "No other published addresses yet, add one below": "Henüz yayınlanmış başka adres yok, aşağıdan bir tane ekle", + "Other published addresses:": "Diğer yayınlanmış adresler:", + "Published addresses can be used by anyone on any server to join your room. To publish an address, it needs to be set as a local address first.": "Yayınlanmış adresler, odanıza katılmak için herhangi bir sunucudaki herkes tarafından kullanılabilir. Bir adresi yayınlamak için önce yerel adres olarak ayarlanması gerekir.", + "Error removing address": "Adres kaldırılırken hata", + "There was an error removing that address. It may no longer exist or a temporary error occurred.": "Adres kaldırılırken bir hata ile karşılaşıldı. Artık mevcut olmayabilir yada geçici bir oluştu.", + "You don't have permission to delete the address.": "Bu adresi silmeye yetkiniz yok.", + "There was an error creating that address. It may not be allowed by the server or a temporary failure occurred.": "Adres oluşturulurken hata ile karşılaşıldı. Sunucu tarafından izin verilmemiş yada geçici bir hata olabilir.", + "Error creating address": "Adres oluşturulurken hata", + "You can still join it because this is a public room.": "Herkese açık oda olduğu için yine de katılabilirsiniz.", + "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "Davetinizi doğrularken %(errcode)s kodlu hata ile karşılaşıldı. Bu bilgiyi oda yöneticisine iletebilirsiniz.", + "%(count)s results|one": "%(count)s adet sonuç", + "%(count)s results|other": "%(count)s adet sonuç", + "Explore all public rooms": "Tüm herkese açık odaları keşfet", + "Start a new chat": "Yeni bir sohbet başlat", + "Can't see what you’re looking for?": "Aradığınızı bulamıyor musunuz ?", + "Custom Tag": "Özel Etiket", + "Explore public rooms": "Herkese açık odaları keşfet", + "Explore community rooms": "Topluluk odalarını keşfet", + "People": "İnsanlar", + "Show Widgets": "Widgetları Göster", + "Hide Widgets": "Widgetları gizle", + "No recently visited rooms": "Yakında ziyaret edilen oda yok", + "Seen by %(displayName)s (%(userName)s) at %(dateTime)s": "%(displayName)s %(userName)s tarafından %(dateTime)s tarihinde görüldü", + "Unpin Message": "Mesajın sabitlemesini kaldır", + "This is the start of .": "Bu odasının başlangıcıdır.", + "Add a photo, so people can easily spot your room.": "İnsanların odanı kolayca tanıması için bir fotoğraf ekle.", + "%(displayName)s created this room.": "%(displayName)s bu odayı oluşturdu.", + "You created this room.": "Bu odayı oluşturdunuz.", + "Add a topic to help people know what it is about.": "İnsanların ne hakkında olduğunu bilmelerine yardımcı olmak için Konu ekle.", + "Topic: %(topic)s ": "Konu: %(topic)s ", + "This is the beginning of your direct message history with .": "Bu ile olan direkt mesaj geçmişinizin başlangıcıdır.", + "Only the two of you are in this conversation, unless either of you invites anyone to join.": "Biriniz bir başkasını davet etmediğiniz sürece bu görüşmede sadece ikiniz varsınız.", + "Emoji picker": "Emoji seçici", + "Scroll to most recent messages": "En son mesajlara git", + "The authenticity of this encrypted message can't be guaranteed on this device.": "Bu şifrelenmiş mesajın güvenilirliği bu cihazda garanti edilemez.", + "Australia": "Avustralya", + "Aruba": "Aruba", + "Armenia": "Ermenistan", + "Argentina": "Arjantin", + "Antigua & Barbuda": "Antigua ve Barbuda", + "Antarctica": "Antarktika", + "Anguilla": "Anguilla", + "Angola": "Angola", + "Andorra": "Andorra", + "American Samoa": "Amerikan Samoası", + "Algeria": "Cezayir", + "Albania": "Arnavutluk", + "Åland Islands": "Aland adaları", + "Afghanistan": "Afganistan", + "United States": "Amerika Birleşik Devletleri", + "United Kingdom": "Birleşik Krallık", + "This will end the conference for everyone. Continue?": "Bu görüşmeyi herkes için bitirecektir. Onaylıyor musunuz ?", + "End conference": "Görüşmeyi bitir", + "You've reached the maximum number of simultaneous calls.": "Maksimum eşzamanlı arama sayısına ulaştınız.", + "Too Many Calls": "Çok fazla arama", + "No other application is using the webcam": "Kamerayı başka bir uygulama kullanmıyor", + "Permission is granted to use the webcam": "Kamerayı kullanmak için izin gerekiyor", + "A microphone and webcam are plugged in and set up correctly": "Mikrofon ve kamera takılımı ve doğru şekilde ayarlanmış mı", + "Call failed because webcam or microphone could not be accessed. Check that:": "Kameraya yada mikrofona erişilemediği için arama yapılamadı. Şunu kontrol edin:", + "Unable to access webcam / microphone": "Kameraya / mikrofona erişilemedi", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Mikrofona erişilemediği için arama yapılamadı. Mikrofonun takılı ve doğru şekilde ayarlandığından emin olun.", + "Unable to access microphone": "Mikrofona erişilemiyor", + "The call was answered on another device.": "Arama başka bir cihazda cevaplandı.", + "The call could not be established": "Arama yapılamadı", + "The other party declined the call.": "Diğer taraf aramayı reddetti.", + "Call Declined": "Arama Reddedildi", + "Confirm adding this phone number by using Single Sign On to prove your identity.": "Kimliğinizi doğrulamak için Tek Seferlik Oturum Açma özelliğini kullanarak bu telefon numarasını eklemeyi onaylayın.", + "Single Sign On": "Tek seferlik oturum aç", + "Confirm adding this email address by using Single Sign On to prove your identity.": "Kimliğinizi doğrulamak için Tek Seferlik Oturum Açma özelliğini kullanarak bu e-posta adresini eklemeyi onaylayın.", + "Use Single Sign On to continue": "Devam etmek için tek seferlik oturum açın" } From 4e6f90bbe0ee56ba2787966e71b8f665e22ebb32 Mon Sep 17 00:00:00 2001 From: eman luff Date: Sat, 9 Jan 2021 22:48:19 +0000 Subject: [PATCH 140/231] Translated using Weblate (Polish) Currently translated at 70.2% (1912 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pl/ --- src/i18n/strings/pl.json | 42 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index be30368d9b..424d6560b3 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -1993,5 +1993,45 @@ "No recently visited rooms": "Brak ostatnio odwiedzonych pokoi", "Show Widgets": "Pokaż widgety", "Can't see what you’re looking for?": "Nie możesz znaleźć tego, czego szukasz?", - "Start a new chat": "Rozpocznij nową rozmowę" + "Start a new chat": "Rozpocznij nową rozmowę", + "Change the name of this room": "Zmień nazwę tego pokoju", + "Interactively verify by Emoji": "Zweryfikuj interaktywnie przez Emoji", + "Not Trusted": "Nie zaufany(-a)", + "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:", + "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", + "%(senderName)s changed a rule that was banning rooms matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s zmienił regułę banującą pokoje pasujące do wzorca na %(oldGlob)s ustawiając nowy wzorzec %(newGlob)s z powodu %(reason)s", + "%(senderName)s changed a rule that was banning users matching %(oldGlob)s to matching %(newGlob)s for %(reason)s": "%(senderName)s zmienił regułę banującą użytkowników pasujących do wzorca na %(oldGlob)s ustawiając nowy wzorzec %(newGlob)s z powodu %(reason)s", + "%(senderName)s created a rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s utworzył regułę banującą serwery pasujące do wzorca %(glob)s z powodu %(reason)s", + "%(senderName)s created a rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s utworzył regułę banującą pokoje pasujące do wzorca %(glob)s z powodu %(reason)s", + "%(senderName)s created a rule banning users matching %(glob)s for %(reason)s": "%(senderName)s utworzył regułę banującą użytkowników pasujących do wzorca %(glob)s z powodu %(reason)s", + "%(senderName)s updated the rule banning servers matching %(glob)s for %(reason)s": "%(senderName)s zaktualizował regułę banującą serwery pasujące do wzorca %(glob)s z powodu %(reason)s", + "%(senderName)s updated the rule banning rooms matching %(glob)s for %(reason)s": "%(senderName)s zaktualizował regułę banującą pokoje pasujące do wzorca %(glob)s z powodu %(reason)s", + "%(senderName)s updated the rule banning users matching %(glob)s for %(reason)s": "%(senderName)s zaktualizował regułę banującą użytkowników pasujących do wzorca %(glob)s z powodu %(reason)s", + "%(senderName)s updated an invalid ban rule": "%(senderName)s zaktualizował nieprawidłową regułę banującą", + "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s usunął regułę banującą serwery pasujące do wzorca %(glob)s", + "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s usunął regułę banującą pokoje pasujące do wzorca %(glob)s", + "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s usunął regułę banującą użytkowników pasujących do wzorca %(glob)s", + "%(senderName)s declined the call.": "%(senderName)s odrzucił(a) połączenie.", + "(an error occurred)": "(wystąpił błąd)", + "(their device couldn't start the camera / microphone)": "(ich urządzenie nie może uruchomić kamery / mikrofonu)", + "(connection failed)": "(połączenie nieudane)", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s usunął(-ęła) alternatywny adres %(addresses)s tego pokoju.", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s usunął(-ęła) alternatywny adres %(addresses)s tego pokoju.", + "🎉 All servers are banned from participating! This room can no longer be used.": "🎉 Wszystkie serwery zostały wykluczone z uczestnictwa! Ten pokój nie może być już używany.", + "Effects": "Efekty", + "Japan": "Japonia", + "Jamaica": "Jamajka", + "Italy": "Włochy", + "You've reached the maximum number of simultaneous calls.": "Osiągnięto maksymalną liczbę jednoczesnych połączeń.", + "Too Many Calls": "Zbyt wiele połączeń", + "No other application is using the webcam": "Kamera nie jest obecnie używana przez inną aplikację", + "Permission is granted to use the webcam": "Przyznano uprawnienia dostępu do kamery", + "A microphone and webcam are plugged in and set up correctly": "Mikrofon i kamera są podpięte i skonfigurowane prawidłowo", + "Call failed because webcam or microphone could not be accessed. Check that:": "Połączenie nieudane z powodu braku dostępu do kamery bądź mikrofonu. Sprawdź czy:", + "Unable to access webcam / microphone": "Nie można uzyskać dostępu do kamery / mikrofonu", + "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Nie udało się zestawić połączenia z powodu braku dostępu do mikrofonu. Sprawdź czy mikrofon jest podłączony i poprawnie skonfigurowany.", + "Unable to access microphone": "Nie można uzyskać dostępu do mikrofonu" } From 5a7f5c106222ca0c0b634cac517b978056e45887 Mon Sep 17 00:00:00 2001 From: Tuomas Hietala Date: Thu, 7 Jan 2021 22:00:42 +0000 Subject: [PATCH 141/231] Translated using Weblate (Finnish) Currently translated at 95.6% (2602 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fi/ --- src/i18n/strings/fi.json | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index be8a1a771c..77f59690dd 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -391,7 +391,7 @@ "You are no longer ignoring %(userId)s": "Huomioit jälleen käyttäjän %(userId)s", "%(senderName)s removed their profile picture.": "%(senderName)s poisti profiilikuvansa.", "%(senderName)s set a profile picture.": "%(senderName)s asetti profiilikuvan.", - "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s muutti tulevat viestit näkyviksi kaikille huoneen jäsenille, alkaen kutsusta huoneeseen.", + "%(senderName)s made future room history visible to all room members, from the point they are invited.": "%(senderName)s muutti tulevan huonehistorian näkyväksi kaikille huoneen jäsenille heidän kutsumisestaan alkaen.", "%(senderName)s made future room history visible to all room members, from the point they joined.": "%(senderName)s teki tulevan huonehistorian näkyväksi kaikille huoneen jäsenille, heidän liittymisestään alkaen.", "%(senderName)s made future room history visible to all room members.": "%(senderName)s teki tulevan huonehistorian näkyväksi kaikille huoneen jäsenille.", "%(senderName)s made future room history visible to anyone.": "%(senderName)s teki tulevan huonehistorian näkyväksi kaikille.", @@ -1030,7 +1030,7 @@ "Thumbs up": "Peukut ylös", "We've sent you an email to verify your address. Please follow the instructions there and then click the button below.": "Lähetimme sinulle sähköpostin osoitteesi vahvistamiseksi. Noudata sähköpostissa olevia ohjeita, ja klikkaa sen jälkeen alla olevaa painiketta.", "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Oletko varma? Et voi lukea salattuja viestejäsi, mikäli avaimesi eivät ole kunnolla varmuuskopioituna.", - "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Salatut viestit turvataan kahdenkeskisellä salauksella. Vain sinä ja viestien vastaanottaja(t) omaavat avaimet näiden viestien lukemiseen.", + "Encrypted messages are secured with end-to-end encryption. Only you and the recipient(s) have the keys to read these messages.": "Salatut viestit turvataan päästä päähän -salauksella. Vain sinä ja viestien vastaanottaja(t) omaavat avaimet näiden viestien lukemiseen.", "Unable to load key backup status": "Avainten varmuuskopionnin tilan lukeminen epäonnistui", "Back up your keys before signing out to avoid losing them.": "Varmuuskopioi avaimesi ennen kuin kirjaudut ulos välttääksesi avainten menetyksen.", "Backing up %(sessionsRemaining)s keys...": "Varmuuskopioidaan %(sessionsRemaining)s avainta…", @@ -1136,7 +1136,7 @@ "Deactivating your account does not by default cause us to forget messages you have sent. If you would like us to forget your messages, please tick the box below.": "Tilisi poistaminen käytöstä ei oletuksena saa meitä unohtamaan lähettämiäsi viestejä. Jos haluaisit meidän unohtavan viestisi, rastita alla oleva ruutu.", "Message visibility in Matrix is similar to email. Our forgetting your messages means that messages you have sent will not be shared with any new or unregistered users, but registered users who already have access to these messages will still have access to their copy.": "Viestien näkyvyys Matrixissa on samantapainen kuin sähköpostissa. Vaikka se, että unohdamme viestisi, tarkoittaa, ettei viestejäsi jaeta enää uusille tai rekisteröitymättömille käyttäjille, käyttäjät, jotka ovat jo saaneet viestisi pystyvät lukemaan jatkossakin omaa kopiotaan viesteistäsi.", "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "Unohda kaikki viestit, jotka olen lähettänyt, kun tilini poistetaan (Varoitus: tämä saa tulevat käyttäjät näkemään epätäydellisen version keskusteluista)", - "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Varmenna tämä käyttäjä merkitäksesi hänet luotetuksi. Käyttäjiin luottaminen antaa sinulle ylimääräistä mielenrauhaa käyttäessäsi osapuolten välistä salausta.", + "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Varmenna tämä käyttäjä merkitäksesi hänet luotetuksi. Käyttäjiin luottaminen antaa sinulle ylimääräistä mielenrauhaa käyttäessäsi päästä päähän -salausta.", "Waiting for partner to confirm...": "Odotetaan, että toinen osapuoli varmistaa...", "Incoming Verification Request": "Saapuva varmennuspyyntö", "You've previously used %(brand)s on %(host)s with lazy loading of members enabled. In this version lazy loading is disabled. As the local cache is not compatible between these two settings, %(brand)s needs to resync your account.": "Olet aikaisemmin käytttänyt %(brand)sia laitteella %(host)s, jossa oli jäsenten laiska lataus käytössä. Tässä versiossa laiska lataus on pois käytöstä. Koska paikallinen välimuisti ei ole yhteensopiva näiden kahden asetuksen välillä, %(brand)sin täytyy synkronoida tilisi tiedot uudelleen.", @@ -1232,7 +1232,7 @@ "A widget located at %(widgetUrl)s would like to verify your identity. By allowing this, the widget will be able to verify your user ID, but not perform actions as you.": "Sovelma osoitteessa %(widgetUrl)s haluaisi todentaa henkilöllisyytesi. Jos sallit tämän, sovelma pystyy todentamaan käyttäjätunnuksesi, muttei voi toimia nimissäsi.", "Remember my selection for this widget": "Muista valintani tälle sovelmalle", "Deny": "Kiellä", - "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Tunnistimme dataa, joka on lähtöisin vanhasta %(brand)sin versiosta. Tämä aiheuttaa toimintahäiriöitä osapuolten välisessä salauksessa vanhassa versiossa. Viestejä, jotka on salattu osapuolten välisellä salauksella vanhalla versiolla, ei välttämättä voida purkaa tällä versiolla. Tämä voi myös aiheuttaa epäonnistumisia viestien välityksessä tämän version kanssa. Jos kohtaat ongelmia, kirjaudu ulos ja takaisin sisään. Säilyttääksesi viestihistoriasi, vie salausavaimesi ja tuo ne uudelleen.", + "Data from an older version of %(brand)s has been detected. This will have caused end-to-end cryptography to malfunction in the older version. End-to-end encrypted messages exchanged recently whilst using the older version may not be decryptable in this version. This may also cause messages exchanged with this version to fail. If you experience problems, log out and back in again. To retain message history, export and re-import your keys.": "Tunnistimme dataa, joka on lähtöisin vanhasta %(brand)sin versiosta. Tämä aiheuttaa toimintahäiriöitä päästä päähän -salauksessa vanhassa versiossa. Viestejä, jotka on salattu päästä päähän -salauksella vanhalla versiolla, ei välttämättä voida purkaa tällä versiolla. Tämä voi myös aiheuttaa epäonnistumisia viestien välityksessä tämän version kanssa. Jos kohtaat ongelmia, kirjaudu ulos ja takaisin sisään. Säilyttääksesi viestihistoriasi, vie salausavaimesi ja tuo ne uudelleen.", "%(brand)s failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "%(brand)s epäonnistui protokollalistan hakemisessa kotipalvelimelta. Kotipalvelin saattaa olla liian vanha tukeakseen kolmannen osapuolen verkkoja.", "%(brand)s failed to get the public room list.": "%(brand)s ei onnistunut hakemaan julkista huoneluetteloa.", "The homeserver may be unavailable or overloaded.": "Kotipalvelin saattaa olla saavuttamattomissa tai ylikuormitettuna.", @@ -1632,9 +1632,9 @@ "Failed to connect to integration manager": "Yhdistäminen integraatioiden lähteeseen epäonnistui", "Trusted": "Luotettu", "Not trusted": "Ei-luotettu", - "This client does not support end-to-end encryption.": "Tämä asiakasohjelma ei tue osapuolten välistä salausta.", - "Messages in this room are not end-to-end encrypted.": "Tämän huoneen viestit eivät ole salattuja.", - "Messages in this room are end-to-end encrypted.": "Tämän huoneen viestit ovat salattuja.", + "This client does not support end-to-end encryption.": "Tämä asiakasohjelma ei tue päästä päähän -salausta.", + "Messages in this room are not end-to-end encrypted.": "Tämän huoneen viestit eivät ole päästä päähän -salattuja.", + "Messages in this room are end-to-end encrypted.": "Tämän huoneen viestit ovat päästä päähän -salattuja.", "Verify": "Varmenna", "You have ignored this user, so their message is hidden. Show anyways.": "Olet jättänyt tämän käyttäjän huomiotta, joten hänen viestit ovat piilotettu. Näytä käyttäjän viestit.", "You verified %(name)s": "Varmensit käyttäjän %(name)s", @@ -1829,7 +1829,7 @@ "Use your account or create a new one to continue.": "Käytä tiliäsi tai luo uusi jatkaaksesi.", "Create Account": "Luo tili", "Session already verified!": "Istunto on jo vahvistettu!", - "WARNING: Session already verified, but keys do NOT MATCH!": "VAROITUS: Istunto on jo vahvistettu, mutta avaimet EIVÄT VASTAA!", + "WARNING: Session already verified, but keys do NOT MATCH!": "VAROITUS: Istunto on jo vahvistettu, mutta avaimet EIVÄT TÄSMÄÄ!", "Not Trusted": "Ei luotettu", "Ask this user to verify their session, or manually verify it below.": "Pyydä tätä käyttäjää vahvistamaan istuntonsa, tai vahvista se manuaalisesti alla.", "a few seconds from now": "muutama sekunti sitten", @@ -1846,13 +1846,13 @@ "If you cancel now, you won't complete verifying your other session.": "Jos peruutat nyt, toista istuntoasi ei varmenneta.", "Setting up keys": "Otetaan avaimet käyttöön", "Verifies a user, session, and pubkey tuple": "Varmentaa käyttäjän, istunnon ja julkiset avaimet", - "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!": "VAROITUS: AVAIMEN VARMENTAMINEN EPÄONNISTUI! Käyttäjän %(userId)s ja laitteen %(deviceId)s istunnon allekirjoitusavain on ”%(fprint)s”, mikä ei täsmää annettuun avaimeen ”%(fingerprint)s”. Tämä voi tarkoittaa, että yhteyksiänne peukaloidaan!", + "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!": "VAROITUS: AVAIMEN VARMENTAMINEN EPÄONNISTUI! Käyttäjän %(userId)s ja laitteen %(deviceId)s istunnon allekirjoitusavain on ”%(fprint)s”, mikä ei täsmää annettuun avaimeen ”%(fingerprint)s”. Tämä voi tarkoittaa, että viestintäänne siepataan!", "The signing key you provided matches the signing key you received from %(userId)s's session %(deviceId)s. Session marked as verified.": "Antamasi allekirjoitusavain täsmää käyttäjältä %(userId)s saamaasi istunnon %(deviceId)s allekirjoitusavaimeen. Istunto on varmennettu.", "Displays information about a user": "Näyttää tietoa käyttäjästä", "%(senderDisplayName)s changed the room name from %(oldRoomName)s to %(newRoomName)s.": "%(senderDisplayName)s vaihtoi huoneen nimen %(oldRoomName)s nimeksi %(newRoomName)s.", - "%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s lisäsi vaihtoehtoisia osoitteita %(addresses)s tälle huoneelle.", + "%(senderName)s added the alternative addresses %(addresses)s for this room.|other": "%(senderName)s lisäsi vaihtoehtoiset osoitteet %(addresses)s tälle huoneelle.", "%(senderName)s added the alternative addresses %(addresses)s for this room.|one": "%(senderName)s lisäsi vaihtoehtoisen osoitteen %(addresses)s tälle huoneelle.", - "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s poisti vaihtoehtoisia osoitteita %(addresses)s tältä huoneelta.", + "%(senderName)s removed the alternative addresses %(addresses)s for this room.|other": "%(senderName)s poisti vaihtoehtoiset osoitteet %(addresses)s tältä huoneelta.", "%(senderName)s removed the alternative addresses %(addresses)s for this room.|one": "%(senderName)s poisti vaihtoehtoisen osoitteitteen %(addresses)s tältä huoneelta.", "%(senderName)s changed the alternative addresses for this room.": "%(senderName)s muutti tämän huoneen vaihtoehtoisia osoitteita.", "%(senderName)s changed the main and alternative addresses for this room.": "%(senderName)s muutti tämän huoneen pää- sekä vaihtoehtoisia osoitteita.", @@ -2018,7 +2018,7 @@ "Waiting for your other session to verify…": "odotetaan toista istuntoasi varmennukseen…", "Verify all your sessions to ensure your account & messages are safe": "Varmenna kaikki istuntosi varmistaaksesi, että tunnuksesi ja viestisi ovat turvassa", "Verify the new login accessing your account: %(name)s": "Varmenna uusi tunnuksellesi sisäänkirjautunut taho: %(name)s", - "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Tällä hetkellä salasanan vaihtaminen nollaa kaikki osapuolten välisen salauksen avaimet kaikissa istunnoissa, tehden salatusta keskusteluhistoriasta lukukelvotonta, ellet ensin vie kaikkia huoneavaimiasi ja tuo niitä salasanan vaihtamisen jäkeen takaisin. Tulevaisuudessa tämä tulee toimimaan paremmin.", + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Tällä hetkellä salasanan vaihtaminen nollaa kaikki päästä päähän -salauksen avaimet kaikissa istunnoissa, tehden salatusta keskusteluhistoriasta lukukelvotonta, ellet ensin vie kaikkia huoneavaimiasi ja tuo niitä salasanan vaihtamisen jäkeen takaisin. Tulevaisuudessa tämä tulee toimimaan paremmin.", "Your homeserver does not support cross-signing.": "Kotipalvelimesi ei tue ristiinvarmennusta.", "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Tunnuksellasi on ristiinvarmennuksen identiteetti salaisessa tallennustilassa, mutta tämä istunto ei vielä luota siihen.", "Reset cross-signing and secret storage": "Nollaa ristivarmennus ja salavarasto", @@ -2046,7 +2046,7 @@ "This user has not verified all of their sessions.": "Tämä käyttäjä ei ole varmentanut kaikkia istuntojaan.", "You have not verified this user.": "Et ole varmentanut tätä käyttäjää.", "You have verified this user. This user has verified all of their sessions.": "Olet varmentanut tämän käyttäjän. Tämä käyttäjä on varmentanut kaikki istuntonsa.", - "This room is end-to-end encrypted": "Tämä huone käyttää osapuolten välistä salausta", + "This room is end-to-end encrypted": "Tämä huone käyttää päästä päähän -salausta", "Everyone in this room is verified": "Kaikki tämän huoneen käyttäjät on varmennettu", "Your key share request has been sent - please check your other sessions for key share requests.": "Avainten jakopyyntösi on lähetetty. Tarkista muut istuntosi avainten jakopyyntöjen varalta.", "Key share requests are sent to your other sessions automatically. If you rejected or dismissed the key share request on your other sessions, click here to request the keys for this session again.": "Avainten jakopyynnöt lähetetään muille istunnoillesi automaattisesti. Jos hylkäsit tai jätit huomiotta avainten jakopyynnön toisessa istunnossasi, klikkaa tästä pyytääksesi avaimia uudelleen.", @@ -2096,11 +2096,11 @@ "Destroy cross-signing keys?": "Tuhoa ristiinvarmennuksen avaimet?", "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.": "Ristiinvarmennuksen avainten tuhoamista ei voi kumota. Jokainen, jonka olet varmentanut, tulee näkemään turvallisuushälytyksiä. Et todennäköisesti halua tehdä tätä, ellet ole hukannut kaikkia laitteitasi, joista pystyit ristiinvarmentamaan.", "Clear cross-signing keys": "Tyhjennä ristiinvarmennuksen avaimet", - "Enable end-to-end encryption": "Ota osapuolten välinen salaus käyttöön", + "Enable end-to-end encryption": "Ota päästä päähän -salaus käyttöön", "Session key": "Istunnon tunnus", "Verification Requests": "Varmennuspyynnöt", "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Tämän käyttäjän varmentaminen merkitsee hänen istuntonsa luotetuksi, ja myös merkkaa sinun istuntosi luotetuksi hänen laitteissaan.", - "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Varmenna tämä laite merkataksesi se luotetuksi. Tähän laitteeseen luottaminen antaa sinulle ja muille käyttäjille ylimääräistä mielenrauhaa, kun käytätte osapuolten välistä salausta.", + "Verify this device to mark it as trusted. Trusting this device gives you and other users extra peace of mind when using end-to-end encrypted messages.": "Varmenna tämä laite merkitäksesi sen luotetuksi. Tähän laitteeseen luottaminen antaa sinulle ja muille käyttäjille lisää mielenrauhaa, kun käytätte päästä päähän -salausta.", "Verifying this device will mark it as trusted, and users who have verified with you will trust this device.": "Tämän laitteen varmentaminen merkkaa sen luotetuksi, ja sinut varmentaneet käyttäjät luottavat automaattisesti tähän laitteeseen.", "Confirm to continue": "Haluan jatkaa", "Click the button below to confirm your identity.": "Paina alapuolella olevaa painiketta varmistaaksesi identiteettisi.", @@ -2253,7 +2253,7 @@ "Error leaving room": "Virhe poistuessa huoneesta", "Unexpected server error trying to leave the room": "Huoneesta poistuessa tapahtui odottamaton palvelinvirhe", "%(senderName)s declined the call.": "%(senderName)s hylkäsi puhelun.", - "(an error occurred)": "(virhe tapahtui)", + "(an error occurred)": "(tapahtui virhe)", "(their device couldn't start the camera / microphone)": "(hänen laitteensa ei voinut käynnistää kameraa tai mikrofonia)", "(connection failed)": "(yhteys katkesi)", "🎉 All servers are banned from participating! This room can no longer be used.": "Kaikki palvelimet ovat saaneet porttikiellon huoneeseen! Tätä huonetta ei voi enää käyttää.", @@ -2261,7 +2261,7 @@ "Are you sure you want to cancel entering passphrase?": "Haluatko varmasti peruuttaa salasanan syöttämisen?", "The call was answered on another device.": "Puheluun vastattiin toisessa laitteessa.", "Answered Elsewhere": "Vastattu muualla", - "The call could not be established": "Puhelua ei voitu aloittaa", + "The call could not be established": "Puhelua ei voitu muodostaa", "The other party declined the call.": "Toinen osapuoli hylkäsi puhelun.", "Call Declined": "Puhelu hylätty", "%(brand)s Android": "%(brand)s Android", @@ -2699,8 +2699,8 @@ "Use the Desktop app to see all encrypted files": "Voit tarkastella kaikkia salattuja tiedostoja työpöytäsovelluksella", "Use the Desktop app to search encrypted messages": "Käytä salattuja viestejä työpöytäsovelluksella", "Ignored attempt to disable encryption": "Ohitettu yritys poistaa salaus käytöstä", - "Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "Tässä olevat viestit on päästä-päähän -salattu. Vahvista %(displayName)s heidät - napauta heidän profiilikuvia.", - "Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their avatar.": "Tämän huoneen viestit on päästä-päähän -salattu. Kun ihmisiä liittyy, voit vahvistaa heidät heidän profiilista, napauta vain heidän profiilikuvaa.", + "Messages here are end-to-end encrypted. Verify %(displayName)s in their profile - tap on their avatar.": "Tässä olevat viestit on päästä päähän -salattu. Vahvista %(displayName)s profiilistaan napauttamalla profiilikuvaa.", + "Messages in this room are end-to-end encrypted. When people join, you can verify them in their profile, just tap on their avatar.": "Tämän huoneen viestit on päästä päähän -salattu. Kun ihmisiä liittyy, heidät voi vahvistaa profiilistaan profiilikuvaa napauttamalla.", "Unpin a widget to view it in this panel": "Irrota sovelma, jotta voit tarkastella sitä tässä paneelissa", "You can only pin up to %(count)s widgets|other": "Voit kiinnittää enintään %(count)s sovelmaa", "Favourited": "Suositut", From cb17d56049a9712e22b3a0a5bee39d814eb18fd9 Mon Sep 17 00:00:00 2001 From: Rachida S Date: Sun, 10 Jan 2021 20:15:12 +0000 Subject: [PATCH 142/231] Translated using Weblate (Kabyle) Currently translated at 92.8% (2527 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/kab/ --- src/i18n/strings/kab.json | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index d713e13efd..8d59a43116 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -2283,7 +2283,7 @@ "Server did not require any authentication": "Aqeddac ur isuter ara akk asesteb", "Server did not return valid authentication information.": "Aqeddac ur d-yerri ara talɣut n usesteb tameɣtut.", "Please forget all messages I have sent when my account is deactivated (Warning: this will cause future users to see an incomplete view of conversations)": "Ttxil-k·m ttu akk iznan i yuzneɣ mi ara senseɣ amiḍan-iw (Ɣur-k·m: iseqdacen ara d-yernun ad walin idiwenniyen ur nemmid ara)", - "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Senqed aseqdac-a i wakken ad tcerḍeḍ fell-as d uttkil. Iseqdac uttkilen ad ak·am-d-awin lehna meqqren meqqren i uqerru mi ara tesseqdaceḍ iznan yettwawgelhen seg yixef ɣer yixef.", + "Verify this user to mark them as trusted. Trusting users gives you extra peace of mind when using end-to-end encrypted messages.": "Senqed aseqdac-a i wakken ad tcerḍeḍ fell-as d uttkil. Iseqdac uttkilen ad ak·am-d-awin lehna meqqren meqqren i uqerru mi ara tesseqdaceḍ iznan yettwawgelhen seg yixef ɣer yixef.", "Verifying this user will mark their session as trusted, and also mark your session as trusted to them.": "Asenqed n useqdac-a ad yecreḍ ɣef tɣimit-is tettwattkal, yerna ad yecreḍ ula ɣef tɣimit-ik·im tettwattkal i netta·nettat.", "Enable 'Manage Integrations' in Settings to do this.": "Rmed 'imsidaf n usefrek' deg yiɣewwaren i tigin n waya.", "Your %(brand)s doesn't allow you to use an Integration Manager to do this. Please contact an admin.": "%(brand)s-ik·im ur ak·am yefki ara tisirag i useqdec n umsefrak n umsidef i wakken ad tgeḍ aya. Ttxil-k·m nermes anedbal.", @@ -2720,5 +2720,16 @@ "Palau": "Palaos", "Grenada": "Grenade", "United States": "Iwanaken-Yeddukklen-N-Temrikt", - "New Caledonia": "Kaliduni amaynut" + "New Caledonia": "Kaliduni amaynut", + "You've reached the maximum number of simultaneous calls.": "Tessawḍeḍ amḍan n yisawalen afellay yemseḍfaren.", + "Too Many Calls": "Ddeqs n yisawalen", + "No other application is using the webcam": "Ulac asnas-nniḍen i iseqdacen takamiṛat", + "Permission is granted to use the webcam": "Tettynefk tsiregt i useqdec takamiṛat", + "A microphone and webcam are plugged in and set up correctly": "Asawaḍ d tkamiṛat qqnen yerna ttusewlen akken iwata", + "Call failed because webcam or microphone could not be accessed. Check that:": "Asiwel ur yeddi ara aku takamiṛat neɣ asawaḍ ulac anekum ɣur-s. Senqed aya:", + "Unable to access webcam / microphone": "Anekcum ɣer tkamiṛat / usawaḍ d awezɣi", + "The call was answered on another device.": "Tiririt ɣef usiwel tella-d ɣef yibenk-nniḍen.", + "Answered Elsewhere": "Yerra-d seg wadeg-nniḍen", + "The call could not be established": "Asiwel ur yeqεid ara", + "The other party declined the call.": "Amdan-nniḍen yugi asiwel." } From d04aea5cf04b3750c73d418a895e21938657dd03 Mon Sep 17 00:00:00 2001 From: Miquel Lionel Date: Mon, 11 Jan 2021 18:00:02 +0000 Subject: [PATCH 143/231] Translated using Weblate (French) Currently translated at 86.6% (2359 of 2721 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 00eac69033..fcf1c9d1f7 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2575,5 +2575,29 @@ "A microphone and webcam are plugged in and set up correctly": "Un microphone et une caméra sont branchées et bien configurées", "Unable to access webcam / microphone": "Impossible d'accéder à la caméra ou microphone", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "La fonction a échoué car le microphone n'a pas pu être accédé. Vérifiez qu'un microphone est branché et bien configuré.", - "Unable to access microphone": "Impossible d'accéder au microphone" + "Unable to access microphone": "Impossible d'accéder au microphone", + "Belgium": "Belgique", + "Belarus": "Biélorussie", + "Barbados": "Barbade", + "Bangladesh": "Bangladesh", + "Bahrain": "Bahreïn", + "Bahamas": "Les Bahamas", + "Azerbaijan": "Azerbaïdjan", + "Austria": "Autriche", + "Australia": "Australie", + "Aruba": "Aruba", + "Armenia": "Arménie", + "Argentina": "Argentine", + "Antigua & Barbuda": "Antigue-et-Barbude", + "Antarctica": "Antarctique", + "Anguilla": "Anguilla", + "Angola": "République d'Angola", + "Andorra": "Andorre", + "American Samoa": "Samoa américaines", + "Invite someone using their name, email address, username (like ) or share this room.": "Invitez quelqu'un via leur nom, e-mail ou nom d'utilisateur (p. ex. ) ou partagez ce salon.", + "Start a conversation with someone using their name, email address or username (like ).": "Commencer une conversation avec quelqu'un via leur nom, e-mail ou nom d'utilisateur (comme par exemple ).", + "Too Many Calls": "Trop d'appels", + "Permission is granted to use the webcam": "Permission accordée pour l'utilisation de la webcam", + "Call failed because webcam or microphone could not be accessed. Check that:": "La fonction a échoué car la webcam ou le microphone ne pouvait pas être accédé. Vérifiez que:", + "Send stickers to this room as you": "Envoyer des stickers dans ce salon en tant que vous" } From 328d64ac23dc959c6c3269c5c4176b8718f808eb Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 12 Jan 2021 17:37:24 +0000 Subject: [PATCH 144/231] Run TypeScript tests There aren't any yet, but I'm about to write a test and it's going to be in TypeScript and I don't want to lump this change in with a bunch of other stuff. --- package.json | 3 ++- src/settings/Settings.ts | 4 ++++ yarn.lock | 49 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 92883e64d2..92b574da34 100644 --- a/package.json +++ b/package.json @@ -128,6 +128,7 @@ "@types/classnames": "^2.2.10", "@types/counterpart": "^0.18.1", "@types/flux": "^3.1.9", + "@types/jest": "^26.0.20", "@types/linkifyjs": "^2.1.3", "@types/lodash": "^4.14.158", "@types/modernizr": "^3.5.3", @@ -172,7 +173,7 @@ "jest": { "testEnvironment": "./__test-utils__/environment.js", "testMatch": [ - "/test/**/*-test.js" + "/test/**/*-test.[jt]s" ], "setupFiles": [ "jest-canvas-mock" diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index b239b809fe..4a1e4e630d 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -398,6 +398,10 @@ export const SETTINGS: {[setting: string]: ISetting} = { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, default: null, }, + "voip_mxid_translate_pattern": { + supportedLevels: LEVELS_UI_FEATURE, // not a UI feature, but same level (config only, maybe .well-known in future) + default: null, + }, "language": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, default: "en", diff --git a/yarn.lock b/yarn.lock index 10f16672ea..b0769c2c04 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1665,6 +1665,17 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -1858,6 +1869,14 @@ dependencies: "@types/istanbul-lib-report" "*" +"@types/jest@^26.0.20": + version "26.0.20" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.20.tgz#cd2f2702ecf69e86b586e1f5223a60e454056307" + integrity sha512-9zi2Y+5USJRxd0FsahERhBwlcvFh6D2GLQnY2FH2BzK8J9s9omvNHIbvABwIluXa0fD8XVKMLTO0aOEuUfACAA== + dependencies: + jest-diff "^26.0.0" + pretty-format "^26.0.0" + "@types/json-schema@^7.0.3": version "7.0.4" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" @@ -3465,6 +3484,11 @@ diff-sequences@^26.5.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.5.0.tgz#ef766cf09d43ed40406611f11c6d8d9dd8b2fefd" integrity sha512-ZXx86srb/iYy6jG71k++wBN9P9J05UNQ5hQHQd9MtMPvcqXPx/vKU69jfHV637D00Q2gSgPk2D+jSx3l1lDW/Q== +diff-sequences@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" + integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== + dijkstrajs@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b" @@ -5647,6 +5671,16 @@ jest-config@^26.5.2: micromatch "^4.0.2" pretty-format "^26.5.2" +jest-diff@^26.0.0: + version "26.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394" + integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA== + dependencies: + chalk "^4.0.0" + diff-sequences "^26.6.2" + jest-get-type "^26.3.0" + pretty-format "^26.6.2" + jest-diff@^26.5.2: version "26.5.2" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.5.2.tgz#8e26cb32dc598e8b8a1b9deff55316f8313c8053" @@ -7466,6 +7500,16 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= +pretty-format@^26.0.0, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + pretty-format@^26.5.2: version "26.5.2" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.5.2.tgz#5d896acfdaa09210683d34b6dc0e6e21423cd3e1" @@ -7722,6 +7766,11 @@ react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-i resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +react-is@^17.0.1: + version "17.0.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" + integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== + react-lifecycles-compat@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" From 5b4f9d5bce507e38714df4825ab7a42034194bed Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 12 Jan 2021 17:41:26 +0000 Subject: [PATCH 145/231] Remove unintentional change --- src/settings/Settings.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index 4a1e4e630d..b239b809fe 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -398,10 +398,6 @@ export const SETTINGS: {[setting: string]: ISetting} = { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, default: null, }, - "voip_mxid_translate_pattern": { - supportedLevels: LEVELS_UI_FEATURE, // not a UI feature, but same level (config only, maybe .well-known in future) - default: null, - }, "language": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, default: "en", From 0a61025eadbe48c5c33e506c59fae36c3a919006 Mon Sep 17 00:00:00 2001 From: Miquel Lionel Date: Tue, 12 Jan 2021 17:59:40 +0000 Subject: [PATCH 146/231] Translated using Weblate (French) Currently translated at 94.5% (2579 of 2728 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 229 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 227 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index fcf1c9d1f7..913aabd0c5 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2598,6 +2598,231 @@ "Start a conversation with someone using their name, email address or username (like ).": "Commencer une conversation avec quelqu'un via leur nom, e-mail ou nom d'utilisateur (comme par exemple ).", "Too Many Calls": "Trop d'appels", "Permission is granted to use the webcam": "Permission accordée pour l'utilisation de la webcam", - "Call failed because webcam or microphone could not be accessed. Check that:": "La fonction a échoué car la webcam ou le microphone ne pouvait pas être accédé. Vérifiez que:", - "Send stickers to this room as you": "Envoyer des stickers dans ce salon en tant que vous" + "Call failed because webcam or microphone could not be accessed. Check that:": "La fonction a échoué car la webcam ou le microphone ne pouvait pas être accédé. Vérifiez que :", + "Send stickers to this room as you": "Envoyer des stickers dans ce salon en tant que vous", + "Zambia": "Zambie", + "Yemen": "Yémen", + "Western Sahara": "Sahara occidental", + "Wallis & Futuna": "Wallis-et-Futuna", + "Vietnam": "Viêt Nam", + "Venezuela": "Vénézuéla", + "Vatican City": "Vatican", + "Vanuatu": "Vanuatu", + "Uzbekistan": "Ouzbékistan", + "Uruguay": "Uruguay", + "United Arab Emirates": "Émirats arabes unis", + "Ukraine": "Ukraine", + "Uganda": "Ouganda", + "U.S. Virgin Islands": "Îles Vierges des États-Unis", + "Tuvalu": "Tuvalu", + "Turks & Caicos Islands": "Îles Turques-et-Caïques", + "Turkmenistan": "Turkménistan", + "Turkey": "Turquie", + "Tunisia": "Tunisie", + "Trinidad & Tobago": "Trinité-et-Tobago", + "Tonga": "Tonga", + "Tokelau": "Tokelau", + "Togo": "Togo", + "Timor-Leste": "Timor oriental", + "Thailand": "Thaïlande", + "Tanzania": "Tanzanie", + "Tajikistan": "Tadjikistan", + "Taiwan": "Taïwan", + "São Tomé & Príncipe": "Sao Tomé-et-Principe", + "Syria": "Syrie", + "Switzerland": "Suisse", + "Sweden": "Suède", + "Swaziland": "Eswatini", + "Svalbard & Jan Mayen": "Svalbard et Jan Mayen", + "Suriname": "Suriname", + "Sudan": "Soudan", + "St. Vincent & Grenadines": "Saint-Vincent-et-les-Grenadines", + "St. Pierre & Miquelon": "Saint-Pierre-et-Miquelon", + "St. Martin": "Saint-Martin (Antilles françaises)", + "St. Lucia": "Sainte-Lucie", + "St. Kitts & Nevis": "Saint-Christophe-et-Niévès", + "St. Helena": "Île Sainte-Hélène", + "St. Barthélemy": "Saint-Barthélemy", + "Sri Lanka": "Sri Lanka", + "Spain": "Espagne", + "South Sudan": "Soudan du Sud", + "South Korea": "Corée du Sud", + "South Georgia & South Sandwich Islands": "Géorgie du Sud-et-les îles Sandwich du Sud", + "South Africa": "Afrique du Sud", + "Somalia": "Somalie", + "Solomon Islands": "Îles Salomon", + "Slovenia": "Slovénie", + "Slovakia": "Slovaquie", + "Sint Maarten": "Saint-Martin (royaume des Pays-Bas)", + "Singapore": "Singapour", + "Sierra Leone": "Sierra Leone", + "Seychelles": "Seychelles", + "Serbia": "Serbie", + "Senegal": "Sénégal", + "Saudi Arabia": "Arabie saoudite", + "San Marino": "Saint-Marin", + "Samoa": "Samoa", + "Réunion": "La Réunion", + "Rwanda": "Rwanda", + "Russia": "Russie", + "Romania": "Roumanie", + "Qatar": "Qatar", + "Puerto Rico": "Porto Rico", + "Portugal": "Portugal", + "Poland": "Pologne", + "Pitcairn Islands": "Îles Pitcairn", + "Philippines": "Philippines", + "Peru": "Pérou", + "Paraguay": "Paraguay", + "Papua New Guinea": "Papouasie-Nouvelle-Guinée", + "Panama": "Panama", + "Palestine": "Palestine", + "Palau": "Palaos", + "Pakistan": "Pakistan", + "Oman": "Oman", + "Norway": "Norvège", + "Northern Mariana Islands": "Îles Mariannes du Nord", + "North Korea": "Corée du Nord", + "Norfolk Island": "Île Norfolk", + "Niue": "Niue", + "Nigeria": "Nigéria", + "Niger": "Niger", + "Nicaragua": "Nicaragua", + "New Zealand": "Nouvelle-Zélande", + "New Caledonia": "Nouvelle-Calédonie", + "Netherlands": "Pays-Bas", + "Nepal": "Népal", + "Nauru": "Nauru", + "Namibia": "Namibie", + "Myanmar": "Birmanie", + "Mozambique": "Mozambique", + "Morocco": "Maroc", + "Montserrat": "Montserrat", + "Montenegro": "Monténégro", + "Mongolia": "Mongolie", + "Monaco": "Monaco", + "Moldova": "Moldavie", + "Micronesia": "États fédérés de Micronésie", + "Mexico": "Mexico", + "Mayotte": "Mayotte", + "Mauritius": "République de Maurice", + "Mauritania": "Mauritanie", + "Martinique": "Martinique", + "Marshall Islands": "Îles Marshall", + "Malta": "Malte", + "Mali": "Mali", + "Maldives": "Maldives", + "Malaysia": "Malaisie", + "Malawi": "Malawi", + "Madagascar": "Madagascar", + "Macedonia": "Macédoine du Nord", + "Macau": "Macao", + "Benin": "Bénin", + "Host account on": "Héberger le compte sur", + "Belize": "Bélize", + "Luxembourg": "Luxembourg", + "Lithuania": "Lituanie", + "Liechtenstein": "Liechtenstein", + "Libya": "Libye", + "Liberia": "Liberia", + "Lesotho": "Lesotho", + "Lebanon": "Liban", + "Latvia": "Lettonie", + "Laos": "Laos", + "Kyrgyzstan": "Kirghizistan", + "Kuwait": "Koweït", + "Kosovo": "Kosovo", + "Kiribati": "Kiribati", + "Kenya": "Kenya", + "Kazakhstan": "Kazakhstan", + "Jordan": "Jordanie", + "Jersey": "Jersey", + "Japan": "Japon", + "Jamaica": "Jamaïque", + "Italy": "Italie", + "Israel": "Israël", + "Isle of Man": "Île de Man", + "Ireland": "Irlande", + "Iraq": "Irak", + "Iran": "Iran", + "Indonesia": "Indonésie", + "India": "Inde", + "Iceland": "Islande", + "Hungary": "Hongrie", + "Hong Kong": "Hong Kong", + "Honduras": "Honduras", + "Heard & McDonald Islands": "Îles Heard-et-MacDonald", + "Haiti": "Haïti", + "Guyana": "Guyana", + "Guinea-Bissau": "Guinée-Bissau", + "Guinea": "Guinée", + "Guernsey": "Guernesey", + "Guatemala": "Guatemala", + "Guam": "Guam", + "Guadeloupe": "Guadeloupe", + "Grenada": "Grenade", + "Greenland": "Groenland", + "Greece": "Grèce", + "Gibraltar": "Gibraltar", + "Ghana": "Ghana", + "Germany": "Allemagne", + "Georgia": "Géorgie", + "Gambia": "Gambie", + "Gabon": "République gabonaise", + "French Southern Territories": "Terres australes et antarctiques françaises", + "French Polynesia": "Polynésie française", + "French Guiana": "Guyane", + "France": "France", + "Finland": "Finlande", + "Fiji": "Îles Fidji", + "Faroe Islands": "Îles Féroé", + "Falkland Islands": "Îles Malouines (Falkland)", + "Ethiopia": "Éthiopie", + "Estonia": "Estonie", + "Eritrea": "Érythrée", + "Equatorial Guinea": "Guinée équatoriale", + "El Salvador": "Le Salvador", + "Egypt": "Égypte", + "Ecuador": "République de l'Équateur", + "Dominican Republic": "République dominicaine", + "Dominica": "Dominique", + "Djibouti": "Djibouti", + "Denmark": "Danemark", + "Côte d’Ivoire": "Côte d’Ivoire (Terre d'Éburnie)", + "Czech Republic": "La République tchèque", + "Cyprus": "Chypre", + "Curaçao": "Curaçao", + "Cuba": "Cuba", + "Croatia": "Croatie", + "Costa Rica": "Costa Rica", + "Cook Islands": "Îles Cook", + "Congo - Kinshasa": "République démocratique du Congo", + "Congo - Brazzaville": "République du Congo", + "Comoros": "Comores", + "Colombia": "Colombia", + "Cocos (Keeling) Islands": "îles Cocos", + "Christmas Island": "île Christmas", + "China": "Chine", + "Chile": "Chili", + "Chad": "Tchad", + "Central African Republic": "République centrafricaine", + "Cayman Islands": "Îles Caïmans", + "Caribbean Netherlands": "Pays-Bas caribéens", + "Cape Verde": "Cap-Vert", + "Canada": "Canada", + "Cameroon": "Cameroun", + "Cambodia": "Cambodge", + "Burundi": "La république du Burundi", + "Burkina Faso": "Burkina Faso", + "Bulgaria": "Bulgarie", + "Brunei": "Brunéi", + "British Virgin Islands": "Îles Vierges britanniques", + "British Indian Ocean Territory": "Territoire britannique de l'océan Indien", + "Brazil": "Brésil", + "Bouvet Island": "Île Bouvet", + "Botswana": "", + "Bosnia": "", + "Bolivia": "", + "Bhutan": "", + "Bermuda": "" } From e65e252cea0d043a108308651b94191999867fe6 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 12 Jan 2021 02:26:00 +0000 Subject: [PATCH 147/231] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2728 of 2728 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/zh_Hant/ --- src/i18n/strings/zh_Hant.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index 228fa19817..32a42332e6 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -2986,5 +2986,12 @@ "You have no visible notifications.": "您沒有可見的通知。", "Transfer": "傳輸", "Failed to transfer call": "傳輸通話失敗", - "A call can only be transferred to a single user.": "一個通話只能傳輸給ㄧ個使用者。" + "A call can only be transferred to a single user.": "一個通話只能傳輸給ㄧ個使用者。", + "There was an error finding this widget.": "尋找此小工具時發生錯誤。", + "Active Widgets": "作用中的小工具", + "Open dial pad": "開啟撥號鍵盤", + "Start a Conversation": "開始對話", + "Dial pad": "撥號鍵盤", + "There was an error looking up the phone number": "尋找電話號碼時發生錯誤", + "Unable to look up phone number": "無法查詢電話號碼" } From 5ab2a9cd8a170a820f1236cfedee934c5868336f Mon Sep 17 00:00:00 2001 From: GokdenizK Date: Tue, 12 Jan 2021 15:23:38 +0000 Subject: [PATCH 148/231] Translated using Weblate (Turkish) Currently translated at 76.4% (2086 of 2728 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/tr/ --- src/i18n/strings/tr.json | 58 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index ea782459e4..245585dd19 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -2102,9 +2102,9 @@ "sends fireworks": "Havai fişek gönderir", "Sends the given message with fireworks": "Mesajı havai fişeklerle gönderir", "sends confetti": "Konfeti gönderir", - "Send stickers to this room as you": "", - "Send stickers to your active room as you": "", - "Send messages as you in this room": "", + "Send stickers to this room as you": "Widget bu odaya sizin adınıza çıkartma göndersin", + "Send stickers to your active room as you": "Widget aktif odanıza sizin adınıza çıkartma göndersin", + "Send messages as you in this room": "Widget sizin adınıza mesaj göndersin", "Answered Elsewhere": "Arama başka bir yerde yanıtlandı", "Effects": "Efektler", "Sends the given message with confetti": "Mesajı konfeti ile gönderir", @@ -2212,5 +2212,55 @@ "Confirm adding this phone number by using Single Sign On to prove your identity.": "Kimliğinizi doğrulamak için Tek Seferlik Oturum Açma özelliğini kullanarak bu telefon numarasını eklemeyi onaylayın.", "Single Sign On": "Tek seferlik oturum aç", "Confirm adding this email address by using Single Sign On to prove your identity.": "Kimliğinizi doğrulamak için Tek Seferlik Oturum Açma özelliğini kullanarak bu e-posta adresini eklemeyi onaylayın.", - "Use Single Sign On to continue": "Devam etmek için tek seferlik oturum açın" + "Use Single Sign On to continue": "Devam etmek için tek seferlik oturum açın", + "Change notification settings": "Bildirim ayarlarını değiştir", + "See %(msgtype)s messages posted to your active room": "Aktif odanıza gönderilen %(msgtype)s mesajları görün", + "Send %(msgtype)s messages as you in your active room": "Widget sizin adınıza %(msgtype)s mesajlar göndersin", + "See general files posted to your active room": "Aktif odanıza gönderilen genel dosyaları görün", + "See general files posted to this room": "Bu odaya gönderilen genel dosyaları gör", + "Your server isn't responding to some requests.": "Sunucunuz bası istekler'e onay vermiyor.", + "Compare a unique set of emoji if you don't have a camera on either device": "Her iki cihazda da kamera yoksa benzersiz bir emoji setini karşılaştırın", + "The other party cancelled the verification.": "Diğer taraf onaylamayı reddetti.", + "User signing private key:": "Kullanıcı imzalı özel anahtar", + "Homeserver feature support:": "Ana sunucu özellik desteği:", + "Self signing private key:": "Kendinden imzalı özel anahtar:", + "not found locally": "yerel olarak bulunamadı", + "cached locally": "yerel olarak önbelleğe alındı", + "Send general files as you in your active room": "Widget aktif odanıza sizin adınıza genel dosyalar göndersin", + "Send general files as you in this room": "Widget sizin adınıza bu odaya genel dosyalar göndersin", + "Send videos as you in your active room": "Widget aktif odanıza sizin adınıza video göndersin", + "Send videos as you in this room": "Widget sizin adınıza bu odaya video göndersin", + "See %(eventType)s events posted to your active room": "Aktif odanıza gönderilen %(eventType)s etkinlikleri gör", + "Decline (%(counter)s)": "", + "From %(deviceName)s (%(deviceId)s)": "%(deviceName)s%(deviceId)s tarafından", + "Thumbs up": "Başparmak havaya", + "Santa": "Noel Baba", + "Spanner": "Anahtar", + "Smiley": "Gülen yüz", + "To be secure, do this in person or use a trusted way to communicate.": "Güvende olmak için, bunu şahsen yapın veya güvenilir bir iletişim yöntemi kullanın.", + "Waiting for your other session to verify…": "Diğer oturumunuzun doğrulanması bekleniyor…", + "Waiting for your other session, %(deviceName)s (%(deviceId)s), to verify…": "Doğrulamak için diğer oturumunuz bekleniyor, %(deviceName)s %(deviceId)s", + "Verify this user by confirming the following number appears on their screen.": "Aşağıdaki numaranın ekranlarında göründüğünü onaylayarak bu kullanıcıyı doğrulayın.", + "Verify this session by confirming the following number appears on its screen.": "Aşağıdaki numaraların ekranında göründüğünü onaylayarak bu kullanıcıyı doğrulayın.", + "Verify this user by confirming the following emoji appear on their screen.": "Aşağıdaki emojinin ekranlarında göründüğünü onaylayarak bu kullanıcıyı doğrulayın.", + "Confirm the emoji below are displayed on both sessions, in the same order:": "Aşağıdaki emojinin her iki oturumda da aynı sırayla görüntülendiğini onaylayın:", + "Compare unique emoji": "Benzersiz emoji karşılaştır", + "Verify this session by completing one of the following:": "Şunlardan birini yaparak bu oturumu tamamlayın:", + "Secure messages with this user are end-to-end encrypted and not able to be read by third parties.": "Bu kullanıcıyla olan güvenli mesajlar uçtan uca şifrelidir ve 3 taraflar tarafından okunamaz.", + "Dial pad": "Arama tuşları", + "See videos posted to your active room": "Aktif odana gönderilen videoları gör", + "See videos posted to this room": "Bu odaya gönderilen videoları gör", + "See images posted to this room": "Bu odaya gönderilen resimleri gör", + "You held the call Resume": "Aramayı beklettiniz Devam Ettir", + "You held the call Switch": "Aramayı beklettiniz Değiştir", + "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Parolayı değiştirmek, şu anda tüm oturumlardaki tüm uçtan-uca şifreleme anahtarlarını sıfırlayacak ve oda anahtarlarınız önce dışarı aktarıp sonrasında içeri aktarmadığınız sürece şifrelenmiş sohbet geçmişini okunamaz yapacaktır. Gelecekte bu geliştirilecektir.", + "Send images as you in this room": "Widget bu odaya sizin adınıza resim göndersin", + "Send emotes as you in your active room": "Widget aktif odanıza sizin adınıza ifade göndersin", + "Send emotes as you in this room": "Widget bu odaya sizin adınıza ifade göndersin", + "Send text messages as you in your active room": "Widget aktif odanıza sizin adınıza metin mesajı göndersin", + "Send text messages as you in this room": "Widget bu odaya sizin adınıza metin mesajı göndersin", + "Send messages as you in your active room": "Widget aktif odanıza sizin adınıza mesaj göndersin", + "Send %(eventType)s events as you in your active room": "Widget aktif odanıza sizin adınıza %(eventType)s türü etkinlik göndersin", + "Send %(eventType)s events as you in this room": "Widget bu odaya sizin adınıza %(eventType)s türü etkinlik göndersin", + "Send images as you in your active room": "Widget aktif odanıza sizin adınıza resim göndersin" } From d3bd6c7d3a3940aa158642f7b83c0b72fb788012 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Tue, 12 Jan 2021 11:31:23 +0000 Subject: [PATCH 149/231] Translated using Weblate (Czech) Currently translated at 100.0% (2728 of 2728 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/cs/ --- src/i18n/strings/cs.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index a62ae4d063..76bec190bf 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -2897,5 +2897,12 @@ "You have no visible notifications.": "Nejsou dostupná žádná oznámení.", "Transfer": "Přepojit", "Failed to transfer call": "Hovor se nepodařilo přepojit", - "A call can only be transferred to a single user.": "Hovor lze přepojit pouze jednomu uživateli." + "A call can only be transferred to a single user.": "Hovor lze přepojit pouze jednomu uživateli.", + "There was an error finding this widget.": "Při hledání tohoto widgetu došlo k chybě.", + "Active Widgets": "Aktivní widgety", + "Open dial pad": "Otevřít číselník", + "Start a Conversation": "Zahájit konverzaci", + "Dial pad": "Číselník", + "There was an error looking up the phone number": "Při vyhledávání telefonního čísla došlo k chybě", + "Unable to look up phone number": "Nelze nalézt telefonní číslo" } From fb4aae97da28d16c985fd1e5d470ea0cf598d256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Mon, 11 Jan 2021 20:54:56 +0000 Subject: [PATCH 150/231] Translated using Weblate (Estonian) Currently translated at 100.0% (2728 of 2728 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/et/ --- src/i18n/strings/et.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index c42850be5a..e00395706d 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -2984,5 +2984,12 @@ "You have no visible notifications.": "Sul pole nähtavaid teavitusi.", "Transfer": "Suuna kõne edasi", "Failed to transfer call": "Kõne edasisuunamine ei õnnestunud", - "A call can only be transferred to a single user.": "Kõnet on võimalik edasi suunata vaid ühele kasutajale." + "A call can only be transferred to a single user.": "Kõnet on võimalik edasi suunata vaid ühele kasutajale.", + "There was an error finding this widget.": "Selle vidina leidmisel tekkis viga.", + "Active Widgets": "Kasutusel vidinad", + "Open dial pad": "Ava numbriklahvistik", + "Start a Conversation": "Alusta vestlust", + "Dial pad": "Numbriklahvistik", + "There was an error looking up the phone number": "Telefoninumbri otsimisel tekkis viga", + "Unable to look up phone number": "Telefoninumbrit ei õnnestu leida" } From b81e6fdedb57eff9610a715cfc1fd0f1b79ca45b Mon Sep 17 00:00:00 2001 From: Aaron Raimist Date: Tue, 12 Jan 2021 16:04:43 -0600 Subject: [PATCH 151/231] Update src/components/structures/auth/SetupEncryptionBody.js Co-authored-by: J. Ryan Stinnett --- src/components/structures/auth/SetupEncryptionBody.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/structures/auth/SetupEncryptionBody.js b/src/components/structures/auth/SetupEncryptionBody.js index c3d02073bd..3e7264dfec 100644 --- a/src/components/structures/auth/SetupEncryptionBody.js +++ b/src/components/structures/auth/SetupEncryptionBody.js @@ -120,7 +120,7 @@ export default class SetupEncryptionBody extends React.Component { const store = SetupEncryptionStore.sharedInstance(); let recoveryKeyPrompt; if (store.keyInfo && keyHasPassphrase(store.keyInfo)) { - recoveryKeyPrompt = _t("Use Security Key or Passphrase"); + recoveryKeyPrompt = _t("Use Security Key or Phrase"); } else if (store.keyInfo) { recoveryKeyPrompt = _t("Use Security Key"); } From d479d97e2cba37a82abcb6723764bf5226decc0d Mon Sep 17 00:00:00 2001 From: Aaron Raimist Date: Tue, 12 Jan 2021 16:05:37 -0600 Subject: [PATCH 152/231] Rename recovery-key.txt to security-key.txt Signed-off-by: Aaron Raimist --- .../views/dialogs/security/CreateKeyBackupDialog.js | 2 +- .../views/dialogs/security/CreateSecretStorageDialog.js | 2 +- src/i18n/strings/en_EN.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/async-components/views/dialogs/security/CreateKeyBackupDialog.js b/src/async-components/views/dialogs/security/CreateKeyBackupDialog.js index 7b5dbe4d28..863ee2b427 100644 --- a/src/async-components/views/dialogs/security/CreateKeyBackupDialog.js +++ b/src/async-components/views/dialogs/security/CreateKeyBackupDialog.js @@ -95,7 +95,7 @@ export default class CreateKeyBackupDialog extends React.PureComponent { const blob = new Blob([this._keyBackupInfo.recovery_key], { type: 'text/plain;charset=us-ascii', }); - FileSaver.saveAs(blob, 'recovery-key.txt'); + FileSaver.saveAs(blob, 'security-key.txt'); this.setState({ downloaded: true, diff --git a/src/async-components/views/dialogs/security/CreateSecretStorageDialog.js b/src/async-components/views/dialogs/security/CreateSecretStorageDialog.js index 5c190a0e2f..84cb58536a 100644 --- a/src/async-components/views/dialogs/security/CreateSecretStorageDialog.js +++ b/src/async-components/views/dialogs/security/CreateSecretStorageDialog.js @@ -235,7 +235,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { const blob = new Blob([this._recoveryKey.encodedPrivateKey], { type: 'text/plain;charset=us-ascii', }); - FileSaver.saveAs(blob, 'recovery-key.txt'); + FileSaver.saveAs(blob, 'security-key.txt'); this.setState({ downloaded: true, diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 4e15cbfc1e..f1fe46d1fe 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2548,7 +2548,7 @@ "Create account": "Create account", "Host account on": "Host account on", "Decide where your account is hosted": "Decide where your account is hosted", - "Use Security Key or Passphrase": "Use Security Key or Passphrase", + "Use Security Key or Phrase": "Use Security Key or Phrase", "Use Security Key": "Use Security Key", "Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.": "Confirm your identity by verifying this login from one of your other sessions, granting it access to encrypted messages.", "This requires the latest %(brand)s on your other devices:": "This requires the latest %(brand)s on your other devices:", From 2ab7db3bc9e37a1acfd25b313b96db4f21a52e37 Mon Sep 17 00:00:00 2001 From: Miquel Lionel Date: Tue, 12 Jan 2021 18:46:46 +0000 Subject: [PATCH 153/231] Translated using Weblate (French) Currently translated at 95.3% (2602 of 2728 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/fr/ --- src/i18n/strings/fr.json | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 913aabd0c5..13ff009e9f 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -2824,5 +2824,29 @@ "Bosnia": "", "Bolivia": "", "Bhutan": "", - "Bermuda": "" + "Bermuda": "", + "with state key %(stateKey)s": "avec la ou les clés d'état %(stateKey)s", + "with an empty state key": "avec une clé d'état vide", + "See when anyone posts a sticker to your active room": "Voir quand n'importe qui envoye un sticker dans le salon actuel", + "See when a sticker is posted in this room": "Voir quand un sticker est envoyé dans ce salon", + "See when the avatar changes in your active room": "Voir quand l'avatar change dans le salon actuel", + "Change the avatar of your active room": "Changer l'avatar du salon actuel", + "See when the avatar changes in this room": "Voir quand l'avatar change dans ce salon", + "Change the avatar of this room": "Changer l'avatar de ce salon", + "Send stickers into your active room": "Envoyer des stickers dans le salon actuel", + "See when the topic changes in this room": "Voir quand le sujet change dans ce salon", + "See when the topic changes in your active room": "Voir quand le sujet change dans le salon actuel", + "Change the name of your active room": "Changer le nom du salon actuel", + "See when the name changes in this room": "Traquer quand le nom change dans ce salon", + "Change the name of this room": "Changer le nom de ce salon", + "Change the topic of your active room": "Changer le sujet dans le salon actuel", + "Change the topic of this room": "Changer le sujet de ce salon", + "Send stickers into this room": "Envoyer des stickers dans ce salon", + "Remain on your screen when viewing another room, when running": "Reste sur votre écran quand vous regardez un autre salon lors de l'appel", + "Takes the call in the current room off hold": "Reprends l'appel en cours dans ce salon", + "Places the call in the current room on hold": "Met l'appel en pause dans ce salon", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Ajoute \"(╯°□°)╯︵ ┻━┻\" en préfixe du message", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Ajoute \"┬──┬ ノ( ゜-゜ノ)\" en préfixe du message", + "Effects": "Effets", + "Zimbabwe": "Zimbabwe" } From 355ea6ad4234098060c44602470988c980153bc7 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Tue, 12 Jan 2021 19:45:10 +0000 Subject: [PATCH 154/231] Translated using Weblate (Swedish) Currently translated at 100.0% (2728 of 2728 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/sv/ --- src/i18n/strings/sv.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 9abed78c62..644824e18a 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -2914,5 +2914,12 @@ "You have no visible notifications.": "Du har inga synliga aviseringar.", "Transfer": "Överlåt", "Failed to transfer call": "Misslyckades att överlåta samtal", - "A call can only be transferred to a single user.": "Ett samtal kan bara överlåtas till en enskild användare." + "A call can only be transferred to a single user.": "Ett samtal kan bara överlåtas till en enskild användare.", + "There was an error finding this widget.": "Ett fel inträffade vid sökning efter widgeten.", + "Active Widgets": "Aktiva widgets", + "Open dial pad": "Öppna knappsats", + "Start a Conversation": "Starta en konversation", + "Dial pad": "Knappsats", + "There was an error looking up the phone number": "Ett fel inträffade vid uppslagning av telefonnumret", + "Unable to look up phone number": "Kunde inte slå upp telefonnumret" } From 67d19d19a47dc278591ca12f955d6a03142e4a3a Mon Sep 17 00:00:00 2001 From: GokdenizK Date: Wed, 13 Jan 2021 11:55:37 +0000 Subject: [PATCH 155/231] Translated using Weblate (Turkish) Currently translated at 76.8% (2097 of 2728 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/tr/ --- src/i18n/strings/tr.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index 245585dd19..6ae9341509 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -2262,5 +2262,20 @@ "Send messages as you in your active room": "Widget aktif odanıza sizin adınıza mesaj göndersin", "Send %(eventType)s events as you in your active room": "Widget aktif odanıza sizin adınıza %(eventType)s türü etkinlik göndersin", "Send %(eventType)s events as you in this room": "Widget bu odaya sizin adınıza %(eventType)s türü etkinlik göndersin", - "Send images as you in your active room": "Widget aktif odanıza sizin adınıza resim göndersin" + "Send images as you in your active room": "Widget aktif odanıza sizin adınıza resim göndersin", + "with an empty state key": "boş durum anahtarı ile", + "Are you sure? You will lose your encrypted messages if your keys are not backed up properly.": "Emin misiniz? Eğer anahtarlarınız doğru bir şekilde yedeklemediyse, şifrelenmiş iletilerinizi kaybedeceksiniz.", + "The operation could not be completed": "Eylem tamamlanamadı", + "Failed to save your profile": "Profiliniz kaydedilemedi", + "You might have configured them in a client other than %(brand)s. You cannot tune them in %(brand)s but they still apply.": "Onları %(brand)s dışında bir sunucuda yapılandırmış olabilirsin. Onları %(brand)s içinde ayarlayamazsın ama yine de geçerlidir.", + "Securely cache encrypted messages locally for them to appear in search results.": "Arama sonuçlarında gozükmeleri için iletileri güvenli bir şekilde yerel olarak önbelleğe al.", + "Individually verify each session used by a user to mark it as trusted, not trusting cross-signed devices.": "Çapraz imzalı cihazlara güvenmeden, güvenilir olarak işaretlemek için, bir kullanıcı tarafından kullanılan her bir oturumu ayrı ayrı doğrulayın.", + "There are advanced notifications which are not shown here.": "Burada gösterilmeyen gelişmiş bildirimler var.", + "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "İletilerin arama sonuçlarında gözükmeleri için %(rooms)s odasından %(size)s yardımıyla depolayarak, şifrelenmiş iletileri güvenli bir şekilde yerel olarak önbelleğe al.", + "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "İletilerin arama sonuçlarında gözükmeleri için %(rooms)s odalardan %(size)s yardımıyla depolayarak, şifrelenmiş iletileri güvenli bir şekilde yerel olarak önbelleğe al.", + "not found in storage": "Cihazda bulunamadı", + "This bridge was provisioned by .": "Bu köprü tarafından sağlandı.", + "Render LaTeX maths in messages": "Mesajlarda LaTex maths işleyin", + "See %(eventType)s events posted to this room": "Bu odaya gönderilen %(eventType)s türü etkinlikleri gör", + "with state key %(stateKey)s": "%(stateKey)s durum anahtarı ile" } From e62611ae0efa2a34e73441b9830cf14c8e30d28c Mon Sep 17 00:00:00 2001 From: m4sk1n Date: Wed, 13 Jan 2021 11:48:01 +0000 Subject: [PATCH 156/231] Translated using Weblate (Polish) Currently translated at 70.1% (1914 of 2728 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/pl/ --- src/i18n/strings/pl.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/pl.json b/src/i18n/strings/pl.json index 424d6560b3..01496c8db1 100644 --- a/src/i18n/strings/pl.json +++ b/src/i18n/strings/pl.json @@ -2033,5 +2033,7 @@ "Call failed because webcam or microphone could not be accessed. Check that:": "Połączenie nieudane z powodu braku dostępu do kamery bądź mikrofonu. Sprawdź czy:", "Unable to access webcam / microphone": "Nie można uzyskać dostępu do kamery / mikrofonu", "Call failed because microphone could not be accessed. Check that a microphone is plugged in and set up correctly.": "Nie udało się zestawić połączenia z powodu braku dostępu do mikrofonu. Sprawdź czy mikrofon jest podłączony i poprawnie skonfigurowany.", - "Unable to access microphone": "Nie można uzyskać dostępu do mikrofonu" + "Unable to access microphone": "Nie można uzyskać dostępu do mikrofonu", + "Forgot password?": "Nie pamiętasz hasła?", + "Use an identity server to invite by email. Manage in Settings.": "Użyj serwera tożsamości, aby zapraszać przez e-mail. Zarządzaj w Ustawieniach." } From 8dce30cb6009cb25cd4619ad39f71758abf7cbf5 Mon Sep 17 00:00:00 2001 From: random Date: Wed, 13 Jan 2021 08:49:00 +0000 Subject: [PATCH 157/231] Translated using Weblate (Italian) Currently translated at 100.0% (2728 of 2728 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/it/ --- src/i18n/strings/it.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 4d806617fd..cd4b82cdae 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -2980,5 +2980,15 @@ "Sends the given message with fireworks": "Invia il messaggio con fuochi d'artificio", "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Antepone ┬──┬ ノ( ゜-゜ノ) ad un messaggio di testo", "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Antepone (╯°□°)╯︵ ┻━┻ ad un messaggio di testo", - "You have no visible notifications.": "Non hai notifiche visibili." + "You have no visible notifications.": "Non hai notifiche visibili.", + "Transfer": "Trasferisci", + "Failed to transfer call": "Trasferimento chiamata fallito", + "A call can only be transferred to a single user.": "Una chiamata può essere trasferita solo ad un singolo utente.", + "There was an error finding this widget.": "Si è verificato un errore trovando i widget.", + "Active Widgets": "Widget attivi", + "Open dial pad": "Apri tastierino", + "Start a Conversation": "Inizia una conversazione", + "Dial pad": "Tastierino", + "There was an error looking up the phone number": "Si è verificato un errore nella ricerca del numero di telefono", + "Unable to look up phone number": "Impossibile cercare il numero di telefono" } From 8c50f21cea46fcdd08396cc8d1228ea4096a028f Mon Sep 17 00:00:00 2001 From: Kaede Date: Wed, 13 Jan 2021 08:14:38 +0000 Subject: [PATCH 158/231] Translated using Weblate (Japanese) Currently translated at 50.4% (1377 of 2728 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/ja/ --- src/i18n/strings/ja.json | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/ja.json b/src/i18n/strings/ja.json index c8c356bdcd..98d9fd8724 100644 --- a/src/i18n/strings/ja.json +++ b/src/i18n/strings/ja.json @@ -910,7 +910,7 @@ "The file '%(fileName)s' exceeds this homeserver's size limit for uploads": "ファイル '%(fileName)s' はこのホームサーバのアップロードのサイズ上限を超えています", "The server does not support the room version specified.": "このサーバは指定された部屋バージョンに対応していません。", "Name or Matrix ID": "名前またはMatrix ID", - "Identity server has no terms of service": "IDサーバーは利用規約を持っていません", + "Identity server has no terms of service": "ID サーバーは利用規約を持っていません", "Messages": "メッセージ", "Actions": "アクション", "Other": "その他", @@ -1317,7 +1317,7 @@ "Join the discussion": "話し合いに参加", "%(roomName)s can't be previewed. Do you want to join it?": "%(roomName)s はプレビューできません。部屋に参加しますか?", "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "他のユーザーがあなたのホームサーバー (%(localDomain)s) を通じてこの部屋を見つけられるよう、アドレスを設定しましょう", - "Enter recovery key": "リカバリキーを入力", + "Enter recovery key": "リカバリーキーを入力", "Verify this login": "このログインを承認", "Signing In...": "サインイン中...", "If you've joined lots of rooms, this might take a while": "たくさんの部屋に参加している場合は、時間がかかる可能性があります", @@ -1488,5 +1488,22 @@ "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|one": "検索結果を表示させるために、暗号化されたメッセージをローカルに安全にキャッシュしています。現在、%(rooms)s 件の部屋のメッセージの保存に %(size)s を使用中です。", "Securely cache encrypted messages locally for them to appear in search results, using %(size)s to store messages from %(rooms)s rooms.|other": "検索結果を表示させるために、暗号化されたメッセージをローカルに安全にキャッシュしています。現在、%(rooms)s 件の部屋のメッセージの保存に %(size)s を使用中です。", "Mentions & Keywords": "メンションとキーワード", - "Security Key": "セキュリティキー" + "Security Key": "セキュリティキー", + "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.": "ID サーバーの使用は任意です。ID サーバーを使用しない場合、あなたは他のユーザーから発見されなくなり、メールアドレスや電話番号で他のユーザーを招待することもできません。", + "Integration Managers receive configuration data, and can modify widgets, send room invites, and set power levels on your behalf.": "インテグレーションマネージャは設定データを受け取り、ユーザーの代わりにウィジェットの変更、部屋への招待の送信、権限レベルの設定を行うことができます。", + "Use an Integration Manager to manage bots, widgets, and sticker packs.": "インテグレーションマネージャを使用して、ボット、ウィジェット、ステッカーパックを管理します。", + "Use an Integration Manager (%(serverName)s) to manage bots, widgets, and sticker packs.": "インテグレーションマネージャ (%(serverName)s) を使用して、ボット、ウィジェット、ステッカーパックを管理します。", + "Integrations not allowed": "インテグレーションは許可されていません", + "Integrations are disabled": "インテグレーションが無効になっています", + "Manage integrations": "インテグレーションの管理", + "Enter a new identity server": "新しい ID サーバーを入力", + "Use Ctrl + Enter to send a message": "Ctrl + Enter でメッセージを送信する", + "Show chat effects": "チャットエフェクトを表示", + "Backup key cached:": "バックアップキーのキャッシュ:", + "Backup key stored:": "バックアップキー保存場所:", + "Algorithm:": "アルゴリズム:", + "Backup version:": "バックアップバージョン:", + "Secret storage:": "機密ストレージ:", + "Master private key:": "マスター秘密鍵:", + "Back up your encryption keys with your account data in case you lose access to your sessions. Your keys will be secured with a unique Recovery Key.": "セッションにアクセスできなくなる場合に備えて、アカウントデータとともに暗号鍵をバックアップします。あなたの鍵は一意のリカバリーキーで保護されます。" } From b1016275dcc04d3567a1719162d2b78297fc4b84 Mon Sep 17 00:00:00 2001 From: XoseM Date: Wed, 13 Jan 2021 04:39:34 +0000 Subject: [PATCH 159/231] Translated using Weblate (Galician) Currently translated at 100.0% (2728 of 2728 strings) Translation: Element Web/matrix-react-sdk Translate-URL: https://translate.element.io/projects/element-web/matrix-react-sdk/gl/ --- src/i18n/strings/gl.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index a2083438f5..421a64aba0 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -2983,5 +2983,12 @@ "You have no visible notifications.": "Non tes notificacións visibles.", "Transfer": "Transferir", "Failed to transfer call": "Fallou a transferencia da chamada", - "A call can only be transferred to a single user.": "Unha chamada só se pode transferir a unha única usuaria." + "A call can only be transferred to a single user.": "Unha chamada só se pode transferir a unha única usuaria.", + "There was an error finding this widget.": "Houbo un fallo ao buscar o widget.", + "Active Widgets": "Widgets activos", + "Open dial pad": "Abrir marcador", + "Start a Conversation": "Iniciar unha Conversa", + "Dial pad": "Marcador", + "There was an error looking up the phone number": "Houbo un erro buscando o número de teléfono", + "Unable to look up phone number": "Non atopamos o número de teléfono" } From a73fe72b0961d605584ef5e6eb556f3dbae94d53 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Wed, 13 Jan 2021 12:25:36 +0000 Subject: [PATCH 160/231] Fix soft crash on soft logout page This fixes a soft crash on the soft logout page, which can occur if it is shown very quickly after app startup before encryption has become enabled. --- src/components/structures/auth/SoftLogout.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/structures/auth/SoftLogout.js b/src/components/structures/auth/SoftLogout.js index fdc1aec96d..a7fe340457 100644 --- a/src/components/structures/auth/SoftLogout.js +++ b/src/components/structures/auth/SoftLogout.js @@ -72,9 +72,12 @@ export default class SoftLogout extends React.Component { this._initLogin(); - MatrixClientPeg.get().countSessionsNeedingBackup().then(remaining => { - this.setState({keyBackupNeeded: remaining > 0}); - }); + const cli = MatrixClientPeg.get(); + if (cli.isCryptoEnabled()) { + cli.countSessionsNeedingBackup().then(remaining => { + this.setState({ keyBackupNeeded: remaining > 0 }); + }); + } } onClearAll = () => { From 30dd24a59c7dcf092004e03d5b765f05ff077375 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 13 Jan 2021 12:59:37 +0000 Subject: [PATCH 161/231] Upgrade matrix-js-sdk to 9.5.0-rc.1 --- package.json | 2 +- yarn.lock | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 92b574da34..f336a78120 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "katex": "^0.12.0", "linkifyjs": "^2.1.9", "lodash": "^4.17.19", - "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", + "matrix-js-sdk": "9.5.0-rc.1", "matrix-widget-api": "^0.1.0-beta.10", "minimist": "^1.2.5", "pako": "^1.0.11", diff --git a/yarn.lock b/yarn.lock index b0769c2c04..00f97f966c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6553,9 +6553,10 @@ mathml-tag-names@^2.0.1: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== -"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": - version "9.4.1" - resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/1717fcf499b943517213f2a81c41ffec0b50748e" +matrix-js-sdk@9.5.0-rc.1: + version "9.5.0-rc.1" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.5.0-rc.1.tgz#91c2f0ff969baea1416611a39354ca016cc1b7c6" + integrity sha512-TOWU6QKfc3BBTdLyzKMnc0trsaw9sQw3/LaNU/ZqP1LuVDK+qRQxcUfsev0EFfRKURIcI7KvtzRiV+DakN/X+Q== dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" From 5c9fbd283c54248f96dc4e4a601535f1e2e323a6 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 13 Jan 2021 13:06:43 +0000 Subject: [PATCH 162/231] Prepare changelog for v3.12.0-rc.1 --- CHANGELOG.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef31ef886f..349a2c7d8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,54 @@ +Changes in [3.12.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.12.0-rc.1) (2021-01-13) +=============================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.11.1...v3.12.0-rc.1) + + * Fix soft crash on soft logout page + [\#5539](https://github.com/matrix-org/matrix-react-sdk/pull/5539) + * Translations update from Weblate + [\#5538](https://github.com/matrix-org/matrix-react-sdk/pull/5538) + * Run TypeScript tests + [\#5537](https://github.com/matrix-org/matrix-react-sdk/pull/5537) + * Add a basic widget explorer to devtools (per-room) + [\#5528](https://github.com/matrix-org/matrix-react-sdk/pull/5528) + * Add to security key field + [\#5534](https://github.com/matrix-org/matrix-react-sdk/pull/5534) + * Fix avatar upload prompt/tooltip floating wrong and permissions + [\#5526](https://github.com/matrix-org/matrix-react-sdk/pull/5526) + * Add a dialpad UI for PSTN lookup + [\#5523](https://github.com/matrix-org/matrix-react-sdk/pull/5523) + * Basic call transfer initiation support + [\#5494](https://github.com/matrix-org/matrix-react-sdk/pull/5494) + * Fix #15988 + [\#5524](https://github.com/matrix-org/matrix-react-sdk/pull/5524) + * Bump node-notifier from 8.0.0 to 8.0.1 + [\#5520](https://github.com/matrix-org/matrix-react-sdk/pull/5520) + * Use TypeScript source for development, swap to build during release + [\#5503](https://github.com/matrix-org/matrix-react-sdk/pull/5503) + * Look for emoji in the body that will be displayed + [\#5517](https://github.com/matrix-org/matrix-react-sdk/pull/5517) + * Bump ini from 1.3.5 to 1.3.7 + [\#5486](https://github.com/matrix-org/matrix-react-sdk/pull/5486) + * Recognise `*.element.io` links as Element permalinks + [\#5514](https://github.com/matrix-org/matrix-react-sdk/pull/5514) + * Fixes for call UI + [\#5509](https://github.com/matrix-org/matrix-react-sdk/pull/5509) + * Add a snowfall chat effect (with /snowfall command) + [\#5511](https://github.com/matrix-org/matrix-react-sdk/pull/5511) + * fireworks effect + [\#5507](https://github.com/matrix-org/matrix-react-sdk/pull/5507) + * Don't play call end sound for calls that never started + [\#5506](https://github.com/matrix-org/matrix-react-sdk/pull/5506) + * Add /tableflip slash command + [\#5485](https://github.com/matrix-org/matrix-react-sdk/pull/5485) + * Import from src in IncomingCallBox.tsx + [\#5504](https://github.com/matrix-org/matrix-react-sdk/pull/5504) + * Social Login support both https and mxc icons + [\#5499](https://github.com/matrix-org/matrix-react-sdk/pull/5499) + * Fix padding in confirmation email registration prompt + [\#5501](https://github.com/matrix-org/matrix-react-sdk/pull/5501) + * Fix room list help prompt alignment + [\#5500](https://github.com/matrix-org/matrix-react-sdk/pull/5500) + Changes in [3.11.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.11.1) (2020-12-21) ===================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.11.0...v3.11.1) From 97af6a8fd8fbfaf79eb867a5dfd6841a21ec42f8 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 13 Jan 2021 13:06:44 +0000 Subject: [PATCH 163/231] v3.12.0-rc.1 --- package.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index f336a78120..050e2562a0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "3.11.1", + "version": "3.12.0-rc.1", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { @@ -27,7 +27,7 @@ "matrix-gen-i18n": "scripts/gen-i18n.js", "matrix-prune-i18n": "scripts/prune-i18n.js" }, - "main": "./src/index.js", + "main": "./lib/index.js", "matrix_src_main": "./src/index.js", "matrix_lib_main": "./lib/index.js", "matrix_lib_typings": "./lib/index.d.ts", @@ -188,5 +188,6 @@ "transformIgnorePatterns": [ "/node_modules/(?!matrix-js-sdk).+$" ] - } + }, + "typings": "./lib/index.d.ts" } From c1c57c2c16e11f43b4fbf8fa86568f0b8e3aaba4 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Wed, 13 Jan 2021 13:07:51 +0000 Subject: [PATCH 164/231] Add extra notes to changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 349a2c7d8e..ef56762a31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ Changes in [3.12.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases =============================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.11.1...v3.12.0-rc.1) + * Upgrade to JS SDK 9.5.0-rc.1 * Fix soft crash on soft logout page [\#5539](https://github.com/matrix-org/matrix-react-sdk/pull/5539) * Translations update from Weblate From ac7f86cf65eaa1b134c53cf500d7355c958ba130 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 13 Jan 2021 14:49:23 +0000 Subject: [PATCH 165/231] Convert DMRoomMap to typescript --- src/settings/Settings.ts | 4 ++ src/utils/{DMRoomMap.js => DMRoomMap.ts} | 58 +++++++++++++----------- 2 files changed, 35 insertions(+), 27 deletions(-) rename src/utils/{DMRoomMap.js => DMRoomMap.ts} (82%) diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index b239b809fe..4a1e4e630d 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -398,6 +398,10 @@ export const SETTINGS: {[setting: string]: ISetting} = { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, default: null, }, + "voip_mxid_translate_pattern": { + supportedLevels: LEVELS_UI_FEATURE, // not a UI feature, but same level (config only, maybe .well-known in future) + default: null, + }, "language": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, default: "en", diff --git a/src/utils/DMRoomMap.js b/src/utils/DMRoomMap.ts similarity index 82% rename from src/utils/DMRoomMap.js rename to src/utils/DMRoomMap.ts index 4e219b1611..fc6e3ec5d4 100644 --- a/src/utils/DMRoomMap.js +++ b/src/utils/DMRoomMap.ts @@ -1,6 +1,5 @@ /* -Copyright 2016 OpenMarket Ltd -Copyright 2019, 2020 The Matrix.org Foundation C.I.C. +Copyright 2016, 2019, 2021 The Matrix.org Foundation C.I.C. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,7 +16,9 @@ limitations under the License. import {MatrixClientPeg} from '../MatrixClientPeg'; import {uniq} from "lodash"; -import {Room} from "matrix-js-sdk/src/matrix"; +import {Room} from "matrix-js-sdk/src/models/room"; +import {Event} from "matrix-js-sdk/src/models/event"; +import {MatrixClient} from "matrix-js-sdk/src/client"; /** * Class that takes a Matrix Client and flips the m.direct map @@ -27,29 +28,31 @@ import {Room} from "matrix-js-sdk/src/matrix"; * With 'start', this can also keep itself up to date over time. */ export default class DMRoomMap { + private static sharedInstance: DMRoomMap; + + private matrixClient: MatrixClient; + // TODO: convert these to maps + private roomToUser: {[key: string]: string} = null; + private userToRooms: {[key: string]: string[]} = null; + private hasSentOutPatchDirectAccountDataPatch: boolean; + private mDirectEvent: Event; + constructor(matrixClient) { this.matrixClient = matrixClient; - this.roomToUser = null; - // see _onAccountData - this._hasSentOutPatchDirectAccountDataPatch = false; - - // XXX: Force-bind the event handler method because it - // doesn't call it with our object as the 'this' - // (use a static property arrow function for this when we can) - this._onAccountData = this._onAccountData.bind(this); + // see onAccountData + this.hasSentOutPatchDirectAccountDataPatch = false; const mDirectEvent = matrixClient.getAccountData('m.direct'); this.mDirectEvent = mDirectEvent ? mDirectEvent.getContent() : {}; - this.userToRooms = null; } /** * Makes and returns a new shared instance that can then be accessed * with shared(). This returned instance is not automatically started. */ - static makeShared() { - DMRoomMap._sharedInstance = new DMRoomMap(MatrixClientPeg.get()); - return DMRoomMap._sharedInstance; + static makeShared(): DMRoomMap { + DMRoomMap.sharedInstance = new DMRoomMap(MatrixClientPeg.get()); + return DMRoomMap.sharedInstance; } /** @@ -57,26 +60,27 @@ export default class DMRoomMap { * that uses the singleton matrix client * The shared instance must be started before use. */ - static shared() { - return DMRoomMap._sharedInstance; + static shared(): DMRoomMap { + return DMRoomMap.sharedInstance; } start() { this._populateRoomToUser(); - this.matrixClient.on("accountData", this._onAccountData); + this.matrixClient.on("accountData", this.onAccountData); } stop() { - this.matrixClient.removeListener("accountData", this._onAccountData); + this.matrixClient.removeListener("accountData", this.onAccountData); } - _onAccountData(ev) { + private onAccountData = (ev) => { if (ev.getType() == 'm.direct') { this.mDirectEvent = this.matrixClient.getAccountData('m.direct').getContent() || {}; this.userToRooms = null; this.roomToUser = null; } } + /** * some client bug somewhere is causing some DMs to be marked * with ourself, not the other user. Fix it by guessing the other user and @@ -118,7 +122,7 @@ export default class DMRoomMap { } } - getDMRoomsForUserId(userId) { + getDMRoomsForUserId(userId): string[] { // Here, we return the empty list if there are no rooms, // since the number of conversations you have with this user is zero. return this._getUserToRooms()[userId] || []; @@ -129,7 +133,7 @@ export default class DMRoomMap { * @param {string[]} ids The identifiers (user IDs and email addresses) to look for. * @returns {Room} The DM room which all IDs given share, or falsey if no common room. */ - getDMRoomForIdentifiers(ids) { + getDMRoomForIdentifiers(ids: string[]): Room { // TODO: [Canonical DMs] Handle lookups for email addresses. // For now we'll pretend we only get user IDs and end up returning nothing for email addresses @@ -145,7 +149,7 @@ export default class DMRoomMap { return joinedRooms[0]; } - getUserIdForRoomId(roomId) { + getUserIdForRoomId(roomId: string) { if (this.roomToUser == null) { // we lazily populate roomToUser so you can use // this class just to call getDMRoomsForUserId @@ -175,9 +179,9 @@ export default class DMRoomMap { .reduce((obj, r) => (obj[r.userId] = r.room) && obj, {}); } - _getUserToRooms() { + _getUserToRooms(): {[key: string]: string[]} { if (!this.userToRooms) { - const userToRooms = this.mDirectEvent; + const userToRooms = this.mDirectEvent as {[key: string]: string[]}; const myUserId = this.matrixClient.getUserId(); const selfDMs = userToRooms[myUserId]; if (selfDMs && selfDMs.length) { @@ -187,8 +191,8 @@ export default class DMRoomMap { // version once. console.warn(`Invalid m.direct account data detected ` + `(self-chats that shouldn't be), patching it up.`); - if (neededPatching && !this._hasSentOutPatchDirectAccountDataPatch) { - this._hasSentOutPatchDirectAccountDataPatch = true; + if (neededPatching && !this.hasSentOutPatchDirectAccountDataPatch) { + this.hasSentOutPatchDirectAccountDataPatch = true; this.matrixClient.setAccountData('m.direct', userToRooms); } } From ea31d5821bb51a293ddd99d62609c61b0f6c2833 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 13 Jan 2021 14:54:12 +0000 Subject: [PATCH 166/231] Unintnetional commit (again) --- src/settings/Settings.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index 4a1e4e630d..b239b809fe 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -398,10 +398,6 @@ export const SETTINGS: {[setting: string]: ISetting} = { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, default: null, }, - "voip_mxid_translate_pattern": { - supportedLevels: LEVELS_UI_FEATURE, // not a UI feature, but same level (config only, maybe .well-known in future) - default: null, - }, "language": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, default: "en", From 150e8c9d569f198d231bba07b4219df03084cd3a Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 13 Jan 2021 15:31:26 +0000 Subject: [PATCH 167/231] Fix incoming call box on dark theme --- res/css/views/voip/_CallContainer.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/voip/_CallContainer.scss b/res/css/views/voip/_CallContainer.scss index ae1d37de71..d9843b668e 100644 --- a/res/css/views/voip/_CallContainer.scss +++ b/res/css/views/voip/_CallContainer.scss @@ -46,7 +46,7 @@ limitations under the License. .mx_IncomingCallBox { min-width: 250px; - background-color: $secondary-accent-color; + background-color: $primary-bg-color; padding: 8px; box-shadow: 0px 14px 24px rgba(0, 0, 0, 0.08); border-radius: 8px; From 20283eabe0fd1f2ff21591b9b1c95c6a448b4099 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 13 Jan 2021 15:31:26 +0000 Subject: [PATCH 168/231] Fix incoming call box on dark theme --- res/css/views/voip/_CallContainer.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/voip/_CallContainer.scss b/res/css/views/voip/_CallContainer.scss index ae1d37de71..d9843b668e 100644 --- a/res/css/views/voip/_CallContainer.scss +++ b/res/css/views/voip/_CallContainer.scss @@ -46,7 +46,7 @@ limitations under the License. .mx_IncomingCallBox { min-width: 250px; - background-color: $secondary-accent-color; + background-color: $primary-bg-color; padding: 8px; box-shadow: 0px 14px 24px rgba(0, 0, 0, 0.08); border-radius: 8px; From 28fe6291d9206fbdc147965a1d0cc116f50183e7 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 13 Jan 2021 15:37:49 +0000 Subject: [PATCH 169/231] add public/privates & de-underscore --- src/utils/DMRoomMap.ts | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/utils/DMRoomMap.ts b/src/utils/DMRoomMap.ts index fc6e3ec5d4..3a8c109b79 100644 --- a/src/utils/DMRoomMap.ts +++ b/src/utils/DMRoomMap.ts @@ -50,7 +50,7 @@ export default class DMRoomMap { * Makes and returns a new shared instance that can then be accessed * with shared(). This returned instance is not automatically started. */ - static makeShared(): DMRoomMap { + public static makeShared(): DMRoomMap { DMRoomMap.sharedInstance = new DMRoomMap(MatrixClientPeg.get()); return DMRoomMap.sharedInstance; } @@ -60,16 +60,16 @@ export default class DMRoomMap { * that uses the singleton matrix client * The shared instance must be started before use. */ - static shared(): DMRoomMap { + public static shared(): DMRoomMap { return DMRoomMap.sharedInstance; } - start() { - this._populateRoomToUser(); + public start() { + this.populateRoomToUser(); this.matrixClient.on("accountData", this.onAccountData); } - stop() { + public stop() { this.matrixClient.removeListener("accountData", this.onAccountData); } @@ -86,7 +86,7 @@ export default class DMRoomMap { * with ourself, not the other user. Fix it by guessing the other user and * modifying userToRooms */ - _patchUpSelfDMs(userToRooms) { + private patchUpSelfDMs(userToRooms) { const myUserId = this.matrixClient.getUserId(); const selfRoomIds = userToRooms[myUserId]; if (selfRoomIds) { @@ -122,10 +122,10 @@ export default class DMRoomMap { } } - getDMRoomsForUserId(userId): string[] { + public getDMRoomsForUserId(userId): string[] { // Here, we return the empty list if there are no rooms, // since the number of conversations you have with this user is zero. - return this._getUserToRooms()[userId] || []; + return this.getUserToRooms()[userId] || []; } /** @@ -133,7 +133,7 @@ export default class DMRoomMap { * @param {string[]} ids The identifiers (user IDs and email addresses) to look for. * @returns {Room} The DM room which all IDs given share, or falsey if no common room. */ - getDMRoomForIdentifiers(ids: string[]): Room { + public getDMRoomForIdentifiers(ids: string[]): Room { // TODO: [Canonical DMs] Handle lookups for email addresses. // For now we'll pretend we only get user IDs and end up returning nothing for email addresses @@ -149,7 +149,7 @@ export default class DMRoomMap { return joinedRooms[0]; } - getUserIdForRoomId(roomId: string) { + public getUserIdForRoomId(roomId: string) { if (this.roomToUser == null) { // we lazily populate roomToUser so you can use // this class just to call getDMRoomsForUserId @@ -157,7 +157,7 @@ export default class DMRoomMap { // convenient wrapper and there's no point // iterating through the map if getUserIdForRoomId() // is never called. - this._populateRoomToUser(); + this.populateRoomToUser(); } // Here, we return undefined if the room is not in the map: // the room ID you gave is not a DM room for any user. @@ -171,7 +171,7 @@ export default class DMRoomMap { return this.roomToUser[roomId]; } - getUniqueRoomsWithIndividuals(): {[userId: string]: Room} { + public getUniqueRoomsWithIndividuals(): {[userId: string]: Room} { if (!this.roomToUser) return {}; // No rooms means no map. return Object.keys(this.roomToUser) .map(r => ({userId: this.getUserIdForRoomId(r), room: this.matrixClient.getRoom(r)})) @@ -179,7 +179,7 @@ export default class DMRoomMap { .reduce((obj, r) => (obj[r.userId] = r.room) && obj, {}); } - _getUserToRooms(): {[key: string]: string[]} { + private getUserToRooms(): {[key: string]: string[]} { if (!this.userToRooms) { const userToRooms = this.mDirectEvent as {[key: string]: string[]}; const myUserId = this.matrixClient.getUserId(); @@ -201,7 +201,7 @@ export default class DMRoomMap { return this.userToRooms; } - _populateRoomToUser() { + private populateRoomToUser() { this.roomToUser = {}; for (const user of Object.keys(this._getUserToRooms())) { for (const roomId of this.userToRooms[user]) { From 008fdf8dfbc4cd45c2907d672a947fb46ddd72c7 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 13 Jan 2021 15:44:33 +0000 Subject: [PATCH 170/231] Missed some underscores --- src/utils/DMRoomMap.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/DMRoomMap.ts b/src/utils/DMRoomMap.ts index 3a8c109b79..e49b74c380 100644 --- a/src/utils/DMRoomMap.ts +++ b/src/utils/DMRoomMap.ts @@ -185,7 +185,7 @@ export default class DMRoomMap { const myUserId = this.matrixClient.getUserId(); const selfDMs = userToRooms[myUserId]; if (selfDMs && selfDMs.length) { - const neededPatching = this._patchUpSelfDMs(userToRooms); + const neededPatching = this.patchUpSelfDMs(userToRooms); // to avoid multiple devices fighting to correct // the account data, only try to send the corrected // version once. @@ -203,7 +203,7 @@ export default class DMRoomMap { private populateRoomToUser() { this.roomToUser = {}; - for (const user of Object.keys(this._getUserToRooms())) { + for (const user of Object.keys(this.getUserToRooms())) { for (const roomId of this.userToRooms[user]) { this.roomToUser[roomId] = user; } From 6371a4abd1f3e7318b96e4dc40704e5607b133c5 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 13 Jan 2021 16:02:35 +0000 Subject: [PATCH 171/231] Fix tests Remove stray file extensions in includes and update shared instance name. --- test/components/views/rooms/RoomList-test.js | 4 ++-- test/utils/ShieldUtils-test.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/components/views/rooms/RoomList-test.js b/test/components/views/rooms/RoomList-test.js index c2cad431f4..1c2a1c9992 100644 --- a/test/components/views/rooms/RoomList-test.js +++ b/test/components/views/rooms/RoomList-test.js @@ -9,8 +9,8 @@ import sdk from '../../../skinned-sdk'; import { DragDropContext } from 'react-beautiful-dnd'; import dis from '../../../../src/dispatcher/dispatcher'; -import DMRoomMap from '../../../../src/utils/DMRoomMap.js'; -import GroupStore from '../../../../src/stores/GroupStore.js'; +import DMRoomMap from '../../../../src/utils/DMRoomMap'; +import GroupStore from '../../../../src/stores/GroupStore'; import { MatrixClient, Room, RoomMember } from 'matrix-js-sdk'; import {DefaultTagID} from "../../../../src/stores/room-list/models"; diff --git a/test/utils/ShieldUtils-test.js b/test/utils/ShieldUtils-test.js index e4c0c671e3..8e3b19c1c4 100644 --- a/test/utils/ShieldUtils-test.js +++ b/test/utils/ShieldUtils-test.js @@ -42,7 +42,7 @@ describe("mkClient self-test", function() { describe("shieldStatusForMembership self-trust behaviour", function() { beforeAll(() => { - DMRoomMap._sharedInstance = { + DMRoomMap.sharedInstance = { getUserIdForRoomId: (roomId) => roomId === "DM" ? "@any:h" : null, }; }); From d4470d2ed24709811d648bd10f2392fa6b3b93a3 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 13 Jan 2021 16:55:38 +0000 Subject: [PATCH 172/231] Actually this is right colour --- res/css/views/voip/_CallContainer.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/voip/_CallContainer.scss b/res/css/views/voip/_CallContainer.scss index d9843b668e..8262075559 100644 --- a/res/css/views/voip/_CallContainer.scss +++ b/res/css/views/voip/_CallContainer.scss @@ -46,7 +46,7 @@ limitations under the License. .mx_IncomingCallBox { min-width: 250px; - background-color: $primary-bg-color; + background-color: $voipcall-plinth-color; padding: 8px; box-shadow: 0px 14px 24px rgba(0, 0, 0, 0.08); border-radius: 8px; From 1b98ada55f87acba392c520fb751def4b3ca6194 Mon Sep 17 00:00:00 2001 From: David Baker Date: Wed, 13 Jan 2021 16:55:38 +0000 Subject: [PATCH 173/231] Actually this is right colour --- res/css/views/voip/_CallContainer.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/css/views/voip/_CallContainer.scss b/res/css/views/voip/_CallContainer.scss index d9843b668e..8262075559 100644 --- a/res/css/views/voip/_CallContainer.scss +++ b/res/css/views/voip/_CallContainer.scss @@ -46,7 +46,7 @@ limitations under the License. .mx_IncomingCallBox { min-width: 250px; - background-color: $primary-bg-color; + background-color: $voipcall-plinth-color; padding: 8px; box-shadow: 0px 14px 24px rgba(0, 0, 0, 0.08); border-radius: 8px; From cb66f7493b24e860f0d7e850afe007eecc9046b7 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 14 Jan 2021 15:58:26 +0000 Subject: [PATCH 174/231] Skip account settings for guest users Homeservers don't allow this currently, so we should use something else instead for such cases. --- src/settings/handlers/AccountSettingsHandler.ts | 2 +- src/settings/handlers/RoomAccountSettingsHandler.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/settings/handlers/AccountSettingsHandler.ts b/src/settings/handlers/AccountSettingsHandler.ts index d609fd3231..e75faa49c1 100644 --- a/src/settings/handlers/AccountSettingsHandler.ts +++ b/src/settings/handlers/AccountSettingsHandler.ts @@ -169,7 +169,7 @@ export default class AccountSettingsHandler extends MatrixClientBackedSettingsHa public isSupported(): boolean { const cli = MatrixClientPeg.get(); - return cli !== undefined && cli !== null; + return cli !== undefined && cli !== null && !cli.isGuest(); } private getSettings(eventType = "im.vector.web.settings"): any { // TODO: [TS] Types on return diff --git a/src/settings/handlers/RoomAccountSettingsHandler.ts b/src/settings/handlers/RoomAccountSettingsHandler.ts index 53e29653f8..416bdddb90 100644 --- a/src/settings/handlers/RoomAccountSettingsHandler.ts +++ b/src/settings/handlers/RoomAccountSettingsHandler.ts @@ -129,7 +129,7 @@ export default class RoomAccountSettingsHandler extends MatrixClientBackedSettin public isSupported(): boolean { const cli = MatrixClientPeg.get(); - return cli !== undefined && cli !== null; + return cli !== undefined && cli !== null && !cli.isGuest(); } private getSettings(roomId: string, eventType = "im.vector.web.settings"): any { // TODO: [TS] Type return From 658a8dfa9954f4c1e45d46c1ff924f14684b7923 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 14 Jan 2021 17:30:25 +0000 Subject: [PATCH 175/231] Use device storage for allowed widgets if account data not supported With guest accounts, account data is not available, so we use device storage to hold allowed widgets as a good enough place. Fixes https://github.com/vector-im/element-web/issues/16145 --- .../views/context_menus/WidgetContextMenu.tsx | 3 ++- src/components/views/elements/AppTile.js | 3 ++- src/settings/Settings.ts | 3 ++- src/settings/SettingsStore.ts | 25 +++++++++++++++++++ 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/components/views/context_menus/WidgetContextMenu.tsx b/src/components/views/context_menus/WidgetContextMenu.tsx index 8026942038..3c7bf0ee0e 100644 --- a/src/components/views/context_menus/WidgetContextMenu.tsx +++ b/src/components/views/context_menus/WidgetContextMenu.tsx @@ -127,7 +127,8 @@ const WidgetContextMenu: React.FC = ({ console.info("Revoking permission for widget to load: " + app.eventId); const current = SettingsStore.getValue("allowedWidgets", roomId); current[app.eventId] = false; - SettingsStore.setValue("allowedWidgets", roomId, SettingLevel.ROOM_ACCOUNT, current).catch(err => { + const level = SettingsStore.firstSupportedLevel("allowedWidgets"); + SettingsStore.setValue("allowedWidgets", roomId, level, current).catch(err => { console.error(err); // We don't really need to do anything about this - the user will just hit the button again. }); diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index 7e0ae965bb..65bc0ac6f1 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -240,7 +240,8 @@ export default class AppTile extends React.Component { console.info("Granting permission for widget to load: " + this.props.app.eventId); const current = SettingsStore.getValue("allowedWidgets", roomId); current[this.props.app.eventId] = true; - SettingsStore.setValue("allowedWidgets", roomId, SettingLevel.ROOM_ACCOUNT, current).then(() => { + const level = SettingsStore.firstSupportedLevel("allowedWidgets"); + SettingsStore.setValue("allowedWidgets", roomId, level, current).then(() => { this.setState({hasPermissionToLoad: true}); // Fetch a token for the integration manager, now that we're allowed to diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index b239b809fe..6ca009df61 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -421,7 +421,8 @@ export const SETTINGS: {[setting: string]: ISetting} = { default: true, }, "allowedWidgets": { - supportedLevels: [SettingLevel.ROOM_ACCOUNT], + supportedLevels: [SettingLevel.ROOM_ACCOUNT, SettingLevel.ROOM_DEVICE], + supportedLevelsAreOrdered: true, default: {}, // none allowed }, "analyticsOptIn": { diff --git a/src/settings/SettingsStore.ts b/src/settings/SettingsStore.ts index 82f169f498..2d024ba3f8 100644 --- a/src/settings/SettingsStore.ts +++ b/src/settings/SettingsStore.ts @@ -467,6 +467,31 @@ export default class SettingsStore { return LEVEL_HANDLERS[level].isSupported(); } + /** + * Determines the first supported level out of all the levels that can be used for a + * specific setting. + * @param {string} settingName The setting name. + * @return {SettingLevel} + */ + public static firstSupportedLevel(settingName: string): SettingLevel { + // Verify that the setting is actually a setting + const setting = SETTINGS[settingName]; + if (!setting) { + throw new Error("Setting '" + settingName + "' does not appear to be a setting."); + } + + const levelOrder = (setting.supportedLevelsAreOrdered ? setting.supportedLevels : LEVEL_ORDER); + if (!levelOrder.includes(SettingLevel.DEFAULT)) levelOrder.push(SettingLevel.DEFAULT); // always include default + + const handlers = SettingsStore.getHandlers(settingName); + + for (const level of levelOrder) { + const handler = handlers[level]; + if (!handler) continue; + return level; + } + } + /** * Debugging function for reading explicit setting values without going through the * complicated/biased functions in the SettingsStore. This will print information to From accbe78d9a3a14599d09d7814b4db70072ffbdce Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 14 Jan 2021 17:37:18 +0000 Subject: [PATCH 176/231] Add null path --- src/settings/SettingsStore.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/settings/SettingsStore.ts b/src/settings/SettingsStore.ts index 2d024ba3f8..1b718a72b3 100644 --- a/src/settings/SettingsStore.ts +++ b/src/settings/SettingsStore.ts @@ -490,6 +490,7 @@ export default class SettingsStore { if (!handler) continue; return level; } + return null; } /** From 6d932e135290d9f982f8d7b1c3dec1b0ae08917c Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 14 Jan 2021 17:38:06 +0000 Subject: [PATCH 177/231] Fix lint errors --- src/components/views/context_menus/WidgetContextMenu.tsx | 1 - src/components/views/elements/AppTile.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/components/views/context_menus/WidgetContextMenu.tsx b/src/components/views/context_menus/WidgetContextMenu.tsx index 3c7bf0ee0e..4662c74d78 100644 --- a/src/components/views/context_menus/WidgetContextMenu.tsx +++ b/src/components/views/context_menus/WidgetContextMenu.tsx @@ -26,7 +26,6 @@ import {WidgetMessagingStore} from "../../../stores/widgets/WidgetMessagingStore import RoomContext from "../../../contexts/RoomContext"; import dis from "../../../dispatcher/dispatcher"; import SettingsStore from "../../../settings/SettingsStore"; -import {SettingLevel} from "../../../settings/SettingLevel"; import Modal from "../../../Modal"; import QuestionDialog from "../dialogs/QuestionDialog"; import {WidgetType} from "../../../widgets/WidgetType"; diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index 65bc0ac6f1..213351889f 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -33,7 +33,6 @@ import SettingsStore from "../../../settings/SettingsStore"; import {aboveLeftOf, ContextMenuButton} from "../../structures/ContextMenu"; import PersistedElement, {getPersistKey} from "./PersistedElement"; import {WidgetType} from "../../../widgets/WidgetType"; -import {SettingLevel} from "../../../settings/SettingLevel"; import {StopGapWidget} from "../../../stores/widgets/StopGapWidget"; import {ElementWidgetActions} from "../../../stores/widgets/ElementWidgetActions"; import {MatrixCapabilities} from "matrix-widget-api"; From 97a551c04ae294201de4eff49a21c0f4c452fc6c Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Thu, 14 Jan 2021 17:39:58 +0000 Subject: [PATCH 178/231] Fix test --- test/components/views/messages/TextualBody-test.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/components/views/messages/TextualBody-test.js b/test/components/views/messages/TextualBody-test.js index bf55e9c430..fc627538f0 100644 --- a/test/components/views/messages/TextualBody-test.js +++ b/test/components/views/messages/TextualBody-test.js @@ -222,6 +222,7 @@ describe("", () => { getRoom: () => mkStubRoom("room_id"), getAccountData: () => undefined, getUrlPreview: (url) => new Promise(() => {}), + isGuest: () => false, }; const ev = mkEvent({ From e90009772d0c2955e8caeecb1fc4f81d83b61afa Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 15 Jan 2021 11:21:52 +0000 Subject: [PATCH 179/231] Fix React warnings about missing key for edited messages This uses a fragment instead of an array to avoid the need for key attributes. --- src/components/views/messages/TextualBody.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 8f153e48e9..bf0884a2f3 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -410,7 +410,10 @@ export default class TextualBody extends React.Component { ref: this._content, }); if (this.props.replacingEventId) { - body = [body, this._renderEditedMarker()]; + body = <> + {body} + {this._renderEditedMarker()} + ; } if (this.props.highlightLink) { From 80f3e14faf19ca0b188ad05a68d00af778728171 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 15 Jan 2021 11:42:30 +0000 Subject: [PATCH 180/231] Move `LoggedInView` subscriptions to after mounted This avoids a React warning about trying to call `setState` before the component is mounted. --- src/components/structures/LoggedInView.tsx | 34 +++++++++++++--------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/components/structures/LoggedInView.tsx b/src/components/structures/LoggedInView.tsx index ec5afd13f0..70ec2b7033 100644 --- a/src/components/structures/LoggedInView.tsx +++ b/src/components/structures/LoggedInView.tsx @@ -140,7 +140,7 @@ class LoggedInView extends React.Component { protected readonly _matrixClient: MatrixClient; protected readonly _roomView: React.RefObject; protected readonly _resizeContainer: React.RefObject; - protected readonly _compactLayoutWatcherRef: string; + protected compactLayoutWatcherRef: string; protected resizer: Resizer; constructor(props, context) { @@ -157,18 +157,6 @@ class LoggedInView extends React.Component { CallMediaHandler.loadDevices(); - document.addEventListener('keydown', this._onNativeKeyDown, false); - - this._updateServerNoticeEvents(); - - this._matrixClient.on("accountData", this.onAccountData); - this._matrixClient.on("sync", this.onSync); - this._matrixClient.on("RoomState.events", this.onRoomStateEvents); - - this._compactLayoutWatcherRef = SettingsStore.watchSetting( - "useCompactLayout", null, this.onCompactLayoutChanged, - ); - fixupColorFonts(); this._roomView = React.createRef(); @@ -176,6 +164,24 @@ class LoggedInView extends React.Component { } componentDidMount() { + document.addEventListener('keydown', this._onNativeKeyDown, false); + + this._updateServerNoticeEvents(); + + this._matrixClient.on("accountData", this.onAccountData); + this._matrixClient.on("sync", this.onSync); + // Call `onSync` with the current state as well + this.onSync( + this._matrixClient.getSyncState(), + null, + this._matrixClient.getSyncStateData(), + ); + this._matrixClient.on("RoomState.events", this.onRoomStateEvents); + + this.compactLayoutWatcherRef = SettingsStore.watchSetting( + "useCompactLayout", null, this.onCompactLayoutChanged, + ); + this.resizer = this._createResizer(); this.resizer.attach(); this._loadResizerPreferences(); @@ -186,7 +192,7 @@ class LoggedInView extends React.Component { this._matrixClient.removeListener("accountData", this.onAccountData); this._matrixClient.removeListener("sync", this.onSync); this._matrixClient.removeListener("RoomState.events", this.onRoomStateEvents); - SettingsStore.unwatchSetting(this._compactLayoutWatcherRef); + SettingsStore.unwatchSetting(this.compactLayoutWatcherRef); this.resizer.detach(); } From 729356394e30672832f176a338eade2b1f3de51c Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 15 Jan 2021 13:54:38 +0000 Subject: [PATCH 181/231] Use room-specific listeners for message previews This should be a bit faster (since we now only notify one tile instead of all for each update). It also resolves the max listener warning. Fixes https://github.com/vector-im/element-web/issues/15121 --- src/components/views/rooms/RoomTile.tsx | 22 ++++++++++++++++++--- src/stores/room-list/MessagePreviewStore.ts | 10 +++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/components/views/rooms/RoomTile.tsx b/src/components/views/rooms/RoomTile.tsx index a241a13991..2ad10c79c8 100644 --- a/src/components/views/rooms/RoomTile.tsx +++ b/src/components/views/rooms/RoomTile.tsx @@ -29,7 +29,7 @@ import ActiveRoomObserver from "../../../ActiveRoomObserver"; import { _t } from "../../../languageHandler"; import { ChevronFace, ContextMenuTooltipButton } from "../../structures/ContextMenu"; import { DefaultTagID, TagID } from "../../../stores/room-list/models"; -import { MessagePreviewStore, ROOM_PREVIEW_CHANGED } from "../../../stores/room-list/MessagePreviewStore"; +import { MessagePreviewStore } from "../../../stores/room-list/MessagePreviewStore"; import DecoratedRoomAvatar from "../avatars/DecoratedRoomAvatar"; import { ALL_MESSAGES, ALL_MESSAGES_LOUD, MENTIONS_ONLY, MUTE } from "../../../RoomNotifs"; import { MatrixClientPeg } from "../../../MatrixClientPeg"; @@ -99,7 +99,10 @@ export default class RoomTile extends React.PureComponent { ActiveRoomObserver.addListener(this.props.room.roomId, this.onActiveRoomUpdate); this.dispatcherRef = defaultDispatcher.register(this.onAction); - MessagePreviewStore.instance.on(ROOM_PREVIEW_CHANGED, this.onRoomPreviewChanged); + MessagePreviewStore.instance.on( + MessagePreviewStore.getPreviewChangedEventName(this.props.room), + this.onRoomPreviewChanged, + ); this.notificationState = RoomNotificationStateStore.instance.getRoomState(this.props.room); this.notificationState.on(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate); this.roomProps = EchoChamber.forRoom(this.props.room); @@ -128,6 +131,16 @@ export default class RoomTile extends React.PureComponent { if (prevProps.showMessagePreview !== this.props.showMessagePreview && this.showMessagePreview) { this.setState({messagePreview: this.generatePreview()}); } + if (prevProps.room?.roomId !== this.props.room?.roomId) { + MessagePreviewStore.instance.off( + MessagePreviewStore.getPreviewChangedEventName(prevProps.room), + this.onRoomPreviewChanged, + ); + MessagePreviewStore.instance.on( + MessagePreviewStore.getPreviewChangedEventName(this.props.room), + this.onRoomPreviewChanged, + ); + } } public componentDidMount() { @@ -140,9 +153,12 @@ export default class RoomTile extends React.PureComponent { public componentWillUnmount() { if (this.props.room) { ActiveRoomObserver.removeListener(this.props.room.roomId, this.onActiveRoomUpdate); + MessagePreviewStore.instance.off( + MessagePreviewStore.getPreviewChangedEventName(this.props.room), + this.onRoomPreviewChanged, + ); } defaultDispatcher.unregister(this.dispatcherRef); - MessagePreviewStore.instance.off(ROOM_PREVIEW_CHANGED, this.onRoomPreviewChanged); this.notificationState.off(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate); CommunityPrototypeStore.instance.off(UPDATE_EVENT, this.onCommunityUpdate); } diff --git a/src/stores/room-list/MessagePreviewStore.ts b/src/stores/room-list/MessagePreviewStore.ts index 2803f0a23e..38e56881cc 100644 --- a/src/stores/room-list/MessagePreviewStore.ts +++ b/src/stores/room-list/MessagePreviewStore.ts @@ -30,7 +30,7 @@ import { UPDATE_EVENT } from "../AsyncStore"; // Emitted event for when a room's preview has changed. First argument will the room for which // the change happened. -export const ROOM_PREVIEW_CHANGED = "room_preview_changed"; +const ROOM_PREVIEW_CHANGED = "room_preview_changed"; const PREVIEWS = { 'm.room.message': { @@ -84,6 +84,10 @@ export class MessagePreviewStore extends AsyncStoreWithClient { return MessagePreviewStore.internalInstance; } + public static getPreviewChangedEventName(room: Room): string { + return `${ROOM_PREVIEW_CHANGED}:${room?.roomId}`; + } + /** * Gets the pre-translated preview for a given room * @param room The room to get the preview for. @@ -150,7 +154,7 @@ export class MessagePreviewStore extends AsyncStoreWithClient { // We've muted the underlying Map, so just emit that we've changed. this.previews.set(room.roomId, map); this.emit(UPDATE_EVENT, this); - this.emit(ROOM_PREVIEW_CHANGED, room); + this.emit(MessagePreviewStore.getPreviewChangedEventName(room), room); } return; // we're done } @@ -158,7 +162,7 @@ export class MessagePreviewStore extends AsyncStoreWithClient { // At this point, we didn't generate a preview so clear it this.previews.set(room.roomId, new Map()); this.emit(UPDATE_EVENT, this); - this.emit(ROOM_PREVIEW_CHANGED, room); + this.emit(MessagePreviewStore.getPreviewChangedEventName(room), room); } protected async onAction(payload: ActionPayload) { From 8a341446aaecb00ccf357209ce5521e358365f71 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 15 Jan 2021 14:34:56 +0000 Subject: [PATCH 182/231] Use room-specific listeners for community prototype Similar to message previews, this changes another area to use room-specific listeners for better performance and avoiding warnings. --- src/components/views/rooms/RoomTile.tsx | 18 ++++++++++++++++-- src/stores/CommunityPrototypeStore.ts | 9 +++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/components/views/rooms/RoomTile.tsx b/src/components/views/rooms/RoomTile.tsx index 2ad10c79c8..959b2f162a 100644 --- a/src/components/views/rooms/RoomTile.tsx +++ b/src/components/views/rooms/RoomTile.tsx @@ -107,7 +107,10 @@ export default class RoomTile extends React.PureComponent { this.notificationState.on(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate); this.roomProps = EchoChamber.forRoom(this.props.room); this.roomProps.on(PROPERTY_UPDATED, this.onRoomPropertyUpdate); - CommunityPrototypeStore.instance.on(UPDATE_EVENT, this.onCommunityUpdate); + CommunityPrototypeStore.instance.on( + CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId), + this.onCommunityUpdate, + ); } private onNotificationUpdate = () => { @@ -140,6 +143,14 @@ export default class RoomTile extends React.PureComponent { MessagePreviewStore.getPreviewChangedEventName(this.props.room), this.onRoomPreviewChanged, ); + CommunityPrototypeStore.instance.off( + CommunityPrototypeStore.getUpdateEventName(prevProps.room?.roomId), + this.onCommunityUpdate, + ); + CommunityPrototypeStore.instance.on( + CommunityPrototypeStore.getUpdateEventName(this.props.room?.roomId), + this.onCommunityUpdate, + ); } } @@ -157,10 +168,13 @@ export default class RoomTile extends React.PureComponent { MessagePreviewStore.getPreviewChangedEventName(this.props.room), this.onRoomPreviewChanged, ); + CommunityPrototypeStore.instance.off( + CommunityPrototypeStore.getUpdateEventName(this.props.room.roomId), + this.onCommunityUpdate, + ); } defaultDispatcher.unregister(this.dispatcherRef); this.notificationState.off(NOTIFICATION_STATE_UPDATE, this.onNotificationUpdate); - CommunityPrototypeStore.instance.off(UPDATE_EVENT, this.onCommunityUpdate); } private onAction = (payload: ActionPayload) => { diff --git a/src/stores/CommunityPrototypeStore.ts b/src/stores/CommunityPrototypeStore.ts index 95d56bd40e..92e094c83b 100644 --- a/src/stores/CommunityPrototypeStore.ts +++ b/src/stores/CommunityPrototypeStore.ts @@ -48,6 +48,10 @@ export class CommunityPrototypeStore extends AsyncStoreWithClient { return CommunityPrototypeStore.internalInstance; } + public static getUpdateEventName(roomId: string): string { + return `${UPDATE_EVENT}:${roomId}`; + } + public getSelectedCommunityId(): string { if (SettingsStore.getValue("feature_communities_v2_prototypes")) { return GroupFilterOrderStore.getSelectedTags()[0]; @@ -134,7 +138,8 @@ export class CommunityPrototypeStore extends AsyncStoreWithClient { } } else if (payload.action === "MatrixActions.accountData") { if (payload.event_type.startsWith("im.vector.group_info.")) { - this.emit(UPDATE_EVENT, payload.event_type.substring("im.vector.group_info.".length)); + const roomId = payload.event_type.substring("im.vector.group_info.".length); + this.emit(CommunityPrototypeStore.getUpdateEventName(roomId), roomId); } } else if (payload.action === "select_tag") { // Automatically select the general chat when switching communities @@ -167,7 +172,7 @@ export class CommunityPrototypeStore extends AsyncStoreWithClient { if (getEffectiveMembership(myMember.membership) === EffectiveMembership.Invite) { // Fake an update for anything that might have started listening before the invite // data was available (eg: RoomPreviewBar after a refresh) - this.emit(UPDATE_EVENT, room.roomId); + this.emit(CommunityPrototypeStore.getUpdateEventName(room.roomId), room.roomId); } } } From 462e0889f05172e06de3927cf81d594af848d748 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Fri, 15 Jan 2021 14:46:38 +0000 Subject: [PATCH 183/231] Fix lint --- src/components/views/rooms/RoomTile.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/views/rooms/RoomTile.tsx b/src/components/views/rooms/RoomTile.tsx index 959b2f162a..c985e80010 100644 --- a/src/components/views/rooms/RoomTile.tsx +++ b/src/components/views/rooms/RoomTile.tsx @@ -51,7 +51,6 @@ import IconizedContextMenu, { IconizedContextMenuRadio, } from "../context_menus/IconizedContextMenu"; import { CommunityPrototypeStore, IRoomProfile } from "../../../stores/CommunityPrototypeStore"; -import { UPDATE_EVENT } from "../../../stores/AsyncStore"; interface IProps { room: Room; From ea61c979f91f323d6806f4044bb95808c5794074 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 16 Jan 2021 23:29:27 -0700 Subject: [PATCH 184/231] Try a different string --- src/i18n/strings/en_EN.json | 2 +- src/widgets/CapabilityText.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index b53bb90c92..384f6d04e9 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -584,7 +584,7 @@ "Send stickers into this room": "Send stickers into this room", "Send stickers into your active room": "Send stickers into your active room", "Change which room you're viewing": "Change which room you're viewing", - "Change which room you're viewing and use permalinks": "Change which room you're viewing and use permalinks", + "Change which room, message, or user you're viewing": "Change which room, message, or user you're viewing", "Change the topic of this room": "Change the topic of this room", "See when the topic changes in this room": "See when the topic changes in this room", "Change the topic of your active room": "Change the topic of your active room", diff --git a/src/widgets/CapabilityText.tsx b/src/widgets/CapabilityText.tsx index 044b7701ba..273d22dc81 100644 --- a/src/widgets/CapabilityText.tsx +++ b/src/widgets/CapabilityText.tsx @@ -61,7 +61,7 @@ export class CapabilityText { [GENERIC_WIDGET_KIND]: _td("Change which room you're viewing"), }, [MatrixCapabilities.MSC2931Navigate]: { - [GENERIC_WIDGET_KIND]: _td("Change which room you're viewing and use permalinks"), + [GENERIC_WIDGET_KIND]: _td("Change which room, message, or user you're viewing"), }, }; From f6a328a55b44ca508a6aaed7ef7f63f5759d110c Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Sat, 16 Jan 2021 23:34:16 -0700 Subject: [PATCH 185/231] Update widget api --- package.json | 2 +- yarn.lock | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 92b574da34..cb70541f99 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "linkifyjs": "^2.1.9", "lodash": "^4.17.19", "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", - "matrix-widget-api": "^0.1.0-beta.10", + "matrix-widget-api": "0.1.0-beta.11", "minimist": "^1.2.5", "pako": "^1.0.11", "parse5": "^5.1.1", diff --git a/yarn.lock b/yarn.lock index b0769c2c04..e2292d66ff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1809,6 +1809,11 @@ resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== +"@types/events@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" + integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== + "@types/fbemitter@*": version "2.0.32" resolved "https://registry.yarnpkg.com/@types/fbemitter/-/fbemitter-2.0.32.tgz#8ed204da0f54e9c8eaec31b1eec91e25132d082c" @@ -6580,11 +6585,12 @@ matrix-react-test-utils@^0.2.2: resolved "https://registry.yarnpkg.com/matrix-react-test-utils/-/matrix-react-test-utils-0.2.2.tgz#c87144d3b910c7edc544a6699d13c7c2bf02f853" integrity sha512-49+7gfV6smvBIVbeloql+37IeWMTD+fiywalwCqk8Dnz53zAFjKSltB3rmWHso1uecLtQEcPtCijfhzcLXAxTQ== -matrix-widget-api@^0.1.0-beta.10: - version "0.1.0-beta.10" - resolved "https://registry.yarnpkg.com/matrix-widget-api/-/matrix-widget-api-0.1.0-beta.10.tgz#2e4d658d90ff3152c5567089b4ddd21fb44ec1dd" - integrity sha512-yX2UURjM1zVp7snPiOFcH9+FDBdHfAdt5HEAyDUHGJ7w/F2zOtcK/y0dMlZ1+XhxY7Wv0IBZH0US8X/ioJRX1A== +matrix-widget-api@0.1.0-beta.11: + version "0.1.0-beta.11" + resolved "https://registry.yarnpkg.com/matrix-widget-api/-/matrix-widget-api-0.1.0-beta.11.tgz#3658e244bf82eebea36e64475ebfce86b778b476" + integrity sha512-RxIghopRKTQdmYMJzZg/QR+wcPcKe9S1pZZ31zN/M1LKsvTLThBYdMcP1idKh7MkhpO9eCdCVjJOMJTrqxNzbQ== dependencies: + "@types/events" "^3.0.0" events "^3.2.0" mdast-util-compact@^1.0.0: From 461c0733d9325c4620d876ca82eea46f4d39c6b9 Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Mon, 18 Jan 2021 11:35:08 +0000 Subject: [PATCH 186/231] Revert strings --- src/i18n/strings/ar.json | 2 +- src/i18n/strings/bg.json | 4 ++-- src/i18n/strings/cs.json | 4 ++-- src/i18n/strings/de_DE.json | 4 ++-- src/i18n/strings/en_EN.json | 20 +++++--------------- src/i18n/strings/eo.json | 4 ++-- src/i18n/strings/es.json | 4 ++-- src/i18n/strings/et.json | 4 ++-- src/i18n/strings/eu.json | 4 ++-- src/i18n/strings/fi.json | 4 ++-- src/i18n/strings/fr.json | 4 ++-- src/i18n/strings/gl.json | 4 ++-- src/i18n/strings/hu.json | 4 ++-- src/i18n/strings/it.json | 4 ++-- src/i18n/strings/kab.json | 4 ++-- src/i18n/strings/lt.json | 4 ++-- src/i18n/strings/nl.json | 4 ++-- src/i18n/strings/pt_BR.json | 4 ++-- src/i18n/strings/ru.json | 4 ++-- src/i18n/strings/sk.json | 4 ++-- src/i18n/strings/sq.json | 4 ++-- src/i18n/strings/sv.json | 4 ++-- src/i18n/strings/tr.json | 4 ++-- src/i18n/strings/uk.json | 4 ++-- src/i18n/strings/zh_Hans.json | 4 ++-- src/i18n/strings/zh_Hant.json | 4 ++-- 26 files changed, 54 insertions(+), 64 deletions(-) diff --git a/src/i18n/strings/ar.json b/src/i18n/strings/ar.json index 8e8ae3f775..5da09afd23 100644 --- a/src/i18n/strings/ar.json +++ b/src/i18n/strings/ar.json @@ -1056,7 +1056,7 @@ "Failed to upload profile picture!": "تعذَّر رفع صورة الملف الشخصي!", "Show more": "أظهر أكثر", "Show less": "أظهر أقل", - "Channel: ": "قناة: ", + "Channel: %(channelName)s": "قناة: %(channelName)s", "This bridge is managed by .": "هذا الجسر يديره .", "Upload": "رفع", "Accept to continue:": "قبول للمتابعة:", diff --git a/src/i18n/strings/bg.json b/src/i18n/strings/bg.json index ebe4e65a16..e4010e8b64 100644 --- a/src/i18n/strings/bg.json +++ b/src/i18n/strings/bg.json @@ -1840,8 +1840,8 @@ "Other users may not trust it": "Други потребители може да не се доверят", "From %(deviceName)s (%(deviceId)s)": "От %(deviceName)s (%(deviceId)s)", "This bridge was provisioned by .": "Мостът е настроен от .", - "Workspace: ": "Работна област: ", - "Channel: ": "Канал: ", + "Workspace: %(networkName)s": "Работна област: %(networkName)s", + "Channel: %(channelName)s": "Канал: %(channelName)s", "Show less": "Покажи по-малко", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Промяната на паролата в момента би нулирало всички ключове за шифроване-от-край-до-край, правейки историята на чата нечетима, освен ако първо не експортирате ключовете, а след промяната на паролата ги импортирате. В бъдеще, това ще бъде подобрено.", "Your homeserver does not support cross-signing.": "Сървърът ви не поддържа кръстосано-подписване.", diff --git a/src/i18n/strings/cs.json b/src/i18n/strings/cs.json index d4451bb902..3f9d231317 100644 --- a/src/i18n/strings/cs.json +++ b/src/i18n/strings/cs.json @@ -1753,8 +1753,8 @@ "Review": "Prohlédnout", "This bridge was provisioned by .": "Toto propojení poskytuje .", "This bridge is managed by .": "Toto propojení spravuje .", - "Workspace: ": "Pracovní oblast: ", - "Channel: ": "Kanál: ", + "Workspace: %(networkName)s": "Pracovní oblast: %(networkName)s", + "Channel: %(channelName)s": "Kanál: %(channelName)s", "Show less": "Skrýt detaily", "Show more": "Více", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Změna hesla resetuje šifrovací klíče pro všechny vaše relace. Pokud si nejdřív nevyexportujete klíče místností a po změně je znovu neimportujete, nedostanete se k historickým zprávám. V budoucnu se toto zjednoduší.", diff --git a/src/i18n/strings/de_DE.json b/src/i18n/strings/de_DE.json index 972440e80a..8588ccb7d6 100644 --- a/src/i18n/strings/de_DE.json +++ b/src/i18n/strings/de_DE.json @@ -1668,8 +1668,8 @@ "Verify yourself & others to keep your chats safe": "Verifiziere dich & andere, um eure Chats zu schützen", "This bridge was provisioned by .": "Diese Brücke wurde von bereitgestellt.", "This bridge is managed by .": "Diese Brücke wird von verwaltet.", - "Workspace: ": "Arbeitsbereich: ", - "Channel: ": "Kanal: ", + "Workspace: %(networkName)s": "Arbeitsbereich: %(networkName)s", + "Channel: %(channelName)s": "Kanal: %(channelName)s", "Show less": "Weniger zeigen", "Warning: You should only set up key backup from a trusted computer.": "Achtung: Du solltest die Schlüsselsicherung nur auf einem vertrauenswürdigen Gerät einrichten.", "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.": "Melde dich an um die ausschließlich in dieser Sitzung gespeicherten Verschlüsselungsschlüssel wiederherzustellen. Du benötigst sie, um deine verschlüsselten Nachrichten in jeder Sitzung zu lesen.", diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index ac45a6b763..c6a724f02f 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -411,8 +411,6 @@ "Command error": "Command error", "Usage": "Usage", "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Prepends ¯\\_(ツ)_/¯ to a plain-text message", - "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message", - "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message", "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message", "Sends a message as plain text, without interpreting it as markdown": "Sends a message as plain text, without interpreting it as markdown", "Sends a message as html, without interpreting it as markdown": "Sends a message as html, without interpreting it as markdown", @@ -861,9 +859,6 @@ "Fill Screen": "Fill Screen", "Return to call": "Return to call", "%(name)s on hold": "%(name)s on hold", - "Unable to look up phone number": "Unable to look up phone number", - "There was an error looking up the phone number": "There was an error looking up the phone number", - "Dial pad": "Dial pad", "Unknown caller": "Unknown caller", "Incoming voice call": "Incoming voice call", "Incoming video call": "Incoming video call", @@ -965,8 +960,10 @@ "Upload": "Upload", "This bridge was provisioned by .": "This bridge was provisioned by .", "This bridge is managed by .": "This bridge is managed by .", - "Workspace: ": "Workspace: ", - "Channel: ": "Channel: ", + "Workspace: %s": "Workspace: %s", + "Channel: %s": "Channel: %s", + "Show less": "Show less", + "Show more": "Show more", "Failed to upload profile picture!": "Failed to upload profile picture!", "Upload new:": "Upload new:", "No display name": "No display name", @@ -1460,8 +1457,6 @@ "Hide Widgets": "Hide Widgets", "Show Widgets": "Show Widgets", "Search": "Search", - "Start a Conversation": "Start a Conversation", - "Open dial pad": "Open dial pad", "Invites": "Invites", "Favourites": "Favourites", "People": "People", @@ -1530,7 +1525,6 @@ "Jump to first invite.": "Jump to first invite.", "Show %(count)s more|other": "Show %(count)s more", "Show %(count)s more|one": "Show %(count)s more", - "Show less": "Show less", "Use default": "Use default", "All messages": "All messages", "Mentions & Keywords": "Mentions & Keywords", @@ -1593,7 +1587,6 @@ "New published address (e.g. #alias:server)": "New published address (e.g. #alias:server)", "Local Addresses": "Local Addresses", "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)", - "Show more": "Show more", "Error updating flair": "Error updating flair", "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.", "Invalid community ID": "Invalid community ID", @@ -2082,8 +2075,6 @@ "We couldn't create your DM. Please check the users you want to invite and try again.": "We couldn't create your DM. Please check the users you want to invite and try again.", "Something went wrong trying to invite the users.": "Something went wrong trying to invite the users.", "We couldn't invite those users. Please check the users you want to invite and try again.": "We couldn't invite those users. Please check the users you want to invite and try again.", - "A call can only be transferred to a single user.": "A call can only be transferred to a single user.", - "Failed to transfer call": "Failed to transfer call", "Failed to find the following users": "Failed to find the following users", "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s", "Recent Conversations": "Recent Conversations", @@ -2097,7 +2088,6 @@ "Go": "Go", "Invite someone using their name, email address, username (like ) or share this room.": "Invite someone using their name, email address, username (like ) or share this room.", "Invite someone using their name, username (like ) or share this room.": "Invite someone using their name, username (like ) or share this room.", - "Transfer": "Transfer", "a new master key signature": "a new master key signature", "a new cross-signing key signature": "a new cross-signing key signature", "a device cross-signing signature": "a device cross-signing signature", @@ -2439,7 +2429,7 @@ "Create a new community": "Create a new community", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.", "You’re all caught up": "You’re all caught up", - "You have no visible notifications.": "You have no visible notifications.", + "You have no visible notifications in this room.": "You have no visible notifications in this room.", "%(brand)s failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "%(brand)s failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.", "%(brand)s failed to get the public room list.": "%(brand)s failed to get the public room list.", "The homeserver may be unavailable or overloaded.": "The homeserver may be unavailable or overloaded.", diff --git a/src/i18n/strings/eo.json b/src/i18n/strings/eo.json index f151d8a857..3545565fa3 100644 --- a/src/i18n/strings/eo.json +++ b/src/i18n/strings/eo.json @@ -1720,7 +1720,7 @@ "They don't match": "Ili ne akordas", "To be secure, do this in person or use a trusted way to communicate.": "Por plia sekureco, faru tion persone, aŭ uzu alian fidatan komunikilon.", "Verify yourself & others to keep your chats safe": "Kontrolu vin mem kaj aliajn por sekurigi viajn babilojn", - "Channel: ": "Kanalo: ", + "Channel: %(channelName)s": "Kanalo: %(channelName)s", "Show less": "Montri malpli", "Show more": "Montri pli", "Help": "Helpo", @@ -1760,7 +1760,7 @@ "Review": "Rekontroli", "This bridge was provisioned by .": "Ĉi tiu ponto estas provizita de .", "This bridge is managed by .": "Ĉi tiu ponto estas administrata de .", - "Workspace: ": "Labortablo: ", + "Workspace: %(networkName)s": "Labortablo: %(networkName)s", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ŝanĝo de pasvorto nuntempe restarigos ĉiujn tutvoje ĉifrajn ŝlosilojn en ĉiuj salutaĵoj, malebligante legadon de ĉifrita historio, malse vi unue elportus la ŝlosilojn de viaj ĉambroj kaj reenportus ilin poste. Ĉi tion ni plibonigos ose.", "Your homeserver does not support cross-signing.": "Via hejmservilo ne subtenas delegajn subskribojn.", "Cross-signing and secret storage are enabled.": "Delegaj subskriboj kaj sekreta deponejo estas ŝaltitaj.", diff --git a/src/i18n/strings/es.json b/src/i18n/strings/es.json index 11c92c9ccf..34c40800f7 100644 --- a/src/i18n/strings/es.json +++ b/src/i18n/strings/es.json @@ -1209,8 +1209,8 @@ "Verify": "Verificar", "Later": "Más tarde", "Upload": "Subir", - "Workspace: ": "Espacio de trabajo: ", - "Channel: ": "Canal: ", + "Workspace: %(networkName)s": "Espacio de trabajo: %(networkName)s", + "Channel: %(channelName)s": "Canal: %(channelName)s", "Show less": "Mostrar menos", "Show more": "Mostrar más", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Cambiar la contraseña reiniciará cualquier clave de encriptación end-to-end en todas las sesiones, haciendo el historial de conversaciones encriptado ilegible, a no ser que primero exportes tus claves de sala y después las reimportes. En un futuro esto será mejorado.", diff --git a/src/i18n/strings/et.json b/src/i18n/strings/et.json index 3361242ce5..10f4b6f4a0 100644 --- a/src/i18n/strings/et.json +++ b/src/i18n/strings/et.json @@ -1804,8 +1804,8 @@ "Waiting for your other session to verify…": "Ootan, et sinu teine sessioon alustaks verifitseerimist…", "This bridge was provisioned by .": "Selle võrgusilla võttis kasutusele .", "This bridge is managed by .": "Seda võrgusilda haldab .", - "Workspace: ": "Tööruum: ", - "Channel: ": "Kanal: ", + "Workspace: %(networkName)s": "Tööruum: %(networkName)s", + "Channel: %(channelName)s": "Kanal: %(channelName)s", "Upload new:": "Lae üles uus:", "Export E2E room keys": "Ekspordi jututubade läbiva krüptimise võtmed", "Your homeserver does not support cross-signing.": "Sinu koduserver ei toeta risttunnustamist.", diff --git a/src/i18n/strings/eu.json b/src/i18n/strings/eu.json index 8809129efe..2740ea2079 100644 --- a/src/i18n/strings/eu.json +++ b/src/i18n/strings/eu.json @@ -1805,8 +1805,8 @@ "Verify yourself & others to keep your chats safe": "Egiaztatu zure burua eta besteak txatak seguru mantentzeko", "Review": "Berrikusi", "This bridge was provisioned by .": "Zubi hau erabiltzaileak hornitu du.", - "Workspace: ": "Lan eremua: ", - "Channel: ": "Kanala: ", + "Workspace: %(networkName)s": "Lan eremua: %(networkName)s", + "Channel: %(channelName)s": "Kanala: %(channelName)s", "Show less": "Erakutsi gutxiago", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Pasahitza aldatzean oraingo muturretik muturrerako zifratze gako guztiak ezeztatuko ditu saio guztietan, zifratutako txaten historiala ezin izango da irakurri ez badituzu aurretik zure geletako gakoak esportatzen eta gero berriro inportatzen. Etorkizunean hau hobetuko da.", "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Zure kontuak zeharkako sinatze identitate bat du biltegi sekretuan, baina saio honek ez du oraindik fidagarritzat.", diff --git a/src/i18n/strings/fi.json b/src/i18n/strings/fi.json index e4bcc0623d..842ee436b6 100644 --- a/src/i18n/strings/fi.json +++ b/src/i18n/strings/fi.json @@ -1876,8 +1876,8 @@ "Review": "Katselmoi", "This bridge was provisioned by .": "Tämän sillan tarjoaa käyttäjä .", "This bridge is managed by .": "Tätä siltaa hallinnoi käyttäjä .", - "Workspace: ": "Työtila: ", - "Channel: ": "Kanava: ", + "Workspace: %(networkName)s": "Työtila: %(networkName)s", + "Channel: %(channelName)s": "Kanava: %(channelName)s", "Delete %(count)s sessions|other": "Poista %(count)s istuntoa", "Enable": "Ota käyttöön", "Backup is not signed by any of your sessions": "Mikään istuntosi ei ole allekirjoittanut varmuuskopiota", diff --git a/src/i18n/strings/fr.json b/src/i18n/strings/fr.json index 8b7e2656ea..efae1f7b26 100644 --- a/src/i18n/strings/fr.json +++ b/src/i18n/strings/fr.json @@ -1809,8 +1809,8 @@ "They match": "Ils correspondent", "They don't match": "Ils ne correspondent pas", "This bridge was provisioned by .": "Cette passerelle a été fournie par .", - "Workspace: ": "Espace de travail : ", - "Channel: ": "Canal : ", + "Workspace: %(networkName)s": "Espace de travail : %(networkName)s", + "Channel: %(channelName)s": "Canal : %(channelName)s", "Show less": "En voir moins", "This room is bridging messages to the following platforms. Learn more.": "Ce salon transmet les messages vers les plateformes suivantes. En savoir plus.", "This room isn’t bridging messages to any platforms. Learn more.": "Ce salon ne transmet les messages à aucune plateforme. En savoir plus.", diff --git a/src/i18n/strings/gl.json b/src/i18n/strings/gl.json index d43ff020ab..cc3575dbb3 100644 --- a/src/i18n/strings/gl.json +++ b/src/i18n/strings/gl.json @@ -1307,8 +1307,8 @@ "Upload": "Subir", "This bridge was provisioned by .": "Esta ponte está proporcionada por .", "This bridge is managed by .": "Esta ponte está xestionada por .", - "Workspace: ": "Espazo de traballo: ", - "Channel: ": "Canal: ", + "Workspace: %(networkName)s": "Espazo de traballo: %(networkName)s", + "Channel: %(channelName)s": "Canal: %(channelName)s", "Show less": "Mostrar menos", "Show more": "Mostrar máis", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ao cambiar o contrasinal vas restablecer todas as chaves de cifrado extremo-a-extremo en tódalas sesións, facendo que o historial de conversa cifrado non sexa lexible, a menos que primeiro exportes todas as chaves das salas e as importes posteriormente. No futuro melloraremos o procedemento.", diff --git a/src/i18n/strings/hu.json b/src/i18n/strings/hu.json index d8d3f01f66..2739154c19 100644 --- a/src/i18n/strings/hu.json +++ b/src/i18n/strings/hu.json @@ -1793,8 +1793,8 @@ "Enable message search in encrypted rooms": "Üzenetek keresésének bekapcsolása a titkosított szobákban", "Review": "Átnéz", "This bridge was provisioned by .": "Ezt a hidat az alábbi felhasználó készítette: .", - "Workspace: ": "Munkahely: ", - "Channel: ": "Csatorna: ", + "Workspace: %(networkName)s": "Munkahely: %(networkName)s", + "Channel: %(channelName)s": "Csatorna: %(channelName)s", "Show less": "Kevesebbet mutat", "Securely cache encrypted messages locally for them to appear in search results, using ": "A titkosított üzenetek kereséséhez azokat biztonságos módon helyileg kell tárolnod, felhasználva: ", " to store messages from ": " üzenetek tárolásához ", diff --git a/src/i18n/strings/it.json b/src/i18n/strings/it.json index 616071c785..74255a6d2a 100644 --- a/src/i18n/strings/it.json +++ b/src/i18n/strings/it.json @@ -1797,8 +1797,8 @@ "They don't match": "Non corrispondono", "Review": "Controlla", "This bridge was provisioned by .": "Questo bridge è stato fornito da .", - "Workspace: ": "Spazio di lavoro: ", - "Channel: ": "Canale: ", + "Workspace: %(networkName)s": "Spazio di lavoro: %(networkName)s", + "Channel: %(channelName)s": "Canale: %(channelName)s", "Show less": "Mostra meno", "Securely cache encrypted messages locally for them to appear in search results, using ": "Tieni in cache localmente i messaggi cifrati in modo sicuro affinché appaiano nei risultati di ricerca, usando ", " to store messages from ": " per conservare i messaggi da ", diff --git a/src/i18n/strings/kab.json b/src/i18n/strings/kab.json index 74b203efb6..7a9261f25c 100644 --- a/src/i18n/strings/kab.json +++ b/src/i18n/strings/kab.json @@ -847,8 +847,8 @@ "Accept to continue:": "Qbel i wakken ad tkemmleḍ:", "This bridge was provisioned by .": "Tileggit-a tella-d sɣur .", "This bridge is managed by .": "Tileggit-a tettusefrak sɣur .", - "Workspace: ": "Tallunt n uxeddim: ", - "Channel: ": "Abadu: ", + "Workspace: %(networkName)s": "Tallunt n uxeddim: %(networkName)s", + "Channel: %(channelName)s": "Abadu: %(channelName)s", "Upload new:": "Asali amaynut:", "New passwords don't match": "Awalen uffiren imaynuten ur mṣadan ara", "Passwords can't be empty": "Awalen uffiren ur ilaq ara ad ilin d ilmawen", diff --git a/src/i18n/strings/lt.json b/src/i18n/strings/lt.json index b4fc60b931..62b34104a6 100644 --- a/src/i18n/strings/lt.json +++ b/src/i18n/strings/lt.json @@ -1953,8 +1953,8 @@ "not found in storage": "saugykloje nerasta", "Cross-signing is not set up.": "Kryžminis pasirašymas nenustatytas.", "Cross-signing is ready for use.": "Kryžminis pasirašymas yra paruoštas naudoti.", - "Channel: ": "Kanalas: ", - "Workspace: ": "Darbo sritis: ", + "Channel: %(channelName)s": "Kanalas: %(channelName)s", + "Workspace: %(networkName)s": "Darbo sritis: %(networkName)s", "This bridge is managed by .": "Šis tiltas yra tvarkomas .", "This bridge was provisioned by .": "Šis tiltas buvo parūpintas .", "Your server isn't responding to some requests.": "Jūsų serveris neatsako į kai kurias užklausas.", diff --git a/src/i18n/strings/nl.json b/src/i18n/strings/nl.json index 1277769ad3..1ec887c364 100644 --- a/src/i18n/strings/nl.json +++ b/src/i18n/strings/nl.json @@ -1625,8 +1625,8 @@ "Decline (%(counter)s)": "Afwijzen (%(counter)s)", "This bridge was provisioned by .": "Dank aan voor de brug.", "This bridge is managed by .": "Brug onderhouden door .", - "Workspace: ": "Werkruimte: ", - "Channel: ": "Kanaal: ", + "Workspace: %(networkName)s": "Werkruimte: %(networkName)s", + "Channel: %(channelName)s": "Kanaal: %(channelName)s", "Show less": "Minder tonen", "Show more": "Meer tonen", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Momenteel stelt een wachtwoordswijziging alle berichtsleutels in alle sessies opnieuw in, en maakt zo oude versleutelde berichten onleesbaar - tenzij u uw sleutels eerst wegschrijft, en na afloop weer inleest. Dit zal verbeterd worden.", diff --git a/src/i18n/strings/pt_BR.json b/src/i18n/strings/pt_BR.json index d3ecf00c1c..b456c98aed 100644 --- a/src/i18n/strings/pt_BR.json +++ b/src/i18n/strings/pt_BR.json @@ -1380,8 +1380,8 @@ "Upload": "Enviar", "This bridge was provisioned by .": "Esta integração foi disponibilizada por .", "This bridge is managed by .": "Esta integração é desenvolvida por .", - "Workspace: ": "Espaço de trabalho: ", - "Channel: ": "Canal: ", + "Workspace: %(networkName)s": "Espaço de trabalho: %(networkName)s", + "Channel: %(channelName)s": "Canal: %(channelName)s", "Show less": "Mostrar menos", "Show more": "Mostrar mais", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ao mudar a senha, você apagará todas as chaves de criptografia de ponta a ponta existentes em todas as sessões, fazendo com que o histórico de conversas criptografadas fique ilegível, a não ser que você exporte as salas das chaves criptografadas antes de mudar a senha e então as importe novamente depois. No futuro, isso será melhorado.", diff --git a/src/i18n/strings/ru.json b/src/i18n/strings/ru.json index b99fef0915..bb6dbdf308 100644 --- a/src/i18n/strings/ru.json +++ b/src/i18n/strings/ru.json @@ -1670,8 +1670,8 @@ "Decline (%(counter)s)": "Отклонить (%(counter)s)", "This bridge was provisioned by .": "Этот мост был подготовлен пользователем .", "This bridge is managed by .": "Этот мост управляется .", - "Workspace: ": "Рабочая область: ", - "Channel: ": "Канал: ", + "Workspace: %(networkName)s": "Рабочая область: %(networkName)s", + "Channel: %(channelName)s": "Канал: %(channelName)s", "Show less": "Показать меньше", "Show more": "Показать больше", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Если вы не экспортируете ключи для этой комнаты и не импортируете их в будущем, смена пароля приведёт к сбросу всех ключей сквозного шифрования и сделает невозможным чтение истории чата. В будущем это будет улучшено.", diff --git a/src/i18n/strings/sk.json b/src/i18n/strings/sk.json index 77e7d9de2b..454d86cb64 100644 --- a/src/i18n/strings/sk.json +++ b/src/i18n/strings/sk.json @@ -1536,8 +1536,8 @@ "Joins room with given address": "Pridať sa do miestnosti s danou adresou", "Unrecognised room address:": "Nerozpoznaná adresa miestnosti:", "This bridge is managed by .": "Tento most spravuje .", - "Workspace: ": "Pracovisko: ", - "Channel: ": "Kanál: ", + "Workspace: %(networkName)s": "Pracovisko: %(networkName)s", + "Channel: %(channelName)s": "Kanál: %(channelName)s", "Show less": "Zobraziť menej", "Show more": "Zobraziť viac", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Zmena hesla reštartuje všetky šifrovacie kľúče pre všetky vaše relácie. Šifrované správy sa stanú nečitateľnými, pokiaľ najprv nevyexportujete vaše kľúče a po zmene ich nenaimportujete. V budúcnosti sa tento proces zjednoduší.", diff --git a/src/i18n/strings/sq.json b/src/i18n/strings/sq.json index a65892f4d0..827df3fb70 100644 --- a/src/i18n/strings/sq.json +++ b/src/i18n/strings/sq.json @@ -1819,8 +1819,8 @@ "To be secure, do this in person or use a trusted way to communicate.": "Për të qenë i sigurt, bëjeni këtë duke qenë vetë i pranishëm ose përdorni për të komunikuar një rrugë të besuar.", "Verify yourself & others to keep your chats safe": "Verifikoni veten & të tjerët, që t’i mbani bisedat tuaja të sigurta", "This bridge was provisioned by .": "Kjo urë është dhënë nga .", - "Workspace: ": "Hapësirë pune: ", - "Channel: ": "Kanal: ", + "Workspace: %(networkName)s": "Hapësirë pune: %(networkName)s", + "Channel: %(channelName)s": "Kanal: %(channelName)s", "Show less": "Shfaq më pak", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Ndryshimi i fjalëkalimit do të sjellë zerimin e çfarëdo kyçesh fshehtëzimi skaj-më-skaj në krejt sesionet, duke e bërë të palexueshëm historikun e fshehtëzuar të bisedave, hiq rastin kur i eksportoni më parë kyçet tuaj të dhomës dhe i ri-importoni ata më pas. Në të ardhmen kjo do të përmirësohet.", "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "Llogaria juaj ka një identitet cross-signing në depozitë të fshehtë, por s’është ende i besuar në këtë sesion.", diff --git a/src/i18n/strings/sv.json b/src/i18n/strings/sv.json index 4824895988..8c053de410 100644 --- a/src/i18n/strings/sv.json +++ b/src/i18n/strings/sv.json @@ -1692,8 +1692,8 @@ "From %(deviceName)s (%(deviceId)s)": "Från %(deviceName)s (%(deviceId)s)", "This bridge was provisioned by .": "Den här bryggan tillhandahålls av .", "This bridge is managed by .": "Den här bryggan tillhandahålls av .", - "Workspace: ": "Arbetsyta: ", - "Channel: ": "Kanal: ", + "Workspace: %(networkName)s": "Arbetsyta: %(networkName)s", + "Channel: %(channelName)s": "Kanal: %(channelName)s", "Show less": "Visa mindre", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Att byta lösenord återställer just nu alla krypteringsnycklar på alla sessioner, vilket gör krypterad chatthistorik oläslig om du inte först exporterar dina rumsnycklar och sedan importerar dem igen efteråt. Detta kommer att förbättras i framtiden.", "Your homeserver does not support cross-signing.": "Din hemserver stöder inte korssignering.", diff --git a/src/i18n/strings/tr.json b/src/i18n/strings/tr.json index c7711973f9..5a152eeab6 100644 --- a/src/i18n/strings/tr.json +++ b/src/i18n/strings/tr.json @@ -1410,8 +1410,8 @@ "Other users may not trust it": "Diğer kullanıcılar güvenmeyebilirler", "Later": "Sonra", "Review": "Gözden Geçirme", - "Workspace: ": "Çalışma alanı: ", - "Channel: ": "Kanal: ", + "Workspace: %(networkName)s": "Çalışma alanı: %(networkName)s", + "Channel: %(channelName)s": "Kanal: %(channelName)s", "Show less": "Daha az göster", "Show more": "Daha fazla göster", "in memory": "hafızada", diff --git a/src/i18n/strings/uk.json b/src/i18n/strings/uk.json index 37b9472d3c..061c0799ac 100644 --- a/src/i18n/strings/uk.json +++ b/src/i18n/strings/uk.json @@ -955,8 +955,8 @@ "Globe": "Глобус", "This bridge was provisioned by .": "Цей місток був підготовленим .", "This bridge is managed by .": "Цей міст керується .", - "Workspace: ": "Робочий простір: ", - "Channel: ": "Канал: ", + "Workspace: %(networkName)s": "Робочий простір: %(networkName)s", + "Channel: %(channelName)s": "Канал: %(channelName)s", "Show less": "Згорнути", "Show more": "Розгорнути", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "Змінення пароля призведе до скидання всіх ключів наскрізного шифрування та унеможливить читання історії листування, якщо тільки ви не експортуєте ваші ключі кімнати та не імпортуєте їх згодом. Це буде вдосконалено у майбутньому.", diff --git a/src/i18n/strings/zh_Hans.json b/src/i18n/strings/zh_Hans.json index 45ca22fdcd..672b1befd1 100644 --- a/src/i18n/strings/zh_Hans.json +++ b/src/i18n/strings/zh_Hans.json @@ -2320,8 +2320,8 @@ "Uploading logs": "正在上传日志", "Downloading logs": "正在下载日志", "This bridge was provisioned by .": "桥接由 准备。", - "Workspace: ": "工作区:", - "Channel: ": "频道:", + "Workspace: %(networkName)s": "工作区:%(networkName)s", + "Channel: %(channelName)s": "频道:%(channelName)s", "well formed": "格式正确", "Master private key:": "主私钥:", "Self signing private key:": "自签名私钥:", diff --git a/src/i18n/strings/zh_Hant.json b/src/i18n/strings/zh_Hant.json index b8cecd3b76..c820d9b1cf 100644 --- a/src/i18n/strings/zh_Hant.json +++ b/src/i18n/strings/zh_Hant.json @@ -1804,8 +1804,8 @@ "To be secure, do this in person or use a trusted way to communicate.": "為了安全,請親自進行或使用可信的通訊方式。", "Review": "評論", "This bridge was provisioned by .": "此橋接是由 設定。", - "Workspace: ": "工作空間:", - "Channel: ": "頻道:", + "Workspace: %(networkName)s": "工作空間:%(networkName)s", + "Channel: %(channelName)s": "頻道:%(channelName)s", "Show less": "顯示較少", "Changing password will currently reset any end-to-end encryption keys on all sessions, making encrypted chat history unreadable, unless you first export your room keys and re-import them afterwards. In future this will be improved.": "變更密碼將會重設所有工作階段上的所有端到端加密金鑰,讓已加密的聊天歷史無法讀取,除非您先匯出您的聊天室金鑰並在稍後重新匯入。未來會有所改善。", "Your account has a cross-signing identity in secret storage, but it is not yet trusted by this session.": "您的帳號在秘密儲存空間中有交叉簽章的身份,但尚未被此工作階段信任。", From 74b5febb9c7cb3e6584574a7c8453a68c31ea399 Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Mon, 18 Jan 2021 11:38:06 +0000 Subject: [PATCH 187/231] oops strings --- src/i18n/strings/en_EN.json | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 6137923264..851890bdb7 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -411,6 +411,8 @@ "Command error": "Command error", "Usage": "Usage", "Prepends ¯\\_(ツ)_/¯ to a plain-text message": "Prepends ¯\\_(ツ)_/¯ to a plain-text message", + "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message": "Prepends (╯°□°)╯︵ ┻━┻ to a plain-text message", + "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message": "Prepends ┬──┬ ノ( ゜-゜ノ) to a plain-text message", "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message": "Prepends ( ͡° ͜ʖ ͡°) to a plain-text message", "Sends a message as plain text, without interpreting it as markdown": "Sends a message as plain text, without interpreting it as markdown", "Sends a message as html, without interpreting it as markdown": "Sends a message as html, without interpreting it as markdown", @@ -859,6 +861,9 @@ "Fill Screen": "Fill Screen", "Return to call": "Return to call", "%(name)s on hold": "%(name)s on hold", + "Unable to look up phone number": "Unable to look up phone number", + "There was an error looking up the phone number": "There was an error looking up the phone number", + "Dial pad": "Dial pad", "Unknown caller": "Unknown caller", "Incoming voice call": "Incoming voice call", "Incoming video call": "Incoming video call", @@ -960,8 +965,8 @@ "Upload": "Upload", "This bridge was provisioned by .": "This bridge was provisioned by .", "This bridge is managed by .": "This bridge is managed by .", - "Workspace: %s": "Workspace: %s", - "Channel: %s": "Channel: %s", + "Workspace: ": "Workspace: ", + "Channel: ": "Channel: ", "Show less": "Show less", "Show more": "Show more", "Failed to upload profile picture!": "Failed to upload profile picture!", @@ -1457,6 +1462,8 @@ "Hide Widgets": "Hide Widgets", "Show Widgets": "Show Widgets", "Search": "Search", + "Start a Conversation": "Start a Conversation", + "Open dial pad": "Open dial pad", "Invites": "Invites", "Favourites": "Favourites", "People": "People", @@ -2077,6 +2084,8 @@ "We couldn't create your DM. Please check the users you want to invite and try again.": "We couldn't create your DM. Please check the users you want to invite and try again.", "Something went wrong trying to invite the users.": "Something went wrong trying to invite the users.", "We couldn't invite those users. Please check the users you want to invite and try again.": "We couldn't invite those users. Please check the users you want to invite and try again.", + "A call can only be transferred to a single user.": "A call can only be transferred to a single user.", + "Failed to transfer call": "Failed to transfer call", "Failed to find the following users": "Failed to find the following users", "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s": "The following users might not exist or are invalid, and cannot be invited: %(csvNames)s", "Recent Conversations": "Recent Conversations", @@ -2090,6 +2099,7 @@ "Go": "Go", "Invite someone using their name, email address, username (like ) or share this room.": "Invite someone using their name, email address, username (like ) or share this room.", "Invite someone using their name, username (like ) or share this room.": "Invite someone using their name, username (like ) or share this room.", + "Transfer": "Transfer", "a new master key signature": "a new master key signature", "a new cross-signing key signature": "a new cross-signing key signature", "a device cross-signing signature": "a device cross-signing signature", @@ -2431,7 +2441,7 @@ "Create a new community": "Create a new community", "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.": "Create a community to group together users and rooms! Build a custom homepage to mark out your space in the Matrix universe.", "You’re all caught up": "You’re all caught up", - "You have no visible notifications in this room.": "You have no visible notifications in this room.", + "You have no visible notifications.": "You have no visible notifications.", "%(brand)s failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.": "%(brand)s failed to get the protocol list from the homeserver. The homeserver may be too old to support third party networks.", "%(brand)s failed to get the public room list.": "%(brand)s failed to get the public room list.", "The homeserver may be unavailable or overloaded.": "The homeserver may be unavailable or overloaded.", From e9d2daab8f03d29f904acce02c159d4ad3466bda Mon Sep 17 00:00:00 2001 From: Will Hunt Date: Mon, 18 Jan 2021 13:09:39 +0000 Subject: [PATCH 188/231] fix strings --- src/i18n/strings/en_EN.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 851890bdb7..71b390f0fc 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -965,10 +965,8 @@ "Upload": "Upload", "This bridge was provisioned by .": "This bridge was provisioned by .", "This bridge is managed by .": "This bridge is managed by .", - "Workspace: ": "Workspace: ", - "Channel: ": "Channel: ", - "Show less": "Show less", - "Show more": "Show more", + "Workspace: ": "Workspace: ", + "Channel: ": "Channel: ", "Failed to upload profile picture!": "Failed to upload profile picture!", "Upload new:": "Upload new:", "No display name": "No display name", @@ -1532,6 +1530,7 @@ "Jump to first invite.": "Jump to first invite.", "Show %(count)s more|other": "Show %(count)s more", "Show %(count)s more|one": "Show %(count)s more", + "Show less": "Show less", "Use default": "Use default", "All messages": "All messages", "Mentions & Keywords": "Mentions & Keywords", @@ -1594,6 +1593,7 @@ "New published address (e.g. #alias:server)": "New published address (e.g. #alias:server)", "Local Addresses": "Local Addresses", "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)": "Set addresses for this room so users can find this room through your homeserver (%(localDomain)s)", + "Show more": "Show more", "Error updating flair": "Error updating flair", "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.": "There was an error updating the flair for this room. The server may not allow it or a temporary error occurred.", "Invalid community ID": "Invalid community ID", From c4570cdaee41b02510aae390e10abdc925d864fa Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 18 Jan 2021 15:09:22 +0000 Subject: [PATCH 189/231] Upgrade matrix-js-sdk to 9.5.0 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 050e2562a0..4bdcc3b6b8 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "katex": "^0.12.0", "linkifyjs": "^2.1.9", "lodash": "^4.17.19", - "matrix-js-sdk": "9.5.0-rc.1", + "matrix-js-sdk": "9.5.0", "matrix-widget-api": "^0.1.0-beta.10", "minimist": "^1.2.5", "pako": "^1.0.11", diff --git a/yarn.lock b/yarn.lock index 00f97f966c..cb4fa0e13a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6553,10 +6553,10 @@ mathml-tag-names@^2.0.1: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== -matrix-js-sdk@9.5.0-rc.1: - version "9.5.0-rc.1" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.5.0-rc.1.tgz#91c2f0ff969baea1416611a39354ca016cc1b7c6" - integrity sha512-TOWU6QKfc3BBTdLyzKMnc0trsaw9sQw3/LaNU/ZqP1LuVDK+qRQxcUfsev0EFfRKURIcI7KvtzRiV+DakN/X+Q== +matrix-js-sdk@9.5.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.5.0.tgz#2f54e73b0fbb03e85b3f81f41da9d33b028c4b30" + integrity sha512-Fg1SGrZ4N2WAtgbK5mEoOfDwTGV83noJ3VUJ9z3rparbQCBr8Rd8ppHBD8RgshVWGdJMPJ4EQBwhQUgHeyhz9g== dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" From 5cf6d578838f8ec944e24842aeeb2783f478c95a Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 18 Jan 2021 15:14:52 +0000 Subject: [PATCH 190/231] Prepare changelog for v3.12.0 --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef56762a31..8c460b4f81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +Changes in [3.12.0](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.12.0) (2021-01-18) +===================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.12.0-rc.1...v3.12.0) + + * Upgrade to JS SDK 9.5.0 + * Fix incoming call box on dark theme + [\#5543](https://github.com/matrix-org/matrix-react-sdk/pull/5543) + Changes in [3.12.0-rc.1](https://github.com/matrix-org/matrix-react-sdk/releases/tag/v3.12.0-rc.1) (2021-01-13) =============================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-react-sdk/compare/v3.11.1...v3.12.0-rc.1) From 5a54bb0e7f5a41622f42b549b1cb654543824a97 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 18 Jan 2021 15:14:53 +0000 Subject: [PATCH 191/231] v3.12.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4bdcc3b6b8..807bcaf9f4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-react-sdk", - "version": "3.12.0-rc.1", + "version": "3.12.0", "description": "SDK for matrix.org using React", "author": "matrix.org", "repository": { From 5455b90c980a207541c70c61c66ee3f6fc289819 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 18 Jan 2021 15:16:18 +0000 Subject: [PATCH 192/231] Resetting package fields for development --- package.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 807bcaf9f4..710d1e784a 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "matrix-gen-i18n": "scripts/gen-i18n.js", "matrix-prune-i18n": "scripts/prune-i18n.js" }, - "main": "./lib/index.js", + "main": "./src/index.js", "matrix_src_main": "./src/index.js", "matrix_lib_main": "./lib/index.js", "matrix_lib_typings": "./lib/index.d.ts", @@ -188,6 +188,5 @@ "transformIgnorePatterns": [ "/node_modules/(?!matrix-js-sdk).+$" ] - }, - "typings": "./lib/index.d.ts" + } } From 6c8e6096da01cdc3153d2b120d9e9e3f5a482078 Mon Sep 17 00:00:00 2001 From: RiotRobot Date: Mon, 18 Jan 2021 15:16:31 +0000 Subject: [PATCH 193/231] 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 710d1e784a..eb97ff1995 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "katex": "^0.12.0", "linkifyjs": "^2.1.9", "lodash": "^4.17.19", - "matrix-js-sdk": "9.5.0", + "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", "matrix-widget-api": "^0.1.0-beta.10", "minimist": "^1.2.5", "pako": "^1.0.11", diff --git a/yarn.lock b/yarn.lock index cb4fa0e13a..eefe6e071e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6553,10 +6553,9 @@ mathml-tag-names@^2.0.1: resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== -matrix-js-sdk@9.5.0: +"matrix-js-sdk@github:matrix-org/matrix-js-sdk#develop": version "9.5.0" - resolved "https://registry.yarnpkg.com/matrix-js-sdk/-/matrix-js-sdk-9.5.0.tgz#2f54e73b0fbb03e85b3f81f41da9d33b028c4b30" - integrity sha512-Fg1SGrZ4N2WAtgbK5mEoOfDwTGV83noJ3VUJ9z3rparbQCBr8Rd8ppHBD8RgshVWGdJMPJ4EQBwhQUgHeyhz9g== + resolved "https://codeload.github.com/matrix-org/matrix-js-sdk/tar.gz/214a9df3823e602400b24d9a81cfc7b7df0a863b" dependencies: "@babel/runtime" "^7.12.5" another-json "^0.2.0" From 530a242aaeafbc54510f5cbbbcd948a865eecec3 Mon Sep 17 00:00:00 2001 From: Ayush Kumar <2580ayush2580@gmail.com> Date: Mon, 18 Jan 2021 21:41:10 +0530 Subject: [PATCH 194/231] Fixed continue button while selecting home server --- src/components/views/dialogs/ServerPickerDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/ServerPickerDialog.tsx b/src/components/views/dialogs/ServerPickerDialog.tsx index 65d53f0870..bdc3a71826 100644 --- a/src/components/views/dialogs/ServerPickerDialog.tsx +++ b/src/components/views/dialogs/ServerPickerDialog.tsx @@ -151,7 +151,7 @@ export default class ServerPickerDialog extends React.PureComponent Date: Mon, 18 Jan 2021 17:40:32 -0700 Subject: [PATCH 195/231] Simple support for generics off the settings store Ideally the settings store returns the right type, but for now we can feed it the type we need/expect. --- src/settings/SettingsStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/settings/SettingsStore.ts b/src/settings/SettingsStore.ts index 1b718a72b3..6dc2a76ae8 100644 --- a/src/settings/SettingsStore.ts +++ b/src/settings/SettingsStore.ts @@ -276,7 +276,7 @@ export default class SettingsStore { * @param {boolean} excludeDefault True to disable using the default value. * @return {*} The value, or null if not found */ - public static getValue(settingName: string, roomId: string = null, excludeDefault = false): any { + public static getValue(settingName: string, roomId: string = null, excludeDefault = false): T { // Verify that the setting is actually a setting if (!SETTINGS[settingName]) { throw new Error("Setting '" + settingName + "' does not appear to be a setting."); From 39ce5d06e6246338a41b70c543293a5d38480361 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 18 Jan 2021 17:40:52 -0700 Subject: [PATCH 196/231] Describe how the widget layouts are supposed to look in time --- docs/widget-layouts.md | 61 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 docs/widget-layouts.md diff --git a/docs/widget-layouts.md b/docs/widget-layouts.md new file mode 100644 index 0000000000..e49f2a2e60 --- /dev/null +++ b/docs/widget-layouts.md @@ -0,0 +1,61 @@ +# Widget layout support + +Rooms can have a default widget layout to auto-pin certain widgets, make the container different +sizes, etc. These are defined through the `io.element.widgets.layout` state event (empty state key). + +Full example content: +```json5 +{ + "widgets": { + "first-widget-id": { + "container": "top", + "index": 0, + "width": 60, + "height": 40 + }, + "second-widget-id": { + "container": "right" + } + } +} +``` + +As shown, there are two containers possible for widgets. These containers have different behaviour +and interpret the other options differently. + +## `top` container + +This is the "App Drawer" or any pinned widgets in a room. This is by far the most versatile container +though does introduce potential usability issues upon members of the room (widgets take up space and +therefore less messages can be shown). + +The `index` for a widget determines which order the widgets show up in from left to right. Widgets +without an `index` will show up as the rightmost widgets. Tiebreaks (same `index` or multiple defined +without an `index`) are resolved by comparing widget IDs. A maximum of 3 widgets can be in the top +container - any which exceed this will be ignored. Smaller numbers represent leftmost widgets. + +The `width` is relative width within the container in percentage points. This will be clamped to a +range of 0-100 (inclusive). The rightmost widget will have its percentage adjusted to fill the +container appropriately, shrinking and growing if required. For example, if three widgets are in the +top container at 40% width each then the 3rd widget will be shrunk to 20% because 120% > 100%. +Similarly, if all three widgets were set to 10% width each then the 3rd widget would grow to be 80%. + +Note that the client may impose minimum widths on the widgets, such as a 10% minimum to avoid pinning +hidden widgets. In general, widgets defined in the 30-70% range each will be free of these restrictions. + +The `height` is not in fact applied per-widget but is recorded per-widget for potential future +capabilities in future containers. The top container will take the tallest `height` and use that for +the height of the whole container, and thus all widgets in that container. The `height` is relative +to the container, like with `width`, meaning that 100% will consume as much space as the client is +willing to sacrifice to the widget container. Like with `width`, the client may impose minimums to avoid +the container being uselessly small. Heights in the 30-100% range are generally acceptable. The height +is also clamped to be within 0-100, inclusive. + +## `right` container + +This is the default container and has no special configuration. Widgets which overflow from the top +container will be put in this container instead. Putting a widget in the right container does not +automatically show it - it only mentions that widgets should not be in another container. + +The behaviour of this container may change in the future. + From 4ee29d4e638b6dc5af66582bc44e243237d12655 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 18 Jan 2021 17:41:17 -0700 Subject: [PATCH 197/231] Split out ready states of stores to its own store --- src/stores/AsyncStoreWithClient.ts | 54 ++++++++------------ src/stores/ReadyWatchingStore.ts | 81 ++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 32 deletions(-) create mode 100644 src/stores/ReadyWatchingStore.ts diff --git a/src/stores/AsyncStoreWithClient.ts b/src/stores/AsyncStoreWithClient.ts index 1ed7c6a547..3050555ad4 100644 --- a/src/stores/AsyncStoreWithClient.ts +++ b/src/stores/AsyncStoreWithClient.ts @@ -18,22 +18,33 @@ import { MatrixClient } from "matrix-js-sdk/src/client"; import { AsyncStore } from "./AsyncStore"; import { ActionPayload } from "../dispatcher/payloads"; import { Dispatcher } from "flux"; -import { MatrixClientPeg } from "../MatrixClientPeg"; +import { ReadyWatchingStore } from "./ReadyWatchingStore"; export abstract class AsyncStoreWithClient extends AsyncStore { - protected matrixClient: MatrixClient; - - protected abstract async onAction(payload: ActionPayload); + private readyStore: ReadyWatchingStore; protected constructor(dispatcher: Dispatcher, initialState: T = {}) { super(dispatcher, initialState); - if (MatrixClientPeg.get()) { - this.matrixClient = MatrixClientPeg.get(); + // Create an anonymous class to avoid code duplication + const asyncStore = this; + this.readyStore = new (class extends ReadyWatchingStore { + public get mxClient(): MatrixClient { + return this.matrixClient; + } - // noinspection JSIgnoredPromiseFromCall - this.onReady(); - } + protected async onReady(): Promise { + return asyncStore.onReady(); + } + + protected async onNotReady(): Promise { + return asyncStore.onNotReady(); + } + })(dispatcher); + } + + protected get matrixClient(): MatrixClient { + return this.readyStore.mxClient; } protected async onReady() { @@ -44,30 +55,9 @@ export abstract class AsyncStoreWithClient extends AsyncStore< // Default implementation is to do nothing. } + protected abstract async onAction(payload: ActionPayload); + protected async onDispatch(payload: ActionPayload) { await this.onAction(payload); - - if (payload.action === 'MatrixActions.sync') { - // Only set the client on the transition into the PREPARED state. - // Everything after this is unnecessary (we only need to know once we have a client) - // and we intentionally don't set the client before this point to avoid stores - // updating for every event emitted during the cached sync. - if (!(payload.prevState === 'PREPARED' && payload.state !== 'PREPARED')) { - return; - } - - if (this.matrixClient !== payload.matrixClient) { - if (this.matrixClient) { - await this.onNotReady(); - } - this.matrixClient = payload.matrixClient; - await this.onReady(); - } - } else if (payload.action === 'on_client_not_viable' || payload.action === 'on_logged_out') { - if (this.matrixClient) { - await this.onNotReady(); - this.matrixClient = null; - } - } } } diff --git a/src/stores/ReadyWatchingStore.ts b/src/stores/ReadyWatchingStore.ts new file mode 100644 index 0000000000..9a28fe75fa --- /dev/null +++ b/src/stores/ReadyWatchingStore.ts @@ -0,0 +1,81 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { MatrixClient } from "matrix-js-sdk/src/client"; +import { MatrixClientPeg } from "../MatrixClientPeg"; +import { ActionPayload } from "../dispatcher/payloads"; +import { Dispatcher } from "flux"; +import { IDestroyable } from "../utils/IDestroyable"; +import { EventEmitter } from "events"; + +export abstract class ReadyWatchingStore extends EventEmitter implements IDestroyable { + protected matrixClient: MatrixClient; + private readonly dispatcherRef: string; + + constructor(protected readonly dispatcher: Dispatcher) { + super(); + + this.dispatcherRef = this.dispatcher.register(this.onAction); + + if (MatrixClientPeg.get()) { + this.matrixClient = MatrixClientPeg.get(); + + // noinspection JSIgnoredPromiseFromCall + this.onReady(); + } + } + + public get mxClient(): MatrixClient { + return this.matrixClient; // for external readonly access + } + + public destroy() { + this.dispatcher.unregister(this.dispatcherRef); + } + + protected async onReady() { + // Default implementation is to do nothing. + } + + protected async onNotReady() { + // Default implementation is to do nothing. + } + + private onAction = async (payload: ActionPayload) => { + if (payload.action === 'MatrixActions.sync') { + // Only set the client on the transition into the PREPARED state. + // Everything after this is unnecessary (we only need to know once we have a client) + // and we intentionally don't set the client before this point to avoid stores + // updating for every event emitted during the cached sync. + if (!(payload.prevState === 'PREPARED' && payload.state !== 'PREPARED')) { + return; + } + + if (this.matrixClient !== payload.matrixClient) { + if (this.matrixClient) { + await this.onNotReady(); + } + this.matrixClient = payload.matrixClient; + await this.onReady(); + } + } else if (payload.action === 'on_client_not_viable' || payload.action === 'on_logged_out') { + if (this.matrixClient) { + await this.onNotReady(); + this.matrixClient = null; + } + } + }; +} From 0001e1e684d890efdd18daacef9e4e99c94aa0a9 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 18 Jan 2021 17:41:42 -0700 Subject: [PATCH 198/231] Support initial ordering and calculation for widgets by layout --- src/@types/global.d.ts | 2 + src/settings/Settings.ts | 6 +- src/stores/widgets/WidgetLayoutStore.ts | 274 ++++++++++++++++++++++++ src/utils/numbers.ts | 30 +++ 4 files changed, 311 insertions(+), 1 deletion(-) create mode 100644 src/stores/widgets/WidgetLayoutStore.ts create mode 100644 src/utils/numbers.ts diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts index 741798761f..2a28c8e43f 100644 --- a/src/@types/global.d.ts +++ b/src/@types/global.d.ts @@ -36,6 +36,7 @@ import {Analytics} from "../Analytics"; import CountlyAnalytics from "../CountlyAnalytics"; import UserActivity from "../UserActivity"; import {ModalWidgetStore} from "../stores/ModalWidgetStore"; +import { WidgetLayoutStore } from "../stores/widgets/WidgetLayoutStore"; declare global { interface Window { @@ -59,6 +60,7 @@ declare global { mxNotifier: typeof Notifier; mxRightPanelStore: RightPanelStore; mxWidgetStore: WidgetStore; + mxWidgetLayoutStore: WidgetLayoutStore; mxCallHandler: CallHandler; mxAnalytics: Analytics; mxCountlyAnalytics: typeof CountlyAnalytics; diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index 6ca009df61..25d7682033 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -633,7 +633,11 @@ export const SETTINGS: {[setting: string]: ISetting} = { displayName: _td("Show chat effects"), default: true, }, - "Widgets.pinned": { + "Widgets.pinned": { // deprecated + supportedLevels: LEVELS_ROOM_OR_ACCOUNT, + default: {}, + }, + "Widgets.layout": { supportedLevels: LEVELS_ROOM_OR_ACCOUNT, default: {}, }, diff --git a/src/stores/widgets/WidgetLayoutStore.ts b/src/stores/widgets/WidgetLayoutStore.ts new file mode 100644 index 0000000000..fddfaf65b3 --- /dev/null +++ b/src/stores/widgets/WidgetLayoutStore.ts @@ -0,0 +1,274 @@ +/* + * Copyright 2021 The Matrix.org Foundation C.I.C. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import SettingsStore from "../../settings/SettingsStore"; +import { Room } from "matrix-js-sdk/src/models/room"; +import WidgetStore, { IApp } from "../WidgetStore"; +import { WidgetType } from "../../widgets/WidgetType"; +import { clamp, defaultNumber } from "../../utils/numbers"; +import { EventEmitter } from "events"; +import { AsyncStoreWithClient } from "../AsyncStoreWithClient"; +import defaultDispatcher from "../../dispatcher/dispatcher"; +import { ReadyWatchingStore } from "../ReadyWatchingStore"; +import { MatrixEvent } from "matrix-js-sdk/src/models/event"; + +export const WIDGET_LAYOUT_EVENT_TYPE = "io.element.widgets.layout"; + +export enum Container { + // "Top" is the app drawer, and currently the only sensible value. + Top = "top", + + // "Right" is the right panel, and the default for widgets. Setting + // this as a container on a widget is essentially like saying "no + // changes needed", though this may change in the future. + Right = "right", + + // ... more as needed. Note that most of this code assumes that there + // are only two containers, and that only the top container is special. +} + +interface IStoredLayout { + // Where to store the widget. Required. + container: Container; + + // The index (order) to position the widgets in. Only applies for + // ordered containers (like the top container). Smaller numbers first, + // and conflicts resolved by comparing widget IDs. + index?: number; + + // Percentage (integer) for relative width of the container to consume. + // Clamped to 0-100 and may have minimums imposed upon it. Only applies + // to containers which support inner resizing (currently only the top + // container). + width?: number; + + // Percentage (integer) for relative height of the container. Note that + // this only applies to the top container currently, and that container + // will take the highest value among widgets in the container. Clamped + // to 0-100 and may have minimums imposed on it. + height?: number; + + // TODO: [Deferred] Maximizing (fullscreen) widgets by default. +} + +interface ILayoutStateEvent { + // TODO: [Deferred] Forced layout (fixed with no changes) + + // The widget layouts. + widgets: { + [widgetId: string]: IStoredLayout; + }; +} + +interface ILayoutSettings extends ILayoutStateEvent { + overrides?: string; // event ID for layout state event, if present +} + +// Dev note: "Pinned" widgets are ones in the top container. +const MAX_PINNED = 3; + +const MIN_WIDGET_WIDTH_PCT = 10; // Don't make anything smaller than 10% width +const MIN_WIDGET_HEIGHT_PCT = 20; + +export class WidgetLayoutStore extends ReadyWatchingStore { + private static internalInstance: WidgetLayoutStore; + + private byRoom: { + [roomId: string]: { + // @ts-ignore - TS wants a string key, but we know better + [container: Container]: { + ordered: IApp[]; + height?: number; + distributions?: number[]; + }; + }; + } = {}; + + private constructor() { + super(defaultDispatcher); + } + + public static get instance(): WidgetLayoutStore { + if (!WidgetLayoutStore.internalInstance) { + WidgetLayoutStore.internalInstance = new WidgetLayoutStore(); + } + return WidgetLayoutStore.internalInstance; + } + + public static emissionForRoom(room: Room): string { + return `update_${room.roomId}`; + } + + private emitFor(room: Room) { + this.emit(WidgetLayoutStore.emissionForRoom(room)); + } + + protected async onReady(): Promise { + this.byRoom = {}; + for (const room of this.matrixClient.getVisibleRooms()) { + this.recalculateRoom(room); + } + + this.matrixClient.on("RoomState.events", this.updateRoomFromState); + // TODO: Register settings listeners + // TODO: Register WidgetStore listener + } + + protected async onNotReady(): Promise { + this.byRoom = {}; + } + + private updateRoomFromState = (ev: MatrixEvent) => { + if (ev.getType() !== WIDGET_LAYOUT_EVENT_TYPE) return; + const room = this.matrixClient.getRoom(ev.getRoomId()); + this.recalculateRoom(room); + }; + + private recalculateRoom(room: Room) { + const widgets = WidgetStore.instance.getApps(room.roomId); + if (!widgets?.length) { + this.byRoom[room.roomId] = {}; + this.emitFor(room); + return; + } + + const layoutEv = room.currentState.getStateEvents(WIDGET_LAYOUT_EVENT_TYPE, ""); + const legacyPinned = SettingsStore.getValue("Widgets.pinned", room.roomId); + let userLayout = SettingsStore.getValue("Widgets.layout", room.roomId); + + if (layoutEv && userLayout && userLayout.overrides !== layoutEv.getId()) { + // For some other layout that we don't really care about. The user can reset this + // by updating their personal layout. + userLayout = null; + } + + const roomLayout: ILayoutStateEvent = layoutEv ? layoutEv.getContent() : null; + + // We essentially just need to find the top container's widgets because we + // only have two containers. Anything not in the top widget by the end of this + // function will go into the right container. + const topWidgets: IApp[] = []; + const rightWidgets: IApp[] = []; + for (const widget of widgets) { + if (WidgetType.JITSI.matches(widget.type)) { + topWidgets.push(widget); + continue; + } + + const stateContainer = roomLayout?.widgets?.[widget.id]?.container; + const manualContainer = userLayout?.widgets?.[widget.id]?.container; + const isLegacyPinned = !!legacyPinned?.[widget.id]; + const defaultContainer = WidgetType.JITSI.matches(widget.type) ? Container.Top : Container.Right; + + if (manualContainer === Container.Right) { + rightWidgets.push(widget); + } else if (manualContainer === Container.Top || stateContainer === Container.Top) { + topWidgets.push(widget); + } else if (isLegacyPinned && !stateContainer) { + topWidgets.push(widget); + } else { + (defaultContainer === Container.Top ? topWidgets : rightWidgets).push(widget); + } + } + + // Trim to MAX_PINNED + const runoff = topWidgets.slice(MAX_PINNED); + rightWidgets.push(...runoff); + + // Order the widgets in the top container, putting autopinned Jitsi widgets first + // unless they have a specific order in mind + topWidgets.sort((a, b) => { + const layoutA = roomLayout?.widgets?.[a.id]; + const layoutB = roomLayout?.widgets?.[b.id]; + + const userLayoutA = userLayout?.widgets?.[a.id]; + const userLayoutB = userLayout?.widgets?.[b.id]; + + // Jitsi widgets are defaulted to be the leftmost widget whereas other widgets + // default to the right side. + const defaultA = WidgetType.JITSI.matches(a.type) ? Number.MIN_SAFE_INTEGER : Number.MAX_SAFE_INTEGER; + const defaultB = WidgetType.JITSI.matches(b.type) ? Number.MIN_SAFE_INTEGER : Number.MAX_SAFE_INTEGER; + + const orderA = defaultNumber(userLayoutA, defaultNumber(layoutA?.index, defaultA)); + const orderB = defaultNumber(userLayoutB, defaultNumber(layoutB?.index, defaultB)); + + if (orderA === orderB) { + // We just need a tiebreak + return a.id.localeCompare(b.id); + } + + return orderA - orderB; + }); + + // Determine width distribution and height of the top container now (the only relevant one) + const widths: number[] = []; + let maxHeight = 0; + let doAutobalance = true; + for (let i = 0; i < topWidgets.length; i++) { + const widget = topWidgets[i]; + const widgetLayout = roomLayout?.widgets?.[widget.id]; + const userWidgetLayout = userLayout?.widgets?.[widget.id]; + + if (Number.isFinite(userWidgetLayout?.width) || Number.isFinite(widgetLayout?.width)) { + const val = userWidgetLayout?.width || widgetLayout?.width; + const normalized = clamp(val, MIN_WIDGET_WIDTH_PCT, 100); + widths.push(normalized); + doAutobalance = false; // a manual width was specified + } else { + widths.push(100); // we'll figure this out later + } + + const defRoomHeight = defaultNumber(widgetLayout?.height, MIN_WIDGET_HEIGHT_PCT); + const h = defaultNumber(userWidgetLayout?.height, defRoomHeight); + maxHeight = Math.max(maxHeight, clamp(h, MIN_WIDGET_HEIGHT_PCT, 100)); + } + let remainingWidth = 100; + for (const width of widths) { + remainingWidth -= width; + } + if (topWidgets.length > 1 && remainingWidth < MIN_WIDGET_WIDTH_PCT) { + const toReclaim = MIN_WIDGET_WIDTH_PCT - remainingWidth; + for (let i = 0; i < widths.length - 1; i++) { + widths[i] = widths[i] - (toReclaim / (widths.length - 1)); + } + widths[widths.length - 1] = MIN_WIDGET_WIDTH_PCT; + } + if (doAutobalance) { + for (let i = 0; i < widths.length; i++) { + widths[i] = 100 / widths.length; + } + } + + // Finally, fill in our cache and update + this.byRoom[room.roomId] = { + [Container.Top]: { + ordered: topWidgets, + distributions: widths, + height: maxHeight, + }, + [Container.Right]: { + ordered: rightWidgets, + }, + }; + this.emitFor(room); + } + + public getContainerWidgets(room: Room, container: Container): IApp[] { + return this.byRoom[room.roomId]?.[container]?.ordered || []; + } +} + +window.mxWidgetLayoutStore = WidgetLayoutStore.instance; diff --git a/src/utils/numbers.ts b/src/utils/numbers.ts new file mode 100644 index 0000000000..1bf48c5117 --- /dev/null +++ b/src/utils/numbers.ts @@ -0,0 +1,30 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/** + * Returns the default number if the given value, i, is not a number. Otherwise + * returns the given value. + * @param {*} i The value to check. + * @param {number} def The default value. + * @returns {number} Either the value or the default value, whichever is a number. + */ +export function defaultNumber(i: unknown, def: number): number { + return Number.isFinite(i) ? Number(i) : def; +} + +export function clamp(i: number, min: number, max: number): number { + return Math.min(Math.max(i, min), max); +} From 2548a438ae810444b379e6c760dbb305f63a2f7e Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 18 Jan 2021 17:41:54 -0700 Subject: [PATCH 199/231] Render ordering changes in the AppsDrawer --- src/components/views/rooms/AppsDrawer.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/views/rooms/AppsDrawer.js b/src/components/views/rooms/AppsDrawer.js index 3208844bc5..924cda0b64 100644 --- a/src/components/views/rooms/AppsDrawer.js +++ b/src/components/views/rooms/AppsDrawer.js @@ -30,10 +30,10 @@ import {IntegrationManagers} from "../../../integrations/IntegrationManagers"; import SettingsStore from "../../../settings/SettingsStore"; import {useLocalStorageState} from "../../../hooks/useLocalStorageState"; import ResizeNotifier from "../../../utils/ResizeNotifier"; -import WidgetStore from "../../../stores/WidgetStore"; import ResizeHandle from "../elements/ResizeHandle"; import Resizer from "../../../resizer/resizer"; import PercentageDistributor from "../../../resizer/distributors/percentage"; +import {Container, WidgetLayoutStore} from "../../../stores/widgets/WidgetLayoutStore"; export default class AppsDrawer extends React.Component { static propTypes = { @@ -62,13 +62,13 @@ export default class AppsDrawer extends React.Component { componentDidMount() { ScalarMessaging.startListening(); - WidgetStore.instance.on(this.props.room.roomId, this._updateApps); + WidgetLayoutStore.instance.on(WidgetLayoutStore.emissionForRoom(this.props.room), this._updateApps); this.dispatcherRef = dis.register(this.onAction); } componentWillUnmount() { ScalarMessaging.stopListening(); - WidgetStore.instance.off(this.props.room.roomId, this._updateApps); + WidgetLayoutStore.instance.off(WidgetLayoutStore.emissionForRoom(this.props.room), this._updateApps); if (this.dispatcherRef) dis.unregister(this.dispatcherRef); if (this._resizeContainer) { this.resizer.detach(); @@ -190,7 +190,7 @@ export default class AppsDrawer extends React.Component { } }; - _getApps = () => WidgetStore.instance.getPinnedApps(this.props.room.roomId); + _getApps = () => WidgetLayoutStore.instance.getContainerWidgets(this.props.room, Container.Top); _updateApps = () => { this.setState({ From cfb583d193d2dab9f5b2244bf12e4258741a7705 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 18 Jan 2021 18:48:07 -0700 Subject: [PATCH 200/231] Calculate widget widths in the WidgetLayoutStore Note that this ditches all previously set width values, however this is probably acceptable for now. Trying to remain backwards compatible gets tricky on top of already tricky code, and the impact of Element forgetting widths is not as severe as forgetting which widgets were/are pinned. --- src/components/views/rooms/AppsDrawer.js | 39 +++----- src/stores/widgets/WidgetLayoutStore.ts | 115 ++++++++++++++++++----- src/utils/WidgetUtils.ts | 2 +- src/utils/numbers.ts | 4 + 4 files changed, 111 insertions(+), 49 deletions(-) diff --git a/src/components/views/rooms/AppsDrawer.js b/src/components/views/rooms/AppsDrawer.js index 924cda0b64..5982c52d98 100644 --- a/src/components/views/rooms/AppsDrawer.js +++ b/src/components/views/rooms/AppsDrawer.js @@ -102,11 +102,10 @@ export default class AppsDrawer extends React.Component { }, onResizeStop: () => { this._resizeContainer.classList.remove("mx_AppsDrawer_resizing"); - // persist to localStorage - localStorage.setItem(this._getStorageKey(), JSON.stringify([ - this.state.apps.map(app => app.id), - ...this.state.apps.slice(1).map((_, i) => this.resizer.forHandleAt(i).size), - ])); + WidgetLayoutStore.instance.setResizerDistributions( + this.props.room, Container.Top, + this.state.apps.slice(1).map((_, i) => this.resizer.forHandleAt(i).size), + ); }, }; // pass a truthy container for now, we won't call attach until we update it @@ -128,8 +127,6 @@ export default class AppsDrawer extends React.Component { this._loadResizerPreferences(); }; - _getStorageKey = () => `mx_apps_drawer-${this.props.room.roomId}`; - _getAppsHash = (apps) => apps.map(app => app.id).join("~"); componentDidUpdate(prevProps, prevState) { @@ -147,24 +144,16 @@ export default class AppsDrawer extends React.Component { }; _loadResizerPreferences = () => { - try { - const [[...lastIds], ...sizes] = JSON.parse(localStorage.getItem(this._getStorageKey())); - // Every app was included in the last split, reuse the last sizes - if (this.state.apps.length <= lastIds.length && this.state.apps.every((app, i) => lastIds[i] === app.id)) { - sizes.forEach((size, i) => { - const distributor = this.resizer.forHandleAt(i); - if (distributor) { - distributor.size = size; - distributor.finish(); - } - }); - return; - } - } catch (e) { - // this is expected - } - - if (this.state.apps) { + const distributions = WidgetLayoutStore.instance.getResizerDistributions(this.props.room, Container.Top); + if (this.state.apps && (this.state.apps.length - 1) === distributions.length) { + distributions.forEach((size, i) => { + const distributor = this.resizer.forHandleAt(i); + if (distributor) { + distributor.size = size; + distributor.finish(); + } + }); + } else if (this.state.apps) { const distributors = this.resizer.getDistributors(); distributors.forEach(d => d.item.clearSize()); distributors.forEach(d => d.start()); diff --git a/src/stores/widgets/WidgetLayoutStore.ts b/src/stores/widgets/WidgetLayoutStore.ts index fddfaf65b3..7d22f6729e 100644 --- a/src/stores/widgets/WidgetLayoutStore.ts +++ b/src/stores/widgets/WidgetLayoutStore.ts @@ -18,12 +18,11 @@ import SettingsStore from "../../settings/SettingsStore"; import { Room } from "matrix-js-sdk/src/models/room"; import WidgetStore, { IApp } from "../WidgetStore"; import { WidgetType } from "../../widgets/WidgetType"; -import { clamp, defaultNumber } from "../../utils/numbers"; -import { EventEmitter } from "events"; -import { AsyncStoreWithClient } from "../AsyncStoreWithClient"; +import { clamp, defaultNumber, sum } from "../../utils/numbers"; import defaultDispatcher from "../../dispatcher/dispatcher"; import { ReadyWatchingStore } from "../ReadyWatchingStore"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; +import { SettingLevel } from "../../settings/SettingLevel"; export const WIDGET_LAYOUT_EVENT_TYPE = "io.element.widgets.layout"; @@ -117,13 +116,11 @@ export class WidgetLayoutStore extends ReadyWatchingStore { } protected async onReady(): Promise { - this.byRoom = {}; - for (const room of this.matrixClient.getVisibleRooms()) { - this.recalculateRoom(room); - } + this.updateAllRooms(); this.matrixClient.on("RoomState.events", this.updateRoomFromState); - // TODO: Register settings listeners + SettingsStore.watchSetting("Widgets.pinned", null, this.updateFromSettings); + SettingsStore.watchSetting("Widgets.layout", null, this.updateFromSettings); // TODO: Register WidgetStore listener } @@ -131,10 +128,26 @@ export class WidgetLayoutStore extends ReadyWatchingStore { this.byRoom = {}; } + private updateAllRooms() { + this.byRoom = {}; + for (const room of this.matrixClient.getVisibleRooms()) { + this.recalculateRoom(room); + } + } + private updateRoomFromState = (ev: MatrixEvent) => { if (ev.getType() !== WIDGET_LAYOUT_EVENT_TYPE) return; const room = this.matrixClient.getRoom(ev.getRoomId()); - this.recalculateRoom(room); + if (room) this.recalculateRoom(room); + }; + + private updateFromSettings = (settingName: string, roomId: string, /* and other stuff */) => { + if (roomId) { + const room = this.matrixClient.getRoom(roomId); + if (room) this.recalculateRoom(room); + } else { + this.updateAllRooms(); + } }; private recalculateRoom(room: Room) { @@ -145,6 +158,8 @@ export class WidgetLayoutStore extends ReadyWatchingStore { return; } + const beforeChanges = JSON.stringify(this.byRoom[room.roomId]); + const layoutEv = room.currentState.getStateEvents(WIDGET_LAYOUT_EVENT_TYPE, ""); const legacyPinned = SettingsStore.getValue("Widgets.pinned", room.roomId); let userLayout = SettingsStore.getValue("Widgets.layout", room.roomId); @@ -239,36 +254,90 @@ export class WidgetLayoutStore extends ReadyWatchingStore { for (const width of widths) { remainingWidth -= width; } - if (topWidgets.length > 1 && remainingWidth < MIN_WIDGET_WIDTH_PCT) { - const toReclaim = MIN_WIDGET_WIDTH_PCT - remainingWidth; - for (let i = 0; i < widths.length - 1; i++) { - widths[i] = widths[i] - (toReclaim / (widths.length - 1)); - } - widths[widths.length - 1] = MIN_WIDGET_WIDTH_PCT; - } if (doAutobalance) { for (let i = 0; i < widths.length; i++) { widths[i] = 100 / widths.length; } } + // TODO: There is probably a more efficient way to do this. + // All we're doing is making sure that our widths sum up to 100 and take + // any excess width off all widgets equally to keep the proportions. + let toReclaim = sum(...widths) - 100; + while (toReclaim > 0 && topWidgets.length > 0) { + for (let i = 0; i < widths.length; i++) { + if (toReclaim <= 0) break; + const w = widths[i]; + const adjusted = clamp(w - 1, MIN_WIDGET_WIDTH_PCT, 100); + if (adjusted !== w) { + toReclaim -= 1; + widths[i] = adjusted; + } + } + } + // Finally, fill in our cache and update - this.byRoom[room.roomId] = { - [Container.Top]: { + this.byRoom[room.roomId] = {}; + if (topWidgets.length) { + this.byRoom[room.roomId][Container.Top] = { ordered: topWidgets, distributions: widths, height: maxHeight, - }, - [Container.Right]: { + }; + } + if (rightWidgets.length) { + this.byRoom[room.roomId][Container.Right] = { ordered: rightWidgets, - }, - }; - this.emitFor(room); + }; + } + + const afterChanges = JSON.stringify(this.byRoom[room.roomId]); + if (afterChanges !== beforeChanges) { + this.emitFor(room); + } } public getContainerWidgets(room: Room, container: Container): IApp[] { return this.byRoom[room.roomId]?.[container]?.ordered || []; } + + public getResizerDistributions(room: Room, container: Container): string[] { // yes, string. + let distributions = this.byRoom[room.roomId]?.[container]?.distributions; + if (!distributions || distributions.length < 2) return []; + + // The distributor actually expects to be fed N-1 sizes and expands the middle section + // instead of the edges. Therefore, we need to return [0] when there's two widgets or + // [0, 2] when there's three (skipping [1] because it's irrelevant). + + if (distributions.length === 2) distributions = [distributions[0]]; + if (distributions.length === 3) distributions = [distributions[0], distributions[2]]; + return distributions.map(d => `${d.toFixed(1)}%`); // actual percents - these are decoded later + } + + public setResizerDistributions(room: Room, container: Container, distributions: string[]) { + if (container !== Container.Top) return; // ignore - not relevant + + const numbers = distributions.map(d => Number(Number(d.substring(0, d.length - 1)).toFixed(1))); + const widgets = this.getContainerWidgets(room, container); + + // From getResizerDistributions, we need to fill in the middle size if applicable. + const remaining = 100 - sum(...numbers); + if (numbers.length === 2) numbers.splice(1, 0, remaining); + if (numbers.length === 1) numbers.push(remaining); + + const localLayout = {}; + widgets.forEach((w, i) => { + localLayout[w.id] = { + width: numbers[i], + index: i, + }; + }); + const layoutEv = room.currentState.getStateEvents(WIDGET_LAYOUT_EVENT_TYPE, ""); + SettingsStore.setValue("Widgets.layout", room.roomId, SettingLevel.ROOM_ACCOUNT, { + overrides: layoutEv?.getId(), + widgets: localLayout, + }); + } } window.mxWidgetLayoutStore = WidgetLayoutStore.instance; diff --git a/src/utils/WidgetUtils.ts b/src/utils/WidgetUtils.ts index 986c68342c..815900d97a 100644 --- a/src/utils/WidgetUtils.ts +++ b/src/utils/WidgetUtils.ts @@ -28,7 +28,7 @@ import {WidgetType} from "../widgets/WidgetType"; import {objectClone} from "./objects"; import {_t} from "../languageHandler"; import {Capability, IWidgetData, MatrixCapabilities} from "matrix-widget-api"; -import {IApp} from "../stores/WidgetStore"; // TODO @@ +import {IApp} from "../stores/WidgetStore"; // How long we wait for the state event echo to come back from the server // before waitFor[Room/User]Widget rejects its promise diff --git a/src/utils/numbers.ts b/src/utils/numbers.ts index 1bf48c5117..e26db0d5aa 100644 --- a/src/utils/numbers.ts +++ b/src/utils/numbers.ts @@ -28,3 +28,7 @@ export function defaultNumber(i: unknown, def: number): number { export function clamp(i: number, min: number, max: number): number { return Math.min(Math.max(i, min), max); } + +export function sum(...i: number[]): number { + return [...i].reduce((p, c) => c + p, 0); +} From 0d29d15a464eab3a66278c963026033ca8be9f1d Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 18 Jan 2021 19:27:11 -0700 Subject: [PATCH 201/231] Support room-defined height as well Much like widget widths, it is acceptable for us to forget what everyone's height was previously at. --- src/components/views/rooms/AppsDrawer.js | 26 ++++++++++-- src/hooks/useStateCallback.ts | 28 +++++++++++++ src/stores/widgets/WidgetLayoutStore.ts | 50 +++++++++++++++++++----- src/utils/numbers.ts | 8 ++++ 4 files changed, 98 insertions(+), 14 deletions(-) create mode 100644 src/hooks/useStateCallback.ts diff --git a/src/components/views/rooms/AppsDrawer.js b/src/components/views/rooms/AppsDrawer.js index 5982c52d98..5efcefc4bc 100644 --- a/src/components/views/rooms/AppsDrawer.js +++ b/src/components/views/rooms/AppsDrawer.js @@ -28,12 +28,13 @@ import WidgetUtils from '../../../utils/WidgetUtils'; import WidgetEchoStore from "../../../stores/WidgetEchoStore"; import {IntegrationManagers} from "../../../integrations/IntegrationManagers"; import SettingsStore from "../../../settings/SettingsStore"; -import {useLocalStorageState} from "../../../hooks/useLocalStorageState"; import ResizeNotifier from "../../../utils/ResizeNotifier"; import ResizeHandle from "../elements/ResizeHandle"; import Resizer from "../../../resizer/resizer"; import PercentageDistributor from "../../../resizer/distributors/percentage"; import {Container, WidgetLayoutStore} from "../../../stores/widgets/WidgetLayoutStore"; +import {clamp, percentageOf, percentageWithin} from "../../../utils/numbers"; +import {useStateCallback} from "../../../hooks/useStateCallback"; export default class AppsDrawer extends React.Component { static propTypes = { @@ -237,7 +238,7 @@ export default class AppsDrawer extends React.Component { return (
    { - const [height, setHeight] = useLocalStorageState("pvr_" + id, 280); // old fixed height was 273px + let defaultHeight = WidgetLayoutStore.instance.getContainerHeight(room, Container.Top); + + // Arbitrary defaults to avoid NaN problems. 100 px or 3/4 of the visible window. + if (!minHeight) minHeight = 100; + if (!maxHeight) maxHeight = (window.innerHeight / 4) * 3; + + // Convert from percentage to height. Note that the default height is 280px. + if (defaultHeight) { + defaultHeight = clamp(defaultHeight, 0, 100); + defaultHeight = percentageWithin(defaultHeight / 100, minHeight, maxHeight); + } else { + defaultHeight = 280; + } + + const [height, setHeight] = useStateCallback(defaultHeight, newHeight => { + newHeight = percentageOf(newHeight, minHeight, maxHeight) * 100; + WidgetLayoutStore.instance.setContainerHeight(room, Container.Top, newHeight) + }); return (initialValue: T, callback: (v: T) => void): [T, Dispatch>] => { + const [value, setValue] = useState(initialValue); + const interceptSetValue = (newVal: T) => { + setValue(newVal); + callback(newVal); + }; + return [value, interceptSetValue]; +}; diff --git a/src/stores/widgets/WidgetLayoutStore.ts b/src/stores/widgets/WidgetLayoutStore.ts index 7d22f6729e..12051d35bc 100644 --- a/src/stores/widgets/WidgetLayoutStore.ts +++ b/src/stores/widgets/WidgetLayoutStore.ts @@ -63,13 +63,15 @@ interface IStoredLayout { // TODO: [Deferred] Maximizing (fullscreen) widgets by default. } +interface IWidgetLayouts { + [widgetId: string]: IStoredLayout; +} + interface ILayoutStateEvent { // TODO: [Deferred] Forced layout (fixed with no changes) // The widget layouts. - widgets: { - [widgetId: string]: IStoredLayout; - }; + widgets: IWidgetLayouts; } interface ILayoutSettings extends ILayoutStateEvent { @@ -79,8 +81,11 @@ interface ILayoutSettings extends ILayoutStateEvent { // Dev note: "Pinned" widgets are ones in the top container. const MAX_PINNED = 3; -const MIN_WIDGET_WIDTH_PCT = 10; // Don't make anything smaller than 10% width -const MIN_WIDGET_HEIGHT_PCT = 20; +// These two are whole percentages and don't really mean anything. Later values will decide +// minimum, but these help determine proportions during our calculations here. In fact, these +// values should be *smaller* than the actual minimums imposed by later components. +const MIN_WIDGET_WIDTH_PCT = 10; // 10% +const MIN_WIDGET_HEIGHT_PCT = 2; // 2% export class WidgetLayoutStore extends ReadyWatchingStore { private static internalInstance: WidgetLayoutStore; @@ -230,7 +235,7 @@ export class WidgetLayoutStore extends ReadyWatchingStore { // Determine width distribution and height of the top container now (the only relevant one) const widths: number[] = []; - let maxHeight = 0; + let maxHeight = null; // null == default let doAutobalance = true; for (let i = 0; i < topWidgets.length; i++) { const widget = topWidgets[i]; @@ -246,9 +251,11 @@ export class WidgetLayoutStore extends ReadyWatchingStore { widths.push(100); // we'll figure this out later } - const defRoomHeight = defaultNumber(widgetLayout?.height, MIN_WIDGET_HEIGHT_PCT); - const h = defaultNumber(userWidgetLayout?.height, defRoomHeight); - maxHeight = Math.max(maxHeight, clamp(h, MIN_WIDGET_HEIGHT_PCT, 100)); + if (widgetLayout?.height || userWidgetLayout?.height) { + const defRoomHeight = defaultNumber(widgetLayout?.height, MIN_WIDGET_HEIGHT_PCT); + const h = defaultNumber(userWidgetLayout?.height, defRoomHeight); + maxHeight = Math.max(maxHeight, clamp(h, MIN_WIDGET_HEIGHT_PCT, 100)); + } } let remainingWidth = 100; for (const width of widths) { @@ -330,12 +337,35 @@ export class WidgetLayoutStore extends ReadyWatchingStore { localLayout[w.id] = { width: numbers[i], index: i, + height: this.byRoom[room.roomId]?.[container]?.height || MIN_WIDGET_HEIGHT_PCT, }; }); + this.updateUserLayout(room, localLayout); + } + + public getContainerHeight(room: Room, container: Container): number { + return this.byRoom[room.roomId]?.[container]?.height; // let the default get returned if needed + } + + public setContainerHeight(room: Room, container: Container, height: number) { + const widgets = this.getContainerWidgets(room, container); + const widths = this.byRoom[room.roomId]?.[container]?.distributions; + const localLayout = {}; + widgets.forEach((w, i) => { + localLayout[w.id] = { + width: widths[i], + index: i, + height: height, + }; + }); + this.updateUserLayout(room, localLayout); + } + + private updateUserLayout(room: Room, newLayout: IWidgetLayouts) { const layoutEv = room.currentState.getStateEvents(WIDGET_LAYOUT_EVENT_TYPE, ""); SettingsStore.setValue("Widgets.layout", room.roomId, SettingLevel.ROOM_ACCOUNT, { overrides: layoutEv?.getId(), - widgets: localLayout, + widgets: newLayout, }); } } diff --git a/src/utils/numbers.ts b/src/utils/numbers.ts index e26db0d5aa..c8b9e7248f 100644 --- a/src/utils/numbers.ts +++ b/src/utils/numbers.ts @@ -32,3 +32,11 @@ export function clamp(i: number, min: number, max: number): number { export function sum(...i: number[]): number { return [...i].reduce((p, c) => c + p, 0); } + +export function percentageWithin(pct: number, min: number, max: number): number { + return (pct * (max - min)) + min; +} + +export function percentageOf(val: number, min: number, max: number): number { + return (val - min) / max; +} From 5b5c338200f0666ebf50bb9d644001b3e8a0fdf3 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 18 Jan 2021 19:31:11 -0700 Subject: [PATCH 202/231] Render layout changes in the timeline --- src/TextForEvent.js | 7 +++++++ src/components/views/rooms/EventTile.js | 2 ++ src/i18n/strings/en_EN.json | 1 + 3 files changed, 10 insertions(+) diff --git a/src/TextForEvent.js b/src/TextForEvent.js index 56e9abc0f2..3afe41d216 100644 --- a/src/TextForEvent.js +++ b/src/TextForEvent.js @@ -19,6 +19,7 @@ import * as Roles from './Roles'; import {isValid3pidInvite} from "./RoomInvite"; import SettingsStore from "./settings/SettingsStore"; import {ALL_RULE_TYPES, ROOM_RULE_TYPES, SERVER_RULE_TYPES, USER_RULE_TYPES} from "./mjolnir/BanList"; +import {WIDGET_LAYOUT_EVENT_TYPE} from "./stores/widgets/WidgetLayoutStore"; function textForMemberEvent(ev) { // XXX: SYJS-16 "sender is sometimes null for join messages" @@ -477,6 +478,11 @@ function textForWidgetEvent(event) { } } +function textForWidgetLayoutEvent(event) { + const senderName = event.sender?.name || event.getSender(); + return _t("%(senderName)s has updated the widget layout", {senderName}); +} + function textForMjolnirEvent(event) { const senderName = event.getSender(); const {entity: prevEntity} = event.getPrevContent(); @@ -583,6 +589,7 @@ const stateHandlers = { // TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111) 'im.vector.modular.widgets': textForWidgetEvent, + [WIDGET_LAYOUT_EVENT_TYPE]: textForWidgetLayoutEvent, }; // Add all the Mjolnir stuff to the renderer diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 11277daa57..4df74f77ce 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -37,6 +37,7 @@ import {E2E_STATE} from "./E2EIcon"; import {toRem} from "../../../utils/units"; import {WidgetType} from "../../../widgets/WidgetType"; import RoomAvatar from "../avatars/RoomAvatar"; +import {WIDGET_LAYOUT_EVENT_TYPE} from "../../../stores/widgets/WidgetLayoutStore"; const eventTileTypes = { 'm.room.message': 'messages.MessageEvent', @@ -65,6 +66,7 @@ const stateEventTileTypes = { 'm.room.server_acl': 'messages.TextualEvent', // TODO: Enable support for m.widget event type (https://github.com/vector-im/element-web/issues/13111) 'im.vector.modular.widgets': 'messages.TextualEvent', + [WIDGET_LAYOUT_EVENT_TYPE]: 'messages.TextualEvent', 'm.room.tombstone': 'messages.TextualEvent', 'm.room.join_rules': 'messages.TextualEvent', 'm.room.guest_access': 'messages.TextualEvent', diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 274bd247e2..2dbb6610f5 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -548,6 +548,7 @@ "%(widgetName)s widget modified by %(senderName)s": "%(widgetName)s widget modified by %(senderName)s", "%(widgetName)s widget added by %(senderName)s": "%(widgetName)s widget added by %(senderName)s", "%(widgetName)s widget removed by %(senderName)s": "%(widgetName)s widget removed by %(senderName)s", + "%(senderName)s has updated the widget layout": "%(senderName)s has updated the widget layout", "%(senderName)s removed the rule banning users matching %(glob)s": "%(senderName)s removed the rule banning users matching %(glob)s", "%(senderName)s removed the rule banning rooms matching %(glob)s": "%(senderName)s removed the rule banning rooms matching %(glob)s", "%(senderName)s removed the rule banning servers matching %(glob)s": "%(senderName)s removed the rule banning servers matching %(glob)s", From 1768d6ea5f9025c382be0ac929eef0cece878022 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 18 Jan 2021 20:26:47 -0700 Subject: [PATCH 203/231] Move all widget pinning logic to the WidgetLayoutStore --- src/components/structures/RoomView.tsx | 5 +- .../views/context_menus/WidgetContextMenu.tsx | 11 +- .../views/messages/MJitsiWidgetEvent.tsx | 7 +- .../views/right_panel/RoomSummaryCard.tsx | 12 +- .../views/right_panel/WidgetCard.tsx | 20 +- src/stores/WidgetStore.ts | 180 +----------------- src/stores/widgets/WidgetLayoutStore.ts | 83 +++++++- 7 files changed, 116 insertions(+), 202 deletions(-) diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 0ee847fbc9..027c6b3cc3 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -78,6 +78,7 @@ import {UPDATE_EVENT} from "../../stores/AsyncStore"; import Notifier from "../../Notifier"; import {showToast as showNotificationsToast} from "../../toasts/DesktopNotificationsToast"; import { RoomNotificationStateStore } from "../../stores/notifications/RoomNotificationStateStore"; +import { Container, WidgetLayoutStore } from "../../stores/widgets/WidgetLayoutStore"; const DEBUG = false; let debuglog = function(msg: string) {}; @@ -280,8 +281,8 @@ export default class RoomView extends React.Component { private checkWidgets = (room) => { this.setState({ - hasPinnedWidgets: WidgetStore.instance.getPinnedApps(room.roomId).length > 0, - }) + hasPinnedWidgets: WidgetLayoutStore.instance.getContainerWidgets(room, Container.Top).length > 0, + }); }; private onReadReceiptsChange = () => { diff --git a/src/components/views/context_menus/WidgetContextMenu.tsx b/src/components/views/context_menus/WidgetContextMenu.tsx index 4662c74d78..c1af86eae6 100644 --- a/src/components/views/context_menus/WidgetContextMenu.tsx +++ b/src/components/views/context_menus/WidgetContextMenu.tsx @@ -20,7 +20,7 @@ import {MatrixCapabilities} from "matrix-widget-api"; import IconizedContextMenu, {IconizedContextMenuOption, IconizedContextMenuOptionList} from "./IconizedContextMenu"; import {ChevronFace} from "../../structures/ContextMenu"; import {_t} from "../../../languageHandler"; -import WidgetStore, {IApp} from "../../../stores/WidgetStore"; +import {IApp} from "../../../stores/WidgetStore"; import WidgetUtils from "../../../utils/WidgetUtils"; import {WidgetMessagingStore} from "../../../stores/widgets/WidgetMessagingStore"; import RoomContext from "../../../contexts/RoomContext"; @@ -30,6 +30,7 @@ import Modal from "../../../Modal"; import QuestionDialog from "../dialogs/QuestionDialog"; import {WidgetType} from "../../../widgets/WidgetType"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; +import { Container, WidgetLayoutStore } from "../../../stores/widgets/WidgetLayoutStore"; interface IProps extends React.ComponentProps { app: IApp; @@ -56,7 +57,7 @@ const WidgetContextMenu: React.FC = ({ let unpinButton; if (showUnpin) { const onUnpinClick = () => { - WidgetStore.instance.unpinWidget(room.roomId, app.id); + WidgetLayoutStore.instance.moveToContainer(room, app, Container.Right); onFinished(); }; @@ -137,13 +138,13 @@ const WidgetContextMenu: React.FC = ({ revokeButton = ; } - const pinnedWidgets = WidgetStore.instance.getPinnedApps(roomId); + const pinnedWidgets = WidgetLayoutStore.instance.getContainerWidgets(room, Container.Top); const widgetIndex = pinnedWidgets.findIndex(widget => widget.id === app.id); let moveLeftButton; if (showUnpin && widgetIndex > 0) { const onClick = () => { - WidgetStore.instance.movePinnedWidget(roomId, app.id, -1); + WidgetLayoutStore.instance.moveWithinContainer(room, Container.Top, app, -1); onFinished(); }; @@ -153,7 +154,7 @@ const WidgetContextMenu: React.FC = ({ let moveRightButton; if (showUnpin && widgetIndex < pinnedWidgets.length - 1) { const onClick = () => { - WidgetStore.instance.movePinnedWidget(roomId, app.id, 1); + WidgetLayoutStore.instance.moveWithinContainer(room, Container.Top, app, 1); onFinished(); }; diff --git a/src/components/views/messages/MJitsiWidgetEvent.tsx b/src/components/views/messages/MJitsiWidgetEvent.tsx index b87efd472a..3ff11f7b6f 100644 --- a/src/components/views/messages/MJitsiWidgetEvent.tsx +++ b/src/components/views/messages/MJitsiWidgetEvent.tsx @@ -19,6 +19,8 @@ import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { _t } from "../../../languageHandler"; import WidgetStore from "../../../stores/WidgetStore"; import EventTileBubble from "./EventTileBubble"; +import { MatrixClientPeg } from "../../../MatrixClientPeg"; +import { Container, WidgetLayoutStore } from "../../../stores/widgets/WidgetLayoutStore"; interface IProps { mxEvent: MatrixEvent; @@ -33,9 +35,12 @@ export default class MJitsiWidgetEvent extends React.PureComponent { const url = this.props.mxEvent.getContent()['url']; const prevUrl = this.props.mxEvent.getPrevContent()['url']; const senderName = this.props.mxEvent.sender?.name || this.props.mxEvent.getSender(); + const room = MatrixClientPeg.get().getRoom(this.props.mxEvent.getRoomId()); + const widgetId = this.props.mxEvent.getStateKey(); + const widget = WidgetStore.instance.getRoom(room.roomId).widgets.find(w => w.id === widgetId); let joinCopy = _t('Join the conference at the top of this room'); - if (!WidgetStore.instance.isPinned(this.props.mxEvent.getRoomId(), this.props.mxEvent.getStateKey())) { + if (widget && WidgetLayoutStore.instance.isInContainer(room, widget, Container.Right)) { joinCopy = _t('Join the conference from the room information card on the right'); } diff --git a/src/components/views/right_panel/RoomSummaryCard.tsx b/src/components/views/right_panel/RoomSummaryCard.tsx index ebc07e76b8..f405cde11d 100644 --- a/src/components/views/right_panel/RoomSummaryCard.tsx +++ b/src/components/views/right_panel/RoomSummaryCard.tsx @@ -37,13 +37,14 @@ import SettingsStore from "../../../settings/SettingsStore"; import TextWithTooltip from "../elements/TextWithTooltip"; import WidgetAvatar from "../avatars/WidgetAvatar"; import AccessibleTooltipButton from "../elements/AccessibleTooltipButton"; -import WidgetStore, {IApp, MAX_PINNED} from "../../../stores/WidgetStore"; +import WidgetStore, {IApp} from "../../../stores/WidgetStore"; import { E2EStatus } from "../../../utils/ShieldUtils"; import RoomContext from "../../../contexts/RoomContext"; import {UIFeature} from "../../../settings/UIFeature"; import {ChevronFace, ContextMenuTooltipButton, useContextMenu} from "../../structures/ContextMenu"; import WidgetContextMenu from "../context_menus/WidgetContextMenu"; import {useRoomMemberCount} from "../../../hooks/useRoomMembers"; +import { Container, MAX_PINNED, WidgetLayoutStore } from "../../../stores/widgets/WidgetLayoutStore"; interface IProps { room: Room; @@ -78,6 +79,7 @@ export const useWidgets = (room: Room) => { useEffect(updateApps, [room]); useEventEmitter(WidgetStore.instance, room.roomId, updateApps); + useEventEmitter(WidgetLayoutStore.instance, WidgetLayoutStore.emissionForRoom(room), updateApps); return apps; }; @@ -102,10 +104,10 @@ const AppRow: React.FC = ({ app, room }) => { }); }; - const isPinned = WidgetStore.instance.isPinned(room.roomId, app.id); + const isPinned = WidgetLayoutStore.instance.isInContainer(room, app, Container.Top); const togglePin = isPinned - ? () => { WidgetStore.instance.unpinWidget(room.roomId, app.id); } - : () => { WidgetStore.instance.pinWidget(room.roomId, app.id); }; + ? () => { WidgetLayoutStore.instance.moveToContainer(room, app, Container.Right); } + : () => { WidgetLayoutStore.instance.moveToContainer(room, app, Container.Top); }; const [menuDisplayed, handle, openMenu, closeMenu] = useContextMenu(); let contextMenu; @@ -120,7 +122,7 @@ const AppRow: React.FC = ({ app, room }) => { />; } - const cannotPin = !isPinned && !WidgetStore.instance.canPin(room.roomId, app.id); + const cannotPin = !isPinned && !WidgetLayoutStore.instance.canAddToContainer(room, Container.Top); let pinTitle: string; if (cannotPin) { diff --git a/src/components/views/right_panel/WidgetCard.tsx b/src/components/views/right_panel/WidgetCard.tsx index 593bd0dde7..56e522e206 100644 --- a/src/components/views/right_panel/WidgetCard.tsx +++ b/src/components/views/right_panel/WidgetCard.tsx @@ -14,22 +14,22 @@ See the License for the specific language governing permissions and limitations under the License. */ -import React, {useContext, useEffect} from "react"; -import {Room} from "matrix-js-sdk/src/models/room"; +import React, { useContext, useEffect } from "react"; +import { Room } from "matrix-js-sdk/src/models/room"; import MatrixClientContext from "../../../contexts/MatrixClientContext"; import BaseCard from "./BaseCard"; import WidgetUtils from "../../../utils/WidgetUtils"; import AppTile from "../elements/AppTile"; -import {_t} from "../../../languageHandler"; -import {useWidgets} from "./RoomSummaryCard"; -import {RightPanelPhases} from "../../../stores/RightPanelStorePhases"; +import { _t } from "../../../languageHandler"; +import { useWidgets } from "./RoomSummaryCard"; +import { RightPanelPhases } from "../../../stores/RightPanelStorePhases"; import defaultDispatcher from "../../../dispatcher/dispatcher"; -import {SetRightPanelPhasePayload} from "../../../dispatcher/payloads/SetRightPanelPhasePayload"; -import {Action} from "../../../dispatcher/actions"; -import WidgetStore from "../../../stores/WidgetStore"; -import {ChevronFace, ContextMenuButton, useContextMenu} from "../../structures/ContextMenu"; +import { SetRightPanelPhasePayload } from "../../../dispatcher/payloads/SetRightPanelPhasePayload"; +import { Action } from "../../../dispatcher/actions"; +import { ChevronFace, ContextMenuButton, useContextMenu } from "../../structures/ContextMenu"; import WidgetContextMenu from "../context_menus/WidgetContextMenu"; +import { Container, WidgetLayoutStore } from "../../../stores/widgets/WidgetLayoutStore"; interface IProps { room: Room; @@ -42,7 +42,7 @@ const WidgetCard: React.FC = ({ room, widgetId, onClose }) => { const apps = useWidgets(room); const app = apps.find(a => a.id === widgetId); - const isPinned = app && WidgetStore.instance.isPinned(room.roomId, app.id); + const isPinned = app && WidgetLayoutStore.instance.isInContainer(room, app, Container.Top); const [menuDisplayed, handle, openMenu, closeMenu] = useContextMenu(); diff --git a/src/stores/WidgetStore.ts b/src/stores/WidgetStore.ts index c9cf0a1c70..2f06dfcb80 100644 --- a/src/stores/WidgetStore.ts +++ b/src/stores/WidgetStore.ts @@ -21,16 +21,12 @@ import { IWidget } from "matrix-widget-api"; import { ActionPayload } from "../dispatcher/payloads"; import { AsyncStoreWithClient } from "./AsyncStoreWithClient"; import defaultDispatcher from "../dispatcher/dispatcher"; -import SettingsStore from "../settings/SettingsStore"; import WidgetEchoStore from "../stores/WidgetEchoStore"; -import RoomViewStore from "../stores/RoomViewStore"; import ActiveWidgetStore from "../stores/ActiveWidgetStore"; import WidgetUtils from "../utils/WidgetUtils"; -import {SettingLevel} from "../settings/SettingLevel"; import {WidgetType} from "../widgets/WidgetType"; import {UPDATE_EVENT} from "./AsyncStore"; import { MatrixClientPeg } from "../MatrixClientPeg"; -import { arrayDiff, arrayHasDiff, arrayUnion } from "../utils/arrays"; interface IState {} @@ -41,15 +37,10 @@ export interface IApp extends IWidget { avatar_url: string; // MSC2765 https://github.com/matrix-org/matrix-doc/pull/2765 } -type PinnedWidgets = Record; - interface IRoomWidgets { widgets: IApp[]; - pinned: PinnedWidgets; } -export const MAX_PINNED = 3; - function widgetUid(app: IApp): string { return `${app.roomId ?? MatrixClientPeg.get().getUserId()}::${app.id}`; } @@ -65,7 +56,6 @@ export default class WidgetStore extends AsyncStoreWithClient { private constructor() { super(defaultDispatcher, {}); - SettingsStore.watchSetting("Widgets.pinned", null, this.onPinnedWidgetsChange); WidgetEchoStore.on("update", this.onWidgetEchoStoreUpdate); } @@ -76,7 +66,6 @@ export default class WidgetStore extends AsyncStoreWithClient { private initRoom(roomId: string) { if (!this.roomMap.has(roomId)) { this.roomMap.set(roomId, { - pinned: {}, // ordered widgets: [], }); } @@ -85,16 +74,6 @@ export default class WidgetStore extends AsyncStoreWithClient { protected async onReady(): Promise { this.matrixClient.on("RoomState.events", this.onRoomStateEvents); this.matrixClient.getRooms().forEach((room: Room) => { - const pinned = SettingsStore.getValue("Widgets.pinned", room.roomId); - - if (pinned || WidgetUtils.getRoomWidgets(room).length) { - this.initRoom(room.roomId); - } - - if (pinned) { - this.getRoom(room.roomId).pinned = pinned; - } - this.loadRoomWidgets(room); }); this.emit(UPDATE_EVENT); @@ -128,7 +107,7 @@ export default class WidgetStore extends AsyncStoreWithClient { private loadRoomWidgets(room: Room) { if (!room) return; - const roomInfo = this.roomMap.get(room.roomId); + const roomInfo = this.roomMap.get(room.roomId) || {}; roomInfo.widgets = []; // first clean out old widgets from the map which originate from this room @@ -138,6 +117,7 @@ export default class WidgetStore extends AsyncStoreWithClient { this.widgetMap.delete(widgetUid(app)); }); + let edited = false; this.generateApps(room).forEach(app => { // Sanity check for https://github.com/vector-im/element-web/issues/15705 const existingApp = this.widgetMap.get(widgetUid(app)); @@ -150,12 +130,16 @@ export default class WidgetStore extends AsyncStoreWithClient { this.widgetMap.set(widgetUid(app), app); roomInfo.widgets.push(app); + edited = true; }); + if (edited && !this.roomMap.has(room.roomId)) { + this.roomMap.set(room.roomId, roomInfo); + } this.emit(room.roomId); } private onRoomStateEvents = (ev: MatrixEvent) => { - if (ev.getType() !== "im.vector.modular.widgets") return; + if (ev.getType() !== "im.vector.modular.widgets") return; // TODO: Support m.widget too const roomId = ev.getRoomId(); this.initRoom(roomId); this.loadRoomWidgets(this.matrixClient.getRoom(roomId)); @@ -166,156 +150,6 @@ export default class WidgetStore extends AsyncStoreWithClient { return this.roomMap.get(roomId); }; - private onPinnedWidgetsChange = (settingName: string, roomId: string) => { - this.initRoom(roomId); - - const pinned: PinnedWidgets = SettingsStore.getValue(settingName, roomId); - - // Sanity check for https://github.com/vector-im/element-web/issues/15705 - const roomInfo = this.getRoom(roomId); - const remappedPinned: PinnedWidgets = {}; - for (const widgetId of Object.keys(pinned)) { - const isPinned = pinned[widgetId]; - if (!roomInfo.widgets?.some(w => w.id === widgetId)) { - console.warn(`Skipping pinned widget update for ${widgetId} in ${roomId} -- wrong room`); - } else { - remappedPinned[widgetId] = isPinned; - } - } - roomInfo.pinned = remappedPinned; - - this.emit(roomId); - this.emit(UPDATE_EVENT); - }; - - public isPinned(roomId: string, widgetId: string) { - return !!this.getPinnedApps(roomId).find(w => w.id === widgetId); - } - - // dev note: we don't need the widgetId on this function, but the contract makes more sense - // when we require it. - public canPin(roomId: string, widgetId: string) { - return this.getPinnedApps(roomId).length < MAX_PINNED; - } - - public pinWidget(roomId: string, widgetId: string) { - const roomInfo = this.getRoom(roomId); - if (!roomInfo) return; - - // When pinning, first confirm all the widgets (Jitsi) which were autopinned so that the order is correct - const autoPinned = this.getPinnedApps(roomId).filter(app => !roomInfo.pinned[app.id]); - autoPinned.forEach(app => { - this.setPinned(roomId, app.id, true); - }); - - this.setPinned(roomId, widgetId, true); - - // Show the apps drawer upon the user pinning a widget - if (RoomViewStore.getRoomId() === roomId) { - defaultDispatcher.dispatch({ - action: "appsDrawer", - show: true, - }); - } - } - - public unpinWidget(roomId: string, widgetId: string) { - this.setPinned(roomId, widgetId, false); - } - - private setPinned(roomId: string, widgetId: string, value: boolean) { - const roomInfo = this.getRoom(roomId); - if (!roomInfo) return; - if (roomInfo.pinned[widgetId] === false && value) { - // delete this before write to maintain the correct object insertion order - delete roomInfo.pinned[widgetId]; - } - roomInfo.pinned[widgetId] = value; - - // Clean up the pinned record - Object.keys(roomInfo).forEach(wId => { - if (!roomInfo.widgets.some(w => w.id === wId) || !roomInfo.pinned[wId]) { - delete roomInfo.pinned[wId]; - } - }); - - SettingsStore.setValue("Widgets.pinned", roomId, SettingLevel.ROOM_ACCOUNT, roomInfo.pinned); - this.emit(roomId); - this.emit(UPDATE_EVENT); - } - - public movePinnedWidget(roomId: string, widgetId: string, delta: 1 | -1) { - // TODO simplify this by changing the storage medium of pinned to an array once the Jitsi default-on goes away - const roomInfo = this.getRoom(roomId); - if (!roomInfo || roomInfo.pinned[widgetId] === false) return; - - const pinnedApps = this.getPinnedApps(roomId).map(app => app.id); - const i = pinnedApps.findIndex(id => id === widgetId); - - if (delta > 0) { - pinnedApps.splice(i, 2, pinnedApps[i + 1], pinnedApps[i]); - } else { - pinnedApps.splice(i - 1, 2, pinnedApps[i], pinnedApps[i - 1]); - } - - const reorderedPinned: IRoomWidgets["pinned"] = {}; - pinnedApps.forEach(id => { - reorderedPinned[id] = true; - }); - Object.keys(roomInfo.pinned).forEach(id => { - if (reorderedPinned[id] === undefined) { - reorderedPinned[id] = roomInfo.pinned[id]; - } - }); - roomInfo.pinned = reorderedPinned; - - SettingsStore.setValue("Widgets.pinned", roomId, SettingLevel.ROOM_ACCOUNT, roomInfo.pinned); - this.emit(roomId); - this.emit(UPDATE_EVENT); - } - - public getPinnedApps(roomId: string): IApp[] { - // returns the apps in the order they were pinned with, up to the maximum - const roomInfo = this.getRoom(roomId); - if (!roomInfo) return []; - - // Show Jitsi widgets even if the user already had the maximum pinned, instead of their latest pinned, - // except if the user already explicitly unpinned the Jitsi widget - const priorityWidget = roomInfo.widgets.find(widget => { - return roomInfo.pinned[widget.id] === undefined && WidgetType.JITSI.matches(widget.type); - }); - - const order = Object.keys(roomInfo.pinned).filter(k => roomInfo.pinned[k]); - const apps = order - .map(wId => Array.from(this.widgetMap.values()) - .find(w2 => w2.roomId === roomId && w2.id === wId)) - .filter(Boolean) - .slice(0, priorityWidget ? MAX_PINNED - 1 : MAX_PINNED); - if (priorityWidget) { - apps.push(priorityWidget); - } - - // Sanity check for https://github.com/vector-im/element-web/issues/15705 - // We union the app IDs the above generated with the roomInfo's known widgets to - // get a list of IDs which both exist. We then diff that against the generated app - // IDs above to ensure that all of the app IDs are captured by the union with the - // room - if we grabbed a widget that wasn't part of the roomInfo's list, it wouldn't - // be in the union and thus result in a diff. - const appIds = apps.map(a => widgetUid(a)); - const roomAppIds = roomInfo.widgets.map(a => widgetUid(a)); - const roomAppIdsUnion = arrayUnion(appIds, roomAppIds); - const missingSomeApps = arrayHasDiff(roomAppIdsUnion, appIds); - if (missingSomeApps) { - const diff = arrayDiff(roomAppIdsUnion, appIds); - console.warn( - `${roomId} appears to have a conflict for which widgets belong to it. ` + - `Widget UIDs are: `, [...diff.added, ...diff.removed], - ); - } - - return apps; - } - public getApps(roomId: string): IApp[] { const roomInfo = this.getRoom(roomId); return roomInfo?.widgets || []; diff --git a/src/stores/widgets/WidgetLayoutStore.ts b/src/stores/widgets/WidgetLayoutStore.ts index 12051d35bc..4065dd2469 100644 --- a/src/stores/widgets/WidgetLayoutStore.ts +++ b/src/stores/widgets/WidgetLayoutStore.ts @@ -23,6 +23,8 @@ import defaultDispatcher from "../../dispatcher/dispatcher"; import { ReadyWatchingStore } from "../ReadyWatchingStore"; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; import { SettingLevel } from "../../settings/SettingLevel"; +import { arrayFastClone } from "../../utils/arrays"; +import { UPDATE_EVENT } from "../AsyncStore"; export const WIDGET_LAYOUT_EVENT_TYPE = "io.element.widgets.layout"; @@ -79,7 +81,7 @@ interface ILayoutSettings extends ILayoutStateEvent { } // Dev note: "Pinned" widgets are ones in the top container. -const MAX_PINNED = 3; +export const MAX_PINNED = 3; // These two are whole percentages and don't really mean anything. Later values will decide // minimum, but these help determine proportions during our calculations here. In fact, these @@ -126,19 +128,19 @@ export class WidgetLayoutStore extends ReadyWatchingStore { this.matrixClient.on("RoomState.events", this.updateRoomFromState); SettingsStore.watchSetting("Widgets.pinned", null, this.updateFromSettings); SettingsStore.watchSetting("Widgets.layout", null, this.updateFromSettings); - // TODO: Register WidgetStore listener + WidgetStore.instance.on(UPDATE_EVENT, this.updateAllRooms); } protected async onNotReady(): Promise { this.byRoom = {}; } - private updateAllRooms() { + private updateAllRooms = () => { this.byRoom = {}; for (const room of this.matrixClient.getVisibleRooms()) { this.recalculateRoom(room); } - } + }; private updateRoomFromState = (ev: MatrixEvent) => { if (ev.getType() !== WIDGET_LAYOUT_EVENT_TYPE) return; @@ -222,8 +224,8 @@ export class WidgetLayoutStore extends ReadyWatchingStore { const defaultA = WidgetType.JITSI.matches(a.type) ? Number.MIN_SAFE_INTEGER : Number.MAX_SAFE_INTEGER; const defaultB = WidgetType.JITSI.matches(b.type) ? Number.MIN_SAFE_INTEGER : Number.MAX_SAFE_INTEGER; - const orderA = defaultNumber(userLayoutA, defaultNumber(layoutA?.index, defaultA)); - const orderB = defaultNumber(userLayoutB, defaultNumber(layoutB?.index, defaultB)); + const orderA = defaultNumber(userLayoutA?.index, defaultNumber(layoutA?.index, defaultA)); + const orderB = defaultNumber(userLayoutB?.index, defaultNumber(layoutB?.index, defaultB)); if (orderA === orderB) { // We just need a tiebreak @@ -308,6 +310,14 @@ export class WidgetLayoutStore extends ReadyWatchingStore { return this.byRoom[room.roomId]?.[container]?.ordered || []; } + public isInContainer(room: Room, widget: IApp, container: Container): boolean { + return this.getContainerWidgets(room, container).some(w => w.id === widget.id); + } + + public canAddToContainer(room: Room, container: Container): boolean { + return this.getContainerWidgets(room, container).length < MAX_PINNED; + } + public getResizerDistributions(room: Room, container: Container): string[] { // yes, string. let distributions = this.byRoom[room.roomId]?.[container]?.distributions; if (!distributions || distributions.length < 2) return []; @@ -335,6 +345,7 @@ export class WidgetLayoutStore extends ReadyWatchingStore { const localLayout = {}; widgets.forEach((w, i) => { localLayout[w.id] = { + container: container, width: numbers[i], index: i, height: this.byRoom[room.roomId]?.[container]?.height || MIN_WIDGET_HEIGHT_PCT, @@ -353,6 +364,7 @@ export class WidgetLayoutStore extends ReadyWatchingStore { const localLayout = {}; widgets.forEach((w, i) => { localLayout[w.id] = { + container: container, width: widths[i], index: i, height: height, @@ -361,7 +373,66 @@ export class WidgetLayoutStore extends ReadyWatchingStore { this.updateUserLayout(room, localLayout); } + public moveWithinContainer(room: Room, container: Container, widget: IApp, delta: number) { + const widgets = arrayFastClone(this.getContainerWidgets(room, container)); + const currentIdx = widgets.findIndex(w => w.id === widget.id); + if (currentIdx < 0) return; // no change needed + + widgets.splice(currentIdx, 1); // remove existing widget + const newIdx = clamp(currentIdx + delta, 0, widgets.length); + widgets.splice(newIdx, 0, widget); + + const widths = this.byRoom[room.roomId]?.[container]?.distributions; + const height = this.byRoom[room.roomId]?.[container]?.height; + const localLayout = {}; + widgets.forEach((w, i) => { + localLayout[w.id] = { + container: container, + width: widths[i], + index: i, + height: height, + }; + }); + this.updateUserLayout(room, localLayout); + } + + public moveToContainer(room: Room, widget: IApp, toContainer: Container) { + const allWidgets = this.getAllWidgets(room); + if (!allWidgets.some(([w])=> w.id === widget.id)) return; // invalid + this.updateUserLayout(room, {[widget.id]:{container: toContainer}}); + } + + private getAllWidgets(room: Room): [IApp, Container][] { + const containers = this.byRoom[room.roomId]; + if (!containers) return []; + + const ret = []; + for (const container of Object.keys(containers)) { + const widgets = containers[container].ordered; + for (const widget of widgets) { + ret.push([widget, container]); + } + } + return ret; + } + private updateUserLayout(room: Room, newLayout: IWidgetLayouts) { + // Polyfill any missing widgets + const allWidgets = this.getAllWidgets(room); + for (const [widget, container] of allWidgets) { + const containerWidgets = this.getContainerWidgets(room, container); + const idx = containerWidgets.findIndex(w => w.id === widget.id); + const widths = this.byRoom[room.roomId]?.[container]?.distributions; + if (!newLayout[widget.id]) { + newLayout[widget.id] = { + container: container, + index: idx, + height: this.byRoom[room.roomId]?.[container]?.height, + width: widths?.[idx], + }; + } + } + const layoutEv = room.currentState.getStateEvents(WIDGET_LAYOUT_EVENT_TYPE, ""); SettingsStore.setValue("Widgets.layout", room.roomId, SettingLevel.ROOM_ACCOUNT, { overrides: layoutEv?.getId(), From 7ff76b250010b6c71a456895452a0ad1fd31d568 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 18 Jan 2021 20:28:09 -0700 Subject: [PATCH 204/231] Don't forget to run cleanup --- src/stores/widgets/WidgetLayoutStore.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/stores/widgets/WidgetLayoutStore.ts b/src/stores/widgets/WidgetLayoutStore.ts index 4065dd2469..94d77df78b 100644 --- a/src/stores/widgets/WidgetLayoutStore.ts +++ b/src/stores/widgets/WidgetLayoutStore.ts @@ -103,6 +103,9 @@ export class WidgetLayoutStore extends ReadyWatchingStore { }; } = {}; + private pinnedRef: string; + private layoutRef: string; + private constructor() { super(defaultDispatcher); } @@ -126,13 +129,17 @@ export class WidgetLayoutStore extends ReadyWatchingStore { this.updateAllRooms(); this.matrixClient.on("RoomState.events", this.updateRoomFromState); - SettingsStore.watchSetting("Widgets.pinned", null, this.updateFromSettings); - SettingsStore.watchSetting("Widgets.layout", null, this.updateFromSettings); + this.pinnedRef = SettingsStore.watchSetting("Widgets.pinned", null, this.updateFromSettings); + this.layoutRef = SettingsStore.watchSetting("Widgets.layout", null, this.updateFromSettings); WidgetStore.instance.on(UPDATE_EVENT, this.updateAllRooms); } protected async onNotReady(): Promise { this.byRoom = {}; + + SettingsStore.unwatchSetting(this.pinnedRef); + SettingsStore.unwatchSetting(this.layoutRef); + WidgetStore.instance.off(UPDATE_EVENT, this.updateAllRooms); } private updateAllRooms = () => { From 5c393cc2d0a3f40886132784f92264902d22715c Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 18 Jan 2021 20:29:51 -0700 Subject: [PATCH 205/231] Add in some local echo support to make changes appear faster --- src/stores/widgets/WidgetLayoutStore.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/stores/widgets/WidgetLayoutStore.ts b/src/stores/widgets/WidgetLayoutStore.ts index 94d77df78b..7d695578cd 100644 --- a/src/stores/widgets/WidgetLayoutStore.ts +++ b/src/stores/widgets/WidgetLayoutStore.ts @@ -444,7 +444,8 @@ export class WidgetLayoutStore extends ReadyWatchingStore { SettingsStore.setValue("Widgets.layout", room.roomId, SettingLevel.ROOM_ACCOUNT, { overrides: layoutEv?.getId(), widgets: newLayout, - }); + }).catch(() => this.recalculateRoom(room)); + this.recalculateRoom(room); // call to try local echo on changes (the catch above undoes any errors) } } From 04d1f5dd28948be4bcca1b14e30bb5b6a5d04baa Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 18 Jan 2021 20:42:21 -0700 Subject: [PATCH 206/231] Implement a "Copy my layout to the room" button --- .../views/right_panel/RoomSummaryCard.tsx | 11 +++++++- src/i18n/strings/en_EN.json | 1 + src/stores/widgets/WidgetLayoutStore.ts | 26 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/components/views/right_panel/RoomSummaryCard.tsx b/src/components/views/right_panel/RoomSummaryCard.tsx index f405cde11d..00ee1945d8 100644 --- a/src/components/views/right_panel/RoomSummaryCard.tsx +++ b/src/components/views/right_panel/RoomSummaryCard.tsx @@ -186,9 +186,18 @@ const AppsSection: React.FC = ({ room }) => { } }; + let copyLayoutBtn = null; + if (apps.length > 0 && WidgetLayoutStore.instance.canCopyLayoutToRoom(room)) { + copyLayoutBtn = ( + WidgetLayoutStore.instance.copyLayoutToRoom(room)}> + { _t("Set my room layout for everyone") } + + ); + } + return { apps.map(app => ) } - + { copyLayoutBtn } { apps.length > 0 ? _t("Edit widgets, bridges & bots") : _t("Add widgets, bridges & bots") } diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 2dbb6610f5..356de3730a 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -1636,6 +1636,7 @@ "Unpin": "Unpin", "Unpin a widget to view it in this panel": "Unpin a widget to view it in this panel", "Options": "Options", + "Set my room layout for everyone": "Set my room layout for everyone", "Widgets": "Widgets", "Edit widgets, bridges & bots": "Edit widgets, bridges & bots", "Add widgets, bridges & bots": "Add widgets, bridges & bots", diff --git a/src/stores/widgets/WidgetLayoutStore.ts b/src/stores/widgets/WidgetLayoutStore.ts index 7d695578cd..b9350328f6 100644 --- a/src/stores/widgets/WidgetLayoutStore.ts +++ b/src/stores/widgets/WidgetLayoutStore.ts @@ -409,6 +409,32 @@ export class WidgetLayoutStore extends ReadyWatchingStore { this.updateUserLayout(room, {[widget.id]:{container: toContainer}}); } + public canCopyLayoutToRoom(room: Room): boolean { + if (!this.matrixClient) return false; // not ready yet + return room.currentState.maySendStateEvent(WIDGET_LAYOUT_EVENT_TYPE, this.matrixClient.getUserId()); + } + + public copyLayoutToRoom(room: Room) { + const allWidgets = this.getAllWidgets(room); + const evContent: ILayoutStateEvent = {widgets: {}}; + for (const [widget, container] of allWidgets) { + evContent.widgets[widget.id] = {container}; + if (container === Container.Top) { + const containerWidgets = this.getContainerWidgets(room, container); + const idx = containerWidgets.findIndex(w => w.id === widget.id); + const widths = this.byRoom[room.roomId]?.[container]?.distributions; + const height = this.byRoom[room.roomId]?.[container]?.height; + evContent.widgets[widget.id] = { + ...evContent.widgets[widget.id], + height: height ? Math.round(height) : null, + width: widths[idx] ? Math.round(widths[idx]) : null, + index: idx, + }; + } + } + this.matrixClient.sendStateEvent(room.roomId, WIDGET_LAYOUT_EVENT_TYPE, evContent, ""); + } + private getAllWidgets(room: Room): [IApp, Container][] { const containers = this.byRoom[room.roomId]; if (!containers) return []; From 6227d3c183d3c589bfc9381a8e6a6a06ba2cffc2 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 18 Jan 2021 20:53:15 -0700 Subject: [PATCH 207/231] Appease the linters --- src/components/views/rooms/AppsDrawer.js | 2 +- src/hooks/useSettings.ts | 6 +++--- src/stores/AsyncStoreWithClient.ts | 4 ++-- src/stores/room-list/RoomListStore.ts | 2 +- src/stores/widgets/WidgetLayoutStore.ts | 10 ++++------ 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/components/views/rooms/AppsDrawer.js b/src/components/views/rooms/AppsDrawer.js index 5efcefc4bc..4aa9efa3fd 100644 --- a/src/components/views/rooms/AppsDrawer.js +++ b/src/components/views/rooms/AppsDrawer.js @@ -287,7 +287,7 @@ const PersistentVResizer = ({ const [height, setHeight] = useStateCallback(defaultHeight, newHeight => { newHeight = percentageOf(newHeight, minHeight, maxHeight) * 100; - WidgetLayoutStore.instance.setContainerHeight(room, Container.Top, newHeight) + WidgetLayoutStore.instance.setContainerHeight(room, Container.Top, newHeight); }); return { - const [value, setValue] = useState(SettingsStore.getValue(settingName, roomId, excludeDefault)); +export const useSettingValue = (settingName: string, roomId: string = null, excludeDefault = false) => { + const [value, setValue] = useState(SettingsStore.getValue(settingName, roomId, excludeDefault)); useEffect(() => { const ref = SettingsStore.watchSetting(settingName, roomId, () => { - setValue(SettingsStore.getValue(settingName, roomId, excludeDefault)); + setValue(SettingsStore.getValue(settingName, roomId, excludeDefault)); }); // clean-up return () => { diff --git a/src/stores/AsyncStoreWithClient.ts b/src/stores/AsyncStoreWithClient.ts index 3050555ad4..38e709d8c2 100644 --- a/src/stores/AsyncStoreWithClient.ts +++ b/src/stores/AsyncStoreWithClient.ts @@ -21,13 +21,13 @@ import { Dispatcher } from "flux"; import { ReadyWatchingStore } from "./ReadyWatchingStore"; export abstract class AsyncStoreWithClient extends AsyncStore { - private readyStore: ReadyWatchingStore; + protected readyStore: ReadyWatchingStore; protected constructor(dispatcher: Dispatcher, initialState: T = {}) { super(dispatcher, initialState); // Create an anonymous class to avoid code duplication - const asyncStore = this; + const asyncStore = this; // eslint-disable-line @typescript-eslint/no-this-alias this.readyStore = new (class extends ReadyWatchingStore { public get mxClient(): MatrixClient { return this.matrixClient; diff --git a/src/stores/room-list/RoomListStore.ts b/src/stores/room-list/RoomListStore.ts index b2fe630760..cc9e00d29b 100644 --- a/src/stores/room-list/RoomListStore.ts +++ b/src/stores/room-list/RoomListStore.ts @@ -114,7 +114,7 @@ export class RoomListStoreClass extends AsyncStoreWithClient { // Public for test usage. Do not call this. public async makeReady(forcedClient?: MatrixClient) { if (forcedClient) { - super.matrixClient = forcedClient; + super.readyStore.matrixClient = forcedClient; } this.checkLoggingEnabled(); diff --git a/src/stores/widgets/WidgetLayoutStore.ts b/src/stores/widgets/WidgetLayoutStore.ts index b9350328f6..9742712fcf 100644 --- a/src/stores/widgets/WidgetLayoutStore.ts +++ b/src/stores/widgets/WidgetLayoutStore.ts @@ -155,7 +155,7 @@ export class WidgetLayoutStore extends ReadyWatchingStore { if (room) this.recalculateRoom(room); }; - private updateFromSettings = (settingName: string, roomId: string, /* and other stuff */) => { + private updateFromSettings = (settingName: string, roomId: string /* and other stuff */) => { if (roomId) { const room = this.matrixClient.getRoom(roomId); if (room) this.recalculateRoom(room); @@ -266,10 +266,6 @@ export class WidgetLayoutStore extends ReadyWatchingStore { maxHeight = Math.max(maxHeight, clamp(h, MIN_WIDGET_HEIGHT_PCT, 100)); } } - let remainingWidth = 100; - for (const width of widths) { - remainingWidth -= width; - } if (doAutobalance) { for (let i = 0; i < widths.length; i++) { widths[i] = 100 / widths.length; @@ -406,7 +402,9 @@ export class WidgetLayoutStore extends ReadyWatchingStore { public moveToContainer(room: Room, widget: IApp, toContainer: Container) { const allWidgets = this.getAllWidgets(room); if (!allWidgets.some(([w])=> w.id === widget.id)) return; // invalid - this.updateUserLayout(room, {[widget.id]:{container: toContainer}}); + this.updateUserLayout(room, { + [widget.id]: {container: toContainer}, + }); } public canCopyLayoutToRoom(room: Room): boolean { From 6d770cb4d126e13c63f8d994c0a0ae3826fbabaf Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 18 Jan 2021 21:00:47 -0700 Subject: [PATCH 208/231] Appease the linter 2 --- src/stores/ReadyWatchingStore.ts | 4 ++++ src/stores/room-list/RoomListStore.ts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/stores/ReadyWatchingStore.ts b/src/stores/ReadyWatchingStore.ts index 9a28fe75fa..4bb577c784 100644 --- a/src/stores/ReadyWatchingStore.ts +++ b/src/stores/ReadyWatchingStore.ts @@ -42,6 +42,10 @@ export abstract class ReadyWatchingStore extends EventEmitter implements IDestro return this.matrixClient; // for external readonly access } + public useUnitTestClient(cli: MatrixClient) { + this.matrixClient = cli; + } + public destroy() { this.dispatcher.unregister(this.dispatcherRef); } diff --git a/src/stores/room-list/RoomListStore.ts b/src/stores/room-list/RoomListStore.ts index cc9e00d29b..febd9aad9b 100644 --- a/src/stores/room-list/RoomListStore.ts +++ b/src/stores/room-list/RoomListStore.ts @@ -114,7 +114,7 @@ export class RoomListStoreClass extends AsyncStoreWithClient { // Public for test usage. Do not call this. public async makeReady(forcedClient?: MatrixClient) { if (forcedClient) { - super.readyStore.matrixClient = forcedClient; + super.readyStore.useUnitTestClient(forcedClient); } this.checkLoggingEnabled(); From ab51404421f9bb060962f200b0af28a0afb34e54 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Mon, 18 Jan 2021 21:07:44 -0700 Subject: [PATCH 209/231] Appease the tests? --- src/stores/room-list/RoomListStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/room-list/RoomListStore.ts b/src/stores/room-list/RoomListStore.ts index febd9aad9b..8c17da06fe 100644 --- a/src/stores/room-list/RoomListStore.ts +++ b/src/stores/room-list/RoomListStore.ts @@ -114,7 +114,7 @@ export class RoomListStoreClass extends AsyncStoreWithClient { // Public for test usage. Do not call this. public async makeReady(forcedClient?: MatrixClient) { if (forcedClient) { - super.readyStore.useUnitTestClient(forcedClient); + this.readyStore.useUnitTestClient(forcedClient); } this.checkLoggingEnabled(); From f06aa00240d59d4d15b9cf4d2736f2058d5133bc Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 19 Jan 2021 00:22:02 -0700 Subject: [PATCH 210/231] Fix percentage calculation --- src/utils/numbers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/numbers.ts b/src/utils/numbers.ts index c8b9e7248f..6ba19d0bef 100644 --- a/src/utils/numbers.ts +++ b/src/utils/numbers.ts @@ -38,5 +38,5 @@ export function percentageWithin(pct: number, min: number, max: number): number } export function percentageOf(val: number, min: number, max: number): number { - return (val - min) / max; + return (val - min) / (max - min); } From 0359a977befde8850100b5ff4968b21453f56046 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 19 Jan 2021 07:19:39 -0700 Subject: [PATCH 211/231] Update docs/widget-layouts.md Co-authored-by: David Baker --- docs/widget-layouts.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/widget-layouts.md b/docs/widget-layouts.md index e49f2a2e60..215b026b0f 100644 --- a/docs/widget-layouts.md +++ b/docs/widget-layouts.md @@ -27,7 +27,7 @@ and interpret the other options differently. This is the "App Drawer" or any pinned widgets in a room. This is by far the most versatile container though does introduce potential usability issues upon members of the room (widgets take up space and -therefore less messages can be shown). +therefore fewer messages can be shown). The `index` for a widget determines which order the widgets show up in from left to right. Widgets without an `index` will show up as the rightmost widgets. Tiebreaks (same `index` or multiple defined @@ -58,4 +58,3 @@ container will be put in this container instead. Putting a widget in the right c automatically show it - it only mentions that widgets should not be in another container. The behaviour of this container may change in the future. - From a22049a67969cf1658be64193b0e6beb06dd025f Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 19 Jan 2021 14:36:21 +0000 Subject: [PATCH 212/231] Use const / let instead of var --- scripts/reskindex.js | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/scripts/reskindex.js b/scripts/reskindex.js index 9fb0e1a7c0..a57fd9cbe3 100755 --- a/scripts/reskindex.js +++ b/scripts/reskindex.js @@ -1,29 +1,29 @@ #!/usr/bin/env node -var fs = require('fs'); -var path = require('path'); -var glob = require('glob'); -var args = require('minimist')(process.argv); -var chokidar = require('chokidar'); +const fs = require('fs'); +const path = require('path'); +const glob = require('glob'); +const args = require('minimist')(process.argv); +const chokidar = require('chokidar'); -var componentIndex = path.join('src', 'component-index.js'); -var componentIndexTmp = componentIndex+".tmp"; -var componentsDir = path.join('src', 'components'); -var componentJsGlob = '**/*.js'; -var componentTsGlob = '**/*.tsx'; -var prevFiles = []; +const componentIndex = path.join('src', 'component-index.js'); +const componentIndexTmp = componentIndex+".tmp"; +const componentsDir = path.join('src', 'components'); +const componentJsGlob = '**/*.js'; +const componentTsGlob = '**/*.tsx'; +let prevFiles = []; function reskindex() { - var jsFiles = glob.sync(componentJsGlob, {cwd: componentsDir}).sort(); - var tsFiles = glob.sync(componentTsGlob, {cwd: componentsDir}).sort(); - var files = [...tsFiles, ...jsFiles]; + const jsFiles = glob.sync(componentJsGlob, {cwd: componentsDir}).sort(); + const tsFiles = glob.sync(componentTsGlob, {cwd: componentsDir}).sort(); + const files = [...tsFiles, ...jsFiles]; if (!filesHaveChanged(files, prevFiles)) { return; } prevFiles = files; - var header = args.h || args.header; + const header = args.h || args.header; - var strm = fs.createWriteStream(componentIndexTmp); + const strm = fs.createWriteStream(componentIndexTmp); if (header) { strm.write(fs.readFileSync(header)); @@ -38,11 +38,11 @@ function reskindex() { strm.write(" */\n\n"); strm.write("let components = {};\n"); - for (var i = 0; i < files.length; ++i) { - var file = files[i].replace('.js', '').replace('.tsx', ''); + for (let i = 0; i < files.length; ++i) { + const file = files[i].replace('.js', '').replace('.tsx', ''); - var moduleName = (file.replace(/\//g, '.')); - var importName = moduleName.replace(/\./g, "$"); + const moduleName = (file.replace(/\//g, '.')); + const importName = moduleName.replace(/\./g, "$"); strm.write("import " + importName + " from './components/" + file + "';\n"); strm.write(importName + " && (components['"+moduleName+"'] = " + importName + ");"); @@ -67,7 +67,7 @@ function filesHaveChanged(files, prevFiles) { return true; } // Check for name changes - for (var i = 0; i < files.length; i++) { + for (const i = 0; i < files.length; i++) { if (prevFiles[i] !== files[i]) { return true; } @@ -81,7 +81,7 @@ if (!args.w) { return; } -var watchDebouncer = null; +let watchDebouncer = null; chokidar.watch(path.join(componentsDir, componentJsGlob)).on('all', (event, path) => { if (path === componentIndex) return; if (watchDebouncer) clearTimeout(watchDebouncer); From 0e137bd0f60393d1bf3d41495beb4cf930d242c6 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 19 Jan 2021 14:42:10 +0000 Subject: [PATCH 213/231] Fix code style --- scripts/reskindex.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/reskindex.js b/scripts/reskindex.js index a57fd9cbe3..e3ebefd78d 100755 --- a/scripts/reskindex.js +++ b/scripts/reskindex.js @@ -53,7 +53,7 @@ function reskindex() { strm.write("export {components};\n"); strm.end(); fs.rename(componentIndexTmp, componentIndex, function(err) { - if(err) { + if (err) { console.error("Error moving new index into place: " + err); } else { console.log('Reskindex: completed'); From 4e5f25206a416177fdc8e3ff0a7bb4dfa7ef8e11 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 19 Jan 2021 14:45:03 +0000 Subject: [PATCH 214/231] Ensure component index has been written before renaming This ensures we correctly wait for `component-index.js.tmp` to be written to disk before trying to rename into place. This fixes an issue where stray temp files were being strewn about the repos after renaming failures. --- scripts/reskindex.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/scripts/reskindex.js b/scripts/reskindex.js index e3ebefd78d..1770073aad 100755 --- a/scripts/reskindex.js +++ b/scripts/reskindex.js @@ -2,6 +2,7 @@ const fs = require('fs'); const path = require('path'); const glob = require('glob'); +const util = require('util'); const args = require('minimist')(process.argv); const chokidar = require('chokidar'); @@ -12,7 +13,7 @@ const componentJsGlob = '**/*.js'; const componentTsGlob = '**/*.tsx'; let prevFiles = []; -function reskindex() { +async function reskindex() { const jsFiles = glob.sync(componentJsGlob, {cwd: componentsDir}).sort(); const tsFiles = glob.sync(componentTsGlob, {cwd: componentsDir}).sort(); const files = [...tsFiles, ...jsFiles]; @@ -51,7 +52,8 @@ function reskindex() { } strm.write("export {components};\n"); - strm.end(); + // Ensure the file has been fully written to disk before proceeding + await util.promisify(strm.end); fs.rename(componentIndexTmp, componentIndex, function(err) { if (err) { console.error("Error moving new index into place: " + err); From 6985e8f41fac7394fb62f42297a1e7d19c713834 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Tue, 19 Jan 2021 10:00:45 -0700 Subject: [PATCH 215/231] Update documentation words --- docs/widget-layouts.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/widget-layouts.md b/docs/widget-layouts.md index 215b026b0f..e7f72e2001 100644 --- a/docs/widget-layouts.md +++ b/docs/widget-layouts.md @@ -32,13 +32,13 @@ therefore fewer messages can be shown). The `index` for a widget determines which order the widgets show up in from left to right. Widgets without an `index` will show up as the rightmost widgets. Tiebreaks (same `index` or multiple defined without an `index`) are resolved by comparing widget IDs. A maximum of 3 widgets can be in the top -container - any which exceed this will be ignored. Smaller numbers represent leftmost widgets. +container - any which exceed this will be ignored (placed into the `right` container). Smaller numbers +represent leftmost widgets. The `width` is relative width within the container in percentage points. This will be clamped to a -range of 0-100 (inclusive). The rightmost widget will have its percentage adjusted to fill the -container appropriately, shrinking and growing if required. For example, if three widgets are in the -top container at 40% width each then the 3rd widget will be shrunk to 20% because 120% > 100%. -Similarly, if all three widgets were set to 10% width each then the 3rd widget would grow to be 80%. +range of 0-100 (inclusive). The widgets will attempt to scale to relative proportions when more than +100% space is allocated. For example, if 3 widgets are defined at 40% width each then the client will +attempt to show them at 33% width each. Note that the client may impose minimum widths on the widgets, such as a 10% minimum to avoid pinning hidden widgets. In general, widgets defined in the 30-70% range each will be free of these restrictions. From 016140670b78439708ca93829bfb27756b12a558 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 19 Jan 2021 17:58:17 +0000 Subject: [PATCH 216/231] Fix let binding in reskindex.js --- scripts/reskindex.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/reskindex.js b/scripts/reskindex.js index 1770073aad..12310b77c1 100755 --- a/scripts/reskindex.js +++ b/scripts/reskindex.js @@ -69,7 +69,7 @@ function filesHaveChanged(files, prevFiles) { return true; } // Check for name changes - for (const i = 0; i < files.length; i++) { + for (let i = 0; i < files.length; i++) { if (prevFiles[i] !== files[i]) { return true; } From 3115c4f3f3ed0b2f1d82c5882dcce007b188c206 Mon Sep 17 00:00:00 2001 From: "J. Ryan Stinnett" Date: Tue, 19 Jan 2021 17:59:30 +0000 Subject: [PATCH 217/231] Show only preview buttons in directory for guest users This aligns the room directory with the rest of Element Web so that it does not allow guest users to join rooms. Instead, we show preview buttons (even when the preview might not actually happen). Fixes https://github.com/vector-im/element-web/issues/16213 --- src/components/structures/RoomDirectory.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/structures/RoomDirectory.js b/src/components/structures/RoomDirectory.js index e3323b05fa..9ddacaf829 100644 --- a/src/components/structures/RoomDirectory.js +++ b/src/components/structures/RoomDirectory.js @@ -487,7 +487,11 @@ export default class RoomDirectory extends React.Component { let previewButton; let joinOrViewButton; - if (room.world_readable && !hasJoinedRoom) { + // Element Web currently does not allow guests to join rooms, so we + // instead show them preview buttons for all rooms. If the room is not + // world readable, a modal will appear asking you to register first. If + // it is readable, the preview appears as normal. + if (!hasJoinedRoom && (room.world_readable || isGuest)) { previewButton = ( this.onPreviewClick(ev, room)}>{_t("Preview")} ); @@ -496,7 +500,7 @@ export default class RoomDirectory extends React.Component { joinOrViewButton = ( this.onViewClick(ev, room)}>{_t("View")} ); - } else if (!isGuest || room.guest_can_join) { + } else if (!isGuest) { joinOrViewButton = ( this.onJoinClick(ev, room)}>{_t("Join")} ); From f8fe454c595d8e8e10b0fbabbdfa2cee08b03080 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 20 Jan 2021 14:42:24 -0700 Subject: [PATCH 218/231] Replace looping resizer with actual math --- src/stores/widgets/WidgetLayoutStore.ts | 43 +++++++++++++++++-------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/stores/widgets/WidgetLayoutStore.ts b/src/stores/widgets/WidgetLayoutStore.ts index 9742712fcf..d54cb36a6c 100644 --- a/src/stores/widgets/WidgetLayoutStore.ts +++ b/src/stores/widgets/WidgetLayoutStore.ts @@ -270,20 +270,37 @@ export class WidgetLayoutStore extends ReadyWatchingStore { for (let i = 0; i < widths.length; i++) { widths[i] = 100 / widths.length; } - } + } else { + // If we're not autobalancing then it means that we're trying to make + // sure that widgets make up exactly 100% of space (not over, not under) + const difference = sum(...widths) - 100; // positive = over, negative = under + if (difference < 0) { + // For a deficit we just fill everything in equally + for (let i = 0; i < widths.length; i++) { + widths[i] += Math.abs(difference) / widths.length; + } + } else if (difference > 0) { + // When we're over, we try to scale all the widgets within range first. + // We clamp values to try and keep ourselves sane and within range. + for (let i = 0; i < widths.length; i++) { + widths[i] = clamp(widths[i] - (difference / widths.length), MIN_WIDGET_WIDTH_PCT, 100); + } - // TODO: There is probably a more efficient way to do this. - // All we're doing is making sure that our widths sum up to 100 and take - // any excess width off all widgets equally to keep the proportions. - let toReclaim = sum(...widths) - 100; - while (toReclaim > 0 && topWidgets.length > 0) { - for (let i = 0; i < widths.length; i++) { - if (toReclaim <= 0) break; - const w = widths[i]; - const adjusted = clamp(w - 1, MIN_WIDGET_WIDTH_PCT, 100); - if (adjusted !== w) { - toReclaim -= 1; - widths[i] = adjusted; + // If we're still over, find the widgets which have more width than the minimum + // and balance them out until we're at 100%. This should keep us as close as possible + // to the intended distributions. + // + // Note: if we ever decide to set a minimum which is larger than 100%/MAX_WIDGETS then + // we probably have other issues - this code assumes we don't do that. + const toReclaim = sum(...widths) - 100; + if (toReclaim > 0) { + const largeIndices = widths + .map((v, i) => ([i, v])) + .filter(p => p[1] > MIN_WIDGET_WIDTH_PCT) + .map(p => p[0]); + for (const idx of largeIndices) { + widths[idx] -= toReclaim / largeIndices.length; + } } } } From 29780d902cc62a863083ccc8eef6f1d162796721 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 20 Jan 2021 14:44:30 -0700 Subject: [PATCH 219/231] Try to reduce WidgetStore causing downstream problems --- src/stores/WidgetStore.ts | 6 +++--- src/stores/widgets/WidgetLayoutStore.ts | 13 +++++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/stores/WidgetStore.ts b/src/stores/WidgetStore.ts index 2f06dfcb80..c53c85dfd5 100644 --- a/src/stores/WidgetStore.ts +++ b/src/stores/WidgetStore.ts @@ -76,7 +76,7 @@ export default class WidgetStore extends AsyncStoreWithClient { this.matrixClient.getRooms().forEach((room: Room) => { this.loadRoomWidgets(room); }); - this.emit(UPDATE_EVENT); + this.emit(UPDATE_EVENT, null); // emit for all rooms } protected async onNotReady(): Promise { @@ -94,7 +94,7 @@ export default class WidgetStore extends AsyncStoreWithClient { private onWidgetEchoStoreUpdate = (roomId: string, widgetId: string) => { this.initRoom(roomId); this.loadRoomWidgets(this.matrixClient.getRoom(roomId)); - this.emit(UPDATE_EVENT); + this.emit(UPDATE_EVENT, roomId); }; private generateApps(room: Room): IApp[] { @@ -143,7 +143,7 @@ export default class WidgetStore extends AsyncStoreWithClient { const roomId = ev.getRoomId(); this.initRoom(roomId); this.loadRoomWidgets(this.matrixClient.getRoom(roomId)); - this.emit(UPDATE_EVENT); + this.emit(UPDATE_EVENT, roomId); }; public getRoom = (roomId: string) => { diff --git a/src/stores/widgets/WidgetLayoutStore.ts b/src/stores/widgets/WidgetLayoutStore.ts index d54cb36a6c..bce684241d 100644 --- a/src/stores/widgets/WidgetLayoutStore.ts +++ b/src/stores/widgets/WidgetLayoutStore.ts @@ -131,7 +131,7 @@ export class WidgetLayoutStore extends ReadyWatchingStore { this.matrixClient.on("RoomState.events", this.updateRoomFromState); this.pinnedRef = SettingsStore.watchSetting("Widgets.pinned", null, this.updateFromSettings); this.layoutRef = SettingsStore.watchSetting("Widgets.layout", null, this.updateFromSettings); - WidgetStore.instance.on(UPDATE_EVENT, this.updateAllRooms); + WidgetStore.instance.on(UPDATE_EVENT, this.updateFromWidgetStore); } protected async onNotReady(): Promise { @@ -139,7 +139,7 @@ export class WidgetLayoutStore extends ReadyWatchingStore { SettingsStore.unwatchSetting(this.pinnedRef); SettingsStore.unwatchSetting(this.layoutRef); - WidgetStore.instance.off(UPDATE_EVENT, this.updateAllRooms); + WidgetStore.instance.off(UPDATE_EVENT, this.updateFromWidgetStore); } private updateAllRooms = () => { @@ -149,6 +149,15 @@ export class WidgetLayoutStore extends ReadyWatchingStore { } }; + private updateFromWidgetStore = (roomId?:string) => { + if (roomId) { + const room = this.matrixClient.getRoom(roomId); + if (room) this.recalculateRoom(room); + } else { + this.updateAllRooms(); + } + }; + private updateRoomFromState = (ev: MatrixEvent) => { if (ev.getType() !== WIDGET_LAYOUT_EVENT_TYPE) return; const room = this.matrixClient.getRoom(ev.getRoomId()); From c7c055dd98787a18bf87924fd920e23a44194f70 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Wed, 20 Jan 2021 15:05:18 -0700 Subject: [PATCH 220/231] Give a bigger target area to AppsDrawer vertical resizer The existing target was too hard to hit, which annoyed users. This change makes it the same sort of surface area as the horizontal resizers, as requested by design to fix the problem in the short term. --- res/css/views/rooms/_AppsDrawer.scss | 39 ++++++++++++++++++------ src/components/views/rooms/AppsDrawer.js | 1 + 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/res/css/views/rooms/_AppsDrawer.scss b/res/css/views/rooms/_AppsDrawer.scss index 8731d22660..492ed95973 100644 --- a/res/css/views/rooms/_AppsDrawer.scss +++ b/res/css/views/rooms/_AppsDrawer.scss @@ -24,26 +24,45 @@ $MiniAppTileHeight: 200px; flex-direction: column; overflow: hidden; + .mx_AppsContainer_resizerHandleContainer { + width: 100%; + height: 10px; + margin-top: -3px; // move it up so the interactions are slightly more comfortable + display: block; + position: relative; + } + .mx_AppsContainer_resizerHandle { cursor: ns-resize; - border-radius: 3px; - // Override styles from library - width: unset !important; - height: 4px !important; + // Override styles from library, making the whole area the target area + width: 100% !important; + height: 100% !important; // This is positioned directly below frame position: absolute; - bottom: -8px !important; // override from library + bottom: 0 !important; // override from library - // Together, these make the bar 64px wide - // These are also overridden from the library - left: calc(50% - 32px) !important; - right: calc(50% - 32px) !important; + // We then render the pill handle in an ::after to keep it in the handle's + // area without being a massive line across the screen + &::after { + content: ''; + position: absolute; + border-radius: 3px; + + // The combination of these two should make the pill 4px high + top: 6px; + bottom: 0; + + // Together, these make the bar 64px wide + // These are also overridden from the library + left: calc(50% - 32px); + right: calc(50% - 32px); + } } &:hover { - .mx_AppsContainer_resizerHandle { + .mx_AppsContainer_resizerHandle::after { opacity: 0.8; background: $primary-fg-color; } diff --git a/src/components/views/rooms/AppsDrawer.js b/src/components/views/rooms/AppsDrawer.js index 3208844bc5..24a7d1417a 100644 --- a/src/components/views/rooms/AppsDrawer.js +++ b/src/components/views/rooms/AppsDrawer.js @@ -252,6 +252,7 @@ export default class AppsDrawer extends React.Component { minHeight={100} maxHeight={this.props.maxHeight ? this.props.maxHeight - 50 : undefined} handleClass="mx_AppsContainer_resizerHandle" + handleWrapperClass="mx_AppsContainer_resizerHandleContainer" className="mx_AppsContainer_resizer" resizeNotifier={this.props.resizeNotifier} > From 928ddeb718eabf39dafe4c77485380e9367141fd Mon Sep 17 00:00:00 2001 From: Michael Telatynski <7t3chguy@gmail.com> Date: Thu, 21 Jan 2021 13:33:25 +0000 Subject: [PATCH 221/231] Improve styling of SSO Buttons for multiple IdPs --- res/css/views/elements/_SSOButtons.scss | 11 ++++++- src/components/views/elements/SSOButtons.tsx | 32 +++++++++++++------- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/res/css/views/elements/_SSOButtons.scss b/res/css/views/elements/_SSOButtons.scss index f762468c7f..c61247655c 100644 --- a/res/css/views/elements/_SSOButtons.scss +++ b/res/css/views/elements/_SSOButtons.scss @@ -16,8 +16,15 @@ limitations under the License. .mx_SSOButtons { display: flex; + flex-wrap: wrap; justify-content: center; + .mx_SSOButtons_row { + & + .mx_SSOButtons_row { + margin-top: 16px; + } + } + .mx_SSOButton { position: relative; width: 100%; @@ -36,6 +43,8 @@ limitations under the License. box-sizing: border-box; width: 50px; // 48px + 1px border on all sides height: 50px; // 48px + 1px border on all sides + min-width: 50px; // prevent crushing by the flexbox + padding: 12px; > img { left: 12px; @@ -43,7 +52,7 @@ limitations under the License. } & + .mx_SSOButton_mini { - margin-left: 24px; + margin-left: 16px; } } } diff --git a/src/components/views/elements/SSOButtons.tsx b/src/components/views/elements/SSOButtons.tsx index 2416e76119..5c3098d807 100644 --- a/src/components/views/elements/SSOButtons.tsx +++ b/src/components/views/elements/SSOButtons.tsx @@ -15,13 +15,14 @@ limitations under the License. */ import React from "react"; +import { chunk } from "lodash"; +import classNames from "classnames"; import {MatrixClient} from "matrix-js-sdk/src/client"; import PlatformPeg from "../../../PlatformPeg"; import AccessibleButton from "./AccessibleButton"; import {_t} from "../../../languageHandler"; import {IIdentityProvider, ISSOFlow} from "../../../Login"; -import classNames from "classnames"; interface ISSOButtonProps extends Omit { idp: IIdentityProvider; @@ -83,6 +84,8 @@ interface IProps { primary?: boolean; } +const MAX_PER_ROW = 6; + const SSOButtons: React.FC = ({matrixClient, flow, loginType, fragmentAfterLogin, primary}) => { const providers = flow["org.matrix.msc2858.identity_providers"] || []; if (providers.length < 2) { @@ -97,17 +100,24 @@ const SSOButtons: React.FC = ({matrixClient, flow, loginType, fragmentAf
    ; } + const rows = Math.ceil(providers.length / MAX_PER_ROW); + const size = Math.ceil(providers.length / rows); + return
    - { providers.map(idp => ( - + { chunk(providers, size).map(chunk => ( +
    + { chunk.map(idp => ( + + )) } +
    )) }
    ; }; From 0a90c982c715e987f77afcb91e2b1e9debc9b352 Mon Sep 17 00:00:00 2001 From: David Baker Date: Thu, 21 Jan 2021 19:20:35 +0000 Subject: [PATCH 222/231] Add VoIP user mapper The accompanying element-web PR with the config documentation should explain what this is & why. Internally, this breaks the assumption that call.roomId is the room that the call appears in for the user. call.roomId may now be a 'virtual' room while the react SDK actually displays it in a different room. React SDK always stores the calls under the user-facing rooms, and provides a function to get the user-facing room for a given call. --- src/CallHandler.tsx | 43 ++++++++--- src/VoipUserMapper.ts | 77 +++++++++++++++++++ src/components/views/rooms/MessageComposer.js | 9 ++- src/components/views/voip/CallView.tsx | 21 +++-- src/components/views/voip/IncomingCallBox.tsx | 6 +- src/settings/Settings.ts | 4 + .../room-list/filters/VisibilityProvider.ts | 14 ++-- test/VoipUserMapper-test.ts | 31 ++++++++ 8 files changed, 173 insertions(+), 32 deletions(-) create mode 100644 src/VoipUserMapper.ts create mode 100644 test/VoipUserMapper-test.ts diff --git a/src/CallHandler.tsx b/src/CallHandler.tsx index bcb2042f84..bc57f25813 100644 --- a/src/CallHandler.tsx +++ b/src/CallHandler.tsx @@ -83,6 +83,7 @@ import {UIFeature} from "./settings/UIFeature"; import { CallError } from "matrix-js-sdk/src/webrtc/call"; import { logger } from 'matrix-js-sdk/src/logger'; import { Action } from './dispatcher/actions'; +import { roomForVirtualRoom, getOrCreateVirtualRoomForRoom } from './VoipUserMapper'; const CHECK_PSTN_SUPPORT_ATTEMPTS = 3; @@ -133,6 +134,15 @@ export default class CallHandler { return window.mxCallHandler; } + /* + * Gets the user-facing room associated with a call (call.roomId may be the call "virtual room" + * if a voip_mxid_translate_pattern is set in the config) + */ + public static roomIdForCall(call: MatrixCall) { + if (!call) return null; + return roomForVirtualRoom(call.roomId) || call.roomId; + } + start() { this.dispatcherRef = dis.register(this.onAction); // add empty handlers for media actions, otherwise the media keys @@ -284,11 +294,15 @@ export default class CallHandler { // We don't allow placing more than one call per room, but that doesn't mean there // can't be more than one, eg. in a glare situation. This checks that the given call // is the call we consider 'the' call for its room. - const callForThisRoom = this.getCallForRoom(call.roomId); + const mappedRoomId = CallHandler.roomIdForCall(call); + + const callForThisRoom = this.getCallForRoom(mappedRoomId); return callForThisRoom && call.callId === callForThisRoom.callId; } private setCallListeners(call: MatrixCall) { + const mappedRoomId = CallHandler.roomIdForCall(call); + call.on(CallEvent.Error, (err: CallError) => { if (!this.matchesCallForThisRoom(call)) return; @@ -318,7 +332,7 @@ export default class CallHandler { Analytics.trackEvent('voip', 'callHangup'); - this.removeCallForRoom(call.roomId); + this.removeCallForRoom(mappedRoomId); }); call.on(CallEvent.State, (newState: CallState, oldState: CallState) => { if (!this.matchesCallForThisRoom(call)) return; @@ -343,7 +357,7 @@ export default class CallHandler { break; case CallState.Ended: Analytics.trackEvent('voip', 'callEnded', 'hangupReason', call.hangupReason); - this.removeCallForRoom(call.roomId); + this.removeCallForRoom(mappedRoomId); if (oldState === CallState.InviteSent && ( call.hangupParty === CallParty.Remote || (call.hangupParty === CallParty.Local && call.hangupReason === CallErrorCode.InviteTimeout) @@ -392,7 +406,7 @@ export default class CallHandler { this.pause(AudioID.Ringback); } - this.calls.set(newCall.roomId, newCall); + this.calls.set(mappedRoomId, newCall); this.setCallListeners(newCall); this.setCallState(newCall, newCall.state); }); @@ -404,13 +418,15 @@ export default class CallHandler { } private setCallState(call: MatrixCall, status: CallState) { + const mappedRoomId = CallHandler.roomIdForCall(call); + console.log( - `Call state in ${call.roomId} changed to ${status}`, + `Call state in ${mappedRoomId} changed to ${status}`, ); dis.dispatch({ action: 'call_state', - room_id: call.roomId, + room_id: mappedRoomId, state: status, }); } @@ -477,14 +493,20 @@ export default class CallHandler { }, null, true); } - private placeCall( + private async placeCall( roomId: string, type: PlaceCallType, localElement: HTMLVideoElement, remoteElement: HTMLVideoElement, ) { Analytics.trackEvent('voip', 'placeCall', 'type', type); CountlyAnalytics.instance.trackStartCall(roomId, type === PlaceCallType.Video, false); - const call = createNewMatrixCall(MatrixClientPeg.get(), roomId); + + const mappedRoomId = (await getOrCreateVirtualRoomForRoom(roomId)) || roomId; + logger.debug("Mapped real room " + roomId + " to room ID " + mappedRoomId); + + const call = createNewMatrixCall(MatrixClientPeg.get(), mappedRoomId); + this.calls.set(roomId, call); + this.setCallListeners(call); this.setCallAudioElement(call); @@ -586,13 +608,14 @@ export default class CallHandler { const call = payload.call as MatrixCall; - if (this.getCallForRoom(call.roomId)) { + const mappedRoomId = CallHandler.roomIdForCall(call); + if (this.getCallForRoom(mappedRoomId)) { // ignore multiple incoming calls to the same room return; } Analytics.trackEvent('voip', 'receiveCall', 'type', call.type); - this.calls.set(call.roomId, call) + this.calls.set(mappedRoomId, call) this.setCallListeners(call); } break; diff --git a/src/VoipUserMapper.ts b/src/VoipUserMapper.ts new file mode 100644 index 0000000000..c5de686ab8 --- /dev/null +++ b/src/VoipUserMapper.ts @@ -0,0 +1,77 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { ensureDMExists, findDMForUser } from './createRoom'; +import { MatrixClientPeg } from "./MatrixClientPeg"; +import DMRoomMap from "./utils/DMRoomMap"; +import SdkConfig from "./SdkConfig"; + +// Functions for mapping users & rooms for the voip_mxid_translate_pattern +// config option + +export function voipUserMapperEnabled(): boolean { + return SdkConfig.get()['voip_mxid_translate_pattern'] !== undefined; +} + +function userToVirtualUser(userId: string, templateString?: string): string { + if (templateString === undefined) templateString = SdkConfig.get()['voip_mxid_translate_pattern']; + if (!templateString) return null; + return templateString.replace('${mxid}', encodeURIComponent(userId).replace(/%/g, '=').toLowerCase()); +} + +function virtualUserToUser(userId: string, templateString?: string): string { + if (templateString === undefined) templateString = SdkConfig.get()['voip_mxid_translate_pattern']; + if (!templateString) return null; + + const regexString = templateString.replace('${mxid}', '(.+)'); + + const match = userId.match('^' + regexString + '$'); + if (!match) return null; + + return decodeURIComponent(match[1].replace(/=/g, '%')); +} + +async function getOrCreateVirtualRoomForUser(userId: string):Promise { + const virtualUser = userToVirtualUser(userId); + if (!virtualUser) return null; + + return await ensureDMExists(MatrixClientPeg.get(), virtualUser); +} + +export async function getOrCreateVirtualRoomForRoom(roomId: string):Promise { + const user = DMRoomMap.shared().getUserIdForRoomId(roomId); + if (!user) return null; + return getOrCreateVirtualRoomForUser(user); +} + +export function roomForVirtualRoom(roomId: string):string { + const virtualUser = DMRoomMap.shared().getUserIdForRoomId(roomId); + if (!virtualUser) return null; + const realUser = virtualUserToUser(virtualUser); + const room = findDMForUser(MatrixClientPeg.get(), realUser); + if (room) { + return room.roomId; + } else { + return null; + } +} + +export function isVirtualRoom(roomId: string):boolean { + const virtualUser = DMRoomMap.shared().getUserIdForRoomId(roomId); + if (!virtualUser) return null; + const realUser = virtualUserToUser(virtualUser); + return Boolean(realUser); +} diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js index 4ddff8f4b0..da430e622a 100644 --- a/src/components/views/rooms/MessageComposer.js +++ b/src/components/views/rooms/MessageComposer.js @@ -109,9 +109,12 @@ function HangupButton(props) { dis.dispatch({ action, - // hangup the call for this room, which may not be the room in props - // (e.g. conferences which will hangup the 1:1 room instead) - room_id: call.roomId, + // hangup the call for this room. NB. We use the room in props as the room ID + // as call.roomId may be the 'virtual room', and the dispatch actions always + // use the user-facing room (there was a time when we deliberately used + // call.roomId and *not* props.roomId, but that was for the old + // style Freeswitch conference calls and those times are gone.) + room_id: props.roomId, }); }; diff --git a/src/components/views/voip/CallView.tsx b/src/components/views/voip/CallView.tsx index 6fbc396bee..fac87bf02a 100644 --- a/src/components/views/voip/CallView.tsx +++ b/src/components/views/voip/CallView.tsx @@ -212,9 +212,10 @@ export default class CallView extends React.Component { }; private onExpandClick = () => { + const userFacingRoomId = CallHandler.roomIdForCall(this.props.call); dis.dispatch({ action: 'view_room', - room_id: this.props.call.roomId, + room_id: userFacingRoomId, }); }; @@ -340,27 +341,33 @@ export default class CallView extends React.Component { }; private onRoomAvatarClick = () => { + const userFacingRoomId = CallHandler.roomIdForCall(this.props.call); dis.dispatch({ action: 'view_room', - room_id: this.props.call.roomId, + room_id: userFacingRoomId, }); } private onSecondaryRoomAvatarClick = () => { + const userFacingRoomId = CallHandler.roomIdForCall(this.props.secondaryCall); + dis.dispatch({ action: 'view_room', - room_id: this.props.secondaryCall.roomId, + room_id: userFacingRoomId, }); } private onCallResumeClick = () => { - CallHandler.sharedInstance().setActiveCallRoomId(this.props.call.roomId); + const userFacingRoomId = CallHandler.roomIdForCall(this.props.call); + CallHandler.sharedInstance().setActiveCallRoomId(userFacingRoomId); } public render() { const client = MatrixClientPeg.get(); - const callRoom = client.getRoom(this.props.call.roomId); - const secCallRoom = this.props.secondaryCall ? client.getRoom(this.props.secondaryCall.roomId) : null; + const callRoomId = CallHandler.roomIdForCall(this.props.call); + const secondaryCallRoomId = CallHandler.roomIdForCall(this.props.secondaryCall); + const callRoom = client.getRoom(callRoomId); + const secCallRoom = this.props.secondaryCall ? client.getRoom(secondaryCallRoomId) : null; let dialPad; let contextMenu; @@ -456,7 +463,7 @@ export default class CallView extends React.Component { onClick={() => { dis.dispatch({ action: 'hangup', - room_id: this.props.call.roomId, + room_id: callRoomId, }); }} /> diff --git a/src/components/views/voip/IncomingCallBox.tsx b/src/components/views/voip/IncomingCallBox.tsx index 8e1d23e38e..a495093d85 100644 --- a/src/components/views/voip/IncomingCallBox.tsx +++ b/src/components/views/voip/IncomingCallBox.tsx @@ -70,7 +70,7 @@ export default class IncomingCallBox extends React.Component { e.stopPropagation(); dis.dispatch({ action: 'answer', - room_id: this.state.incomingCall.roomId, + room_id: CallHandler.roomIdForCall(this.state.incomingCall), }); }; @@ -78,7 +78,7 @@ export default class IncomingCallBox extends React.Component { e.stopPropagation(); dis.dispatch({ action: 'reject', - room_id: this.state.incomingCall.roomId, + room_id: CallHandler.roomIdForCall(this.state.incomingCall), }); }; @@ -89,7 +89,7 @@ export default class IncomingCallBox extends React.Component { let room = null; if (this.state.incomingCall) { - room = MatrixClientPeg.get().getRoom(this.state.incomingCall.roomId); + room = MatrixClientPeg.get().getRoom(CallHandler.roomIdForCall(this.state.incomingCall)); } const caller = room ? room.name : _t("Unknown caller"); diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index b239b809fe..4a1e4e630d 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -398,6 +398,10 @@ export const SETTINGS: {[setting: string]: ISetting} = { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, default: null, }, + "voip_mxid_translate_pattern": { + supportedLevels: LEVELS_UI_FEATURE, // not a UI feature, but same level (config only, maybe .well-known in future) + default: null, + }, "language": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, default: "en", diff --git a/src/stores/room-list/filters/VisibilityProvider.ts b/src/stores/room-list/filters/VisibilityProvider.ts index 553dd33ce0..6bc790bb1e 100644 --- a/src/stores/room-list/filters/VisibilityProvider.ts +++ b/src/stores/room-list/filters/VisibilityProvider.ts @@ -16,6 +16,7 @@ import {Room} from "matrix-js-sdk/src/models/room"; import { RoomListCustomisations } from "../../../customisations/RoomList"; +import { isVirtualRoom, voipUserMapperEnabled } from "../../../VoipUserMapper"; export class VisibilityProvider { private static internalInstance: VisibilityProvider; @@ -31,18 +32,13 @@ export class VisibilityProvider { } public isRoomVisible(room: Room): boolean { - /* eslint-disable prefer-const */ let isVisible = true; // Returned at the end of this function let forced = false; // When true, this function won't bother calling the customisation points - /* eslint-enable prefer-const */ - // ------ - // TODO: The `if` statements to control visibility of custom room types - // would go here. The remainder of this function assumes that the statements - // will be here. - // - // When removing this comment block, please remove the lint disable lines in the area. - // ------ + if (voipUserMapperEnabled() && isVirtualRoom(room.roomId)) { + isVisible = false; + forced = true; + } const isVisibleFn = RoomListCustomisations.isRoomVisible; if (!forced && isVisibleFn) { diff --git a/test/VoipUserMapper-test.ts b/test/VoipUserMapper-test.ts new file mode 100644 index 0000000000..a736efd6be --- /dev/null +++ b/test/VoipUserMapper-test.ts @@ -0,0 +1,31 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { userToVirtualUser, virtualUserToUser } from '../src/VoipUserMapper'; + +const templateString = '@_greatappservice_${mxid}:frooble.example'; +const realUser = '@alice:boop.example'; +const virtualUser = "@_greatappservice_%40alice%3Aboop.example:frooble.example"; + +describe('VoipUserMapper', function() { + it('translates users to virtual users', function() { + expect(userToVirtualUser(realUser, templateString)).toEqual(virtualUser); + }); + + it('translates users to virtual users', function() { + expect(virtualUserToUser(virtualUser, templateString)).toEqual(realUser); + }); +}); From f023fc50e28e1c581e5770198df7b21c5f17f519 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Thu, 21 Jan 2021 13:22:44 -0700 Subject: [PATCH 223/231] Update src/stores/widgets/WidgetLayoutStore.ts Co-authored-by: J. Ryan Stinnett --- src/stores/widgets/WidgetLayoutStore.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stores/widgets/WidgetLayoutStore.ts b/src/stores/widgets/WidgetLayoutStore.ts index bce684241d..b6320defb9 100644 --- a/src/stores/widgets/WidgetLayoutStore.ts +++ b/src/stores/widgets/WidgetLayoutStore.ts @@ -149,7 +149,7 @@ export class WidgetLayoutStore extends ReadyWatchingStore { } }; - private updateFromWidgetStore = (roomId?:string) => { + private updateFromWidgetStore = (roomId?: string) => { if (roomId) { const room = this.matrixClient.getRoom(roomId); if (room) this.recalculateRoom(room); From 591b50b1fb819f468855e90b10841fe7c9dda8c8 Mon Sep 17 00:00:00 2001 From: Dan Date: Thu, 21 Jan 2021 21:51:22 +0000 Subject: [PATCH 224/231] fix issue 16226 to allow switching back to default HS. Signed-off-by: Dan Gwynne dangwynne1@gmail.com --- src/components/views/dialogs/ServerPickerDialog.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/views/dialogs/ServerPickerDialog.tsx b/src/components/views/dialogs/ServerPickerDialog.tsx index bdc3a71826..7ca115760e 100644 --- a/src/components/views/dialogs/ServerPickerDialog.tsx +++ b/src/components/views/dialogs/ServerPickerDialog.tsx @@ -157,7 +157,7 @@ export default class ServerPickerDialog extends React.PureComponent Date: Thu, 21 Jan 2021 22:42:12 +0000 Subject: [PATCH 225/231] Oops, the tests won't work if we don't export the functions --- src/VoipUserMapper.ts | 6 ++++-- test/VoipUserMapper-test.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/VoipUserMapper.ts b/src/VoipUserMapper.ts index c5de686ab8..a4f5822065 100644 --- a/src/VoipUserMapper.ts +++ b/src/VoipUserMapper.ts @@ -26,13 +26,15 @@ export function voipUserMapperEnabled(): boolean { return SdkConfig.get()['voip_mxid_translate_pattern'] !== undefined; } -function userToVirtualUser(userId: string, templateString?: string): string { +// only exported for tests +export function userToVirtualUser(userId: string, templateString?: string): string { if (templateString === undefined) templateString = SdkConfig.get()['voip_mxid_translate_pattern']; if (!templateString) return null; return templateString.replace('${mxid}', encodeURIComponent(userId).replace(/%/g, '=').toLowerCase()); } -function virtualUserToUser(userId: string, templateString?: string): string { +// only exported for tests +export function virtualUserToUser(userId: string, templateString?: string): string { if (templateString === undefined) templateString = SdkConfig.get()['voip_mxid_translate_pattern']; if (!templateString) return null; diff --git a/test/VoipUserMapper-test.ts b/test/VoipUserMapper-test.ts index a736efd6be..ee45379e4c 100644 --- a/test/VoipUserMapper-test.ts +++ b/test/VoipUserMapper-test.ts @@ -18,7 +18,7 @@ import { userToVirtualUser, virtualUserToUser } from '../src/VoipUserMapper'; const templateString = '@_greatappservice_${mxid}:frooble.example'; const realUser = '@alice:boop.example'; -const virtualUser = "@_greatappservice_%40alice%3Aboop.example:frooble.example"; +const virtualUser = "@_greatappservice_=40alice=3aboop.example:frooble.example"; describe('VoipUserMapper', function() { it('translates users to virtual users', function() { From 3803a5ece1c8e411afe1b279e2d5c94768b04fd7 Mon Sep 17 00:00:00 2001 From: David Baker Date: Fri, 22 Jan 2021 11:00:12 +0000 Subject: [PATCH 226/231] This isn't a setting any more, just a regular ol' config option --- src/settings/Settings.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/settings/Settings.ts b/src/settings/Settings.ts index 4a1e4e630d..b239b809fe 100644 --- a/src/settings/Settings.ts +++ b/src/settings/Settings.ts @@ -398,10 +398,6 @@ export const SETTINGS: {[setting: string]: ISetting} = { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS, default: null, }, - "voip_mxid_translate_pattern": { - supportedLevels: LEVELS_UI_FEATURE, // not a UI feature, but same level (config only, maybe .well-known in future) - default: null, - }, "language": { supportedLevels: LEVELS_DEVICE_ONLY_SETTINGS_WITH_CONFIG, default: "en", From 7413cea6eaeee68beadc8b46021a30ac159ec277 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 22 Jan 2021 16:58:47 -0700 Subject: [PATCH 227/231] Format imports because the IDE said so --- src/components/structures/RoomView.tsx | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 027c6b3cc3..3edfef7f18 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -21,15 +21,15 @@ limitations under the License. // - Search results component // - Drag and drop -import React, {createRef} from 'react'; +import React, { createRef } from 'react'; import classNames from 'classnames'; -import {Room} from "matrix-js-sdk/src/models/room"; -import {MatrixEvent} from "matrix-js-sdk/src/models/event"; -import {EventSubscription} from "fbemitter"; +import { Room } from "matrix-js-sdk/src/models/room"; +import { MatrixEvent } from "matrix-js-sdk/src/models/event"; +import { EventSubscription } from "fbemitter"; import shouldHideEvent from '../../shouldHideEvent'; -import {_t} from '../../languageHandler'; -import {RoomPermalinkCreator} from '../../utils/permalinks/Permalinks'; +import { _t } from '../../languageHandler'; +import { RoomPermalinkCreator } from '../../utils/permalinks/Permalinks'; import ResizeNotifier from '../../utils/ResizeNotifier'; import ContentMessages from '../../ContentMessages'; import Modal from '../../Modal'; @@ -40,8 +40,8 @@ import Tinter from '../../Tinter'; import rateLimitedFunc from '../../ratelimitedfunc'; import * as ObjectUtils from '../../ObjectUtils'; import * as Rooms from '../../Rooms'; -import eventSearch, {searchPagination} from '../../Searching'; -import {isOnlyCtrlOrCmdIgnoreShiftKeyEvent, Key} from '../../Keyboard'; +import eventSearch, { searchPagination } from '../../Searching'; +import { isOnlyCtrlOrCmdIgnoreShiftKeyEvent, Key } from '../../Keyboard'; import MainSplit from './MainSplit'; import RightPanel from './RightPanel'; import RoomViewStore from '../../stores/RoomViewStore'; @@ -50,13 +50,13 @@ import WidgetEchoStore from '../../stores/WidgetEchoStore'; import SettingsStore from "../../settings/SettingsStore"; import AccessibleButton from "../views/elements/AccessibleButton"; import RightPanelStore from "../../stores/RightPanelStore"; -import {haveTileForEvent} from "../views/rooms/EventTile"; +import { haveTileForEvent } from "../views/rooms/EventTile"; import RoomContext from "../../contexts/RoomContext"; import MatrixClientContext from "../../contexts/MatrixClientContext"; -import {E2EStatus, shieldStatusForRoom} from '../../utils/ShieldUtils'; -import {Action} from "../../dispatcher/actions"; -import {SettingLevel} from "../../settings/SettingLevel"; -import {IMatrixClientCreds} from "../../MatrixClientPeg"; +import { E2EStatus, shieldStatusForRoom } from '../../utils/ShieldUtils'; +import { Action } from "../../dispatcher/actions"; +import { SettingLevel } from "../../settings/SettingLevel"; +import { IMatrixClientCreds } from "../../MatrixClientPeg"; import ScrollPanel from "./ScrollPanel"; import TimelinePanel from "./TimelinePanel"; import ErrorBoundary from "../views/elements/ErrorBoundary"; @@ -67,16 +67,16 @@ import RoomUpgradeWarningBar from "../views/rooms/RoomUpgradeWarningBar"; import PinnedEventsPanel from "../views/rooms/PinnedEventsPanel"; import AuxPanel from "../views/rooms/AuxPanel"; import RoomHeader from "../views/rooms/RoomHeader"; -import {XOR} from "../../@types/common"; +import { XOR } from "../../@types/common"; import { IThreepidInvite } from "../../stores/ThreepidInviteStore"; import EffectsOverlay from "../views/elements/EffectsOverlay"; -import {containsEmoji} from '../../effects/utils'; -import {CHAT_EFFECTS} from '../../effects'; +import { containsEmoji } from '../../effects/utils'; +import { CHAT_EFFECTS } from '../../effects'; import { CallState, MatrixCall } from "matrix-js-sdk/src/webrtc/call"; import WidgetStore from "../../stores/WidgetStore"; -import {UPDATE_EVENT} from "../../stores/AsyncStore"; +import { UPDATE_EVENT } from "../../stores/AsyncStore"; import Notifier from "../../Notifier"; -import {showToast as showNotificationsToast} from "../../toasts/DesktopNotificationsToast"; +import { showToast as showNotificationsToast } from "../../toasts/DesktopNotificationsToast"; import { RoomNotificationStateStore } from "../../stores/notifications/RoomNotificationStateStore"; import { Container, WidgetLayoutStore } from "../../stores/widgets/WidgetLayoutStore"; From 6ac8803191bf4e31df430285c824efe4e82bda78 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 22 Jan 2021 17:00:30 -0700 Subject: [PATCH 228/231] Update AuxPanel and related buttons when widgets change or on reload If we have widgets we're meant to be showing due to layout or because we reloaded the page (slightly different code paths) then we need to show those. This change fixes a bug in that where the layout wasn't being applied at the right moment in time so was never showing the widgets. Seems to only be an issue if the layout state event was sent by someone other than you. --- src/components/structures/RoomView.tsx | 29 ++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index 3edfef7f18..c2236ddd14 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -282,6 +282,7 @@ export default class RoomView extends React.Component { private checkWidgets = (room) => { this.setState({ hasPinnedWidgets: WidgetLayoutStore.instance.getContainerWidgets(room, Container.Top).length > 0, + showApps: this.shouldShowApps(room), }); }; @@ -419,11 +420,17 @@ export default class RoomView extends React.Component { } private onWidgetEchoStoreUpdate = () => { + if (!this.state.room) return; this.setState({ + hasPinnedWidgets: WidgetLayoutStore.instance.getContainerWidgets(this.state.room, Container.Top).length > 0, showApps: this.shouldShowApps(this.state.room), }); }; + private onWidgetLayoutChange = () => { + this.onWidgetEchoStoreUpdate(); // we cheat here by calling the thing that matters + }; + private setupRoom(room: Room, roomId: string, joining: boolean, shouldPeek: boolean) { // if this is an unknown room then we're in one of three states: // - This is a room we can peek into (search engine) (we can /peek) @@ -489,7 +496,7 @@ export default class RoomView extends React.Component { } private shouldShowApps(room: Room) { - if (!BROWSER_SUPPORTS_SANDBOX) return false; + if (!BROWSER_SUPPORTS_SANDBOX || !room) return false; // Check if user has previously chosen to hide the app drawer for this // room. If so, do not show apps @@ -498,7 +505,11 @@ export default class RoomView extends React.Component { // This is confusing, but it means to say that we default to the tray being // hidden unless the user clicked to open it. - return hideWidgetDrawer === "false"; + const isManuallyShown = hideWidgetDrawer === "false"; + + const widgets = WidgetLayoutStore.instance.getContainerWidgets(room, Container.Top); + console.log('@@', {widgets, isManuallyShown}); + return widgets.length > 0 || isManuallyShown; } componentDidMount() { @@ -609,6 +620,10 @@ export default class RoomView extends React.Component { WidgetEchoStore.removeListener(UPDATE_EVENT, this.onWidgetEchoStoreUpdate); WidgetStore.instance.removeListener(UPDATE_EVENT, this.onWidgetStoreUpdate); + if (this.state.room) { + WidgetLayoutStore.instance.off(WidgetLayoutStore.emissionForRoom(this.state.room), this.onWidgetLayoutChange); + } + if (this.showReadReceiptsWatchRef) { SettingsStore.unwatchSetting(this.showReadReceiptsWatchRef); } @@ -836,6 +851,10 @@ export default class RoomView extends React.Component { // called when state.room is first initialised (either at initial load, // after a successful peek, or after we join the room). private onRoomLoaded = (room: Room) => { + // Attach a widget store listener only when we get a room + WidgetLayoutStore.instance.on(WidgetLayoutStore.emissionForRoom(room), this.onWidgetLayoutChange); + this.onWidgetLayoutChange(); // provoke an update + this.calculatePeekRules(room); this.updatePreviewUrlVisibility(room); this.loadMembersIfJoined(room); @@ -898,6 +917,12 @@ export default class RoomView extends React.Component { if (!room || room.roomId !== this.state.roomId) { return; } + + // Detach the listener if the room is changing for some reason + if (this.state.room) { + WidgetLayoutStore.instance.off(WidgetLayoutStore.emissionForRoom(this.state.room), this.onWidgetLayoutChange); + } + this.setState({ room: room, }, () => { From 807a8c41e300a60e58621af6abaac3274843c38a Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 22 Jan 2021 17:02:00 -0700 Subject: [PATCH 229/231] Remove debug --- src/components/structures/RoomView.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index c2236ddd14..faa10f5dcf 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -508,7 +508,6 @@ export default class RoomView extends React.Component { const isManuallyShown = hideWidgetDrawer === "false"; const widgets = WidgetLayoutStore.instance.getContainerWidgets(room, Container.Top); - console.log('@@', {widgets, isManuallyShown}); return widgets.length > 0 || isManuallyShown; } From 27dc4cb57493ca9ef194a59423edc1c0875dc1e3 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 22 Jan 2021 17:03:36 -0700 Subject: [PATCH 230/231] Appease the linter --- src/components/structures/RoomView.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/structures/RoomView.tsx b/src/components/structures/RoomView.tsx index faa10f5dcf..4bfe34bd8f 100644 --- a/src/components/structures/RoomView.tsx +++ b/src/components/structures/RoomView.tsx @@ -620,7 +620,10 @@ export default class RoomView extends React.Component { WidgetStore.instance.removeListener(UPDATE_EVENT, this.onWidgetStoreUpdate); if (this.state.room) { - WidgetLayoutStore.instance.off(WidgetLayoutStore.emissionForRoom(this.state.room), this.onWidgetLayoutChange); + WidgetLayoutStore.instance.off( + WidgetLayoutStore.emissionForRoom(this.state.room), + this.onWidgetLayoutChange, + ); } if (this.showReadReceiptsWatchRef) { @@ -919,7 +922,10 @@ export default class RoomView extends React.Component { // Detach the listener if the room is changing for some reason if (this.state.room) { - WidgetLayoutStore.instance.off(WidgetLayoutStore.emissionForRoom(this.state.room), this.onWidgetLayoutChange); + WidgetLayoutStore.instance.off( + WidgetLayoutStore.emissionForRoom(this.state.room), + this.onWidgetLayoutChange, + ); } this.setState({ From d3281db2bf160e0b8f4a2ba88ec90f9f927faf12 Mon Sep 17 00:00:00 2001 From: Travis Ralston Date: Fri, 22 Jan 2021 17:49:18 -0700 Subject: [PATCH 231/231] Update widgets in the room upon join --- src/stores/WidgetStore.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/stores/WidgetStore.ts b/src/stores/WidgetStore.ts index c53c85dfd5..4ff39aaaee 100644 --- a/src/stores/WidgetStore.ts +++ b/src/stores/WidgetStore.ts @@ -72,6 +72,7 @@ export default class WidgetStore extends AsyncStoreWithClient { } protected async onReady(): Promise { + this.matrixClient.on("Room", this.onRoom); this.matrixClient.on("RoomState.events", this.onRoomStateEvents); this.matrixClient.getRooms().forEach((room: Room) => { this.loadRoomWidgets(room); @@ -80,6 +81,7 @@ export default class WidgetStore extends AsyncStoreWithClient { } protected async onNotReady(): Promise { + this.matrixClient.off("Room", this.onRoom); this.matrixClient.off("RoomState.events", this.onRoomStateEvents); this.widgetMap = new Map(); this.roomMap = new Map(); @@ -138,6 +140,12 @@ export default class WidgetStore extends AsyncStoreWithClient { this.emit(room.roomId); } + private onRoom = (room: Room) => { + this.initRoom(room.roomId); + this.loadRoomWidgets(room); + this.emit(UPDATE_EVENT, room.roomId); + }; + private onRoomStateEvents = (ev: MatrixEvent) => { if (ev.getType() !== "im.vector.modular.widgets") return; // TODO: Support m.widget too const roomId = ev.getRoomId();